Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bb7edfbf01 | ||
|
|
b9f4c59f6d | ||
|
|
3a5fd8e648 | ||
|
|
5812501226 | ||
|
|
7dbf7ea8ec | ||
|
|
65f73025cd | ||
|
|
7cf1d3cbaa | ||
|
|
708af836f5 | ||
|
|
04129a75f3 | ||
|
|
f69897bbb8 | ||
|
|
b09d9d5063 | ||
|
|
2507b9959f | ||
|
|
f0795aa5c2 | ||
|
|
ad4fce6280 | ||
|
|
7122f91671 | ||
|
|
727d2e0b3f | ||
|
|
1d8a0dd8b6 | ||
|
|
698126e1a0 | ||
|
|
e859d65de5 | ||
|
|
dbf0661ce3 | ||
|
|
fdfe43f4b2 | ||
|
|
e92e776a1d | ||
|
|
edd6a603ed | ||
|
|
4dacb6f430 | ||
|
|
6595a8ad1b | ||
|
|
bcc15ee225 | ||
|
|
d6dd2b0920 | ||
|
|
5bd2c0bec8 | ||
|
|
34cdca132e | ||
|
|
c455b7ce9d | ||
|
|
deaec47a12 | ||
|
|
31d2d73744 | ||
|
|
c26ee6d263 | ||
|
|
59ccfe0e3a | ||
|
|
a5ffd10a0d | ||
|
|
10c870b464 | ||
|
|
0de2dfa1ed | ||
|
|
75d4c39bd7 | ||
|
|
4c789e6cfa | ||
|
|
920b718f62 | ||
|
|
0bc599dade | ||
|
|
e7ceff11af | ||
|
|
1f05d971e2 | ||
|
|
5dece0542c | ||
|
|
51797790bd | ||
|
|
31695dcc49 | ||
|
|
51b6b5a123 | ||
|
|
0960931cd4 | ||
|
|
436d8ee068 | ||
|
|
4b782a71fc | ||
|
|
66a1f1690f | ||
|
|
911f63e63c |
@@ -35,26 +35,26 @@ Use Gitea for live coordination and the relevant code version for implementation
|
||||
|
||||
## Coordination and integration
|
||||
|
||||
All independent agents coordinating through Gitea run on completely separate machines, each with its own clone, filesystem, tools, processes, and runtime. Gitea and pushed Git history are the shared communication and delivery channels. Local files (including `harness`), unpushed commits, worktrees, test results, and localhost services are not accessible to peers. Matching branch names or paths do not imply synchronized contents.
|
||||
|
||||
1. On starting or resuming, including after compaction, inspect the working branch, local changes, applicable instructions, relevant shared records, and existing implementation. Recover context from authoritative records. Check for newer shared instructions on the actual remote default branch without overwriting local work. Read what is relevant; avoid repeated full-history scans and constant polling.
|
||||
2. Search before creating tasks. Claim a meaningful outcome in its Gitea issue with a stable session identity, scope, branch/worktree, and acceptance criteria. Keep small steps within that task. Recheck after claiming; comments are not atomic locks. Respect existing ownership and resolve overlapping claims before overlapping work.
|
||||
3. Independent sessions are peers. Each owns its contribution and delegated work. Record one integration/release owner when a milestone needs shared coordination. Use separate worktrees or checkouts, partition files/interfaces, and coordinate changes to shared specifications and documents.
|
||||
4. At meaningful checkpoints or handoffs, record changed results, commit/PR links, verification commands and environment, blockers, and next actions. Identify the tested code version and uncommitted or unpublished work; make required artifacts accessible to other sessions. Do not assume another agent is running or has read a message; silence alone does not establish abandonment. Record evidence and preserve existing work when reassigning a task.
|
||||
5. Follow project review and merge conventions. Inspect upstream changes, resolve conflicts while preserving others' edits, and verify the combined result. Do not overwrite others' work or force-push shared history to resolve coordination problems.
|
||||
2. Search before creating tasks. Claim a meaningful outcome in its Gitea issue with a stable session identity, scope, remote repository/branch, and acceptance criteria. Keep small steps within that task. Recheck after claiming; comments are not atomic locks. Respect existing ownership and resolve overlapping claims before overlapping work.
|
||||
3. Independent sessions are peers. Each owns its contribution and delegated work on its own machine. Record one integration/release owner when a milestone needs shared coordination. Use distinct remote work branches, partition files/interfaces, and coordinate changes to shared specifications and documents. Worktrees provide local isolation only; they do not share work between machines.
|
||||
4. At meaningful checkpoints or handoffs, record changed results, commit/PR links, verification commands and environment, blockers, and next actions. Identify the tested code version and label uncommitted or unpublished work as local-only. Before asking peers to consume results, push the required code and versioned documentation, including relevant `harness` updates; publish other required artifacts in Gitea and link them. Use repository-relative paths with commit references, reproducible commands, and necessary environment details; local paths and localhost URLs alone are not handoffs. Do not assume another agent is running or has read a message; silence alone does not establish abandonment. Record evidence and preserve existing work when reassigning a task.
|
||||
5. Follow project review and merge conventions. Fetch the relevant remote branches and inspect the identified commits before reviewing or integrating another machine's work. Resolve conflicts while preserving others' edits, and verify the combined result locally; report material environment differences. Local instruction-file edits reach peers only after publication and retrieval. Do not overwrite others' work or force-push shared history to resolve coordination problems.
|
||||
6. Close work when its acceptance criteria are met and the result is integrated or delivered as appropriate. Mark duplicates and superseded tasks explicitly with replacement links. Then choose further useful unowned work while the requested objective remains incomplete.
|
||||
|
||||
Use Gitea MCP for shared coordination. If unavailable, report the failure, buffer necessary handoff information locally, and continue already-owned or clearly non-overlapping work. Reconcile with current Gitea state when access returns; do not claim an ownership update, review, or publication succeeded without confirmation.
|
||||
|
||||
## Delegation and reasoning
|
||||
|
||||
Use GPT-6 Astra exclusively. Delegate bounded independent research, design, implementation, or review when it improves progress, judgment, or preserves the parent's context. Give subagents the relevant context, ownership boundaries, result format, and evidence requirements. Use fresh critics when practical. The parent owns synthesis and integration and normally consolidates results into Gitea. Choose concurrency according to useful independent work and available resources, including other sessions; there is no agent-count quota.
|
||||
Use GPT-6 Astra exclusively. Gitea peers are independent remote sessions, not subagents controlled by this session. Spawned subagents use the execution environment actually provided by the agent tools; do not assume they share files, and publish their results before Gitea peers need them. Delegate bounded independent research, design, implementation, or review when it improves progress, judgment, or preserves the parent's context. Give subagents the relevant context, ownership boundaries, result format, and evidence requirements. Use fresh critics when practical. The parent owns synthesis and integration and normally consolidates results into Gitea. Choose concurrency according to useful independent work and available resources, including other sessions; there is no agent-count quota.
|
||||
|
||||
Optimize reasoning effort for verified outcomes per cost, including review, retries, and repair:
|
||||
|
||||
Main agent: default to high for planning, synthesis, integration, and acceptance decisions; medium for dispatching a settled plan and routine coordination.
|
||||
|
||||
Subagents: default to medium for bounded implementation and targeted research; low for straightforward retrieval, mechanical edits, and running established checks; high for complex debugging, correctness review, adversarial analysis, or ambiguous design.
|
||||
|
||||
Use extra-high selectively for difficult foundational semantic, methodological, formal, or cross-domain decisions. Reserve max for exceptional unresolved problems where additional reasoning is likely to justify its cost. Retain higher settings when evidence supports their value.
|
||||
- Main agent: default to high for planning, synthesis, integration, and acceptance decisions; medium for dispatching a settled plan and routine coordination.
|
||||
- Subagents: default to medium for bounded implementation and targeted research; low for straightforward retrieval, mechanical edits, and running established checks; high for complex debugging, correctness review, adversarial analysis, or ambiguous design.
|
||||
- Use extra-high selectively for difficult foundational semantic, methodological, formal, or cross-domain decisions. Reserve max for exceptional unresolved problems where additional reasoning is likely to justify its cost. Retain higher settings when evidence supports their value.
|
||||
|
||||
Allocate by task difficulty and consequences, not role or length alone. Start higher when a clearly difficult decision has expensive downstream consequences. Escalate for concrete reasoning difficulties; resolve missing evidence or unclear requirements at their source. Set subagent effort explicitly through supported controls to avoid unintended inheritance. Do not claim an unapplied change or alter global configuration merely to enforce these preferences.
|
||||
|
||||
|
||||
@@ -1117,6 +1117,14 @@ fn in_machine(p: &Project, id: Id, machine: Id) -> bool {
|
||||
false
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
#[path = "../../../harness/experiments/behavior-layout-scene-20260912/mod.rs"]
|
||||
mod behavior_layout_scene_experiment;
|
||||
|
||||
#[cfg(test)]
|
||||
#[path = "../../../harness/experiments/behavior-anchor-plan-20260912/mod.rs"]
|
||||
mod behavior_anchor_plan_experiment;
|
||||
|
||||
struct BoxItem {
|
||||
id: Id,
|
||||
rect: Rectangle,
|
||||
@@ -1328,6 +1336,8 @@ impl Scene {
|
||||
let mut y = if scenario { 148. } else { 120. };
|
||||
scene.occurrences(p, owner, scenario, &lane_x, &mut y, 0);
|
||||
scene.size.height = (y + 45.).max(210.);
|
||||
#[cfg(test)]
|
||||
behavior_anchor_plan_experiment::scene_extent(&mut scene);
|
||||
if scenario {
|
||||
scene.lifecycle = scenario_lifecycle::render::Rendering::new(
|
||||
p,
|
||||
@@ -1435,6 +1445,10 @@ impl Scene {
|
||||
// the preceding action/state/reference box, before recording rows.
|
||||
*y += 16.;
|
||||
}
|
||||
#[cfg(test)]
|
||||
behavior_layout_scene_experiment::resolve_row_anchor(*id, y);
|
||||
#[cfg(test)]
|
||||
behavior_anchor_plan_experiment::row_anchor(*id, y);
|
||||
if ordered {
|
||||
let slot = scenario::Slot {
|
||||
parent: owner,
|
||||
@@ -1459,6 +1473,8 @@ impl Scene {
|
||||
(*y - top).max(95.),
|
||||
),
|
||||
);
|
||||
#[cfg(test)]
|
||||
let rect = behavior_anchor_plan_experiment::frame_bounds(*id, rect);
|
||||
self.boxes.insert(
|
||||
0,
|
||||
BoxItem {
|
||||
@@ -1643,6 +1659,8 @@ impl Scene {
|
||||
}
|
||||
if ordered {
|
||||
self.sequence_bounds.insert(owner, (sequence_top, *y - 42.));
|
||||
#[cfg(test)]
|
||||
behavior_anchor_plan_experiment::scope_end(owner, y, &mut self.sequence_bounds);
|
||||
let slot = scenario::Slot {
|
||||
parent: owner,
|
||||
before: None,
|
||||
|
||||
@@ -385,3 +385,41 @@ combined tests and native acceptance are not established by this record.
|
||||
## 2026-09-12 — Cross-machine coordination evidence
|
||||
|
||||
User clarification: independent Gitea peer sessions run on different machines and cannot access this session’s `.local` directory. In-thread delegated agents share this workspace. Publish required source, reviews and runtime evidence through versioned Gitea commits or attachments before handing them to peers; verify access and link the exact version. Local paths are provenance only for remote peers. Local compiler, process and native-window observations do not establish another machine’s state or a shared hardware lease.
|
||||
|
||||
|
||||
## Saved Scenario spacing gestures — 2026-09-13
|
||||
|
||||
Codex-ytr83r /root. For the next Saved Scenario editing increment, dragging a
|
||||
lifeline header changes that view's lane x; dragging a message body or label
|
||||
changes that view's occurrence send-y. Preserve shared Scenario order and all
|
||||
other saved layout records. Keep semantic reordering explicit in the sequence
|
||||
outline; do not infer it from crossing another drawn message. Automatic views
|
||||
retain their existing derived-layout editing behavior.
|
||||
|
||||
This follows the user's requirement for directly editable diagrams and the
|
||||
[existing sparse layout contract](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/src/commit/aed07176ab453b981d5f9c76e504c531f6dd7f42/harness/scenario-layout-contract-candidate.md).
|
||||
The [native Capella comparison](experiments/capella-scenario-observations-20260913/README.md)
|
||||
provides bounded primary evidence: receiver-execution movement changed only the
|
||||
diagram file; separate message/lane Undo restored both files exactly. Two arrow-body
|
||||
drag attempts did not move that example, so use the drawn body/label as discoverable
|
||||
Studio targets while distinguishing activation bars and lifecycle markers by role.
|
||||
This observation does not establish Capella's general crossing or reordering rules.
|
||||
|
||||
Reject implicit shared reordering on a Saved spacing drag: another view's unchanged
|
||||
coordinate records do not ensure unchanged appearance when automatic anchors
|
||||
recompute. Reject a generic permutation of message coordinates: actions, fragments,
|
||||
opaque references and previously crossed positions do not supply interchangeable
|
||||
slots. Reject resetting arrangements to automatic because it discards authored intent.
|
||||
|
||||
Preview from one captured accepted Project and visible camera; resolve the complete
|
||||
candidate geometry without mutating source or history. Commit one existing command
|
||||
only after a valid release and successful source update. Invalid previews, cancellation
|
||||
and return to origin preserve accepted values and camera; an ordinary click still
|
||||
selects its semantic target. Preserve explicit zero/empty/absent overrides and real
|
||||
Redo. Feasible source-order crossings remain diagnostic, not silently clamped.
|
||||
|
||||
Implementation and native acceptance remain pending at this decision. Require
|
||||
actual same-batch and multi-frame input, stale-token cancellation, preview/commit
|
||||
geometry agreement, one Undo/Redo and source reopen, plus measured large-model drag
|
||||
cost. Revisit target affordances or event flow if these workflows reveal accidental
|
||||
reordering, hidden target ambiguity, camera jumps or unacceptable preview latency.
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
# Attachment editing: Escape correction and verified scope
|
||||
|
||||
Branch-specific evidence for [issue 33](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/issues/33),
|
||||
source `53d01a3d4451b94792986f2dfac56f6f04e111a4`.
|
||||
The [portable archive](experiments/edge-attachments-53d01a3-20260923/README.md)
|
||||
is authoritative for raw verification evidence and its limitations. The original
|
||||
[attachment decision](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/src/commit/53d01a3d4451b94792986f2dfac56f6f04e111a4/harness/edge-attachments-20260922.md)
|
||||
and language contract remain authoritative for representation and behavior.
|
||||
|
||||
## Native finding and correction
|
||||
|
||||
Opening the State transition context menu resets the canvas wrapper's keyboard
|
||||
ownership. Selecting Adjust attachment arms the tool without giving the canvas
|
||||
focus. Therefore immediate Escape can reach the application's fallback while
|
||||
the unfocused canvas does not consume it. The original fallback omitted this
|
||||
tool, leaving it armed until a canvas interaction established ownership.
|
||||
|
||||
The accepted correction resets only State AdjustAttachment to Select in the
|
||||
existing application Escape fallback, after prior menu/modal/form handling.
|
||||
It sends no model command and grants no keyboard ownership. Granting focus after
|
||||
the menu would also change Delete and other keyboard semantics; the bounded
|
||||
fallback avoids that unrelated change. Semantic Reconnect policy is unchanged.
|
||||
|
||||
Mounted regression tests exercise actual widget statuses and application
|
||||
subscriptions, including post-menu Escape without a canvas click, focused
|
||||
canvas cancellation, modal priority and unfocused Delete. Full document/source,
|
||||
history and camera invariants are checked where relevant. Native source and
|
||||
target cancellation, source-end attachment editing/history and save/reopen then confirmed
|
||||
the corrected executable's bounded behavior. The preserved original failed
|
||||
observation is the reason for the correction, not superseded evidence to delete.
|
||||
|
||||
## Evidence handling decision
|
||||
|
||||
Build evidence and a native session accidentally shared an indirect executable
|
||||
binding through the Cargo target directory. The native preflight detected the
|
||||
replacement and stopped. Preserving both artifacts, documenting their hashes,
|
||||
restoring the original referenced bytes, and using a new comparison retained
|
||||
the evidence without rewriting history. The corrected native stage binds a
|
||||
preserved executable outside that mutable target directory. Future native
|
||||
stages should similarly separate immutable tested artifacts from build outputs;
|
||||
after restoring an executable, Cargo freshness metadata alone cannot establish
|
||||
that it matches the desired candidate.
|
||||
|
||||
Both portable archives preserve raw failures and use explicit source mappings
|
||||
instead of publishing machine-only paths. No entire-workflow, continuous
|
||||
immutability or clean-build claim is inferred from matching endpoint hashes.
|
||||
|
||||
## Integration boundary
|
||||
|
||||
The ordered contribution is `79cc9d5`, `3aa80de`, then `53d01a3`, above ordinary/Text
|
||||
base `3f9e6a18`. Source and evidence branches are separate. The
|
||||
[integration audit](experiments/edge-attachments-53d01a3-20260923/integration-review.md)
|
||||
identifies actual shared-file seams and focused combined checks. Codex-956atf
|
||||
retains integration/release ownership. These results do not certify the combined
|
||||
Scenario/Text/transition/resize union; no integrated checkpoint is advanced here.
|
||||
@@ -0,0 +1 @@
|
||||
wiring.patch -text -whitespace
|
||||
@@ -0,0 +1,95 @@
|
||||
# Complete anchor plan into actual Scene — pending execution
|
||||
|
||||
Prepared 2026-09-12 in isolated branch `codex/behavior-anchor-plan-ytr83r-20260912`, base `66a1f1690f778c8814bfefff7f46fe7f6bbe520e`. Parent owns compilation and publication. **Not compiled or executed.** Only test-only additions to `crates/oa-desktop/src/behavior.rs` and this new directory were authored. The existing floor experiment and its fixtures are unchanged. All new production-file statements are guarded by `cfg(test)`; normal production rendering is unchanged.
|
||||
|
||||
## Bounded question
|
||||
|
||||
Can a complete ephemeral anchor plan drive the actual Scene at exact requested y coordinates without the old running-cursor floor, preserve unspecified anchors and the entire Document, and maintain covered extents and real lifecycle derivation? This isolates the integration seam from the unresolved choice of a product movement policy.
|
||||
|
||||
The old floor candidate imposed existing seed increments on every requested row. This candidate seeds missing anchors from the actual baseline Scene, then replaces explicitly requested coordinates exactly. It does not impose sequence-order constraints or overlap spacing. Source-order crossings are returned as diagnostic data, not silently clamped or converted into semantic Reorder. This is a mechanical projection experiment, not evidence that crossed vertical ordering is acceptable UX.
|
||||
|
||||
`Candidate` is an external map keyed by occurrence UUID. `Plan` is a complete resolved input for the currently visible Scene, including operand headers missing from the ordinary rows map. It contains row roles, derived message send/receive y values, frame bounds, sequence extents and canvas height. It is not a model, parser or REST payload.
|
||||
|
||||
## Actual code boundary and wiring
|
||||
|
||||
`wiring.patch` records the exact production-file delta from the base commit. The five new cfg(test) integration points are:
|
||||
|
||||
1. Include this module as a private child of `behavior`, next to the unchanged floor module.
|
||||
2. Immediately after the old floor hook, consume the complete plan's exact occurrence anchor, before Scene records rows and constructs the occurrence's existing geometry.
|
||||
3. Before inserting an existing fragment BoxItem, use the plan's frame bounds. Existing fragment paint and label code remain in place.
|
||||
4. Immediately after recording a sequence's bounds, substitute planned bounds and update the existing final insertion axis. An earlier event placed lower than the last event cannot truncate the scope merely because traversal ends earlier.
|
||||
5. Before current lifecycle and activation construction, substitute the covered canvas height. Current `Rendering::new`, message alignment, activation generation and drawing remain responsible for their actual geometry.
|
||||
|
||||
The plan is scoped per thread, inactive by default, restored by Drop during unwinding, and has a deliberate-panic test requiring the exact sentinel payload. Other tests on other threads cannot consume its plan. The original floor hooks remain operational when their own scope is active; the new plan is otherwise absent.
|
||||
|
||||
Footprints are measured from the actual baseline named boxes, message polylines and label bounds, translated by requested row deltas. This avoids cloning the renderer's line or lifecycle algorithms. Empty activation bars are excluded because the real renderer derives those later. Frames conservatively preserve seed extents and can grow downward; growth adds an explicitly experimental 20px presentation margin. A move requiring upward frame growth returns `FixedFrameHeaderWouldMove`, because the candidate cannot move an unspecified painted header while retaining its FrameStart and insertion slot. Mere overlap inside the existing frame is not categorically rejected. Sequence bounds preserve seed extents and measured edge padding while expanding to cover outliers; canvas height uses the original scope-to-canvas margin. Neither these margins nor nonshrinking seed extents are adopted user requirements. This is not a general container-resize solver.
|
||||
|
||||
## Independently expected checks
|
||||
|
||||
Thirteen new test functions use the existing hand-authored fixtures through the actual parser and Document bundle loader. Numeric expectations below are independently stated rather than generated from the new planner:
|
||||
|
||||
| Case | Expected actual Scene result |
|
||||
| --- | --- |
|
||||
| Empty complete plan, both fixtures | Same rows, named boxes and marker kinds, lines and labels, scopes, slots, lifecycle, open calls and size as the unmodified baseline Scene |
|
||||
| Second delivery240→200 | First148; second200; every other occurrence anchor unchanged; both second-message endpoints200; repeated exchange references retain different occurrence IDs |
|
||||
| Nested action477→457 | Box top437, height70; actual fragment metadata and active header332..370 retained, header hit still resolves the fragment, before-slot290 and label unchanged; operand bounds and all other anchors unchanged |
|
||||
| Nested action→300 | Proposed footprint280..350 would relocate unspecified frame top332 to260; reject with `FixedFrameHeaderWouldMove` before rendering |
|
||||
| Nested action→353 / admitted380 overlap | Proposed353 gives footprint333 and operand start311, outside fragment start332; reject with `OperandScopeOutsideEnclosingInterval`. At380 the box starts360 and overlaps the fixed header while scope338..530 stays feasible; actual lifecycle diagnostics remain empty, post-fragment alive span530..845 and later self-call bars remain unchanged |
|
||||
| Create243→50 or84 | Reject with `LifecycleAnchorOutsideRenderScope`; actual root lifecycle span starts85 even when insertion-scope planning expands higher. At85 the real birth marker and alive span85..427 remain present |
|
||||
| Death427→380 | Create243 and call335 stay fixed; real alive span243..380; actual bar335..380; death marker/hit moves to380; unresolved-call cue remains, no Reply is invented |
|
||||
| Self-call636→610 | Actual send610/receive634, using the current24 offset; reply728 unchanged; MessageSend role distinguished from the lifecycle MessageReceive role |
|
||||
| Signed zero and candidate restoration | Both0 and-0 return the exact original sparse candidate; no first-edit materialization; restoring the original candidate restores Scene geometry |
|
||||
| First event→1000, last remains728 | First1000/second240, SourceOrderCrossing diagnostic, source order unchanged; root scope end1026 and height1113 cover the earlier outlier rather than the traversal tail |
|
||||
| Nested action→1000 | Box top980/bottom1050; enclosing frame bottom1070; actual root scope/canvas cover it; following self-call636 remains fixed and overlap is diagnosed |
|
||||
| Invalid/unsupported input | Unknown anchor, nonfinite y, compound frame movement and same-scope inverted birth/death fail explicitly |
|
||||
| Scoped execution | Another thread sees baseline geometry; a deliberate panic restores the baseline scope |
|
||||
|
||||
The primary cases compare the entire Project and original SourceBundle and require the real Document to remain clean with no Undo/Redo entry. Canonical parser roundtrip is used, but it covers only the semantic Project: layout stays external. Candidate restoration is a reversible-sidecar check, **not** a production Undo implementation. No command has been added to Document.
|
||||
|
||||
## Explicit limitations and falsifiers
|
||||
|
||||
- Crossing source-ordered events is deliberately drawable with diagnostics. That proves removal of the mechanical floor, not adoption of unrestricted vertical notation. The crossing output remains an independent product-policy falsifier.
|
||||
- An expanded frame can overlap the next event. Its diagnostic preserves that evidence instead of shifting the next event implicitly. The experiment does not establish a frame/header constraint policy or all feasible layouts.
|
||||
- Upward growth that would relocate an unspecified frame header is explicitly unsupported. This does not ban arbitrary overlap gaps; the numeric380 example remains admitted. Full compound/header movement policy remains unresolved.
|
||||
- A proposed operand interval escaping its actual enclosing fragment/caller interval returns `OperandScopeOutsideEnclosingInterval`. The353 example would otherwise cause the real lifecycle traversal to report MissingGeometry and make the later lifetime unresolved, potentially suppressing a self-call bar despite stable row coordinates. No generic gap or sibling-order rule is added. General nested/cross-operand placement remains unproven.
|
||||
- Lifecycle receive anchors must be within the actual effective Rendering scope: root85..height-20, or its recorded non-root scope with the renderer's existing empty-scope allowance. Outside coordinates are rejected before exposing a Scene whose row exists but whose marker/lifetime is missing. This bounds the inspected bridge; it does not establish general ancestor/operand ordering or cross-operand lifetime support.
|
||||
- The same-scope creation-after-deletion case returns `LifetimeInversionNotSupported` before rendering. Current lifecycle intervals cannot truthfully depict that inversion without another representation policy. This is an experimental bridge limitation, not permission to reject semantically valid models or a user-approved global movement rule. Cross-operand lifecycle combinations remain unproven.
|
||||
- Compound frame/operand movement, box resizing, horizontal layout, independent send/receive movement, route editing, drag transaction stamps, pointer capture, dirty-source recovery, persistence, REST and native UI are not implemented.
|
||||
- Self-call send and receive roles are explicit, but the current activation engine still owns its existing row-based behavior. Peer #21's typed activation integration must consume the actual receive anchor and retain the existing lifetime clipping. These tests do not silently bless the old activation-start discrepancy.
|
||||
- Scope/containment walking is deliberately straightforward and not a large-model performance implementation. There is no responsiveness claim.
|
||||
- Some self-message fixture exchanges are unassigned because the current global relation model forbids self edges. The existing fixture's known incomplete-model warnings remain; tests reject semantic errors.
|
||||
|
||||
No storage or parser design should be adopted from this adapter. Coordinate any eventual payload with prospective #7, whose required addressing must preserve diagram/owner/occurrence identity and explicit anchor roles. Coordinate inverse resize with #16 and typed activation/lifetime union with #21 before broad UI work.
|
||||
|
||||
The accumulating frame, scope and lifecycle dependencies show that this is only a bridge for demonstrated feasible positions, **not an adoptable free-editing architecture**. It neither establishes unrestricted placement nor selects a semantic constraint policy. Further fundamental contradictions should become explicit falsifiers for parent replanning, not an expanding list of speculative guards in this prototype.
|
||||
|
||||
Parent reports [peer #21 comment716](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/issues/21#issuecomment-716), posted2026-09-12 23:06UTC: Codex-956atf owns an isolated typed-activation/lifecycle source union. Its intended order is finalized rows/height, lifecycle construction and Create/Delete alignment, then typed Call/Reply attachment, with receiver/scope clipping, logical reply timing distinct from clipped geometry, no resurrection after Delete, and unanswered-call cues preserved. That WIP is not integrated here. Retain the explicit send/receive seam and review the future union against these fixtures; this paragraph records a coordination dependency, not verified acceptance of peer code.
|
||||
|
||||
## Reproduction and handoff
|
||||
|
||||
At the parent's chosen compiler checkpoint, use the configured Windows Rust/linker environment:
|
||||
|
||||
```powershell
|
||||
cargo test -p oa-desktop --bin arcadia-studio --locked --offline -- behavior_layout_scene_experiment behavior_anchor_plan_experiment --list
|
||||
cargo test -p oa-desktop --bin arcadia-studio --locked --offline -- behavior_layout_scene_experiment behavior_anchor_plan_experiment --nocapture
|
||||
```
|
||||
|
||||
The listing must contain thirteen complete-anchor tests and ten existing floor/lifetime tests. The following execution must report all23 passed,0 failed,0 ignored. Both filter strings are passed to the same test binary. Preserve compile failures, parser failures, numeric mismatches and diagnostics as results. Do not claim success from a zero-test filtered run or from compiling only production targets. An intentional panic should be followed by its restoration test passing; another panic payload is a failure.
|
||||
|
||||
## Static review correction history
|
||||
|
||||
The frozen attempt1 candidate was preserved before these corrections. The [authoritative attempt1 archive](../behavior-anchor-plan-review-20260912/attempt1/manifest.json) preserves all five original files; the adjacent review report records the source-verified counterexamples. The pre-review failures are static, unexecuted findings: nested300 silently moved the frame header to260 while row332/slot290 stayed fixed, and Create50 was omitted as MissingGeometry by the actual root lifetime span starting85. The corrected candidate adds named unsupported errors and independent numeric checks rather than recording either original behavior as acceptance. Production hooks and the original floor experiment remain unchanged.
|
||||
|
||||
Before the third correction, parent preserved all five attempt2 files and matching hashes under `harness/experiments/behavior-anchor-plan-review-20260912/attempt2`. That static, unexecuted candidate still admitted nested353: its operand start311 preceded enclosing fragment332, causing MissingGeometry/Unresolved in the actual lifecycle source path. The third correction rejects that exact unsupported scope escape and replaces the positive overlap example with380, including actual lifecycle diagnostics, post-fragment spans and activation-bar preservation checks. The parent-owned review archive is not modified by this experiment.
|
||||
|
||||
Record exact compiled commit/uncommitted patch, commands and results before publication. Source hashes supplied with the handoff identify prepared bytes, not tested code. Root should publish the complete directory and exact behavior.rs delta so remote peers can reproduce it; workspace-local paths are not remote handoffs.
|
||||
|
||||
## Modeling intent: primary-source comparison
|
||||
|
||||
The [Sirius sequence user guide](https://eclipse.dev/sirius/doc/user/sequences/Sequence%20Diagrams.html#SequenceDiagramsSemantics) explicitly ties displayed event order to semantic order: moving an event across another can update the model. It separately describes horizontal lifeline movement, Create/Delete attachment and blank-space gestures. This is framework evidence; the exact Capella modifier, feedback and saved-file effects were not verified natively.
|
||||
|
||||
The [Sirius event-reorder specification](https://eclipse.dev/sirius/doc/specifier/sequences/Sequence%20Diagrams.html#EventReorderTool) provides separate predecessor information for start/send and finish/receive, including coupled synchronous-message movement. That supports preserving distinct endpoint roles; it does not specify a separate user-selected reorder mode.
|
||||
|
||||
Root inference: the user request for intuitive whole-arrow movement does not by itself require arbitrary cosmetic chronology crossing. Compare two coherent product gestures: presentation movement within semantic order plus an explicit reorder action, versus direct dragging that previews and commits a semantic reorder when crossing an event. Evaluate ordinary spacing, intentional order changes, accidental crossing, invalid call/reply/lifetime moves, cross-operand moves, discoverability, one-step Undo and exact preview/reopen behavior. A semantic reorder may change Project/source; presentation-only adjustment must retain semantic content. The current sidecar experiment tests the latter boundary and is not a universal nonmutation requirement for all future drag operations. No gesture or public schema is selected by this note.
|
||||
|
||||
Root formatting completed for the new Rust modules. Independent correction review found no new blocking source finding after the operand-scope repair, including non-vacuous actual lifetime/bar assertions. Compiler and runtime results remain pending. [Prepared input hashes](prepared-inputs.json) bind the current candidate, not an accepted build.
|
||||
@@ -0,0 +1,448 @@
|
||||
//! Experimental complete anchor input for the actual Scene, cfg(test) only.
|
||||
//! No persistence schema and no replacement line/lifecycle/activation renderer.
|
||||
use super::*;
|
||||
use std::cell::RefCell;
|
||||
|
||||
mod tests;
|
||||
|
||||
type Candidate = BTreeMap<Id, f32>;
|
||||
|
||||
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
||||
enum AnchorRole {
|
||||
MessageSend,
|
||||
MessageReceive,
|
||||
Observation,
|
||||
FrameStart,
|
||||
OperandStart,
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Debug, PartialEq)]
|
||||
struct Anchor {
|
||||
y: f32,
|
||||
role: AnchorRole,
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Debug, PartialEq)]
|
||||
struct MessageAnchors {
|
||||
send_y: f32,
|
||||
receive_y: f32,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, Eq)]
|
||||
enum Diagnostic {
|
||||
SourceOrderCrossing { scope: Id, before: Id, after: Id },
|
||||
FrameExtendsPastFollowingAnchor { frame: Id, following: Id },
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, Eq)]
|
||||
enum PlanError {
|
||||
UnknownAnchor(Id),
|
||||
NonFinite(Id),
|
||||
CompoundMoveNotImplemented(Id),
|
||||
FixedFrameHeaderWouldMove { frame: Id },
|
||||
OperandScopeOutsideEnclosingInterval { operand: Id, fragment: Id },
|
||||
LifecycleAnchorOutsideRenderScope { occurrence: Id, scope: Id },
|
||||
LifetimeInversionNotSupported { create: Id, delete: Id },
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
struct Plan {
|
||||
anchors: BTreeMap<Id, Anchor>,
|
||||
messages: BTreeMap<Id, MessageAnchors>,
|
||||
frames: BTreeMap<Id, Rectangle>,
|
||||
scopes: BTreeMap<Id, (f32, f32)>,
|
||||
height: f32,
|
||||
diagnostics: Vec<Diagnostic>,
|
||||
}
|
||||
|
||||
fn occurrence(p: &Project, id: Id) -> Option<&OccurrenceBody> {
|
||||
match p.elements.get(&id)?.shared()? {
|
||||
SharedBody::Occurrence { body, .. } => Some(body),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
fn role(body: &OccurrenceBody) -> AnchorRole {
|
||||
match body {
|
||||
OccurrenceBody::Exchange {
|
||||
message_kind: MessageKind::Create | MessageKind::Delete,
|
||||
..
|
||||
} => AnchorRole::MessageReceive,
|
||||
OccurrenceBody::Exchange { .. } => AnchorRole::MessageSend,
|
||||
OccurrenceBody::Fragment { .. } => AnchorRole::FrameStart,
|
||||
OccurrenceBody::Branch { .. } => AnchorRole::OperandStart,
|
||||
_ => AnchorRole::Observation,
|
||||
}
|
||||
}
|
||||
|
||||
fn inside(p: &Project, id: Id, owner: Id) -> bool {
|
||||
let mut current = p.elements.get(&id).and_then(|e| e.parent);
|
||||
for _ in 0..p.elements.len() {
|
||||
match current {
|
||||
Some(parent) if parent == owner => return true,
|
||||
Some(parent) => current = p.elements.get(&parent).and_then(|e| e.parent),
|
||||
None => return false,
|
||||
}
|
||||
}
|
||||
false
|
||||
}
|
||||
|
||||
fn depth(p: &Project, id: Id) -> usize {
|
||||
let mut current = p.elements.get(&id).and_then(|e| e.parent);
|
||||
let mut result = 0;
|
||||
while let Some(parent) = current {
|
||||
result += 1;
|
||||
if result > p.elements.len() {
|
||||
break;
|
||||
}
|
||||
current = p.elements.get(&parent).and_then(|e| e.parent);
|
||||
}
|
||||
result
|
||||
}
|
||||
|
||||
fn union(a: Rectangle, b: Rectangle) -> Rectangle {
|
||||
let x = a.x.min(b.x);
|
||||
let y = a.y.min(b.y);
|
||||
Rectangle::new(
|
||||
Point::new(x, y),
|
||||
Size::new(
|
||||
(a.x + a.width).max(b.x + b.width) - x,
|
||||
(a.y + a.height).max(b.y + b.height) - y,
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
/// Actual named shapes/message paths supply footprint measurements; activation
|
||||
/// bars are intentionally excluded because current Scene derives them later.
|
||||
fn footprints(
|
||||
scene: &Scene,
|
||||
anchors: &BTreeMap<Id, Anchor>,
|
||||
seed: &BTreeMap<Id, Anchor>,
|
||||
) -> BTreeMap<Id, Rectangle> {
|
||||
let mut out = BTreeMap::new();
|
||||
for item in scene.boxes.iter().filter(|item| !item.title.is_empty()) {
|
||||
let Some(anchor) = anchors.get(&item.id) else {
|
||||
continue;
|
||||
};
|
||||
let mut rect = item.rect;
|
||||
rect.y += anchor.y - seed[&item.id].y;
|
||||
out.insert(item.id, rect);
|
||||
}
|
||||
for line in &scene.lines {
|
||||
let Some(anchor) = anchors.get(&line.id) else {
|
||||
continue;
|
||||
};
|
||||
let delta = anchor.y - seed[&line.id].y;
|
||||
let mut rect = line.label_bounds();
|
||||
rect.y += delta;
|
||||
for point in &line.points {
|
||||
rect = union(
|
||||
rect,
|
||||
Rectangle::new(Point::new(point.x, point.y + delta), Size::ZERO),
|
||||
);
|
||||
}
|
||||
out.entry(line.id)
|
||||
.and_modify(|old| *old = union(*old, rect))
|
||||
.or_insert(rect);
|
||||
}
|
||||
out
|
||||
}
|
||||
|
||||
fn covered_bounds(
|
||||
p: &Project,
|
||||
owner: Id,
|
||||
footprints: &BTreeMap<Id, Rectangle>,
|
||||
) -> Option<Rectangle> {
|
||||
footprints
|
||||
.iter()
|
||||
.filter(|(id, _)| inside(p, **id, owner))
|
||||
.map(|(_, rect)| *rect)
|
||||
.reduce(union)
|
||||
}
|
||||
|
||||
impl Plan {
|
||||
fn build(
|
||||
p: &Project,
|
||||
owner: Id,
|
||||
baseline: &Scene,
|
||||
desired: &Candidate,
|
||||
) -> Result<Self, PlanError> {
|
||||
let mut seed: BTreeMap<_, _> = baseline
|
||||
.rows
|
||||
.iter()
|
||||
.map(|(id, (_, y))| {
|
||||
(
|
||||
*id,
|
||||
Anchor {
|
||||
y: *y,
|
||||
role: role(occurrence(p, *id).expect("Scene occurrence")),
|
||||
},
|
||||
)
|
||||
})
|
||||
.collect();
|
||||
// Operand headers are real Scene boxes, but are not entries in rows.
|
||||
for item in &baseline.boxes {
|
||||
if matches!(occurrence(p, item.id), Some(OccurrenceBody::Branch { .. })) {
|
||||
seed.insert(
|
||||
item.id,
|
||||
Anchor {
|
||||
y: item.rect.y,
|
||||
role: AnchorRole::OperandStart,
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
let mut anchors = seed.clone();
|
||||
for (&id, &y) in desired {
|
||||
let anchor = anchors.get_mut(&id).ok_or(PlanError::UnknownAnchor(id))?;
|
||||
if !y.is_finite() {
|
||||
return Err(PlanError::NonFinite(id));
|
||||
}
|
||||
if matches!(
|
||||
anchor.role,
|
||||
AnchorRole::FrameStart | AnchorRole::OperandStart
|
||||
) && y != anchor.y
|
||||
{
|
||||
return Err(PlanError::CompoundMoveNotImplemented(id));
|
||||
}
|
||||
anchor.y = y;
|
||||
}
|
||||
let mut messages = BTreeMap::new();
|
||||
for line in &baseline.lines {
|
||||
if let (Some(anchor), Some(first), Some(last)) = (
|
||||
anchors.get(&line.id),
|
||||
line.points.first(),
|
||||
line.points.last(),
|
||||
) {
|
||||
let delta = anchor.y - seed[&line.id].y;
|
||||
messages.insert(
|
||||
line.id,
|
||||
MessageAnchors {
|
||||
send_y: first.y + delta,
|
||||
receive_y: last.y + delta,
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
// The current lifecycle bridge needs positive birth/death intervals.
|
||||
// This is an explicit unsupported crossing, not a new semantic rule.
|
||||
for (&create, message) in &messages {
|
||||
if let Some(OccurrenceBody::Exchange {
|
||||
message_kind: MessageKind::Create,
|
||||
receiver: Some(lane),
|
||||
..
|
||||
}) = occurrence(p, create)
|
||||
{
|
||||
for (&delete, finish) in &messages {
|
||||
if p.elements[&create].parent == p.elements[&delete].parent
|
||||
&& matches!(occurrence(p, delete), Some(OccurrenceBody::Exchange { message_kind: MessageKind::Delete, receiver: Some(other), .. }) if other == lane)
|
||||
&& message.receive_y > finish.receive_y
|
||||
{
|
||||
return Err(PlanError::LifetimeInversionNotSupported { create, delete });
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
let old_footprints = footprints(baseline, &seed, &seed);
|
||||
let mut drawn = footprints(baseline, &anchors, &seed);
|
||||
let mut frames = BTreeMap::new();
|
||||
let mut containers: Vec<_> = seed
|
||||
.keys()
|
||||
.copied()
|
||||
.filter(|id| matches!(occurrence(p, *id), Some(OccurrenceBody::Fragment { .. })))
|
||||
.collect();
|
||||
containers.sort_by_key(|id| std::cmp::Reverse(depth(p, *id)));
|
||||
for id in containers {
|
||||
let original = old_footprints[&id];
|
||||
let mut rect = original;
|
||||
if let Some(covered) = covered_bounds(p, id, &drawn) {
|
||||
// Keep seed extents where possible; 20px growth padding is an
|
||||
// explicit experimental presentation preference, not semantics.
|
||||
// Upward envelope growth would move the painted frame header
|
||||
// while its fixed FrameStart/row/slot remained at the seed.
|
||||
// Reject that unsupported compound change, not mere overlap.
|
||||
if covered.y < rect.y {
|
||||
return Err(PlanError::FixedFrameHeaderWouldMove { frame: id });
|
||||
}
|
||||
if covered.y + covered.height > rect.y + rect.height {
|
||||
rect.height = covered.y + covered.height + 20. - rect.y;
|
||||
}
|
||||
}
|
||||
frames.insert(id, rect);
|
||||
drawn.insert(id, rect);
|
||||
}
|
||||
let mut scopes = baseline.sequence_bounds.clone();
|
||||
for (&scope, bounds) in &mut scopes {
|
||||
if let (Some(old), Some(new)) = (
|
||||
covered_bounds(p, scope, &old_footprints),
|
||||
covered_bounds(p, scope, &drawn),
|
||||
) {
|
||||
let top_padding = (old.y - bounds.0).max(0.);
|
||||
let bottom_padding = (bounds.1 - old.y - old.height).max(0.);
|
||||
if new.y < bounds.0 {
|
||||
bounds.0 = new.y - top_padding;
|
||||
}
|
||||
bounds.1 = bounds.1.max(new.y + new.height + bottom_padding);
|
||||
}
|
||||
}
|
||||
let tail = baseline.size.height - baseline.sequence_bounds[&owner].1;
|
||||
let height = baseline.size.height.max(scopes[&owner].1 + tail);
|
||||
for (&operand, &(start, end)) in &scopes {
|
||||
if !matches!(occurrence(p, operand), Some(OccurrenceBody::Branch { .. })) {
|
||||
continue;
|
||||
}
|
||||
let fragment = p.elements[&operand].parent.expect("operand fragment");
|
||||
let caller = p.elements[&fragment]
|
||||
.parent
|
||||
.expect("fragment caller sequence");
|
||||
let enclosing_frame = frames[&fragment];
|
||||
let (caller_start, caller_end) = if caller == owner {
|
||||
(85., height - 20.)
|
||||
} else {
|
||||
let (a, b) = scopes[&caller];
|
||||
(a, if a == b { a + 26. } else { b })
|
||||
};
|
||||
let enclosing_start = anchors[&fragment].y.max(caller_start);
|
||||
let enclosing_end = (enclosing_frame.y + enclosing_frame.height).min(caller_end);
|
||||
let effective_end = if start == end { start + 26. } else { end };
|
||||
// Actual lifecycle traversal cannot enter an operand that escapes
|
||||
// this enclosing interval. This guards bridge feasibility only;
|
||||
// it is not a generic event-spacing or sibling-ordering policy.
|
||||
if start < enclosing_start || effective_end > enclosing_end {
|
||||
return Err(PlanError::OperandScopeOutsideEnclosingInterval { operand, fragment });
|
||||
}
|
||||
}
|
||||
for (&id, message) in &messages {
|
||||
if matches!(
|
||||
occurrence(p, id),
|
||||
Some(OccurrenceBody::Exchange {
|
||||
message_kind: MessageKind::Create | MessageKind::Delete,
|
||||
..
|
||||
})
|
||||
) {
|
||||
let scope = p.elements[&id].parent.expect("lifecycle sequence owner");
|
||||
// Match Rendering::new's effective scope, not the insertion
|
||||
// scope: it overrides the root span to 85..height-20 and gives
|
||||
// empty non-root scopes the existing 26px lifetime allowance.
|
||||
let (start, end) = if scope == owner {
|
||||
(85., height - 20.)
|
||||
} else if let Some(&(start, end)) = scopes.get(&scope) {
|
||||
(start, if start == end { start + 26. } else { end })
|
||||
} else {
|
||||
return Err(PlanError::LifecycleAnchorOutsideRenderScope {
|
||||
occurrence: id,
|
||||
scope,
|
||||
});
|
||||
};
|
||||
if message.receive_y < start || message.receive_y > end {
|
||||
return Err(PlanError::LifecycleAnchorOutsideRenderScope {
|
||||
occurrence: id,
|
||||
scope,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
let mut diagnostics = Vec::new();
|
||||
for element in p
|
||||
.elements
|
||||
.values()
|
||||
.filter(|e| e.id == owner || inside(p, e.id, owner))
|
||||
{
|
||||
if let Some(steps) = element.steps() {
|
||||
for pair in steps.windows(2) {
|
||||
if let (Some(a), Some(b)) = (anchors.get(&pair[0]), anchors.get(&pair[1])) {
|
||||
if a.y > b.y {
|
||||
diagnostics.push(Diagnostic::SourceOrderCrossing {
|
||||
scope: element.id,
|
||||
before: pair[0],
|
||||
after: pair[1],
|
||||
});
|
||||
}
|
||||
if let Some(frame) = frames.get(&pair[0]) {
|
||||
if frame.y + frame.height > b.y {
|
||||
diagnostics.push(Diagnostic::FrameExtendsPastFollowingAnchor {
|
||||
frame: pair[0],
|
||||
following: pair[1],
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Ok(Self {
|
||||
anchors,
|
||||
messages,
|
||||
frames,
|
||||
scopes,
|
||||
height,
|
||||
diagnostics,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
thread_local! {
|
||||
static PLAN: RefCell<Option<Plan>> = const { RefCell::new(None) };
|
||||
}
|
||||
|
||||
struct Scope(Option<Plan>);
|
||||
impl Scope {
|
||||
fn install(plan: &Plan) -> Self {
|
||||
Self(PLAN.with(|slot| slot.replace(Some(plan.clone()))))
|
||||
}
|
||||
}
|
||||
impl Drop for Scope {
|
||||
fn drop(&mut self) {
|
||||
PLAN.with(|slot| {
|
||||
slot.replace(self.0.take());
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
pub(super) fn row_anchor(id: Id, y: &mut f32) {
|
||||
PLAN.with(|slot| {
|
||||
if let Some(plan) = slot.borrow().as_ref() {
|
||||
*y = plan.anchors.get(&id).expect("complete Scene anchor plan").y;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
pub(super) fn frame_bounds(id: Id, fallback: Rectangle) -> Rectangle {
|
||||
PLAN.with(|slot| {
|
||||
slot.borrow()
|
||||
.as_ref()
|
||||
.map_or(fallback, |plan| plan.frames[&id])
|
||||
})
|
||||
}
|
||||
|
||||
pub(super) fn scope_end(owner: Id, y: &mut f32, bounds: &mut BTreeMap<Id, (f32, f32)>) {
|
||||
PLAN.with(|slot| {
|
||||
if let Some(plan) = slot.borrow().as_ref() {
|
||||
bounds.insert(owner, plan.scopes[&owner]);
|
||||
*y = plan.scopes[&owner].1 + 42.; // Existing insertion-axis offset.
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
pub(super) fn scene_extent(scene: &mut Scene) {
|
||||
PLAN.with(|slot| {
|
||||
if let Some(plan) = slot.borrow().as_ref() {
|
||||
scene.size.height = plan.height;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
fn render(p: &Project, owner: Id, plan: &Plan) -> Scene {
|
||||
let _scope = Scope::install(plan);
|
||||
Scene::sequence(p, owner, owner)
|
||||
}
|
||||
|
||||
fn drag(original: &Candidate, frame: &Scene, target: Id, delta_y: f32) -> Candidate {
|
||||
assert!(delta_y.is_finite());
|
||||
if delta_y == 0. {
|
||||
return original.clone();
|
||||
}
|
||||
let mut result = original.clone();
|
||||
result.insert(target, frame.rows[&target].1 + delta_y);
|
||||
result
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"base": "66a1f1690f778c8814bfefff7f46fe7f6bbe520e",
|
||||
"status": "Formatted candidate; uncompiled and unexecuted",
|
||||
"files": [
|
||||
{
|
||||
"path": "crates/oa-desktop/src/behavior.rs",
|
||||
"bytes": 137409,
|
||||
"sha256": "5884ba35ad994eb5936ca29c071a5002efc221dc42ef35e2265d50593bdf60ec"
|
||||
},
|
||||
{
|
||||
"path": "harness/experiments/behavior-anchor-plan-20260912/mod.rs",
|
||||
"bytes": 15658,
|
||||
"sha256": "cfa848bcf1f8f48324f5cd746944c9b8b4959e6aa086a7726b922d6a01cbbf3c"
|
||||
},
|
||||
{
|
||||
"path": "harness/experiments/behavior-anchor-plan-20260912/tests.rs",
|
||||
"bytes": 25567,
|
||||
"sha256": "c93b5668872217888c517df549fb6bea99fbc5642fdf8c2e55bdd92537df07b8"
|
||||
},
|
||||
{
|
||||
"path": "harness/experiments/behavior-anchor-plan-20260912/README.md",
|
||||
"bytes": 16350,
|
||||
"sha256": "da062779c90c7b9f0696f697521c1b0055c58d473329ac1817a55b0ba0f88370"
|
||||
},
|
||||
{
|
||||
"path": "harness/experiments/behavior-anchor-plan-20260912/wiring.patch",
|
||||
"bytes": 2131,
|
||||
"sha256": "4ce4bc45fbc419eba6a07b048b82efb8d85525514e3d2e56421948e7733f40fd"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,727 @@
|
||||
use super::*;
|
||||
use crate::document::Document;
|
||||
use oa_core::{
|
||||
language,
|
||||
source_project::{ProjectLimits, SourceBundle},
|
||||
validation,
|
||||
};
|
||||
|
||||
fn id(p: &Project, alias: &str) -> Id {
|
||||
p.identities()
|
||||
.into_iter()
|
||||
.find(|(_, name)| *name == alias)
|
||||
.unwrap()
|
||||
.0
|
||||
}
|
||||
|
||||
fn fixture(lifetime: bool) -> (Document, Id) {
|
||||
let (name, input, owner) = if lifetime {
|
||||
(
|
||||
"lifetime.arcadia",
|
||||
include_str!("../behavior-layout-scene-20260912/lifetime.arcadia"),
|
||||
"lifetime_conversation",
|
||||
)
|
||||
} else {
|
||||
(
|
||||
"fixture.arcadia",
|
||||
include_str!("../behavior-layout-scene-20260912/fixture.arcadia"),
|
||||
"conversation",
|
||||
)
|
||||
};
|
||||
let p = language::parse(input).expect("existing real Arcadia fixture");
|
||||
let errors: Vec<_> = validation::validate(&p)
|
||||
.into_iter()
|
||||
.filter(|issue| issue.severity == validation::Severity::Error)
|
||||
.collect();
|
||||
assert!(errors.is_empty(), "{errors:?}");
|
||||
let bundle = SourceBundle {
|
||||
entry: name.into(),
|
||||
files: BTreeMap::from([(name.into(), input.into())]),
|
||||
};
|
||||
let document = Document::from_bundle(bundle, ProjectLimits::default()).unwrap();
|
||||
assert_eq!(document.project(), &p);
|
||||
assert_eq!(language::parse(&language::format(&p)).unwrap(), p);
|
||||
let owner = id(&p, owner);
|
||||
(document, owner)
|
||||
}
|
||||
|
||||
fn passive(document: &Document, before: &Project, source: &SourceBundle) {
|
||||
assert_eq!(document.project(), before);
|
||||
assert_eq!(document.bundle(), source);
|
||||
assert!(!document.dirty());
|
||||
assert!(!document.can_undo() && !document.can_redo());
|
||||
}
|
||||
|
||||
fn row(scene: &Scene, id: Id) -> f32 {
|
||||
scene.rows[&id].1
|
||||
}
|
||||
fn line(scene: &Scene, id: Id) -> &Line {
|
||||
assert_eq!(scene.lines.iter().filter(|line| line.id == id).count(), 1);
|
||||
scene.lines.iter().find(|line| line.id == id).unwrap()
|
||||
}
|
||||
fn named_box(scene: &Scene, id: Id) -> &BoxItem {
|
||||
scene
|
||||
.boxes
|
||||
.iter()
|
||||
.find(|item| item.id == id && !item.title.is_empty())
|
||||
.unwrap()
|
||||
}
|
||||
|
||||
fn same_scene(a: &Scene, b: &Scene) {
|
||||
assert_eq!(a.rows, b.rows);
|
||||
assert_eq!(a.sequence_bounds, b.sequence_bounds);
|
||||
assert_eq!(a.size, b.size);
|
||||
assert_eq!(a.lanes, b.lanes);
|
||||
assert_eq!(a.lifecycle, b.lifecycle);
|
||||
assert_eq!(a.open_calls, b.open_calls);
|
||||
let boxes = |s: &Scene| {
|
||||
s.boxes
|
||||
.iter()
|
||||
.map(|b| (b.id, b.rect, b.title.clone(), b.detail.clone(), b.marker))
|
||||
.collect::<Vec<_>>()
|
||||
};
|
||||
let lines = |s: &Scene| {
|
||||
s.lines
|
||||
.iter()
|
||||
.map(|l| {
|
||||
(
|
||||
l.id,
|
||||
l.points.clone(),
|
||||
l.label_at,
|
||||
l.label.clone(),
|
||||
l.dashed,
|
||||
)
|
||||
})
|
||||
.collect::<Vec<_>>()
|
||||
};
|
||||
let slots = |s: &Scene| {
|
||||
s.slots
|
||||
.iter()
|
||||
.map(|slot| {
|
||||
(
|
||||
slot.slot.parent,
|
||||
slot.slot.before,
|
||||
slot.y,
|
||||
slot.label.clone(),
|
||||
)
|
||||
})
|
||||
.collect::<Vec<_>>()
|
||||
};
|
||||
assert_eq!(boxes(a), boxes(b));
|
||||
assert_eq!(lines(a), lines(b));
|
||||
assert_eq!(slots(a), slots(b));
|
||||
}
|
||||
|
||||
fn others_fixed(before: &Scene, after: &Scene, changed: Id) {
|
||||
assert_eq!(before.rows.len(), after.rows.len());
|
||||
for (&id, original) in &before.rows {
|
||||
if id != changed {
|
||||
assert_eq!(&after.rows[&id], original, "unexpected movement of {id}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn fixed_frame_metadata(before: &Scene, after: &Scene, frame: Id) {
|
||||
let original = named_box(before, frame);
|
||||
let current = named_box(after, frame);
|
||||
assert_eq!(
|
||||
(
|
||||
current.id,
|
||||
current.rect,
|
||||
¤t.title,
|
||||
¤t.detail,
|
||||
current.marker
|
||||
),
|
||||
(
|
||||
original.id,
|
||||
original.rect,
|
||||
&original.title,
|
||||
&original.detail,
|
||||
original.marker
|
||||
)
|
||||
);
|
||||
assert_eq!(before.rows[&frame], after.rows[&frame]);
|
||||
assert_eq!(row(after, frame), 332.);
|
||||
// Scene::hit uses the first38px as the frame's active painted header.
|
||||
let header = Rectangle::new(
|
||||
Point::new(original.rect.x, original.rect.y),
|
||||
Size::new(original.rect.width, 38.),
|
||||
);
|
||||
assert_eq!((header.y, header.y + header.height), (332., 370.));
|
||||
let probe = Point::new(header.x + 8., header.y + 8.);
|
||||
assert_eq!(before.hit(probe), Some(frame));
|
||||
assert_eq!(after.hit(probe), Some(frame));
|
||||
let original_slot = before
|
||||
.slots
|
||||
.iter()
|
||||
.find(|slot| slot.slot.before == Some(frame))
|
||||
.unwrap();
|
||||
let current_slot = after
|
||||
.slots
|
||||
.iter()
|
||||
.find(|slot| slot.slot.before == Some(frame))
|
||||
.unwrap();
|
||||
assert_eq!(
|
||||
(
|
||||
current_slot.slot.parent,
|
||||
current_slot.slot.before,
|
||||
current_slot.y,
|
||||
¤t_slot.label
|
||||
),
|
||||
(
|
||||
original_slot.slot.parent,
|
||||
original_slot.slot.before,
|
||||
original_slot.y,
|
||||
&original_slot.label
|
||||
)
|
||||
);
|
||||
assert_eq!(current_slot.y, 290.);
|
||||
}
|
||||
|
||||
fn actual_lifetime_projection(
|
||||
p: &Project,
|
||||
owner: Id,
|
||||
scene: &Scene,
|
||||
) -> Vec<scenario_lifecycle::LaneLifetime> {
|
||||
// Same actual rows/scope inputs as Rendering::new, including its root span
|
||||
// and empty-operand allowance; call the real projector for diagnostics.
|
||||
let mut scopes = scene.sequence_bounds.clone();
|
||||
for (&scope, (start, end)) in &mut scopes {
|
||||
if scope != owner && *start == *end {
|
||||
*end = *start + 26.;
|
||||
}
|
||||
}
|
||||
scopes.insert(owner, (85., scene.size.height - 20.));
|
||||
scenario_lifecycle::project_lifetimes(
|
||||
p,
|
||||
owner,
|
||||
&scenario_lifecycle::Geometry {
|
||||
rows: &scene.rows,
|
||||
scopes: &scopes,
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn complete_seed_plan_preserves_both_actual_scene_and_document_baselines() {
|
||||
for lifetime in [false, true] {
|
||||
let (document, owner) = fixture(lifetime);
|
||||
let p = document.project();
|
||||
let before = p.clone();
|
||||
let source = document.bundle().clone();
|
||||
let baseline = Scene::sequence(p, owner, owner);
|
||||
let plan = Plan::build(p, owner, &baseline, &Candidate::new()).unwrap();
|
||||
assert!(plan.diagnostics.is_empty());
|
||||
for (&id, (_, y)) in &baseline.rows {
|
||||
assert_eq!(plan.anchors[&id].y, *y);
|
||||
}
|
||||
same_scene(&baseline, &render(p, owner, &plan));
|
||||
let reparsed = language::parse(&language::format(p)).unwrap();
|
||||
same_scene(&baseline, &render(&reparsed, owner, &plan));
|
||||
passive(&document, &before, &source);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn upward_second_delivery_reaches_200_and_all_other_occurrence_anchors_stay_fixed() {
|
||||
let (document, owner) = fixture(false);
|
||||
let p = document.project();
|
||||
let before = p.clone();
|
||||
let source = document.bundle().clone();
|
||||
let baseline = Scene::sequence(p, owner, owner);
|
||||
let first = id(p, "first");
|
||||
let second = id(p, "second");
|
||||
assert_ne!(first, second);
|
||||
for occurrence_id in [first, second] {
|
||||
assert!(
|
||||
matches!(occurrence(p,occurrence_id),Some(OccurrenceBody::Exchange { exchange:Some(edge),.. }) if *edge==id(p,"channel"))
|
||||
);
|
||||
}
|
||||
assert_eq!(
|
||||
(row(&baseline, first), row(&baseline, second)),
|
||||
(148., 240.)
|
||||
);
|
||||
let candidate = drag(&Candidate::new(), &baseline, second, -40.);
|
||||
assert_eq!(candidate, Candidate::from([(second, 200.)]));
|
||||
let plan = Plan::build(p, owner, &baseline, &candidate).unwrap();
|
||||
let moved = render(p, owner, &plan);
|
||||
assert_eq!((row(&moved, first), row(&moved, second)), (148., 200.));
|
||||
others_fixed(&baseline, &moved, second);
|
||||
assert_eq!(line(&moved, first).points, line(&baseline, first).points);
|
||||
let left = moved.lanes[&id(p, "left")];
|
||||
let right = moved.lanes[&id(p, "right")];
|
||||
assert_eq!(
|
||||
line(&moved, second).points,
|
||||
vec![Point::new(left, 200.), Point::new(right, 200.)]
|
||||
);
|
||||
assert_eq!(
|
||||
plan.messages[&second],
|
||||
MessageAnchors {
|
||||
send_y: 200.,
|
||||
receive_y: 200.
|
||||
}
|
||||
);
|
||||
assert!(plan.diagnostics.is_empty());
|
||||
same_scene(&moved, &render(p, owner, &plan));
|
||||
passive(&document, &before, &source);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn nested_upward_anchor_reaches_457_without_moving_parent_or_followers() {
|
||||
let (document, owner) = fixture(false);
|
||||
let p = document.project();
|
||||
let before = p.clone();
|
||||
let source = document.bundle().clone();
|
||||
let baseline = Scene::sequence(p, owner, owner);
|
||||
let nested = id(p, "nested");
|
||||
let fragment = id(p, "fragment");
|
||||
assert_eq!(row(&baseline, nested), 477.);
|
||||
let candidate = drag(&Candidate::new(), &baseline, nested, -20.);
|
||||
let plan = Plan::build(p, owner, &baseline, &candidate).unwrap();
|
||||
let moved = render(p, owner, &plan);
|
||||
assert_eq!(row(&moved, nested), 457.);
|
||||
assert_eq!(named_box(&moved, nested).rect.y, 437.);
|
||||
assert_eq!(named_box(&moved, nested).rect.height, 70.);
|
||||
assert_eq!(
|
||||
named_box(&moved, fragment).rect,
|
||||
named_box(&baseline, fragment).rect
|
||||
);
|
||||
assert_eq!(
|
||||
(
|
||||
named_box(&moved, fragment).rect.y,
|
||||
named_box(&moved, fragment).rect.height
|
||||
),
|
||||
(332., 240.)
|
||||
);
|
||||
fixed_frame_metadata(&baseline, &moved, fragment);
|
||||
assert_eq!(
|
||||
moved.sequence_bounds[&id(p, "operand")],
|
||||
baseline.sequence_bounds[&id(p, "operand")]
|
||||
);
|
||||
others_fixed(&baseline, &moved, nested);
|
||||
assert!(plan.diagnostics.is_empty());
|
||||
passive(&document, &before, &source);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn nested_move_that_would_relocate_fixed_header_is_rejected_but_mere_overlap_is_not_banned() {
|
||||
let (document, owner) = fixture(false);
|
||||
let p = document.project();
|
||||
let before = p.clone();
|
||||
let source = document.bundle().clone();
|
||||
let baseline = Scene::sequence(p, owner, owner);
|
||||
let nested = id(p, "nested");
|
||||
let fragment = id(p, "fragment");
|
||||
let requested = Candidate::from([(nested, 300.)]);
|
||||
// Actual70px action box has row-to-top offset-20: proposed footprint280..350.
|
||||
// The old envelope union would move frame/header top332 to260 while leaving
|
||||
// FrameStart332 and before-slot290. Reject before any such Scene is exposed.
|
||||
let original = named_box(&baseline, nested).rect;
|
||||
assert_eq!(
|
||||
(row(&baseline, nested), original.y, original.height),
|
||||
(477., 457., 70.)
|
||||
);
|
||||
let proposed_top = original.y + (300. - row(&baseline, nested));
|
||||
assert_eq!((proposed_top, proposed_top + original.height), (280., 350.));
|
||||
assert_eq!(
|
||||
Plan::build(p, owner, &baseline, &requested).unwrap_err(),
|
||||
PlanError::FixedFrameHeaderWouldMove { frame: fragment }
|
||||
);
|
||||
fixed_frame_metadata(&baseline, &Scene::sequence(p, owner, owner), fragment);
|
||||
// Overlap inside the existing frame does not itself move its top. This
|
||||
// remains admitted mechanical geometry, not a claim of usable overlap UX.
|
||||
let overlap = Plan::build(p, owner, &baseline, &Candidate::from([(nested, 380.)])).unwrap();
|
||||
let overlapping = render(p, owner, &overlap);
|
||||
assert_eq!(named_box(&overlapping, nested).rect.y, 360.);
|
||||
assert_eq!(overlapping.sequence_bounds[&id(p, "operand")], (338., 530.));
|
||||
fixed_frame_metadata(&baseline, &overlapping, fragment);
|
||||
let original_lifetimes = actual_lifetime_projection(p, owner, &baseline);
|
||||
let moved_lifetimes = actual_lifetime_projection(p, owner, &overlapping);
|
||||
assert_eq!(original_lifetimes.len(), 2);
|
||||
assert_eq!(moved_lifetimes.len(), 2);
|
||||
assert!(
|
||||
original_lifetimes
|
||||
.iter()
|
||||
.all(|lane| lane.uncertainties.is_empty())
|
||||
);
|
||||
assert!(
|
||||
moved_lifetimes
|
||||
.iter()
|
||||
.all(|lane| lane.uncertainties.is_empty()),
|
||||
"{moved_lifetimes:?}"
|
||||
);
|
||||
let receiver = id(p, "right");
|
||||
for scene in [&baseline, &overlapping] {
|
||||
assert_eq!(
|
||||
scene
|
||||
.lifecycle
|
||||
.alive_spans(receiver, owner, 530., scene.size.height - 20.)
|
||||
.iter()
|
||||
.map(|span| (span.start, span.end))
|
||||
.collect::<Vec<_>>(),
|
||||
vec![(530., 845.)]
|
||||
);
|
||||
}
|
||||
let call = id(p, "self_call");
|
||||
let bars = |scene: &Scene| {
|
||||
scene
|
||||
.boxes
|
||||
.iter()
|
||||
.filter(|item| item.id == call && item.title.is_empty())
|
||||
.map(|item| (item.rect, item.marker))
|
||||
.collect::<Vec<_>>()
|
||||
};
|
||||
assert!(!bars(&baseline).is_empty());
|
||||
assert_eq!(bars(&overlapping), bars(&baseline));
|
||||
passive(&document, &before, &source);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn nested353_scope_escape_is_named_and_rejected_before_missing_lifecycle_geometry_is_exposed() {
|
||||
let (document, owner) = fixture(false);
|
||||
let p = document.project();
|
||||
let before = p.clone();
|
||||
let source = document.bundle().clone();
|
||||
let baseline = Scene::sequence(p, owner, owner);
|
||||
let nested = id(p, "nested");
|
||||
let operand = id(p, "operand");
|
||||
let fragment = id(p, "fragment");
|
||||
let original = named_box(&baseline, nested).rect;
|
||||
assert_eq!(
|
||||
(original.y, baseline.sequence_bounds[&operand].0),
|
||||
(457., 435.)
|
||||
);
|
||||
let proposed_top = original.y + (353. - row(&baseline, nested));
|
||||
let proposed_scope_start = proposed_top - (original.y - baseline.sequence_bounds[&operand].0);
|
||||
assert_eq!(
|
||||
(proposed_top, proposed_scope_start, row(&baseline, fragment)),
|
||||
(333., 311., 332.)
|
||||
);
|
||||
assert_eq!(
|
||||
Plan::build(p, owner, &baseline, &Candidate::from([(nested, 353.)])).unwrap_err(),
|
||||
PlanError::OperandScopeOutsideEnclosingInterval { operand, fragment }
|
||||
);
|
||||
same_scene(&baseline, &Scene::sequence(p, owner, owner));
|
||||
passive(&document, &before, &source);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn lifecycle_anchor_below_actual_root_render_scope_is_rejected_before_scene_construction() {
|
||||
let (document, owner) = fixture(true);
|
||||
let p = document.project();
|
||||
let before = p.clone();
|
||||
let source = document.bundle().clone();
|
||||
let baseline = Scene::sequence(p, owner, owner);
|
||||
let create = id(p, "create_receiver");
|
||||
let provider = id(p, "provider");
|
||||
let requester = id(p, "requester");
|
||||
let root_life = baseline
|
||||
.lifecycle
|
||||
.alive_spans(requester, owner, 0., baseline.size.height);
|
||||
assert_eq!(
|
||||
root_life
|
||||
.iter()
|
||||
.map(|span| (span.start, span.end))
|
||||
.collect::<Vec<_>>(),
|
||||
vec![(85., 544.)]
|
||||
);
|
||||
for requested in [50., 84.] {
|
||||
assert_eq!(
|
||||
Plan::build(p, owner, &baseline, &Candidate::from([(create, requested)])).unwrap_err(),
|
||||
PlanError::LifecycleAnchorOutsideRenderScope {
|
||||
occurrence: create,
|
||||
scope: owner
|
||||
}
|
||||
);
|
||||
}
|
||||
// At the renderer's actual85 boundary the marker/lifetime remains present.
|
||||
// Source-order crossing is still diagnosed separately, not silently banned.
|
||||
let boundary = Plan::build(p, owner, &baseline, &Candidate::from([(create, 85.)])).unwrap();
|
||||
let moved = render(p, owner, &boundary);
|
||||
let x = moved.lanes[&provider];
|
||||
assert_eq!(row(&moved, create), 85.);
|
||||
assert_eq!(moved.lifecycle.marker_at(Point::new(x, 85.)), Some(create));
|
||||
let alive = moved
|
||||
.lifecycle
|
||||
.alive_spans(provider, owner, 0., moved.size.height);
|
||||
assert_eq!(
|
||||
alive
|
||||
.iter()
|
||||
.map(|span| (span.start, span.end))
|
||||
.collect::<Vec<_>>(),
|
||||
vec![(85., 427.)]
|
||||
);
|
||||
passive(&document, &before, &source);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn earlier_death_reaches_380_and_actual_lifetime_and_activation_clip_there() {
|
||||
let (document, owner) = fixture(true);
|
||||
let p = document.project();
|
||||
let before = p.clone();
|
||||
let source = document.bundle().clone();
|
||||
let baseline = Scene::sequence(p, owner, owner);
|
||||
let create = id(p, "create_receiver");
|
||||
let call = id(p, "service_call");
|
||||
let delete = id(p, "delete_receiver");
|
||||
let provider = id(p, "provider");
|
||||
assert_eq!(
|
||||
(
|
||||
row(&baseline, create),
|
||||
row(&baseline, call),
|
||||
row(&baseline, delete)
|
||||
),
|
||||
(243., 335., 427.)
|
||||
);
|
||||
let candidate = drag(&Candidate::new(), &baseline, delete, -47.);
|
||||
let plan = Plan::build(p, owner, &baseline, &candidate).unwrap();
|
||||
assert_eq!(plan.anchors[&delete].role, AnchorRole::MessageReceive);
|
||||
assert_eq!(
|
||||
plan.messages[&delete],
|
||||
MessageAnchors {
|
||||
send_y: 380.,
|
||||
receive_y: 380.
|
||||
}
|
||||
);
|
||||
let moved = render(p, owner, &plan);
|
||||
assert_eq!(row(&moved, delete), 380.);
|
||||
others_fixed(&baseline, &moved, delete);
|
||||
let spans = moved
|
||||
.lifecycle
|
||||
.alive_spans(provider, owner, 85., moved.size.height - 20.);
|
||||
assert_eq!(
|
||||
spans.iter().map(|s| (s.start, s.end)).collect::<Vec<_>>(),
|
||||
vec![(243., 380.)]
|
||||
);
|
||||
assert!(
|
||||
moved
|
||||
.lifecycle
|
||||
.alive_spans(provider, owner, 380., moved.size.height - 20.)
|
||||
.is_empty()
|
||||
);
|
||||
let x = moved.lanes[&provider];
|
||||
assert_eq!(moved.lifecycle.marker_at(Point::new(x, 380.)), Some(delete));
|
||||
assert_eq!(moved.lifecycle.marker_at(Point::new(x, 427.)), None);
|
||||
assert_eq!(moved.hit(Point::new(x, 380.)), Some(delete));
|
||||
let bars: Vec<_> = moved
|
||||
.boxes
|
||||
.iter()
|
||||
.filter(|b| b.id == call && b.title.is_empty())
|
||||
.collect();
|
||||
assert_eq!(bars.len(), 1);
|
||||
assert_eq!(
|
||||
bars[0].rect,
|
||||
Rectangle::new(Point::new(x - 4., 335.), Size::new(8., 45.))
|
||||
);
|
||||
assert_eq!(moved.open_calls, vec![Point::new(x + 12., 364.)]);
|
||||
assert!(plan.diagnostics.is_empty());
|
||||
passive(&document, &before, &source);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn self_call_has_explicit_send610_receive634_and_reply_stays728() {
|
||||
let (document, owner) = fixture(false);
|
||||
let p = document.project();
|
||||
let before = p.clone();
|
||||
let source = document.bundle().clone();
|
||||
let baseline = Scene::sequence(p, owner, owner);
|
||||
let call = id(p, "self_call");
|
||||
let reply = id(p, "self_reply");
|
||||
let candidate = drag(&Candidate::new(), &baseline, call, -26.);
|
||||
let plan = Plan::build(p, owner, &baseline, &candidate).unwrap();
|
||||
assert_eq!(
|
||||
plan.anchors[&call],
|
||||
Anchor {
|
||||
y: 610.,
|
||||
role: AnchorRole::MessageSend
|
||||
}
|
||||
);
|
||||
assert_eq!(
|
||||
plan.messages[&call],
|
||||
MessageAnchors {
|
||||
send_y: 610.,
|
||||
receive_y: 634.
|
||||
}
|
||||
);
|
||||
let moved = render(p, owner, &plan);
|
||||
assert_eq!(row(&moved, call), 610.);
|
||||
assert_eq!(row(&moved, reply), 728.);
|
||||
assert_eq!(
|
||||
line(&moved, call)
|
||||
.points
|
||||
.iter()
|
||||
.map(|p| p.y)
|
||||
.collect::<Vec<_>>(),
|
||||
vec![610., 610., 634., 634.]
|
||||
);
|
||||
assert_eq!(line(&moved, reply).points, line(&baseline, reply).points);
|
||||
others_fixed(&baseline, &moved, call);
|
||||
// Peer #21 owns the activation start/column contract. This assertion covers
|
||||
// actual message anchors, not the old row-based activation start defect.
|
||||
passive(&document, &before, &source);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn signed_zero_keeps_sparse_candidate_and_restoring_original_candidate_restores_actual_scene() {
|
||||
let (document, owner) = fixture(false);
|
||||
let p = document.project();
|
||||
let before = p.clone();
|
||||
let source = document.bundle().clone();
|
||||
let baseline = Scene::sequence(p, owner, owner);
|
||||
let second = id(p, "second");
|
||||
let original = Candidate::new();
|
||||
for zero in [0., -0.] {
|
||||
assert_eq!(drag(&original, &baseline, second, zero), original);
|
||||
}
|
||||
let changed = drag(&original, &baseline, second, -40.);
|
||||
let plan = Plan::build(p, owner, &baseline, &changed).unwrap();
|
||||
let frame = render(p, owner, &plan);
|
||||
for zero in [0., -0.] {
|
||||
let untouched = drag(&changed, &frame, second, zero);
|
||||
assert_eq!(untouched, changed);
|
||||
same_scene(
|
||||
&frame,
|
||||
&render(
|
||||
p,
|
||||
owner,
|
||||
&Plan::build(p, owner, &baseline, &untouched).unwrap(),
|
||||
),
|
||||
);
|
||||
}
|
||||
// This restores the exact sidecar candidate; it is not a production Undo
|
||||
// command or evidence of a layout source/REST persistence implementation.
|
||||
same_scene(
|
||||
&baseline,
|
||||
&render(
|
||||
p,
|
||||
owner,
|
||||
&Plan::build(p, owner, &baseline, &original).unwrap(),
|
||||
),
|
||||
);
|
||||
passive(&document, &before, &source);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn crossing_is_rendered_exactly_and_diagnosed_with_extents_covering_the_earlier_far_event() {
|
||||
let (document, owner) = fixture(false);
|
||||
let p = document.project();
|
||||
let before = p.clone();
|
||||
let source = document.bundle().clone();
|
||||
let baseline = Scene::sequence(p, owner, owner);
|
||||
let first = id(p, "first");
|
||||
let second = id(p, "second");
|
||||
let plan = Plan::build(p, owner, &baseline, &Candidate::from([(first, 1000.)])).unwrap();
|
||||
assert!(plan.diagnostics.contains(&Diagnostic::SourceOrderCrossing {
|
||||
scope: owner,
|
||||
before: first,
|
||||
after: second
|
||||
}));
|
||||
let moved = render(p, owner, &plan);
|
||||
assert_eq!((row(&moved, first), row(&moved, second)), (1000., 240.));
|
||||
assert_eq!(row(&moved, id(p, "self_reply")), 728.);
|
||||
others_fixed(&baseline, &moved, first);
|
||||
assert_eq!(moved.sequence_bounds[&owner].1, 1026.);
|
||||
assert_eq!(moved.size.height, 1113.);
|
||||
assert!(
|
||||
line(&moved, first)
|
||||
.points
|
||||
.iter()
|
||||
.all(|point| point.y < moved.size.height)
|
||||
);
|
||||
assert_eq!(&p.elements[&owner].steps().unwrap()[..2], &[first, second]);
|
||||
// This is a policy falsifier: mechanically exact coordinates do not prove
|
||||
// that out-of-order vertical notation is understandable or acceptable.
|
||||
passive(&document, &before, &source);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn nested_outlier_expands_enclosing_geometry_without_using_final_traversal_row_as_extent() {
|
||||
let (document, owner) = fixture(false);
|
||||
let p = document.project();
|
||||
let baseline = Scene::sequence(p, owner, owner);
|
||||
let nested = id(p, "nested");
|
||||
let fragment = id(p, "fragment");
|
||||
let following = id(p, "self_call");
|
||||
let plan = Plan::build(p, owner, &baseline, &Candidate::from([(nested, 1000.)])).unwrap();
|
||||
assert!(
|
||||
plan.diagnostics
|
||||
.contains(&Diagnostic::FrameExtendsPastFollowingAnchor {
|
||||
frame: fragment,
|
||||
following
|
||||
})
|
||||
);
|
||||
let moved = render(p, owner, &plan);
|
||||
assert_eq!(row(&moved, nested), 1000.);
|
||||
assert_eq!(named_box(&moved, nested).rect.y, 980.);
|
||||
let enclosing = named_box(&moved, fragment).rect;
|
||||
assert_eq!(enclosing.y + enclosing.height, 1070.);
|
||||
assert!(moved.sequence_bounds[&owner].1 >= 1070.);
|
||||
assert!(moved.size.height > 1070.);
|
||||
assert_eq!(row(&moved, following), 636.);
|
||||
others_fixed(&baseline, &moved, nested);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn unsupported_targets_and_lifetime_inversion_fail_explicitly_instead_of_silent_clamping() {
|
||||
let (document, owner) = fixture(true);
|
||||
let p = document.project();
|
||||
let baseline = Scene::sequence(p, owner, owner);
|
||||
let create = id(p, "create_receiver");
|
||||
let delete = id(p, "delete_receiver");
|
||||
assert_eq!(
|
||||
Plan::build(p, owner, &baseline, &Candidate::from([(delete, 200.)])).unwrap_err(),
|
||||
PlanError::LifetimeInversionNotSupported { create, delete }
|
||||
);
|
||||
assert_eq!(
|
||||
Plan::build(p, owner, &baseline, &Candidate::from([(delete, f32::NAN)])).unwrap_err(),
|
||||
PlanError::NonFinite(delete)
|
||||
);
|
||||
let edge = id(p, "service");
|
||||
assert_eq!(
|
||||
Plan::build(p, owner, &baseline, &Candidate::from([(edge, 200.)])).unwrap_err(),
|
||||
PlanError::UnknownAnchor(edge)
|
||||
);
|
||||
let (other, other_owner) = fixture(false);
|
||||
let fragment = id(other.project(), "fragment");
|
||||
let other_scene = Scene::sequence(other.project(), other_owner, other_owner);
|
||||
assert_eq!(
|
||||
Plan::build(
|
||||
other.project(),
|
||||
other_owner,
|
||||
&other_scene,
|
||||
&Candidate::from([(fragment, 300.)])
|
||||
)
|
||||
.unwrap_err(),
|
||||
PlanError::CompoundMoveNotImplemented(fragment)
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn complete_plan_scope_is_inactive_in_other_threads_and_restored_after_deliberate_panic() {
|
||||
let (document, owner) = fixture(false);
|
||||
let p = document.project();
|
||||
let baseline = Scene::sequence(p, owner, owner);
|
||||
let second = id(p, "second");
|
||||
let plan = Plan::build(p, owner, &baseline, &Candidate::from([(second, 200.)])).unwrap();
|
||||
let caught = std::panic::catch_unwind(|| {
|
||||
let _scope = Scope::install(&plan);
|
||||
assert_eq!(row(&Scene::sequence(p, owner, owner), second), 200.);
|
||||
std::thread::spawn(|| {
|
||||
let (document, owner) = fixture(false);
|
||||
let p = document.project();
|
||||
assert_eq!(
|
||||
row(&Scene::sequence(p, owner, owner), id(p, "second")),
|
||||
240.
|
||||
);
|
||||
})
|
||||
.join()
|
||||
.unwrap();
|
||||
panic!("deliberate complete-anchor scope unwind");
|
||||
});
|
||||
let payload = caught.expect_err("deliberate panic is required");
|
||||
assert_eq!(
|
||||
payload.downcast_ref::<&str>().copied(),
|
||||
Some("deliberate complete-anchor scope unwind")
|
||||
);
|
||||
same_scene(&baseline, &Scene::sequence(p, owner, owner));
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
diff --git a/crates/oa-desktop/src/behavior.rs b/crates/oa-desktop/src/behavior.rs
|
||||
index 3f9fd97..f1ef5b7 100644
|
||||
--- a/crates/oa-desktop/src/behavior.rs
|
||||
+++ b/crates/oa-desktop/src/behavior.rs
|
||||
@@ -1121,6 +1121,10 @@ fn in_machine(p: &Project, id: Id, machine: Id) -> bool {
|
||||
#[path = "../../../harness/experiments/behavior-layout-scene-20260912/mod.rs"]
|
||||
mod behavior_layout_scene_experiment;
|
||||
|
||||
+#[cfg(test)]
|
||||
+#[path = "../../../harness/experiments/behavior-anchor-plan-20260912/mod.rs"]
|
||||
+mod behavior_anchor_plan_experiment;
|
||||
+
|
||||
struct BoxItem {
|
||||
id: Id,
|
||||
rect: Rectangle,
|
||||
@@ -1332,6 +1336,8 @@ impl Scene {
|
||||
let mut y = if scenario { 148. } else { 120. };
|
||||
scene.occurrences(p, owner, scenario, &lane_x, &mut y, 0);
|
||||
scene.size.height = (y + 45.).max(210.);
|
||||
+ #[cfg(test)]
|
||||
+ behavior_anchor_plan_experiment::scene_extent(&mut scene);
|
||||
if scenario {
|
||||
scene.lifecycle = scenario_lifecycle::render::Rendering::new(
|
||||
p,
|
||||
@@ -1441,6 +1447,8 @@ impl Scene {
|
||||
}
|
||||
#[cfg(test)]
|
||||
behavior_layout_scene_experiment::resolve_row_anchor(*id, y);
|
||||
+ #[cfg(test)]
|
||||
+ behavior_anchor_plan_experiment::row_anchor(*id, y);
|
||||
if ordered {
|
||||
let slot = scenario::Slot {
|
||||
parent: owner,
|
||||
@@ -1465,6 +1473,8 @@ impl Scene {
|
||||
(*y - top).max(95.),
|
||||
),
|
||||
);
|
||||
+ #[cfg(test)]
|
||||
+ let rect = behavior_anchor_plan_experiment::frame_bounds(*id, rect);
|
||||
self.boxes.insert(
|
||||
0,
|
||||
BoxItem {
|
||||
@@ -1649,6 +1659,8 @@ impl Scene {
|
||||
}
|
||||
if ordered {
|
||||
self.sequence_bounds.insert(owner, (sequence_top, *y - 42.));
|
||||
+ #[cfg(test)]
|
||||
+ behavior_anchor_plan_experiment::scope_end(owner, y, &mut self.sequence_bounds);
|
||||
let slot = scenario::Slot {
|
||||
parent: owner,
|
||||
before: None,
|
||||
@@ -0,0 +1,8 @@
|
||||
check.log -text -whitespace
|
||||
check-receipt.json -text whitespace=cr-at-eol
|
||||
list.log -text -whitespace
|
||||
list-receipt.json -text whitespace=cr-at-eol
|
||||
tests.log -text -whitespace
|
||||
tests-receipt.json -text whitespace=cr-at-eol
|
||||
inputs-complete-before.json -text whitespace=cr-at-eol
|
||||
inputs-complete-after.json -text whitespace=cr-at-eol
|
||||
@@ -0,0 +1,31 @@
|
||||
# Actual Scene anchor experiments: Windows result
|
||||
|
||||
Tested source: **4b782a71fc011defd39331d3d6d5b73c1506275c**. The complete-anchor candidate and the older floor/lifetime experiment were exercised together against their actual parser, Document and Scene implementation. This result does not cover the later typed-activation renderer or saved-layout implementation.
|
||||
|
||||
| Gate | Result |
|
||||
| --- | --- |
|
||||
| `cargo check -p oa-desktop --bin arcadia-studio --tests --locked --offline` | Exit 0; test-only experiment wiring compiled. |
|
||||
| `cargo test -p oa-desktop --bin arcadia-studio --locked --offline -- behavior_layout_scene_experiment behavior_anchor_plan_experiment --list` | Exit 0; exactly 10 floor/lifetime and 13 complete-anchor tests. |
|
||||
| Same two filters with `--nocapture` instead of `--list` | **23 passed, 0 failed, 0 ignored**; exit 0; 895 other tests filtered out. |
|
||||
|
||||
[Check output](check.log), [check receipt](check-receipt.json), [listing](list.log), [listing receipt](list-receipt.json), [test output](tests.log) and [test receipt](tests-receipt.json) are preserved without line-ending conversion. The two panic messages are deliberate restoration probes: both enclosing tests passed after checking their scoped state restoration. They are not unhandled application crashes.
|
||||
|
||||
The check ran from 2026-09-13T00:14:13.0884576Z through 00:47:39.8146970Z. Listing/build ran from 00:48:09.7268903Z through 01:05:48.2819288Z. Execution ran from 01:06:35.7121760Z through 01:06:41.2500471Z; libtest reported 0.62 seconds for the selected tests. Compilation reported 32m49s for check and 17m31s for the test build on this heavily delayed Windows host. These timings are not a comparative performance or large-model responsiveness result.
|
||||
|
||||
The [before](inputs-complete-before.json) and [after](inputs-complete-after.json) manifests contain the same **574 paths, byte lengths and SHA-256 hashes**, with identical membership. The capture covers Cargo manifests/lockfile, crates, docs, examples, build files, harness fixtures, the existing textual-authoring experiment and both live layout experiment directories. Historical review snapshots are not compiled. [Artifact hashes](artifacts.json) identify the eight raw output/receipt/input files. Raw terminal blank lines are preserved; exact-path attributes exclude raw logs from whitespace rewriting and allow CRLF in receipts/manifests.
|
||||
|
||||
Environment: Windows, Rust/Cargo 1.98.1, `stable-x86_64-pc-windows-gnullvm`, configured LLVM-MinGW/UCRT clang linker, one Cargo build job, incremental compilation disabled, locked offline dependencies, unoptimized profile. The exact shell runner applies the project's local toolchain environment; the portable commands above select the same test groups.
|
||||
|
||||
## What the result establishes
|
||||
|
||||
The independently specified numeric cases in the [prepared candidate](../behavior-anchor-plan-20260912/README.md) passed: upward message and nested-anchor placement, fixed-header and enclosing-scope refusals, actual Create/Delete lifetime geometry, self-message send/receive offsets, earlier outlier coverage, sparse signed-zero restoration, source-order crossing diagnostics and scoped thread/panic isolation. The full semantic Project and SourceBundle/history invariants asserted by those cases passed.
|
||||
|
||||
The old floor test remains a passing **counterexample to that policy**: an upward requested position is still clamped by the floor. Its test passing does not mean the floor satisfies free editing. Likewise the complete plan's explicit unsupported positions and its drawable chronology/overlap diagnostics are retained limitations, not a selected product movement policy.
|
||||
|
||||
## Limits and next integration
|
||||
|
||||
No public layout payload, source syntax, REST command, drag transaction, box/route editing or native workflow is implemented by these test-only hooks. No full regression suite, strict lint or GUI acceptance of a new product behavior is claimed here. Linux remains user-paused.
|
||||
|
||||
Preserve this original result before combining with peer `aadc6396d39ff336d05381d58d545093d3f37a73`. That renderer stores typed activation segments separately from boxes. Its future union must compare the complete activation vector, adapt bar/cue and activation-edge oracles, and strengthen the self-call expectation to receive634 → reply-send728. Retain lifecycle clipping, explicit nonempty/count checks and exact source/history assertions. [Issue 21 comment 754](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/issues/21#issuecomment-754) records the pinned source comparison.
|
||||
|
||||
The selected storage direction and remaining gesture/label requirements are in the [reviewed scenario layout design](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/src/commit/75cb09dade2cf4b9a176b5e6159f43e2345d196e/harness/scenario-layout-design.md). This bounded experiment does not close full scenario editing or the application goal.
|
||||
@@ -0,0 +1,54 @@
|
||||
{
|
||||
"sourceCommit": "4b782a71fc011defd39331d3d6d5b73c1506275c",
|
||||
"count": 8,
|
||||
"files": [
|
||||
{
|
||||
"path": "check.log",
|
||||
"bytes": 472,
|
||||
"sha256": "7f9626500c6507b12e039f5383579ecdec07d0ebd69deda6c95d1c44addf57e2",
|
||||
"git_blob": "34d68b0d1bb6eb853b577386b97698cca8b8a5f8"
|
||||
},
|
||||
{
|
||||
"path": "check-receipt.json",
|
||||
"bytes": 401,
|
||||
"sha256": "e4c1208ba0d59f39355a3fe65c2d044cf153376bde32afed53f644ecbcb1d08c",
|
||||
"git_blob": "0a6847e62286928072fc9a8a6f56735bfb909617"
|
||||
},
|
||||
{
|
||||
"path": "list.log",
|
||||
"bytes": 3796,
|
||||
"sha256": "e9d34a70c74aab4aea075f42f15df715339241271912e74445d125823e1d2567",
|
||||
"git_blob": "84d775081a622a61237526328fac103f49e62b27"
|
||||
},
|
||||
{
|
||||
"path": "list-receipt.json",
|
||||
"bytes": 463,
|
||||
"sha256": "df58692a05de2dac138e1f626d9f5fc2e19224e777499024127726c9d3afce03",
|
||||
"git_blob": "b7050a3be5c7456de1b0f64c22db812f6f9fa441"
|
||||
},
|
||||
{
|
||||
"path": "tests.log",
|
||||
"bytes": 4274,
|
||||
"sha256": "83846d9ffe05f0f555307cc5e1ea7097a8d53894e2755683790c6cbca9b9eeda",
|
||||
"git_blob": "167ed1f1852f4237daa8cf6f83cc2deb6b85edc7"
|
||||
},
|
||||
{
|
||||
"path": "tests-receipt.json",
|
||||
"bytes": 472,
|
||||
"sha256": "6e22ee3e80f49b987373eb99c25fcd8f4fe8d4af8b7bf5873e003b225187b7bb",
|
||||
"git_blob": "db735f324df988d7bbb3036d6b95610a29a66114"
|
||||
},
|
||||
{
|
||||
"path": "inputs-complete-before.json",
|
||||
"bytes": 110608,
|
||||
"sha256": "d5f268ab403dcc22abb1991fe04c652123ff32240dff8e9e7010937282ad967d",
|
||||
"git_blob": "3fde735115dcccad217a8ffa8000fec670084d76"
|
||||
},
|
||||
{
|
||||
"path": "inputs-complete-after.json",
|
||||
"bytes": 110608,
|
||||
"sha256": "45f1fc4d805a8948a83fa77bb46d83f59cea64d4af5a1bcc78a9a7a0fbf758b1",
|
||||
"git_blob": "04f0ec9b138c400f404755aa5e604ae4605cc7a4"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"command": "cargo check -p oa-desktop --bin arcadia-studio --tests --locked --offline",
|
||||
"startUtc": "2026-09-13T00:14:13.0884576Z",
|
||||
"endUtc": "2026-09-13T00:47:39.8146970Z",
|
||||
"base": "4b782a71fc011defd39331d3d6d5b73c1506275c",
|
||||
"cargoExitCode": 0,
|
||||
"expectedOldTests": 10,
|
||||
"expectedNewTests": 13,
|
||||
"listedOldTests": null,
|
||||
"listedNewTests": null,
|
||||
"selectionValid": true
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
Compiling oa-core v0.2.0 (C:\Users\User\Documents\Git\ARCADIA-Studio\.local\behavior-anchor-plan-ytr83r-20260912\crates\oa-core)
|
||||
Compiling oa-desktop v0.2.0 (C:\Users\User\Documents\Git\ARCADIA-Studio\.local\behavior-anchor-plan-ytr83r-20260912\crates\oa-desktop)
|
||||
Compiling oa-server v0.2.0 (C:\Users\User\Documents\Git\ARCADIA-Studio\.local\behavior-anchor-plan-ytr83r-20260912\crates\oa-server)
|
||||
Finished `dev` profile [unoptimized] target(s) in 32m 49s
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"command": "cargo test -p oa-desktop --bin arcadia-studio --locked --offline -- behavior_layout_scene_experiment behavior_anchor_plan_experiment --list",
|
||||
"startUtc": "2026-09-13T00:48:09.7268903Z",
|
||||
"endUtc": "2026-09-13T01:05:48.2819288Z",
|
||||
"base": "4b782a71fc011defd39331d3d6d5b73c1506275c",
|
||||
"cargoExitCode": 0,
|
||||
"expectedOldTests": 10,
|
||||
"expectedNewTests": 13,
|
||||
"listedOldTests": 10,
|
||||
"listedNewTests": 13,
|
||||
"selectionValid": true
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
Compiling oa-core v0.2.0 (C:\Users\User\Documents\Git\ARCADIA-Studio\.local\behavior-anchor-plan-ytr83r-20260912\crates\oa-core)
|
||||
Compiling oa-server v0.2.0 (C:\Users\User\Documents\Git\ARCADIA-Studio\.local\behavior-anchor-plan-ytr83r-20260912\crates\oa-server)
|
||||
Compiling oa-desktop v0.2.0 (C:\Users\User\Documents\Git\ARCADIA-Studio\.local\behavior-anchor-plan-ytr83r-20260912\crates\oa-desktop)
|
||||
Finished `test` profile [unoptimized] target(s) in 17m 31s
|
||||
Running unittests src\main.rs (C:\Users\User\Documents\Git\ARCADIA-Studio\target\debug\deps\arcadia_studio-27db9628b266bf39.exe)
|
||||
behavior::behavior_anchor_plan_experiment::tests::complete_plan_scope_is_inactive_in_other_threads_and_restored_after_deliberate_panic: test
|
||||
behavior::behavior_anchor_plan_experiment::tests::complete_seed_plan_preserves_both_actual_scene_and_document_baselines: test
|
||||
behavior::behavior_anchor_plan_experiment::tests::crossing_is_rendered_exactly_and_diagnosed_with_extents_covering_the_earlier_far_event: test
|
||||
behavior::behavior_anchor_plan_experiment::tests::earlier_death_reaches_380_and_actual_lifetime_and_activation_clip_there: test
|
||||
behavior::behavior_anchor_plan_experiment::tests::lifecycle_anchor_below_actual_root_render_scope_is_rejected_before_scene_construction: test
|
||||
behavior::behavior_anchor_plan_experiment::tests::nested353_scope_escape_is_named_and_rejected_before_missing_lifecycle_geometry_is_exposed: test
|
||||
behavior::behavior_anchor_plan_experiment::tests::nested_move_that_would_relocate_fixed_header_is_rejected_but_mere_overlap_is_not_banned: test
|
||||
behavior::behavior_anchor_plan_experiment::tests::nested_outlier_expands_enclosing_geometry_without_using_final_traversal_row_as_extent: test
|
||||
behavior::behavior_anchor_plan_experiment::tests::nested_upward_anchor_reaches_457_without_moving_parent_or_followers: test
|
||||
behavior::behavior_anchor_plan_experiment::tests::self_call_has_explicit_send610_receive634_and_reply_stays728: test
|
||||
behavior::behavior_anchor_plan_experiment::tests::signed_zero_keeps_sparse_candidate_and_restoring_original_candidate_restores_actual_scene: test
|
||||
behavior::behavior_anchor_plan_experiment::tests::unsupported_targets_and_lifetime_inversion_fail_explicitly_instead_of_silent_clamping: test
|
||||
behavior::behavior_anchor_plan_experiment::tests::upward_second_delivery_reaches_200_and_all_other_occurrence_anchors_stay_fixed: test
|
||||
behavior::behavior_layout_scene_experiment::current_floor_is_an_explicit_counterexample_to_general_free_positioning: test
|
||||
behavior::behavior_layout_scene_experiment::lifetime::delayed_create_call_and_delete_have_real_lifetime_markers_and_exact_clipped_activation: test
|
||||
behavior::behavior_layout_scene_experiment::lifetime::moving_create_moves_real_lifetime_and_followers_without_changing_semantics_or_source: test
|
||||
behavior::behavior_layout_scene_experiment::lifetime::moving_delete_extends_only_to_actual_death_and_zero_motion_preserves_latent_lifetime_intent: test
|
||||
behavior::behavior_layout_scene_experiment::moved_repeat_drives_actual_scene_followers_frames_and_self_message_without_semantic_edits: test
|
||||
behavior::behavior_layout_scene_experiment::nested_anchor_grows_actual_fragment_and_self_call_keeps_its_receive_offset: test
|
||||
behavior::behavior_layout_scene_experiment::real_parser_roundtrip_and_baseline_scene_have_independent_expected_anchors: test
|
||||
behavior::behavior_layout_scene_experiment::scoped_hook_is_inactive_by_default_thread_local_and_restored_after_panic: test
|
||||
behavior::behavior_layout_scene_experiment::source_reorder_keeps_override_bound_to_occurrence_identity_and_does_not_write_back_projection: test
|
||||
behavior::behavior_layout_scene_experiment::zero_pointer_delta_preserves_latent_authored_intent_but_explicit_assignment_can_change_it: test
|
||||
|
||||
23 tests, 0 benchmarks
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"command": "cargo test -p oa-desktop --bin arcadia-studio --locked --offline -- behavior_layout_scene_experiment behavior_anchor_plan_experiment --nocapture",
|
||||
"startUtc": "2026-09-13T01:06:35.7121760Z",
|
||||
"endUtc": "2026-09-13T01:06:41.2500471Z",
|
||||
"base": "4b782a71fc011defd39331d3d6d5b73c1506275c",
|
||||
"cargoExitCode": 0,
|
||||
"expectedOldTests": 10,
|
||||
"expectedNewTests": 13,
|
||||
"listedOldTests": null,
|
||||
"listedNewTests": null,
|
||||
"selectionValid": true
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
Finished `test` profile [unoptimized] target(s) in 3.34s
|
||||
Running unittests src\main.rs (C:\Users\User\Documents\Git\ARCADIA-Studio\target\debug\deps\arcadia_studio-27db9628b266bf39.exe)
|
||||
|
||||
running 23 tests
|
||||
test behavior::behavior_anchor_plan_experiment::tests::complete_seed_plan_preserves_both_actual_scene_and_document_baselines ... ok
|
||||
|
||||
thread 'behavior::behavior_anchor_plan_experiment::tests::complete_plan_scope_is_inactive_in_other_threads_and_restored_after_deliberate_panic' (4328) panicked at crates\oa-desktop\src\..\..\..\harness\experiments\behavior-anchor-plan-20260912\tests.rs:719:9:
|
||||
deliberate complete-anchor scope unwind
|
||||
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
|
||||
test behavior::behavior_anchor_plan_experiment::tests::complete_plan_scope_is_inactive_in_other_threads_and_restored_after_deliberate_panic ... ok
|
||||
test behavior::behavior_anchor_plan_experiment::tests::crossing_is_rendered_exactly_and_diagnosed_with_extents_covering_the_earlier_far_event ... ok
|
||||
test behavior::behavior_anchor_plan_experiment::tests::earlier_death_reaches_380_and_actual_lifetime_and_activation_clip_there ... ok
|
||||
test behavior::behavior_anchor_plan_experiment::tests::lifecycle_anchor_below_actual_root_render_scope_is_rejected_before_scene_construction ... ok
|
||||
test behavior::behavior_anchor_plan_experiment::tests::nested353_scope_escape_is_named_and_rejected_before_missing_lifecycle_geometry_is_exposed ... ok
|
||||
test behavior::behavior_anchor_plan_experiment::tests::nested_move_that_would_relocate_fixed_header_is_rejected_but_mere_overlap_is_not_banned ... ok
|
||||
test behavior::behavior_anchor_plan_experiment::tests::nested_outlier_expands_enclosing_geometry_without_using_final_traversal_row_as_extent ... ok
|
||||
test behavior::behavior_anchor_plan_experiment::tests::self_call_has_explicit_send610_receive634_and_reply_stays728 ... ok
|
||||
test behavior::behavior_anchor_plan_experiment::tests::nested_upward_anchor_reaches_457_without_moving_parent_or_followers ... ok
|
||||
test behavior::behavior_anchor_plan_experiment::tests::unsupported_targets_and_lifetime_inversion_fail_explicitly_instead_of_silent_clamping ... ok
|
||||
test behavior::behavior_anchor_plan_experiment::tests::signed_zero_keeps_sparse_candidate_and_restoring_original_candidate_restores_actual_scene ... ok
|
||||
test behavior::behavior_layout_scene_experiment::current_floor_is_an_explicit_counterexample_to_general_free_positioning ... ok
|
||||
test behavior::behavior_anchor_plan_experiment::tests::upward_second_delivery_reaches_200_and_all_other_occurrence_anchors_stay_fixed ... ok
|
||||
test behavior::behavior_layout_scene_experiment::lifetime::moving_create_moves_real_lifetime_and_followers_without_changing_semantics_or_source ... ok
|
||||
test behavior::behavior_layout_scene_experiment::lifetime::delayed_create_call_and_delete_have_real_lifetime_markers_and_exact_clipped_activation ... ok
|
||||
test behavior::behavior_layout_scene_experiment::moved_repeat_drives_actual_scene_followers_frames_and_self_message_without_semantic_edits ... ok
|
||||
test behavior::behavior_layout_scene_experiment::lifetime::moving_delete_extends_only_to_actual_death_and_zero_motion_preserves_latent_lifetime_intent ... ok
|
||||
test behavior::behavior_layout_scene_experiment::nested_anchor_grows_actual_fragment_and_self_call_keeps_its_receive_offset ... ok
|
||||
test behavior::behavior_layout_scene_experiment::real_parser_roundtrip_and_baseline_scene_have_independent_expected_anchors ... ok
|
||||
test behavior::behavior_layout_scene_experiment::source_reorder_keeps_override_bound_to_occurrence_identity_and_does_not_write_back_projection ... ok
|
||||
test behavior::behavior_layout_scene_experiment::zero_pointer_delta_preserves_latent_authored_intent_but_explicit_assignment_can_change_it ... ok
|
||||
|
||||
thread 'behavior::behavior_layout_scene_experiment::scoped_hook_is_inactive_by_default_thread_local_and_restored_after_panic' (856) panicked at crates\oa-desktop\src\..\..\..\harness\experiments\behavior-layout-scene-20260912\mod.rs:336:9:
|
||||
exercise scoped restoration
|
||||
test behavior::behavior_layout_scene_experiment::scoped_hook_is_inactive_by_default_thread_local_and_restored_after_panic ... ok
|
||||
|
||||
test result: ok. 23 passed; 0 failed; 0 ignored; 0 measured; 895 filtered out; finished in 0.62s
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
attempt1/** -text
|
||||
attempt2/** -text
|
||||
attempt1/harness/experiments/behavior-anchor-plan-20260912/wiring.patch -whitespace
|
||||
attempt2/harness/experiments/behavior-anchor-plan-20260912/wiring.patch -whitespace
|
||||
@@ -0,0 +1,14 @@
|
||||
# Complete-anchor plan: independent static findings
|
||||
|
||||
The [original five-file candidate and hashes](attempt1/manifest.json), based on66a1f1690f778c8814bfefff7f46fe7f6bbe520e, are preserved exactly. It was not compiled or executed. These are source-verified counterexamples, not recorded runtime failures. Two reviewers independently examined the first; the independent reviewer also traced the second into actual lifecycle projection.
|
||||
|
||||
1. In the original named scenario fixture, setting the nested action anchor to300 moves its box to280..350. Frame coverage expands the fragment from top332 to260 while its FrameStart anchor and Scene row remain332; title and header hit geometry follow260..298, and the before-slot remains290. The existing rows-only unchanged-anchor check cannot detect this split. A bounded repair must keep the frame header invariant or reject this unsupported operation explicitly until a compound/header policy is defined.
|
||||
2. In the lifetime fixture, setting Create to50 passes the candidate admission checks, but the actual lifecycle renderer starts the root span at85. Its projection rejects the birth as missing geometry; the message and row can remain50 while the real birth marker disappears. Admission must account for the actual supported scope or expose an explicit unsupported result, rather than claiming preserved lifecycle geometry.
|
||||
|
||||
Feasible upward movement inside the existing headers/lifetimes remains required by the experiment. Neither finding authorizes turning preferred spacing into a permanent user movement restriction. The corrected candidate, compiler results and production-policy decision remain separate. No native, persistence or Undo acceptance is claimed.
|
||||
|
||||
## Additional scope-boundary finding before execution
|
||||
|
||||
The [two-fix candidate](attempt2/manifest.json) remains uncompiled. Its author found that the admitted nested353 overlap case can expand an operand scope upward to311, before the enclosing fragment starts332. The existing lifecycle projector rejects that scope as missing geometry. Earlier review of the two guards did not establish this ancestor relationship. The next bounded bridge must reject incompatible scope intervals explicitly and test the actual lifecycle diagnostics; overlapping header geometry alone must not become a global spacing ban. These accumulating dependencies show that complete anchors require a coherent scope/lifecycle contract. The legacy renderer is not demonstrated to support arbitrary free placement by changing its cursor.
|
||||
|
||||
The three exact wiring.patch artifacts retain CRLF and patch-context blank lines. Git whitespace checking is disabled only for those raw patch paths; their recorded bytes are preserved. All other changed source and report paths remain checked.
|
||||
@@ -0,0 +1,71 @@
|
||||
# Complete anchor plan into actual Scene — pending execution
|
||||
|
||||
Prepared 2026-09-12 in isolated branch `codex/behavior-anchor-plan-ytr83r-20260912`, base `66a1f1690f778c8814bfefff7f46fe7f6bbe520e`. Parent owns compilation and publication. **Not compiled, executed, staged or committed.** Only test-only additions to `crates/oa-desktop/src/behavior.rs` and this new directory were authored. The existing floor experiment and its fixtures are unchanged. All new production-file statements are guarded by `cfg(test)`; normal production rendering is unchanged.
|
||||
|
||||
## Bounded question
|
||||
|
||||
Can a complete ephemeral anchor plan drive the actual Scene at exact requested y coordinates without the old running-cursor floor, preserve unspecified anchors and the entire Document, and maintain covered extents and real lifecycle derivation? This isolates the integration seam from the unresolved choice of a product movement policy.
|
||||
|
||||
The old floor candidate imposed existing seed increments on every requested row. This candidate seeds missing anchors from the actual baseline Scene, then replaces explicitly requested coordinates exactly. It does not impose sequence-order constraints or overlap spacing. Source-order crossings are returned as diagnostic data, not silently clamped or converted into semantic Reorder. This is a mechanical projection experiment, not evidence that crossed vertical ordering is acceptable UX.
|
||||
|
||||
`Candidate` is an external map keyed by occurrence UUID. `Plan` is a complete resolved input for the currently visible Scene, including operand headers missing from the ordinary rows map. It contains row roles, derived message send/receive y values, frame bounds, sequence extents and canvas height. It is not a model, parser or REST payload.
|
||||
|
||||
## Actual code boundary and wiring
|
||||
|
||||
`wiring.patch` records the exact production-file delta from the base commit. The five new cfg(test) integration points are:
|
||||
|
||||
1. Include this module as a private child of `behavior`, next to the unchanged floor module.
|
||||
2. Immediately after the old floor hook, consume the complete plan's exact occurrence anchor, before Scene records rows and constructs the occurrence's existing geometry.
|
||||
3. Before inserting an existing fragment BoxItem, use the plan's frame bounds. Existing fragment paint and label code remain in place.
|
||||
4. Immediately after recording a sequence's bounds, substitute planned bounds and update the existing final insertion axis. An earlier event placed lower than the last event cannot truncate the scope merely because traversal ends earlier.
|
||||
5. Before current lifecycle and activation construction, substitute the covered canvas height. Current `Rendering::new`, message alignment, activation generation and drawing remain responsible for their actual geometry.
|
||||
|
||||
The plan is scoped per thread, inactive by default, restored by Drop during unwinding, and has a deliberate-panic test requiring the exact sentinel payload. Other tests on other threads cannot consume its plan. The original floor hooks remain operational when their own scope is active; the new plan is otherwise absent.
|
||||
|
||||
Footprints are measured from the actual baseline named boxes, message polylines and label bounds, translated by requested row deltas. This avoids cloning the renderer's line or lifecycle algorithms. Empty activation bars are excluded because the real renderer derives those later. Frames conservatively preserve seed extents and expand when covered geometry escapes; growth adds an explicitly experimental 20px presentation margin. Sequence bounds preserve seed extents and measured edge padding while expanding to cover outliers; canvas height uses the original scope-to-canvas margin. Neither these margins nor nonshrinking seed extents are adopted user requirements. This is not a general container-resize solver.
|
||||
|
||||
## Independently expected checks
|
||||
|
||||
Ten new test functions use the existing hand-authored fixtures through the actual parser and Document bundle loader. Numeric expectations below are independently stated rather than generated from the new planner:
|
||||
|
||||
| Case | Expected actual Scene result |
|
||||
| --- | --- |
|
||||
| Empty complete plan, both fixtures | Same rows, named boxes and marker kinds, lines and labels, scopes, slots, lifecycle, open calls and size as the unmodified baseline Scene |
|
||||
| Second delivery240→200 | First148; second200; every other occurrence anchor unchanged; both second-message endpoints200; repeated exchange references retain different occurrence IDs |
|
||||
| Nested action477→457 | Box top437, height70; original fragment top332/height240 retained; operand bounds and all other anchors unchanged |
|
||||
| Death427→380 | Create243 and call335 stay fixed; real alive span243..380; actual bar335..380; death marker/hit moves to380; unresolved-call cue remains, no Reply is invented |
|
||||
| Self-call636→610 | Actual send610/receive634, using the current24 offset; reply728 unchanged; MessageSend role distinguished from the lifecycle MessageReceive role |
|
||||
| Signed zero and candidate restoration | Both0 and-0 return the exact original sparse candidate; no first-edit materialization; restoring the original candidate restores Scene geometry |
|
||||
| First event→1000, last remains728 | First1000/second240, SourceOrderCrossing diagnostic, source order unchanged; root scope end1026 and height1113 cover the earlier outlier rather than the traversal tail |
|
||||
| Nested action→1000 | Box top980/bottom1050; enclosing frame bottom1070; actual root scope/canvas cover it; following self-call636 remains fixed and overlap is diagnosed |
|
||||
| Invalid/unsupported input | Unknown anchor, nonfinite y, compound frame movement and same-scope inverted birth/death fail explicitly |
|
||||
| Scoped execution | Another thread sees baseline geometry; a deliberate panic restores the baseline scope |
|
||||
|
||||
The primary cases compare the entire Project and original SourceBundle and require the real Document to remain clean with no Undo/Redo entry. Canonical parser roundtrip is used, but it covers only the semantic Project: layout stays external. Candidate restoration is a reversible-sidecar check, **not** a production Undo implementation. No command has been added to Document.
|
||||
|
||||
## Explicit limitations and falsifiers
|
||||
|
||||
- Crossing source-ordered events is deliberately drawable with diagnostics. That proves removal of the mechanical floor, not adoption of unrestricted vertical notation. The crossing output remains an independent product-policy falsifier.
|
||||
- An expanded frame can overlap the next event. Its diagnostic preserves that evidence instead of shifting the next event implicitly. The experiment does not establish a frame/header constraint policy or all feasible layouts.
|
||||
- The same-scope creation-after-deletion case returns `LifetimeInversionNotSupported` before rendering. Current lifecycle intervals cannot truthfully depict that inversion without another representation policy. This is an experimental bridge limitation, not permission to reject semantically valid models or a user-approved global movement rule. Cross-operand lifecycle combinations remain unproven.
|
||||
- Compound frame/operand movement, box resizing, horizontal layout, independent send/receive movement, route editing, drag transaction stamps, pointer capture, dirty-source recovery, persistence, REST and native UI are not implemented.
|
||||
- Self-call send and receive roles are explicit, but the current activation engine still owns its existing row-based behavior. Peer #21's typed activation integration must consume the actual receive anchor and retain the existing lifetime clipping. These tests do not silently bless the old activation-start discrepancy.
|
||||
- Scope/containment walking is deliberately straightforward and not a large-model performance implementation. There is no responsiveness claim.
|
||||
- Some self-message fixture exchanges are unassigned because the current global relation model forbids self edges. The existing fixture's known incomplete-model warnings remain; tests reject semantic errors.
|
||||
|
||||
No storage or parser design should be adopted from this adapter. Coordinate any eventual payload with prospective #7, whose required addressing must preserve diagram/owner/occurrence identity and explicit anchor roles. Coordinate inverse resize with #16 and typed activation/lifetime union with #21 before broad UI work.
|
||||
|
||||
Parent reports [peer #21 comment716](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/issues/21#issuecomment-716), posted2026-09-12 23:06UTC: Codex-956atf owns an isolated typed-activation/lifecycle source union. Its intended order is finalized rows/height, lifecycle construction and Create/Delete alignment, then typed Call/Reply attachment, with receiver/scope clipping, logical reply timing distinct from clipped geometry, no resurrection after Delete, and unanswered-call cues preserved. That WIP is not integrated here. Retain the explicit send/receive seam and review the future union against these fixtures; this paragraph records a coordination dependency, not verified acceptance of peer code.
|
||||
|
||||
## Reproduction and handoff
|
||||
|
||||
At the parent's chosen compiler checkpoint, use the configured Windows Rust/linker environment:
|
||||
|
||||
```powershell
|
||||
cargo test -p oa-desktop behavior_anchor_plan_experiment --locked --offline -- --nocapture
|
||||
cargo test -p oa-desktop behavior_layout_scene_experiment --locked --offline -- --nocapture
|
||||
```
|
||||
|
||||
The first filter must execute ten new tests; the second must retain the ten existing floor/lifetime tests. Preserve compile failures, parser failures, numeric mismatches and diagnostics as results. Do not claim success from a zero-test filtered run or from compiling only production targets. An intentional panic should be followed by its restoration test passing; another panic payload is a failure.
|
||||
|
||||
Record exact compiled commit/uncommitted patch, commands and results before publication. Source hashes supplied with the handoff identify prepared bytes, not tested code. Root should publish the complete directory and exact behavior.rs delta so remote peers can reproduce it; workspace-local paths are not remote handoffs.
|
||||
@@ -0,0 +1,270 @@
|
||||
//! Experimental complete anchor input for the actual Scene, cfg(test) only.
|
||||
//! No persistence schema and no replacement line/lifecycle/activation renderer.
|
||||
use super::*;
|
||||
use std::cell::RefCell;
|
||||
|
||||
mod tests;
|
||||
|
||||
type Candidate = BTreeMap<Id, f32>;
|
||||
|
||||
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
||||
enum AnchorRole {
|
||||
MessageSend,
|
||||
MessageReceive,
|
||||
Observation,
|
||||
FrameStart,
|
||||
OperandStart,
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Debug, PartialEq)]
|
||||
struct Anchor {
|
||||
y: f32,
|
||||
role: AnchorRole,
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Debug, PartialEq)]
|
||||
struct MessageAnchors {
|
||||
send_y: f32,
|
||||
receive_y: f32,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, Eq)]
|
||||
enum Diagnostic {
|
||||
SourceOrderCrossing { scope: Id, before: Id, after: Id },
|
||||
FrameExtendsPastFollowingAnchor { frame: Id, following: Id },
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, Eq)]
|
||||
enum PlanError {
|
||||
UnknownAnchor(Id),
|
||||
NonFinite(Id),
|
||||
CompoundMoveNotImplemented(Id),
|
||||
LifetimeInversionNotSupported { create: Id, delete: Id },
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
struct Plan {
|
||||
anchors: BTreeMap<Id, Anchor>,
|
||||
messages: BTreeMap<Id, MessageAnchors>,
|
||||
frames: BTreeMap<Id, Rectangle>,
|
||||
scopes: BTreeMap<Id, (f32, f32)>,
|
||||
height: f32,
|
||||
diagnostics: Vec<Diagnostic>,
|
||||
}
|
||||
|
||||
fn occurrence(p: &Project, id: Id) -> Option<&OccurrenceBody> {
|
||||
match p.elements.get(&id)?.shared()? {
|
||||
SharedBody::Occurrence { body, .. } => Some(body),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
fn role(body: &OccurrenceBody) -> AnchorRole {
|
||||
match body {
|
||||
OccurrenceBody::Exchange { message_kind: MessageKind::Create | MessageKind::Delete, .. } => AnchorRole::MessageReceive,
|
||||
OccurrenceBody::Exchange { .. } => AnchorRole::MessageSend,
|
||||
OccurrenceBody::Fragment { .. } => AnchorRole::FrameStart,
|
||||
OccurrenceBody::Branch { .. } => AnchorRole::OperandStart,
|
||||
_ => AnchorRole::Observation,
|
||||
}
|
||||
}
|
||||
|
||||
fn inside(p: &Project, id: Id, owner: Id) -> bool {
|
||||
let mut current = p.elements.get(&id).and_then(|e| e.parent);
|
||||
for _ in 0..p.elements.len() {
|
||||
match current {
|
||||
Some(parent) if parent == owner => return true,
|
||||
Some(parent) => current = p.elements.get(&parent).and_then(|e| e.parent),
|
||||
None => return false,
|
||||
}
|
||||
}
|
||||
false
|
||||
}
|
||||
|
||||
fn depth(p: &Project, id: Id) -> usize {
|
||||
let mut current = p.elements.get(&id).and_then(|e| e.parent);
|
||||
let mut result = 0;
|
||||
while let Some(parent) = current {
|
||||
result += 1;
|
||||
if result > p.elements.len() { break; }
|
||||
current = p.elements.get(&parent).and_then(|e| e.parent);
|
||||
}
|
||||
result
|
||||
}
|
||||
|
||||
fn union(a: Rectangle, b: Rectangle) -> Rectangle {
|
||||
let x = a.x.min(b.x);
|
||||
let y = a.y.min(b.y);
|
||||
Rectangle::new(Point::new(x, y), Size::new(
|
||||
(a.x + a.width).max(b.x + b.width) - x,
|
||||
(a.y + a.height).max(b.y + b.height) - y,
|
||||
))
|
||||
}
|
||||
|
||||
/// Actual named shapes/message paths supply footprint measurements; activation
|
||||
/// bars are intentionally excluded because current Scene derives them later.
|
||||
fn footprints(scene: &Scene, anchors: &BTreeMap<Id, Anchor>, seed: &BTreeMap<Id, Anchor>) -> BTreeMap<Id, Rectangle> {
|
||||
let mut out = BTreeMap::new();
|
||||
for item in scene.boxes.iter().filter(|item| !item.title.is_empty()) {
|
||||
let Some(anchor) = anchors.get(&item.id) else { continue; };
|
||||
let mut rect = item.rect;
|
||||
rect.y += anchor.y - seed[&item.id].y;
|
||||
out.insert(item.id, rect);
|
||||
}
|
||||
for line in &scene.lines {
|
||||
let Some(anchor) = anchors.get(&line.id) else { continue; };
|
||||
let delta = anchor.y - seed[&line.id].y;
|
||||
let mut rect = line.label_bounds();
|
||||
rect.y += delta;
|
||||
for point in &line.points {
|
||||
rect = union(rect, Rectangle::new(Point::new(point.x, point.y + delta), Size::ZERO));
|
||||
}
|
||||
out.entry(line.id).and_modify(|old| *old = union(*old, rect)).or_insert(rect);
|
||||
}
|
||||
out
|
||||
}
|
||||
|
||||
fn covered_bounds(p: &Project, owner: Id, footprints: &BTreeMap<Id, Rectangle>) -> Option<Rectangle> {
|
||||
footprints.iter().filter(|(id, _)| inside(p, **id, owner))
|
||||
.map(|(_, rect)| *rect).reduce(union)
|
||||
}
|
||||
|
||||
impl Plan {
|
||||
fn build(p: &Project, owner: Id, baseline: &Scene, desired: &Candidate) -> Result<Self, PlanError> {
|
||||
let mut seed: BTreeMap<_, _> = baseline.rows.iter().map(|(id, (_, y))| {
|
||||
(*id, Anchor { y: *y, role: role(occurrence(p, *id).expect("Scene occurrence")) })
|
||||
}).collect();
|
||||
// Operand headers are real Scene boxes, but are not entries in rows.
|
||||
for item in &baseline.boxes {
|
||||
if matches!(occurrence(p, item.id), Some(OccurrenceBody::Branch { .. })) {
|
||||
seed.insert(item.id, Anchor { y: item.rect.y, role: AnchorRole::OperandStart });
|
||||
}
|
||||
}
|
||||
let mut anchors = seed.clone();
|
||||
for (&id, &y) in desired {
|
||||
let anchor = anchors.get_mut(&id).ok_or(PlanError::UnknownAnchor(id))?;
|
||||
if !y.is_finite() { return Err(PlanError::NonFinite(id)); }
|
||||
if matches!(anchor.role, AnchorRole::FrameStart | AnchorRole::OperandStart) && y != anchor.y {
|
||||
return Err(PlanError::CompoundMoveNotImplemented(id));
|
||||
}
|
||||
anchor.y = y;
|
||||
}
|
||||
let mut messages = BTreeMap::new();
|
||||
for line in &baseline.lines {
|
||||
if let (Some(anchor), Some(first), Some(last)) = (anchors.get(&line.id), line.points.first(), line.points.last()) {
|
||||
let delta = anchor.y - seed[&line.id].y;
|
||||
messages.insert(line.id, MessageAnchors { send_y: first.y + delta, receive_y: last.y + delta });
|
||||
}
|
||||
}
|
||||
// The current lifecycle bridge needs positive birth/death intervals.
|
||||
// This is an explicit unsupported crossing, not a new semantic rule.
|
||||
for (&create, message) in &messages {
|
||||
if let Some(OccurrenceBody::Exchange { message_kind: MessageKind::Create, receiver: Some(lane), .. }) = occurrence(p, create) {
|
||||
for (&delete, finish) in &messages {
|
||||
if p.elements[&create].parent == p.elements[&delete].parent
|
||||
&& matches!(occurrence(p, delete), Some(OccurrenceBody::Exchange { message_kind: MessageKind::Delete, receiver: Some(other), .. }) if other == lane)
|
||||
&& message.receive_y > finish.receive_y {
|
||||
return Err(PlanError::LifetimeInversionNotSupported { create, delete });
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
let old_footprints = footprints(baseline, &seed, &seed);
|
||||
let mut drawn = footprints(baseline, &anchors, &seed);
|
||||
let mut frames = BTreeMap::new();
|
||||
let mut containers: Vec<_> = seed.keys().copied()
|
||||
.filter(|id| matches!(occurrence(p, *id), Some(OccurrenceBody::Fragment { .. }))).collect();
|
||||
containers.sort_by_key(|id| std::cmp::Reverse(depth(p, *id)));
|
||||
for id in containers {
|
||||
let original = old_footprints[&id];
|
||||
let mut rect = original;
|
||||
if let Some(covered) = covered_bounds(p, id, &drawn) {
|
||||
// Keep seed extents where possible; 20px growth padding is an
|
||||
// explicit experimental presentation preference, not semantics.
|
||||
if covered.y < rect.y { rect = union(rect, Rectangle::new(Point::new(covered.x, covered.y - 20.), Size::new(covered.width, covered.height + 20.))); }
|
||||
if covered.y + covered.height > rect.y + rect.height {
|
||||
rect.height = covered.y + covered.height + 20. - rect.y;
|
||||
}
|
||||
}
|
||||
frames.insert(id, rect);
|
||||
drawn.insert(id, rect);
|
||||
}
|
||||
let mut scopes = baseline.sequence_bounds.clone();
|
||||
for (&scope, bounds) in &mut scopes {
|
||||
if let (Some(old), Some(new)) = (covered_bounds(p, scope, &old_footprints), covered_bounds(p, scope, &drawn)) {
|
||||
let top_padding = (old.y - bounds.0).max(0.);
|
||||
let bottom_padding = (bounds.1 - old.y - old.height).max(0.);
|
||||
if new.y < bounds.0 { bounds.0 = new.y - top_padding; }
|
||||
bounds.1 = bounds.1.max(new.y + new.height + bottom_padding);
|
||||
}
|
||||
}
|
||||
let tail = baseline.size.height - baseline.sequence_bounds[&owner].1;
|
||||
let height = baseline.size.height.max(scopes[&owner].1 + tail);
|
||||
let mut diagnostics = Vec::new();
|
||||
for element in p.elements.values().filter(|e| e.id == owner || inside(p, e.id, owner)) {
|
||||
if let Some(steps) = element.steps() {
|
||||
for pair in steps.windows(2) {
|
||||
if let (Some(a), Some(b)) = (anchors.get(&pair[0]), anchors.get(&pair[1])) {
|
||||
if a.y > b.y { diagnostics.push(Diagnostic::SourceOrderCrossing { scope: element.id, before: pair[0], after: pair[1] }); }
|
||||
if let Some(frame) = frames.get(&pair[0]) {
|
||||
if frame.y + frame.height > b.y { diagnostics.push(Diagnostic::FrameExtendsPastFollowingAnchor { frame: pair[0], following: pair[1] }); }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Ok(Self { anchors, messages, frames, scopes, height, diagnostics })
|
||||
}
|
||||
}
|
||||
|
||||
thread_local! {
|
||||
static PLAN: RefCell<Option<Plan>> = const { RefCell::new(None) };
|
||||
}
|
||||
|
||||
struct Scope(Option<Plan>);
|
||||
impl Scope {
|
||||
fn install(plan: &Plan) -> Self { Self(PLAN.with(|slot| slot.replace(Some(plan.clone())))) }
|
||||
}
|
||||
impl Drop for Scope {
|
||||
fn drop(&mut self) { PLAN.with(|slot| { slot.replace(self.0.take()); }); }
|
||||
}
|
||||
|
||||
pub(super) fn row_anchor(id: Id, y: &mut f32) {
|
||||
PLAN.with(|slot| {
|
||||
if let Some(plan) = slot.borrow().as_ref() {
|
||||
*y = plan.anchors.get(&id).expect("complete Scene anchor plan").y;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
pub(super) fn frame_bounds(id: Id, fallback: Rectangle) -> Rectangle {
|
||||
PLAN.with(|slot| slot.borrow().as_ref().map_or(fallback, |plan| plan.frames[&id]))
|
||||
}
|
||||
|
||||
pub(super) fn scope_end(owner: Id, y: &mut f32, bounds: &mut BTreeMap<Id, (f32, f32)>) {
|
||||
PLAN.with(|slot| {
|
||||
if let Some(plan) = slot.borrow().as_ref() {
|
||||
bounds.insert(owner, plan.scopes[&owner]);
|
||||
*y = plan.scopes[&owner].1 + 42.; // Existing insertion-axis offset.
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
pub(super) fn scene_extent(scene: &mut Scene) {
|
||||
PLAN.with(|slot| {
|
||||
if let Some(plan) = slot.borrow().as_ref() { scene.size.height = plan.height; }
|
||||
});
|
||||
}
|
||||
|
||||
fn render(p: &Project, owner: Id, plan: &Plan) -> Scene {
|
||||
let _scope = Scope::install(plan);
|
||||
Scene::sequence(p, owner, owner)
|
||||
}
|
||||
|
||||
fn drag(original: &Candidate, frame: &Scene, target: Id, delta_y: f32) -> Candidate {
|
||||
assert!(delta_y.is_finite());
|
||||
if delta_y == 0. { return original.clone(); }
|
||||
let mut result = original.clone();
|
||||
result.insert(target, frame.rows[&target].1 + delta_y);
|
||||
result
|
||||
}
|
||||
@@ -0,0 +1,276 @@
|
||||
use super::*;
|
||||
use crate::document::Document;
|
||||
use oa_core::{language, source_project::{ProjectLimits, SourceBundle}, validation};
|
||||
|
||||
fn id(p: &Project, alias: &str) -> Id {
|
||||
p.identities().into_iter().find(|(_, name)| *name == alias).unwrap().0
|
||||
}
|
||||
|
||||
fn fixture(lifetime: bool) -> (Document, Id) {
|
||||
let (name, input, owner) = if lifetime {
|
||||
("lifetime.arcadia", include_str!("../behavior-layout-scene-20260912/lifetime.arcadia"), "lifetime_conversation")
|
||||
} else {
|
||||
("fixture.arcadia", include_str!("../behavior-layout-scene-20260912/fixture.arcadia"), "conversation")
|
||||
};
|
||||
let p = language::parse(input).expect("existing real Arcadia fixture");
|
||||
let errors: Vec<_> = validation::validate(&p).into_iter()
|
||||
.filter(|issue| issue.severity == validation::Severity::Error).collect();
|
||||
assert!(errors.is_empty(), "{errors:?}");
|
||||
let bundle = SourceBundle { entry: name.into(), files: BTreeMap::from([(name.into(), input.into())]) };
|
||||
let document = Document::from_bundle(bundle, ProjectLimits::default()).unwrap();
|
||||
assert_eq!(document.project(), &p);
|
||||
assert_eq!(language::parse(&language::format(&p)).unwrap(), p);
|
||||
let owner = id(&p, owner);
|
||||
(document, owner)
|
||||
}
|
||||
|
||||
fn passive(document: &Document, before: &Project, source: &SourceBundle) {
|
||||
assert_eq!(document.project(), before);
|
||||
assert_eq!(document.bundle(), source);
|
||||
assert!(!document.dirty());
|
||||
assert!(!document.can_undo() && !document.can_redo());
|
||||
}
|
||||
|
||||
fn row(scene: &Scene, id: Id) -> f32 { scene.rows[&id].1 }
|
||||
fn line(scene: &Scene, id: Id) -> &Line {
|
||||
assert_eq!(scene.lines.iter().filter(|line| line.id == id).count(), 1);
|
||||
scene.lines.iter().find(|line| line.id == id).unwrap()
|
||||
}
|
||||
fn named_box(scene: &Scene, id: Id) -> &BoxItem {
|
||||
scene.boxes.iter().find(|item| item.id == id && !item.title.is_empty()).unwrap()
|
||||
}
|
||||
|
||||
fn same_scene(a: &Scene, b: &Scene) {
|
||||
assert_eq!(a.rows, b.rows);
|
||||
assert_eq!(a.sequence_bounds, b.sequence_bounds);
|
||||
assert_eq!(a.size, b.size);
|
||||
assert_eq!(a.lanes, b.lanes);
|
||||
assert_eq!(a.lifecycle, b.lifecycle);
|
||||
assert_eq!(a.open_calls, b.open_calls);
|
||||
let boxes = |s: &Scene| s.boxes.iter().map(|b| (b.id,b.rect,b.title.clone(),b.detail.clone(),b.marker)).collect::<Vec<_>>();
|
||||
let lines = |s: &Scene| s.lines.iter().map(|l| (l.id,l.points.clone(),l.label_at,l.label.clone(),l.dashed)).collect::<Vec<_>>();
|
||||
let slots = |s: &Scene| s.slots.iter().map(|slot| (slot.slot.parent,slot.slot.before,slot.y,slot.label.clone())).collect::<Vec<_>>();
|
||||
assert_eq!(boxes(a),boxes(b));
|
||||
assert_eq!(lines(a),lines(b));
|
||||
assert_eq!(slots(a),slots(b));
|
||||
}
|
||||
|
||||
fn others_fixed(before: &Scene, after: &Scene, changed: Id) {
|
||||
assert_eq!(before.rows.len(),after.rows.len());
|
||||
for (&id, original) in &before.rows {
|
||||
if id != changed { assert_eq!(&after.rows[&id],original,"unexpected movement of {id}"); }
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn complete_seed_plan_preserves_both_actual_scene_and_document_baselines() {
|
||||
for lifetime in [false,true] {
|
||||
let (document,owner)=fixture(lifetime);
|
||||
let p=document.project(); let before=p.clone(); let source=document.bundle().clone();
|
||||
let baseline=Scene::sequence(p,owner,owner);
|
||||
let plan=Plan::build(p,owner,&baseline,&Candidate::new()).unwrap();
|
||||
assert!(plan.diagnostics.is_empty());
|
||||
for (&id,(_,y)) in &baseline.rows { assert_eq!(plan.anchors[&id].y,*y); }
|
||||
same_scene(&baseline,&render(p,owner,&plan));
|
||||
let reparsed=language::parse(&language::format(p)).unwrap();
|
||||
same_scene(&baseline,&render(&reparsed,owner,&plan));
|
||||
passive(&document,&before,&source);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn upward_second_delivery_reaches_200_and_all_other_occurrence_anchors_stay_fixed() {
|
||||
let (document,owner)=fixture(false);
|
||||
let p=document.project(); let before=p.clone(); let source=document.bundle().clone();
|
||||
let baseline=Scene::sequence(p,owner,owner);
|
||||
let first=id(p,"first"); let second=id(p,"second");
|
||||
assert_ne!(first,second);
|
||||
for occurrence_id in [first,second] {
|
||||
assert!(matches!(occurrence(p,occurrence_id),Some(OccurrenceBody::Exchange { exchange:Some(edge),.. }) if *edge==id(p,"channel")));
|
||||
}
|
||||
assert_eq!((row(&baseline,first),row(&baseline,second)),(148.,240.));
|
||||
let candidate=drag(&Candidate::new(),&baseline,second,-40.);
|
||||
assert_eq!(candidate,Candidate::from([(second,200.)]));
|
||||
let plan=Plan::build(p,owner,&baseline,&candidate).unwrap();
|
||||
let moved=render(p,owner,&plan);
|
||||
assert_eq!((row(&moved,first),row(&moved,second)),(148.,200.));
|
||||
others_fixed(&baseline,&moved,second);
|
||||
assert_eq!(line(&moved,first).points,line(&baseline,first).points);
|
||||
let left=moved.lanes[&id(p,"left")]; let right=moved.lanes[&id(p,"right")];
|
||||
assert_eq!(line(&moved,second).points,vec![Point::new(left,200.),Point::new(right,200.)]);
|
||||
assert_eq!(plan.messages[&second],MessageAnchors { send_y:200.,receive_y:200. });
|
||||
assert!(plan.diagnostics.is_empty());
|
||||
same_scene(&moved,&render(p,owner,&plan));
|
||||
passive(&document,&before,&source);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn nested_upward_anchor_reaches_457_without_moving_parent_or_followers() {
|
||||
let (document,owner)=fixture(false);
|
||||
let p=document.project(); let before=p.clone(); let source=document.bundle().clone();
|
||||
let baseline=Scene::sequence(p,owner,owner);
|
||||
let nested=id(p,"nested"); let fragment=id(p,"fragment");
|
||||
assert_eq!(row(&baseline,nested),477.);
|
||||
let candidate=drag(&Candidate::new(),&baseline,nested,-20.);
|
||||
let plan=Plan::build(p,owner,&baseline,&candidate).unwrap();
|
||||
let moved=render(p,owner,&plan);
|
||||
assert_eq!(row(&moved,nested),457.);
|
||||
assert_eq!(named_box(&moved,nested).rect.y,437.);
|
||||
assert_eq!(named_box(&moved,nested).rect.height,70.);
|
||||
assert_eq!(named_box(&moved,fragment).rect,named_box(&baseline,fragment).rect);
|
||||
assert_eq!((named_box(&moved,fragment).rect.y,named_box(&moved,fragment).rect.height),(332.,240.));
|
||||
assert_eq!(moved.sequence_bounds[&id(p,"operand")],baseline.sequence_bounds[&id(p,"operand")]);
|
||||
others_fixed(&baseline,&moved,nested);
|
||||
assert!(plan.diagnostics.is_empty());
|
||||
passive(&document,&before,&source);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn earlier_death_reaches_380_and_actual_lifetime_and_activation_clip_there() {
|
||||
let (document,owner)=fixture(true);
|
||||
let p=document.project(); let before=p.clone(); let source=document.bundle().clone();
|
||||
let baseline=Scene::sequence(p,owner,owner);
|
||||
let create=id(p,"create_receiver"); let call=id(p,"service_call"); let delete=id(p,"delete_receiver");
|
||||
let provider=id(p,"provider");
|
||||
assert_eq!((row(&baseline,create),row(&baseline,call),row(&baseline,delete)),(243.,335.,427.));
|
||||
let candidate=drag(&Candidate::new(),&baseline,delete,-47.);
|
||||
let plan=Plan::build(p,owner,&baseline,&candidate).unwrap();
|
||||
assert_eq!(plan.anchors[&delete].role,AnchorRole::MessageReceive);
|
||||
assert_eq!(plan.messages[&delete],MessageAnchors { send_y:380.,receive_y:380. });
|
||||
let moved=render(p,owner,&plan);
|
||||
assert_eq!(row(&moved,delete),380.);
|
||||
others_fixed(&baseline,&moved,delete);
|
||||
let spans=moved.lifecycle.alive_spans(provider,owner,85.,moved.size.height-20.);
|
||||
assert_eq!(spans.iter().map(|s|(s.start,s.end)).collect::<Vec<_>>(),vec![(243.,380.)]);
|
||||
assert!(moved.lifecycle.alive_spans(provider,owner,380.,moved.size.height-20.).is_empty());
|
||||
let x=moved.lanes[&provider];
|
||||
assert_eq!(moved.lifecycle.marker_at(Point::new(x,380.)),Some(delete));
|
||||
assert_eq!(moved.lifecycle.marker_at(Point::new(x,427.)),None);
|
||||
assert_eq!(moved.hit(Point::new(x,380.)),Some(delete));
|
||||
let bars:Vec<_>=moved.boxes.iter().filter(|b|b.id==call && b.title.is_empty()).collect();
|
||||
assert_eq!(bars.len(),1);
|
||||
assert_eq!(bars[0].rect,Rectangle::new(Point::new(x-4.,335.),Size::new(8.,45.)));
|
||||
assert_eq!(moved.open_calls,vec![Point::new(x+12.,364.)]);
|
||||
assert!(plan.diagnostics.is_empty());
|
||||
passive(&document,&before,&source);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn self_call_has_explicit_send610_receive634_and_reply_stays728() {
|
||||
let (document,owner)=fixture(false);
|
||||
let p=document.project(); let before=p.clone(); let source=document.bundle().clone();
|
||||
let baseline=Scene::sequence(p,owner,owner);
|
||||
let call=id(p,"self_call"); let reply=id(p,"self_reply");
|
||||
let candidate=drag(&Candidate::new(),&baseline,call,-26.);
|
||||
let plan=Plan::build(p,owner,&baseline,&candidate).unwrap();
|
||||
assert_eq!(plan.anchors[&call],Anchor { y:610.,role:AnchorRole::MessageSend });
|
||||
assert_eq!(plan.messages[&call],MessageAnchors { send_y:610.,receive_y:634. });
|
||||
let moved=render(p,owner,&plan);
|
||||
assert_eq!(row(&moved,call),610.);
|
||||
assert_eq!(row(&moved,reply),728.);
|
||||
assert_eq!(line(&moved,call).points.iter().map(|p|p.y).collect::<Vec<_>>(),vec![610.,610.,634.,634.]);
|
||||
assert_eq!(line(&moved,reply).points,line(&baseline,reply).points);
|
||||
others_fixed(&baseline,&moved,call);
|
||||
// Peer #21 owns the activation start/column contract. This assertion covers
|
||||
// actual message anchors, not the old row-based activation start defect.
|
||||
passive(&document,&before,&source);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn signed_zero_keeps_sparse_candidate_and_restoring_original_candidate_restores_actual_scene() {
|
||||
let (document,owner)=fixture(false);
|
||||
let p=document.project(); let before=p.clone(); let source=document.bundle().clone();
|
||||
let baseline=Scene::sequence(p,owner,owner);
|
||||
let second=id(p,"second");
|
||||
let original=Candidate::new();
|
||||
for zero in [0.,-0.] { assert_eq!(drag(&original,&baseline,second,zero),original); }
|
||||
let changed=drag(&original,&baseline,second,-40.);
|
||||
let plan=Plan::build(p,owner,&baseline,&changed).unwrap();
|
||||
let frame=render(p,owner,&plan);
|
||||
for zero in [0.,-0.] {
|
||||
let untouched=drag(&changed,&frame,second,zero);
|
||||
assert_eq!(untouched,changed);
|
||||
same_scene(&frame,&render(p,owner,&Plan::build(p,owner,&baseline,&untouched).unwrap()));
|
||||
}
|
||||
// This restores the exact sidecar candidate; it is not a production Undo
|
||||
// command or evidence of a layout source/REST persistence implementation.
|
||||
same_scene(&baseline,&render(p,owner,&Plan::build(p,owner,&baseline,&original).unwrap()));
|
||||
passive(&document,&before,&source);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn crossing_is_rendered_exactly_and_diagnosed_with_extents_covering_the_earlier_far_event() {
|
||||
let (document,owner)=fixture(false);
|
||||
let p=document.project(); let before=p.clone(); let source=document.bundle().clone();
|
||||
let baseline=Scene::sequence(p,owner,owner);
|
||||
let first=id(p,"first"); let second=id(p,"second");
|
||||
let plan=Plan::build(p,owner,&baseline,&Candidate::from([(first,1000.)])).unwrap();
|
||||
assert!(plan.diagnostics.contains(&Diagnostic::SourceOrderCrossing { scope:owner,before:first,after:second }));
|
||||
let moved=render(p,owner,&plan);
|
||||
assert_eq!((row(&moved,first),row(&moved,second)),(1000.,240.));
|
||||
assert_eq!(row(&moved,id(p,"self_reply")),728.);
|
||||
others_fixed(&baseline,&moved,first);
|
||||
assert_eq!(moved.sequence_bounds[&owner].1,1026.);
|
||||
assert_eq!(moved.size.height,1113.);
|
||||
assert!(line(&moved,first).points.iter().all(|point| point.y<moved.size.height));
|
||||
assert_eq!(&p.elements[&owner].steps().unwrap()[..2],&[first,second]);
|
||||
// This is a policy falsifier: mechanically exact coordinates do not prove
|
||||
// that out-of-order vertical notation is understandable or acceptable.
|
||||
passive(&document,&before,&source);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn nested_outlier_expands_enclosing_geometry_without_using_final_traversal_row_as_extent() {
|
||||
let (document,owner)=fixture(false);
|
||||
let p=document.project(); let baseline=Scene::sequence(p,owner,owner);
|
||||
let nested=id(p,"nested"); let fragment=id(p,"fragment"); let following=id(p,"self_call");
|
||||
let plan=Plan::build(p,owner,&baseline,&Candidate::from([(nested,1000.)])).unwrap();
|
||||
assert!(plan.diagnostics.contains(&Diagnostic::FrameExtendsPastFollowingAnchor { frame:fragment,following }));
|
||||
let moved=render(p,owner,&plan);
|
||||
assert_eq!(row(&moved,nested),1000.);
|
||||
assert_eq!(named_box(&moved,nested).rect.y,980.);
|
||||
let enclosing=named_box(&moved,fragment).rect;
|
||||
assert_eq!(enclosing.y+enclosing.height,1070.);
|
||||
assert!(moved.sequence_bounds[&owner].1>=1070.);
|
||||
assert!(moved.size.height>1070.);
|
||||
assert_eq!(row(&moved,following),636.);
|
||||
others_fixed(&baseline,&moved,nested);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn unsupported_targets_and_lifetime_inversion_fail_explicitly_instead_of_silent_clamping() {
|
||||
let (document,owner)=fixture(true);
|
||||
let p=document.project(); let baseline=Scene::sequence(p,owner,owner);
|
||||
let create=id(p,"create_receiver"); let delete=id(p,"delete_receiver");
|
||||
assert_eq!(Plan::build(p,owner,&baseline,&Candidate::from([(delete,200.)])).unwrap_err(),
|
||||
PlanError::LifetimeInversionNotSupported { create,delete });
|
||||
assert_eq!(Plan::build(p,owner,&baseline,&Candidate::from([(delete,f32::NAN)])).unwrap_err(),PlanError::NonFinite(delete));
|
||||
let edge=id(p,"service");
|
||||
assert_eq!(Plan::build(p,owner,&baseline,&Candidate::from([(edge,200.)])).unwrap_err(),PlanError::UnknownAnchor(edge));
|
||||
let (other,other_owner)=fixture(false);
|
||||
let fragment=id(other.project(),"fragment");
|
||||
let other_scene=Scene::sequence(other.project(),other_owner,other_owner);
|
||||
assert_eq!(Plan::build(other.project(),other_owner,&other_scene,&Candidate::from([(fragment,300.)])).unwrap_err(),
|
||||
PlanError::CompoundMoveNotImplemented(fragment));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn complete_plan_scope_is_inactive_in_other_threads_and_restored_after_deliberate_panic() {
|
||||
let (document,owner)=fixture(false);
|
||||
let p=document.project(); let baseline=Scene::sequence(p,owner,owner);
|
||||
let second=id(p,"second");
|
||||
let plan=Plan::build(p,owner,&baseline,&Candidate::from([(second,200.)])).unwrap();
|
||||
let caught=std::panic::catch_unwind(|| {
|
||||
let _scope=Scope::install(&plan);
|
||||
assert_eq!(row(&Scene::sequence(p,owner,owner),second),200.);
|
||||
std::thread::spawn(|| {
|
||||
let (document,owner)=fixture(false);
|
||||
let p=document.project();
|
||||
assert_eq!(row(&Scene::sequence(p,owner,owner),id(p,"second")),240.);
|
||||
}).join().unwrap();
|
||||
panic!("deliberate complete-anchor scope unwind");
|
||||
});
|
||||
let payload=caught.expect_err("deliberate panic is required");
|
||||
assert_eq!(payload.downcast_ref::<&str>().copied(),Some("deliberate complete-anchor scope unwind"));
|
||||
same_scene(&baseline,&Scene::sequence(p,owner,owner));
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
diff --git a/crates/oa-desktop/src/behavior.rs b/crates/oa-desktop/src/behavior.rs
|
||||
index 3f9fd97..f1ef5b7 100644
|
||||
--- a/crates/oa-desktop/src/behavior.rs
|
||||
+++ b/crates/oa-desktop/src/behavior.rs
|
||||
@@ -1121,6 +1121,10 @@ fn in_machine(p: &Project, id: Id, machine: Id) -> bool {
|
||||
#[path = "../../../harness/experiments/behavior-layout-scene-20260912/mod.rs"]
|
||||
mod behavior_layout_scene_experiment;
|
||||
|
||||
+#[cfg(test)]
|
||||
+#[path = "../../../harness/experiments/behavior-anchor-plan-20260912/mod.rs"]
|
||||
+mod behavior_anchor_plan_experiment;
|
||||
+
|
||||
struct BoxItem {
|
||||
id: Id,
|
||||
rect: Rectangle,
|
||||
@@ -1332,6 +1336,8 @@ impl Scene {
|
||||
let mut y = if scenario { 148. } else { 120. };
|
||||
scene.occurrences(p, owner, scenario, &lane_x, &mut y, 0);
|
||||
scene.size.height = (y + 45.).max(210.);
|
||||
+ #[cfg(test)]
|
||||
+ behavior_anchor_plan_experiment::scene_extent(&mut scene);
|
||||
if scenario {
|
||||
scene.lifecycle = scenario_lifecycle::render::Rendering::new(
|
||||
p,
|
||||
@@ -1441,6 +1447,8 @@ impl Scene {
|
||||
}
|
||||
#[cfg(test)]
|
||||
behavior_layout_scene_experiment::resolve_row_anchor(*id, y);
|
||||
+ #[cfg(test)]
|
||||
+ behavior_anchor_plan_experiment::row_anchor(*id, y);
|
||||
if ordered {
|
||||
let slot = scenario::Slot {
|
||||
parent: owner,
|
||||
@@ -1465,6 +1473,8 @@ impl Scene {
|
||||
(*y - top).max(95.),
|
||||
),
|
||||
);
|
||||
+ #[cfg(test)]
|
||||
+ let rect = behavior_anchor_plan_experiment::frame_bounds(*id, rect);
|
||||
self.boxes.insert(
|
||||
0,
|
||||
BoxItem {
|
||||
@@ -1649,6 +1659,8 @@ impl Scene {
|
||||
}
|
||||
if ordered {
|
||||
self.sequence_bounds.insert(owner, (sequence_top, *y - 42.));
|
||||
+ #[cfg(test)]
|
||||
+ behavior_anchor_plan_experiment::scope_end(owner, y, &mut self.sequence_bounds);
|
||||
let slot = scenario::Slot {
|
||||
parent: owner,
|
||||
before: None,
|
||||
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"base": "66a1f1690f778c8814bfefff7f46fe7f6bbe520e",
|
||||
"status": "Static-review candidate; not compiled or executed",
|
||||
"files": [
|
||||
{
|
||||
"path": "crates/oa-desktop/src/behavior.rs",
|
||||
"bytes": 137409,
|
||||
"sha256": "5884BA35AD994EB5936CA29C071A5002EFC221DC42EF35E2265D50593BDF60EC"
|
||||
},
|
||||
{
|
||||
"path": "harness/experiments/behavior-anchor-plan-20260912/mod.rs",
|
||||
"bytes": 10863,
|
||||
"sha256": "CA7CFE5DD1FBE37D54E5E96F0C73825D0AA0B06733E19C62592BF2AAFD62EC2F"
|
||||
},
|
||||
{
|
||||
"path": "harness/experiments/behavior-anchor-plan-20260912/tests.rs",
|
||||
"bytes": 14475,
|
||||
"sha256": "477B6D271CCBC95CFFF415DDE3DAE5CF4B7F1DEE12D4D5FCE6B095A0DF35891C"
|
||||
},
|
||||
{
|
||||
"path": "harness/experiments/behavior-anchor-plan-20260912/README.md",
|
||||
"bytes": 10076,
|
||||
"sha256": "6B9AD8B34AFC1E62931865007F7AFE57D28DC54AB9C805F33D3D86D215588514"
|
||||
},
|
||||
{
|
||||
"path": "harness/experiments/behavior-anchor-plan-20260912/wiring.patch",
|
||||
"bytes": 2131,
|
||||
"sha256": "4CE4BC45FBC419EBA6A07B048B82EFB8D85525514E3D2E56421948E7733F40FD"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
# Complete anchor plan into actual Scene — pending execution
|
||||
|
||||
Prepared 2026-09-12 in isolated branch `codex/behavior-anchor-plan-ytr83r-20260912`, base `66a1f1690f778c8814bfefff7f46fe7f6bbe520e`. Parent owns compilation and publication. **Not compiled, executed, staged or committed.** Only test-only additions to `crates/oa-desktop/src/behavior.rs` and this new directory were authored. The existing floor experiment and its fixtures are unchanged. All new production-file statements are guarded by `cfg(test)`; normal production rendering is unchanged.
|
||||
|
||||
## Bounded question
|
||||
|
||||
Can a complete ephemeral anchor plan drive the actual Scene at exact requested y coordinates without the old running-cursor floor, preserve unspecified anchors and the entire Document, and maintain covered extents and real lifecycle derivation? This isolates the integration seam from the unresolved choice of a product movement policy.
|
||||
|
||||
The old floor candidate imposed existing seed increments on every requested row. This candidate seeds missing anchors from the actual baseline Scene, then replaces explicitly requested coordinates exactly. It does not impose sequence-order constraints or overlap spacing. Source-order crossings are returned as diagnostic data, not silently clamped or converted into semantic Reorder. This is a mechanical projection experiment, not evidence that crossed vertical ordering is acceptable UX.
|
||||
|
||||
`Candidate` is an external map keyed by occurrence UUID. `Plan` is a complete resolved input for the currently visible Scene, including operand headers missing from the ordinary rows map. It contains row roles, derived message send/receive y values, frame bounds, sequence extents and canvas height. It is not a model, parser or REST payload.
|
||||
|
||||
## Actual code boundary and wiring
|
||||
|
||||
`wiring.patch` records the exact production-file delta from the base commit. The five new cfg(test) integration points are:
|
||||
|
||||
1. Include this module as a private child of `behavior`, next to the unchanged floor module.
|
||||
2. Immediately after the old floor hook, consume the complete plan's exact occurrence anchor, before Scene records rows and constructs the occurrence's existing geometry.
|
||||
3. Before inserting an existing fragment BoxItem, use the plan's frame bounds. Existing fragment paint and label code remain in place.
|
||||
4. Immediately after recording a sequence's bounds, substitute planned bounds and update the existing final insertion axis. An earlier event placed lower than the last event cannot truncate the scope merely because traversal ends earlier.
|
||||
5. Before current lifecycle and activation construction, substitute the covered canvas height. Current `Rendering::new`, message alignment, activation generation and drawing remain responsible for their actual geometry.
|
||||
|
||||
The plan is scoped per thread, inactive by default, restored by Drop during unwinding, and has a deliberate-panic test requiring the exact sentinel payload. Other tests on other threads cannot consume its plan. The original floor hooks remain operational when their own scope is active; the new plan is otherwise absent.
|
||||
|
||||
Footprints are measured from the actual baseline named boxes, message polylines and label bounds, translated by requested row deltas. This avoids cloning the renderer's line or lifecycle algorithms. Empty activation bars are excluded because the real renderer derives those later. Frames conservatively preserve seed extents and can grow downward; growth adds an explicitly experimental 20px presentation margin. A move requiring upward frame growth returns `FixedFrameHeaderWouldMove`, because the candidate cannot move an unspecified painted header while retaining its FrameStart and insertion slot. Mere overlap inside the existing frame is not categorically rejected. Sequence bounds preserve seed extents and measured edge padding while expanding to cover outliers; canvas height uses the original scope-to-canvas margin. Neither these margins nor nonshrinking seed extents are adopted user requirements. This is not a general container-resize solver.
|
||||
|
||||
## Independently expected checks
|
||||
|
||||
Twelve new test functions use the existing hand-authored fixtures through the actual parser and Document bundle loader. Numeric expectations below are independently stated rather than generated from the new planner:
|
||||
|
||||
| Case | Expected actual Scene result |
|
||||
| --- | --- |
|
||||
| Empty complete plan, both fixtures | Same rows, named boxes and marker kinds, lines and labels, scopes, slots, lifecycle, open calls and size as the unmodified baseline Scene |
|
||||
| Second delivery240→200 | First148; second200; every other occurrence anchor unchanged; both second-message endpoints200; repeated exchange references retain different occurrence IDs |
|
||||
| Nested action477→457 | Box top437, height70; actual fragment metadata and active header332..370 retained, header hit still resolves the fragment, before-slot290 and label unchanged; operand bounds and all other anchors unchanged |
|
||||
| Nested action→300 | Proposed footprint280..350 would relocate unspecified frame top332 to260; reject with `FixedFrameHeaderWouldMove` before rendering. Nested353 remains admitted despite overlap inside the fixed frame |
|
||||
| Create243→50 or84 | Reject with `LifecycleAnchorOutsideRenderScope`; actual root lifecycle span starts85 even when insertion-scope planning expands higher. At85 the real birth marker and alive span85..427 remain present |
|
||||
| Death427→380 | Create243 and call335 stay fixed; real alive span243..380; actual bar335..380; death marker/hit moves to380; unresolved-call cue remains, no Reply is invented |
|
||||
| Self-call636→610 | Actual send610/receive634, using the current24 offset; reply728 unchanged; MessageSend role distinguished from the lifecycle MessageReceive role |
|
||||
| Signed zero and candidate restoration | Both0 and-0 return the exact original sparse candidate; no first-edit materialization; restoring the original candidate restores Scene geometry |
|
||||
| First event→1000, last remains728 | First1000/second240, SourceOrderCrossing diagnostic, source order unchanged; root scope end1026 and height1113 cover the earlier outlier rather than the traversal tail |
|
||||
| Nested action→1000 | Box top980/bottom1050; enclosing frame bottom1070; actual root scope/canvas cover it; following self-call636 remains fixed and overlap is diagnosed |
|
||||
| Invalid/unsupported input | Unknown anchor, nonfinite y, compound frame movement and same-scope inverted birth/death fail explicitly |
|
||||
| Scoped execution | Another thread sees baseline geometry; a deliberate panic restores the baseline scope |
|
||||
|
||||
The primary cases compare the entire Project and original SourceBundle and require the real Document to remain clean with no Undo/Redo entry. Canonical parser roundtrip is used, but it covers only the semantic Project: layout stays external. Candidate restoration is a reversible-sidecar check, **not** a production Undo implementation. No command has been added to Document.
|
||||
|
||||
## Explicit limitations and falsifiers
|
||||
|
||||
- Crossing source-ordered events is deliberately drawable with diagnostics. That proves removal of the mechanical floor, not adoption of unrestricted vertical notation. The crossing output remains an independent product-policy falsifier.
|
||||
- An expanded frame can overlap the next event. Its diagnostic preserves that evidence instead of shifting the next event implicitly. The experiment does not establish a frame/header constraint policy or all feasible layouts.
|
||||
- Upward growth that would relocate an unspecified frame header is explicitly unsupported. This does not ban arbitrary overlap gaps; the numeric353 example remains admitted. Full compound/header movement policy remains unresolved.
|
||||
- Lifecycle receive anchors must be within the actual effective Rendering scope: root85..height-20, or its recorded non-root scope with the renderer's existing empty-scope allowance. Outside coordinates are rejected before exposing a Scene whose row exists but whose marker/lifetime is missing. This bounds the inspected bridge; it does not establish general ancestor/operand ordering or cross-operand lifetime support.
|
||||
- The same-scope creation-after-deletion case returns `LifetimeInversionNotSupported` before rendering. Current lifecycle intervals cannot truthfully depict that inversion without another representation policy. This is an experimental bridge limitation, not permission to reject semantically valid models or a user-approved global movement rule. Cross-operand lifecycle combinations remain unproven.
|
||||
- Compound frame/operand movement, box resizing, horizontal layout, independent send/receive movement, route editing, drag transaction stamps, pointer capture, dirty-source recovery, persistence, REST and native UI are not implemented.
|
||||
- Self-call send and receive roles are explicit, but the current activation engine still owns its existing row-based behavior. Peer #21's typed activation integration must consume the actual receive anchor and retain the existing lifetime clipping. These tests do not silently bless the old activation-start discrepancy.
|
||||
- Scope/containment walking is deliberately straightforward and not a large-model performance implementation. There is no responsiveness claim.
|
||||
- Some self-message fixture exchanges are unassigned because the current global relation model forbids self edges. The existing fixture's known incomplete-model warnings remain; tests reject semantic errors.
|
||||
|
||||
No storage or parser design should be adopted from this adapter. Coordinate any eventual payload with prospective #7, whose required addressing must preserve diagram/owner/occurrence identity and explicit anchor roles. Coordinate inverse resize with #16 and typed activation/lifetime union with #21 before broad UI work.
|
||||
|
||||
Parent reports [peer #21 comment716](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/issues/21#issuecomment-716), posted2026-09-12 23:06UTC: Codex-956atf owns an isolated typed-activation/lifecycle source union. Its intended order is finalized rows/height, lifecycle construction and Create/Delete alignment, then typed Call/Reply attachment, with receiver/scope clipping, logical reply timing distinct from clipped geometry, no resurrection after Delete, and unanswered-call cues preserved. That WIP is not integrated here. Retain the explicit send/receive seam and review the future union against these fixtures; this paragraph records a coordination dependency, not verified acceptance of peer code.
|
||||
|
||||
## Reproduction and handoff
|
||||
|
||||
At the parent's chosen compiler checkpoint, use the configured Windows Rust/linker environment:
|
||||
|
||||
```powershell
|
||||
cargo test -p oa-desktop behavior_anchor_plan_experiment --locked --offline -- --nocapture
|
||||
cargo test -p oa-desktop behavior_layout_scene_experiment --locked --offline -- --nocapture
|
||||
```
|
||||
|
||||
The first filter must execute twelve new tests; the second must retain the ten existing floor/lifetime tests. Preserve compile failures, parser failures, numeric mismatches and diagnostics as results. Do not claim success from a zero-test filtered run or from compiling only production targets. An intentional panic should be followed by its restoration test passing; another panic payload is a failure.
|
||||
|
||||
## Static review correction history
|
||||
|
||||
The frozen attempt1 candidate was preserved before these corrections. Parent's authoritative archive is `.local/behavior-anchor-plan-review-20260912/attempt1` with its five-file hash manifest; parent owns portable archival publication. The pre-review failures are static, unexecuted findings: nested300 silently moved the frame header to260 while row332/slot290 stayed fixed, and Create50 was omitted as MissingGeometry by the actual root lifetime span starting85. The corrected candidate adds named unsupported errors and independent numeric checks rather than recording either original behavior as acceptance. Production hooks and the original floor experiment remain unchanged.
|
||||
|
||||
Record exact compiled commit/uncommitted patch, commands and results before publication. Source hashes supplied with the handoff identify prepared bytes, not tested code. Root should publish the complete directory and exact behavior.rs delta so remote peers can reproduce it; workspace-local paths are not remote handoffs.
|
||||
@@ -0,0 +1,297 @@
|
||||
//! Experimental complete anchor input for the actual Scene, cfg(test) only.
|
||||
//! No persistence schema and no replacement line/lifecycle/activation renderer.
|
||||
use super::*;
|
||||
use std::cell::RefCell;
|
||||
|
||||
mod tests;
|
||||
|
||||
type Candidate = BTreeMap<Id, f32>;
|
||||
|
||||
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
||||
enum AnchorRole {
|
||||
MessageSend,
|
||||
MessageReceive,
|
||||
Observation,
|
||||
FrameStart,
|
||||
OperandStart,
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Debug, PartialEq)]
|
||||
struct Anchor {
|
||||
y: f32,
|
||||
role: AnchorRole,
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Debug, PartialEq)]
|
||||
struct MessageAnchors {
|
||||
send_y: f32,
|
||||
receive_y: f32,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, Eq)]
|
||||
enum Diagnostic {
|
||||
SourceOrderCrossing { scope: Id, before: Id, after: Id },
|
||||
FrameExtendsPastFollowingAnchor { frame: Id, following: Id },
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, Eq)]
|
||||
enum PlanError {
|
||||
UnknownAnchor(Id),
|
||||
NonFinite(Id),
|
||||
CompoundMoveNotImplemented(Id),
|
||||
FixedFrameHeaderWouldMove { frame: Id },
|
||||
LifecycleAnchorOutsideRenderScope { occurrence: Id, scope: Id },
|
||||
LifetimeInversionNotSupported { create: Id, delete: Id },
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
struct Plan {
|
||||
anchors: BTreeMap<Id, Anchor>,
|
||||
messages: BTreeMap<Id, MessageAnchors>,
|
||||
frames: BTreeMap<Id, Rectangle>,
|
||||
scopes: BTreeMap<Id, (f32, f32)>,
|
||||
height: f32,
|
||||
diagnostics: Vec<Diagnostic>,
|
||||
}
|
||||
|
||||
fn occurrence(p: &Project, id: Id) -> Option<&OccurrenceBody> {
|
||||
match p.elements.get(&id)?.shared()? {
|
||||
SharedBody::Occurrence { body, .. } => Some(body),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
fn role(body: &OccurrenceBody) -> AnchorRole {
|
||||
match body {
|
||||
OccurrenceBody::Exchange { message_kind: MessageKind::Create | MessageKind::Delete, .. } => AnchorRole::MessageReceive,
|
||||
OccurrenceBody::Exchange { .. } => AnchorRole::MessageSend,
|
||||
OccurrenceBody::Fragment { .. } => AnchorRole::FrameStart,
|
||||
OccurrenceBody::Branch { .. } => AnchorRole::OperandStart,
|
||||
_ => AnchorRole::Observation,
|
||||
}
|
||||
}
|
||||
|
||||
fn inside(p: &Project, id: Id, owner: Id) -> bool {
|
||||
let mut current = p.elements.get(&id).and_then(|e| e.parent);
|
||||
for _ in 0..p.elements.len() {
|
||||
match current {
|
||||
Some(parent) if parent == owner => return true,
|
||||
Some(parent) => current = p.elements.get(&parent).and_then(|e| e.parent),
|
||||
None => return false,
|
||||
}
|
||||
}
|
||||
false
|
||||
}
|
||||
|
||||
fn depth(p: &Project, id: Id) -> usize {
|
||||
let mut current = p.elements.get(&id).and_then(|e| e.parent);
|
||||
let mut result = 0;
|
||||
while let Some(parent) = current {
|
||||
result += 1;
|
||||
if result > p.elements.len() { break; }
|
||||
current = p.elements.get(&parent).and_then(|e| e.parent);
|
||||
}
|
||||
result
|
||||
}
|
||||
|
||||
fn union(a: Rectangle, b: Rectangle) -> Rectangle {
|
||||
let x = a.x.min(b.x);
|
||||
let y = a.y.min(b.y);
|
||||
Rectangle::new(Point::new(x, y), Size::new(
|
||||
(a.x + a.width).max(b.x + b.width) - x,
|
||||
(a.y + a.height).max(b.y + b.height) - y,
|
||||
))
|
||||
}
|
||||
|
||||
/// Actual named shapes/message paths supply footprint measurements; activation
|
||||
/// bars are intentionally excluded because current Scene derives them later.
|
||||
fn footprints(scene: &Scene, anchors: &BTreeMap<Id, Anchor>, seed: &BTreeMap<Id, Anchor>) -> BTreeMap<Id, Rectangle> {
|
||||
let mut out = BTreeMap::new();
|
||||
for item in scene.boxes.iter().filter(|item| !item.title.is_empty()) {
|
||||
let Some(anchor) = anchors.get(&item.id) else { continue; };
|
||||
let mut rect = item.rect;
|
||||
rect.y += anchor.y - seed[&item.id].y;
|
||||
out.insert(item.id, rect);
|
||||
}
|
||||
for line in &scene.lines {
|
||||
let Some(anchor) = anchors.get(&line.id) else { continue; };
|
||||
let delta = anchor.y - seed[&line.id].y;
|
||||
let mut rect = line.label_bounds();
|
||||
rect.y += delta;
|
||||
for point in &line.points {
|
||||
rect = union(rect, Rectangle::new(Point::new(point.x, point.y + delta), Size::ZERO));
|
||||
}
|
||||
out.entry(line.id).and_modify(|old| *old = union(*old, rect)).or_insert(rect);
|
||||
}
|
||||
out
|
||||
}
|
||||
|
||||
fn covered_bounds(p: &Project, owner: Id, footprints: &BTreeMap<Id, Rectangle>) -> Option<Rectangle> {
|
||||
footprints.iter().filter(|(id, _)| inside(p, **id, owner))
|
||||
.map(|(_, rect)| *rect).reduce(union)
|
||||
}
|
||||
|
||||
impl Plan {
|
||||
fn build(p: &Project, owner: Id, baseline: &Scene, desired: &Candidate) -> Result<Self, PlanError> {
|
||||
let mut seed: BTreeMap<_, _> = baseline.rows.iter().map(|(id, (_, y))| {
|
||||
(*id, Anchor { y: *y, role: role(occurrence(p, *id).expect("Scene occurrence")) })
|
||||
}).collect();
|
||||
// Operand headers are real Scene boxes, but are not entries in rows.
|
||||
for item in &baseline.boxes {
|
||||
if matches!(occurrence(p, item.id), Some(OccurrenceBody::Branch { .. })) {
|
||||
seed.insert(item.id, Anchor { y: item.rect.y, role: AnchorRole::OperandStart });
|
||||
}
|
||||
}
|
||||
let mut anchors = seed.clone();
|
||||
for (&id, &y) in desired {
|
||||
let anchor = anchors.get_mut(&id).ok_or(PlanError::UnknownAnchor(id))?;
|
||||
if !y.is_finite() { return Err(PlanError::NonFinite(id)); }
|
||||
if matches!(anchor.role, AnchorRole::FrameStart | AnchorRole::OperandStart) && y != anchor.y {
|
||||
return Err(PlanError::CompoundMoveNotImplemented(id));
|
||||
}
|
||||
anchor.y = y;
|
||||
}
|
||||
let mut messages = BTreeMap::new();
|
||||
for line in &baseline.lines {
|
||||
if let (Some(anchor), Some(first), Some(last)) = (anchors.get(&line.id), line.points.first(), line.points.last()) {
|
||||
let delta = anchor.y - seed[&line.id].y;
|
||||
messages.insert(line.id, MessageAnchors { send_y: first.y + delta, receive_y: last.y + delta });
|
||||
}
|
||||
}
|
||||
// The current lifecycle bridge needs positive birth/death intervals.
|
||||
// This is an explicit unsupported crossing, not a new semantic rule.
|
||||
for (&create, message) in &messages {
|
||||
if let Some(OccurrenceBody::Exchange { message_kind: MessageKind::Create, receiver: Some(lane), .. }) = occurrence(p, create) {
|
||||
for (&delete, finish) in &messages {
|
||||
if p.elements[&create].parent == p.elements[&delete].parent
|
||||
&& matches!(occurrence(p, delete), Some(OccurrenceBody::Exchange { message_kind: MessageKind::Delete, receiver: Some(other), .. }) if other == lane)
|
||||
&& message.receive_y > finish.receive_y {
|
||||
return Err(PlanError::LifetimeInversionNotSupported { create, delete });
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
let old_footprints = footprints(baseline, &seed, &seed);
|
||||
let mut drawn = footprints(baseline, &anchors, &seed);
|
||||
let mut frames = BTreeMap::new();
|
||||
let mut containers: Vec<_> = seed.keys().copied()
|
||||
.filter(|id| matches!(occurrence(p, *id), Some(OccurrenceBody::Fragment { .. }))).collect();
|
||||
containers.sort_by_key(|id| std::cmp::Reverse(depth(p, *id)));
|
||||
for id in containers {
|
||||
let original = old_footprints[&id];
|
||||
let mut rect = original;
|
||||
if let Some(covered) = covered_bounds(p, id, &drawn) {
|
||||
// Keep seed extents where possible; 20px growth padding is an
|
||||
// explicit experimental presentation preference, not semantics.
|
||||
// Upward envelope growth would move the painted frame header
|
||||
// while its fixed FrameStart/row/slot remained at the seed.
|
||||
// Reject that unsupported compound change, not mere overlap.
|
||||
if covered.y < rect.y {
|
||||
return Err(PlanError::FixedFrameHeaderWouldMove { frame: id });
|
||||
}
|
||||
if covered.y + covered.height > rect.y + rect.height {
|
||||
rect.height = covered.y + covered.height + 20. - rect.y;
|
||||
}
|
||||
}
|
||||
frames.insert(id, rect);
|
||||
drawn.insert(id, rect);
|
||||
}
|
||||
let mut scopes = baseline.sequence_bounds.clone();
|
||||
for (&scope, bounds) in &mut scopes {
|
||||
if let (Some(old), Some(new)) = (covered_bounds(p, scope, &old_footprints), covered_bounds(p, scope, &drawn)) {
|
||||
let top_padding = (old.y - bounds.0).max(0.);
|
||||
let bottom_padding = (bounds.1 - old.y - old.height).max(0.);
|
||||
if new.y < bounds.0 { bounds.0 = new.y - top_padding; }
|
||||
bounds.1 = bounds.1.max(new.y + new.height + bottom_padding);
|
||||
}
|
||||
}
|
||||
let tail = baseline.size.height - baseline.sequence_bounds[&owner].1;
|
||||
let height = baseline.size.height.max(scopes[&owner].1 + tail);
|
||||
for (&id, message) in &messages {
|
||||
if matches!(occurrence(p, id), Some(OccurrenceBody::Exchange {
|
||||
message_kind: MessageKind::Create | MessageKind::Delete, ..
|
||||
})) {
|
||||
let scope = p.elements[&id].parent.expect("lifecycle sequence owner");
|
||||
// Match Rendering::new's effective scope, not the insertion
|
||||
// scope: it overrides the root span to 85..height-20 and gives
|
||||
// empty non-root scopes the existing 26px lifetime allowance.
|
||||
let (start, end) = if scope == owner {
|
||||
(85., height - 20.)
|
||||
} else if let Some(&(start, end)) = scopes.get(&scope) {
|
||||
(start, if start == end { start + 26. } else { end })
|
||||
} else {
|
||||
return Err(PlanError::LifecycleAnchorOutsideRenderScope { occurrence: id, scope });
|
||||
};
|
||||
if message.receive_y < start || message.receive_y > end {
|
||||
return Err(PlanError::LifecycleAnchorOutsideRenderScope { occurrence: id, scope });
|
||||
}
|
||||
}
|
||||
}
|
||||
let mut diagnostics = Vec::new();
|
||||
for element in p.elements.values().filter(|e| e.id == owner || inside(p, e.id, owner)) {
|
||||
if let Some(steps) = element.steps() {
|
||||
for pair in steps.windows(2) {
|
||||
if let (Some(a), Some(b)) = (anchors.get(&pair[0]), anchors.get(&pair[1])) {
|
||||
if a.y > b.y { diagnostics.push(Diagnostic::SourceOrderCrossing { scope: element.id, before: pair[0], after: pair[1] }); }
|
||||
if let Some(frame) = frames.get(&pair[0]) {
|
||||
if frame.y + frame.height > b.y { diagnostics.push(Diagnostic::FrameExtendsPastFollowingAnchor { frame: pair[0], following: pair[1] }); }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Ok(Self { anchors, messages, frames, scopes, height, diagnostics })
|
||||
}
|
||||
}
|
||||
|
||||
thread_local! {
|
||||
static PLAN: RefCell<Option<Plan>> = const { RefCell::new(None) };
|
||||
}
|
||||
|
||||
struct Scope(Option<Plan>);
|
||||
impl Scope {
|
||||
fn install(plan: &Plan) -> Self { Self(PLAN.with(|slot| slot.replace(Some(plan.clone())))) }
|
||||
}
|
||||
impl Drop for Scope {
|
||||
fn drop(&mut self) { PLAN.with(|slot| { slot.replace(self.0.take()); }); }
|
||||
}
|
||||
|
||||
pub(super) fn row_anchor(id: Id, y: &mut f32) {
|
||||
PLAN.with(|slot| {
|
||||
if let Some(plan) = slot.borrow().as_ref() {
|
||||
*y = plan.anchors.get(&id).expect("complete Scene anchor plan").y;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
pub(super) fn frame_bounds(id: Id, fallback: Rectangle) -> Rectangle {
|
||||
PLAN.with(|slot| slot.borrow().as_ref().map_or(fallback, |plan| plan.frames[&id]))
|
||||
}
|
||||
|
||||
pub(super) fn scope_end(owner: Id, y: &mut f32, bounds: &mut BTreeMap<Id, (f32, f32)>) {
|
||||
PLAN.with(|slot| {
|
||||
if let Some(plan) = slot.borrow().as_ref() {
|
||||
bounds.insert(owner, plan.scopes[&owner]);
|
||||
*y = plan.scopes[&owner].1 + 42.; // Existing insertion-axis offset.
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
pub(super) fn scene_extent(scene: &mut Scene) {
|
||||
PLAN.with(|slot| {
|
||||
if let Some(plan) = slot.borrow().as_ref() { scene.size.height = plan.height; }
|
||||
});
|
||||
}
|
||||
|
||||
fn render(p: &Project, owner: Id, plan: &Plan) -> Scene {
|
||||
let _scope = Scope::install(plan);
|
||||
Scene::sequence(p, owner, owner)
|
||||
}
|
||||
|
||||
fn drag(original: &Candidate, frame: &Scene, target: Id, delta_y: f32) -> Candidate {
|
||||
assert!(delta_y.is_finite());
|
||||
if delta_y == 0. { return original.clone(); }
|
||||
let mut result = original.clone();
|
||||
result.insert(target, frame.rows[&target].1 + delta_y);
|
||||
result
|
||||
}
|
||||
@@ -0,0 +1,348 @@
|
||||
use super::*;
|
||||
use crate::document::Document;
|
||||
use oa_core::{language, source_project::{ProjectLimits, SourceBundle}, validation};
|
||||
|
||||
fn id(p: &Project, alias: &str) -> Id {
|
||||
p.identities().into_iter().find(|(_, name)| *name == alias).unwrap().0
|
||||
}
|
||||
|
||||
fn fixture(lifetime: bool) -> (Document, Id) {
|
||||
let (name, input, owner) = if lifetime {
|
||||
("lifetime.arcadia", include_str!("../behavior-layout-scene-20260912/lifetime.arcadia"), "lifetime_conversation")
|
||||
} else {
|
||||
("fixture.arcadia", include_str!("../behavior-layout-scene-20260912/fixture.arcadia"), "conversation")
|
||||
};
|
||||
let p = language::parse(input).expect("existing real Arcadia fixture");
|
||||
let errors: Vec<_> = validation::validate(&p).into_iter()
|
||||
.filter(|issue| issue.severity == validation::Severity::Error).collect();
|
||||
assert!(errors.is_empty(), "{errors:?}");
|
||||
let bundle = SourceBundle { entry: name.into(), files: BTreeMap::from([(name.into(), input.into())]) };
|
||||
let document = Document::from_bundle(bundle, ProjectLimits::default()).unwrap();
|
||||
assert_eq!(document.project(), &p);
|
||||
assert_eq!(language::parse(&language::format(&p)).unwrap(), p);
|
||||
let owner = id(&p, owner);
|
||||
(document, owner)
|
||||
}
|
||||
|
||||
fn passive(document: &Document, before: &Project, source: &SourceBundle) {
|
||||
assert_eq!(document.project(), before);
|
||||
assert_eq!(document.bundle(), source);
|
||||
assert!(!document.dirty());
|
||||
assert!(!document.can_undo() && !document.can_redo());
|
||||
}
|
||||
|
||||
fn row(scene: &Scene, id: Id) -> f32 { scene.rows[&id].1 }
|
||||
fn line(scene: &Scene, id: Id) -> &Line {
|
||||
assert_eq!(scene.lines.iter().filter(|line| line.id == id).count(), 1);
|
||||
scene.lines.iter().find(|line| line.id == id).unwrap()
|
||||
}
|
||||
fn named_box(scene: &Scene, id: Id) -> &BoxItem {
|
||||
scene.boxes.iter().find(|item| item.id == id && !item.title.is_empty()).unwrap()
|
||||
}
|
||||
|
||||
fn same_scene(a: &Scene, b: &Scene) {
|
||||
assert_eq!(a.rows, b.rows);
|
||||
assert_eq!(a.sequence_bounds, b.sequence_bounds);
|
||||
assert_eq!(a.size, b.size);
|
||||
assert_eq!(a.lanes, b.lanes);
|
||||
assert_eq!(a.lifecycle, b.lifecycle);
|
||||
assert_eq!(a.open_calls, b.open_calls);
|
||||
let boxes = |s: &Scene| s.boxes.iter().map(|b| (b.id,b.rect,b.title.clone(),b.detail.clone(),b.marker)).collect::<Vec<_>>();
|
||||
let lines = |s: &Scene| s.lines.iter().map(|l| (l.id,l.points.clone(),l.label_at,l.label.clone(),l.dashed)).collect::<Vec<_>>();
|
||||
let slots = |s: &Scene| s.slots.iter().map(|slot| (slot.slot.parent,slot.slot.before,slot.y,slot.label.clone())).collect::<Vec<_>>();
|
||||
assert_eq!(boxes(a),boxes(b));
|
||||
assert_eq!(lines(a),lines(b));
|
||||
assert_eq!(slots(a),slots(b));
|
||||
}
|
||||
|
||||
fn others_fixed(before: &Scene, after: &Scene, changed: Id) {
|
||||
assert_eq!(before.rows.len(),after.rows.len());
|
||||
for (&id, original) in &before.rows {
|
||||
if id != changed { assert_eq!(&after.rows[&id],original,"unexpected movement of {id}"); }
|
||||
}
|
||||
}
|
||||
|
||||
fn fixed_frame_metadata(before: &Scene, after: &Scene, frame: Id) {
|
||||
let original=named_box(before,frame);
|
||||
let current=named_box(after,frame);
|
||||
assert_eq!((current.id,current.rect,¤t.title,¤t.detail,current.marker),
|
||||
(original.id,original.rect,&original.title,&original.detail,original.marker));
|
||||
assert_eq!(before.rows[&frame],after.rows[&frame]);
|
||||
assert_eq!(row(after,frame),332.);
|
||||
// Scene::hit uses the first38px as the frame's active painted header.
|
||||
let header=Rectangle::new(Point::new(original.rect.x,original.rect.y),Size::new(original.rect.width,38.));
|
||||
assert_eq!((header.y,header.y+header.height),(332.,370.));
|
||||
let probe=Point::new(header.x+8.,header.y+8.);
|
||||
assert_eq!(before.hit(probe),Some(frame));
|
||||
assert_eq!(after.hit(probe),Some(frame));
|
||||
let original_slot=before.slots.iter().find(|slot|slot.slot.before==Some(frame)).unwrap();
|
||||
let current_slot=after.slots.iter().find(|slot|slot.slot.before==Some(frame)).unwrap();
|
||||
assert_eq!((current_slot.slot.parent,current_slot.slot.before,current_slot.y,¤t_slot.label),
|
||||
(original_slot.slot.parent,original_slot.slot.before,original_slot.y,&original_slot.label));
|
||||
assert_eq!(current_slot.y,290.);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn complete_seed_plan_preserves_both_actual_scene_and_document_baselines() {
|
||||
for lifetime in [false,true] {
|
||||
let (document,owner)=fixture(lifetime);
|
||||
let p=document.project(); let before=p.clone(); let source=document.bundle().clone();
|
||||
let baseline=Scene::sequence(p,owner,owner);
|
||||
let plan=Plan::build(p,owner,&baseline,&Candidate::new()).unwrap();
|
||||
assert!(plan.diagnostics.is_empty());
|
||||
for (&id,(_,y)) in &baseline.rows { assert_eq!(plan.anchors[&id].y,*y); }
|
||||
same_scene(&baseline,&render(p,owner,&plan));
|
||||
let reparsed=language::parse(&language::format(p)).unwrap();
|
||||
same_scene(&baseline,&render(&reparsed,owner,&plan));
|
||||
passive(&document,&before,&source);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn upward_second_delivery_reaches_200_and_all_other_occurrence_anchors_stay_fixed() {
|
||||
let (document,owner)=fixture(false);
|
||||
let p=document.project(); let before=p.clone(); let source=document.bundle().clone();
|
||||
let baseline=Scene::sequence(p,owner,owner);
|
||||
let first=id(p,"first"); let second=id(p,"second");
|
||||
assert_ne!(first,second);
|
||||
for occurrence_id in [first,second] {
|
||||
assert!(matches!(occurrence(p,occurrence_id),Some(OccurrenceBody::Exchange { exchange:Some(edge),.. }) if *edge==id(p,"channel")));
|
||||
}
|
||||
assert_eq!((row(&baseline,first),row(&baseline,second)),(148.,240.));
|
||||
let candidate=drag(&Candidate::new(),&baseline,second,-40.);
|
||||
assert_eq!(candidate,Candidate::from([(second,200.)]));
|
||||
let plan=Plan::build(p,owner,&baseline,&candidate).unwrap();
|
||||
let moved=render(p,owner,&plan);
|
||||
assert_eq!((row(&moved,first),row(&moved,second)),(148.,200.));
|
||||
others_fixed(&baseline,&moved,second);
|
||||
assert_eq!(line(&moved,first).points,line(&baseline,first).points);
|
||||
let left=moved.lanes[&id(p,"left")]; let right=moved.lanes[&id(p,"right")];
|
||||
assert_eq!(line(&moved,second).points,vec![Point::new(left,200.),Point::new(right,200.)]);
|
||||
assert_eq!(plan.messages[&second],MessageAnchors { send_y:200.,receive_y:200. });
|
||||
assert!(plan.diagnostics.is_empty());
|
||||
same_scene(&moved,&render(p,owner,&plan));
|
||||
passive(&document,&before,&source);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn nested_upward_anchor_reaches_457_without_moving_parent_or_followers() {
|
||||
let (document,owner)=fixture(false);
|
||||
let p=document.project(); let before=p.clone(); let source=document.bundle().clone();
|
||||
let baseline=Scene::sequence(p,owner,owner);
|
||||
let nested=id(p,"nested"); let fragment=id(p,"fragment");
|
||||
assert_eq!(row(&baseline,nested),477.);
|
||||
let candidate=drag(&Candidate::new(),&baseline,nested,-20.);
|
||||
let plan=Plan::build(p,owner,&baseline,&candidate).unwrap();
|
||||
let moved=render(p,owner,&plan);
|
||||
assert_eq!(row(&moved,nested),457.);
|
||||
assert_eq!(named_box(&moved,nested).rect.y,437.);
|
||||
assert_eq!(named_box(&moved,nested).rect.height,70.);
|
||||
assert_eq!(named_box(&moved,fragment).rect,named_box(&baseline,fragment).rect);
|
||||
assert_eq!((named_box(&moved,fragment).rect.y,named_box(&moved,fragment).rect.height),(332.,240.));
|
||||
fixed_frame_metadata(&baseline,&moved,fragment);
|
||||
assert_eq!(moved.sequence_bounds[&id(p,"operand")],baseline.sequence_bounds[&id(p,"operand")]);
|
||||
others_fixed(&baseline,&moved,nested);
|
||||
assert!(plan.diagnostics.is_empty());
|
||||
passive(&document,&before,&source);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn nested_move_that_would_relocate_fixed_header_is_rejected_but_mere_overlap_is_not_banned() {
|
||||
let (document,owner)=fixture(false);
|
||||
let p=document.project(); let before=p.clone(); let source=document.bundle().clone();
|
||||
let baseline=Scene::sequence(p,owner,owner);
|
||||
let nested=id(p,"nested"); let fragment=id(p,"fragment");
|
||||
let requested=Candidate::from([(nested,300.)]);
|
||||
// Actual70px action box has row-to-top offset-20: proposed footprint280..350.
|
||||
// The old envelope union would move frame/header top332 to260 while leaving
|
||||
// FrameStart332 and before-slot290. Reject before any such Scene is exposed.
|
||||
let original=named_box(&baseline,nested).rect;
|
||||
assert_eq!((row(&baseline,nested),original.y,original.height),(477.,457.,70.));
|
||||
let proposed_top=original.y+(300.-row(&baseline,nested));
|
||||
assert_eq!((proposed_top,proposed_top+original.height),(280.,350.));
|
||||
assert_eq!(Plan::build(p,owner,&baseline,&requested).unwrap_err(),
|
||||
PlanError::FixedFrameHeaderWouldMove { frame:fragment });
|
||||
fixed_frame_metadata(&baseline,&Scene::sequence(p,owner,owner),fragment);
|
||||
// Overlap inside the existing frame does not itself move its top. This
|
||||
// remains admitted mechanical geometry, not a claim of usable overlap UX.
|
||||
let overlap=Plan::build(p,owner,&baseline,&Candidate::from([(nested,353.)])).unwrap();
|
||||
let overlapping=render(p,owner,&overlap);
|
||||
assert_eq!(named_box(&overlapping,nested).rect.y,333.);
|
||||
fixed_frame_metadata(&baseline,&overlapping,fragment);
|
||||
passive(&document,&before,&source);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn lifecycle_anchor_below_actual_root_render_scope_is_rejected_before_scene_construction() {
|
||||
let (document,owner)=fixture(true);
|
||||
let p=document.project(); let before=p.clone(); let source=document.bundle().clone();
|
||||
let baseline=Scene::sequence(p,owner,owner);
|
||||
let create=id(p,"create_receiver"); let provider=id(p,"provider");
|
||||
let requester=id(p,"requester");
|
||||
let root_life=baseline.lifecycle.alive_spans(requester,owner,0.,baseline.size.height);
|
||||
assert_eq!(root_life.iter().map(|span|(span.start,span.end)).collect::<Vec<_>>(),vec![(85.,544.)]);
|
||||
for requested in [50.,84.] {
|
||||
assert_eq!(Plan::build(p,owner,&baseline,&Candidate::from([(create,requested)])).unwrap_err(),
|
||||
PlanError::LifecycleAnchorOutsideRenderScope { occurrence:create,scope:owner });
|
||||
}
|
||||
// At the renderer's actual85 boundary the marker/lifetime remains present.
|
||||
// Source-order crossing is still diagnosed separately, not silently banned.
|
||||
let boundary=Plan::build(p,owner,&baseline,&Candidate::from([(create,85.)])).unwrap();
|
||||
let moved=render(p,owner,&boundary);
|
||||
let x=moved.lanes[&provider];
|
||||
assert_eq!(row(&moved,create),85.);
|
||||
assert_eq!(moved.lifecycle.marker_at(Point::new(x,85.)),Some(create));
|
||||
let alive=moved.lifecycle.alive_spans(provider,owner,0.,moved.size.height);
|
||||
assert_eq!(alive.iter().map(|span|(span.start,span.end)).collect::<Vec<_>>(),vec![(85.,427.)]);
|
||||
passive(&document,&before,&source);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn earlier_death_reaches_380_and_actual_lifetime_and_activation_clip_there() {
|
||||
let (document,owner)=fixture(true);
|
||||
let p=document.project(); let before=p.clone(); let source=document.bundle().clone();
|
||||
let baseline=Scene::sequence(p,owner,owner);
|
||||
let create=id(p,"create_receiver"); let call=id(p,"service_call"); let delete=id(p,"delete_receiver");
|
||||
let provider=id(p,"provider");
|
||||
assert_eq!((row(&baseline,create),row(&baseline,call),row(&baseline,delete)),(243.,335.,427.));
|
||||
let candidate=drag(&Candidate::new(),&baseline,delete,-47.);
|
||||
let plan=Plan::build(p,owner,&baseline,&candidate).unwrap();
|
||||
assert_eq!(plan.anchors[&delete].role,AnchorRole::MessageReceive);
|
||||
assert_eq!(plan.messages[&delete],MessageAnchors { send_y:380.,receive_y:380. });
|
||||
let moved=render(p,owner,&plan);
|
||||
assert_eq!(row(&moved,delete),380.);
|
||||
others_fixed(&baseline,&moved,delete);
|
||||
let spans=moved.lifecycle.alive_spans(provider,owner,85.,moved.size.height-20.);
|
||||
assert_eq!(spans.iter().map(|s|(s.start,s.end)).collect::<Vec<_>>(),vec![(243.,380.)]);
|
||||
assert!(moved.lifecycle.alive_spans(provider,owner,380.,moved.size.height-20.).is_empty());
|
||||
let x=moved.lanes[&provider];
|
||||
assert_eq!(moved.lifecycle.marker_at(Point::new(x,380.)),Some(delete));
|
||||
assert_eq!(moved.lifecycle.marker_at(Point::new(x,427.)),None);
|
||||
assert_eq!(moved.hit(Point::new(x,380.)),Some(delete));
|
||||
let bars:Vec<_>=moved.boxes.iter().filter(|b|b.id==call && b.title.is_empty()).collect();
|
||||
assert_eq!(bars.len(),1);
|
||||
assert_eq!(bars[0].rect,Rectangle::new(Point::new(x-4.,335.),Size::new(8.,45.)));
|
||||
assert_eq!(moved.open_calls,vec![Point::new(x+12.,364.)]);
|
||||
assert!(plan.diagnostics.is_empty());
|
||||
passive(&document,&before,&source);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn self_call_has_explicit_send610_receive634_and_reply_stays728() {
|
||||
let (document,owner)=fixture(false);
|
||||
let p=document.project(); let before=p.clone(); let source=document.bundle().clone();
|
||||
let baseline=Scene::sequence(p,owner,owner);
|
||||
let call=id(p,"self_call"); let reply=id(p,"self_reply");
|
||||
let candidate=drag(&Candidate::new(),&baseline,call,-26.);
|
||||
let plan=Plan::build(p,owner,&baseline,&candidate).unwrap();
|
||||
assert_eq!(plan.anchors[&call],Anchor { y:610.,role:AnchorRole::MessageSend });
|
||||
assert_eq!(plan.messages[&call],MessageAnchors { send_y:610.,receive_y:634. });
|
||||
let moved=render(p,owner,&plan);
|
||||
assert_eq!(row(&moved,call),610.);
|
||||
assert_eq!(row(&moved,reply),728.);
|
||||
assert_eq!(line(&moved,call).points.iter().map(|p|p.y).collect::<Vec<_>>(),vec![610.,610.,634.,634.]);
|
||||
assert_eq!(line(&moved,reply).points,line(&baseline,reply).points);
|
||||
others_fixed(&baseline,&moved,call);
|
||||
// Peer #21 owns the activation start/column contract. This assertion covers
|
||||
// actual message anchors, not the old row-based activation start defect.
|
||||
passive(&document,&before,&source);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn signed_zero_keeps_sparse_candidate_and_restoring_original_candidate_restores_actual_scene() {
|
||||
let (document,owner)=fixture(false);
|
||||
let p=document.project(); let before=p.clone(); let source=document.bundle().clone();
|
||||
let baseline=Scene::sequence(p,owner,owner);
|
||||
let second=id(p,"second");
|
||||
let original=Candidate::new();
|
||||
for zero in [0.,-0.] { assert_eq!(drag(&original,&baseline,second,zero),original); }
|
||||
let changed=drag(&original,&baseline,second,-40.);
|
||||
let plan=Plan::build(p,owner,&baseline,&changed).unwrap();
|
||||
let frame=render(p,owner,&plan);
|
||||
for zero in [0.,-0.] {
|
||||
let untouched=drag(&changed,&frame,second,zero);
|
||||
assert_eq!(untouched,changed);
|
||||
same_scene(&frame,&render(p,owner,&Plan::build(p,owner,&baseline,&untouched).unwrap()));
|
||||
}
|
||||
// This restores the exact sidecar candidate; it is not a production Undo
|
||||
// command or evidence of a layout source/REST persistence implementation.
|
||||
same_scene(&baseline,&render(p,owner,&Plan::build(p,owner,&baseline,&original).unwrap()));
|
||||
passive(&document,&before,&source);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn crossing_is_rendered_exactly_and_diagnosed_with_extents_covering_the_earlier_far_event() {
|
||||
let (document,owner)=fixture(false);
|
||||
let p=document.project(); let before=p.clone(); let source=document.bundle().clone();
|
||||
let baseline=Scene::sequence(p,owner,owner);
|
||||
let first=id(p,"first"); let second=id(p,"second");
|
||||
let plan=Plan::build(p,owner,&baseline,&Candidate::from([(first,1000.)])).unwrap();
|
||||
assert!(plan.diagnostics.contains(&Diagnostic::SourceOrderCrossing { scope:owner,before:first,after:second }));
|
||||
let moved=render(p,owner,&plan);
|
||||
assert_eq!((row(&moved,first),row(&moved,second)),(1000.,240.));
|
||||
assert_eq!(row(&moved,id(p,"self_reply")),728.);
|
||||
others_fixed(&baseline,&moved,first);
|
||||
assert_eq!(moved.sequence_bounds[&owner].1,1026.);
|
||||
assert_eq!(moved.size.height,1113.);
|
||||
assert!(line(&moved,first).points.iter().all(|point| point.y<moved.size.height));
|
||||
assert_eq!(&p.elements[&owner].steps().unwrap()[..2],&[first,second]);
|
||||
// This is a policy falsifier: mechanically exact coordinates do not prove
|
||||
// that out-of-order vertical notation is understandable or acceptable.
|
||||
passive(&document,&before,&source);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn nested_outlier_expands_enclosing_geometry_without_using_final_traversal_row_as_extent() {
|
||||
let (document,owner)=fixture(false);
|
||||
let p=document.project(); let baseline=Scene::sequence(p,owner,owner);
|
||||
let nested=id(p,"nested"); let fragment=id(p,"fragment"); let following=id(p,"self_call");
|
||||
let plan=Plan::build(p,owner,&baseline,&Candidate::from([(nested,1000.)])).unwrap();
|
||||
assert!(plan.diagnostics.contains(&Diagnostic::FrameExtendsPastFollowingAnchor { frame:fragment,following }));
|
||||
let moved=render(p,owner,&plan);
|
||||
assert_eq!(row(&moved,nested),1000.);
|
||||
assert_eq!(named_box(&moved,nested).rect.y,980.);
|
||||
let enclosing=named_box(&moved,fragment).rect;
|
||||
assert_eq!(enclosing.y+enclosing.height,1070.);
|
||||
assert!(moved.sequence_bounds[&owner].1>=1070.);
|
||||
assert!(moved.size.height>1070.);
|
||||
assert_eq!(row(&moved,following),636.);
|
||||
others_fixed(&baseline,&moved,nested);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn unsupported_targets_and_lifetime_inversion_fail_explicitly_instead_of_silent_clamping() {
|
||||
let (document,owner)=fixture(true);
|
||||
let p=document.project(); let baseline=Scene::sequence(p,owner,owner);
|
||||
let create=id(p,"create_receiver"); let delete=id(p,"delete_receiver");
|
||||
assert_eq!(Plan::build(p,owner,&baseline,&Candidate::from([(delete,200.)])).unwrap_err(),
|
||||
PlanError::LifetimeInversionNotSupported { create,delete });
|
||||
assert_eq!(Plan::build(p,owner,&baseline,&Candidate::from([(delete,f32::NAN)])).unwrap_err(),PlanError::NonFinite(delete));
|
||||
let edge=id(p,"service");
|
||||
assert_eq!(Plan::build(p,owner,&baseline,&Candidate::from([(edge,200.)])).unwrap_err(),PlanError::UnknownAnchor(edge));
|
||||
let (other,other_owner)=fixture(false);
|
||||
let fragment=id(other.project(),"fragment");
|
||||
let other_scene=Scene::sequence(other.project(),other_owner,other_owner);
|
||||
assert_eq!(Plan::build(other.project(),other_owner,&other_scene,&Candidate::from([(fragment,300.)])).unwrap_err(),
|
||||
PlanError::CompoundMoveNotImplemented(fragment));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn complete_plan_scope_is_inactive_in_other_threads_and_restored_after_deliberate_panic() {
|
||||
let (document,owner)=fixture(false);
|
||||
let p=document.project(); let baseline=Scene::sequence(p,owner,owner);
|
||||
let second=id(p,"second");
|
||||
let plan=Plan::build(p,owner,&baseline,&Candidate::from([(second,200.)])).unwrap();
|
||||
let caught=std::panic::catch_unwind(|| {
|
||||
let _scope=Scope::install(&plan);
|
||||
assert_eq!(row(&Scene::sequence(p,owner,owner),second),200.);
|
||||
std::thread::spawn(|| {
|
||||
let (document,owner)=fixture(false);
|
||||
let p=document.project();
|
||||
assert_eq!(row(&Scene::sequence(p,owner,owner),id(p,"second")),240.);
|
||||
}).join().unwrap();
|
||||
panic!("deliberate complete-anchor scope unwind");
|
||||
});
|
||||
let payload=caught.expect_err("deliberate panic is required");
|
||||
assert_eq!(payload.downcast_ref::<&str>().copied(),Some("deliberate complete-anchor scope unwind"));
|
||||
same_scene(&baseline,&Scene::sequence(p,owner,owner));
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
diff --git a/crates/oa-desktop/src/behavior.rs b/crates/oa-desktop/src/behavior.rs
|
||||
index 3f9fd97..f1ef5b7 100644
|
||||
--- a/crates/oa-desktop/src/behavior.rs
|
||||
+++ b/crates/oa-desktop/src/behavior.rs
|
||||
@@ -1121,6 +1121,10 @@ fn in_machine(p: &Project, id: Id, machine: Id) -> bool {
|
||||
#[path = "../../../harness/experiments/behavior-layout-scene-20260912/mod.rs"]
|
||||
mod behavior_layout_scene_experiment;
|
||||
|
||||
+#[cfg(test)]
|
||||
+#[path = "../../../harness/experiments/behavior-anchor-plan-20260912/mod.rs"]
|
||||
+mod behavior_anchor_plan_experiment;
|
||||
+
|
||||
struct BoxItem {
|
||||
id: Id,
|
||||
rect: Rectangle,
|
||||
@@ -1332,6 +1336,8 @@ impl Scene {
|
||||
let mut y = if scenario { 148. } else { 120. };
|
||||
scene.occurrences(p, owner, scenario, &lane_x, &mut y, 0);
|
||||
scene.size.height = (y + 45.).max(210.);
|
||||
+ #[cfg(test)]
|
||||
+ behavior_anchor_plan_experiment::scene_extent(&mut scene);
|
||||
if scenario {
|
||||
scene.lifecycle = scenario_lifecycle::render::Rendering::new(
|
||||
p,
|
||||
@@ -1441,6 +1447,8 @@ impl Scene {
|
||||
}
|
||||
#[cfg(test)]
|
||||
behavior_layout_scene_experiment::resolve_row_anchor(*id, y);
|
||||
+ #[cfg(test)]
|
||||
+ behavior_anchor_plan_experiment::row_anchor(*id, y);
|
||||
if ordered {
|
||||
let slot = scenario::Slot {
|
||||
parent: owner,
|
||||
@@ -1465,6 +1473,8 @@ impl Scene {
|
||||
(*y - top).max(95.),
|
||||
),
|
||||
);
|
||||
+ #[cfg(test)]
|
||||
+ let rect = behavior_anchor_plan_experiment::frame_bounds(*id, rect);
|
||||
self.boxes.insert(
|
||||
0,
|
||||
BoxItem {
|
||||
@@ -1649,6 +1659,8 @@ impl Scene {
|
||||
}
|
||||
if ordered {
|
||||
self.sequence_bounds.insert(owner, (sequence_top, *y - 42.));
|
||||
+ #[cfg(test)]
|
||||
+ behavior_anchor_plan_experiment::scope_end(owner, y, &mut self.sequence_bounds);
|
||||
let slot = scenario::Slot {
|
||||
parent: owner,
|
||||
before: None,
|
||||
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"status": "Two-fix static candidate; uncompiled, with newly discovered operand-scope gap",
|
||||
"files": [
|
||||
{
|
||||
"path": "crates/oa-desktop/src/behavior.rs",
|
||||
"bytes": 137409,
|
||||
"sha256": "5884BA35AD994EB5936CA29C071A5002EFC221DC42EF35E2265D50593BDF60EC"
|
||||
},
|
||||
{
|
||||
"path": "harness/experiments/behavior-anchor-plan-20260912/mod.rs",
|
||||
"bytes": 12330,
|
||||
"sha256": "2F139B39D067E8ACB39E9239F06E6AE3B560BE0541F7478B3EADA81D758CEDA9"
|
||||
},
|
||||
{
|
||||
"path": "harness/experiments/behavior-anchor-plan-20260912/tests.rs",
|
||||
"bytes": 18836,
|
||||
"sha256": "12CBC8FFCF2CDA54694C265C31F18CA47FB795BE34E28C2F09129027274D8E22"
|
||||
},
|
||||
{
|
||||
"path": "harness/experiments/behavior-anchor-plan-20260912/README.md",
|
||||
"bytes": 12234,
|
||||
"sha256": "080C7027CBFF51FC5D0A51E550F13C9F66AD3E3453C105355E7B78AF32CA9BC6"
|
||||
},
|
||||
{
|
||||
"path": "harness/experiments/behavior-anchor-plan-20260912/wiring.patch",
|
||||
"bytes": 2131,
|
||||
"sha256": "4CE4BC45FBC419EBA6A07B048B82EFB8D85525514E3D2E56421948E7733F40FD"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
# Actual Scene anchor experiment — pending execution
|
||||
|
||||
2026-09-12. Prepared by delegated reviewer `/root/diagram_usage_workflows` in branch `codex/diagram-coverage-fixes-ytr83r-20260912`, inspected base `f23615ffebdc3ca6872f98b6889ec49bb4e8abda` plus root's ongoing correction work. Only this experiment directory was authored. **Root applied the test-only wiring on isolated branch `codex/behavior-layout-scene-ytr83r-20260912`, based on `46b4f3c0d0f04050ad6d705051ee0199138e47a2`. Not compiled or executed.** Root owns the build checkpoint. No production schema choice, native acceptance or fix is claimed.
|
||||
|
||||
## Question and candidates
|
||||
|
||||
Can a minimal presentation input feed the actual current desktop Scene before it constructs rows, message polylines, nested frames and lifecycle geometry, while preserving the semantic Project and occurrence identities? Does explicit pointer intent preserve latent authored values on zero motion?
|
||||
|
||||
The candidate is an occurrence-ID-to-desired-row map. A tiny test-only hook raises the current Scene cursor to a requested row before recording an occurrence. This deliberately retains the existing renderer's next-row floor: it is a **downward spacing adapter**, not a general absolute-coordinate projector. The competing gap policy remains meaningful but is not implemented here: this experiment first tests the proposed real-Scene integration boundary. It cannot select a production storage schema.
|
||||
|
||||
Rejected experimental shortcuts: a standalone rectangle model would not test Scene; translating final polylines after rendering would bypass dependent frames/lifecycle; extracting the whole renderer would exceed the uncertainty being tested. This adapter uses the existing code that actually generates all those representations.
|
||||
|
||||
## Files and exact root wiring
|
||||
|
||||
- `fixture.arcadia`: hand-authored current source with explicit UUIDs, two occurrences sharing one communication mean, a fragment containing an operand/action box, and a self-call/reply. The self messages intentionally have unassigned global exchanges: current global relation validation rejects a self edge. Their explicit lifelines permit rendering; incomplete-exchange warnings are expected, semantic errors are not.
|
||||
- `mod.rs`: private child tests of `behavior`, a scoped thread-local anchor adapter, pointer-delta candidate operation, and independent numerical checks against actual Scene outputs.
|
||||
- `wiring.patch`: proposed two-site test-only wiring in `crates/oa-desktop/src/behavior.rs`. It adds the child module and calls `resolve_row_anchor(*id, y)` immediately before the `if ordered` block that records rows/slots in `Scene::occurrences`, **after** any self lifecycle clearance. The relative module path is from `crates/oa-desktop/src`. The line numbers are informational; verify the context against the exact integration version.
|
||||
|
||||
On the isolated wired branch, run:
|
||||
|
||||
```powershell
|
||||
cargo test -p oa-desktop behavior_layout_scene_experiment -- --nocapture
|
||||
```
|
||||
|
||||
Use the project's configured Windows compiler/linker environment. No dependency, Cargo target or main-function changes are needed. The hook is compiled only under cfg(test), inactive unless the current thread installs an AnchorScope, and restored by Drop after normal return or unwind. A test checks that another thread does not inherit the anchor map and that an intentional panic restores the baseline. Do not catch or reinterpret that expected panic output as a product crash; its test must still pass.
|
||||
|
||||
The isolated branch already contains this wiring; `wiring.patch` records its reviewable delta and must not be applied twice. If a compiler/parser assertion fails, preserve the failure, identify the exact reviewed source version, and correct the fixture or adapter at this boundary. Do not weaken independent geometric assertions solely to make the test green. Never claim a passing test from the existence of these files.
|
||||
|
||||
## Independent evaluators
|
||||
|
||||
The baseline is the actual `Scene::sequence` with no installed anchors. The hand-derived expected row coordinates are first148, second240, fragment332, nested action477, self-call636 and self-reply728. These follow the current seed metrics (message92, fragment header55, operand90, action95, trailing fragment64) and are observable implementation oracles, not proposed permanent UX rules. The nested box top is457; fragment height240; self-call endpoint y values are636 and660. Line identities and endpoints are asserted independently, not just compared between two calls to the same projector.
|
||||
|
||||
Tests cover:
|
||||
|
||||
1. Actual `oa_core::language::parse` and canonical format/reparse Project equality; baseline actual Scene equality after semantic source round trip; repeated exchange references retain distinct line UUIDs.
|
||||
2. Move only second delivery by40: its row becomes280, first stays148, nested action becomes517, fragment translates with unchanged height240, and self-call/reply geometry moves by40 with unchanged x and identity. Whole Project and canonical semantic source remain equal.
|
||||
3. Move the nested action by30: actual fragment grows from240 to270 while its top remains332; later self-call shifts. Move that self-call by18 and assert actual send/receive y684/708 and reply776; the nested box remains unchanged.
|
||||
4. Move first by200: second is visibly displaced to440 while its authored desired value stays240. Zero pointer delta returns the exact original candidate. Moving first back restores second240. Explicitly assigning second.desired=440 before moving first back deliberately preserves440 instead, exposing the distinction between pointer no-op and explicit latent-intent change.
|
||||
5. Reorder the repeated occurrences in actual source and parse it; the override stays attached to the second occurrence UUID. Its row is280 and the first follows at372. Projection does not write back any semantic model change.
|
||||
6. Scope restoration on panic and isolation from other test threads.
|
||||
7. Explicit upward-drag counterexample: the requested y200 remains rendered at240 under the current floor.
|
||||
|
||||
Model equality compares the entire Project. Scene equality checks rows, scopes, size, lanes, lifecycle, open calls, lines/labels, boxes and insertion slots; it does not invoke GPU painting. Explicit UUIDs are necessary because parsing declarations without IDs allocates new identities, which would make separate source parses unsuitable for occurrence-address comparison.
|
||||
|
||||
## Limits and next decision
|
||||
|
||||
This is real parser/Scene construction evidence **only after it runs**. Layout maps remain external experimental data; source round trips cover the semantic Project, not persisted layout. No new parser syntax, Document transaction, REST operation, undo stack, dirty-source workflow, route bend, text measurement, native gesture, inspector, resize, or performance result is established.
|
||||
|
||||
The current floor retains automatic whitespace and cannot establish all feasible free positions, upward drag, independent frame resize, gap-policy superiority or minimal displacement. Its limitation is useful evidence: if feeding requested anchors into the existing cursor still feels rigid, a real constraint/inverse policy is required, not more seed spacing. The next bounded choice is a declared anchor/constraint policy, then one typed layout record through source/Document/REST; broad renderer extraction is not justified by this probe.
|
||||
|
||||
Self-call send/receive assertions intentionally follow the actual current polyline contract. They do **not** assert activation correctness or substitute for peer #21's work. Activation boxes are generated by the real existing Scene/lifecycle path, and source roundtrip equality includes them, but that is not an independent oracle for nested activation start/depth/paint order. The fixture does not cover delayed creation/deletion, parallel operands, nested calls, cross-operand semantic moves, hidden views, copy/delete/reidentify lifecycle, or large models. Coordinate any later anchor contract with #16/#21 owners and retain these gaps in published evidence.
|
||||
|
||||
Root should publish this directory and the exact wired code/test result together for remote peer review. Independent machines cannot consume workspace-local links.
|
||||
|
||||
## Root source review before execution
|
||||
|
||||
The panic-restoration evaluator originally accepted any panic inside its scope, so an earlier failed geometry/thread assertion could have looked like successful deliberate unwinding. Root corrected it to require the exact deliberate panic payload. Moved message polylines now also require equal point counts before zipped endpoint comparisons. These are evaluator corrections; execution remains pending.
|
||||
|
||||
Independent bounded review confirmed hook placement, fixture assumptions and the hand-derived coordinates without executing them. Its coverage caveat prompted adding box marker metadata and insertion-slot labels to equality comparisons. Transient selection, camera and interaction state are not part of this geometry comparison. No material source finding remains from that review; compiler/runtime evidence is still required.
|
||||
|
||||
## Peer activation integration boundary
|
||||
|
||||
A read-only check of peer source `8112dea7a371755c7373f4ecc09a6488a73ac136` found that the pre-row hook remains upstream of typed activation construction and final message anchoring. That anchoring preserves generated y coordinates. Its column-zero self-call changes x from the old lane/lane+75/lane+75/lane path to lane/lane+66/lane+66/lane+6; receive y remains660 in this fixture, and the activation begins there rather than at send y636.
|
||||
|
||||
The peer branch and this branch have different lifetime integration states. This branch has production lifetime rendering, message alignment, self-lifecycle clearance and alive_spans clipping. In the peer checkpoint, scenario_lifecycle is cfg(test)-only and typed activation_segment emits an unclipped span. A future union must retain the lifetime behavior and reconcile duplicate activation methods; copying either whole Scene implementation is insufficient. Compare both lifecycle geometry and typed segment identity/rectangle/column/finish, and verify delayed Create/Delete inside and outside operands. Do not remove the existing lifecycle comparison to make the peer version compile. A segment clipped before its semantic reply must not falsely claim a visible reply termination. No peer code has been merged by this experiment.
|
||||
|
||||
[Shared integration finding](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/issues/21#issuecomment-698) and [peer activation source](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/src/commit/8112dea7a371755c7373f4ecc09a6488a73ac136/crates/oa-desktop/src/behavior/scenario_activation.rs). This is source compatibility evidence, not runtime acceptance.
|
||||
@@ -0,0 +1,60 @@
|
||||
arcadia 7;
|
||||
project layout_probe "Behavior layout Scene probe" id "10000000-0000-4000-8000-000000000001" {
|
||||
oa_entity sender "Sender" id "10000000-0000-4000-8000-000000000002" {}
|
||||
oa_entity receiver "Receiver" id "10000000-0000-4000-8000-000000000003" {}
|
||||
oa_activity inspect "Inspect" id "10000000-0000-4000-8000-000000000004" {}
|
||||
allocation inspect_assignment "Receiver performs inspection" id "10000000-0000-4000-8000-000000000005" {
|
||||
source @receiver; target @inspect;
|
||||
}
|
||||
communication_mean channel "Shared channel" id "10000000-0000-4000-8000-000000000006" {
|
||||
source @sender; target @receiver; oriented false;
|
||||
}
|
||||
oa_scenario conversation "Conversation" id "10000000-0000-4000-8000-000000000007" {
|
||||
viewpoint ParticipantInteraction;
|
||||
steps [@first, @second, @fragment, @self_call, @self_reply];
|
||||
}
|
||||
oa_lifeline left "Sender role" id "10000000-0000-4000-8000-000000000008" { parent @conversation; represented @sender; }
|
||||
oa_lifeline right "Receiver role" id "10000000-0000-4000-8000-000000000009" { parent @conversation; represented @receiver; }
|
||||
oa_occurrence first "First delivery" id "10000000-0000-4000-8000-00000000000a" {
|
||||
parent @conversation;
|
||||
body { Exchange {
|
||||
exchange @channel; sender @left; receiver @right;
|
||||
message_kind Asynchronous;
|
||||
}; };
|
||||
}
|
||||
oa_occurrence second "Second delivery" id "10000000-0000-4000-8000-00000000000b" {
|
||||
parent @conversation;
|
||||
body { Exchange {
|
||||
exchange @channel; sender @left; receiver @right;
|
||||
message_kind Asynchronous;
|
||||
}; };
|
||||
}
|
||||
oa_occurrence fragment "Optional inspection" id "10000000-0000-4000-8000-00000000000c" {
|
||||
parent @conversation;
|
||||
body { Fragment { operator Optional; branches [@operand]; }; };
|
||||
}
|
||||
oa_occurrence operand "When requested" id "10000000-0000-4000-8000-00000000000d" {
|
||||
parent @fragment;
|
||||
body { Branch { guard "requested"; occurrences [@nested]; }; };
|
||||
}
|
||||
oa_occurrence nested "Inspection occurrence" id "10000000-0000-4000-8000-00000000000e" {
|
||||
parent @operand;
|
||||
body { Action { action @inspect; lifeline @right; }; };
|
||||
}
|
||||
// Self calls intentionally have no global self-edge: such a relation is
|
||||
// invalid in the current metamodel. Their unassigned exchange is a known
|
||||
// incomplete-model warning, while explicit lifelines make Scene drawable.
|
||||
oa_occurrence self_call "Local call" id "10000000-0000-4000-8000-00000000000f" {
|
||||
parent @conversation;
|
||||
body { Exchange {
|
||||
exchange none; sender @right; receiver @right; message_kind Call;
|
||||
}; };
|
||||
}
|
||||
oa_occurrence self_reply "Local reply" id "10000000-0000-4000-8000-000000000010" {
|
||||
parent @conversation;
|
||||
body { Exchange {
|
||||
exchange none; sender @right; receiver @right;
|
||||
message_kind Reply; reply_to @self_call;
|
||||
}; };
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
arcadia 7;
|
||||
// Separate lifetime probe: preserve this authored note and all stable IDs.
|
||||
project lifetime_probe "Delayed receiver lifetime" id "20000000-0000-4000-8000-000000000001" {
|
||||
oa_activity prepare "Prepare request" id "20000000-0000-4000-8000-000000000002" {}
|
||||
oa_activity serve "Serve request" id "20000000-0000-4000-8000-000000000003" {}
|
||||
interaction service "Service request" id "20000000-0000-4000-8000-000000000004" {
|
||||
source @prepare; target @serve;
|
||||
}
|
||||
oa_scenario lifetime_conversation "Receiver created on demand" id "20000000-0000-4000-8000-000000000005" {
|
||||
viewpoint OperationalActivity;
|
||||
steps [@before_birth, @create_receiver, @service_call, @delete_receiver];
|
||||
}
|
||||
oa_lifeline requester "Requester" id "20000000-0000-4000-8000-000000000006" {
|
||||
parent @lifetime_conversation; represented @prepare;
|
||||
}
|
||||
oa_lifeline provider "Provider" id "20000000-0000-4000-8000-000000000007" {
|
||||
parent @lifetime_conversation; represented @serve;
|
||||
}
|
||||
oa_occurrence before_birth "Prepare before receiver exists" id "20000000-0000-4000-8000-000000000008" {
|
||||
parent @lifetime_conversation;
|
||||
body { Action { action @prepare; lifeline @requester; }; };
|
||||
}
|
||||
oa_occurrence create_receiver "Create receiver" id "20000000-0000-4000-8000-000000000009" {
|
||||
parent @lifetime_conversation;
|
||||
body { Exchange {
|
||||
exchange @service; sender @requester; receiver @provider;
|
||||
message_kind Create;
|
||||
}; };
|
||||
}
|
||||
oa_occurrence service_call "Call receiver" id "20000000-0000-4000-8000-00000000000a" {
|
||||
parent @lifetime_conversation;
|
||||
body { Exchange {
|
||||
exchange @service; sender @requester; receiver @provider;
|
||||
message_kind Call;
|
||||
}; };
|
||||
}
|
||||
// Death ends the visible activation but deliberately does not invent a Reply.
|
||||
oa_occurrence delete_receiver "Delete receiver" id "20000000-0000-4000-8000-00000000000b" {
|
||||
parent @lifetime_conversation;
|
||||
body { Exchange {
|
||||
exchange @service; sender @requester; receiver @provider;
|
||||
message_kind Delete;
|
||||
}; };
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
# Lifetime extension of the actual Scene experiment — not executed
|
||||
|
||||
Prepared 2026-09-12 in `codex/behavior-layout-scene-ytr83r-20260912`, inspected
|
||||
HEAD `911f63e`. This extension owns only `lifetime.arcadia`, `lifetime.rs`, this
|
||||
note, and the `mod lifetime;` declaration in the existing experiment module.
|
||||
The original fixture and its seven baseline tests are unchanged. Root owns the
|
||||
README compatibility note, compiler resource, source integration and publication.
|
||||
No production renderer, parser or model code was edited here.
|
||||
|
||||
## Question and method
|
||||
|
||||
Does the current test-only row-anchor hook propagate a changed Create/Delete
|
||||
position into the actual Scene's local lifetime, marker hit identity, aligned
|
||||
message endpoints and activation clipping, while leaving semantic/source state
|
||||
and occurrence IDs intact?
|
||||
|
||||
The separate source fixture declares stable UUIDs, a sender action before receiver
|
||||
birth, then Create, Call and receiver Delete. All three messages reference one
|
||||
valid Interaction; explicit sender/receiver lifelines represent its Activity
|
||||
endpoints. A Reply is deliberately absent: receiver death must not manufacture a
|
||||
reply or erase the unanswered-call presentation cue. The test requires real
|
||||
language parsing, no semantic errors, ordinary `Document::from_bundle` admission,
|
||||
canonical format/reparse Project equality and exact original source retention.
|
||||
Warnings are allowed and are not promoted into semantic acceptance requirements.
|
||||
|
||||
The evaluator calls the existing `Scene::sequence` and scoped `render`/`drag`
|
||||
helpers. It reads `Rendering::alive_spans` and `marker_at`, real Scene line
|
||||
polylines and actual activation `BoxItem` records. It does not construct an
|
||||
alternative activation/lifetime implementation or edit final geometry afterward.
|
||||
|
||||
## Independent expectations
|
||||
|
||||
Current Scene metrics give sender action148, Create243, Call335 and Delete427:
|
||||
the action consumes95 and each following message92. The scene height is564 and
|
||||
its root insertion bounds are106–477. These numbers are regression oracles for
|
||||
the inspected implementation, not permanent product spacing requirements.
|
||||
|
||||
The receiver is alive exactly243–427; the sender remains alive throughout the
|
||||
visible root span. Create ends at the 140px birth capsule's near edge, 70px before
|
||||
the receiver lane, while Delete ends at the death cross's center. Marker and
|
||||
Scene hit queries return the original Create/Delete occurrence IDs. The actual
|
||||
8px activation starts at Call335 and ends at death427, with no minimum-height tail
|
||||
after death. The unresolved-call cue stays at receiver-x+12, death-y−16.
|
||||
|
||||
Three tests establish these expectations if they pass:
|
||||
|
||||
1. Baseline parsed Scene has those independent rows, line endpoints, lifetime
|
||||
extents, hit identities, activation bounds and unanswered-call cue. Its real
|
||||
geometry remains equal after source round trip and an empty hook scope.
|
||||
2. Moving Create down60 changes its row to303 and propagates Call395/Delete487;
|
||||
the actual receiver lifetime, birth/death markers and activation follow. The
|
||||
preceding action's box stays fixed, line/row UUIDs stay stable, and the old
|
||||
birth point is no longer a lifecycle marker.
|
||||
3. Moving only Delete down48 changes death to475 and extends the same real
|
||||
activation to475, while Create and Call polylines stay fixed. Moving Create
|
||||
with an authored Delete request still at427 forces displayed death487; either
|
||||
signed-zero pointer delta preserves the entire latent map and Scene. Moving
|
||||
Create back restores baseline geometry and the original authored map.
|
||||
|
||||
Every test compares the entire accepted Project and source bundle against the
|
||||
original snapshot, and requires no dirty state or undo/redo history. No test
|
||||
weakens equality to just the occurrence list.
|
||||
|
||||
## Contract reused and limits
|
||||
|
||||
The inspected implementation builds lifecycle geometry after recording occurrence
|
||||
rows (`behavior.rs:1332–1344`), aligns Create/Delete messages through
|
||||
`scenario_lifecycle::render::Rendering::align_messages`, and constructs actual
|
||||
activation boxes through `activation_sequence`/`activation_segment`
|
||||
(`behavior.rs:1663–1734`). The latter intersects segments with `alive_spans` and
|
||||
keeps a cue when Delete terminates an unanswered call. Existing
|
||||
`scenario_lifecycle/render_tests.rs` tests real root birth/death alignment and
|
||||
branch-local activation clipping. This extension exercises those current
|
||||
contracts through the layout hook; it does not replace them.
|
||||
|
||||
The peer `8112dea` typed activation correction has a different future integration
|
||||
boundary and, as reported to this task, has no production lifecycle clipping yet.
|
||||
These tests are not evidence that that unmerged source is compatible. A future
|
||||
typed activation union needs its own tests for clipping, typed call/segment IDs,
|
||||
self/nested activation receive geometry, branch behavior, depth and paint order.
|
||||
Do not preserve a legacy width/classification assertion blindly when deliberately
|
||||
changing the activation representation; retain independent lifetime endpoints,
|
||||
identity and no-after-death expectations on the new actual records.
|
||||
|
||||
This extension remains uncompiled and unexecuted. It does not establish persisted
|
||||
layout syntax, a production drag transaction, undoable geometry edits, native
|
||||
pointer behavior, GPU painting, performance, or general upward/free positioning.
|
||||
The existing hook still applies a next-row floor. Root should run the existing
|
||||
`cargo test -p oa-desktop behavior_layout_scene_experiment -- --nocapture` gate
|
||||
on the exact identified wired source, then publish fixture, evaluator and result
|
||||
together. Remote peer machines cannot use workspace-local links.
|
||||
|
||||
Independent bounded source review confirmed the fixture ownership/endpoint contract and the numerical expectations above. Formatting and whitespace checks passed. Compilation and execution remain pending; these findings do not establish an editing transaction or native behavior.
|
||||
@@ -0,0 +1,259 @@
|
||||
//! Real current Scene/lifecycle evaluator, independent of the original fixture.
|
||||
//! No replacement activation geometry or future peer implementation is used.
|
||||
use super::*;
|
||||
use crate::document::Document;
|
||||
use oa_core::source_project::{ProjectLimits, SourceBundle};
|
||||
|
||||
fn lifetime_document() -> (Document, Id) {
|
||||
let source = include_str!("lifetime.arcadia");
|
||||
let parsed = language::parse(source).expect("separate lifetime source parses");
|
||||
let errors: Vec<_> = validation::validate(&parsed)
|
||||
.into_iter()
|
||||
.filter(|issue| issue.severity == validation::Severity::Error)
|
||||
.collect();
|
||||
assert!(
|
||||
errors.is_empty(),
|
||||
"lifetime fixture semantic errors: {errors:?}"
|
||||
);
|
||||
let owner = id(&parsed, "lifetime_conversation");
|
||||
let bundle = SourceBundle {
|
||||
entry: "lifetime.arcadia".into(),
|
||||
files: BTreeMap::from([("lifetime.arcadia".into(), source.into())]),
|
||||
};
|
||||
let document = Document::from_bundle(bundle.clone(), ProjectLimits::default())
|
||||
.expect("lifetime fixture is ordinarily admitted");
|
||||
assert_eq!(document.project(), &parsed);
|
||||
assert_eq!(document.bundle(), &bundle);
|
||||
assert_eq!(language::parse(&language::format(&parsed)).unwrap(), parsed);
|
||||
(document, owner)
|
||||
}
|
||||
|
||||
/// Numeric expectations are hand-derived current-Scene metrics, not proposed
|
||||
/// permanent spacing rules: Action95, message92, initial occurrence148.
|
||||
fn assert_lifetime_geometry(
|
||||
scene: &Scene,
|
||||
project: &Project,
|
||||
owner: Id,
|
||||
birth: f32,
|
||||
call_y: f32,
|
||||
death: f32,
|
||||
) {
|
||||
let requester = id(project, "requester");
|
||||
let provider = id(project, "provider");
|
||||
let create = id(project, "create_receiver");
|
||||
let call = id(project, "service_call");
|
||||
let delete = id(project, "delete_receiver");
|
||||
let left = scene.lanes[&requester];
|
||||
let right = scene.lanes[&provider];
|
||||
assert_eq!((left, right), (160., 400.));
|
||||
assert_eq!(row(scene, id(project, "before_birth")), 148.);
|
||||
assert_eq!(row(scene, create), birth);
|
||||
assert_eq!(row(scene, call), call_y);
|
||||
assert_eq!(row(scene, delete), death);
|
||||
assert!(
|
||||
birth > 148.,
|
||||
"receiver creation is delayed beyond the opening action"
|
||||
);
|
||||
assert_eq!(scene.rows[&create].0, owner);
|
||||
assert_eq!(scene.rows[&delete].0, owner);
|
||||
|
||||
// Exercise the actual Rendering bridge, including marker hit identity and
|
||||
// its clipping contract, rather than rebuilding lifetimes from our rows.
|
||||
let alive = scene
|
||||
.lifecycle
|
||||
.alive_spans(provider, owner, 85., scene.size.height - 20.);
|
||||
assert_eq!(
|
||||
alive
|
||||
.iter()
|
||||
.map(|span| (span.start, span.end))
|
||||
.collect::<Vec<_>>(),
|
||||
vec![(birth, death)]
|
||||
);
|
||||
assert!(
|
||||
scene
|
||||
.lifecycle
|
||||
.alive_spans(provider, owner, 85., birth)
|
||||
.is_empty()
|
||||
);
|
||||
assert!(
|
||||
scene
|
||||
.lifecycle
|
||||
.alive_spans(provider, owner, death, scene.size.height - 20.)
|
||||
.is_empty()
|
||||
);
|
||||
let sender_alive = scene
|
||||
.lifecycle
|
||||
.alive_spans(requester, owner, 85., scene.size.height - 20.);
|
||||
assert_eq!(
|
||||
sender_alive
|
||||
.iter()
|
||||
.map(|span| (span.start, span.end))
|
||||
.collect::<Vec<_>>(),
|
||||
vec![(85., scene.size.height - 20.)]
|
||||
);
|
||||
assert_eq!(
|
||||
scene.lifecycle.marker_at(Point::new(right, birth)),
|
||||
Some(create)
|
||||
);
|
||||
assert_eq!(
|
||||
scene.lifecycle.marker_at(Point::new(right, death)),
|
||||
Some(delete)
|
||||
);
|
||||
assert_eq!(scene.hit(Point::new(right, birth)), Some(create));
|
||||
assert_eq!(scene.hit(Point::new(right, death)), Some(delete));
|
||||
assert_eq!(
|
||||
line(scene, create).points,
|
||||
vec![Point::new(left, birth), Point::new(right - 70., birth)]
|
||||
);
|
||||
assert_eq!(
|
||||
line(scene, call).points,
|
||||
vec![Point::new(left, call_y), Point::new(right, call_y)]
|
||||
);
|
||||
assert_eq!(
|
||||
line(scene, delete).points,
|
||||
vec![Point::new(left, death), Point::new(right, death)]
|
||||
);
|
||||
assert!(line(scene, create).label_at.y + 22. < birth - 14.);
|
||||
|
||||
// Inspect actual activation boxes produced by Scene::activation_sequence.
|
||||
// A correlated Reply is absent, so death must clip the bar, not close the
|
||||
// semantic call. Do not accept a new generic minimum-height tail after death.
|
||||
let bars: Vec<_> = scene
|
||||
.boxes
|
||||
.iter()
|
||||
.filter(|item| item.id == call && item.title.is_empty())
|
||||
.collect();
|
||||
assert_eq!(bars.len(), 1);
|
||||
assert_eq!(
|
||||
bars[0].rect,
|
||||
Rectangle::new(
|
||||
Point::new(right - 4., call_y),
|
||||
Size::new(8., death - call_y)
|
||||
)
|
||||
);
|
||||
assert_eq!(bars[0].rect.y + bars[0].rect.height, death);
|
||||
assert!(
|
||||
bars.iter()
|
||||
.all(|item| item.rect.y >= birth && item.rect.y + item.rect.height <= death)
|
||||
);
|
||||
assert_eq!(scene.open_calls, vec![Point::new(right + 12., death - 16.)]);
|
||||
assert!(!project.elements.values().any(|element| matches!(
|
||||
element.shared(),
|
||||
Some(SharedBody::Occurrence {
|
||||
body: OccurrenceBody::Exchange {
|
||||
message_kind: MessageKind::Reply,
|
||||
..
|
||||
},
|
||||
..
|
||||
})
|
||||
)));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn delayed_create_call_and_delete_have_real_lifetime_markers_and_exact_clipped_activation() {
|
||||
let (document, owner) = lifetime_document();
|
||||
let before = document.snapshot();
|
||||
let source = document.bundle().clone();
|
||||
let scene = Scene::sequence(document.project(), owner, owner);
|
||||
assert_lifetime_geometry(&scene, document.project(), owner, 243., 335., 427.);
|
||||
assert_eq!(scene.size.height, 564.);
|
||||
assert_eq!(scene.sequence_bounds[&owner], (106., 477.));
|
||||
same_geometry(&scene, &render(document.project(), owner, &Layout::new()));
|
||||
let reparsed = language::parse(&language::format(document.project())).unwrap();
|
||||
same_geometry(&scene, &Scene::sequence(&reparsed, owner, owner));
|
||||
assert_eq!(document.project(), &before.decoded.project);
|
||||
assert_eq!(document.bundle(), &source);
|
||||
assert!(!document.dirty() && !document.can_undo() && !document.can_redo());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn moving_create_moves_real_lifetime_and_followers_without_changing_semantics_or_source() {
|
||||
let (document, owner) = lifetime_document();
|
||||
let before = document.snapshot();
|
||||
let source = document.bundle().clone();
|
||||
let p = document.project();
|
||||
let create = id(p, "create_receiver");
|
||||
let provider = id(p, "provider");
|
||||
let baseline = Scene::sequence(p, owner, owner);
|
||||
let layout = drag(&Layout::new(), &baseline, create, 60.);
|
||||
assert_eq!(layout, Layout::from([(create, 303.)]));
|
||||
let moved = render(p, owner, &layout);
|
||||
assert_lifetime_geometry(&moved, p, owner, 303., 395., 487.);
|
||||
assert_eq!(moved.size.height, 624.);
|
||||
assert_eq!(
|
||||
moved
|
||||
.lifecycle
|
||||
.marker_at(Point::new(moved.lanes[&provider], 243.)),
|
||||
None
|
||||
);
|
||||
assert_eq!(
|
||||
named_box(&moved, id(p, "before_birth")).rect,
|
||||
named_box(&baseline, id(p, "before_birth")).rect
|
||||
);
|
||||
assert_eq!(
|
||||
moved.rows.keys().collect::<Vec<_>>(),
|
||||
baseline.rows.keys().collect::<Vec<_>>()
|
||||
);
|
||||
assert_eq!(
|
||||
moved.lines.iter().map(|line| line.id).collect::<Vec<_>>(),
|
||||
baseline
|
||||
.lines
|
||||
.iter()
|
||||
.map(|line| line.id)
|
||||
.collect::<Vec<_>>()
|
||||
);
|
||||
let reparsed = language::parse(&language::format(p)).unwrap();
|
||||
same_geometry(&moved, &render(&reparsed, owner, &layout));
|
||||
assert_eq!(p, &before.decoded.project);
|
||||
assert_eq!(document.bundle(), &source);
|
||||
assert!(!document.dirty() && !document.can_undo() && !document.can_redo());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn moving_delete_extends_only_to_actual_death_and_zero_motion_preserves_latent_lifetime_intent() {
|
||||
let (document, owner) = lifetime_document();
|
||||
let before = document.snapshot();
|
||||
let source = document.bundle().clone();
|
||||
let p = document.project();
|
||||
let create = id(p, "create_receiver");
|
||||
let delete = id(p, "delete_receiver");
|
||||
let provider = id(p, "provider");
|
||||
let baseline = Scene::sequence(p, owner, owner);
|
||||
let later_delete = drag(&Layout::new(), &baseline, delete, 48.);
|
||||
let extended = render(p, owner, &later_delete);
|
||||
assert_lifetime_geometry(&extended, p, owner, 243., 335., 475.);
|
||||
assert_eq!(extended.size.height, 612.);
|
||||
assert_eq!(
|
||||
extended
|
||||
.lifecycle
|
||||
.marker_at(Point::new(extended.lanes[&provider], 427.)),
|
||||
None
|
||||
);
|
||||
assert_eq!(
|
||||
line(&extended, create).points,
|
||||
line(&baseline, create).points
|
||||
);
|
||||
assert_eq!(
|
||||
line(&extended, id(p, "service_call")).points,
|
||||
line(&baseline, id(p, "service_call")).points
|
||||
);
|
||||
|
||||
// Create displacement forces the displayed death to487 while its authored
|
||||
// request stays427. Both signed zero deltas must preserve that latent value.
|
||||
let original = Layout::from([(create, 243.), (delete, 427.)]);
|
||||
let displaced = drag(&original, &baseline, create, 60.);
|
||||
let frame = render(p, owner, &displaced);
|
||||
assert_lifetime_geometry(&frame, p, owner, 303., 395., 487.);
|
||||
assert_eq!(displaced[&delete], 427.);
|
||||
for delta in [0., -0.] {
|
||||
let untouched = drag(&displaced, &frame, delete, delta);
|
||||
assert_eq!(untouched, displaced);
|
||||
same_geometry(&frame, &render(p, owner, &untouched));
|
||||
let restored = drag(&untouched, &frame, create, -60.);
|
||||
assert_eq!(restored, original);
|
||||
same_geometry(&baseline, &render(p, owner, &restored));
|
||||
}
|
||||
assert_eq!(p, &before.decoded.project);
|
||||
assert_eq!(document.bundle(), &source);
|
||||
assert!(!document.dirty() && !document.can_undo() && !document.can_redo());
|
||||
}
|
||||
@@ -0,0 +1,345 @@
|
||||
//! Isolated test-only adapter. See README.md and wiring.patch before running.
|
||||
//! It drives the actual parent Scene; it contains no replacement geometry model.
|
||||
use super::*;
|
||||
use oa_core::{language, validation};
|
||||
use std::cell::RefCell;
|
||||
|
||||
mod lifetime;
|
||||
|
||||
type Layout = BTreeMap<Id, f32>;
|
||||
|
||||
thread_local! {
|
||||
static ANCHORS: RefCell<Option<Layout>> = const { RefCell::new(None) };
|
||||
}
|
||||
|
||||
struct AnchorScope(Option<Layout>);
|
||||
impl AnchorScope {
|
||||
fn install(layout: &Layout) -> Self {
|
||||
Self(ANCHORS.with(|slot| slot.replace(Some(layout.clone()))))
|
||||
}
|
||||
}
|
||||
impl Drop for AnchorScope {
|
||||
fn drop(&mut self) {
|
||||
ANCHORS.with(|slot| {
|
||||
slot.replace(self.0.take());
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/// Called only by the proposed cfg(test) row hook, before Scene records rows.
|
||||
/// Retains the CURRENT renderer's next-row floor; this is not general free y.
|
||||
pub(super) fn resolve_row_anchor(id: Id, y: &mut f32) {
|
||||
ANCHORS.with(|slot| {
|
||||
if let Some(desired) = slot.borrow().as_ref().and_then(|map| map.get(&id)) {
|
||||
assert!(desired.is_finite());
|
||||
*y = (*y).max(*desired);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
fn render(project: &Project, owner: Id, layout: &Layout) -> Scene {
|
||||
let _scope = AnchorScope::install(layout);
|
||||
Scene::sequence(project, owner, owner)
|
||||
}
|
||||
|
||||
/// Pointer intent differs from explicit SetDesiredY: zero displacement preserves
|
||||
/// the complete original authored candidate even when desired != displayed.
|
||||
fn drag(original: &Layout, frame: &Scene, target: Id, delta_y: f32) -> Layout {
|
||||
assert!(delta_y.is_finite());
|
||||
if delta_y == 0. {
|
||||
return original.clone();
|
||||
}
|
||||
let mut next = original.clone();
|
||||
next.insert(target, frame.rows[&target].1 + delta_y);
|
||||
next
|
||||
}
|
||||
|
||||
fn id(p: &Project, alias: &str) -> Id {
|
||||
p.identities()
|
||||
.into_iter()
|
||||
.find(|(_, name)| *name == alias)
|
||||
.unwrap()
|
||||
.0
|
||||
}
|
||||
|
||||
fn fixture() -> (Project, Id) {
|
||||
let p = language::parse(include_str!("fixture.arcadia")).expect("real Arcadia fixture parses");
|
||||
let errors: Vec<_> = validation::validate(&p)
|
||||
.into_iter()
|
||||
.filter(|issue| issue.severity == validation::Severity::Error)
|
||||
.collect();
|
||||
assert!(errors.is_empty(), "fixture semantic errors: {errors:?}");
|
||||
let owner = id(&p, "conversation");
|
||||
(p, owner)
|
||||
}
|
||||
|
||||
fn row(scene: &Scene, id: Id) -> f32 {
|
||||
scene.rows[&id].1
|
||||
}
|
||||
fn line(scene: &Scene, id: Id) -> &Line {
|
||||
assert_eq!(scene.lines.iter().filter(|line| line.id == id).count(), 1);
|
||||
scene.lines.iter().find(|line| line.id == id).unwrap()
|
||||
}
|
||||
fn named_box(scene: &Scene, id: Id) -> &BoxItem {
|
||||
scene
|
||||
.boxes
|
||||
.iter()
|
||||
.find(|item| item.id == id && !item.title.is_empty())
|
||||
.unwrap()
|
||||
}
|
||||
fn same_geometry(a: &Scene, b: &Scene) {
|
||||
assert_eq!(a.rows, b.rows);
|
||||
assert_eq!(a.sequence_bounds, b.sequence_bounds);
|
||||
assert_eq!(a.size, b.size);
|
||||
assert_eq!(a.lanes, b.lanes);
|
||||
assert_eq!(a.lifecycle, b.lifecycle);
|
||||
assert_eq!(a.open_calls, b.open_calls);
|
||||
let lines = |s: &Scene| {
|
||||
s.lines
|
||||
.iter()
|
||||
.map(|l| {
|
||||
(
|
||||
l.id,
|
||||
l.points.clone(),
|
||||
l.label_at,
|
||||
l.label.clone(),
|
||||
l.dashed,
|
||||
)
|
||||
})
|
||||
.collect::<Vec<_>>()
|
||||
};
|
||||
let boxes = |s: &Scene| {
|
||||
s.boxes
|
||||
.iter()
|
||||
.map(|b| (b.id, b.rect, b.title.clone(), b.detail.clone(), b.marker))
|
||||
.collect::<Vec<_>>()
|
||||
};
|
||||
assert_eq!(lines(a), lines(b));
|
||||
assert_eq!(boxes(a), boxes(b));
|
||||
let slots = |s: &Scene| {
|
||||
s.slots
|
||||
.iter()
|
||||
.map(|s| (s.slot.parent, s.slot.before, s.y, s.label.clone()))
|
||||
.collect::<Vec<_>>()
|
||||
};
|
||||
assert_eq!(slots(a), slots(b));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn real_parser_roundtrip_and_baseline_scene_have_independent_expected_anchors() {
|
||||
let (p, owner) = fixture();
|
||||
let before = p.clone();
|
||||
let source = language::format(&p);
|
||||
let reparsed = language::parse(&source).unwrap();
|
||||
assert_eq!(reparsed, p);
|
||||
let baseline = Scene::sequence(&p, owner, owner);
|
||||
same_geometry(&baseline, &render(&p, owner, &Layout::new()));
|
||||
same_geometry(&baseline, &Scene::sequence(&reparsed, owner, owner));
|
||||
let first = id(&p, "first");
|
||||
let second = id(&p, "second");
|
||||
assert_ne!(first, second);
|
||||
for occurrence in [first, second] {
|
||||
assert!(matches!(p.elements[&occurrence].shared(),
|
||||
Some(SharedBody::Occurrence { body: OccurrenceBody::Exchange { exchange: Some(edge), .. }, .. })
|
||||
if *edge == id(&p, "channel")));
|
||||
}
|
||||
// Hand-derived current metrics: start148, each message92, fragment55,
|
||||
// operand90, action95, fragment trailing64. These are regression oracles,
|
||||
// NOT a claim that those fixed spacings should remain product constraints.
|
||||
for (alias, expected) in [
|
||||
("first", 148.),
|
||||
("second", 240.),
|
||||
("fragment", 332.),
|
||||
("nested", 477.),
|
||||
("self_call", 636.),
|
||||
("self_reply", 728.),
|
||||
] {
|
||||
assert_eq!(row(&baseline, id(&p, alias)), expected, "{alias}");
|
||||
}
|
||||
assert_eq!(baseline.rows[&id(&p, "nested")].0, id(&p, "operand"));
|
||||
assert_eq!(named_box(&baseline, id(&p, "nested")).rect.y, 457.);
|
||||
let frame = named_box(&baseline, id(&p, "fragment")).rect;
|
||||
assert_eq!((frame.y, frame.height), (332., 240.));
|
||||
let left = baseline.lanes[&id(&p, "left")];
|
||||
let right = baseline.lanes[&id(&p, "right")];
|
||||
assert_eq!(
|
||||
line(&baseline, first).points,
|
||||
vec![Point::new(left, 148.), Point::new(right, 148.)]
|
||||
);
|
||||
assert_eq!(
|
||||
line(&baseline, second).points,
|
||||
vec![Point::new(left, 240.), Point::new(right, 240.)]
|
||||
);
|
||||
let local = line(&baseline, id(&p, "self_call"));
|
||||
assert_eq!(
|
||||
local.points,
|
||||
vec![
|
||||
Point::new(right, 636.),
|
||||
Point::new(right + 75., 636.),
|
||||
Point::new(right + 75., 660.),
|
||||
Point::new(right, 660.)
|
||||
]
|
||||
);
|
||||
assert_eq!(p, before);
|
||||
assert_eq!(language::format(&p), source);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn moved_repeat_drives_actual_scene_followers_frames_and_self_message_without_semantic_edits() {
|
||||
let (p, owner) = fixture();
|
||||
let before = p.clone();
|
||||
let source = language::format(&p);
|
||||
let baseline = Scene::sequence(&p, owner, owner);
|
||||
let second = id(&p, "second");
|
||||
let candidate = drag(&Layout::new(), &baseline, second, 40.);
|
||||
assert_eq!(candidate, Layout::from([(second, 280.)]));
|
||||
let moved = render(&p, owner, &candidate);
|
||||
assert_eq!(row(&moved, id(&p, "first")), 148.);
|
||||
assert_eq!(row(&moved, second), 280.);
|
||||
assert_eq!(row(&moved, id(&p, "nested")), 517.);
|
||||
assert_eq!(row(&moved, id(&p, "self_call")), 676.);
|
||||
assert_eq!(row(&moved, id(&p, "self_reply")), 768.);
|
||||
assert_eq!(
|
||||
line(&moved, id(&p, "first")).points,
|
||||
line(&baseline, id(&p, "first")).points
|
||||
);
|
||||
for alias in ["second", "self_call", "self_reply"] {
|
||||
assert_eq!(
|
||||
line(&moved, id(&p, alias)).points.len(),
|
||||
line(&baseline, id(&p, alias)).points.len()
|
||||
);
|
||||
for (old, new) in line(&baseline, id(&p, alias))
|
||||
.points
|
||||
.iter()
|
||||
.zip(&line(&moved, id(&p, alias)).points)
|
||||
{
|
||||
assert_eq!(new.x, old.x);
|
||||
assert_eq!(new.y - old.y, 40.);
|
||||
}
|
||||
}
|
||||
let frame = named_box(&moved, id(&p, "fragment")).rect;
|
||||
assert_eq!((frame.y, frame.height), (372., 240.));
|
||||
assert_eq!(named_box(&moved, id(&p, "nested")).rect.y, 497.);
|
||||
same_geometry(&moved, &render(&p, owner, &candidate));
|
||||
same_geometry(
|
||||
&moved,
|
||||
&render(&language::parse(&source).unwrap(), owner, &candidate),
|
||||
);
|
||||
assert_eq!(p, before); // Entire Project, not only the steps vector.
|
||||
assert_eq!(language::format(&p), source);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn nested_anchor_grows_actual_fragment_and_self_call_keeps_its_receive_offset() {
|
||||
let (p, owner) = fixture();
|
||||
let before = p.clone();
|
||||
let baseline = Scene::sequence(&p, owner, owner);
|
||||
let nested = id(&p, "nested");
|
||||
let candidate = drag(&Layout::new(), &baseline, nested, 30.);
|
||||
let moved = render(&p, owner, &candidate);
|
||||
let frame = named_box(&moved, id(&p, "fragment")).rect;
|
||||
assert_eq!((frame.y, frame.height), (332., 270.));
|
||||
assert_eq!(named_box(&moved, nested).rect.y, 487.);
|
||||
assert_eq!(row(&moved, id(&p, "self_call")), 666.);
|
||||
let call = id(&p, "self_call");
|
||||
let next = drag(&candidate, &moved, call, 18.);
|
||||
let local = render(&p, owner, &next);
|
||||
assert_eq!(row(&local, call), 684.);
|
||||
assert_eq!(line(&local, call).points.first().unwrap().y, 684.);
|
||||
assert_eq!(line(&local, call).points.last().unwrap().y, 708.);
|
||||
assert_eq!(row(&local, id(&p, "self_reply")), 776.);
|
||||
assert_eq!(
|
||||
named_box(&local, nested).rect,
|
||||
named_box(&moved, nested).rect
|
||||
);
|
||||
assert_eq!(p, before);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn zero_pointer_delta_preserves_latent_authored_intent_but_explicit_assignment_can_change_it() {
|
||||
let (p, owner) = fixture();
|
||||
let baseline = Scene::sequence(&p, owner, owner);
|
||||
let first = id(&p, "first");
|
||||
let second = id(&p, "second");
|
||||
let original = Layout::from([(first, 148.), (second, 240.)]);
|
||||
let displaced = drag(&original, &baseline, first, 200.);
|
||||
let frame = render(&p, owner, &displaced);
|
||||
assert_eq!(row(&frame, second), 440.);
|
||||
assert_eq!(displaced[&second], 240.);
|
||||
let untouched = drag(&displaced, &frame, second, 0.);
|
||||
assert_eq!(untouched, displaced);
|
||||
let back = drag(&untouched, &frame, first, -200.);
|
||||
assert_eq!(back, original);
|
||||
assert_eq!(row(&render(&p, owner, &back), second), 240.);
|
||||
let mut explicit = displaced.clone();
|
||||
explicit.insert(second, 440.); // Explicit SetDesiredY, not a pointer gesture.
|
||||
let explicit_back = drag(&explicit, &frame, first, -200.);
|
||||
assert_eq!(row(&render(&p, owner, &explicit_back), second), 440.);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn source_reorder_keeps_override_bound_to_occurrence_identity_and_does_not_write_back_projection() {
|
||||
let (p, owner) = fixture();
|
||||
let input = include_str!("fixture.arcadia");
|
||||
let reordered_source =
|
||||
input.replace("[@first, @second, @fragment", "[@second, @first, @fragment");
|
||||
assert_ne!(input, reordered_source);
|
||||
let reordered = language::parse(&reordered_source).unwrap();
|
||||
let before = reordered.clone();
|
||||
let second = id(&p, "second");
|
||||
let first = id(&p, "first");
|
||||
assert_eq!(id(&reordered, "second"), second);
|
||||
let scene = render(&reordered, owner, &Layout::from([(second, 280.)]));
|
||||
assert_eq!(row(&scene, second), 280.);
|
||||
assert_eq!(row(&scene, first), 372.);
|
||||
assert_eq!(
|
||||
&reordered.elements[&owner].steps().unwrap()[..2],
|
||||
&[second, first]
|
||||
);
|
||||
assert_eq!(reordered, before);
|
||||
assert_eq!(
|
||||
language::parse(&language::format(&reordered)).unwrap(),
|
||||
before
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn current_floor_is_an_explicit_counterexample_to_general_free_positioning() {
|
||||
let (p, owner) = fixture();
|
||||
let baseline = Scene::sequence(&p, owner, owner);
|
||||
let second = id(&p, "second");
|
||||
let requested = drag(&Layout::new(), &baseline, second, -40.);
|
||||
assert_eq!(requested[&second], 200.);
|
||||
assert_eq!(row(&render(&p, owner, &requested), second), 240.);
|
||||
// This expected mismatch records a limitation; it is not acceptance of
|
||||
// silently clamped product gestures or proof that y200 is semantically bad.
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn scoped_hook_is_inactive_by_default_thread_local_and_restored_after_panic() {
|
||||
let (p, owner) = fixture();
|
||||
let first = id(&p, "first");
|
||||
let baseline = Scene::sequence(&p, owner, owner);
|
||||
let caught = std::panic::catch_unwind(|| {
|
||||
let _scope = AnchorScope::install(&Layout::from([(first, 900.)]));
|
||||
assert_eq!(row(&Scene::sequence(&p, owner, owner), first), 900.);
|
||||
// Another test thread has no access to this thread's temporary anchors.
|
||||
std::thread::spawn(|| {
|
||||
let (p, owner) = fixture();
|
||||
assert_eq!(
|
||||
row(&Scene::sequence(&p, owner, owner), id(&p, "first")),
|
||||
148.
|
||||
);
|
||||
})
|
||||
.join()
|
||||
.unwrap();
|
||||
panic!("exercise scoped restoration");
|
||||
});
|
||||
let payload = caught.expect_err("the deliberate scope-restoration panic must occur");
|
||||
assert_eq!(
|
||||
payload.downcast_ref::<&str>().copied(),
|
||||
Some("exercise scoped restoration"),
|
||||
"an earlier failed assertion must not masquerade as the expected panic"
|
||||
);
|
||||
same_geometry(&baseline, &Scene::sequence(&p, owner, owner));
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
diff --git a/crates/oa-desktop/src/behavior.rs b/crates/oa-desktop/src/behavior.rs
|
||||
--- a/crates/oa-desktop/src/behavior.rs
|
||||
+++ b/crates/oa-desktop/src/behavior.rs
|
||||
@@ -1120,1 +1120,5 @@
|
||||
+#[cfg(test)]
|
||||
+#[path = "../../../harness/experiments/behavior-layout-scene-20260912/mod.rs"]
|
||||
+mod behavior_layout_scene_experiment;
|
||||
+
|
||||
struct BoxItem {
|
||||
@@ -1446,2 +1450,4 @@
|
||||
+ #[cfg(test)]
|
||||
+ behavior_layout_scene_experiment::resolve_row_anchor(*id, y);
|
||||
if ordered {
|
||||
let slot = scenario::Slot {
|
||||
@@ -0,0 +1 @@
|
||||
* -text -whitespace
|
||||
|
After Width: | Height: | Size: 116 KiB |
|
After Width: | Height: | Size: 118 KiB |
@@ -0,0 +1,15 @@
|
||||
# Capella scenario occurrence editing observation
|
||||
|
||||
Observed 2026-09-13 on the installed Capella 7.1.0 Windows distribution, existing local IncidentScenarioBenchmark comparison workspace, [OAS] OperationalCapability 1. This is direct Computer Use observation of this fixture/window only.
|
||||
|
||||
The app initially remained at its workspace launcher. After Launch, the launcher disappeared; activation and one window-list request timed out during startup. A fresh window list and activation then reached the existing scenario. This supersedes the earlier assumption that capture remained unavailable, not its recorded historical failures.
|
||||
|
||||
At a 1010 by 761 captured window, the diagram has two Operational Activity lifelines and an asynchronous Report incident. Single click on the message selects the Sequence Message occurrence and exposes Name, Summary, Invoked Interaction, Exchanged Items and kind through the Properties pane. Name and Invoked Interaction both display Report incident in this fixture but are distinct fields. The bottom pane initially exposes only Name and Summary; remaining controls require scrolling.
|
||||
|
||||
Double-click on the message label opened a Properties dialog with Name and Summary, linked Invoked Interaction, Exchanged Items, Sequence Message Kind, and Exchange Context. The kind choices were visibly disabled with ASYNCHRONOUS_CALL selected. No text was entered; Cancel returned to the selected occurrence. This does not prove editing/commit semantics or why kinds are disabled.
|
||||
|
||||
The preserved image pair shows a reversible selection-induced layout shift without changing the outer window: selected message uses two toolbar rows and its horizontal line is at approximately y334; background/diagram selection removes a toolbar row and the same line moves to approximately y304. Headers and viewport move with it. The two activity names also wrap in the diagram while the pinned header labels are ellipsized. These are observed pixel/layout facts, not authored coordinate changes or a benchmark of all Capella layouts.
|
||||
|
||||
Product implications: preserve direct, discoverable occurrence editing and explicit separation from referenced interaction identity; keep the canvas bounds stable when selection-specific actions appear. Compare Studio using its real editable inspector and actual selection route. Avoid making additional panels a prerequisite for basic edits, while keeping independently selected model records intact during view changes. Existing Studio mounted layout/selection tests support these intentions; current native Studio validation remains required.
|
||||
|
||||
Evidence: message-selected.jpg (after dialog Cancel), diagram-selected.jpg (after background click), selection-metadata.json. No deletion, Name edit, Save or model mutation was attempted. Screenshots were preserved as audit artifacts, not re-read to drive inputs.
|
||||
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"at": "2026-09-13T13:52:48.792Z",
|
||||
"window": {
|
||||
"app": "process:C:\\Users\\User\\capella-7.1.0.202606231255-win32-win32-x86_64\\capella\\capella.exe",
|
||||
"id": 721620,
|
||||
"title": "capella-layout-benchmark-20260912 - platform:/resource/IncidentScenarioBenchmark/IncidentScenarioBenchmark.aird/[OAS] OperationalCapability 1 - Capella"
|
||||
},
|
||||
"screenshot": {
|
||||
"id": "screenshot-0",
|
||||
"width": 1010,
|
||||
"height": 761,
|
||||
"originX": 241,
|
||||
"originY": 227
|
||||
},
|
||||
"scope": "Selected Report incident after opening and cancelling Properties; no text entered or model edits saved."
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
* -text -whitespace
|
||||
@@ -0,0 +1,42 @@
|
||||
# Native Capella Scenario spacing observation
|
||||
|
||||
A bounded primary observation in Capella **7.1.0.202606231255** on Windows, using isolated workspace capella-layout-benchmark-20260912 and project IncidentScenarioBenchmark. The parent integration session performed the authorized Computer/Sky interactions and reports closing Capella normally afterward. This archive's independent reviewer inspected the saved screenshots and files; the reviewer did not perform native input. [observations.json](original/observations.json) retains the operator's actions, timestamps and capture recovery notes.
|
||||
|
||||
Scope: one Operational Analysis scenario, two activity lifelines and one interaction. This does not establish chronology-crossing/reordering behavior, activation nesting, or a general Capella gesture policy.
|
||||
|
||||
## Observed workflow
|
||||
|
||||
| Evidence | Observed result |
|
||||
| --- | --- |
|
||||
| [01 empty scenario](original/01-empty-scenario.jpg), [02 lifeline](original/02-created-lifeline.jpg), [03 interaction choice](original/03-interaction-choice.jpg), [04 message](original/04-created-message.jpg) | Created two activity lifelines and one Report incident interaction. Completing the pending interaction used an endpoint click and the Create a new Interaction choice. |
|
||||
| [05 body drag](original/05-body-drag-no-visible-change.jpg), [06 selected body drag](original/06-selected-body-drag-no-visible-change.jpg) | Two arrow-body drag attempts produced no visible movement, including the attempt after selecting Sequence Message. This does not prove that Capella never supports body movement. |
|
||||
| [07 receiver execution drag](original/07-execution-drag-moves-message.jpg) | Dragging the small receiver execution down 79 pixels moved the whole horizontal message from screen y334 to y413, with its receiver execution. |
|
||||
| [08 lifeline header drag](original/08-lifeline-header-drag.jpg) | Moving the left header from screen x430 to x510 moved that lifeline and its attached message endpoint 80 pixels. |
|
||||
| [09 first Undo](original/09-undo-lifeline.jpg) | One Undo restored the left lifeline to x430 while the message remained at y413. |
|
||||
| [10 second Undo](original/10-undo-message.jpg) | The next Undo restored the message to y334. After Save, both captured files exactly matched the baseline. |
|
||||
|
||||
The operator recorded two capture timeouts: after the first activity placement and after the initial interaction drag. Each was recovered by selecting the returned window afresh and taking another screenshot; the input was not repeated. These failures/recoveries are preserved in observations.json rather than omitted or treated as extra interactions.
|
||||
|
||||
## Saved-file comparison
|
||||
|
||||
[Before .capella](original/before-drag-IncidentScenarioBenchmark.capella), [after receiver-drag .capella](original/after-drag-IncidentScenarioBenchmark.capella), and [restored .capella](original/restored-IncidentScenarioBenchmark.capella) are byte-identical: 26,594 bytes, SHA-256 d8764060c6f3d11ddf24a91e20955fe035725cfe35019fdd514688d07118c056. Thus this saved move did not alter the captured semantic model file.
|
||||
|
||||
The [before .aird](original/before-drag-IncidentScenarioBenchmark.aird) and [after receiver-drag .aird](original/after-drag-IncidentScenarioBenchmark.aird) differ on exactly five lines, with no line insertion/deletion:
|
||||
|
||||
| Before-file line | Field change | Interpretation |
|
||||
| --- | --- | --- |
|
||||
| 11 | representation changeId changed | Presentation revision metadata. |
|
||||
| 100 | receiver execution notation bounds y53→132 | +79 vertical placement; width/height unchanged. |
|
||||
| 125 | message relative bendpoint y offsets 0→79 | Both ends of the existing horizontal path moved vertically. |
|
||||
| 183 | receiver execution absolute-bounds y153→232 | +79 corresponding presentation filter. |
|
||||
| 205 | SequenceMessage absolute-bounds y153→232 | +79 corresponding message filter. |
|
||||
|
||||
Object references identify the changed execution and Report incident SequenceMessage; [manifest.json](manifest.json) preserves the exact five before/after lines. This is a presentation-file change for the recorded receiver-execution move. No separate saved snapshot was taken after the horizontal header move, so its isolated serialized delta is not claimed.
|
||||
|
||||
After both Undos and Save, [restored .aird](original/restored-IncidentScenarioBenchmark.aird) equals before byte-for-byte: 29,469 bytes, SHA-256 c24db589f3a551b8ea0f8d00d2dc6729909157e2a3ac4ebc0ca69cd141393c89. The two separate visible Undo steps and complete saved restoration support the observed local history behavior.
|
||||
|
||||
## Integrity and implication
|
||||
|
||||
All 27 original evidence artifacts are preserved without content changes: ten screenshots, their ten metadata files, observations and six source snapshots. The screenshots were originally named .png but contain JPEG/JFIF bytes. Published names use .jpg with explicit originalName→path mapping in manifest.json; no transcoding or duplicate image copies occurred. All ten metadata SHA-256 values and encoded 1010×761 dimensions were independently verified. The manifest includes every artifact's byte length, SHA-256 and Git blob SHA-1; local -text attributes preserve source line endings.
|
||||
|
||||
This evidence supports separating view-local message/lifeline spacing from shared semantics for this simple case. A Studio gesture should make its target discoverable and separately verify preview/commit equality and one-step Undo. Those are design implications, not Capella-wide behavior or Studio implementation acceptance. The archive is observation evidence, not a packaged benchmark project or native Studio test.
|
||||
@@ -0,0 +1,325 @@
|
||||
{
|
||||
"archiveBase": "c455b7ce9d2661405623efaeb0c958df8b701b07",
|
||||
"originalDirectory": "C:/Users/User/Documents/Git/ARCADIA-Studio/.local/capella-scenario-observations-20260913/",
|
||||
"archivedAtUtc": "2026-09-13T07:37:51.328Z",
|
||||
"operator": "Parent integration session using authorized native Computer/Sky input",
|
||||
"verifier": "Independent delegated file/screenshot review; no native input by verifier",
|
||||
"files": [
|
||||
{
|
||||
"path": "original/01-empty-scenario.json",
|
||||
"bytes": 499,
|
||||
"sha256": "43159a7fd3520cbbcf80f1ddda58f664c386cbe3cb655eb11c1c1e418098506c",
|
||||
"gitBlob": "281063cf77818a44471a0e481ee43a9cc601d3df",
|
||||
"originalName": "01-empty-scenario.json"
|
||||
},
|
||||
{
|
||||
"path": "original/01-empty-scenario.jpg",
|
||||
"bytes": 107441,
|
||||
"sha256": "f46a6733ec53b4f66f2d5e4b5f7c9e0c5629cd37b2af259ca2a74fb3177b7ba3",
|
||||
"gitBlob": "28e4c1d21357c660b6758b623df123590f6cf779",
|
||||
"originalName": "01-empty-scenario.png"
|
||||
},
|
||||
{
|
||||
"path": "original/02-created-lifeline.json",
|
||||
"bytes": 501,
|
||||
"sha256": "14feb26700cc2da4d550282a63d0746d4946ef4486d2d37ab736906b0f92362e",
|
||||
"gitBlob": "57319d6ce83873961f489e2629e8b51d7963d062",
|
||||
"originalName": "02-created-lifeline.json"
|
||||
},
|
||||
{
|
||||
"path": "original/02-created-lifeline.jpg",
|
||||
"bytes": 115651,
|
||||
"sha256": "da13419030b07775278c3acddbf469e87a0c381e78dd94f1447fcbd4b75de924",
|
||||
"gitBlob": "8dd247d7d32fa4763ee73f2fad0855c27bbaf6cf",
|
||||
"originalName": "02-created-lifeline.png"
|
||||
},
|
||||
{
|
||||
"path": "original/03-interaction-choice.json",
|
||||
"bytes": 503,
|
||||
"sha256": "96034dfd04ee85b5cde18cb721a545c3a7ee07e7766b9458a881563261db7f3a",
|
||||
"gitBlob": "e0e973cdafbed5f014252d404f32018746c1f5d2",
|
||||
"originalName": "03-interaction-choice.json"
|
||||
},
|
||||
{
|
||||
"path": "original/03-interaction-choice.jpg",
|
||||
"bytes": 97642,
|
||||
"sha256": "707eab6ca03201a13464c5de7d64db341732b294ef7da7d436d4296869ea0694",
|
||||
"gitBlob": "1c80d094f251d43d149a9b075fa0d19c01a31246",
|
||||
"originalName": "03-interaction-choice.png"
|
||||
},
|
||||
{
|
||||
"path": "original/04-created-message.json",
|
||||
"bytes": 500,
|
||||
"sha256": "8cb596f0bd65538178e9603cf5192c6e8d1908c31a00a731544c5447bf5a5328",
|
||||
"gitBlob": "57521cd89a4d1ec84f1c7c734420360d3becda5f",
|
||||
"originalName": "04-created-message.json"
|
||||
},
|
||||
{
|
||||
"path": "original/04-created-message.jpg",
|
||||
"bytes": 122062,
|
||||
"sha256": "d88df97283a09248f44ce4e5576ac875e0e2f9a73940b0178c47896c7bcca324",
|
||||
"gitBlob": "61db004259b11a1bed6c99661ce9f4c5a2615cbf",
|
||||
"originalName": "04-created-message.png"
|
||||
},
|
||||
{
|
||||
"path": "original/05-body-drag-no-visible-change.json",
|
||||
"bytes": 512,
|
||||
"sha256": "3af19909f8f9728d77fc5bf8c9df8722571378c1a2bd9cfc045e037549cd6e09",
|
||||
"gitBlob": "bf05858c3ad54fd51c8128ee0e4b1de642c185ef",
|
||||
"originalName": "05-body-drag-no-visible-change.json"
|
||||
},
|
||||
{
|
||||
"path": "original/05-body-drag-no-visible-change.jpg",
|
||||
"bytes": 116465,
|
||||
"sha256": "5e695517492f4e2c7038a592943a72b5521c3c06f0f60e9881164c17e30748e7",
|
||||
"gitBlob": "b827463d4b9ef06be54a18c6d5d3fb07dd3c8c4c",
|
||||
"originalName": "05-body-drag-no-visible-change.png"
|
||||
},
|
||||
{
|
||||
"path": "original/06-selected-body-drag-no-visible-change.json",
|
||||
"bytes": 521,
|
||||
"sha256": "38f567c26d4446af729056a6ca6d63bcfd153f60eabab9e6e7fb2900484d84a0",
|
||||
"gitBlob": "e221419b2a41daf48cf6299fc6234499ff8cf150",
|
||||
"originalName": "06-selected-body-drag-no-visible-change.json"
|
||||
},
|
||||
{
|
||||
"path": "original/06-selected-body-drag-no-visible-change.jpg",
|
||||
"bytes": 121126,
|
||||
"sha256": "a97b16dca7d6c56643b35eafe48d579f3c9b44739b0f652879c1c01805da1e71",
|
||||
"gitBlob": "9b949a19cefbea79019831f589d66d0764a5e264",
|
||||
"originalName": "06-selected-body-drag-no-visible-change.png"
|
||||
},
|
||||
{
|
||||
"path": "original/07-execution-drag-moves-message.json",
|
||||
"bytes": 513,
|
||||
"sha256": "c0dbde9796a86543c147c53b908a4459052207e101c6157eb8786fabdeefebe9",
|
||||
"gitBlob": "56dd42b4bde52bed82ed395156f83f26278c7c83",
|
||||
"originalName": "07-execution-drag-moves-message.json"
|
||||
},
|
||||
{
|
||||
"path": "original/07-execution-drag-moves-message.jpg",
|
||||
"bytes": 115731,
|
||||
"sha256": "822abdf704db41bd2859c0b4b279fd8345de3a27954c2149a294280c80972bb0",
|
||||
"gitBlob": "199c7dd8a793a1979595a1e8d5edd09c32bc4385",
|
||||
"originalName": "07-execution-drag-moves-message.png"
|
||||
},
|
||||
{
|
||||
"path": "original/08-lifeline-header-drag.json",
|
||||
"bytes": 505,
|
||||
"sha256": "67595f3f6e17f443ae5ba0482b11d7ba7dc20df1d6d33418c44d4a4ec59e0379",
|
||||
"gitBlob": "98b123c5b0f28a784c4ed5703b00b9eb16434995",
|
||||
"originalName": "08-lifeline-header-drag.json"
|
||||
},
|
||||
{
|
||||
"path": "original/08-lifeline-header-drag.jpg",
|
||||
"bytes": 120585,
|
||||
"sha256": "18f2fbb1d042269f4766f083dcb639998d5e6b2f672282c6ee40184aec798d70",
|
||||
"gitBlob": "ceed3fdc11a277f287656f2b3509657344913142",
|
||||
"originalName": "08-lifeline-header-drag.png"
|
||||
},
|
||||
{
|
||||
"path": "original/09-undo-lifeline.json",
|
||||
"bytes": 498,
|
||||
"sha256": "055beea4215b83b67eb4e63c047cd9a4b78b90022728a2acd23d9dca39e6f1ea",
|
||||
"gitBlob": "386b92967b8cea7f67ac58e54609962d8d009ad5",
|
||||
"originalName": "09-undo-lifeline.json"
|
||||
},
|
||||
{
|
||||
"path": "original/09-undo-lifeline.jpg",
|
||||
"bytes": 121069,
|
||||
"sha256": "b6b7295167a5b42f1edcaf72b37e5a02d654b9dd6eb599717f8bdf283df7a282",
|
||||
"gitBlob": "abaaef795d327bf0c06d9d38360f67d26ad304f7",
|
||||
"originalName": "09-undo-lifeline.png"
|
||||
},
|
||||
{
|
||||
"path": "original/10-undo-message.json",
|
||||
"bytes": 497,
|
||||
"sha256": "7b6c97a6390fe3953d0a237aafc87ebb16c6d997818b7c9b30a8f489f48497d1",
|
||||
"gitBlob": "032466c894ab9e6ef54985a6950846a375edb73b",
|
||||
"originalName": "10-undo-message.json"
|
||||
},
|
||||
{
|
||||
"path": "original/10-undo-message.jpg",
|
||||
"bytes": 121386,
|
||||
"sha256": "e80236bac558da85197ee260d56dc867b4752ca67f1d089489c660ebd9ee19d5",
|
||||
"gitBlob": "59b46db55e898de0abbd764469c09f0b47409070",
|
||||
"originalName": "10-undo-message.png"
|
||||
},
|
||||
{
|
||||
"path": "original/after-drag-IncidentScenarioBenchmark.aird",
|
||||
"bytes": 29472,
|
||||
"sha256": "4df2608dbab35c6cc09761ab06b2e5dbc533c86a5fc28e851ca0f9efd367acf7",
|
||||
"gitBlob": "ecb23d8596227cc75b97992636eca0212bb776c3",
|
||||
"originalName": "after-drag-IncidentScenarioBenchmark.aird"
|
||||
},
|
||||
{
|
||||
"path": "original/after-drag-IncidentScenarioBenchmark.capella",
|
||||
"bytes": 26594,
|
||||
"sha256": "d8764060c6f3d11ddf24a91e20955fe035725cfe35019fdd514688d07118c056",
|
||||
"gitBlob": "89742098e6a2c81df9cfe2e96fe82497ed10d6ab",
|
||||
"originalName": "after-drag-IncidentScenarioBenchmark.capella"
|
||||
},
|
||||
{
|
||||
"path": "original/before-drag-IncidentScenarioBenchmark.aird",
|
||||
"bytes": 29469,
|
||||
"sha256": "c24db589f3a551b8ea0f8d00d2dc6729909157e2a3ac4ebc0ca69cd141393c89",
|
||||
"gitBlob": "ccb8624f9aaaa4ec14b2158c6c6842482f90fd74",
|
||||
"originalName": "before-drag-IncidentScenarioBenchmark.aird"
|
||||
},
|
||||
{
|
||||
"path": "original/before-drag-IncidentScenarioBenchmark.capella",
|
||||
"bytes": 26594,
|
||||
"sha256": "d8764060c6f3d11ddf24a91e20955fe035725cfe35019fdd514688d07118c056",
|
||||
"gitBlob": "89742098e6a2c81df9cfe2e96fe82497ed10d6ab",
|
||||
"originalName": "before-drag-IncidentScenarioBenchmark.capella"
|
||||
},
|
||||
{
|
||||
"path": "original/observations.json",
|
||||
"bytes": 3272,
|
||||
"sha256": "e157b99136261f462255325e18bd643f9fc082b6a9706488553eda5a73bff4c3",
|
||||
"gitBlob": "5423e3e35ff53ee07744ab83525ae156d23216d9",
|
||||
"originalName": "observations.json"
|
||||
},
|
||||
{
|
||||
"path": "original/restored-IncidentScenarioBenchmark.aird",
|
||||
"bytes": 29469,
|
||||
"sha256": "c24db589f3a551b8ea0f8d00d2dc6729909157e2a3ac4ebc0ca69cd141393c89",
|
||||
"gitBlob": "ccb8624f9aaaa4ec14b2158c6c6842482f90fd74",
|
||||
"originalName": "restored-IncidentScenarioBenchmark.aird"
|
||||
},
|
||||
{
|
||||
"path": "original/restored-IncidentScenarioBenchmark.capella",
|
||||
"bytes": 26594,
|
||||
"sha256": "d8764060c6f3d11ddf24a91e20955fe035725cfe35019fdd514688d07118c056",
|
||||
"gitBlob": "89742098e6a2c81df9cfe2e96fe82497ed10d6ab",
|
||||
"originalName": "restored-IncidentScenarioBenchmark.capella"
|
||||
}
|
||||
],
|
||||
"screenshots": [
|
||||
{
|
||||
"file": "01-empty-scenario.jpg",
|
||||
"encoding": "image/jpeg",
|
||||
"sha256": "f46a6733ec53b4f66f2d5e4b5f7c9e0c5629cd37b2af259ca2a74fb3177b7ba3",
|
||||
"height": 761,
|
||||
"width": 1010,
|
||||
"utc": "2026-09-13T07:24:54.137Z",
|
||||
"originalName": "01-empty-scenario.png"
|
||||
},
|
||||
{
|
||||
"file": "02-created-lifeline.jpg",
|
||||
"encoding": "image/jpeg",
|
||||
"sha256": "da13419030b07775278c3acddbf469e87a0c381e78dd94f1447fcbd4b75de924",
|
||||
"height": 761,
|
||||
"width": 1010,
|
||||
"utc": "2026-09-13T07:25:52.543Z",
|
||||
"originalName": "02-created-lifeline.png"
|
||||
},
|
||||
{
|
||||
"file": "03-interaction-choice.jpg",
|
||||
"encoding": "image/jpeg",
|
||||
"sha256": "707eab6ca03201a13464c5de7d64db341732b294ef7da7d436d4296869ea0694",
|
||||
"height": 761,
|
||||
"width": 1010,
|
||||
"utc": "2026-09-13T07:28:36.758Z",
|
||||
"originalName": "03-interaction-choice.png"
|
||||
},
|
||||
{
|
||||
"file": "04-created-message.jpg",
|
||||
"encoding": "image/jpeg",
|
||||
"sha256": "d88df97283a09248f44ce4e5576ac875e0e2f9a73940b0178c47896c7bcca324",
|
||||
"height": 761,
|
||||
"width": 1010,
|
||||
"utc": "2026-09-13T07:30:04.246Z",
|
||||
"originalName": "04-created-message.png"
|
||||
},
|
||||
{
|
||||
"file": "05-body-drag-no-visible-change.jpg",
|
||||
"encoding": "image/jpeg",
|
||||
"sha256": "5e695517492f4e2c7038a592943a72b5521c3c06f0f60e9881164c17e30748e7",
|
||||
"height": 761,
|
||||
"width": 1010,
|
||||
"utc": "2026-09-13T07:31:13.537Z",
|
||||
"originalName": "05-body-drag-no-visible-change.png"
|
||||
},
|
||||
{
|
||||
"file": "06-selected-body-drag-no-visible-change.jpg",
|
||||
"encoding": "image/jpeg",
|
||||
"sha256": "a97b16dca7d6c56643b35eafe48d579f3c9b44739b0f652879c1c01805da1e71",
|
||||
"height": 761,
|
||||
"width": 1010,
|
||||
"utc": "2026-09-13T07:31:55.970Z",
|
||||
"originalName": "06-selected-body-drag-no-visible-change.png"
|
||||
},
|
||||
{
|
||||
"file": "07-execution-drag-moves-message.jpg",
|
||||
"encoding": "image/jpeg",
|
||||
"sha256": "822abdf704db41bd2859c0b4b279fd8345de3a27954c2149a294280c80972bb0",
|
||||
"height": 761,
|
||||
"width": 1010,
|
||||
"utc": "2026-09-13T07:32:12.595Z",
|
||||
"originalName": "07-execution-drag-moves-message.png"
|
||||
},
|
||||
{
|
||||
"file": "08-lifeline-header-drag.jpg",
|
||||
"encoding": "image/jpeg",
|
||||
"sha256": "18f2fbb1d042269f4766f083dcb639998d5e6b2f672282c6ee40184aec798d70",
|
||||
"height": 761,
|
||||
"width": 1010,
|
||||
"utc": "2026-09-13T07:33:04.974Z",
|
||||
"originalName": "08-lifeline-header-drag.png"
|
||||
},
|
||||
{
|
||||
"file": "09-undo-lifeline.jpg",
|
||||
"encoding": "image/jpeg",
|
||||
"sha256": "b6b7295167a5b42f1edcaf72b37e5a02d654b9dd6eb599717f8bdf283df7a282",
|
||||
"height": 761,
|
||||
"width": 1010,
|
||||
"utc": "2026-09-13T07:33:20.244Z",
|
||||
"originalName": "09-undo-lifeline.png"
|
||||
},
|
||||
{
|
||||
"file": "10-undo-message.jpg",
|
||||
"encoding": "image/jpeg",
|
||||
"sha256": "e80236bac558da85197ee260d56dc867b4752ca67f1d089489c660ebd9ee19d5",
|
||||
"height": 761,
|
||||
"width": 1010,
|
||||
"utc": "2026-09-13T07:33:43.046Z",
|
||||
"originalName": "10-undo-message.png"
|
||||
}
|
||||
],
|
||||
"sourceComparison": {
|
||||
"semanticAfterEqualBefore": true,
|
||||
"semanticRestoredEqualBefore": true,
|
||||
"presentationAfterEqualBefore": false,
|
||||
"presentationRestoredEqualBefore": true,
|
||||
"changedAirdLines": [
|
||||
{
|
||||
"line": 11,
|
||||
"before": " <ownedRepresentationDescriptors xmi:type=\"viewpoint:DRepresentationDescriptor\" uid=\"_CzkvUK9EEfGUao8nYtZHOA\" name=\"[OAS] OperationalCapability 1\" repPath=\"#_Cvs78K9EEfGUao8nYtZHOA\" changeId=\"1789284570297\">",
|
||||
"after": " <ownedRepresentationDescriptors xmi:type=\"viewpoint:DRepresentationDescriptor\" uid=\"_CzkvUK9EEfGUao8nYtZHOA\" name=\"[OAS] OperationalCapability 1\" repPath=\"#_Cvs78K9EEfGUao8nYtZHOA\" changeId=\"1789284717076\">"
|
||||
},
|
||||
{
|
||||
"line": 100,
|
||||
"before": " <layoutConstraint xmi:type=\"notation:Bounds\" xmi:id=\"_2vIQkq9EEfGUao8nYtZHOA\" x=\"2\" y=\"53\" width=\"10\" height=\"30\"/>",
|
||||
"after": " <layoutConstraint xmi:type=\"notation:Bounds\" xmi:id=\"_2vIQkq9EEfGUao8nYtZHOA\" x=\"2\" y=\"132\" width=\"10\" height=\"30\"/>"
|
||||
},
|
||||
{
|
||||
"line": 125,
|
||||
"before": " <bendpoints xmi:type=\"notation:RelativeBendpoints\" xmi:id=\"_2w4kE69EEfGUao8nYtZHOA\" points=\"[0, 0, -273, -4]$[272, 0, -1, -4]\"/>",
|
||||
"after": " <bendpoints xmi:type=\"notation:RelativeBendpoints\" xmi:id=\"_2w4kE69EEfGUao8nYtZHOA\" points=\"[0, 79, -273, -4]$[272, 79, -1, -4]\"/>"
|
||||
},
|
||||
{
|
||||
"line": 183,
|
||||
"before": " <graphicalFilters xmi:type=\"diagram:AbsoluteBoundsFilter\" uid=\"_26OtUK9EEfGUao8nYtZHOA\" x=\"442\" y=\"153\" height=\"30\" width=\"10\"/>",
|
||||
"after": " <graphicalFilters xmi:type=\"diagram:AbsoluteBoundsFilter\" uid=\"_26OtUK9EEfGUao8nYtZHOA\" x=\"442\" y=\"232\" height=\"30\" width=\"10\"/>"
|
||||
},
|
||||
{
|
||||
"line": 205,
|
||||
"before": " <graphicalFilters xmi:type=\"diagram:AbsoluteBoundsFilter\" uid=\"_2px2gK9EEfGUao8nYtZHOA\" y=\"153\" height=\"0\"/>",
|
||||
"after": " <graphicalFilters xmi:type=\"diagram:AbsoluteBoundsFilter\" uid=\"_2px2gK9EEfGUao8nYtZHOA\" y=\"232\" height=\"0\"/>"
|
||||
}
|
||||
]
|
||||
},
|
||||
"byteExact": true,
|
||||
"imageNaming": "Original .png filenames contain JPEG/JFIF bytes. Archive uses .jpg names; manifest maps originalName to published path. No transcoding or duplicate image copies."
|
||||
}
|
||||
|
After Width: | Height: | Size: 105 KiB |
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"label": "01-empty-scenario",
|
||||
"utc": "2026-09-13T07:24:54.137Z",
|
||||
"window": {
|
||||
"app": "process:C:\\Users\\User\\capella-7.1.0.202606231255-win32-win32-x86_64\\capella\\capella.exe",
|
||||
"id": 383844906,
|
||||
"title": "capella-layout-benchmark-20260912 - platform:/resource/IncidentScenarioBenchmark/IncidentScenarioBenchmark.aird/[OAS] OperationalCapability 1 - Capella"
|
||||
},
|
||||
"width": 1010,
|
||||
"height": 761,
|
||||
"sha256": "f46a6733ec53b4f66f2d5e4b5f7c9e0c5629cd37b2af259ca2a74fb3177b7ba3"
|
||||
}
|
||||
|
After Width: | Height: | Size: 113 KiB |
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"label": "02-created-lifeline",
|
||||
"utc": "2026-09-13T07:25:52.543Z",
|
||||
"window": {
|
||||
"app": "process:C:\\Users\\User\\capella-7.1.0.202606231255-win32-win32-x86_64\\capella\\capella.exe",
|
||||
"id": 383844906,
|
||||
"title": "capella-layout-benchmark-20260912 - platform:/resource/IncidentScenarioBenchmark/IncidentScenarioBenchmark.aird/[OAS] OperationalCapability 1 - Capella"
|
||||
},
|
||||
"width": 1010,
|
||||
"height": 761,
|
||||
"sha256": "da13419030b07775278c3acddbf469e87a0c381e78dd94f1447fcbd4b75de924"
|
||||
}
|
||||
|
After Width: | Height: | Size: 95 KiB |
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"label": "03-interaction-choice",
|
||||
"utc": "2026-09-13T07:28:36.758Z",
|
||||
"window": {
|
||||
"app": "process:C:\\Users\\User\\capella-7.1.0.202606231255-win32-win32-x86_64\\capella\\capella.exe",
|
||||
"id": 383844906,
|
||||
"title": "capella-layout-benchmark-20260912 - platform:/resource/IncidentScenarioBenchmark/IncidentScenarioBenchmark.aird/[OAS] OperationalCapability 1 - Capella"
|
||||
},
|
||||
"width": 1010,
|
||||
"height": 761,
|
||||
"sha256": "707eab6ca03201a13464c5de7d64db341732b294ef7da7d436d4296869ea0694"
|
||||
}
|
||||
|
After Width: | Height: | Size: 119 KiB |
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"label": "04-created-message",
|
||||
"utc": "2026-09-13T07:30:04.246Z",
|
||||
"window": {
|
||||
"app": "process:C:\\Users\\User\\capella-7.1.0.202606231255-win32-win32-x86_64\\capella\\capella.exe",
|
||||
"id": 383844906,
|
||||
"title": "capella-layout-benchmark-20260912 - platform:/resource/IncidentScenarioBenchmark/IncidentScenarioBenchmark.aird/[OAS] OperationalCapability 1 - Capella"
|
||||
},
|
||||
"width": 1010,
|
||||
"height": 761,
|
||||
"sha256": "d88df97283a09248f44ce4e5576ac875e0e2f9a73940b0178c47896c7bcca324"
|
||||
}
|
||||
|
After Width: | Height: | Size: 114 KiB |
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"label": "05-body-drag-no-visible-change",
|
||||
"utc": "2026-09-13T07:31:13.537Z",
|
||||
"window": {
|
||||
"app": "process:C:\\Users\\User\\capella-7.1.0.202606231255-win32-win32-x86_64\\capella\\capella.exe",
|
||||
"id": 383844906,
|
||||
"title": "capella-layout-benchmark-20260912 - platform:/resource/IncidentScenarioBenchmark/IncidentScenarioBenchmark.aird/[OAS] OperationalCapability 1 - Capella"
|
||||
},
|
||||
"width": 1010,
|
||||
"height": 761,
|
||||
"sha256": "5e695517492f4e2c7038a592943a72b5521c3c06f0f60e9881164c17e30748e7"
|
||||
}
|
||||
|
After Width: | Height: | Size: 118 KiB |
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"label": "06-selected-body-drag-no-visible-change",
|
||||
"utc": "2026-09-13T07:31:55.970Z",
|
||||
"window": {
|
||||
"app": "process:C:\\Users\\User\\capella-7.1.0.202606231255-win32-win32-x86_64\\capella\\capella.exe",
|
||||
"id": 383844906,
|
||||
"title": "capella-layout-benchmark-20260912 - platform:/resource/IncidentScenarioBenchmark/IncidentScenarioBenchmark.aird/[OAS] OperationalCapability 1 - Capella"
|
||||
},
|
||||
"width": 1010,
|
||||
"height": 761,
|
||||
"sha256": "a97b16dca7d6c56643b35eafe48d579f3c9b44739b0f652879c1c01805da1e71"
|
||||
}
|
||||
|
After Width: | Height: | Size: 113 KiB |
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"label": "07-execution-drag-moves-message",
|
||||
"utc": "2026-09-13T07:32:12.595Z",
|
||||
"window": {
|
||||
"app": "process:C:\\Users\\User\\capella-7.1.0.202606231255-win32-win32-x86_64\\capella\\capella.exe",
|
||||
"id": 383844906,
|
||||
"title": "capella-layout-benchmark-20260912 - platform:/resource/IncidentScenarioBenchmark/IncidentScenarioBenchmark.aird/[OAS] OperationalCapability 1 - Capella"
|
||||
},
|
||||
"width": 1010,
|
||||
"height": 761,
|
||||
"sha256": "822abdf704db41bd2859c0b4b279fd8345de3a27954c2149a294280c80972bb0"
|
||||
}
|
||||
|
After Width: | Height: | Size: 118 KiB |
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"label": "08-lifeline-header-drag",
|
||||
"utc": "2026-09-13T07:33:04.974Z",
|
||||
"window": {
|
||||
"app": "process:C:\\Users\\User\\capella-7.1.0.202606231255-win32-win32-x86_64\\capella\\capella.exe",
|
||||
"id": 383844906,
|
||||
"title": "capella-layout-benchmark-20260912 - platform:/resource/IncidentScenarioBenchmark/IncidentScenarioBenchmark.aird/[OAS] OperationalCapability 1 - Capella"
|
||||
},
|
||||
"width": 1010,
|
||||
"height": 761,
|
||||
"sha256": "18f2fbb1d042269f4766f083dcb639998d5e6b2f672282c6ee40184aec798d70"
|
||||
}
|
||||
|
After Width: | Height: | Size: 118 KiB |
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"label": "09-undo-lifeline",
|
||||
"utc": "2026-09-13T07:33:20.244Z",
|
||||
"window": {
|
||||
"app": "process:C:\\Users\\User\\capella-7.1.0.202606231255-win32-win32-x86_64\\capella\\capella.exe",
|
||||
"id": 383844906,
|
||||
"title": "capella-layout-benchmark-20260912 - platform:/resource/IncidentScenarioBenchmark/IncidentScenarioBenchmark.aird/[OAS] OperationalCapability 1 - Capella"
|
||||
},
|
||||
"width": 1010,
|
||||
"height": 761,
|
||||
"sha256": "b6b7295167a5b42f1edcaf72b37e5a02d654b9dd6eb599717f8bdf283df7a282"
|
||||
}
|
||||
|
After Width: | Height: | Size: 118 KiB |
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"label": "10-undo-message",
|
||||
"utc": "2026-09-13T07:33:43.046Z",
|
||||
"window": {
|
||||
"app": "process:C:\\Users\\User\\capella-7.1.0.202606231255-win32-win32-x86_64\\capella\\capella.exe",
|
||||
"id": 383844906,
|
||||
"title": "capella-layout-benchmark-20260912 - platform:/resource/IncidentScenarioBenchmark/IncidentScenarioBenchmark.aird/[OAS] OperationalCapability 1 - Capella"
|
||||
},
|
||||
"width": 1010,
|
||||
"height": 761,
|
||||
"sha256": "e80236bac558da85197ee260d56dc867b4752ca67f1d089489c660ebd9ee19d5"
|
||||
}
|
||||
@@ -0,0 +1,218 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:description="http://www.eclipse.org/sirius/description/1.1.0" xmlns:description_1="http://www.eclipse.org/sirius/diagram/sequence/description/2.0.0" xmlns:description_2="http://www.eclipse.org/sirius/diagram/description/1.1.0" xmlns:diagram="http://www.eclipse.org/sirius/diagram/1.1.0" xmlns:filter="http://www.eclipse.org/sirius/diagram/description/filter/1.1.0" xmlns:notation="http://www.eclipse.org/gmf/runtime/1.0.3/notation" xmlns:org.polarsys.capella.core.data.fa="http://www.polarsys.org/capella/core/fa/7.0.0" xmlns:org.polarsys.capella.core.data.interaction="http://www.polarsys.org/capella/core/interaction/7.0.0" xmlns:org.polarsys.capella.core.data.oa="http://www.polarsys.org/capella/core/oa/7.0.0" xmlns:sequence="http://www.eclipse.org/sirius/diagram/sequence/2.0.0" xmlns:style="http://www.eclipse.org/sirius/diagram/description/style/1.1.0" xmlns:viewpoint="http://www.eclipse.org/sirius/1.1.0" xsi:schemaLocation="http://www.eclipse.org/sirius/description/1.1.0 http://www.eclipse.org/sirius/1.1.0#//description http://www.eclipse.org/sirius/diagram/sequence/description/2.0.0 http://www.eclipse.org/sirius/diagram/sequence/2.0.0#//description http://www.eclipse.org/sirius/diagram/description/1.1.0 http://www.eclipse.org/sirius/diagram/1.1.0#//description http://www.eclipse.org/sirius/diagram/description/filter/1.1.0 http://www.eclipse.org/sirius/diagram/1.1.0#//description/filter http://www.eclipse.org/sirius/diagram/description/style/1.1.0 http://www.eclipse.org/sirius/diagram/1.1.0#//description/style">
|
||||
<viewpoint:DAnalysis uid="_aGG3IK9DEfGUao8nYtZHOA" selectedViews="_jKVQsK9DEfGUao8nYtZHOA _j6oFMK9DEfGUao8nYtZHOA _k_n-YK9DEfGUao8nYtZHOA _lbLR8K9DEfGUao8nYtZHOA _lkvdoK9DEfGUao8nYtZHOA _lnCjsK9DEfGUao8nYtZHOA _lneokK9DEfGUao8nYtZHOA" version="15.4.1.202403191723">
|
||||
<semanticResources>IncidentScenarioBenchmark.afm</semanticResources>
|
||||
<semanticResources>IncidentScenarioBenchmark.capella</semanticResources>
|
||||
<ownedViews xmi:type="viewpoint:DView" uid="_jKVQsK9DEfGUao8nYtZHOA">
|
||||
<viewpoint xmi:type="description:Viewpoint" href="platform:/plugin/org.polarsys.kitalpha.ad.integration.sirius/description/ad.odesign#//@ownedViewpoints[name='ad']"/>
|
||||
</ownedViews>
|
||||
<ownedViews xmi:type="viewpoint:DView" uid="_j6oFMK9DEfGUao8nYtZHOA">
|
||||
<viewpoint xmi:type="description:Viewpoint" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']"/>
|
||||
<ownedRepresentationDescriptors xmi:type="viewpoint:DRepresentationDescriptor" uid="_CzkvUK9EEfGUao8nYtZHOA" name="[OAS] OperationalCapability 1" repPath="#_Cvs78K9EEfGUao8nYtZHOA" changeId="1789284717076">
|
||||
<description xmi:type="description_1:SequenceDiagramDescription" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']"/>
|
||||
<target xmi:type="org.polarsys.capella.core.data.interaction:Scenario" href="IncidentScenarioBenchmark.capella#6aa3cccb-9adc-4230-993d-7ee80c250509"/>
|
||||
</ownedRepresentationDescriptors>
|
||||
</ownedViews>
|
||||
<ownedViews xmi:type="viewpoint:DView" uid="_k_n-YK9DEfGUao8nYtZHOA">
|
||||
<viewpoint xmi:type="description:Viewpoint" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/common.odesign#//@ownedViewpoints[name='Common']"/>
|
||||
</ownedViews>
|
||||
<ownedViews xmi:type="viewpoint:DView" uid="_lbLR8K9DEfGUao8nYtZHOA">
|
||||
<viewpoint xmi:type="description:Viewpoint" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/context.odesign#//@ownedViewpoints[name='System%20Analysis']"/>
|
||||
</ownedViews>
|
||||
<ownedViews xmi:type="viewpoint:DView" uid="_lkvdoK9DEfGUao8nYtZHOA">
|
||||
<viewpoint xmi:type="description:Viewpoint" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/logical.odesign#//@ownedViewpoints[name='Logical%20Architecture']"/>
|
||||
</ownedViews>
|
||||
<ownedViews xmi:type="viewpoint:DView" uid="_lnCjsK9DEfGUao8nYtZHOA">
|
||||
<viewpoint xmi:type="description:Viewpoint" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/EPBS.odesign#//@ownedViewpoints[name='EPBS%20architecture']"/>
|
||||
</ownedViews>
|
||||
<ownedViews xmi:type="viewpoint:DView" uid="_lneokK9DEfGUao8nYtZHOA">
|
||||
<viewpoint xmi:type="description:Viewpoint" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/physical.odesign#//@ownedViewpoints[name='Physical%20Architecture']"/>
|
||||
</ownedViews>
|
||||
</viewpoint:DAnalysis>
|
||||
<sequence:SequenceDDiagram uid="_Cvs78K9EEfGUao8nYtZHOA">
|
||||
<ownedAnnotationEntries xmi:type="description:AnnotationEntry" uid="_C2IUEK9EEfGUao8nYtZHOA" source="GMF_DIAGRAMS">
|
||||
<data xmi:type="notation:Diagram" xmi:id="_C2IUEa9EEfGUao8nYtZHOA" type="Sirius" element="_Cvs78K9EEfGUao8nYtZHOA" measurementUnit="Pixel">
|
||||
<children xmi:type="notation:Node" xmi:id="_Qmo2kK9EEfGUao8nYtZHOA" type="2001" element="_Qhyy0K9EEfGUao8nYtZHOA">
|
||||
<children xmi:type="notation:Node" xmi:id="_QnNeUK9EEfGUao8nYtZHOA" type="5002">
|
||||
<layoutConstraint xmi:type="notation:Location" xmi:id="_QnNeUa9EEfGUao8nYtZHOA" y="5"/>
|
||||
</children>
|
||||
<children xmi:type="notation:Node" xmi:id="_QnUzEK9EEfGUao8nYtZHOA" type="3001" element="_QjjGUK9EEfGUao8nYtZHOA">
|
||||
<children xmi:type="notation:Node" xmi:id="_QnWBMK9EEfGUao8nYtZHOA" type="5001">
|
||||
<layoutConstraint xmi:type="notation:Location" xmi:id="_QnWBMa9EEfGUao8nYtZHOA" y="5"/>
|
||||
</children>
|
||||
<children xmi:type="notation:Node" xmi:id="_QoEZ8K9EEfGUao8nYtZHOA" type="3003" element="_QjlikK9EEfGUao8nYtZHOA">
|
||||
<styles xmi:type="notation:ShapeStyle" xmi:id="_QoEZ8a9EEfGUao8nYtZHOA" fontName="Segoe UI"/>
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_QoEZ8q9EEfGUao8nYtZHOA"/>
|
||||
</children>
|
||||
<children xmi:type="notation:Node" xmi:id="_QoG2MK9EEfGUao8nYtZHOA" type="3001" element="_QkQ4AK9EEfGUao8nYtZHOA">
|
||||
<children xmi:type="notation:Node" xmi:id="_QoLusK9EEfGUao8nYtZHOA" type="5001">
|
||||
<layoutConstraint xmi:type="notation:Location" xmi:id="_QoLusa9EEfGUao8nYtZHOA" y="5"/>
|
||||
</children>
|
||||
<children xmi:type="notation:Node" xmi:id="_Q5NNQK9EEfGUao8nYtZHOA" type="3005" element="_QkTUQK9EEfGUao8nYtZHOA">
|
||||
<styles xmi:type="notation:ShapeStyle" xmi:id="_Q5NNQa9EEfGUao8nYtZHOA" fontName="Segoe UI"/>
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_Q5NNQq9EEfGUao8nYtZHOA"/>
|
||||
</children>
|
||||
<styles xmi:type="notation:ShapeStyle" xmi:id="_QoG2Ma9EEfGUao8nYtZHOA" fontName="Segoe UI" fontHeight="8"/>
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_QoG2Mq9EEfGUao8nYtZHOA" x="2" y="395" width="10" height="10"/>
|
||||
</children>
|
||||
<styles xmi:type="notation:ShapeStyle" xmi:id="_QnUzEa9EEfGUao8nYtZHOA" fontName="Segoe UI" fontHeight="8"/>
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_QnUzEq9EEfGUao8nYtZHOA" y="42" width="10" height="395"/>
|
||||
</children>
|
||||
<children xmi:type="notation:Node" xmi:id="_QnzUMK9EEfGUao8nYtZHOA" type="3003" element="_QiTwMK9EEfGUao8nYtZHOA">
|
||||
<styles xmi:type="notation:ShapeStyle" xmi:id="_QnzUMa9EEfGUao8nYtZHOA" fontName="Segoe UI"/>
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_QnzUMq9EEfGUao8nYtZHOA"/>
|
||||
</children>
|
||||
<styles xmi:type="notation:ShapeStyle" xmi:id="_Qmo2ka9EEfGUao8nYtZHOA" fontColor="4210779" fontName="Segoe UI" fontHeight="8"/>
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_Qmo2kq9EEfGUao8nYtZHOA" x="124" y="50" width="100" height="50"/>
|
||||
</children>
|
||||
<children xmi:type="notation:Node" xmi:id="_aYDtUK9EEfGUao8nYtZHOA" type="2001" element="_aR4z4K9EEfGUao8nYtZHOA">
|
||||
<children xmi:type="notation:Node" xmi:id="_aYLpIK9EEfGUao8nYtZHOA" type="5002">
|
||||
<layoutConstraint xmi:type="notation:Location" xmi:id="_aYLpIa9EEfGUao8nYtZHOA" y="5"/>
|
||||
</children>
|
||||
<children xmi:type="notation:Node" xmi:id="_aYSW0K9EEfGUao8nYtZHOA" type="3001" element="_aR7QIK9EEfGUao8nYtZHOA">
|
||||
<children xmi:type="notation:Node" xmi:id="_aYUMAK9EEfGUao8nYtZHOA" type="5001">
|
||||
<layoutConstraint xmi:type="notation:Location" xmi:id="_aYUMAa9EEfGUao8nYtZHOA" y="5"/>
|
||||
</children>
|
||||
<children xmi:type="notation:Node" xmi:id="_aYd9AK9EEfGUao8nYtZHOA" type="3003" element="_aR7QIa9EEfGUao8nYtZHOA">
|
||||
<styles xmi:type="notation:ShapeStyle" xmi:id="_aYd9Aa9EEfGUao8nYtZHOA" fontName="Segoe UI"/>
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_aYd9Aq9EEfGUao8nYtZHOA"/>
|
||||
</children>
|
||||
<children xmi:type="notation:Node" xmi:id="_aYfLIK9EEfGUao8nYtZHOA" type="3001" element="_aSOyIK9EEfGUao8nYtZHOA">
|
||||
<children xmi:type="notation:Node" xmi:id="_aZFBAK9EEfGUao8nYtZHOA" type="5001">
|
||||
<layoutConstraint xmi:type="notation:Location" xmi:id="_aZFBAa9EEfGUao8nYtZHOA" y="5"/>
|
||||
</children>
|
||||
<children xmi:type="notation:Node" xmi:id="_aaVlQK9EEfGUao8nYtZHOA" type="3005" element="_aSiUIK9EEfGUao8nYtZHOA">
|
||||
<styles xmi:type="notation:ShapeStyle" xmi:id="_aaVlQa9EEfGUao8nYtZHOA" fontName="Segoe UI"/>
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_aaVlQq9EEfGUao8nYtZHOA"/>
|
||||
</children>
|
||||
<styles xmi:type="notation:ShapeStyle" xmi:id="_aYfLIa9EEfGUao8nYtZHOA" fontName="Segoe UI" fontHeight="8"/>
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_aYfLIq9EEfGUao8nYtZHOA" x="2" y="395" width="10" height="10"/>
|
||||
</children>
|
||||
<children xmi:type="notation:Node" xmi:id="_2vIQkK9EEfGUao8nYtZHOA" type="3001" element="_2nzgkK9EEfGUao8nYtZHOA">
|
||||
<children xmi:type="notation:Node" xmi:id="_2vbLgK9EEfGUao8nYtZHOA" type="5001">
|
||||
<layoutConstraint xmi:type="notation:Location" xmi:id="_2vbLga9EEfGUao8nYtZHOA" x="-1"/>
|
||||
</children>
|
||||
<children xmi:type="notation:Node" xmi:id="_2vbLgq9EEfGUao8nYtZHOA" type="3003" element="_2n3yAK9EEfGUao8nYtZHOA">
|
||||
<styles xmi:type="notation:ShapeStyle" xmi:id="_2vbLg69EEfGUao8nYtZHOA" fontName="Segoe UI"/>
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_2vbLhK9EEfGUao8nYtZHOA"/>
|
||||
</children>
|
||||
<styles xmi:type="notation:ShapeStyle" xmi:id="_2vIQka9EEfGUao8nYtZHOA" fontColor="4210779" fontName="Segoe UI" fontHeight="8"/>
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_2vIQkq9EEfGUao8nYtZHOA" x="2" y="132" width="10" height="30"/>
|
||||
</children>
|
||||
<styles xmi:type="notation:ShapeStyle" xmi:id="_aYSW0a9EEfGUao8nYtZHOA" fontName="Segoe UI" fontHeight="8"/>
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_aYSW0q9EEfGUao8nYtZHOA" y="42" width="10" height="395"/>
|
||||
</children>
|
||||
<children xmi:type="notation:Node" xmi:id="_aYZEgK9EEfGUao8nYtZHOA" type="3003" element="_aR4z4a9EEfGUao8nYtZHOA">
|
||||
<styles xmi:type="notation:ShapeStyle" xmi:id="_aYZEga9EEfGUao8nYtZHOA" fontName="Segoe UI"/>
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_aYZEgq9EEfGUao8nYtZHOA"/>
|
||||
</children>
|
||||
<styles xmi:type="notation:ShapeStyle" xmi:id="_aYDtUa9EEfGUao8nYtZHOA" fontColor="4210779" fontName="Segoe UI" fontHeight="8"/>
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_aYDtUq9EEfGUao8nYtZHOA" x="397" y="50" width="100" height="50"/>
|
||||
</children>
|
||||
<styles xmi:type="notation:DiagramStyle" xmi:id="_C2IUEq9EEfGUao8nYtZHOA"/>
|
||||
<edges xmi:type="notation:Edge" xmi:id="_2w4kEK9EEfGUao8nYtZHOA" type="4001" element="_2o9-MK9EEfGUao8nYtZHOA" source="_QnUzEK9EEfGUao8nYtZHOA" target="_2vIQkK9EEfGUao8nYtZHOA">
|
||||
<children xmi:type="notation:Node" xmi:id="_2xPwcK9EEfGUao8nYtZHOA" type="6001">
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_2xPwca9EEfGUao8nYtZHOA" y="-10"/>
|
||||
</children>
|
||||
<children xmi:type="notation:Node" xmi:id="_2xY6YK9EEfGUao8nYtZHOA" type="6002">
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_2xY6Ya9EEfGUao8nYtZHOA" y="10"/>
|
||||
</children>
|
||||
<children xmi:type="notation:Node" xmi:id="_2xaIgK9EEfGUao8nYtZHOA" type="6003">
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_2xaIga9EEfGUao8nYtZHOA" y="10"/>
|
||||
</children>
|
||||
<styles xmi:type="notation:ConnectorStyle" xmi:id="_2w4kEa9EEfGUao8nYtZHOA" jumpLinkStatus="Above" jumpLinkType="Tunnel"/>
|
||||
<styles xmi:type="notation:FontStyle" xmi:id="_2w4kEq9EEfGUao8nYtZHOA" fontName="Segoe UI" fontHeight="8"/>
|
||||
<bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_2w4kE69EEfGUao8nYtZHOA" points="[0, 79, -273, -4]$[272, 79, -1, -4]"/>
|
||||
<sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_2xeZ8K9EEfGUao8nYtZHOA" id="(0.5,0.1341772151898734) custom"/>
|
||||
<targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_2xeZ8a9EEfGUao8nYtZHOA" id="(0.5,0.1341772151898734) custom"/>
|
||||
</edges>
|
||||
</data>
|
||||
</ownedAnnotationEntries>
|
||||
<ownedAnnotationEntries xmi:type="description:AnnotationEntry" uid="_C5o7EK9EEfGUao8nYtZHOA" source="DANNOTATION_CUSTOMIZATION_KEY">
|
||||
<data xmi:type="diagram:ComputedStyleDescriptionRegistry" uid="_C5rXUK9EEfGUao8nYtZHOA"/>
|
||||
</ownedAnnotationEntries>
|
||||
<ownedDiagramElements xmi:type="diagram:DNode" uid="_Qhyy0K9EEfGUao8nYtZHOA" name="OperationalActivity 1" width="10" height="5" resizeKind="EAST_WEST">
|
||||
<target xmi:type="org.polarsys.capella.core.data.interaction:InstanceRole" href="IncidentScenarioBenchmark.capella#86b77dcf-5283-4bc0-8d6a-25936ad7e857"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.interaction:InstanceRole" href="IncidentScenarioBenchmark.capella#86b77dcf-5283-4bc0-8d6a-25936ad7e857"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.oa:OperationalActivity" href="IncidentScenarioBenchmark.capella#2e2d08d5-9c42-4e33-af81-222efa4c992c"/>
|
||||
<graphicalFilters xmi:type="diagram:AbsoluteBoundsFilter" uid="_QlEwUK9EEfGUao8nYtZHOA" x="124" y="50" height="50" width="100"/>
|
||||
<ownedBorderedNodes xmi:type="diagram:DNode" uid="_QjjGUK9EEfGUao8nYtZHOA" outgoingEdges="_2o9-MK9EEfGUao8nYtZHOA" width="1" height="40" resizeKind="NSEW">
|
||||
<target xmi:type="org.polarsys.capella.core.data.interaction:InstanceRole" href="IncidentScenarioBenchmark.capella#86b77dcf-5283-4bc0-8d6a-25936ad7e857"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.interaction:InstanceRole" href="IncidentScenarioBenchmark.capella#86b77dcf-5283-4bc0-8d6a-25936ad7e857"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.oa:OperationalActivity" href="IncidentScenarioBenchmark.capella#2e2d08d5-9c42-4e33-af81-222efa4c992c"/>
|
||||
<ownedBorderedNodes xmi:type="diagram:DNode" uid="_QkQ4AK9EEfGUao8nYtZHOA" width="1" height="1">
|
||||
<target xmi:type="org.polarsys.capella.core.data.interaction:InstanceRole" href="IncidentScenarioBenchmark.capella#86b77dcf-5283-4bc0-8d6a-25936ad7e857"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.interaction:InstanceRole" href="IncidentScenarioBenchmark.capella#86b77dcf-5283-4bc0-8d6a-25936ad7e857"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.oa:OperationalActivity" href="IncidentScenarioBenchmark.capella#2e2d08d5-9c42-4e33-af81-222efa4c992c"/>
|
||||
<ownedStyle xmi:type="diagram:WorkspaceImage" uid="_QkTUQK9EEfGUao8nYtZHOA" showIcon="false" labelPosition="node" workspacePath="/org.polarsys.capella.core.sirius.analysis/description/images/handlelifeline.svg">
|
||||
<description xmi:type="style:WorkspaceImageDescription" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@nodeMappings[name='InstanceRoleMaping%20AIS']/@borderedNodeMappings[name='default%20execution%20AIS']/@borderedNodeMappings[name='endOfLifeAIS']/@style"/>
|
||||
</ownedStyle>
|
||||
<actualMapping xmi:type="description_1:EndOfLifeMapping" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@nodeMappings[name='InstanceRoleMaping%20AIS']/@borderedNodeMappings[name='default%20execution%20AIS']/@borderedNodeMappings[name='endOfLifeAIS']"/>
|
||||
</ownedBorderedNodes>
|
||||
<ownedStyle xmi:type="diagram:Square" uid="_QjlikK9EEfGUao8nYtZHOA" showIcon="false" borderSize="1" borderSizeComputationExpression="1" borderColor="128,128,128" labelPosition="node" width="1" height="40" color="247,218,116">
|
||||
<description xmi:type="style:SquareDescription" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@nodeMappings[name='InstanceRoleMaping%20AIS']/@borderedNodeMappings[name='default%20execution%20AIS']/@style"/>
|
||||
</ownedStyle>
|
||||
<actualMapping xmi:type="description_1:ExecutionMapping" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@nodeMappings[name='InstanceRoleMaping%20AIS']/@borderedNodeMappings[name='default%20execution%20AIS']"/>
|
||||
</ownedBorderedNodes>
|
||||
<ownedStyle xmi:type="diagram:Square" uid="_QiTwMK9EEfGUao8nYtZHOA" labelColor="91,64,64" borderSize="1" borderSizeComputationExpression="1" borderColor="91,64,64" labelPosition="node" width="10" height="5" color="247,218,116">
|
||||
<description xmi:type="style:SquareDescription" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@nodeMappings[name='InstanceRoleMaping%20AIS']/@style"/>
|
||||
</ownedStyle>
|
||||
<actualMapping xmi:type="description_1:InstanceRoleMapping" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@nodeMappings[name='InstanceRoleMaping%20AIS']"/>
|
||||
</ownedDiagramElements>
|
||||
<ownedDiagramElements xmi:type="diagram:DNode" uid="_aR4z4K9EEfGUao8nYtZHOA" name="OperationalActivity 2" width="10" height="5" resizeKind="EAST_WEST">
|
||||
<target xmi:type="org.polarsys.capella.core.data.interaction:InstanceRole" href="IncidentScenarioBenchmark.capella#5ebf9054-720b-4c46-8ddb-d556548b12ab"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.interaction:InstanceRole" href="IncidentScenarioBenchmark.capella#5ebf9054-720b-4c46-8ddb-d556548b12ab"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.oa:OperationalActivity" href="IncidentScenarioBenchmark.capella#f6af7ea3-196f-4c3f-8b52-75154362d1e0"/>
|
||||
<graphicalFilters xmi:type="diagram:AbsoluteBoundsFilter" uid="_aSjiQK9EEfGUao8nYtZHOA" x="397" y="50" height="50" width="100"/>
|
||||
<ownedBorderedNodes xmi:type="diagram:DNode" uid="_aR7QIK9EEfGUao8nYtZHOA" width="1" height="40" resizeKind="NSEW">
|
||||
<target xmi:type="org.polarsys.capella.core.data.interaction:InstanceRole" href="IncidentScenarioBenchmark.capella#5ebf9054-720b-4c46-8ddb-d556548b12ab"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.interaction:InstanceRole" href="IncidentScenarioBenchmark.capella#5ebf9054-720b-4c46-8ddb-d556548b12ab"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.oa:OperationalActivity" href="IncidentScenarioBenchmark.capella#f6af7ea3-196f-4c3f-8b52-75154362d1e0"/>
|
||||
<ownedBorderedNodes xmi:type="diagram:DNode" uid="_aSOyIK9EEfGUao8nYtZHOA" width="1" height="1">
|
||||
<target xmi:type="org.polarsys.capella.core.data.interaction:InstanceRole" href="IncidentScenarioBenchmark.capella#5ebf9054-720b-4c46-8ddb-d556548b12ab"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.interaction:InstanceRole" href="IncidentScenarioBenchmark.capella#5ebf9054-720b-4c46-8ddb-d556548b12ab"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.oa:OperationalActivity" href="IncidentScenarioBenchmark.capella#f6af7ea3-196f-4c3f-8b52-75154362d1e0"/>
|
||||
<ownedStyle xmi:type="diagram:WorkspaceImage" uid="_aSiUIK9EEfGUao8nYtZHOA" showIcon="false" labelPosition="node" workspacePath="/org.polarsys.capella.core.sirius.analysis/description/images/handlelifeline.svg">
|
||||
<description xmi:type="style:WorkspaceImageDescription" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@nodeMappings[name='InstanceRoleMaping%20AIS']/@borderedNodeMappings[name='default%20execution%20AIS']/@borderedNodeMappings[name='endOfLifeAIS']/@style"/>
|
||||
</ownedStyle>
|
||||
<actualMapping xmi:type="description_1:EndOfLifeMapping" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@nodeMappings[name='InstanceRoleMaping%20AIS']/@borderedNodeMappings[name='default%20execution%20AIS']/@borderedNodeMappings[name='endOfLifeAIS']"/>
|
||||
</ownedBorderedNodes>
|
||||
<ownedBorderedNodes xmi:type="diagram:DNode" uid="_2nzgkK9EEfGUao8nYtZHOA" incomingEdges="_2o9-MK9EEfGUao8nYtZHOA" width="1" height="3" resizeKind="NSEW">
|
||||
<target xmi:type="org.polarsys.capella.core.data.interaction:Execution" href="IncidentScenarioBenchmark.capella#4bbeb6bd-6bc8-455f-8d8b-3a8f387343ef"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.interaction:Execution" href="IncidentScenarioBenchmark.capella#4bbeb6bd-6bc8-455f-8d8b-3a8f387343ef"/>
|
||||
<graphicalFilters xmi:type="diagram:AbsoluteBoundsFilter" uid="_26OtUK9EEfGUao8nYtZHOA" x="442" y="232" height="30" width="10"/>
|
||||
<ownedStyle xmi:type="diagram:Square" uid="_2n3yAK9EEfGUao8nYtZHOA" showIcon="false" labelColor="91,64,64" borderSize="1" borderSizeComputationExpression="1" borderColor="91,64,64" width="1" height="3" color="247,218,116">
|
||||
<description xmi:type="style:SquareDescription" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@nodeMappings[name='InstanceRoleMaping%20AIS']/@borderedNodeMappings[name='default%20execution%20AIS']/@borderedNodeMappings[name='Execution%20AIS']/@style"/>
|
||||
</ownedStyle>
|
||||
<actualMapping xmi:type="description_1:ExecutionMapping" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@nodeMappings[name='InstanceRoleMaping%20AIS']/@borderedNodeMappings[name='default%20execution%20AIS']/@borderedNodeMappings[name='Execution%20AIS']"/>
|
||||
</ownedBorderedNodes>
|
||||
<ownedStyle xmi:type="diagram:Square" uid="_aR7QIa9EEfGUao8nYtZHOA" showIcon="false" borderSize="1" borderSizeComputationExpression="1" borderColor="128,128,128" labelPosition="node" width="1" height="40" color="247,218,116">
|
||||
<description xmi:type="style:SquareDescription" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@nodeMappings[name='InstanceRoleMaping%20AIS']/@borderedNodeMappings[name='default%20execution%20AIS']/@style"/>
|
||||
</ownedStyle>
|
||||
<actualMapping xmi:type="description_1:ExecutionMapping" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@nodeMappings[name='InstanceRoleMaping%20AIS']/@borderedNodeMappings[name='default%20execution%20AIS']"/>
|
||||
</ownedBorderedNodes>
|
||||
<ownedStyle xmi:type="diagram:Square" uid="_aR4z4a9EEfGUao8nYtZHOA" labelColor="91,64,64" borderSize="1" borderSizeComputationExpression="1" borderColor="91,64,64" labelPosition="node" width="10" height="5" color="247,218,116">
|
||||
<description xmi:type="style:SquareDescription" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@nodeMappings[name='InstanceRoleMaping%20AIS']/@style"/>
|
||||
</ownedStyle>
|
||||
<actualMapping xmi:type="description_1:InstanceRoleMapping" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@nodeMappings[name='InstanceRoleMaping%20AIS']"/>
|
||||
</ownedDiagramElements>
|
||||
<ownedDiagramElements xmi:type="diagram:DEdge" uid="_2o9-MK9EEfGUao8nYtZHOA" name="Report incident" sourceNode="_QjjGUK9EEfGUao8nYtZHOA" targetNode="_2nzgkK9EEfGUao8nYtZHOA">
|
||||
<target xmi:type="org.polarsys.capella.core.data.interaction:SequenceMessage" href="IncidentScenarioBenchmark.capella#78c1cdb8-4cce-40ed-ae6c-299e7bc937c6"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.interaction:SequenceMessage" href="IncidentScenarioBenchmark.capella#78c1cdb8-4cce-40ed-ae6c-299e7bc937c6"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.interaction:MessageEnd" href="IncidentScenarioBenchmark.capella#ae01bc6a-4f12-45df-9cc0-88530d862dff"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.interaction:MessageEnd" href="IncidentScenarioBenchmark.capella#365b653f-e8c6-4f0d-bbd0-51ceb7f4b392"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.fa:FunctionalExchange" href="IncidentScenarioBenchmark.capella#549af3b2-0943-41a3-b0e3-57d0d99ec83f"/>
|
||||
<graphicalFilters xmi:type="diagram:AbsoluteBoundsFilter" uid="_2px2gK9EEfGUao8nYtZHOA" y="232" height="0"/>
|
||||
<ownedStyle xmi:type="diagram:EdgeStyle" uid="_2pSHQK9EEfGUao8nYtZHOA" strokeColor="0,0,0">
|
||||
<description xmi:type="style:EdgeStyleDescription" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@edgeMappings[name='Basic%20message%20mapping%20AIS']/@style"/>
|
||||
<centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_2pT8cK9EEfGUao8nYtZHOA" showIcon="false"/>
|
||||
</ownedStyle>
|
||||
<actualMapping xmi:type="description_1:BasicMessageMapping" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@edgeMappings[name='Basic%20message%20mapping%20AIS']"/>
|
||||
</ownedDiagramElements>
|
||||
<description xmi:type="description_1:SequenceDiagramDescription" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']"/>
|
||||
<activatedFilters xmi:type="filter:CompositeFilterDescription" href="platform:/plugin/org.polarsys.kitalpha.ad.integration.sirius/description/ad.odesign#//@ownedViewpoints[name='ad']/@ownedRepresentations[name='AD%20diagram']/@filters[name='ModelExtensionFilter']"/>
|
||||
<filterVariableHistory xmi:type="diagram:FilterVariableHistory" uid="_CxHRMK9EEfGUao8nYtZHOA"/>
|
||||
<activatedLayers xmi:type="description_2:Layer" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer"/>
|
||||
<target xmi:type="org.polarsys.capella.core.data.interaction:Scenario" href="IncidentScenarioBenchmark.capella#6aa3cccb-9adc-4230-993d-7ee80c250509"/>
|
||||
</sequence:SequenceDDiagram>
|
||||
</xmi:XMI>
|
||||
@@ -0,0 +1,320 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<!--Capella_Version_7.1.0-->
|
||||
<org.polarsys.capella.core.data.capellamodeller:Project xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:libraries="http://www.polarsys.org/capella/common/libraries/7.0.0"
|
||||
xmlns:org.polarsys.capella.core.data.capellacommon="http://www.polarsys.org/capella/core/common/7.0.0"
|
||||
xmlns:org.polarsys.capella.core.data.capellacore="http://www.polarsys.org/capella/core/core/7.0.0"
|
||||
xmlns:org.polarsys.capella.core.data.capellamodeller="http://www.polarsys.org/capella/core/modeller/7.0.0"
|
||||
xmlns:org.polarsys.capella.core.data.cs="http://www.polarsys.org/capella/core/cs/7.0.0"
|
||||
xmlns:org.polarsys.capella.core.data.ctx="http://www.polarsys.org/capella/core/ctx/7.0.0"
|
||||
xmlns:org.polarsys.capella.core.data.epbs="http://www.polarsys.org/capella/core/epbs/7.0.0"
|
||||
xmlns:org.polarsys.capella.core.data.fa="http://www.polarsys.org/capella/core/fa/7.0.0"
|
||||
xmlns:org.polarsys.capella.core.data.information="http://www.polarsys.org/capella/core/information/7.0.0"
|
||||
xmlns:org.polarsys.capella.core.data.information.datatype="http://www.polarsys.org/capella/core/information/datatype/7.0.0"
|
||||
xmlns:org.polarsys.capella.core.data.information.datavalue="http://www.polarsys.org/capella/core/information/datavalue/7.0.0"
|
||||
xmlns:org.polarsys.capella.core.data.interaction="http://www.polarsys.org/capella/core/interaction/7.0.0"
|
||||
xmlns:org.polarsys.capella.core.data.la="http://www.polarsys.org/capella/core/la/7.0.0"
|
||||
xmlns:org.polarsys.capella.core.data.oa="http://www.polarsys.org/capella/core/oa/7.0.0"
|
||||
xmlns:org.polarsys.capella.core.data.pa="http://www.polarsys.org/capella/core/pa/7.0.0"
|
||||
id="72f10eab-78fe-42a5-9b33-c8502b36dcf2"
|
||||
name="IncidentScenarioBenchmark">
|
||||
<ownedExtensions xsi:type="libraries:ModelInformation" id="eccf54b1-64b8-4ccf-b152-37d877017d88"/>
|
||||
<ownedEnumerationPropertyTypes xsi:type="org.polarsys.capella.core.data.capellacore:EnumerationPropertyType"
|
||||
id="a178583e-b1ed-465c-931a-2cae0b61665f" name="ProgressStatus">
|
||||
<ownedLiterals xsi:type="org.polarsys.capella.core.data.capellacore:EnumerationPropertyLiteral"
|
||||
id="9bc69305-639d-4bed-86ba-6f3a08f9ec8d" name="DRAFT"/>
|
||||
<ownedLiterals xsi:type="org.polarsys.capella.core.data.capellacore:EnumerationPropertyLiteral"
|
||||
id="78eff0ec-5690-4301-a970-08a53475a27a" name="TO_BE_REVIEWED"/>
|
||||
<ownedLiterals xsi:type="org.polarsys.capella.core.data.capellacore:EnumerationPropertyLiteral"
|
||||
id="16591e25-53e3-445c-828b-d5c76dccecd1" name="TO_BE_DISCUSSED"/>
|
||||
<ownedLiterals xsi:type="org.polarsys.capella.core.data.capellacore:EnumerationPropertyLiteral"
|
||||
id="da694787-0daa-4fb1-8864-a0e6ac4363c6" name="REWORK_NECESSARY"/>
|
||||
<ownedLiterals xsi:type="org.polarsys.capella.core.data.capellacore:EnumerationPropertyLiteral"
|
||||
id="8e75072c-392c-4020-ba9b-4173ffc637f1" name="UNDER_REWORK"/>
|
||||
<ownedLiterals xsi:type="org.polarsys.capella.core.data.capellacore:EnumerationPropertyLiteral"
|
||||
id="141bf3ce-4ace-4c1f-af73-448c9b732b1c" name="REVIEWED_OK"/>
|
||||
</ownedEnumerationPropertyTypes>
|
||||
<keyValuePairs xsi:type="org.polarsys.capella.core.data.capellacore:KeyValue" id="42c0a932-4f50-492e-9745-8a182f50f7a1"
|
||||
key="projectApproach" value="SingletonComponents"/>
|
||||
<ownedModelRoots xsi:type="org.polarsys.capella.core.data.capellamodeller:SystemEngineering"
|
||||
id="bfe51079-a523-4489-bc5d-a4886fd13c1c" name="IncidentScenarioBenchmark">
|
||||
<ownedArchitectures xsi:type="org.polarsys.capella.core.data.oa:OperationalAnalysis"
|
||||
id="bfcd2964-812e-4106-8ca0-6fa2c2688c91" name="Operational Analysis">
|
||||
<ownedFunctionPkg xsi:type="org.polarsys.capella.core.data.oa:OperationalActivityPkg"
|
||||
id="5ad0311b-7902-4d71-92a3-31106d97f742" name="Operational Activities">
|
||||
<ownedOperationalActivities xsi:type="org.polarsys.capella.core.data.oa:OperationalActivity"
|
||||
id="ede29e45-fa93-490b-b5eb-27f2ee692bfd" name="Root Operational Activity">
|
||||
<ownedFunctions xsi:type="org.polarsys.capella.core.data.oa:OperationalActivity"
|
||||
id="2e2d08d5-9c42-4e33-af81-222efa4c992c" name="OperationalActivity 1"/>
|
||||
<ownedFunctions xsi:type="org.polarsys.capella.core.data.oa:OperationalActivity"
|
||||
id="f6af7ea3-196f-4c3f-8b52-75154362d1e0" name="OperationalActivity 2"/>
|
||||
<ownedFunctionalExchanges xsi:type="org.polarsys.capella.core.data.fa:FunctionalExchange"
|
||||
id="549af3b2-0943-41a3-b0e3-57d0d99ec83f" name="Report incident" target="#f6af7ea3-196f-4c3f-8b52-75154362d1e0"
|
||||
source="#2e2d08d5-9c42-4e33-af81-222efa4c992c"/>
|
||||
</ownedOperationalActivities>
|
||||
</ownedFunctionPkg>
|
||||
<ownedAbstractCapabilityPkg xsi:type="org.polarsys.capella.core.data.oa:OperationalCapabilityPkg"
|
||||
id="fb6f8967-c853-4336-b35b-82c5b78c372c" name="Operational Capabilities">
|
||||
<ownedOperationalCapabilities xsi:type="org.polarsys.capella.core.data.oa:OperationalCapability"
|
||||
id="883098d9-9d02-4ce0-85aa-41c6219105d9" name="OperationalCapability 1">
|
||||
<ownedScenarios xsi:type="org.polarsys.capella.core.data.interaction:Scenario"
|
||||
id="6aa3cccb-9adc-4230-993d-7ee80c250509" name="[OAS] OperationalCapability 1"
|
||||
kind="INTERACTION">
|
||||
<ownedInstanceRoles xsi:type="org.polarsys.capella.core.data.interaction:InstanceRole"
|
||||
id="86b77dcf-5283-4bc0-8d6a-25936ad7e857" name="OperationalActivity 1"
|
||||
representedInstance="#2e2d08d5-9c42-4e33-af81-222efa4c992c"/>
|
||||
<ownedInstanceRoles xsi:type="org.polarsys.capella.core.data.interaction:InstanceRole"
|
||||
id="5ebf9054-720b-4c46-8ddb-d556548b12ab" name="OperationalActivity 2"
|
||||
representedInstance="#f6af7ea3-196f-4c3f-8b52-75154362d1e0"/>
|
||||
<ownedMessages xsi:type="org.polarsys.capella.core.data.interaction:SequenceMessage"
|
||||
id="78c1cdb8-4cce-40ed-ae6c-299e7bc937c6" name="Report incident" kind="ASYNCHRONOUS_CALL"
|
||||
sendingEnd="#365b653f-e8c6-4f0d-bbd0-51ceb7f4b392" receivingEnd="#ae01bc6a-4f12-45df-9cc0-88530d862dff"/>
|
||||
<ownedInteractionFragments xsi:type="org.polarsys.capella.core.data.interaction:MessageEnd"
|
||||
id="365b653f-e8c6-4f0d-bbd0-51ceb7f4b392" name="Send Call Message Call"
|
||||
coveredInstanceRoles="#86b77dcf-5283-4bc0-8d6a-25936ad7e857" event="#0b4cd564-e84f-4313-bf47-afa1803e634f"/>
|
||||
<ownedInteractionFragments xsi:type="org.polarsys.capella.core.data.interaction:MessageEnd"
|
||||
id="ae01bc6a-4f12-45df-9cc0-88530d862dff" name="Receive Call Message Call"
|
||||
coveredInstanceRoles="#5ebf9054-720b-4c46-8ddb-d556548b12ab" event="#00361425-0782-4351-8855-b3dc70f275e6"/>
|
||||
<ownedInteractionFragments xsi:type="org.polarsys.capella.core.data.interaction:ExecutionEnd"
|
||||
id="172ecc73-db4f-4299-8215-718e53f39824" name="endExec" coveredInstanceRoles="#5ebf9054-720b-4c46-8ddb-d556548b12ab"
|
||||
event="#16ad20e5-9721-462c-a110-80e67e78879e"/>
|
||||
<ownedTimeLapses xsi:type="org.polarsys.capella.core.data.interaction:Execution"
|
||||
id="4bbeb6bd-6bc8-455f-8d8b-3a8f387343ef" start="#ae01bc6a-4f12-45df-9cc0-88530d862dff"
|
||||
finish="#172ecc73-db4f-4299-8215-718e53f39824"/>
|
||||
<ownedEvents xsi:type="org.polarsys.capella.core.data.interaction:EventSentOperation"
|
||||
id="0b4cd564-e84f-4313-bf47-afa1803e634f" operation="#549af3b2-0943-41a3-b0e3-57d0d99ec83f"/>
|
||||
<ownedEvents xsi:type="org.polarsys.capella.core.data.interaction:EventReceiptOperation"
|
||||
id="00361425-0782-4351-8855-b3dc70f275e6" operation="#549af3b2-0943-41a3-b0e3-57d0d99ec83f"/>
|
||||
<ownedEvents xsi:type="org.polarsys.capella.core.data.interaction:ExecutionEvent"
|
||||
id="16ad20e5-9721-462c-a110-80e67e78879e"/>
|
||||
</ownedScenarios>
|
||||
<ownedAbstractFunctionAbstractCapabilityInvolvements xsi:type="org.polarsys.capella.core.data.interaction:AbstractFunctionAbstractCapabilityInvolvement"
|
||||
id="405b8dc5-cefe-4da7-9afe-9e5ba074681a" involved="#2e2d08d5-9c42-4e33-af81-222efa4c992c"/>
|
||||
<ownedAbstractFunctionAbstractCapabilityInvolvements xsi:type="org.polarsys.capella.core.data.interaction:AbstractFunctionAbstractCapabilityInvolvement"
|
||||
id="6e620637-9ee6-42b2-96ae-777de090f679" involved="#f6af7ea3-196f-4c3f-8b52-75154362d1e0"/>
|
||||
</ownedOperationalCapabilities>
|
||||
</ownedAbstractCapabilityPkg>
|
||||
<ownedInterfacePkg xsi:type="org.polarsys.capella.core.data.cs:InterfacePkg"
|
||||
id="cc185763-3fef-4d26-a482-237ab4d7d293" name="Interfaces"/>
|
||||
<ownedDataPkg xsi:type="org.polarsys.capella.core.data.information:DataPkg"
|
||||
id="fa555965-a2b6-45b6-a2f7-6522115bbd8d" name="Data"/>
|
||||
<ownedRolePkg xsi:type="org.polarsys.capella.core.data.oa:RolePkg" id="895e41df-8cec-4eb2-a5ae-86a5425db4bd"
|
||||
name="Roles"/>
|
||||
<ownedEntityPkg xsi:type="org.polarsys.capella.core.data.oa:EntityPkg" id="766c177f-e1f3-4891-aa86-a5d73b500ad2"
|
||||
name="Operational Entities"/>
|
||||
</ownedArchitectures>
|
||||
<ownedArchitectures xsi:type="org.polarsys.capella.core.data.ctx:SystemAnalysis"
|
||||
id="4cc8d915-4830-48f3-afe4-217934792e38" name="System Analysis">
|
||||
<ownedFunctionPkg xsi:type="org.polarsys.capella.core.data.ctx:SystemFunctionPkg"
|
||||
id="92108fcf-42c1-4366-9917-f28e2d2b04b2" name="System Functions">
|
||||
<ownedSystemFunctions xsi:type="org.polarsys.capella.core.data.ctx:SystemFunction"
|
||||
id="985173ac-059e-4cb8-957d-c546987995ab" name="Root System Function">
|
||||
<ownedFunctionRealizations xsi:type="org.polarsys.capella.core.data.fa:FunctionRealization"
|
||||
id="88ee9314-86f7-4e96-a027-cd1f7b7bff77" targetElement="#ede29e45-fa93-490b-b5eb-27f2ee692bfd"
|
||||
sourceElement="#985173ac-059e-4cb8-957d-c546987995ab"/>
|
||||
</ownedSystemFunctions>
|
||||
</ownedFunctionPkg>
|
||||
<ownedAbstractCapabilityPkg xsi:type="org.polarsys.capella.core.data.ctx:CapabilityPkg"
|
||||
id="1bb5124b-42dc-4988-ae28-d6259137cfad" name="Capabilities"/>
|
||||
<ownedInterfacePkg xsi:type="org.polarsys.capella.core.data.cs:InterfacePkg"
|
||||
id="cdf1bdc0-6a49-4006-8488-b6366f155add" name="Interfaces"/>
|
||||
<ownedDataPkg xsi:type="org.polarsys.capella.core.data.information:DataPkg"
|
||||
id="853089ca-1be1-4cb9-afc4-bd2f4233bc36" name="Data">
|
||||
<ownedDataPkgs xsi:type="org.polarsys.capella.core.data.information:DataPkg"
|
||||
id="2025d8a5-46e2-4735-99f3-d1d247561a8b" name="Predefined Types">
|
||||
<ownedDataTypes xsi:type="org.polarsys.capella.core.data.information.datatype:BooleanType"
|
||||
id="8f26e095-bb06-4b24-983b-1da94255ab3b" name="Boolean" visibility="PUBLIC">
|
||||
<ownedLiterals xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralBooleanValue"
|
||||
id="1ff8e3ca-5929-4bea-acea-10d72a22e7a9" name="True" abstractType="#8f26e095-bb06-4b24-983b-1da94255ab3b"
|
||||
value="true"/>
|
||||
<ownedLiterals xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralBooleanValue"
|
||||
id="07a94c57-4004-4a97-9d97-04abbd532fa4" name="False" abstractType="#8f26e095-bb06-4b24-983b-1da94255ab3b"/>
|
||||
</ownedDataTypes>
|
||||
<ownedDataTypes xsi:type="org.polarsys.capella.core.data.information.datatype:NumericType"
|
||||
id="7d9bea93-735c-4e1b-8145-1f77c6c431b6" name="Byte" visibility="PUBLIC">
|
||||
<ownedMinValue xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"
|
||||
id="1c4b1ea1-e589-46db-adc2-f524b683ee2a" name="" abstractType="#7d9bea93-735c-4e1b-8145-1f77c6c431b6"
|
||||
value="0"/>
|
||||
<ownedMaxValue xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"
|
||||
id="cdc4481e-27f5-409b-899e-026097e1c5ff" name="" abstractType="#7d9bea93-735c-4e1b-8145-1f77c6c431b6"
|
||||
value="255"/>
|
||||
</ownedDataTypes>
|
||||
<ownedDataTypes xsi:type="org.polarsys.capella.core.data.information.datatype:StringType"
|
||||
id="6ba5ef8b-900e-481f-be03-214c0377a5e1" name="Char" visibility="PUBLIC">
|
||||
<ownedMinLength xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"
|
||||
id="6adaf5f4-3dbe-4d6c-8db0-f43b88ac7a67" name="" abstractType="#dc2d02f3-37aa-4f19-901e-9ab20076772f"
|
||||
value="1"/>
|
||||
<ownedMaxLength xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"
|
||||
id="39e9e7c8-019b-45cb-b570-2cfce432d159" name="" abstractType="#dc2d02f3-37aa-4f19-901e-9ab20076772f"
|
||||
value="1"/>
|
||||
</ownedDataTypes>
|
||||
<ownedDataTypes xsi:type="org.polarsys.capella.core.data.information.datatype:NumericType"
|
||||
id="08a79fe4-c4c2-4f3b-b5ef-2ee147318510" name="Double" discrete="false"
|
||||
visibility="PUBLIC" kind="FLOAT"/>
|
||||
<ownedDataTypes xsi:type="org.polarsys.capella.core.data.information.datatype:NumericType"
|
||||
id="543264ff-da7a-469e-920f-8d0584a30459" name="Float" discrete="false"
|
||||
visibility="PUBLIC" kind="FLOAT"/>
|
||||
<ownedDataTypes xsi:type="org.polarsys.capella.core.data.information.datatype:NumericType"
|
||||
id="bbdd469d-9c57-443f-aa9c-9baf135dd156" name="Hexadecimal" visibility="PUBLIC">
|
||||
<ownedMinValue xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"
|
||||
id="dde5c274-d9f3-4a57-9abe-021b5f00d75d" name="" abstractType="#bbdd469d-9c57-443f-aa9c-9baf135dd156"
|
||||
value="0"/>
|
||||
<ownedMaxValue xsi:type="org.polarsys.capella.core.data.information.datavalue:BinaryExpression"
|
||||
id="503f03ce-f4be-4d38-a5f5-d1aebaf7c669" abstractType="#bbdd469d-9c57-443f-aa9c-9baf135dd156"
|
||||
operator="SUB">
|
||||
<ownedLeftOperand xsi:type="org.polarsys.capella.core.data.information.datavalue:BinaryExpression"
|
||||
id="502c050e-dbde-40b3-94ba-8c786a5a4cb7" operator="POW">
|
||||
<ownedLeftOperand xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"
|
||||
id="dea69498-e49d-4e7c-9467-3962a3946814" value="2"/>
|
||||
<ownedRightOperand xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"
|
||||
id="c5aa9fd0-a2e7-4f4f-8043-b6a2b6b7b5d3" value="64"/>
|
||||
</ownedLeftOperand>
|
||||
<ownedRightOperand xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"
|
||||
id="43b57a64-afed-448a-bbc6-d9202d2c8aa6" value="1"/>
|
||||
</ownedMaxValue>
|
||||
</ownedDataTypes>
|
||||
<ownedDataTypes xsi:type="org.polarsys.capella.core.data.information.datatype:NumericType"
|
||||
id="75b39451-e2b5-4c51-804c-9673071b8591" name="Integer" visibility="PUBLIC"/>
|
||||
<ownedDataTypes xsi:type="org.polarsys.capella.core.data.information.datatype:NumericType"
|
||||
id="ab4bd3d7-6076-4fe6-96ed-0c7bd6e19ebf" name="Long" visibility="PUBLIC"/>
|
||||
<ownedDataTypes xsi:type="org.polarsys.capella.core.data.information.datatype:NumericType"
|
||||
id="391675ca-a8a4-4bae-81e0-2c5d55770bc0" name="LongLong" visibility="PUBLIC"/>
|
||||
<ownedDataTypes xsi:type="org.polarsys.capella.core.data.information.datatype:NumericType"
|
||||
id="ed08d80d-71e7-4818-96c4-5e0062a0fbc5" name="Short" visibility="PUBLIC"/>
|
||||
<ownedDataTypes xsi:type="org.polarsys.capella.core.data.information.datatype:StringType"
|
||||
id="f2ba99f3-aa24-415b-82dd-56b6aec41070" name="String" visibility="PUBLIC"/>
|
||||
<ownedDataTypes xsi:type="org.polarsys.capella.core.data.information.datatype:NumericType"
|
||||
id="4e0589b8-0400-470b-adee-6d79022bdaec" name="UnsignedInteger" maxInclusive="false"
|
||||
visibility="PUBLIC">
|
||||
<ownedMinValue xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"
|
||||
id="3a574e71-959d-4ed5-8697-dd51a8c85859" name="" abstractType="#4e0589b8-0400-470b-adee-6d79022bdaec"
|
||||
value="0"/>
|
||||
</ownedDataTypes>
|
||||
<ownedDataTypes xsi:type="org.polarsys.capella.core.data.information.datatype:NumericType"
|
||||
id="dc2d02f3-37aa-4f19-901e-9ab20076772f" name="UnsignedShort" maxInclusive="false"
|
||||
visibility="PUBLIC">
|
||||
<ownedMinValue xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"
|
||||
id="c89fe27e-4cec-4fbc-82b4-0ce6f6fa6270" name="" abstractType="#dc2d02f3-37aa-4f19-901e-9ab20076772f"
|
||||
value="0"/>
|
||||
</ownedDataTypes>
|
||||
<ownedDataTypes xsi:type="org.polarsys.capella.core.data.information.datatype:NumericType"
|
||||
id="951feec2-545b-4dc1-aa52-7341189b7fa9" name="UnsignedLong" maxInclusive="false"
|
||||
visibility="PUBLIC">
|
||||
<ownedMinValue xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"
|
||||
id="73a0e0ba-a8be-4aac-a0b9-8cfecd35edcb" name="" abstractType="#951feec2-545b-4dc1-aa52-7341189b7fa9"
|
||||
value="0"/>
|
||||
</ownedDataTypes>
|
||||
<ownedDataTypes xsi:type="org.polarsys.capella.core.data.information.datatype:NumericType"
|
||||
id="3acaf46c-cf7f-4350-ae0c-ab938ec82e19" name="UnsignedLongLong" maxInclusive="false"
|
||||
visibility="PUBLIC">
|
||||
<ownedMinValue xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"
|
||||
id="4d1f3c91-38bb-4709-9f3a-f47a3f17d59f" name="" abstractType="#3acaf46c-cf7f-4350-ae0c-ab938ec82e19"
|
||||
value="0"/>
|
||||
</ownedDataTypes>
|
||||
</ownedDataPkgs>
|
||||
</ownedDataPkg>
|
||||
<ownedSystemComponentPkg xsi:type="org.polarsys.capella.core.data.ctx:SystemComponentPkg"
|
||||
id="3ea1987b-f8c5-4c59-b2bd-cdf19c831006" name="Structure">
|
||||
<ownedParts xsi:type="org.polarsys.capella.core.data.cs:Part" id="eb3a7738-b4c2-4257-beff-935941de3301"
|
||||
name="System" abstractType="#7b1c3c2b-e539-43fd-a843-f85207c898c3"/>
|
||||
<ownedSystemComponents xsi:type="org.polarsys.capella.core.data.ctx:SystemComponent"
|
||||
id="7b1c3c2b-e539-43fd-a843-f85207c898c3" name="System">
|
||||
<ownedStateMachines xsi:type="org.polarsys.capella.core.data.capellacommon:StateMachine"
|
||||
id="08986259-eb05-4a6b-86a3-f07848436b58" name="System State Machine">
|
||||
<ownedRegions xsi:type="org.polarsys.capella.core.data.capellacommon:Region"
|
||||
id="b92a987d-a3a4-4703-9696-772ac1d5a0c8" name="Default Region"/>
|
||||
</ownedStateMachines>
|
||||
</ownedSystemComponents>
|
||||
</ownedSystemComponentPkg>
|
||||
<ownedMissionPkg xsi:type="org.polarsys.capella.core.data.ctx:MissionPkg" id="82ef3879-b6e6-47ca-81f0-deb0510403f3"
|
||||
name="Missions"/>
|
||||
<ownedOperationalAnalysisRealizations xsi:type="org.polarsys.capella.core.data.ctx:OperationalAnalysisRealization"
|
||||
id="5ba73e27-b90a-424b-a3a6-9e1979207512" targetElement="#bfcd2964-812e-4106-8ca0-6fa2c2688c91"
|
||||
sourceElement="#4cc8d915-4830-48f3-afe4-217934792e38"/>
|
||||
</ownedArchitectures>
|
||||
<ownedArchitectures xsi:type="org.polarsys.capella.core.data.la:LogicalArchitecture"
|
||||
id="0513bf71-0242-443b-81c2-09139f99b2f5" name="Logical Architecture">
|
||||
<ownedFunctionPkg xsi:type="org.polarsys.capella.core.data.la:LogicalFunctionPkg"
|
||||
id="37467730-4fab-4bbc-ba5f-525db27bbfbe" name="Logical Functions">
|
||||
<ownedLogicalFunctions xsi:type="org.polarsys.capella.core.data.la:LogicalFunction"
|
||||
id="0c56a530-9859-47ee-b73e-fb0b879ffc7b" name="Root Logical Function">
|
||||
<ownedFunctionRealizations xsi:type="org.polarsys.capella.core.data.fa:FunctionRealization"
|
||||
id="ac365b57-7ed4-4330-aada-78ddb4c5c4db" targetElement="#985173ac-059e-4cb8-957d-c546987995ab"
|
||||
sourceElement="#0c56a530-9859-47ee-b73e-fb0b879ffc7b"/>
|
||||
</ownedLogicalFunctions>
|
||||
</ownedFunctionPkg>
|
||||
<ownedAbstractCapabilityPkg xsi:type="org.polarsys.capella.core.data.la:CapabilityRealizationPkg"
|
||||
id="f3311586-12e1-46c8-800a-d6a767e51a66" name="Capabilities"/>
|
||||
<ownedInterfacePkg xsi:type="org.polarsys.capella.core.data.cs:InterfacePkg"
|
||||
id="12c4c0a7-c787-426d-85cb-828ce9b2c929" name="Interfaces"/>
|
||||
<ownedDataPkg xsi:type="org.polarsys.capella.core.data.information:DataPkg"
|
||||
id="ddd4b687-fa54-486a-a996-a2580c16bdf0" name="Data"/>
|
||||
<ownedLogicalComponentPkg xsi:type="org.polarsys.capella.core.data.la:LogicalComponentPkg"
|
||||
id="2efdb257-6803-42c9-b295-e8de811a4c3b" name="Structure">
|
||||
<ownedParts xsi:type="org.polarsys.capella.core.data.cs:Part" id="6fae67f3-8948-42bf-82b3-f64c66c4b678"
|
||||
name="Logical System" abstractType="#5698d778-e688-4558-ab44-28c6ff4160e5"/>
|
||||
<ownedLogicalComponents xsi:type="org.polarsys.capella.core.data.la:LogicalComponent"
|
||||
id="5698d778-e688-4558-ab44-28c6ff4160e5" name="Logical System">
|
||||
<ownedComponentRealizations xsi:type="org.polarsys.capella.core.data.cs:ComponentRealization"
|
||||
id="d860709b-985b-43a4-a94a-fcbd3818f63b" targetElement="#7b1c3c2b-e539-43fd-a843-f85207c898c3"
|
||||
sourceElement="#5698d778-e688-4558-ab44-28c6ff4160e5"/>
|
||||
</ownedLogicalComponents>
|
||||
</ownedLogicalComponentPkg>
|
||||
<ownedSystemAnalysisRealizations xsi:type="org.polarsys.capella.core.data.la:SystemAnalysisRealization"
|
||||
id="32116e47-111c-473f-9ad7-c2220fb3a966" targetElement="#4cc8d915-4830-48f3-afe4-217934792e38"
|
||||
sourceElement="#0513bf71-0242-443b-81c2-09139f99b2f5"/>
|
||||
</ownedArchitectures>
|
||||
<ownedArchitectures xsi:type="org.polarsys.capella.core.data.pa:PhysicalArchitecture"
|
||||
id="e0888733-c04b-4628-af93-bf08dd37eefd" name="Physical Architecture">
|
||||
<ownedFunctionPkg xsi:type="org.polarsys.capella.core.data.pa:PhysicalFunctionPkg"
|
||||
id="ecff6686-819d-41a5-b73a-52ee0e374078" name="Physical Functions">
|
||||
<ownedPhysicalFunctions xsi:type="org.polarsys.capella.core.data.pa:PhysicalFunction"
|
||||
id="bf38e330-6042-4d71-a5e6-b0827a02b8ab" name="Root Physical Function">
|
||||
<ownedFunctionRealizations xsi:type="org.polarsys.capella.core.data.fa:FunctionRealization"
|
||||
id="3c789844-d978-48b8-ba24-6fd31d6b9833" targetElement="#0c56a530-9859-47ee-b73e-fb0b879ffc7b"
|
||||
sourceElement="#bf38e330-6042-4d71-a5e6-b0827a02b8ab"/>
|
||||
</ownedPhysicalFunctions>
|
||||
</ownedFunctionPkg>
|
||||
<ownedAbstractCapabilityPkg xsi:type="org.polarsys.capella.core.data.la:CapabilityRealizationPkg"
|
||||
id="891d2f98-ce0a-4e31-8b89-b02a3343425c" name="Capabilities"/>
|
||||
<ownedInterfacePkg xsi:type="org.polarsys.capella.core.data.cs:InterfacePkg"
|
||||
id="4d94f1dd-6c9c-4722-b05f-c33f1de04c5f" name="Interfaces"/>
|
||||
<ownedDataPkg xsi:type="org.polarsys.capella.core.data.information:DataPkg"
|
||||
id="b12698b9-ec55-4ed9-93d8-d5d5a0194424" name="Data"/>
|
||||
<ownedPhysicalComponentPkg xsi:type="org.polarsys.capella.core.data.pa:PhysicalComponentPkg"
|
||||
id="9fb8391a-4ef2-4edd-b07d-ff4895334b10" name="Structure">
|
||||
<ownedParts xsi:type="org.polarsys.capella.core.data.cs:Part" id="b119f8ae-25d2-4b62-b894-5bd6e53e6f88"
|
||||
name="Physical System" abstractType="#743aab95-dcb8-4d15-8a1d-0155462fd64f"/>
|
||||
<ownedPhysicalComponents xsi:type="org.polarsys.capella.core.data.pa:PhysicalComponent"
|
||||
id="743aab95-dcb8-4d15-8a1d-0155462fd64f" name="Physical System">
|
||||
<ownedComponentRealizations xsi:type="org.polarsys.capella.core.data.cs:ComponentRealization"
|
||||
id="b0d84c42-b863-47d5-bec5-2d29d92fbf6e" targetElement="#5698d778-e688-4558-ab44-28c6ff4160e5"
|
||||
sourceElement="#743aab95-dcb8-4d15-8a1d-0155462fd64f"/>
|
||||
</ownedPhysicalComponents>
|
||||
</ownedPhysicalComponentPkg>
|
||||
<ownedLogicalArchitectureRealizations xsi:type="org.polarsys.capella.core.data.pa:LogicalArchitectureRealization"
|
||||
id="747e4f0c-1393-49bf-9ecb-cef071edf644" targetElement="#0513bf71-0242-443b-81c2-09139f99b2f5"
|
||||
sourceElement="#e0888733-c04b-4628-af93-bf08dd37eefd"/>
|
||||
</ownedArchitectures>
|
||||
<ownedArchitectures xsi:type="org.polarsys.capella.core.data.epbs:EPBSArchitecture"
|
||||
id="21ab5363-b975-47a0-ab6d-4c7bfc8b39ae" name="EPBS Architecture">
|
||||
<ownedAbstractCapabilityPkg xsi:type="org.polarsys.capella.core.data.la:CapabilityRealizationPkg"
|
||||
id="1fbbfc46-2340-44f5-b169-d83c43384bfc" name="Capabilities"/>
|
||||
<ownedConfigurationItemPkg xsi:type="org.polarsys.capella.core.data.epbs:ConfigurationItemPkg"
|
||||
id="407e72d1-c0ea-4593-91b7-ebac809e1458" name="Structure">
|
||||
<ownedParts xsi:type="org.polarsys.capella.core.data.cs:Part" id="78a2aac3-3d27-4b38-b975-54afb1c564a3"
|
||||
name="System" abstractType="#779f4a3f-6056-4a49-9e46-58da3793925e"/>
|
||||
<ownedConfigurationItems xsi:type="org.polarsys.capella.core.data.epbs:ConfigurationItem"
|
||||
id="779f4a3f-6056-4a49-9e46-58da3793925e" name="System" kind="SystemCI">
|
||||
<ownedPhysicalArtifactRealizations xsi:type="org.polarsys.capella.core.data.epbs:PhysicalArtifactRealization"
|
||||
id="cb95c6c0-dce8-4c12-bfe1-bf14d84d2796" targetElement="#743aab95-dcb8-4d15-8a1d-0155462fd64f"
|
||||
sourceElement="#779f4a3f-6056-4a49-9e46-58da3793925e"/>
|
||||
</ownedConfigurationItems>
|
||||
</ownedConfigurationItemPkg>
|
||||
<ownedPhysicalArchitectureRealizations xsi:type="org.polarsys.capella.core.data.epbs:PhysicalArchitectureRealization"
|
||||
id="2e60c3b5-085e-4ea9-8aa6-23f8857886ef" targetElement="#e0888733-c04b-4628-af93-bf08dd37eefd"
|
||||
sourceElement="#21ab5363-b975-47a0-ab6d-4c7bfc8b39ae"/>
|
||||
</ownedArchitectures>
|
||||
</ownedModelRoots>
|
||||
</org.polarsys.capella.core.data.capellamodeller:Project>
|
||||
@@ -0,0 +1,218 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:description="http://www.eclipse.org/sirius/description/1.1.0" xmlns:description_1="http://www.eclipse.org/sirius/diagram/sequence/description/2.0.0" xmlns:description_2="http://www.eclipse.org/sirius/diagram/description/1.1.0" xmlns:diagram="http://www.eclipse.org/sirius/diagram/1.1.0" xmlns:filter="http://www.eclipse.org/sirius/diagram/description/filter/1.1.0" xmlns:notation="http://www.eclipse.org/gmf/runtime/1.0.3/notation" xmlns:org.polarsys.capella.core.data.fa="http://www.polarsys.org/capella/core/fa/7.0.0" xmlns:org.polarsys.capella.core.data.interaction="http://www.polarsys.org/capella/core/interaction/7.0.0" xmlns:org.polarsys.capella.core.data.oa="http://www.polarsys.org/capella/core/oa/7.0.0" xmlns:sequence="http://www.eclipse.org/sirius/diagram/sequence/2.0.0" xmlns:style="http://www.eclipse.org/sirius/diagram/description/style/1.1.0" xmlns:viewpoint="http://www.eclipse.org/sirius/1.1.0" xsi:schemaLocation="http://www.eclipse.org/sirius/description/1.1.0 http://www.eclipse.org/sirius/1.1.0#//description http://www.eclipse.org/sirius/diagram/sequence/description/2.0.0 http://www.eclipse.org/sirius/diagram/sequence/2.0.0#//description http://www.eclipse.org/sirius/diagram/description/1.1.0 http://www.eclipse.org/sirius/diagram/1.1.0#//description http://www.eclipse.org/sirius/diagram/description/filter/1.1.0 http://www.eclipse.org/sirius/diagram/1.1.0#//description/filter http://www.eclipse.org/sirius/diagram/description/style/1.1.0 http://www.eclipse.org/sirius/diagram/1.1.0#//description/style">
|
||||
<viewpoint:DAnalysis uid="_aGG3IK9DEfGUao8nYtZHOA" selectedViews="_jKVQsK9DEfGUao8nYtZHOA _j6oFMK9DEfGUao8nYtZHOA _k_n-YK9DEfGUao8nYtZHOA _lbLR8K9DEfGUao8nYtZHOA _lkvdoK9DEfGUao8nYtZHOA _lnCjsK9DEfGUao8nYtZHOA _lneokK9DEfGUao8nYtZHOA" version="15.4.1.202403191723">
|
||||
<semanticResources>IncidentScenarioBenchmark.afm</semanticResources>
|
||||
<semanticResources>IncidentScenarioBenchmark.capella</semanticResources>
|
||||
<ownedViews xmi:type="viewpoint:DView" uid="_jKVQsK9DEfGUao8nYtZHOA">
|
||||
<viewpoint xmi:type="description:Viewpoint" href="platform:/plugin/org.polarsys.kitalpha.ad.integration.sirius/description/ad.odesign#//@ownedViewpoints[name='ad']"/>
|
||||
</ownedViews>
|
||||
<ownedViews xmi:type="viewpoint:DView" uid="_j6oFMK9DEfGUao8nYtZHOA">
|
||||
<viewpoint xmi:type="description:Viewpoint" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']"/>
|
||||
<ownedRepresentationDescriptors xmi:type="viewpoint:DRepresentationDescriptor" uid="_CzkvUK9EEfGUao8nYtZHOA" name="[OAS] OperationalCapability 1" repPath="#_Cvs78K9EEfGUao8nYtZHOA" changeId="1789284570297">
|
||||
<description xmi:type="description_1:SequenceDiagramDescription" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']"/>
|
||||
<target xmi:type="org.polarsys.capella.core.data.interaction:Scenario" href="IncidentScenarioBenchmark.capella#6aa3cccb-9adc-4230-993d-7ee80c250509"/>
|
||||
</ownedRepresentationDescriptors>
|
||||
</ownedViews>
|
||||
<ownedViews xmi:type="viewpoint:DView" uid="_k_n-YK9DEfGUao8nYtZHOA">
|
||||
<viewpoint xmi:type="description:Viewpoint" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/common.odesign#//@ownedViewpoints[name='Common']"/>
|
||||
</ownedViews>
|
||||
<ownedViews xmi:type="viewpoint:DView" uid="_lbLR8K9DEfGUao8nYtZHOA">
|
||||
<viewpoint xmi:type="description:Viewpoint" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/context.odesign#//@ownedViewpoints[name='System%20Analysis']"/>
|
||||
</ownedViews>
|
||||
<ownedViews xmi:type="viewpoint:DView" uid="_lkvdoK9DEfGUao8nYtZHOA">
|
||||
<viewpoint xmi:type="description:Viewpoint" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/logical.odesign#//@ownedViewpoints[name='Logical%20Architecture']"/>
|
||||
</ownedViews>
|
||||
<ownedViews xmi:type="viewpoint:DView" uid="_lnCjsK9DEfGUao8nYtZHOA">
|
||||
<viewpoint xmi:type="description:Viewpoint" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/EPBS.odesign#//@ownedViewpoints[name='EPBS%20architecture']"/>
|
||||
</ownedViews>
|
||||
<ownedViews xmi:type="viewpoint:DView" uid="_lneokK9DEfGUao8nYtZHOA">
|
||||
<viewpoint xmi:type="description:Viewpoint" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/physical.odesign#//@ownedViewpoints[name='Physical%20Architecture']"/>
|
||||
</ownedViews>
|
||||
</viewpoint:DAnalysis>
|
||||
<sequence:SequenceDDiagram uid="_Cvs78K9EEfGUao8nYtZHOA">
|
||||
<ownedAnnotationEntries xmi:type="description:AnnotationEntry" uid="_C2IUEK9EEfGUao8nYtZHOA" source="GMF_DIAGRAMS">
|
||||
<data xmi:type="notation:Diagram" xmi:id="_C2IUEa9EEfGUao8nYtZHOA" type="Sirius" element="_Cvs78K9EEfGUao8nYtZHOA" measurementUnit="Pixel">
|
||||
<children xmi:type="notation:Node" xmi:id="_Qmo2kK9EEfGUao8nYtZHOA" type="2001" element="_Qhyy0K9EEfGUao8nYtZHOA">
|
||||
<children xmi:type="notation:Node" xmi:id="_QnNeUK9EEfGUao8nYtZHOA" type="5002">
|
||||
<layoutConstraint xmi:type="notation:Location" xmi:id="_QnNeUa9EEfGUao8nYtZHOA" y="5"/>
|
||||
</children>
|
||||
<children xmi:type="notation:Node" xmi:id="_QnUzEK9EEfGUao8nYtZHOA" type="3001" element="_QjjGUK9EEfGUao8nYtZHOA">
|
||||
<children xmi:type="notation:Node" xmi:id="_QnWBMK9EEfGUao8nYtZHOA" type="5001">
|
||||
<layoutConstraint xmi:type="notation:Location" xmi:id="_QnWBMa9EEfGUao8nYtZHOA" y="5"/>
|
||||
</children>
|
||||
<children xmi:type="notation:Node" xmi:id="_QoEZ8K9EEfGUao8nYtZHOA" type="3003" element="_QjlikK9EEfGUao8nYtZHOA">
|
||||
<styles xmi:type="notation:ShapeStyle" xmi:id="_QoEZ8a9EEfGUao8nYtZHOA" fontName="Segoe UI"/>
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_QoEZ8q9EEfGUao8nYtZHOA"/>
|
||||
</children>
|
||||
<children xmi:type="notation:Node" xmi:id="_QoG2MK9EEfGUao8nYtZHOA" type="3001" element="_QkQ4AK9EEfGUao8nYtZHOA">
|
||||
<children xmi:type="notation:Node" xmi:id="_QoLusK9EEfGUao8nYtZHOA" type="5001">
|
||||
<layoutConstraint xmi:type="notation:Location" xmi:id="_QoLusa9EEfGUao8nYtZHOA" y="5"/>
|
||||
</children>
|
||||
<children xmi:type="notation:Node" xmi:id="_Q5NNQK9EEfGUao8nYtZHOA" type="3005" element="_QkTUQK9EEfGUao8nYtZHOA">
|
||||
<styles xmi:type="notation:ShapeStyle" xmi:id="_Q5NNQa9EEfGUao8nYtZHOA" fontName="Segoe UI"/>
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_Q5NNQq9EEfGUao8nYtZHOA"/>
|
||||
</children>
|
||||
<styles xmi:type="notation:ShapeStyle" xmi:id="_QoG2Ma9EEfGUao8nYtZHOA" fontName="Segoe UI" fontHeight="8"/>
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_QoG2Mq9EEfGUao8nYtZHOA" x="2" y="395" width="10" height="10"/>
|
||||
</children>
|
||||
<styles xmi:type="notation:ShapeStyle" xmi:id="_QnUzEa9EEfGUao8nYtZHOA" fontName="Segoe UI" fontHeight="8"/>
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_QnUzEq9EEfGUao8nYtZHOA" y="42" width="10" height="395"/>
|
||||
</children>
|
||||
<children xmi:type="notation:Node" xmi:id="_QnzUMK9EEfGUao8nYtZHOA" type="3003" element="_QiTwMK9EEfGUao8nYtZHOA">
|
||||
<styles xmi:type="notation:ShapeStyle" xmi:id="_QnzUMa9EEfGUao8nYtZHOA" fontName="Segoe UI"/>
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_QnzUMq9EEfGUao8nYtZHOA"/>
|
||||
</children>
|
||||
<styles xmi:type="notation:ShapeStyle" xmi:id="_Qmo2ka9EEfGUao8nYtZHOA" fontColor="4210779" fontName="Segoe UI" fontHeight="8"/>
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_Qmo2kq9EEfGUao8nYtZHOA" x="124" y="50" width="100" height="50"/>
|
||||
</children>
|
||||
<children xmi:type="notation:Node" xmi:id="_aYDtUK9EEfGUao8nYtZHOA" type="2001" element="_aR4z4K9EEfGUao8nYtZHOA">
|
||||
<children xmi:type="notation:Node" xmi:id="_aYLpIK9EEfGUao8nYtZHOA" type="5002">
|
||||
<layoutConstraint xmi:type="notation:Location" xmi:id="_aYLpIa9EEfGUao8nYtZHOA" y="5"/>
|
||||
</children>
|
||||
<children xmi:type="notation:Node" xmi:id="_aYSW0K9EEfGUao8nYtZHOA" type="3001" element="_aR7QIK9EEfGUao8nYtZHOA">
|
||||
<children xmi:type="notation:Node" xmi:id="_aYUMAK9EEfGUao8nYtZHOA" type="5001">
|
||||
<layoutConstraint xmi:type="notation:Location" xmi:id="_aYUMAa9EEfGUao8nYtZHOA" y="5"/>
|
||||
</children>
|
||||
<children xmi:type="notation:Node" xmi:id="_aYd9AK9EEfGUao8nYtZHOA" type="3003" element="_aR7QIa9EEfGUao8nYtZHOA">
|
||||
<styles xmi:type="notation:ShapeStyle" xmi:id="_aYd9Aa9EEfGUao8nYtZHOA" fontName="Segoe UI"/>
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_aYd9Aq9EEfGUao8nYtZHOA"/>
|
||||
</children>
|
||||
<children xmi:type="notation:Node" xmi:id="_aYfLIK9EEfGUao8nYtZHOA" type="3001" element="_aSOyIK9EEfGUao8nYtZHOA">
|
||||
<children xmi:type="notation:Node" xmi:id="_aZFBAK9EEfGUao8nYtZHOA" type="5001">
|
||||
<layoutConstraint xmi:type="notation:Location" xmi:id="_aZFBAa9EEfGUao8nYtZHOA" y="5"/>
|
||||
</children>
|
||||
<children xmi:type="notation:Node" xmi:id="_aaVlQK9EEfGUao8nYtZHOA" type="3005" element="_aSiUIK9EEfGUao8nYtZHOA">
|
||||
<styles xmi:type="notation:ShapeStyle" xmi:id="_aaVlQa9EEfGUao8nYtZHOA" fontName="Segoe UI"/>
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_aaVlQq9EEfGUao8nYtZHOA"/>
|
||||
</children>
|
||||
<styles xmi:type="notation:ShapeStyle" xmi:id="_aYfLIa9EEfGUao8nYtZHOA" fontName="Segoe UI" fontHeight="8"/>
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_aYfLIq9EEfGUao8nYtZHOA" x="2" y="395" width="10" height="10"/>
|
||||
</children>
|
||||
<children xmi:type="notation:Node" xmi:id="_2vIQkK9EEfGUao8nYtZHOA" type="3001" element="_2nzgkK9EEfGUao8nYtZHOA">
|
||||
<children xmi:type="notation:Node" xmi:id="_2vbLgK9EEfGUao8nYtZHOA" type="5001">
|
||||
<layoutConstraint xmi:type="notation:Location" xmi:id="_2vbLga9EEfGUao8nYtZHOA" x="-1"/>
|
||||
</children>
|
||||
<children xmi:type="notation:Node" xmi:id="_2vbLgq9EEfGUao8nYtZHOA" type="3003" element="_2n3yAK9EEfGUao8nYtZHOA">
|
||||
<styles xmi:type="notation:ShapeStyle" xmi:id="_2vbLg69EEfGUao8nYtZHOA" fontName="Segoe UI"/>
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_2vbLhK9EEfGUao8nYtZHOA"/>
|
||||
</children>
|
||||
<styles xmi:type="notation:ShapeStyle" xmi:id="_2vIQka9EEfGUao8nYtZHOA" fontColor="4210779" fontName="Segoe UI" fontHeight="8"/>
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_2vIQkq9EEfGUao8nYtZHOA" x="2" y="53" width="10" height="30"/>
|
||||
</children>
|
||||
<styles xmi:type="notation:ShapeStyle" xmi:id="_aYSW0a9EEfGUao8nYtZHOA" fontName="Segoe UI" fontHeight="8"/>
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_aYSW0q9EEfGUao8nYtZHOA" y="42" width="10" height="395"/>
|
||||
</children>
|
||||
<children xmi:type="notation:Node" xmi:id="_aYZEgK9EEfGUao8nYtZHOA" type="3003" element="_aR4z4a9EEfGUao8nYtZHOA">
|
||||
<styles xmi:type="notation:ShapeStyle" xmi:id="_aYZEga9EEfGUao8nYtZHOA" fontName="Segoe UI"/>
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_aYZEgq9EEfGUao8nYtZHOA"/>
|
||||
</children>
|
||||
<styles xmi:type="notation:ShapeStyle" xmi:id="_aYDtUa9EEfGUao8nYtZHOA" fontColor="4210779" fontName="Segoe UI" fontHeight="8"/>
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_aYDtUq9EEfGUao8nYtZHOA" x="397" y="50" width="100" height="50"/>
|
||||
</children>
|
||||
<styles xmi:type="notation:DiagramStyle" xmi:id="_C2IUEq9EEfGUao8nYtZHOA"/>
|
||||
<edges xmi:type="notation:Edge" xmi:id="_2w4kEK9EEfGUao8nYtZHOA" type="4001" element="_2o9-MK9EEfGUao8nYtZHOA" source="_QnUzEK9EEfGUao8nYtZHOA" target="_2vIQkK9EEfGUao8nYtZHOA">
|
||||
<children xmi:type="notation:Node" xmi:id="_2xPwcK9EEfGUao8nYtZHOA" type="6001">
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_2xPwca9EEfGUao8nYtZHOA" y="-10"/>
|
||||
</children>
|
||||
<children xmi:type="notation:Node" xmi:id="_2xY6YK9EEfGUao8nYtZHOA" type="6002">
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_2xY6Ya9EEfGUao8nYtZHOA" y="10"/>
|
||||
</children>
|
||||
<children xmi:type="notation:Node" xmi:id="_2xaIgK9EEfGUao8nYtZHOA" type="6003">
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_2xaIga9EEfGUao8nYtZHOA" y="10"/>
|
||||
</children>
|
||||
<styles xmi:type="notation:ConnectorStyle" xmi:id="_2w4kEa9EEfGUao8nYtZHOA" jumpLinkStatus="Above" jumpLinkType="Tunnel"/>
|
||||
<styles xmi:type="notation:FontStyle" xmi:id="_2w4kEq9EEfGUao8nYtZHOA" fontName="Segoe UI" fontHeight="8"/>
|
||||
<bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_2w4kE69EEfGUao8nYtZHOA" points="[0, 0, -273, -4]$[272, 0, -1, -4]"/>
|
||||
<sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_2xeZ8K9EEfGUao8nYtZHOA" id="(0.5,0.1341772151898734) custom"/>
|
||||
<targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_2xeZ8a9EEfGUao8nYtZHOA" id="(0.5,0.1341772151898734) custom"/>
|
||||
</edges>
|
||||
</data>
|
||||
</ownedAnnotationEntries>
|
||||
<ownedAnnotationEntries xmi:type="description:AnnotationEntry" uid="_C5o7EK9EEfGUao8nYtZHOA" source="DANNOTATION_CUSTOMIZATION_KEY">
|
||||
<data xmi:type="diagram:ComputedStyleDescriptionRegistry" uid="_C5rXUK9EEfGUao8nYtZHOA"/>
|
||||
</ownedAnnotationEntries>
|
||||
<ownedDiagramElements xmi:type="diagram:DNode" uid="_Qhyy0K9EEfGUao8nYtZHOA" name="OperationalActivity 1" width="10" height="5" resizeKind="EAST_WEST">
|
||||
<target xmi:type="org.polarsys.capella.core.data.interaction:InstanceRole" href="IncidentScenarioBenchmark.capella#86b77dcf-5283-4bc0-8d6a-25936ad7e857"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.interaction:InstanceRole" href="IncidentScenarioBenchmark.capella#86b77dcf-5283-4bc0-8d6a-25936ad7e857"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.oa:OperationalActivity" href="IncidentScenarioBenchmark.capella#2e2d08d5-9c42-4e33-af81-222efa4c992c"/>
|
||||
<graphicalFilters xmi:type="diagram:AbsoluteBoundsFilter" uid="_QlEwUK9EEfGUao8nYtZHOA" x="124" y="50" height="50" width="100"/>
|
||||
<ownedBorderedNodes xmi:type="diagram:DNode" uid="_QjjGUK9EEfGUao8nYtZHOA" outgoingEdges="_2o9-MK9EEfGUao8nYtZHOA" width="1" height="40" resizeKind="NSEW">
|
||||
<target xmi:type="org.polarsys.capella.core.data.interaction:InstanceRole" href="IncidentScenarioBenchmark.capella#86b77dcf-5283-4bc0-8d6a-25936ad7e857"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.interaction:InstanceRole" href="IncidentScenarioBenchmark.capella#86b77dcf-5283-4bc0-8d6a-25936ad7e857"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.oa:OperationalActivity" href="IncidentScenarioBenchmark.capella#2e2d08d5-9c42-4e33-af81-222efa4c992c"/>
|
||||
<ownedBorderedNodes xmi:type="diagram:DNode" uid="_QkQ4AK9EEfGUao8nYtZHOA" width="1" height="1">
|
||||
<target xmi:type="org.polarsys.capella.core.data.interaction:InstanceRole" href="IncidentScenarioBenchmark.capella#86b77dcf-5283-4bc0-8d6a-25936ad7e857"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.interaction:InstanceRole" href="IncidentScenarioBenchmark.capella#86b77dcf-5283-4bc0-8d6a-25936ad7e857"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.oa:OperationalActivity" href="IncidentScenarioBenchmark.capella#2e2d08d5-9c42-4e33-af81-222efa4c992c"/>
|
||||
<ownedStyle xmi:type="diagram:WorkspaceImage" uid="_QkTUQK9EEfGUao8nYtZHOA" showIcon="false" labelPosition="node" workspacePath="/org.polarsys.capella.core.sirius.analysis/description/images/handlelifeline.svg">
|
||||
<description xmi:type="style:WorkspaceImageDescription" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@nodeMappings[name='InstanceRoleMaping%20AIS']/@borderedNodeMappings[name='default%20execution%20AIS']/@borderedNodeMappings[name='endOfLifeAIS']/@style"/>
|
||||
</ownedStyle>
|
||||
<actualMapping xmi:type="description_1:EndOfLifeMapping" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@nodeMappings[name='InstanceRoleMaping%20AIS']/@borderedNodeMappings[name='default%20execution%20AIS']/@borderedNodeMappings[name='endOfLifeAIS']"/>
|
||||
</ownedBorderedNodes>
|
||||
<ownedStyle xmi:type="diagram:Square" uid="_QjlikK9EEfGUao8nYtZHOA" showIcon="false" borderSize="1" borderSizeComputationExpression="1" borderColor="128,128,128" labelPosition="node" width="1" height="40" color="247,218,116">
|
||||
<description xmi:type="style:SquareDescription" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@nodeMappings[name='InstanceRoleMaping%20AIS']/@borderedNodeMappings[name='default%20execution%20AIS']/@style"/>
|
||||
</ownedStyle>
|
||||
<actualMapping xmi:type="description_1:ExecutionMapping" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@nodeMappings[name='InstanceRoleMaping%20AIS']/@borderedNodeMappings[name='default%20execution%20AIS']"/>
|
||||
</ownedBorderedNodes>
|
||||
<ownedStyle xmi:type="diagram:Square" uid="_QiTwMK9EEfGUao8nYtZHOA" labelColor="91,64,64" borderSize="1" borderSizeComputationExpression="1" borderColor="91,64,64" labelPosition="node" width="10" height="5" color="247,218,116">
|
||||
<description xmi:type="style:SquareDescription" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@nodeMappings[name='InstanceRoleMaping%20AIS']/@style"/>
|
||||
</ownedStyle>
|
||||
<actualMapping xmi:type="description_1:InstanceRoleMapping" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@nodeMappings[name='InstanceRoleMaping%20AIS']"/>
|
||||
</ownedDiagramElements>
|
||||
<ownedDiagramElements xmi:type="diagram:DNode" uid="_aR4z4K9EEfGUao8nYtZHOA" name="OperationalActivity 2" width="10" height="5" resizeKind="EAST_WEST">
|
||||
<target xmi:type="org.polarsys.capella.core.data.interaction:InstanceRole" href="IncidentScenarioBenchmark.capella#5ebf9054-720b-4c46-8ddb-d556548b12ab"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.interaction:InstanceRole" href="IncidentScenarioBenchmark.capella#5ebf9054-720b-4c46-8ddb-d556548b12ab"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.oa:OperationalActivity" href="IncidentScenarioBenchmark.capella#f6af7ea3-196f-4c3f-8b52-75154362d1e0"/>
|
||||
<graphicalFilters xmi:type="diagram:AbsoluteBoundsFilter" uid="_aSjiQK9EEfGUao8nYtZHOA" x="397" y="50" height="50" width="100"/>
|
||||
<ownedBorderedNodes xmi:type="diagram:DNode" uid="_aR7QIK9EEfGUao8nYtZHOA" width="1" height="40" resizeKind="NSEW">
|
||||
<target xmi:type="org.polarsys.capella.core.data.interaction:InstanceRole" href="IncidentScenarioBenchmark.capella#5ebf9054-720b-4c46-8ddb-d556548b12ab"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.interaction:InstanceRole" href="IncidentScenarioBenchmark.capella#5ebf9054-720b-4c46-8ddb-d556548b12ab"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.oa:OperationalActivity" href="IncidentScenarioBenchmark.capella#f6af7ea3-196f-4c3f-8b52-75154362d1e0"/>
|
||||
<ownedBorderedNodes xmi:type="diagram:DNode" uid="_aSOyIK9EEfGUao8nYtZHOA" width="1" height="1">
|
||||
<target xmi:type="org.polarsys.capella.core.data.interaction:InstanceRole" href="IncidentScenarioBenchmark.capella#5ebf9054-720b-4c46-8ddb-d556548b12ab"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.interaction:InstanceRole" href="IncidentScenarioBenchmark.capella#5ebf9054-720b-4c46-8ddb-d556548b12ab"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.oa:OperationalActivity" href="IncidentScenarioBenchmark.capella#f6af7ea3-196f-4c3f-8b52-75154362d1e0"/>
|
||||
<ownedStyle xmi:type="diagram:WorkspaceImage" uid="_aSiUIK9EEfGUao8nYtZHOA" showIcon="false" labelPosition="node" workspacePath="/org.polarsys.capella.core.sirius.analysis/description/images/handlelifeline.svg">
|
||||
<description xmi:type="style:WorkspaceImageDescription" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@nodeMappings[name='InstanceRoleMaping%20AIS']/@borderedNodeMappings[name='default%20execution%20AIS']/@borderedNodeMappings[name='endOfLifeAIS']/@style"/>
|
||||
</ownedStyle>
|
||||
<actualMapping xmi:type="description_1:EndOfLifeMapping" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@nodeMappings[name='InstanceRoleMaping%20AIS']/@borderedNodeMappings[name='default%20execution%20AIS']/@borderedNodeMappings[name='endOfLifeAIS']"/>
|
||||
</ownedBorderedNodes>
|
||||
<ownedBorderedNodes xmi:type="diagram:DNode" uid="_2nzgkK9EEfGUao8nYtZHOA" incomingEdges="_2o9-MK9EEfGUao8nYtZHOA" width="1" height="3" resizeKind="NSEW">
|
||||
<target xmi:type="org.polarsys.capella.core.data.interaction:Execution" href="IncidentScenarioBenchmark.capella#4bbeb6bd-6bc8-455f-8d8b-3a8f387343ef"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.interaction:Execution" href="IncidentScenarioBenchmark.capella#4bbeb6bd-6bc8-455f-8d8b-3a8f387343ef"/>
|
||||
<graphicalFilters xmi:type="diagram:AbsoluteBoundsFilter" uid="_26OtUK9EEfGUao8nYtZHOA" x="442" y="153" height="30" width="10"/>
|
||||
<ownedStyle xmi:type="diagram:Square" uid="_2n3yAK9EEfGUao8nYtZHOA" showIcon="false" labelColor="91,64,64" borderSize="1" borderSizeComputationExpression="1" borderColor="91,64,64" width="1" height="3" color="247,218,116">
|
||||
<description xmi:type="style:SquareDescription" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@nodeMappings[name='InstanceRoleMaping%20AIS']/@borderedNodeMappings[name='default%20execution%20AIS']/@borderedNodeMappings[name='Execution%20AIS']/@style"/>
|
||||
</ownedStyle>
|
||||
<actualMapping xmi:type="description_1:ExecutionMapping" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@nodeMappings[name='InstanceRoleMaping%20AIS']/@borderedNodeMappings[name='default%20execution%20AIS']/@borderedNodeMappings[name='Execution%20AIS']"/>
|
||||
</ownedBorderedNodes>
|
||||
<ownedStyle xmi:type="diagram:Square" uid="_aR7QIa9EEfGUao8nYtZHOA" showIcon="false" borderSize="1" borderSizeComputationExpression="1" borderColor="128,128,128" labelPosition="node" width="1" height="40" color="247,218,116">
|
||||
<description xmi:type="style:SquareDescription" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@nodeMappings[name='InstanceRoleMaping%20AIS']/@borderedNodeMappings[name='default%20execution%20AIS']/@style"/>
|
||||
</ownedStyle>
|
||||
<actualMapping xmi:type="description_1:ExecutionMapping" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@nodeMappings[name='InstanceRoleMaping%20AIS']/@borderedNodeMappings[name='default%20execution%20AIS']"/>
|
||||
</ownedBorderedNodes>
|
||||
<ownedStyle xmi:type="diagram:Square" uid="_aR4z4a9EEfGUao8nYtZHOA" labelColor="91,64,64" borderSize="1" borderSizeComputationExpression="1" borderColor="91,64,64" labelPosition="node" width="10" height="5" color="247,218,116">
|
||||
<description xmi:type="style:SquareDescription" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@nodeMappings[name='InstanceRoleMaping%20AIS']/@style"/>
|
||||
</ownedStyle>
|
||||
<actualMapping xmi:type="description_1:InstanceRoleMapping" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@nodeMappings[name='InstanceRoleMaping%20AIS']"/>
|
||||
</ownedDiagramElements>
|
||||
<ownedDiagramElements xmi:type="diagram:DEdge" uid="_2o9-MK9EEfGUao8nYtZHOA" name="Report incident" sourceNode="_QjjGUK9EEfGUao8nYtZHOA" targetNode="_2nzgkK9EEfGUao8nYtZHOA">
|
||||
<target xmi:type="org.polarsys.capella.core.data.interaction:SequenceMessage" href="IncidentScenarioBenchmark.capella#78c1cdb8-4cce-40ed-ae6c-299e7bc937c6"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.interaction:SequenceMessage" href="IncidentScenarioBenchmark.capella#78c1cdb8-4cce-40ed-ae6c-299e7bc937c6"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.interaction:MessageEnd" href="IncidentScenarioBenchmark.capella#ae01bc6a-4f12-45df-9cc0-88530d862dff"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.interaction:MessageEnd" href="IncidentScenarioBenchmark.capella#365b653f-e8c6-4f0d-bbd0-51ceb7f4b392"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.fa:FunctionalExchange" href="IncidentScenarioBenchmark.capella#549af3b2-0943-41a3-b0e3-57d0d99ec83f"/>
|
||||
<graphicalFilters xmi:type="diagram:AbsoluteBoundsFilter" uid="_2px2gK9EEfGUao8nYtZHOA" y="153" height="0"/>
|
||||
<ownedStyle xmi:type="diagram:EdgeStyle" uid="_2pSHQK9EEfGUao8nYtZHOA" strokeColor="0,0,0">
|
||||
<description xmi:type="style:EdgeStyleDescription" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@edgeMappings[name='Basic%20message%20mapping%20AIS']/@style"/>
|
||||
<centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_2pT8cK9EEfGUao8nYtZHOA" showIcon="false"/>
|
||||
</ownedStyle>
|
||||
<actualMapping xmi:type="description_1:BasicMessageMapping" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@edgeMappings[name='Basic%20message%20mapping%20AIS']"/>
|
||||
</ownedDiagramElements>
|
||||
<description xmi:type="description_1:SequenceDiagramDescription" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']"/>
|
||||
<activatedFilters xmi:type="filter:CompositeFilterDescription" href="platform:/plugin/org.polarsys.kitalpha.ad.integration.sirius/description/ad.odesign#//@ownedViewpoints[name='ad']/@ownedRepresentations[name='AD%20diagram']/@filters[name='ModelExtensionFilter']"/>
|
||||
<filterVariableHistory xmi:type="diagram:FilterVariableHistory" uid="_CxHRMK9EEfGUao8nYtZHOA"/>
|
||||
<activatedLayers xmi:type="description_2:Layer" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer"/>
|
||||
<target xmi:type="org.polarsys.capella.core.data.interaction:Scenario" href="IncidentScenarioBenchmark.capella#6aa3cccb-9adc-4230-993d-7ee80c250509"/>
|
||||
</sequence:SequenceDDiagram>
|
||||
</xmi:XMI>
|
||||
@@ -0,0 +1,320 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<!--Capella_Version_7.1.0-->
|
||||
<org.polarsys.capella.core.data.capellamodeller:Project xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:libraries="http://www.polarsys.org/capella/common/libraries/7.0.0"
|
||||
xmlns:org.polarsys.capella.core.data.capellacommon="http://www.polarsys.org/capella/core/common/7.0.0"
|
||||
xmlns:org.polarsys.capella.core.data.capellacore="http://www.polarsys.org/capella/core/core/7.0.0"
|
||||
xmlns:org.polarsys.capella.core.data.capellamodeller="http://www.polarsys.org/capella/core/modeller/7.0.0"
|
||||
xmlns:org.polarsys.capella.core.data.cs="http://www.polarsys.org/capella/core/cs/7.0.0"
|
||||
xmlns:org.polarsys.capella.core.data.ctx="http://www.polarsys.org/capella/core/ctx/7.0.0"
|
||||
xmlns:org.polarsys.capella.core.data.epbs="http://www.polarsys.org/capella/core/epbs/7.0.0"
|
||||
xmlns:org.polarsys.capella.core.data.fa="http://www.polarsys.org/capella/core/fa/7.0.0"
|
||||
xmlns:org.polarsys.capella.core.data.information="http://www.polarsys.org/capella/core/information/7.0.0"
|
||||
xmlns:org.polarsys.capella.core.data.information.datatype="http://www.polarsys.org/capella/core/information/datatype/7.0.0"
|
||||
xmlns:org.polarsys.capella.core.data.information.datavalue="http://www.polarsys.org/capella/core/information/datavalue/7.0.0"
|
||||
xmlns:org.polarsys.capella.core.data.interaction="http://www.polarsys.org/capella/core/interaction/7.0.0"
|
||||
xmlns:org.polarsys.capella.core.data.la="http://www.polarsys.org/capella/core/la/7.0.0"
|
||||
xmlns:org.polarsys.capella.core.data.oa="http://www.polarsys.org/capella/core/oa/7.0.0"
|
||||
xmlns:org.polarsys.capella.core.data.pa="http://www.polarsys.org/capella/core/pa/7.0.0"
|
||||
id="72f10eab-78fe-42a5-9b33-c8502b36dcf2"
|
||||
name="IncidentScenarioBenchmark">
|
||||
<ownedExtensions xsi:type="libraries:ModelInformation" id="eccf54b1-64b8-4ccf-b152-37d877017d88"/>
|
||||
<ownedEnumerationPropertyTypes xsi:type="org.polarsys.capella.core.data.capellacore:EnumerationPropertyType"
|
||||
id="a178583e-b1ed-465c-931a-2cae0b61665f" name="ProgressStatus">
|
||||
<ownedLiterals xsi:type="org.polarsys.capella.core.data.capellacore:EnumerationPropertyLiteral"
|
||||
id="9bc69305-639d-4bed-86ba-6f3a08f9ec8d" name="DRAFT"/>
|
||||
<ownedLiterals xsi:type="org.polarsys.capella.core.data.capellacore:EnumerationPropertyLiteral"
|
||||
id="78eff0ec-5690-4301-a970-08a53475a27a" name="TO_BE_REVIEWED"/>
|
||||
<ownedLiterals xsi:type="org.polarsys.capella.core.data.capellacore:EnumerationPropertyLiteral"
|
||||
id="16591e25-53e3-445c-828b-d5c76dccecd1" name="TO_BE_DISCUSSED"/>
|
||||
<ownedLiterals xsi:type="org.polarsys.capella.core.data.capellacore:EnumerationPropertyLiteral"
|
||||
id="da694787-0daa-4fb1-8864-a0e6ac4363c6" name="REWORK_NECESSARY"/>
|
||||
<ownedLiterals xsi:type="org.polarsys.capella.core.data.capellacore:EnumerationPropertyLiteral"
|
||||
id="8e75072c-392c-4020-ba9b-4173ffc637f1" name="UNDER_REWORK"/>
|
||||
<ownedLiterals xsi:type="org.polarsys.capella.core.data.capellacore:EnumerationPropertyLiteral"
|
||||
id="141bf3ce-4ace-4c1f-af73-448c9b732b1c" name="REVIEWED_OK"/>
|
||||
</ownedEnumerationPropertyTypes>
|
||||
<keyValuePairs xsi:type="org.polarsys.capella.core.data.capellacore:KeyValue" id="42c0a932-4f50-492e-9745-8a182f50f7a1"
|
||||
key="projectApproach" value="SingletonComponents"/>
|
||||
<ownedModelRoots xsi:type="org.polarsys.capella.core.data.capellamodeller:SystemEngineering"
|
||||
id="bfe51079-a523-4489-bc5d-a4886fd13c1c" name="IncidentScenarioBenchmark">
|
||||
<ownedArchitectures xsi:type="org.polarsys.capella.core.data.oa:OperationalAnalysis"
|
||||
id="bfcd2964-812e-4106-8ca0-6fa2c2688c91" name="Operational Analysis">
|
||||
<ownedFunctionPkg xsi:type="org.polarsys.capella.core.data.oa:OperationalActivityPkg"
|
||||
id="5ad0311b-7902-4d71-92a3-31106d97f742" name="Operational Activities">
|
||||
<ownedOperationalActivities xsi:type="org.polarsys.capella.core.data.oa:OperationalActivity"
|
||||
id="ede29e45-fa93-490b-b5eb-27f2ee692bfd" name="Root Operational Activity">
|
||||
<ownedFunctions xsi:type="org.polarsys.capella.core.data.oa:OperationalActivity"
|
||||
id="2e2d08d5-9c42-4e33-af81-222efa4c992c" name="OperationalActivity 1"/>
|
||||
<ownedFunctions xsi:type="org.polarsys.capella.core.data.oa:OperationalActivity"
|
||||
id="f6af7ea3-196f-4c3f-8b52-75154362d1e0" name="OperationalActivity 2"/>
|
||||
<ownedFunctionalExchanges xsi:type="org.polarsys.capella.core.data.fa:FunctionalExchange"
|
||||
id="549af3b2-0943-41a3-b0e3-57d0d99ec83f" name="Report incident" target="#f6af7ea3-196f-4c3f-8b52-75154362d1e0"
|
||||
source="#2e2d08d5-9c42-4e33-af81-222efa4c992c"/>
|
||||
</ownedOperationalActivities>
|
||||
</ownedFunctionPkg>
|
||||
<ownedAbstractCapabilityPkg xsi:type="org.polarsys.capella.core.data.oa:OperationalCapabilityPkg"
|
||||
id="fb6f8967-c853-4336-b35b-82c5b78c372c" name="Operational Capabilities">
|
||||
<ownedOperationalCapabilities xsi:type="org.polarsys.capella.core.data.oa:OperationalCapability"
|
||||
id="883098d9-9d02-4ce0-85aa-41c6219105d9" name="OperationalCapability 1">
|
||||
<ownedScenarios xsi:type="org.polarsys.capella.core.data.interaction:Scenario"
|
||||
id="6aa3cccb-9adc-4230-993d-7ee80c250509" name="[OAS] OperationalCapability 1"
|
||||
kind="INTERACTION">
|
||||
<ownedInstanceRoles xsi:type="org.polarsys.capella.core.data.interaction:InstanceRole"
|
||||
id="86b77dcf-5283-4bc0-8d6a-25936ad7e857" name="OperationalActivity 1"
|
||||
representedInstance="#2e2d08d5-9c42-4e33-af81-222efa4c992c"/>
|
||||
<ownedInstanceRoles xsi:type="org.polarsys.capella.core.data.interaction:InstanceRole"
|
||||
id="5ebf9054-720b-4c46-8ddb-d556548b12ab" name="OperationalActivity 2"
|
||||
representedInstance="#f6af7ea3-196f-4c3f-8b52-75154362d1e0"/>
|
||||
<ownedMessages xsi:type="org.polarsys.capella.core.data.interaction:SequenceMessage"
|
||||
id="78c1cdb8-4cce-40ed-ae6c-299e7bc937c6" name="Report incident" kind="ASYNCHRONOUS_CALL"
|
||||
sendingEnd="#365b653f-e8c6-4f0d-bbd0-51ceb7f4b392" receivingEnd="#ae01bc6a-4f12-45df-9cc0-88530d862dff"/>
|
||||
<ownedInteractionFragments xsi:type="org.polarsys.capella.core.data.interaction:MessageEnd"
|
||||
id="365b653f-e8c6-4f0d-bbd0-51ceb7f4b392" name="Send Call Message Call"
|
||||
coveredInstanceRoles="#86b77dcf-5283-4bc0-8d6a-25936ad7e857" event="#0b4cd564-e84f-4313-bf47-afa1803e634f"/>
|
||||
<ownedInteractionFragments xsi:type="org.polarsys.capella.core.data.interaction:MessageEnd"
|
||||
id="ae01bc6a-4f12-45df-9cc0-88530d862dff" name="Receive Call Message Call"
|
||||
coveredInstanceRoles="#5ebf9054-720b-4c46-8ddb-d556548b12ab" event="#00361425-0782-4351-8855-b3dc70f275e6"/>
|
||||
<ownedInteractionFragments xsi:type="org.polarsys.capella.core.data.interaction:ExecutionEnd"
|
||||
id="172ecc73-db4f-4299-8215-718e53f39824" name="endExec" coveredInstanceRoles="#5ebf9054-720b-4c46-8ddb-d556548b12ab"
|
||||
event="#16ad20e5-9721-462c-a110-80e67e78879e"/>
|
||||
<ownedTimeLapses xsi:type="org.polarsys.capella.core.data.interaction:Execution"
|
||||
id="4bbeb6bd-6bc8-455f-8d8b-3a8f387343ef" start="#ae01bc6a-4f12-45df-9cc0-88530d862dff"
|
||||
finish="#172ecc73-db4f-4299-8215-718e53f39824"/>
|
||||
<ownedEvents xsi:type="org.polarsys.capella.core.data.interaction:EventSentOperation"
|
||||
id="0b4cd564-e84f-4313-bf47-afa1803e634f" operation="#549af3b2-0943-41a3-b0e3-57d0d99ec83f"/>
|
||||
<ownedEvents xsi:type="org.polarsys.capella.core.data.interaction:EventReceiptOperation"
|
||||
id="00361425-0782-4351-8855-b3dc70f275e6" operation="#549af3b2-0943-41a3-b0e3-57d0d99ec83f"/>
|
||||
<ownedEvents xsi:type="org.polarsys.capella.core.data.interaction:ExecutionEvent"
|
||||
id="16ad20e5-9721-462c-a110-80e67e78879e"/>
|
||||
</ownedScenarios>
|
||||
<ownedAbstractFunctionAbstractCapabilityInvolvements xsi:type="org.polarsys.capella.core.data.interaction:AbstractFunctionAbstractCapabilityInvolvement"
|
||||
id="405b8dc5-cefe-4da7-9afe-9e5ba074681a" involved="#2e2d08d5-9c42-4e33-af81-222efa4c992c"/>
|
||||
<ownedAbstractFunctionAbstractCapabilityInvolvements xsi:type="org.polarsys.capella.core.data.interaction:AbstractFunctionAbstractCapabilityInvolvement"
|
||||
id="6e620637-9ee6-42b2-96ae-777de090f679" involved="#f6af7ea3-196f-4c3f-8b52-75154362d1e0"/>
|
||||
</ownedOperationalCapabilities>
|
||||
</ownedAbstractCapabilityPkg>
|
||||
<ownedInterfacePkg xsi:type="org.polarsys.capella.core.data.cs:InterfacePkg"
|
||||
id="cc185763-3fef-4d26-a482-237ab4d7d293" name="Interfaces"/>
|
||||
<ownedDataPkg xsi:type="org.polarsys.capella.core.data.information:DataPkg"
|
||||
id="fa555965-a2b6-45b6-a2f7-6522115bbd8d" name="Data"/>
|
||||
<ownedRolePkg xsi:type="org.polarsys.capella.core.data.oa:RolePkg" id="895e41df-8cec-4eb2-a5ae-86a5425db4bd"
|
||||
name="Roles"/>
|
||||
<ownedEntityPkg xsi:type="org.polarsys.capella.core.data.oa:EntityPkg" id="766c177f-e1f3-4891-aa86-a5d73b500ad2"
|
||||
name="Operational Entities"/>
|
||||
</ownedArchitectures>
|
||||
<ownedArchitectures xsi:type="org.polarsys.capella.core.data.ctx:SystemAnalysis"
|
||||
id="4cc8d915-4830-48f3-afe4-217934792e38" name="System Analysis">
|
||||
<ownedFunctionPkg xsi:type="org.polarsys.capella.core.data.ctx:SystemFunctionPkg"
|
||||
id="92108fcf-42c1-4366-9917-f28e2d2b04b2" name="System Functions">
|
||||
<ownedSystemFunctions xsi:type="org.polarsys.capella.core.data.ctx:SystemFunction"
|
||||
id="985173ac-059e-4cb8-957d-c546987995ab" name="Root System Function">
|
||||
<ownedFunctionRealizations xsi:type="org.polarsys.capella.core.data.fa:FunctionRealization"
|
||||
id="88ee9314-86f7-4e96-a027-cd1f7b7bff77" targetElement="#ede29e45-fa93-490b-b5eb-27f2ee692bfd"
|
||||
sourceElement="#985173ac-059e-4cb8-957d-c546987995ab"/>
|
||||
</ownedSystemFunctions>
|
||||
</ownedFunctionPkg>
|
||||
<ownedAbstractCapabilityPkg xsi:type="org.polarsys.capella.core.data.ctx:CapabilityPkg"
|
||||
id="1bb5124b-42dc-4988-ae28-d6259137cfad" name="Capabilities"/>
|
||||
<ownedInterfacePkg xsi:type="org.polarsys.capella.core.data.cs:InterfacePkg"
|
||||
id="cdf1bdc0-6a49-4006-8488-b6366f155add" name="Interfaces"/>
|
||||
<ownedDataPkg xsi:type="org.polarsys.capella.core.data.information:DataPkg"
|
||||
id="853089ca-1be1-4cb9-afc4-bd2f4233bc36" name="Data">
|
||||
<ownedDataPkgs xsi:type="org.polarsys.capella.core.data.information:DataPkg"
|
||||
id="2025d8a5-46e2-4735-99f3-d1d247561a8b" name="Predefined Types">
|
||||
<ownedDataTypes xsi:type="org.polarsys.capella.core.data.information.datatype:BooleanType"
|
||||
id="8f26e095-bb06-4b24-983b-1da94255ab3b" name="Boolean" visibility="PUBLIC">
|
||||
<ownedLiterals xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralBooleanValue"
|
||||
id="1ff8e3ca-5929-4bea-acea-10d72a22e7a9" name="True" abstractType="#8f26e095-bb06-4b24-983b-1da94255ab3b"
|
||||
value="true"/>
|
||||
<ownedLiterals xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralBooleanValue"
|
||||
id="07a94c57-4004-4a97-9d97-04abbd532fa4" name="False" abstractType="#8f26e095-bb06-4b24-983b-1da94255ab3b"/>
|
||||
</ownedDataTypes>
|
||||
<ownedDataTypes xsi:type="org.polarsys.capella.core.data.information.datatype:NumericType"
|
||||
id="7d9bea93-735c-4e1b-8145-1f77c6c431b6" name="Byte" visibility="PUBLIC">
|
||||
<ownedMinValue xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"
|
||||
id="1c4b1ea1-e589-46db-adc2-f524b683ee2a" name="" abstractType="#7d9bea93-735c-4e1b-8145-1f77c6c431b6"
|
||||
value="0"/>
|
||||
<ownedMaxValue xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"
|
||||
id="cdc4481e-27f5-409b-899e-026097e1c5ff" name="" abstractType="#7d9bea93-735c-4e1b-8145-1f77c6c431b6"
|
||||
value="255"/>
|
||||
</ownedDataTypes>
|
||||
<ownedDataTypes xsi:type="org.polarsys.capella.core.data.information.datatype:StringType"
|
||||
id="6ba5ef8b-900e-481f-be03-214c0377a5e1" name="Char" visibility="PUBLIC">
|
||||
<ownedMinLength xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"
|
||||
id="6adaf5f4-3dbe-4d6c-8db0-f43b88ac7a67" name="" abstractType="#dc2d02f3-37aa-4f19-901e-9ab20076772f"
|
||||
value="1"/>
|
||||
<ownedMaxLength xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"
|
||||
id="39e9e7c8-019b-45cb-b570-2cfce432d159" name="" abstractType="#dc2d02f3-37aa-4f19-901e-9ab20076772f"
|
||||
value="1"/>
|
||||
</ownedDataTypes>
|
||||
<ownedDataTypes xsi:type="org.polarsys.capella.core.data.information.datatype:NumericType"
|
||||
id="08a79fe4-c4c2-4f3b-b5ef-2ee147318510" name="Double" discrete="false"
|
||||
visibility="PUBLIC" kind="FLOAT"/>
|
||||
<ownedDataTypes xsi:type="org.polarsys.capella.core.data.information.datatype:NumericType"
|
||||
id="543264ff-da7a-469e-920f-8d0584a30459" name="Float" discrete="false"
|
||||
visibility="PUBLIC" kind="FLOAT"/>
|
||||
<ownedDataTypes xsi:type="org.polarsys.capella.core.data.information.datatype:NumericType"
|
||||
id="bbdd469d-9c57-443f-aa9c-9baf135dd156" name="Hexadecimal" visibility="PUBLIC">
|
||||
<ownedMinValue xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"
|
||||
id="dde5c274-d9f3-4a57-9abe-021b5f00d75d" name="" abstractType="#bbdd469d-9c57-443f-aa9c-9baf135dd156"
|
||||
value="0"/>
|
||||
<ownedMaxValue xsi:type="org.polarsys.capella.core.data.information.datavalue:BinaryExpression"
|
||||
id="503f03ce-f4be-4d38-a5f5-d1aebaf7c669" abstractType="#bbdd469d-9c57-443f-aa9c-9baf135dd156"
|
||||
operator="SUB">
|
||||
<ownedLeftOperand xsi:type="org.polarsys.capella.core.data.information.datavalue:BinaryExpression"
|
||||
id="502c050e-dbde-40b3-94ba-8c786a5a4cb7" operator="POW">
|
||||
<ownedLeftOperand xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"
|
||||
id="dea69498-e49d-4e7c-9467-3962a3946814" value="2"/>
|
||||
<ownedRightOperand xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"
|
||||
id="c5aa9fd0-a2e7-4f4f-8043-b6a2b6b7b5d3" value="64"/>
|
||||
</ownedLeftOperand>
|
||||
<ownedRightOperand xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"
|
||||
id="43b57a64-afed-448a-bbc6-d9202d2c8aa6" value="1"/>
|
||||
</ownedMaxValue>
|
||||
</ownedDataTypes>
|
||||
<ownedDataTypes xsi:type="org.polarsys.capella.core.data.information.datatype:NumericType"
|
||||
id="75b39451-e2b5-4c51-804c-9673071b8591" name="Integer" visibility="PUBLIC"/>
|
||||
<ownedDataTypes xsi:type="org.polarsys.capella.core.data.information.datatype:NumericType"
|
||||
id="ab4bd3d7-6076-4fe6-96ed-0c7bd6e19ebf" name="Long" visibility="PUBLIC"/>
|
||||
<ownedDataTypes xsi:type="org.polarsys.capella.core.data.information.datatype:NumericType"
|
||||
id="391675ca-a8a4-4bae-81e0-2c5d55770bc0" name="LongLong" visibility="PUBLIC"/>
|
||||
<ownedDataTypes xsi:type="org.polarsys.capella.core.data.information.datatype:NumericType"
|
||||
id="ed08d80d-71e7-4818-96c4-5e0062a0fbc5" name="Short" visibility="PUBLIC"/>
|
||||
<ownedDataTypes xsi:type="org.polarsys.capella.core.data.information.datatype:StringType"
|
||||
id="f2ba99f3-aa24-415b-82dd-56b6aec41070" name="String" visibility="PUBLIC"/>
|
||||
<ownedDataTypes xsi:type="org.polarsys.capella.core.data.information.datatype:NumericType"
|
||||
id="4e0589b8-0400-470b-adee-6d79022bdaec" name="UnsignedInteger" maxInclusive="false"
|
||||
visibility="PUBLIC">
|
||||
<ownedMinValue xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"
|
||||
id="3a574e71-959d-4ed5-8697-dd51a8c85859" name="" abstractType="#4e0589b8-0400-470b-adee-6d79022bdaec"
|
||||
value="0"/>
|
||||
</ownedDataTypes>
|
||||
<ownedDataTypes xsi:type="org.polarsys.capella.core.data.information.datatype:NumericType"
|
||||
id="dc2d02f3-37aa-4f19-901e-9ab20076772f" name="UnsignedShort" maxInclusive="false"
|
||||
visibility="PUBLIC">
|
||||
<ownedMinValue xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"
|
||||
id="c89fe27e-4cec-4fbc-82b4-0ce6f6fa6270" name="" abstractType="#dc2d02f3-37aa-4f19-901e-9ab20076772f"
|
||||
value="0"/>
|
||||
</ownedDataTypes>
|
||||
<ownedDataTypes xsi:type="org.polarsys.capella.core.data.information.datatype:NumericType"
|
||||
id="951feec2-545b-4dc1-aa52-7341189b7fa9" name="UnsignedLong" maxInclusive="false"
|
||||
visibility="PUBLIC">
|
||||
<ownedMinValue xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"
|
||||
id="73a0e0ba-a8be-4aac-a0b9-8cfecd35edcb" name="" abstractType="#951feec2-545b-4dc1-aa52-7341189b7fa9"
|
||||
value="0"/>
|
||||
</ownedDataTypes>
|
||||
<ownedDataTypes xsi:type="org.polarsys.capella.core.data.information.datatype:NumericType"
|
||||
id="3acaf46c-cf7f-4350-ae0c-ab938ec82e19" name="UnsignedLongLong" maxInclusive="false"
|
||||
visibility="PUBLIC">
|
||||
<ownedMinValue xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"
|
||||
id="4d1f3c91-38bb-4709-9f3a-f47a3f17d59f" name="" abstractType="#3acaf46c-cf7f-4350-ae0c-ab938ec82e19"
|
||||
value="0"/>
|
||||
</ownedDataTypes>
|
||||
</ownedDataPkgs>
|
||||
</ownedDataPkg>
|
||||
<ownedSystemComponentPkg xsi:type="org.polarsys.capella.core.data.ctx:SystemComponentPkg"
|
||||
id="3ea1987b-f8c5-4c59-b2bd-cdf19c831006" name="Structure">
|
||||
<ownedParts xsi:type="org.polarsys.capella.core.data.cs:Part" id="eb3a7738-b4c2-4257-beff-935941de3301"
|
||||
name="System" abstractType="#7b1c3c2b-e539-43fd-a843-f85207c898c3"/>
|
||||
<ownedSystemComponents xsi:type="org.polarsys.capella.core.data.ctx:SystemComponent"
|
||||
id="7b1c3c2b-e539-43fd-a843-f85207c898c3" name="System">
|
||||
<ownedStateMachines xsi:type="org.polarsys.capella.core.data.capellacommon:StateMachine"
|
||||
id="08986259-eb05-4a6b-86a3-f07848436b58" name="System State Machine">
|
||||
<ownedRegions xsi:type="org.polarsys.capella.core.data.capellacommon:Region"
|
||||
id="b92a987d-a3a4-4703-9696-772ac1d5a0c8" name="Default Region"/>
|
||||
</ownedStateMachines>
|
||||
</ownedSystemComponents>
|
||||
</ownedSystemComponentPkg>
|
||||
<ownedMissionPkg xsi:type="org.polarsys.capella.core.data.ctx:MissionPkg" id="82ef3879-b6e6-47ca-81f0-deb0510403f3"
|
||||
name="Missions"/>
|
||||
<ownedOperationalAnalysisRealizations xsi:type="org.polarsys.capella.core.data.ctx:OperationalAnalysisRealization"
|
||||
id="5ba73e27-b90a-424b-a3a6-9e1979207512" targetElement="#bfcd2964-812e-4106-8ca0-6fa2c2688c91"
|
||||
sourceElement="#4cc8d915-4830-48f3-afe4-217934792e38"/>
|
||||
</ownedArchitectures>
|
||||
<ownedArchitectures xsi:type="org.polarsys.capella.core.data.la:LogicalArchitecture"
|
||||
id="0513bf71-0242-443b-81c2-09139f99b2f5" name="Logical Architecture">
|
||||
<ownedFunctionPkg xsi:type="org.polarsys.capella.core.data.la:LogicalFunctionPkg"
|
||||
id="37467730-4fab-4bbc-ba5f-525db27bbfbe" name="Logical Functions">
|
||||
<ownedLogicalFunctions xsi:type="org.polarsys.capella.core.data.la:LogicalFunction"
|
||||
id="0c56a530-9859-47ee-b73e-fb0b879ffc7b" name="Root Logical Function">
|
||||
<ownedFunctionRealizations xsi:type="org.polarsys.capella.core.data.fa:FunctionRealization"
|
||||
id="ac365b57-7ed4-4330-aada-78ddb4c5c4db" targetElement="#985173ac-059e-4cb8-957d-c546987995ab"
|
||||
sourceElement="#0c56a530-9859-47ee-b73e-fb0b879ffc7b"/>
|
||||
</ownedLogicalFunctions>
|
||||
</ownedFunctionPkg>
|
||||
<ownedAbstractCapabilityPkg xsi:type="org.polarsys.capella.core.data.la:CapabilityRealizationPkg"
|
||||
id="f3311586-12e1-46c8-800a-d6a767e51a66" name="Capabilities"/>
|
||||
<ownedInterfacePkg xsi:type="org.polarsys.capella.core.data.cs:InterfacePkg"
|
||||
id="12c4c0a7-c787-426d-85cb-828ce9b2c929" name="Interfaces"/>
|
||||
<ownedDataPkg xsi:type="org.polarsys.capella.core.data.information:DataPkg"
|
||||
id="ddd4b687-fa54-486a-a996-a2580c16bdf0" name="Data"/>
|
||||
<ownedLogicalComponentPkg xsi:type="org.polarsys.capella.core.data.la:LogicalComponentPkg"
|
||||
id="2efdb257-6803-42c9-b295-e8de811a4c3b" name="Structure">
|
||||
<ownedParts xsi:type="org.polarsys.capella.core.data.cs:Part" id="6fae67f3-8948-42bf-82b3-f64c66c4b678"
|
||||
name="Logical System" abstractType="#5698d778-e688-4558-ab44-28c6ff4160e5"/>
|
||||
<ownedLogicalComponents xsi:type="org.polarsys.capella.core.data.la:LogicalComponent"
|
||||
id="5698d778-e688-4558-ab44-28c6ff4160e5" name="Logical System">
|
||||
<ownedComponentRealizations xsi:type="org.polarsys.capella.core.data.cs:ComponentRealization"
|
||||
id="d860709b-985b-43a4-a94a-fcbd3818f63b" targetElement="#7b1c3c2b-e539-43fd-a843-f85207c898c3"
|
||||
sourceElement="#5698d778-e688-4558-ab44-28c6ff4160e5"/>
|
||||
</ownedLogicalComponents>
|
||||
</ownedLogicalComponentPkg>
|
||||
<ownedSystemAnalysisRealizations xsi:type="org.polarsys.capella.core.data.la:SystemAnalysisRealization"
|
||||
id="32116e47-111c-473f-9ad7-c2220fb3a966" targetElement="#4cc8d915-4830-48f3-afe4-217934792e38"
|
||||
sourceElement="#0513bf71-0242-443b-81c2-09139f99b2f5"/>
|
||||
</ownedArchitectures>
|
||||
<ownedArchitectures xsi:type="org.polarsys.capella.core.data.pa:PhysicalArchitecture"
|
||||
id="e0888733-c04b-4628-af93-bf08dd37eefd" name="Physical Architecture">
|
||||
<ownedFunctionPkg xsi:type="org.polarsys.capella.core.data.pa:PhysicalFunctionPkg"
|
||||
id="ecff6686-819d-41a5-b73a-52ee0e374078" name="Physical Functions">
|
||||
<ownedPhysicalFunctions xsi:type="org.polarsys.capella.core.data.pa:PhysicalFunction"
|
||||
id="bf38e330-6042-4d71-a5e6-b0827a02b8ab" name="Root Physical Function">
|
||||
<ownedFunctionRealizations xsi:type="org.polarsys.capella.core.data.fa:FunctionRealization"
|
||||
id="3c789844-d978-48b8-ba24-6fd31d6b9833" targetElement="#0c56a530-9859-47ee-b73e-fb0b879ffc7b"
|
||||
sourceElement="#bf38e330-6042-4d71-a5e6-b0827a02b8ab"/>
|
||||
</ownedPhysicalFunctions>
|
||||
</ownedFunctionPkg>
|
||||
<ownedAbstractCapabilityPkg xsi:type="org.polarsys.capella.core.data.la:CapabilityRealizationPkg"
|
||||
id="891d2f98-ce0a-4e31-8b89-b02a3343425c" name="Capabilities"/>
|
||||
<ownedInterfacePkg xsi:type="org.polarsys.capella.core.data.cs:InterfacePkg"
|
||||
id="4d94f1dd-6c9c-4722-b05f-c33f1de04c5f" name="Interfaces"/>
|
||||
<ownedDataPkg xsi:type="org.polarsys.capella.core.data.information:DataPkg"
|
||||
id="b12698b9-ec55-4ed9-93d8-d5d5a0194424" name="Data"/>
|
||||
<ownedPhysicalComponentPkg xsi:type="org.polarsys.capella.core.data.pa:PhysicalComponentPkg"
|
||||
id="9fb8391a-4ef2-4edd-b07d-ff4895334b10" name="Structure">
|
||||
<ownedParts xsi:type="org.polarsys.capella.core.data.cs:Part" id="b119f8ae-25d2-4b62-b894-5bd6e53e6f88"
|
||||
name="Physical System" abstractType="#743aab95-dcb8-4d15-8a1d-0155462fd64f"/>
|
||||
<ownedPhysicalComponents xsi:type="org.polarsys.capella.core.data.pa:PhysicalComponent"
|
||||
id="743aab95-dcb8-4d15-8a1d-0155462fd64f" name="Physical System">
|
||||
<ownedComponentRealizations xsi:type="org.polarsys.capella.core.data.cs:ComponentRealization"
|
||||
id="b0d84c42-b863-47d5-bec5-2d29d92fbf6e" targetElement="#5698d778-e688-4558-ab44-28c6ff4160e5"
|
||||
sourceElement="#743aab95-dcb8-4d15-8a1d-0155462fd64f"/>
|
||||
</ownedPhysicalComponents>
|
||||
</ownedPhysicalComponentPkg>
|
||||
<ownedLogicalArchitectureRealizations xsi:type="org.polarsys.capella.core.data.pa:LogicalArchitectureRealization"
|
||||
id="747e4f0c-1393-49bf-9ecb-cef071edf644" targetElement="#0513bf71-0242-443b-81c2-09139f99b2f5"
|
||||
sourceElement="#e0888733-c04b-4628-af93-bf08dd37eefd"/>
|
||||
</ownedArchitectures>
|
||||
<ownedArchitectures xsi:type="org.polarsys.capella.core.data.epbs:EPBSArchitecture"
|
||||
id="21ab5363-b975-47a0-ab6d-4c7bfc8b39ae" name="EPBS Architecture">
|
||||
<ownedAbstractCapabilityPkg xsi:type="org.polarsys.capella.core.data.la:CapabilityRealizationPkg"
|
||||
id="1fbbfc46-2340-44f5-b169-d83c43384bfc" name="Capabilities"/>
|
||||
<ownedConfigurationItemPkg xsi:type="org.polarsys.capella.core.data.epbs:ConfigurationItemPkg"
|
||||
id="407e72d1-c0ea-4593-91b7-ebac809e1458" name="Structure">
|
||||
<ownedParts xsi:type="org.polarsys.capella.core.data.cs:Part" id="78a2aac3-3d27-4b38-b975-54afb1c564a3"
|
||||
name="System" abstractType="#779f4a3f-6056-4a49-9e46-58da3793925e"/>
|
||||
<ownedConfigurationItems xsi:type="org.polarsys.capella.core.data.epbs:ConfigurationItem"
|
||||
id="779f4a3f-6056-4a49-9e46-58da3793925e" name="System" kind="SystemCI">
|
||||
<ownedPhysicalArtifactRealizations xsi:type="org.polarsys.capella.core.data.epbs:PhysicalArtifactRealization"
|
||||
id="cb95c6c0-dce8-4c12-bfe1-bf14d84d2796" targetElement="#743aab95-dcb8-4d15-8a1d-0155462fd64f"
|
||||
sourceElement="#779f4a3f-6056-4a49-9e46-58da3793925e"/>
|
||||
</ownedConfigurationItems>
|
||||
</ownedConfigurationItemPkg>
|
||||
<ownedPhysicalArchitectureRealizations xsi:type="org.polarsys.capella.core.data.epbs:PhysicalArchitectureRealization"
|
||||
id="2e60c3b5-085e-4ea9-8aa6-23f8857886ef" targetElement="#e0888733-c04b-4628-af93-bf08dd37eefd"
|
||||
sourceElement="#21ab5363-b975-47a0-ab6d-4c7bfc8b39ae"/>
|
||||
</ownedArchitectures>
|
||||
</ownedModelRoots>
|
||||
</org.polarsys.capella.core.data.capellamodeller:Project>
|
||||
@@ -0,0 +1,76 @@
|
||||
{
|
||||
"date": "2026-09-13T07:34:22.962Z",
|
||||
"app": "Capella7.1.0.202606231255",
|
||||
"workspace": "capella-layout-benchmark-20260912",
|
||||
"project": "IncidentScenarioBenchmark",
|
||||
"scope": "Native Windows single OA scenario, two newly created activity lifelines, one interaction; no crossing/reorder or activation-nesting claim.",
|
||||
"actions": [
|
||||
{
|
||||
"action": "Welcome New Capella Project, name IncidentScenarioBenchmark, Finish; close Welcome; Operational Analysis; Define Operational Activities and describe Interactions; Create OAS; accept default scenario name",
|
||||
"result": "New blank OAS canvas with Activity/Activities/Interaction/Interaction with return branch/Reference/LOOP palette."
|
||||
},
|
||||
{
|
||||
"action": "Activity then canvas381,205; Activity then canvas654,249",
|
||||
"result": "Two created activity headers at x430 and703; properties visible."
|
||||
},
|
||||
{
|
||||
"action": "Interaction then drag430,334 to703,334",
|
||||
"result": "Pending line; drag did not finish creation."
|
||||
},
|
||||
{
|
||||
"action": "Click703,334, choose Create a new Interaction, type Report incident, OK",
|
||||
"result": "Horizontal message y334 with small receiver execution; Save baseline captured."
|
||||
},
|
||||
{
|
||||
"action": "Select tool then arrow body drag500,334 to500,415",
|
||||
"result": "No visible movement; repeat after selecting Sequence Message also no visible movement."
|
||||
},
|
||||
{
|
||||
"action": "Receiver execution drag704,349 to704,428",
|
||||
"result": "Whole message moved y334 to413, receiver execution moved with it; saved semantic .capella byte-for-byte unchanged, .aird changed."
|
||||
},
|
||||
{
|
||||
"action": "Header drag430,256 to510,256",
|
||||
"result": "Left lifeline moved80pixels and attached message endpoint moved."
|
||||
},
|
||||
{
|
||||
"action": "Ctrl+Z once",
|
||||
"result": "Left lifeline returned to430; message still413."
|
||||
},
|
||||
{
|
||||
"action": "Ctrl+Z again",
|
||||
"result": "Message returned334."
|
||||
},
|
||||
{
|
||||
"action": "Ctrl+S",
|
||||
"result": "Restored saved files captured."
|
||||
}
|
||||
],
|
||||
"captureFailures": [
|
||||
{
|
||||
"action": "first activity placement",
|
||||
"error": "window capture timed out: timed out waiting on channel",
|
||||
"recovery": "fresh returned window selection and screenshot succeeded; no repeat input"
|
||||
},
|
||||
{
|
||||
"action": "interaction initial drag",
|
||||
"error": "window capture timed out: timed out waiting on channel",
|
||||
"recovery": "fresh returned window selection and screenshot succeeded; no repeat drag"
|
||||
}
|
||||
],
|
||||
"restored": [
|
||||
{
|
||||
"file": "IncidentScenarioBenchmark.capella",
|
||||
"bytes": 26594,
|
||||
"equalBefore": true,
|
||||
"sha256": "d8764060c6f3d11ddf24a91e20955fe035725cfe35019fdd514688d07118c056"
|
||||
},
|
||||
{
|
||||
"file": "IncidentScenarioBenchmark.aird",
|
||||
"bytes": 29469,
|
||||
"equalBefore": true,
|
||||
"sha256": "c24db589f3a551b8ea0f8d00d2dc6729909157e2a3ac4ebc0ca69cd141393c89"
|
||||
}
|
||||
],
|
||||
"implication": "Evidence supports view-local message/lane spacing distinct from shared semantics. Body-drag failure is observed for this sequence; it does not prove Capella never supports message-body movement. Studio should make the target discoverable, retain exact one-Undo behavior, and verify preview/commit equality separately."
|
||||
}
|
||||
@@ -0,0 +1,218 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:description="http://www.eclipse.org/sirius/description/1.1.0" xmlns:description_1="http://www.eclipse.org/sirius/diagram/sequence/description/2.0.0" xmlns:description_2="http://www.eclipse.org/sirius/diagram/description/1.1.0" xmlns:diagram="http://www.eclipse.org/sirius/diagram/1.1.0" xmlns:filter="http://www.eclipse.org/sirius/diagram/description/filter/1.1.0" xmlns:notation="http://www.eclipse.org/gmf/runtime/1.0.3/notation" xmlns:org.polarsys.capella.core.data.fa="http://www.polarsys.org/capella/core/fa/7.0.0" xmlns:org.polarsys.capella.core.data.interaction="http://www.polarsys.org/capella/core/interaction/7.0.0" xmlns:org.polarsys.capella.core.data.oa="http://www.polarsys.org/capella/core/oa/7.0.0" xmlns:sequence="http://www.eclipse.org/sirius/diagram/sequence/2.0.0" xmlns:style="http://www.eclipse.org/sirius/diagram/description/style/1.1.0" xmlns:viewpoint="http://www.eclipse.org/sirius/1.1.0" xsi:schemaLocation="http://www.eclipse.org/sirius/description/1.1.0 http://www.eclipse.org/sirius/1.1.0#//description http://www.eclipse.org/sirius/diagram/sequence/description/2.0.0 http://www.eclipse.org/sirius/diagram/sequence/2.0.0#//description http://www.eclipse.org/sirius/diagram/description/1.1.0 http://www.eclipse.org/sirius/diagram/1.1.0#//description http://www.eclipse.org/sirius/diagram/description/filter/1.1.0 http://www.eclipse.org/sirius/diagram/1.1.0#//description/filter http://www.eclipse.org/sirius/diagram/description/style/1.1.0 http://www.eclipse.org/sirius/diagram/1.1.0#//description/style">
|
||||
<viewpoint:DAnalysis uid="_aGG3IK9DEfGUao8nYtZHOA" selectedViews="_jKVQsK9DEfGUao8nYtZHOA _j6oFMK9DEfGUao8nYtZHOA _k_n-YK9DEfGUao8nYtZHOA _lbLR8K9DEfGUao8nYtZHOA _lkvdoK9DEfGUao8nYtZHOA _lnCjsK9DEfGUao8nYtZHOA _lneokK9DEfGUao8nYtZHOA" version="15.4.1.202403191723">
|
||||
<semanticResources>IncidentScenarioBenchmark.afm</semanticResources>
|
||||
<semanticResources>IncidentScenarioBenchmark.capella</semanticResources>
|
||||
<ownedViews xmi:type="viewpoint:DView" uid="_jKVQsK9DEfGUao8nYtZHOA">
|
||||
<viewpoint xmi:type="description:Viewpoint" href="platform:/plugin/org.polarsys.kitalpha.ad.integration.sirius/description/ad.odesign#//@ownedViewpoints[name='ad']"/>
|
||||
</ownedViews>
|
||||
<ownedViews xmi:type="viewpoint:DView" uid="_j6oFMK9DEfGUao8nYtZHOA">
|
||||
<viewpoint xmi:type="description:Viewpoint" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']"/>
|
||||
<ownedRepresentationDescriptors xmi:type="viewpoint:DRepresentationDescriptor" uid="_CzkvUK9EEfGUao8nYtZHOA" name="[OAS] OperationalCapability 1" repPath="#_Cvs78K9EEfGUao8nYtZHOA" changeId="1789284570297">
|
||||
<description xmi:type="description_1:SequenceDiagramDescription" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']"/>
|
||||
<target xmi:type="org.polarsys.capella.core.data.interaction:Scenario" href="IncidentScenarioBenchmark.capella#6aa3cccb-9adc-4230-993d-7ee80c250509"/>
|
||||
</ownedRepresentationDescriptors>
|
||||
</ownedViews>
|
||||
<ownedViews xmi:type="viewpoint:DView" uid="_k_n-YK9DEfGUao8nYtZHOA">
|
||||
<viewpoint xmi:type="description:Viewpoint" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/common.odesign#//@ownedViewpoints[name='Common']"/>
|
||||
</ownedViews>
|
||||
<ownedViews xmi:type="viewpoint:DView" uid="_lbLR8K9DEfGUao8nYtZHOA">
|
||||
<viewpoint xmi:type="description:Viewpoint" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/context.odesign#//@ownedViewpoints[name='System%20Analysis']"/>
|
||||
</ownedViews>
|
||||
<ownedViews xmi:type="viewpoint:DView" uid="_lkvdoK9DEfGUao8nYtZHOA">
|
||||
<viewpoint xmi:type="description:Viewpoint" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/logical.odesign#//@ownedViewpoints[name='Logical%20Architecture']"/>
|
||||
</ownedViews>
|
||||
<ownedViews xmi:type="viewpoint:DView" uid="_lnCjsK9DEfGUao8nYtZHOA">
|
||||
<viewpoint xmi:type="description:Viewpoint" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/EPBS.odesign#//@ownedViewpoints[name='EPBS%20architecture']"/>
|
||||
</ownedViews>
|
||||
<ownedViews xmi:type="viewpoint:DView" uid="_lneokK9DEfGUao8nYtZHOA">
|
||||
<viewpoint xmi:type="description:Viewpoint" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/physical.odesign#//@ownedViewpoints[name='Physical%20Architecture']"/>
|
||||
</ownedViews>
|
||||
</viewpoint:DAnalysis>
|
||||
<sequence:SequenceDDiagram uid="_Cvs78K9EEfGUao8nYtZHOA">
|
||||
<ownedAnnotationEntries xmi:type="description:AnnotationEntry" uid="_C2IUEK9EEfGUao8nYtZHOA" source="GMF_DIAGRAMS">
|
||||
<data xmi:type="notation:Diagram" xmi:id="_C2IUEa9EEfGUao8nYtZHOA" type="Sirius" element="_Cvs78K9EEfGUao8nYtZHOA" measurementUnit="Pixel">
|
||||
<children xmi:type="notation:Node" xmi:id="_Qmo2kK9EEfGUao8nYtZHOA" type="2001" element="_Qhyy0K9EEfGUao8nYtZHOA">
|
||||
<children xmi:type="notation:Node" xmi:id="_QnNeUK9EEfGUao8nYtZHOA" type="5002">
|
||||
<layoutConstraint xmi:type="notation:Location" xmi:id="_QnNeUa9EEfGUao8nYtZHOA" y="5"/>
|
||||
</children>
|
||||
<children xmi:type="notation:Node" xmi:id="_QnUzEK9EEfGUao8nYtZHOA" type="3001" element="_QjjGUK9EEfGUao8nYtZHOA">
|
||||
<children xmi:type="notation:Node" xmi:id="_QnWBMK9EEfGUao8nYtZHOA" type="5001">
|
||||
<layoutConstraint xmi:type="notation:Location" xmi:id="_QnWBMa9EEfGUao8nYtZHOA" y="5"/>
|
||||
</children>
|
||||
<children xmi:type="notation:Node" xmi:id="_QoEZ8K9EEfGUao8nYtZHOA" type="3003" element="_QjlikK9EEfGUao8nYtZHOA">
|
||||
<styles xmi:type="notation:ShapeStyle" xmi:id="_QoEZ8a9EEfGUao8nYtZHOA" fontName="Segoe UI"/>
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_QoEZ8q9EEfGUao8nYtZHOA"/>
|
||||
</children>
|
||||
<children xmi:type="notation:Node" xmi:id="_QoG2MK9EEfGUao8nYtZHOA" type="3001" element="_QkQ4AK9EEfGUao8nYtZHOA">
|
||||
<children xmi:type="notation:Node" xmi:id="_QoLusK9EEfGUao8nYtZHOA" type="5001">
|
||||
<layoutConstraint xmi:type="notation:Location" xmi:id="_QoLusa9EEfGUao8nYtZHOA" y="5"/>
|
||||
</children>
|
||||
<children xmi:type="notation:Node" xmi:id="_Q5NNQK9EEfGUao8nYtZHOA" type="3005" element="_QkTUQK9EEfGUao8nYtZHOA">
|
||||
<styles xmi:type="notation:ShapeStyle" xmi:id="_Q5NNQa9EEfGUao8nYtZHOA" fontName="Segoe UI"/>
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_Q5NNQq9EEfGUao8nYtZHOA"/>
|
||||
</children>
|
||||
<styles xmi:type="notation:ShapeStyle" xmi:id="_QoG2Ma9EEfGUao8nYtZHOA" fontName="Segoe UI" fontHeight="8"/>
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_QoG2Mq9EEfGUao8nYtZHOA" x="2" y="395" width="10" height="10"/>
|
||||
</children>
|
||||
<styles xmi:type="notation:ShapeStyle" xmi:id="_QnUzEa9EEfGUao8nYtZHOA" fontName="Segoe UI" fontHeight="8"/>
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_QnUzEq9EEfGUao8nYtZHOA" y="42" width="10" height="395"/>
|
||||
</children>
|
||||
<children xmi:type="notation:Node" xmi:id="_QnzUMK9EEfGUao8nYtZHOA" type="3003" element="_QiTwMK9EEfGUao8nYtZHOA">
|
||||
<styles xmi:type="notation:ShapeStyle" xmi:id="_QnzUMa9EEfGUao8nYtZHOA" fontName="Segoe UI"/>
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_QnzUMq9EEfGUao8nYtZHOA"/>
|
||||
</children>
|
||||
<styles xmi:type="notation:ShapeStyle" xmi:id="_Qmo2ka9EEfGUao8nYtZHOA" fontColor="4210779" fontName="Segoe UI" fontHeight="8"/>
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_Qmo2kq9EEfGUao8nYtZHOA" x="124" y="50" width="100" height="50"/>
|
||||
</children>
|
||||
<children xmi:type="notation:Node" xmi:id="_aYDtUK9EEfGUao8nYtZHOA" type="2001" element="_aR4z4K9EEfGUao8nYtZHOA">
|
||||
<children xmi:type="notation:Node" xmi:id="_aYLpIK9EEfGUao8nYtZHOA" type="5002">
|
||||
<layoutConstraint xmi:type="notation:Location" xmi:id="_aYLpIa9EEfGUao8nYtZHOA" y="5"/>
|
||||
</children>
|
||||
<children xmi:type="notation:Node" xmi:id="_aYSW0K9EEfGUao8nYtZHOA" type="3001" element="_aR7QIK9EEfGUao8nYtZHOA">
|
||||
<children xmi:type="notation:Node" xmi:id="_aYUMAK9EEfGUao8nYtZHOA" type="5001">
|
||||
<layoutConstraint xmi:type="notation:Location" xmi:id="_aYUMAa9EEfGUao8nYtZHOA" y="5"/>
|
||||
</children>
|
||||
<children xmi:type="notation:Node" xmi:id="_aYd9AK9EEfGUao8nYtZHOA" type="3003" element="_aR7QIa9EEfGUao8nYtZHOA">
|
||||
<styles xmi:type="notation:ShapeStyle" xmi:id="_aYd9Aa9EEfGUao8nYtZHOA" fontName="Segoe UI"/>
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_aYd9Aq9EEfGUao8nYtZHOA"/>
|
||||
</children>
|
||||
<children xmi:type="notation:Node" xmi:id="_aYfLIK9EEfGUao8nYtZHOA" type="3001" element="_aSOyIK9EEfGUao8nYtZHOA">
|
||||
<children xmi:type="notation:Node" xmi:id="_aZFBAK9EEfGUao8nYtZHOA" type="5001">
|
||||
<layoutConstraint xmi:type="notation:Location" xmi:id="_aZFBAa9EEfGUao8nYtZHOA" y="5"/>
|
||||
</children>
|
||||
<children xmi:type="notation:Node" xmi:id="_aaVlQK9EEfGUao8nYtZHOA" type="3005" element="_aSiUIK9EEfGUao8nYtZHOA">
|
||||
<styles xmi:type="notation:ShapeStyle" xmi:id="_aaVlQa9EEfGUao8nYtZHOA" fontName="Segoe UI"/>
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_aaVlQq9EEfGUao8nYtZHOA"/>
|
||||
</children>
|
||||
<styles xmi:type="notation:ShapeStyle" xmi:id="_aYfLIa9EEfGUao8nYtZHOA" fontName="Segoe UI" fontHeight="8"/>
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_aYfLIq9EEfGUao8nYtZHOA" x="2" y="395" width="10" height="10"/>
|
||||
</children>
|
||||
<children xmi:type="notation:Node" xmi:id="_2vIQkK9EEfGUao8nYtZHOA" type="3001" element="_2nzgkK9EEfGUao8nYtZHOA">
|
||||
<children xmi:type="notation:Node" xmi:id="_2vbLgK9EEfGUao8nYtZHOA" type="5001">
|
||||
<layoutConstraint xmi:type="notation:Location" xmi:id="_2vbLga9EEfGUao8nYtZHOA" x="-1"/>
|
||||
</children>
|
||||
<children xmi:type="notation:Node" xmi:id="_2vbLgq9EEfGUao8nYtZHOA" type="3003" element="_2n3yAK9EEfGUao8nYtZHOA">
|
||||
<styles xmi:type="notation:ShapeStyle" xmi:id="_2vbLg69EEfGUao8nYtZHOA" fontName="Segoe UI"/>
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_2vbLhK9EEfGUao8nYtZHOA"/>
|
||||
</children>
|
||||
<styles xmi:type="notation:ShapeStyle" xmi:id="_2vIQka9EEfGUao8nYtZHOA" fontColor="4210779" fontName="Segoe UI" fontHeight="8"/>
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_2vIQkq9EEfGUao8nYtZHOA" x="2" y="53" width="10" height="30"/>
|
||||
</children>
|
||||
<styles xmi:type="notation:ShapeStyle" xmi:id="_aYSW0a9EEfGUao8nYtZHOA" fontName="Segoe UI" fontHeight="8"/>
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_aYSW0q9EEfGUao8nYtZHOA" y="42" width="10" height="395"/>
|
||||
</children>
|
||||
<children xmi:type="notation:Node" xmi:id="_aYZEgK9EEfGUao8nYtZHOA" type="3003" element="_aR4z4a9EEfGUao8nYtZHOA">
|
||||
<styles xmi:type="notation:ShapeStyle" xmi:id="_aYZEga9EEfGUao8nYtZHOA" fontName="Segoe UI"/>
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_aYZEgq9EEfGUao8nYtZHOA"/>
|
||||
</children>
|
||||
<styles xmi:type="notation:ShapeStyle" xmi:id="_aYDtUa9EEfGUao8nYtZHOA" fontColor="4210779" fontName="Segoe UI" fontHeight="8"/>
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_aYDtUq9EEfGUao8nYtZHOA" x="397" y="50" width="100" height="50"/>
|
||||
</children>
|
||||
<styles xmi:type="notation:DiagramStyle" xmi:id="_C2IUEq9EEfGUao8nYtZHOA"/>
|
||||
<edges xmi:type="notation:Edge" xmi:id="_2w4kEK9EEfGUao8nYtZHOA" type="4001" element="_2o9-MK9EEfGUao8nYtZHOA" source="_QnUzEK9EEfGUao8nYtZHOA" target="_2vIQkK9EEfGUao8nYtZHOA">
|
||||
<children xmi:type="notation:Node" xmi:id="_2xPwcK9EEfGUao8nYtZHOA" type="6001">
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_2xPwca9EEfGUao8nYtZHOA" y="-10"/>
|
||||
</children>
|
||||
<children xmi:type="notation:Node" xmi:id="_2xY6YK9EEfGUao8nYtZHOA" type="6002">
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_2xY6Ya9EEfGUao8nYtZHOA" y="10"/>
|
||||
</children>
|
||||
<children xmi:type="notation:Node" xmi:id="_2xaIgK9EEfGUao8nYtZHOA" type="6003">
|
||||
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_2xaIga9EEfGUao8nYtZHOA" y="10"/>
|
||||
</children>
|
||||
<styles xmi:type="notation:ConnectorStyle" xmi:id="_2w4kEa9EEfGUao8nYtZHOA" jumpLinkStatus="Above" jumpLinkType="Tunnel"/>
|
||||
<styles xmi:type="notation:FontStyle" xmi:id="_2w4kEq9EEfGUao8nYtZHOA" fontName="Segoe UI" fontHeight="8"/>
|
||||
<bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_2w4kE69EEfGUao8nYtZHOA" points="[0, 0, -273, -4]$[272, 0, -1, -4]"/>
|
||||
<sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_2xeZ8K9EEfGUao8nYtZHOA" id="(0.5,0.1341772151898734) custom"/>
|
||||
<targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_2xeZ8a9EEfGUao8nYtZHOA" id="(0.5,0.1341772151898734) custom"/>
|
||||
</edges>
|
||||
</data>
|
||||
</ownedAnnotationEntries>
|
||||
<ownedAnnotationEntries xmi:type="description:AnnotationEntry" uid="_C5o7EK9EEfGUao8nYtZHOA" source="DANNOTATION_CUSTOMIZATION_KEY">
|
||||
<data xmi:type="diagram:ComputedStyleDescriptionRegistry" uid="_C5rXUK9EEfGUao8nYtZHOA"/>
|
||||
</ownedAnnotationEntries>
|
||||
<ownedDiagramElements xmi:type="diagram:DNode" uid="_Qhyy0K9EEfGUao8nYtZHOA" name="OperationalActivity 1" width="10" height="5" resizeKind="EAST_WEST">
|
||||
<target xmi:type="org.polarsys.capella.core.data.interaction:InstanceRole" href="IncidentScenarioBenchmark.capella#86b77dcf-5283-4bc0-8d6a-25936ad7e857"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.interaction:InstanceRole" href="IncidentScenarioBenchmark.capella#86b77dcf-5283-4bc0-8d6a-25936ad7e857"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.oa:OperationalActivity" href="IncidentScenarioBenchmark.capella#2e2d08d5-9c42-4e33-af81-222efa4c992c"/>
|
||||
<graphicalFilters xmi:type="diagram:AbsoluteBoundsFilter" uid="_QlEwUK9EEfGUao8nYtZHOA" x="124" y="50" height="50" width="100"/>
|
||||
<ownedBorderedNodes xmi:type="diagram:DNode" uid="_QjjGUK9EEfGUao8nYtZHOA" outgoingEdges="_2o9-MK9EEfGUao8nYtZHOA" width="1" height="40" resizeKind="NSEW">
|
||||
<target xmi:type="org.polarsys.capella.core.data.interaction:InstanceRole" href="IncidentScenarioBenchmark.capella#86b77dcf-5283-4bc0-8d6a-25936ad7e857"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.interaction:InstanceRole" href="IncidentScenarioBenchmark.capella#86b77dcf-5283-4bc0-8d6a-25936ad7e857"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.oa:OperationalActivity" href="IncidentScenarioBenchmark.capella#2e2d08d5-9c42-4e33-af81-222efa4c992c"/>
|
||||
<ownedBorderedNodes xmi:type="diagram:DNode" uid="_QkQ4AK9EEfGUao8nYtZHOA" width="1" height="1">
|
||||
<target xmi:type="org.polarsys.capella.core.data.interaction:InstanceRole" href="IncidentScenarioBenchmark.capella#86b77dcf-5283-4bc0-8d6a-25936ad7e857"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.interaction:InstanceRole" href="IncidentScenarioBenchmark.capella#86b77dcf-5283-4bc0-8d6a-25936ad7e857"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.oa:OperationalActivity" href="IncidentScenarioBenchmark.capella#2e2d08d5-9c42-4e33-af81-222efa4c992c"/>
|
||||
<ownedStyle xmi:type="diagram:WorkspaceImage" uid="_QkTUQK9EEfGUao8nYtZHOA" showIcon="false" labelPosition="node" workspacePath="/org.polarsys.capella.core.sirius.analysis/description/images/handlelifeline.svg">
|
||||
<description xmi:type="style:WorkspaceImageDescription" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@nodeMappings[name='InstanceRoleMaping%20AIS']/@borderedNodeMappings[name='default%20execution%20AIS']/@borderedNodeMappings[name='endOfLifeAIS']/@style"/>
|
||||
</ownedStyle>
|
||||
<actualMapping xmi:type="description_1:EndOfLifeMapping" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@nodeMappings[name='InstanceRoleMaping%20AIS']/@borderedNodeMappings[name='default%20execution%20AIS']/@borderedNodeMappings[name='endOfLifeAIS']"/>
|
||||
</ownedBorderedNodes>
|
||||
<ownedStyle xmi:type="diagram:Square" uid="_QjlikK9EEfGUao8nYtZHOA" showIcon="false" borderSize="1" borderSizeComputationExpression="1" borderColor="128,128,128" labelPosition="node" width="1" height="40" color="247,218,116">
|
||||
<description xmi:type="style:SquareDescription" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@nodeMappings[name='InstanceRoleMaping%20AIS']/@borderedNodeMappings[name='default%20execution%20AIS']/@style"/>
|
||||
</ownedStyle>
|
||||
<actualMapping xmi:type="description_1:ExecutionMapping" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@nodeMappings[name='InstanceRoleMaping%20AIS']/@borderedNodeMappings[name='default%20execution%20AIS']"/>
|
||||
</ownedBorderedNodes>
|
||||
<ownedStyle xmi:type="diagram:Square" uid="_QiTwMK9EEfGUao8nYtZHOA" labelColor="91,64,64" borderSize="1" borderSizeComputationExpression="1" borderColor="91,64,64" labelPosition="node" width="10" height="5" color="247,218,116">
|
||||
<description xmi:type="style:SquareDescription" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@nodeMappings[name='InstanceRoleMaping%20AIS']/@style"/>
|
||||
</ownedStyle>
|
||||
<actualMapping xmi:type="description_1:InstanceRoleMapping" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@nodeMappings[name='InstanceRoleMaping%20AIS']"/>
|
||||
</ownedDiagramElements>
|
||||
<ownedDiagramElements xmi:type="diagram:DNode" uid="_aR4z4K9EEfGUao8nYtZHOA" name="OperationalActivity 2" width="10" height="5" resizeKind="EAST_WEST">
|
||||
<target xmi:type="org.polarsys.capella.core.data.interaction:InstanceRole" href="IncidentScenarioBenchmark.capella#5ebf9054-720b-4c46-8ddb-d556548b12ab"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.interaction:InstanceRole" href="IncidentScenarioBenchmark.capella#5ebf9054-720b-4c46-8ddb-d556548b12ab"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.oa:OperationalActivity" href="IncidentScenarioBenchmark.capella#f6af7ea3-196f-4c3f-8b52-75154362d1e0"/>
|
||||
<graphicalFilters xmi:type="diagram:AbsoluteBoundsFilter" uid="_aSjiQK9EEfGUao8nYtZHOA" x="397" y="50" height="50" width="100"/>
|
||||
<ownedBorderedNodes xmi:type="diagram:DNode" uid="_aR7QIK9EEfGUao8nYtZHOA" width="1" height="40" resizeKind="NSEW">
|
||||
<target xmi:type="org.polarsys.capella.core.data.interaction:InstanceRole" href="IncidentScenarioBenchmark.capella#5ebf9054-720b-4c46-8ddb-d556548b12ab"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.interaction:InstanceRole" href="IncidentScenarioBenchmark.capella#5ebf9054-720b-4c46-8ddb-d556548b12ab"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.oa:OperationalActivity" href="IncidentScenarioBenchmark.capella#f6af7ea3-196f-4c3f-8b52-75154362d1e0"/>
|
||||
<ownedBorderedNodes xmi:type="diagram:DNode" uid="_aSOyIK9EEfGUao8nYtZHOA" width="1" height="1">
|
||||
<target xmi:type="org.polarsys.capella.core.data.interaction:InstanceRole" href="IncidentScenarioBenchmark.capella#5ebf9054-720b-4c46-8ddb-d556548b12ab"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.interaction:InstanceRole" href="IncidentScenarioBenchmark.capella#5ebf9054-720b-4c46-8ddb-d556548b12ab"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.oa:OperationalActivity" href="IncidentScenarioBenchmark.capella#f6af7ea3-196f-4c3f-8b52-75154362d1e0"/>
|
||||
<ownedStyle xmi:type="diagram:WorkspaceImage" uid="_aSiUIK9EEfGUao8nYtZHOA" showIcon="false" labelPosition="node" workspacePath="/org.polarsys.capella.core.sirius.analysis/description/images/handlelifeline.svg">
|
||||
<description xmi:type="style:WorkspaceImageDescription" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@nodeMappings[name='InstanceRoleMaping%20AIS']/@borderedNodeMappings[name='default%20execution%20AIS']/@borderedNodeMappings[name='endOfLifeAIS']/@style"/>
|
||||
</ownedStyle>
|
||||
<actualMapping xmi:type="description_1:EndOfLifeMapping" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@nodeMappings[name='InstanceRoleMaping%20AIS']/@borderedNodeMappings[name='default%20execution%20AIS']/@borderedNodeMappings[name='endOfLifeAIS']"/>
|
||||
</ownedBorderedNodes>
|
||||
<ownedBorderedNodes xmi:type="diagram:DNode" uid="_2nzgkK9EEfGUao8nYtZHOA" incomingEdges="_2o9-MK9EEfGUao8nYtZHOA" width="1" height="3" resizeKind="NSEW">
|
||||
<target xmi:type="org.polarsys.capella.core.data.interaction:Execution" href="IncidentScenarioBenchmark.capella#4bbeb6bd-6bc8-455f-8d8b-3a8f387343ef"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.interaction:Execution" href="IncidentScenarioBenchmark.capella#4bbeb6bd-6bc8-455f-8d8b-3a8f387343ef"/>
|
||||
<graphicalFilters xmi:type="diagram:AbsoluteBoundsFilter" uid="_26OtUK9EEfGUao8nYtZHOA" x="442" y="153" height="30" width="10"/>
|
||||
<ownedStyle xmi:type="diagram:Square" uid="_2n3yAK9EEfGUao8nYtZHOA" showIcon="false" labelColor="91,64,64" borderSize="1" borderSizeComputationExpression="1" borderColor="91,64,64" width="1" height="3" color="247,218,116">
|
||||
<description xmi:type="style:SquareDescription" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@nodeMappings[name='InstanceRoleMaping%20AIS']/@borderedNodeMappings[name='default%20execution%20AIS']/@borderedNodeMappings[name='Execution%20AIS']/@style"/>
|
||||
</ownedStyle>
|
||||
<actualMapping xmi:type="description_1:ExecutionMapping" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@nodeMappings[name='InstanceRoleMaping%20AIS']/@borderedNodeMappings[name='default%20execution%20AIS']/@borderedNodeMappings[name='Execution%20AIS']"/>
|
||||
</ownedBorderedNodes>
|
||||
<ownedStyle xmi:type="diagram:Square" uid="_aR7QIa9EEfGUao8nYtZHOA" showIcon="false" borderSize="1" borderSizeComputationExpression="1" borderColor="128,128,128" labelPosition="node" width="1" height="40" color="247,218,116">
|
||||
<description xmi:type="style:SquareDescription" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@nodeMappings[name='InstanceRoleMaping%20AIS']/@borderedNodeMappings[name='default%20execution%20AIS']/@style"/>
|
||||
</ownedStyle>
|
||||
<actualMapping xmi:type="description_1:ExecutionMapping" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@nodeMappings[name='InstanceRoleMaping%20AIS']/@borderedNodeMappings[name='default%20execution%20AIS']"/>
|
||||
</ownedBorderedNodes>
|
||||
<ownedStyle xmi:type="diagram:Square" uid="_aR4z4a9EEfGUao8nYtZHOA" labelColor="91,64,64" borderSize="1" borderSizeComputationExpression="1" borderColor="91,64,64" labelPosition="node" width="10" height="5" color="247,218,116">
|
||||
<description xmi:type="style:SquareDescription" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@nodeMappings[name='InstanceRoleMaping%20AIS']/@style"/>
|
||||
</ownedStyle>
|
||||
<actualMapping xmi:type="description_1:InstanceRoleMapping" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@nodeMappings[name='InstanceRoleMaping%20AIS']"/>
|
||||
</ownedDiagramElements>
|
||||
<ownedDiagramElements xmi:type="diagram:DEdge" uid="_2o9-MK9EEfGUao8nYtZHOA" name="Report incident" sourceNode="_QjjGUK9EEfGUao8nYtZHOA" targetNode="_2nzgkK9EEfGUao8nYtZHOA">
|
||||
<target xmi:type="org.polarsys.capella.core.data.interaction:SequenceMessage" href="IncidentScenarioBenchmark.capella#78c1cdb8-4cce-40ed-ae6c-299e7bc937c6"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.interaction:SequenceMessage" href="IncidentScenarioBenchmark.capella#78c1cdb8-4cce-40ed-ae6c-299e7bc937c6"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.interaction:MessageEnd" href="IncidentScenarioBenchmark.capella#ae01bc6a-4f12-45df-9cc0-88530d862dff"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.interaction:MessageEnd" href="IncidentScenarioBenchmark.capella#365b653f-e8c6-4f0d-bbd0-51ceb7f4b392"/>
|
||||
<semanticElements xmi:type="org.polarsys.capella.core.data.fa:FunctionalExchange" href="IncidentScenarioBenchmark.capella#549af3b2-0943-41a3-b0e3-57d0d99ec83f"/>
|
||||
<graphicalFilters xmi:type="diagram:AbsoluteBoundsFilter" uid="_2px2gK9EEfGUao8nYtZHOA" y="153" height="0"/>
|
||||
<ownedStyle xmi:type="diagram:EdgeStyle" uid="_2pSHQK9EEfGUao8nYtZHOA" strokeColor="0,0,0">
|
||||
<description xmi:type="style:EdgeStyleDescription" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@edgeMappings[name='Basic%20message%20mapping%20AIS']/@style"/>
|
||||
<centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_2pT8cK9EEfGUao8nYtZHOA" showIcon="false"/>
|
||||
</ownedStyle>
|
||||
<actualMapping xmi:type="description_1:BasicMessageMapping" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer/@edgeMappings[name='Basic%20message%20mapping%20AIS']"/>
|
||||
</ownedDiagramElements>
|
||||
<description xmi:type="description_1:SequenceDiagramDescription" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']"/>
|
||||
<activatedFilters xmi:type="filter:CompositeFilterDescription" href="platform:/plugin/org.polarsys.kitalpha.ad.integration.sirius/description/ad.odesign#//@ownedViewpoints[name='ad']/@ownedRepresentations[name='AD%20diagram']/@filters[name='ModelExtensionFilter']"/>
|
||||
<filterVariableHistory xmi:type="diagram:FilterVariableHistory" uid="_CxHRMK9EEfGUao8nYtZHOA"/>
|
||||
<activatedLayers xmi:type="description_2:Layer" href="platform:/plugin/org.polarsys.capella.core.sirius.analysis/description/oa.odesign#//@ownedViewpoints[name='Operational%20Analysis']/@ownedRepresentations[name='Activity%20Interaction%20Scenario']/@defaultLayer"/>
|
||||
<target xmi:type="org.polarsys.capella.core.data.interaction:Scenario" href="IncidentScenarioBenchmark.capella#6aa3cccb-9adc-4230-993d-7ee80c250509"/>
|
||||
</sequence:SequenceDDiagram>
|
||||
</xmi:XMI>
|
||||
@@ -0,0 +1,320 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<!--Capella_Version_7.1.0-->
|
||||
<org.polarsys.capella.core.data.capellamodeller:Project xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:libraries="http://www.polarsys.org/capella/common/libraries/7.0.0"
|
||||
xmlns:org.polarsys.capella.core.data.capellacommon="http://www.polarsys.org/capella/core/common/7.0.0"
|
||||
xmlns:org.polarsys.capella.core.data.capellacore="http://www.polarsys.org/capella/core/core/7.0.0"
|
||||
xmlns:org.polarsys.capella.core.data.capellamodeller="http://www.polarsys.org/capella/core/modeller/7.0.0"
|
||||
xmlns:org.polarsys.capella.core.data.cs="http://www.polarsys.org/capella/core/cs/7.0.0"
|
||||
xmlns:org.polarsys.capella.core.data.ctx="http://www.polarsys.org/capella/core/ctx/7.0.0"
|
||||
xmlns:org.polarsys.capella.core.data.epbs="http://www.polarsys.org/capella/core/epbs/7.0.0"
|
||||
xmlns:org.polarsys.capella.core.data.fa="http://www.polarsys.org/capella/core/fa/7.0.0"
|
||||
xmlns:org.polarsys.capella.core.data.information="http://www.polarsys.org/capella/core/information/7.0.0"
|
||||
xmlns:org.polarsys.capella.core.data.information.datatype="http://www.polarsys.org/capella/core/information/datatype/7.0.0"
|
||||
xmlns:org.polarsys.capella.core.data.information.datavalue="http://www.polarsys.org/capella/core/information/datavalue/7.0.0"
|
||||
xmlns:org.polarsys.capella.core.data.interaction="http://www.polarsys.org/capella/core/interaction/7.0.0"
|
||||
xmlns:org.polarsys.capella.core.data.la="http://www.polarsys.org/capella/core/la/7.0.0"
|
||||
xmlns:org.polarsys.capella.core.data.oa="http://www.polarsys.org/capella/core/oa/7.0.0"
|
||||
xmlns:org.polarsys.capella.core.data.pa="http://www.polarsys.org/capella/core/pa/7.0.0"
|
||||
id="72f10eab-78fe-42a5-9b33-c8502b36dcf2"
|
||||
name="IncidentScenarioBenchmark">
|
||||
<ownedExtensions xsi:type="libraries:ModelInformation" id="eccf54b1-64b8-4ccf-b152-37d877017d88"/>
|
||||
<ownedEnumerationPropertyTypes xsi:type="org.polarsys.capella.core.data.capellacore:EnumerationPropertyType"
|
||||
id="a178583e-b1ed-465c-931a-2cae0b61665f" name="ProgressStatus">
|
||||
<ownedLiterals xsi:type="org.polarsys.capella.core.data.capellacore:EnumerationPropertyLiteral"
|
||||
id="9bc69305-639d-4bed-86ba-6f3a08f9ec8d" name="DRAFT"/>
|
||||
<ownedLiterals xsi:type="org.polarsys.capella.core.data.capellacore:EnumerationPropertyLiteral"
|
||||
id="78eff0ec-5690-4301-a970-08a53475a27a" name="TO_BE_REVIEWED"/>
|
||||
<ownedLiterals xsi:type="org.polarsys.capella.core.data.capellacore:EnumerationPropertyLiteral"
|
||||
id="16591e25-53e3-445c-828b-d5c76dccecd1" name="TO_BE_DISCUSSED"/>
|
||||
<ownedLiterals xsi:type="org.polarsys.capella.core.data.capellacore:EnumerationPropertyLiteral"
|
||||
id="da694787-0daa-4fb1-8864-a0e6ac4363c6" name="REWORK_NECESSARY"/>
|
||||
<ownedLiterals xsi:type="org.polarsys.capella.core.data.capellacore:EnumerationPropertyLiteral"
|
||||
id="8e75072c-392c-4020-ba9b-4173ffc637f1" name="UNDER_REWORK"/>
|
||||
<ownedLiterals xsi:type="org.polarsys.capella.core.data.capellacore:EnumerationPropertyLiteral"
|
||||
id="141bf3ce-4ace-4c1f-af73-448c9b732b1c" name="REVIEWED_OK"/>
|
||||
</ownedEnumerationPropertyTypes>
|
||||
<keyValuePairs xsi:type="org.polarsys.capella.core.data.capellacore:KeyValue" id="42c0a932-4f50-492e-9745-8a182f50f7a1"
|
||||
key="projectApproach" value="SingletonComponents"/>
|
||||
<ownedModelRoots xsi:type="org.polarsys.capella.core.data.capellamodeller:SystemEngineering"
|
||||
id="bfe51079-a523-4489-bc5d-a4886fd13c1c" name="IncidentScenarioBenchmark">
|
||||
<ownedArchitectures xsi:type="org.polarsys.capella.core.data.oa:OperationalAnalysis"
|
||||
id="bfcd2964-812e-4106-8ca0-6fa2c2688c91" name="Operational Analysis">
|
||||
<ownedFunctionPkg xsi:type="org.polarsys.capella.core.data.oa:OperationalActivityPkg"
|
||||
id="5ad0311b-7902-4d71-92a3-31106d97f742" name="Operational Activities">
|
||||
<ownedOperationalActivities xsi:type="org.polarsys.capella.core.data.oa:OperationalActivity"
|
||||
id="ede29e45-fa93-490b-b5eb-27f2ee692bfd" name="Root Operational Activity">
|
||||
<ownedFunctions xsi:type="org.polarsys.capella.core.data.oa:OperationalActivity"
|
||||
id="2e2d08d5-9c42-4e33-af81-222efa4c992c" name="OperationalActivity 1"/>
|
||||
<ownedFunctions xsi:type="org.polarsys.capella.core.data.oa:OperationalActivity"
|
||||
id="f6af7ea3-196f-4c3f-8b52-75154362d1e0" name="OperationalActivity 2"/>
|
||||
<ownedFunctionalExchanges xsi:type="org.polarsys.capella.core.data.fa:FunctionalExchange"
|
||||
id="549af3b2-0943-41a3-b0e3-57d0d99ec83f" name="Report incident" target="#f6af7ea3-196f-4c3f-8b52-75154362d1e0"
|
||||
source="#2e2d08d5-9c42-4e33-af81-222efa4c992c"/>
|
||||
</ownedOperationalActivities>
|
||||
</ownedFunctionPkg>
|
||||
<ownedAbstractCapabilityPkg xsi:type="org.polarsys.capella.core.data.oa:OperationalCapabilityPkg"
|
||||
id="fb6f8967-c853-4336-b35b-82c5b78c372c" name="Operational Capabilities">
|
||||
<ownedOperationalCapabilities xsi:type="org.polarsys.capella.core.data.oa:OperationalCapability"
|
||||
id="883098d9-9d02-4ce0-85aa-41c6219105d9" name="OperationalCapability 1">
|
||||
<ownedScenarios xsi:type="org.polarsys.capella.core.data.interaction:Scenario"
|
||||
id="6aa3cccb-9adc-4230-993d-7ee80c250509" name="[OAS] OperationalCapability 1"
|
||||
kind="INTERACTION">
|
||||
<ownedInstanceRoles xsi:type="org.polarsys.capella.core.data.interaction:InstanceRole"
|
||||
id="86b77dcf-5283-4bc0-8d6a-25936ad7e857" name="OperationalActivity 1"
|
||||
representedInstance="#2e2d08d5-9c42-4e33-af81-222efa4c992c"/>
|
||||
<ownedInstanceRoles xsi:type="org.polarsys.capella.core.data.interaction:InstanceRole"
|
||||
id="5ebf9054-720b-4c46-8ddb-d556548b12ab" name="OperationalActivity 2"
|
||||
representedInstance="#f6af7ea3-196f-4c3f-8b52-75154362d1e0"/>
|
||||
<ownedMessages xsi:type="org.polarsys.capella.core.data.interaction:SequenceMessage"
|
||||
id="78c1cdb8-4cce-40ed-ae6c-299e7bc937c6" name="Report incident" kind="ASYNCHRONOUS_CALL"
|
||||
sendingEnd="#365b653f-e8c6-4f0d-bbd0-51ceb7f4b392" receivingEnd="#ae01bc6a-4f12-45df-9cc0-88530d862dff"/>
|
||||
<ownedInteractionFragments xsi:type="org.polarsys.capella.core.data.interaction:MessageEnd"
|
||||
id="365b653f-e8c6-4f0d-bbd0-51ceb7f4b392" name="Send Call Message Call"
|
||||
coveredInstanceRoles="#86b77dcf-5283-4bc0-8d6a-25936ad7e857" event="#0b4cd564-e84f-4313-bf47-afa1803e634f"/>
|
||||
<ownedInteractionFragments xsi:type="org.polarsys.capella.core.data.interaction:MessageEnd"
|
||||
id="ae01bc6a-4f12-45df-9cc0-88530d862dff" name="Receive Call Message Call"
|
||||
coveredInstanceRoles="#5ebf9054-720b-4c46-8ddb-d556548b12ab" event="#00361425-0782-4351-8855-b3dc70f275e6"/>
|
||||
<ownedInteractionFragments xsi:type="org.polarsys.capella.core.data.interaction:ExecutionEnd"
|
||||
id="172ecc73-db4f-4299-8215-718e53f39824" name="endExec" coveredInstanceRoles="#5ebf9054-720b-4c46-8ddb-d556548b12ab"
|
||||
event="#16ad20e5-9721-462c-a110-80e67e78879e"/>
|
||||
<ownedTimeLapses xsi:type="org.polarsys.capella.core.data.interaction:Execution"
|
||||
id="4bbeb6bd-6bc8-455f-8d8b-3a8f387343ef" start="#ae01bc6a-4f12-45df-9cc0-88530d862dff"
|
||||
finish="#172ecc73-db4f-4299-8215-718e53f39824"/>
|
||||
<ownedEvents xsi:type="org.polarsys.capella.core.data.interaction:EventSentOperation"
|
||||
id="0b4cd564-e84f-4313-bf47-afa1803e634f" operation="#549af3b2-0943-41a3-b0e3-57d0d99ec83f"/>
|
||||
<ownedEvents xsi:type="org.polarsys.capella.core.data.interaction:EventReceiptOperation"
|
||||
id="00361425-0782-4351-8855-b3dc70f275e6" operation="#549af3b2-0943-41a3-b0e3-57d0d99ec83f"/>
|
||||
<ownedEvents xsi:type="org.polarsys.capella.core.data.interaction:ExecutionEvent"
|
||||
id="16ad20e5-9721-462c-a110-80e67e78879e"/>
|
||||
</ownedScenarios>
|
||||
<ownedAbstractFunctionAbstractCapabilityInvolvements xsi:type="org.polarsys.capella.core.data.interaction:AbstractFunctionAbstractCapabilityInvolvement"
|
||||
id="405b8dc5-cefe-4da7-9afe-9e5ba074681a" involved="#2e2d08d5-9c42-4e33-af81-222efa4c992c"/>
|
||||
<ownedAbstractFunctionAbstractCapabilityInvolvements xsi:type="org.polarsys.capella.core.data.interaction:AbstractFunctionAbstractCapabilityInvolvement"
|
||||
id="6e620637-9ee6-42b2-96ae-777de090f679" involved="#f6af7ea3-196f-4c3f-8b52-75154362d1e0"/>
|
||||
</ownedOperationalCapabilities>
|
||||
</ownedAbstractCapabilityPkg>
|
||||
<ownedInterfacePkg xsi:type="org.polarsys.capella.core.data.cs:InterfacePkg"
|
||||
id="cc185763-3fef-4d26-a482-237ab4d7d293" name="Interfaces"/>
|
||||
<ownedDataPkg xsi:type="org.polarsys.capella.core.data.information:DataPkg"
|
||||
id="fa555965-a2b6-45b6-a2f7-6522115bbd8d" name="Data"/>
|
||||
<ownedRolePkg xsi:type="org.polarsys.capella.core.data.oa:RolePkg" id="895e41df-8cec-4eb2-a5ae-86a5425db4bd"
|
||||
name="Roles"/>
|
||||
<ownedEntityPkg xsi:type="org.polarsys.capella.core.data.oa:EntityPkg" id="766c177f-e1f3-4891-aa86-a5d73b500ad2"
|
||||
name="Operational Entities"/>
|
||||
</ownedArchitectures>
|
||||
<ownedArchitectures xsi:type="org.polarsys.capella.core.data.ctx:SystemAnalysis"
|
||||
id="4cc8d915-4830-48f3-afe4-217934792e38" name="System Analysis">
|
||||
<ownedFunctionPkg xsi:type="org.polarsys.capella.core.data.ctx:SystemFunctionPkg"
|
||||
id="92108fcf-42c1-4366-9917-f28e2d2b04b2" name="System Functions">
|
||||
<ownedSystemFunctions xsi:type="org.polarsys.capella.core.data.ctx:SystemFunction"
|
||||
id="985173ac-059e-4cb8-957d-c546987995ab" name="Root System Function">
|
||||
<ownedFunctionRealizations xsi:type="org.polarsys.capella.core.data.fa:FunctionRealization"
|
||||
id="88ee9314-86f7-4e96-a027-cd1f7b7bff77" targetElement="#ede29e45-fa93-490b-b5eb-27f2ee692bfd"
|
||||
sourceElement="#985173ac-059e-4cb8-957d-c546987995ab"/>
|
||||
</ownedSystemFunctions>
|
||||
</ownedFunctionPkg>
|
||||
<ownedAbstractCapabilityPkg xsi:type="org.polarsys.capella.core.data.ctx:CapabilityPkg"
|
||||
id="1bb5124b-42dc-4988-ae28-d6259137cfad" name="Capabilities"/>
|
||||
<ownedInterfacePkg xsi:type="org.polarsys.capella.core.data.cs:InterfacePkg"
|
||||
id="cdf1bdc0-6a49-4006-8488-b6366f155add" name="Interfaces"/>
|
||||
<ownedDataPkg xsi:type="org.polarsys.capella.core.data.information:DataPkg"
|
||||
id="853089ca-1be1-4cb9-afc4-bd2f4233bc36" name="Data">
|
||||
<ownedDataPkgs xsi:type="org.polarsys.capella.core.data.information:DataPkg"
|
||||
id="2025d8a5-46e2-4735-99f3-d1d247561a8b" name="Predefined Types">
|
||||
<ownedDataTypes xsi:type="org.polarsys.capella.core.data.information.datatype:BooleanType"
|
||||
id="8f26e095-bb06-4b24-983b-1da94255ab3b" name="Boolean" visibility="PUBLIC">
|
||||
<ownedLiterals xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralBooleanValue"
|
||||
id="1ff8e3ca-5929-4bea-acea-10d72a22e7a9" name="True" abstractType="#8f26e095-bb06-4b24-983b-1da94255ab3b"
|
||||
value="true"/>
|
||||
<ownedLiterals xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralBooleanValue"
|
||||
id="07a94c57-4004-4a97-9d97-04abbd532fa4" name="False" abstractType="#8f26e095-bb06-4b24-983b-1da94255ab3b"/>
|
||||
</ownedDataTypes>
|
||||
<ownedDataTypes xsi:type="org.polarsys.capella.core.data.information.datatype:NumericType"
|
||||
id="7d9bea93-735c-4e1b-8145-1f77c6c431b6" name="Byte" visibility="PUBLIC">
|
||||
<ownedMinValue xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"
|
||||
id="1c4b1ea1-e589-46db-adc2-f524b683ee2a" name="" abstractType="#7d9bea93-735c-4e1b-8145-1f77c6c431b6"
|
||||
value="0"/>
|
||||
<ownedMaxValue xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"
|
||||
id="cdc4481e-27f5-409b-899e-026097e1c5ff" name="" abstractType="#7d9bea93-735c-4e1b-8145-1f77c6c431b6"
|
||||
value="255"/>
|
||||
</ownedDataTypes>
|
||||
<ownedDataTypes xsi:type="org.polarsys.capella.core.data.information.datatype:StringType"
|
||||
id="6ba5ef8b-900e-481f-be03-214c0377a5e1" name="Char" visibility="PUBLIC">
|
||||
<ownedMinLength xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"
|
||||
id="6adaf5f4-3dbe-4d6c-8db0-f43b88ac7a67" name="" abstractType="#dc2d02f3-37aa-4f19-901e-9ab20076772f"
|
||||
value="1"/>
|
||||
<ownedMaxLength xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"
|
||||
id="39e9e7c8-019b-45cb-b570-2cfce432d159" name="" abstractType="#dc2d02f3-37aa-4f19-901e-9ab20076772f"
|
||||
value="1"/>
|
||||
</ownedDataTypes>
|
||||
<ownedDataTypes xsi:type="org.polarsys.capella.core.data.information.datatype:NumericType"
|
||||
id="08a79fe4-c4c2-4f3b-b5ef-2ee147318510" name="Double" discrete="false"
|
||||
visibility="PUBLIC" kind="FLOAT"/>
|
||||
<ownedDataTypes xsi:type="org.polarsys.capella.core.data.information.datatype:NumericType"
|
||||
id="543264ff-da7a-469e-920f-8d0584a30459" name="Float" discrete="false"
|
||||
visibility="PUBLIC" kind="FLOAT"/>
|
||||
<ownedDataTypes xsi:type="org.polarsys.capella.core.data.information.datatype:NumericType"
|
||||
id="bbdd469d-9c57-443f-aa9c-9baf135dd156" name="Hexadecimal" visibility="PUBLIC">
|
||||
<ownedMinValue xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"
|
||||
id="dde5c274-d9f3-4a57-9abe-021b5f00d75d" name="" abstractType="#bbdd469d-9c57-443f-aa9c-9baf135dd156"
|
||||
value="0"/>
|
||||
<ownedMaxValue xsi:type="org.polarsys.capella.core.data.information.datavalue:BinaryExpression"
|
||||
id="503f03ce-f4be-4d38-a5f5-d1aebaf7c669" abstractType="#bbdd469d-9c57-443f-aa9c-9baf135dd156"
|
||||
operator="SUB">
|
||||
<ownedLeftOperand xsi:type="org.polarsys.capella.core.data.information.datavalue:BinaryExpression"
|
||||
id="502c050e-dbde-40b3-94ba-8c786a5a4cb7" operator="POW">
|
||||
<ownedLeftOperand xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"
|
||||
id="dea69498-e49d-4e7c-9467-3962a3946814" value="2"/>
|
||||
<ownedRightOperand xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"
|
||||
id="c5aa9fd0-a2e7-4f4f-8043-b6a2b6b7b5d3" value="64"/>
|
||||
</ownedLeftOperand>
|
||||
<ownedRightOperand xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"
|
||||
id="43b57a64-afed-448a-bbc6-d9202d2c8aa6" value="1"/>
|
||||
</ownedMaxValue>
|
||||
</ownedDataTypes>
|
||||
<ownedDataTypes xsi:type="org.polarsys.capella.core.data.information.datatype:NumericType"
|
||||
id="75b39451-e2b5-4c51-804c-9673071b8591" name="Integer" visibility="PUBLIC"/>
|
||||
<ownedDataTypes xsi:type="org.polarsys.capella.core.data.information.datatype:NumericType"
|
||||
id="ab4bd3d7-6076-4fe6-96ed-0c7bd6e19ebf" name="Long" visibility="PUBLIC"/>
|
||||
<ownedDataTypes xsi:type="org.polarsys.capella.core.data.information.datatype:NumericType"
|
||||
id="391675ca-a8a4-4bae-81e0-2c5d55770bc0" name="LongLong" visibility="PUBLIC"/>
|
||||
<ownedDataTypes xsi:type="org.polarsys.capella.core.data.information.datatype:NumericType"
|
||||
id="ed08d80d-71e7-4818-96c4-5e0062a0fbc5" name="Short" visibility="PUBLIC"/>
|
||||
<ownedDataTypes xsi:type="org.polarsys.capella.core.data.information.datatype:StringType"
|
||||
id="f2ba99f3-aa24-415b-82dd-56b6aec41070" name="String" visibility="PUBLIC"/>
|
||||
<ownedDataTypes xsi:type="org.polarsys.capella.core.data.information.datatype:NumericType"
|
||||
id="4e0589b8-0400-470b-adee-6d79022bdaec" name="UnsignedInteger" maxInclusive="false"
|
||||
visibility="PUBLIC">
|
||||
<ownedMinValue xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"
|
||||
id="3a574e71-959d-4ed5-8697-dd51a8c85859" name="" abstractType="#4e0589b8-0400-470b-adee-6d79022bdaec"
|
||||
value="0"/>
|
||||
</ownedDataTypes>
|
||||
<ownedDataTypes xsi:type="org.polarsys.capella.core.data.information.datatype:NumericType"
|
||||
id="dc2d02f3-37aa-4f19-901e-9ab20076772f" name="UnsignedShort" maxInclusive="false"
|
||||
visibility="PUBLIC">
|
||||
<ownedMinValue xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"
|
||||
id="c89fe27e-4cec-4fbc-82b4-0ce6f6fa6270" name="" abstractType="#dc2d02f3-37aa-4f19-901e-9ab20076772f"
|
||||
value="0"/>
|
||||
</ownedDataTypes>
|
||||
<ownedDataTypes xsi:type="org.polarsys.capella.core.data.information.datatype:NumericType"
|
||||
id="951feec2-545b-4dc1-aa52-7341189b7fa9" name="UnsignedLong" maxInclusive="false"
|
||||
visibility="PUBLIC">
|
||||
<ownedMinValue xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"
|
||||
id="73a0e0ba-a8be-4aac-a0b9-8cfecd35edcb" name="" abstractType="#951feec2-545b-4dc1-aa52-7341189b7fa9"
|
||||
value="0"/>
|
||||
</ownedDataTypes>
|
||||
<ownedDataTypes xsi:type="org.polarsys.capella.core.data.information.datatype:NumericType"
|
||||
id="3acaf46c-cf7f-4350-ae0c-ab938ec82e19" name="UnsignedLongLong" maxInclusive="false"
|
||||
visibility="PUBLIC">
|
||||
<ownedMinValue xsi:type="org.polarsys.capella.core.data.information.datavalue:LiteralNumericValue"
|
||||
id="4d1f3c91-38bb-4709-9f3a-f47a3f17d59f" name="" abstractType="#3acaf46c-cf7f-4350-ae0c-ab938ec82e19"
|
||||
value="0"/>
|
||||
</ownedDataTypes>
|
||||
</ownedDataPkgs>
|
||||
</ownedDataPkg>
|
||||
<ownedSystemComponentPkg xsi:type="org.polarsys.capella.core.data.ctx:SystemComponentPkg"
|
||||
id="3ea1987b-f8c5-4c59-b2bd-cdf19c831006" name="Structure">
|
||||
<ownedParts xsi:type="org.polarsys.capella.core.data.cs:Part" id="eb3a7738-b4c2-4257-beff-935941de3301"
|
||||
name="System" abstractType="#7b1c3c2b-e539-43fd-a843-f85207c898c3"/>
|
||||
<ownedSystemComponents xsi:type="org.polarsys.capella.core.data.ctx:SystemComponent"
|
||||
id="7b1c3c2b-e539-43fd-a843-f85207c898c3" name="System">
|
||||
<ownedStateMachines xsi:type="org.polarsys.capella.core.data.capellacommon:StateMachine"
|
||||
id="08986259-eb05-4a6b-86a3-f07848436b58" name="System State Machine">
|
||||
<ownedRegions xsi:type="org.polarsys.capella.core.data.capellacommon:Region"
|
||||
id="b92a987d-a3a4-4703-9696-772ac1d5a0c8" name="Default Region"/>
|
||||
</ownedStateMachines>
|
||||
</ownedSystemComponents>
|
||||
</ownedSystemComponentPkg>
|
||||
<ownedMissionPkg xsi:type="org.polarsys.capella.core.data.ctx:MissionPkg" id="82ef3879-b6e6-47ca-81f0-deb0510403f3"
|
||||
name="Missions"/>
|
||||
<ownedOperationalAnalysisRealizations xsi:type="org.polarsys.capella.core.data.ctx:OperationalAnalysisRealization"
|
||||
id="5ba73e27-b90a-424b-a3a6-9e1979207512" targetElement="#bfcd2964-812e-4106-8ca0-6fa2c2688c91"
|
||||
sourceElement="#4cc8d915-4830-48f3-afe4-217934792e38"/>
|
||||
</ownedArchitectures>
|
||||
<ownedArchitectures xsi:type="org.polarsys.capella.core.data.la:LogicalArchitecture"
|
||||
id="0513bf71-0242-443b-81c2-09139f99b2f5" name="Logical Architecture">
|
||||
<ownedFunctionPkg xsi:type="org.polarsys.capella.core.data.la:LogicalFunctionPkg"
|
||||
id="37467730-4fab-4bbc-ba5f-525db27bbfbe" name="Logical Functions">
|
||||
<ownedLogicalFunctions xsi:type="org.polarsys.capella.core.data.la:LogicalFunction"
|
||||
id="0c56a530-9859-47ee-b73e-fb0b879ffc7b" name="Root Logical Function">
|
||||
<ownedFunctionRealizations xsi:type="org.polarsys.capella.core.data.fa:FunctionRealization"
|
||||
id="ac365b57-7ed4-4330-aada-78ddb4c5c4db" targetElement="#985173ac-059e-4cb8-957d-c546987995ab"
|
||||
sourceElement="#0c56a530-9859-47ee-b73e-fb0b879ffc7b"/>
|
||||
</ownedLogicalFunctions>
|
||||
</ownedFunctionPkg>
|
||||
<ownedAbstractCapabilityPkg xsi:type="org.polarsys.capella.core.data.la:CapabilityRealizationPkg"
|
||||
id="f3311586-12e1-46c8-800a-d6a767e51a66" name="Capabilities"/>
|
||||
<ownedInterfacePkg xsi:type="org.polarsys.capella.core.data.cs:InterfacePkg"
|
||||
id="12c4c0a7-c787-426d-85cb-828ce9b2c929" name="Interfaces"/>
|
||||
<ownedDataPkg xsi:type="org.polarsys.capella.core.data.information:DataPkg"
|
||||
id="ddd4b687-fa54-486a-a996-a2580c16bdf0" name="Data"/>
|
||||
<ownedLogicalComponentPkg xsi:type="org.polarsys.capella.core.data.la:LogicalComponentPkg"
|
||||
id="2efdb257-6803-42c9-b295-e8de811a4c3b" name="Structure">
|
||||
<ownedParts xsi:type="org.polarsys.capella.core.data.cs:Part" id="6fae67f3-8948-42bf-82b3-f64c66c4b678"
|
||||
name="Logical System" abstractType="#5698d778-e688-4558-ab44-28c6ff4160e5"/>
|
||||
<ownedLogicalComponents xsi:type="org.polarsys.capella.core.data.la:LogicalComponent"
|
||||
id="5698d778-e688-4558-ab44-28c6ff4160e5" name="Logical System">
|
||||
<ownedComponentRealizations xsi:type="org.polarsys.capella.core.data.cs:ComponentRealization"
|
||||
id="d860709b-985b-43a4-a94a-fcbd3818f63b" targetElement="#7b1c3c2b-e539-43fd-a843-f85207c898c3"
|
||||
sourceElement="#5698d778-e688-4558-ab44-28c6ff4160e5"/>
|
||||
</ownedLogicalComponents>
|
||||
</ownedLogicalComponentPkg>
|
||||
<ownedSystemAnalysisRealizations xsi:type="org.polarsys.capella.core.data.la:SystemAnalysisRealization"
|
||||
id="32116e47-111c-473f-9ad7-c2220fb3a966" targetElement="#4cc8d915-4830-48f3-afe4-217934792e38"
|
||||
sourceElement="#0513bf71-0242-443b-81c2-09139f99b2f5"/>
|
||||
</ownedArchitectures>
|
||||
<ownedArchitectures xsi:type="org.polarsys.capella.core.data.pa:PhysicalArchitecture"
|
||||
id="e0888733-c04b-4628-af93-bf08dd37eefd" name="Physical Architecture">
|
||||
<ownedFunctionPkg xsi:type="org.polarsys.capella.core.data.pa:PhysicalFunctionPkg"
|
||||
id="ecff6686-819d-41a5-b73a-52ee0e374078" name="Physical Functions">
|
||||
<ownedPhysicalFunctions xsi:type="org.polarsys.capella.core.data.pa:PhysicalFunction"
|
||||
id="bf38e330-6042-4d71-a5e6-b0827a02b8ab" name="Root Physical Function">
|
||||
<ownedFunctionRealizations xsi:type="org.polarsys.capella.core.data.fa:FunctionRealization"
|
||||
id="3c789844-d978-48b8-ba24-6fd31d6b9833" targetElement="#0c56a530-9859-47ee-b73e-fb0b879ffc7b"
|
||||
sourceElement="#bf38e330-6042-4d71-a5e6-b0827a02b8ab"/>
|
||||
</ownedPhysicalFunctions>
|
||||
</ownedFunctionPkg>
|
||||
<ownedAbstractCapabilityPkg xsi:type="org.polarsys.capella.core.data.la:CapabilityRealizationPkg"
|
||||
id="891d2f98-ce0a-4e31-8b89-b02a3343425c" name="Capabilities"/>
|
||||
<ownedInterfacePkg xsi:type="org.polarsys.capella.core.data.cs:InterfacePkg"
|
||||
id="4d94f1dd-6c9c-4722-b05f-c33f1de04c5f" name="Interfaces"/>
|
||||
<ownedDataPkg xsi:type="org.polarsys.capella.core.data.information:DataPkg"
|
||||
id="b12698b9-ec55-4ed9-93d8-d5d5a0194424" name="Data"/>
|
||||
<ownedPhysicalComponentPkg xsi:type="org.polarsys.capella.core.data.pa:PhysicalComponentPkg"
|
||||
id="9fb8391a-4ef2-4edd-b07d-ff4895334b10" name="Structure">
|
||||
<ownedParts xsi:type="org.polarsys.capella.core.data.cs:Part" id="b119f8ae-25d2-4b62-b894-5bd6e53e6f88"
|
||||
name="Physical System" abstractType="#743aab95-dcb8-4d15-8a1d-0155462fd64f"/>
|
||||
<ownedPhysicalComponents xsi:type="org.polarsys.capella.core.data.pa:PhysicalComponent"
|
||||
id="743aab95-dcb8-4d15-8a1d-0155462fd64f" name="Physical System">
|
||||
<ownedComponentRealizations xsi:type="org.polarsys.capella.core.data.cs:ComponentRealization"
|
||||
id="b0d84c42-b863-47d5-bec5-2d29d92fbf6e" targetElement="#5698d778-e688-4558-ab44-28c6ff4160e5"
|
||||
sourceElement="#743aab95-dcb8-4d15-8a1d-0155462fd64f"/>
|
||||
</ownedPhysicalComponents>
|
||||
</ownedPhysicalComponentPkg>
|
||||
<ownedLogicalArchitectureRealizations xsi:type="org.polarsys.capella.core.data.pa:LogicalArchitectureRealization"
|
||||
id="747e4f0c-1393-49bf-9ecb-cef071edf644" targetElement="#0513bf71-0242-443b-81c2-09139f99b2f5"
|
||||
sourceElement="#e0888733-c04b-4628-af93-bf08dd37eefd"/>
|
||||
</ownedArchitectures>
|
||||
<ownedArchitectures xsi:type="org.polarsys.capella.core.data.epbs:EPBSArchitecture"
|
||||
id="21ab5363-b975-47a0-ab6d-4c7bfc8b39ae" name="EPBS Architecture">
|
||||
<ownedAbstractCapabilityPkg xsi:type="org.polarsys.capella.core.data.la:CapabilityRealizationPkg"
|
||||
id="1fbbfc46-2340-44f5-b169-d83c43384bfc" name="Capabilities"/>
|
||||
<ownedConfigurationItemPkg xsi:type="org.polarsys.capella.core.data.epbs:ConfigurationItemPkg"
|
||||
id="407e72d1-c0ea-4593-91b7-ebac809e1458" name="Structure">
|
||||
<ownedParts xsi:type="org.polarsys.capella.core.data.cs:Part" id="78a2aac3-3d27-4b38-b975-54afb1c564a3"
|
||||
name="System" abstractType="#779f4a3f-6056-4a49-9e46-58da3793925e"/>
|
||||
<ownedConfigurationItems xsi:type="org.polarsys.capella.core.data.epbs:ConfigurationItem"
|
||||
id="779f4a3f-6056-4a49-9e46-58da3793925e" name="System" kind="SystemCI">
|
||||
<ownedPhysicalArtifactRealizations xsi:type="org.polarsys.capella.core.data.epbs:PhysicalArtifactRealization"
|
||||
id="cb95c6c0-dce8-4c12-bfe1-bf14d84d2796" targetElement="#743aab95-dcb8-4d15-8a1d-0155462fd64f"
|
||||
sourceElement="#779f4a3f-6056-4a49-9e46-58da3793925e"/>
|
||||
</ownedConfigurationItems>
|
||||
</ownedConfigurationItemPkg>
|
||||
<ownedPhysicalArchitectureRealizations xsi:type="org.polarsys.capella.core.data.epbs:PhysicalArchitectureRealization"
|
||||
id="2e60c3b5-085e-4ea9-8aa6-23f8857886ef" targetElement="#e0888733-c04b-4628-af93-bf08dd37eefd"
|
||||
sourceElement="#21ab5363-b975-47a0-ab6d-4c7bfc8b39ae"/>
|
||||
</ownedArchitectures>
|
||||
</ownedModelRoots>
|
||||
</org.polarsys.capella.core.data.capellamodeller:Project>
|
||||
@@ -0,0 +1,2 @@
|
||||
# Preserve historical evidence bytes, including CRLF and original log whitespace.
|
||||
* -text -whitespace
|
||||
@@ -0,0 +1,93 @@
|
||||
# Connection attachments: Windows evidence and handoff
|
||||
|
||||
This evidence-only directory accompanies source commit
|
||||
`53d01a3d4451b94792986f2dfac56f6f04e111a4` on
|
||||
`codex/edge-anchors-escape-ytr83r-20260923`. It preserves the original attachment
|
||||
implementation checks and the subsequent State Escape correction. It is not an
|
||||
integrated release or a runnable package. Live ownership remains in
|
||||
[issue 33](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/issues/33)
|
||||
and [integration issue 27](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/issues/27).
|
||||
|
||||
## Results by source version
|
||||
|
||||
| Source | Automated checks | Native Windows evidence |
|
||||
| --- | --- | --- |
|
||||
| `3aa80de89c5b79200286926781e8f3a192bc61f4` | Workspace: 1,819 passed, 0 failed, 7 ignored; strict workspace all-target Clippy; GUI, CLI and evaluator builds | Three closed runs, 48 captures, 29 completed full-Project comparisons: 25 pass and four pixel-offset mismatches retained as failures. OA/State attachment editing, per-end reset, history, independent views, symbol contours, semantic-port movement and valid reconnect/undo. Immediate post-menu State Escape failed. |
|
||||
| `53d01a3d4451b94792986f2dfac56f6f04e111a4` | Two mounted UI regression tests; desktop: 1,194 passed, 0 failed, 6 ignored; strict desktop all-target Clippy and GUI build | Two closed runs, 12 captures, five exact full-Project comparisons. Source and target menu actions cancel with immediate Escape. One source-end attachment edit, Undo, Redo and fresh-process reopen/save pass. |
|
||||
|
||||
The corrected GUI uses the original evaluator at `3aa80de`; committed core and
|
||||
Cargo inputs are unchanged. Both corrected processes and all three original
|
||||
processes closed normally with exit 0 and empty GUI logs. Reused build caches
|
||||
mean these are not clean-build claims. Linux remains paused by the user.
|
||||
|
||||
The tested host used Rust 1.98.1, target `x86_64-pc-windows-gnullvm`, LLVM 22.1.8
|
||||
and LLVM-MinGW runtime. Exact commands and environment are retained in gate
|
||||
receipts. Principal checks were `cargo test --workspace --locked --offline` and
|
||||
`cargo clippy --workspace --all-targets --locked --offline -- -D warnings` at
|
||||
3aa80de; the corrected desktop equivalents use `-p oa-desktop` instead of
|
||||
`--workspace`. Build with `cargo build -p oa-desktop --locked` in the source
|
||||
checkout using its documented toolchain. A new host may first need to fetch
|
||||
dependencies before using `--offline`. Use a fresh target directory for a new
|
||||
candidate; do not rely on the restored shared executable's Cargo freshness.
|
||||
|
||||
- [Original archive and explicit failed attempts](original/README.md).
|
||||
- [Corrected Escape archive and independent native reviews](corrected/README.md).
|
||||
- [Exact import sequence and integration seams](integration-review.md).
|
||||
- [Decision and verification interpretation](../../edge-attachments-native-20260923.md).
|
||||
|
||||
The inner READMEs retain their preparation-time wording. This outer directory
|
||||
provides the peer handoff; the containing Git commit is its publication identity.
|
||||
Original receipts, paths, failed expectations and historical pending statements
|
||||
were preserved rather than rewritten after subsequent success.
|
||||
|
||||
## Portable verification
|
||||
|
||||
Fetch the source branch into a local clone so its `79cc9d5`, `3aa80de` and
|
||||
`53d01a3` commits are available. From this directory run:
|
||||
|
||||
```text
|
||||
python original/verify-build.py verify --archive original --repo /path/to/ARCADIA-Studio
|
||||
python corrected/verify-build.py verify --archive corrected --repo /path/to/ARCADIA-Studio --related-archive original
|
||||
```
|
||||
|
||||
The verifiers map historical machine paths to archive bytes or source Git blobs;
|
||||
peers do not need the originating `.local` tree. Exact raw source overrides
|
||||
preserve captured CRLF bytes where needed. Archive `.gitattributes` prevents
|
||||
text conversion. Original manifest SHA-256:
|
||||
`2379fb100e529772ea6149554fee71aca80ab956539e97aa4d288b189ff55131`.
|
||||
Corrected manifest SHA-256:
|
||||
`bee4ff55e8d4e1044785deca3f0382f7776dfa5c0e629b21457b9408eb7f51b2`.
|
||||
|
||||
GUI/evaluator/runtime binaries, private profiles and mutable working directories
|
||||
are excluded. Their historical identities remain in receipts, but the portable
|
||||
verifier does not rehash absent executables or rerun the application. Immutable
|
||||
saved-source checkpoints, expected complete Projects, actual evaluated Projects,
|
||||
commands, logs, capture metadata and original images are included.
|
||||
|
||||
## Limitations that accompany these results
|
||||
|
||||
The original shared target executable was temporarily overwritten by the
|
||||
corrected build. One preflight correctly aborted before comparison. The original
|
||||
staged application stayed unchanged; the corrected artifact was preserved, the
|
||||
original target restored, and a fresh comparison passed. Later equality is not
|
||||
continuous whole-run immutability. The corrected stage avoids shared-target
|
||||
bindings and records the relocation explicitly.
|
||||
|
||||
The original reconnect-to-Choice expectation was invalid because Choice already
|
||||
had an incoming transition. The application correctly refused it. A separately
|
||||
predeclared valid reconnect-to-Final and Undo passed; the invalid expectation and
|
||||
validation error remain archived. Four midpoint attempts missed the exact
|
||||
declared offset; subsequent pointer/zoom alignment passed without changing the
|
||||
oracle. These are not silently counted as successful attempts.
|
||||
|
||||
Corrected cancellation has clean visual evidence after each end and one combined
|
||||
baseline comparison after both, rather than independently saved per-end
|
||||
checkpoints. Run 1's close-action timestamp records retrospective attestation,
|
||||
not the exact key event. Screenshots show states; the operator's action records
|
||||
supply sequence and cause. Complete native drags do not establish every held
|
||||
pointer/keyboard/wheel interaction. Dense small labels and truncated guidance
|
||||
remain visible limitations. Automated event tests supplement the native scope.
|
||||
|
||||
Process and Scenario use different notations and do not consume this ordinary
|
||||
route contract. Their arbitrary attachment editing, State bend issue 23,
|
||||
auto-arrangement, resize issue 16 and the combined release are not claimed done.
|
||||
@@ -0,0 +1 @@
|
||||
* -text
|
||||
@@ -0,0 +1,27 @@
|
||||
# Corrected State attachment Escape evidence
|
||||
|
||||
This staged archive covers GUI commit **53d01a3d4451b94792986f2dfac56f6f04e111a4**, packaged GUI SHA256 `9c7aa0249378cec31639bbbff5ea7b3eaab782333d1637b8ab5e8f3be5d65d2c`. It is a bounded correction of the original immediate post-menu State attachment Escape failure. The complete saved-Project evaluator remains pinned separately to **3aa80de89c5b79200286926781e8f3a192bc61f4**; unchanged committed core/Cargo inputs support that reuse.
|
||||
|
||||
## Evidence and limits
|
||||
|
||||
`gates/` preserves targeted, desktop, strict clippy, build and toolchain receipts/logs and the source input manifests. Historical receipts describe the then-uncommitted changes over 3aa80de; they were not rewritten after committing. Commit-readback ties the tested raw bytes to 53d01a3. `failed-stage-01/` preserves the prior unsuccessful staging contents. `native/provenance/` discloses artifact relocation and evaluator reuse. The corrected stage binds its preserved/package artifact, never the mutable shared target.
|
||||
|
||||
Corrected Run1 has nine captures and four exact complete Project checkpoints: **B, A1, B, A1**. The two arm→Escape visual sequences support return to Select/move for source and target without a canvas click, as recorded by the operator. The B checkpoint occurs **after both cancellation attempts together**, not once after each; individual tool-state claims depend on the native observations and captures, not separate saved-model checks. A1 differs from B only in State view200, relation41 source_attachment Right/.5→Top/.25; opposite end, waypoint, label, semantics and other views remain exact. Subsequent Undo and Redo produce B and A1.
|
||||
|
||||
Corrected Run2 has three captures and one exact A1 checkpoint after reopening and saving. Its distinct process is chained to Run1's close. Both normal-close receipts report exit0 and empty GUI logs. Run1 close-action `utc` is a **retrospective recording time**, not the exact input time; Run2 names its metadata timestamp `recorded_utc`. Observer process-exit times remain separate. All 12 original captures are retained, along with four independent reviews.
|
||||
|
||||
This evidence does not establish continuous held-motion preview, arbitrary held keyboard/wheel cancellation, full accessibility or every attachment scenario. The native tool supplied complete drags. Guidance is truncated and small labels can remain dense at Fit. The original archive retains the original Escape defect, midpoint failures and shared-target interruption; this corrected trial does not erase that history or imply continuous historical immutability.
|
||||
|
||||
## Portable verification
|
||||
|
||||
Keep the separately prepared **original-stage-01** archive, unchanged, as a prerequisite. Its archive manifest SHA256 is `2379fb100e529772ea6149554fee71aca80ab956539e97aa4d288b189ff55131`. Fetch the source commits, then run:
|
||||
|
||||
```text
|
||||
python verify-build.py verify --archive . --repo /path/to/repository --related-archive /path/to/original-stage-01
|
||||
```
|
||||
|
||||
`archive-manifest.json` maps **132 raw originals** to archive paths and hashes. Original receipt paths/content are unchanged. `source-map.json` maps all **2,750 corrected captured source records directly to exact Git blobs at 53d01a3**, with no raw overrides needed. The verifier also rechecks the prerequisite archive's originals/source records to resolve reused evaluator/gate provenance without duplicating the full source or original archive. `.gitattributes` prevents text conversion.
|
||||
|
||||
`verification.json` records successful verification: all originals/source records match; **30,392 of 30,422** receipt references resolve to available exact bytes. The remaining 30 references are only eight intentionally excluded GUI/evaluator/runtime binary paths. No nonbinary reference remains unresolved. Their declared binary hashes remain preserved; absent executables are not falsely described as rehashed by the portable verifier.
|
||||
|
||||
Binaries, private profiles, mutable working directories and unrelated working directories are excluded; immutable saved checkpoints remain. No publication, commit or push is performed by this archive preparation. Native claims and limitations are assessed in `reviews/`; reproduce across separate peer machines using the commit identities, maps and receipts, not the original absolute paths.
|
||||
@@ -0,0 +1,806 @@
|
||||
{
|
||||
"original_receipts_unchanged": true,
|
||||
"files": [
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-gates-20260923\\build-01\\changes.patch",
|
||||
"archive": "gates/build-01/changes.patch",
|
||||
"bytes": 2929,
|
||||
"sha256": "850c245a488f478649790dbce88976a74f7bedf792eae0b3f429263243fb150c"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-gates-20260923\\build-01\\context.json",
|
||||
"archive": "gates/build-01/context.json",
|
||||
"bytes": 1468,
|
||||
"sha256": "399f2ab171f9e2463cf6bd6ec196996416a25043f359785b08a9247a47ff0119"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-gates-20260923\\build-01\\inputs-after.json",
|
||||
"archive": "gates/build-01/inputs-after.json",
|
||||
"bytes": 826699,
|
||||
"sha256": "e00c499308c9c61522abb61fe37dc391a17e87592e6e1c0b93cf1a55fcfc712e"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-gates-20260923\\build-01\\inputs-before.json",
|
||||
"archive": "gates/build-01/inputs-before.json",
|
||||
"bytes": 826699,
|
||||
"sha256": "e00c499308c9c61522abb61fe37dc391a17e87592e6e1c0b93cf1a55fcfc712e"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-gates-20260923\\build-01\\output.log",
|
||||
"archive": "gates/build-01/output.log",
|
||||
"bytes": 481,
|
||||
"sha256": "af54f449edd35c87353ae13010cdff371f88d9542e883dcb193be21b701482fb"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-gates-20260923\\build-01\\result.json",
|
||||
"archive": "gates/build-01/result.json",
|
||||
"bytes": 1820,
|
||||
"sha256": "bbef89cc4574a70b3cf88f94739b5919079587ef197cdd870365134bf1d2f560"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-gates-20260923\\clippy-01\\changes.patch",
|
||||
"archive": "gates/clippy-01/changes.patch",
|
||||
"bytes": 2929,
|
||||
"sha256": "850c245a488f478649790dbce88976a74f7bedf792eae0b3f429263243fb150c"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-gates-20260923\\clippy-01\\context.json",
|
||||
"archive": "gates/clippy-01/context.json",
|
||||
"bytes": 1493,
|
||||
"sha256": "17cd3c4a30a7b1b922d7fc598f3e92355af45afef8840fcc947624d778f083ee"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-gates-20260923\\clippy-01\\inputs-after.json",
|
||||
"archive": "gates/clippy-01/inputs-after.json",
|
||||
"bytes": 826699,
|
||||
"sha256": "e00c499308c9c61522abb61fe37dc391a17e87592e6e1c0b93cf1a55fcfc712e"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-gates-20260923\\clippy-01\\inputs-before.json",
|
||||
"archive": "gates/clippy-01/inputs-before.json",
|
||||
"bytes": 826699,
|
||||
"sha256": "e00c499308c9c61522abb61fe37dc391a17e87592e6e1c0b93cf1a55fcfc712e"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-gates-20260923\\clippy-01\\output.log",
|
||||
"archive": "gates/clippy-01/output.log",
|
||||
"bytes": 609,
|
||||
"sha256": "aa4982b41f961b4ae14ce18e81e8d768650132806989e5b0ab6deead887ac918"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-gates-20260923\\clippy-01\\result.json",
|
||||
"archive": "gates/clippy-01/result.json",
|
||||
"bytes": 1846,
|
||||
"sha256": "2e1dc0d728ead0752cc37e5edbed52630510fa525a91f3f5adc3e361508aeef7"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-gates-20260923\\commit-readback.json",
|
||||
"archive": "gates/commit-readback.json",
|
||||
"bytes": 1913,
|
||||
"sha256": "90a07e2b43a84e7c02f4edc841ad03785c793d25ac3fc5eb6fc06f17b58ae72f"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-gates-20260923\\desktop-01\\changes.patch",
|
||||
"archive": "gates/desktop-01/changes.patch",
|
||||
"bytes": 2929,
|
||||
"sha256": "850c245a488f478649790dbce88976a74f7bedf792eae0b3f429263243fb150c"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-gates-20260923\\desktop-01\\context.json",
|
||||
"archive": "gates/desktop-01/context.json",
|
||||
"bytes": 1430,
|
||||
"sha256": "158cc0d61323d794848923066820dbd149a5d98b7281016270c1cc08d0cc8230"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-gates-20260923\\desktop-01\\inputs-after.json",
|
||||
"archive": "gates/desktop-01/inputs-after.json",
|
||||
"bytes": 826699,
|
||||
"sha256": "e00c499308c9c61522abb61fe37dc391a17e87592e6e1c0b93cf1a55fcfc712e"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-gates-20260923\\desktop-01\\inputs-before.json",
|
||||
"archive": "gates/desktop-01/inputs-before.json",
|
||||
"bytes": 826699,
|
||||
"sha256": "e00c499308c9c61522abb61fe37dc391a17e87592e6e1c0b93cf1a55fcfc712e"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-gates-20260923\\desktop-01\\output.log",
|
||||
"archive": "gates/desktop-01/output.log",
|
||||
"bytes": 138072,
|
||||
"sha256": "a8835aabb338957b9ebe6815bc70ecd6f0c9f23b2cdd45ab861d9be544ec7a5d"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-gates-20260923\\desktop-01\\result.json",
|
||||
"archive": "gates/desktop-01/result.json",
|
||||
"bytes": 1787,
|
||||
"sha256": "a99c385122e8eb4b9786a01a4de1880e231967ea6ea5e431c003e3ae940bf14d"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-gates-20260923\\run.py",
|
||||
"archive": "gates/run.py",
|
||||
"bytes": 1881,
|
||||
"sha256": "99e0db19e19c9d0ae0c93b3f040872f6a4133e79034030fa294c1d29f0970e88"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-gates-20260923\\summary.json",
|
||||
"archive": "gates/summary.json",
|
||||
"bytes": 3883,
|
||||
"sha256": "2534fb8056897a07d5d4754db6328f5a1e7daafdc61286ea40d234019969db53"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-gates-20260923\\targeted-01\\changes.patch",
|
||||
"archive": "gates/targeted-01/changes.patch",
|
||||
"bytes": 2929,
|
||||
"sha256": "850c245a488f478649790dbce88976a74f7bedf792eae0b3f429263243fb150c"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-gates-20260923\\targeted-01\\context.json",
|
||||
"archive": "gates/targeted-01/context.json",
|
||||
"bytes": 1487,
|
||||
"sha256": "691078da2dedff6eee5af21c2977fb2dda122d8695136c0d660670b1f6b6e186"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-gates-20260923\\targeted-01\\inputs-after.json",
|
||||
"archive": "gates/targeted-01/inputs-after.json",
|
||||
"bytes": 826699,
|
||||
"sha256": "e00c499308c9c61522abb61fe37dc391a17e87592e6e1c0b93cf1a55fcfc712e"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-gates-20260923\\targeted-01\\inputs-before.json",
|
||||
"archive": "gates/targeted-01/inputs-before.json",
|
||||
"bytes": 826699,
|
||||
"sha256": "e00c499308c9c61522abb61fe37dc391a17e87592e6e1c0b93cf1a55fcfc712e"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-gates-20260923\\targeted-01\\output.log",
|
||||
"archive": "gates/targeted-01/output.log",
|
||||
"bytes": 1139,
|
||||
"sha256": "d03b3f2f6346d5e3e75cba5ec51826e1cebc391928ad9bc889275e6e5520bf8c"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-gates-20260923\\targeted-01\\result.json",
|
||||
"archive": "gates/targeted-01/result.json",
|
||||
"bytes": 1843,
|
||||
"sha256": "08fd3ce9dbd0e5b8ef2d2758b675d7de3900825d87b29b6d95e768fddf17d235"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-gates-20260923\\toolchain\\changes.patch",
|
||||
"archive": "gates/toolchain/changes.patch",
|
||||
"bytes": 2929,
|
||||
"sha256": "850c245a488f478649790dbce88976a74f7bedf792eae0b3f429263243fb150c"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-gates-20260923\\toolchain\\context.json",
|
||||
"archive": "gates/toolchain/context.json",
|
||||
"bytes": 1364,
|
||||
"sha256": "ccacde944d37ef0ef6ff0686967102e1d349b8768511bfab0f223357a91f65f2"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-gates-20260923\\toolchain\\inputs-after.json",
|
||||
"archive": "gates/toolchain/inputs-after.json",
|
||||
"bytes": 826699,
|
||||
"sha256": "e00c499308c9c61522abb61fe37dc391a17e87592e6e1c0b93cf1a55fcfc712e"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-gates-20260923\\toolchain\\inputs-before.json",
|
||||
"archive": "gates/toolchain/inputs-before.json",
|
||||
"bytes": 826699,
|
||||
"sha256": "e00c499308c9c61522abb61fe37dc391a17e87592e6e1c0b93cf1a55fcfc712e"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-gates-20260923\\toolchain\\output.log",
|
||||
"archive": "gates/toolchain/output.log",
|
||||
"bytes": 197,
|
||||
"sha256": "cdaaa400be47332d69e678836251d4635b5ff2ecd34aa962b69d71f8961d274b"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-gates-20260923\\toolchain\\result.json",
|
||||
"archive": "gates/toolchain/result.json",
|
||||
"bytes": 1717,
|
||||
"sha256": "8750fae7c035b368f5f1b1f07ddb38b309d0d3211168f37baae302aac319fdd8"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\baseline\\attachments.arcadia",
|
||||
"archive": "native/baseline/attachments.arcadia",
|
||||
"bytes": 9715,
|
||||
"sha256": "a05c43d13e9e65872f625456b45f30f8296069159de43c695793194beac7008d"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\baseline\\B.project.json",
|
||||
"archive": "native/baseline/B.project.json",
|
||||
"bytes": 24594,
|
||||
"sha256": "149fcc554b5f41bc41bfa68f1f70edda73e8df868d92f7e1ee8020967b609d67"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\baseline\\stderr.log",
|
||||
"archive": "native/baseline/stderr.log",
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\baseline\\stdout.log",
|
||||
"archive": "native/baseline/stdout.log",
|
||||
"bytes": 68,
|
||||
"sha256": "e128921d6c122c4a430aced7b98253b11641137c5e088899b0ed87a8f5469c93"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\capture.js",
|
||||
"archive": "native/capture.js",
|
||||
"bytes": 2281,
|
||||
"sha256": "b30a588ec99e3c78eef8c0fdaa158d60170e03915161682cfd8d3accf5c68e62"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\check.py",
|
||||
"archive": "native/check.py",
|
||||
"bytes": 3525,
|
||||
"sha256": "f038e4e1f75d8549ac23bce9e90e39799ced82ea6cbd0fd5d9b18908980d2187"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\expected\\A1.project.json",
|
||||
"archive": "native/expected/A1.project.json",
|
||||
"bytes": 24593,
|
||||
"sha256": "d46193e94a3abdc35c8fc90529d9530623a6d958fb3a30f181753805e23a1fea"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\expected\\B.project.json",
|
||||
"archive": "native/expected/B.project.json",
|
||||
"bytes": 24594,
|
||||
"sha256": "149fcc554b5f41bc41bfa68f1f70edda73e8df868d92f7e1ee8020967b609d67"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\expected\\catalog.json",
|
||||
"archive": "native/expected/catalog.json",
|
||||
"bytes": 917,
|
||||
"sha256": "b0cbf792bc3860a6ab851f8807eb8a841c16bf5870c93a7c36dedce39cd56fc7"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\input-manifest.json",
|
||||
"archive": "native/input-manifest.json",
|
||||
"bytes": 857940,
|
||||
"sha256": "450e15cc94899acfc5c30e005099c1dbbe9a9703e5aca9a8863eab620cfc7943"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\launch.ps1",
|
||||
"archive": "native/launch.ps1",
|
||||
"bytes": 6234,
|
||||
"sha256": "899b1ca6ac6c0cdd62eeaf2b6706d9be3072aa6c14dd5e801c8e5e1d4a6b89b2"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\native-plan.md",
|
||||
"archive": "native/native-plan.md",
|
||||
"bytes": 2974,
|
||||
"sha256": "8147e652ba49fb17a39eb19f2fb06b7eddbad37198160abade7aa4db19147fa6"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\preflight\\baseline.arcadia",
|
||||
"archive": "native/preflight/baseline.arcadia",
|
||||
"bytes": 9715,
|
||||
"sha256": "a05c43d13e9e65872f625456b45f30f8296069159de43c695793194beac7008d"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\preflight\\baseline.project.json",
|
||||
"archive": "native/preflight/baseline.project.json",
|
||||
"bytes": 24594,
|
||||
"sha256": "149fcc554b5f41bc41bfa68f1f70edda73e8df868d92f7e1ee8020967b609d67"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\preflight\\baseline.receipt.json",
|
||||
"archive": "native/preflight/baseline.receipt.json",
|
||||
"bytes": 2537,
|
||||
"sha256": "ecdad75580a7c9f74a0866e6993b9d0a6378d5a15c3d4b52df0c0c0b2b18afed"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\preflight\\baseline.stderr.log",
|
||||
"archive": "native/preflight/baseline.stderr.log",
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\preflight\\baseline.stdout.log",
|
||||
"archive": "native/preflight/baseline.stdout.log",
|
||||
"bytes": 68,
|
||||
"sha256": "e128921d6c122c4a430aced7b98253b11641137c5e088899b0ed87a8f5469c93"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\provenance\\binary-relocation.json",
|
||||
"archive": "native/provenance/binary-relocation.json",
|
||||
"bytes": 1454,
|
||||
"sha256": "b54c263141d92c863f58637deb8c65a1ddc442b972d14c23e54697e2a6b92884"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\provenance\\evaluator-reuse.json",
|
||||
"archive": "native/provenance/evaluator-reuse.json",
|
||||
"bytes": 854,
|
||||
"sha256": "f6f7e033b5eb24d890f7f0190759d554f6f64ec93ba1dd5f54885f0c52ac6941"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-01\\captures\\00-state-baseline.jpg",
|
||||
"archive": "native/runs/run-01/captures/00-state-baseline.jpg",
|
||||
"bytes": 141216,
|
||||
"sha256": "5ca5ac1168fc5db91165db98e9d271e34fd976923b434c4f8c59900578d1657f"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-01\\captures\\00-state-baseline.json",
|
||||
"archive": "native/runs/run-01/captures/00-state-baseline.json",
|
||||
"bytes": 1130,
|
||||
"sha256": "a59976bcccc8dbcafe6684d0cf94475dda44fc882ab37335240086fc81fc4af0"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-01\\captures\\01-source-armed.jpg",
|
||||
"archive": "native/runs/run-01/captures/01-source-armed.jpg",
|
||||
"bytes": 142363,
|
||||
"sha256": "b3745306b6a813325aa4b80a4dc48872479c544f72bddd3961b7d1d3a475c732"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-01\\captures\\01-source-armed.json",
|
||||
"archive": "native/runs/run-01/captures/01-source-armed.json",
|
||||
"bytes": 1140,
|
||||
"sha256": "53d4aa05988a70d481bf715d61bb433a6fbb51bc40043fa0faddea54ad7d1eb4"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-01\\captures\\02-source-escape-select.jpg",
|
||||
"archive": "native/runs/run-01/captures/02-source-escape-select.jpg",
|
||||
"bytes": 142528,
|
||||
"sha256": "0ca328d8e712d090038527969c052e8995fff313f42808d8eba5c5b52368cda9"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-01\\captures\\02-source-escape-select.json",
|
||||
"archive": "native/runs/run-01/captures/02-source-escape-select.json",
|
||||
"bytes": 1147,
|
||||
"sha256": "39a4f9cca02571d2ebd05c212ca5482ef3bd3040a7c905fb4daab8c7532a6a82"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-01\\captures\\03-target-armed.jpg",
|
||||
"archive": "native/runs/run-01/captures/03-target-armed.jpg",
|
||||
"bytes": 142391,
|
||||
"sha256": "125d6e6ef092fb24923fe2dcfc77ace3bb528f39699d4290230e2f83bcf63620"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-01\\captures\\03-target-armed.json",
|
||||
"archive": "native/runs/run-01/captures/03-target-armed.json",
|
||||
"bytes": 1121,
|
||||
"sha256": "b351c54bf0872a8a036604f588ab78e9f49320f3a725963ea275d45d86483e6b"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-01\\captures\\04-target-escape-select.jpg",
|
||||
"archive": "native/runs/run-01/captures/04-target-escape-select.jpg",
|
||||
"bytes": 142456,
|
||||
"sha256": "4b509d0ffe4d75bfe3b05443723cce87712fd5f21901596e4daf10cfd0b377c9"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-01\\captures\\04-target-escape-select.json",
|
||||
"archive": "native/runs/run-01/captures/04-target-escape-select.json",
|
||||
"bytes": 1145,
|
||||
"sha256": "aa07c4068ea5fe6052c14f8a7f3d5d637657a3cfb1c42777a272490b3341561c"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-01\\captures\\05-source-top-quarter.jpg",
|
||||
"archive": "native/runs/run-01/captures/05-source-top-quarter.jpg",
|
||||
"bytes": 143043,
|
||||
"sha256": "ed7780e6f5206835eb34f399ca9e216b16ff1028156563720edb957c265f619d"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-01\\captures\\05-source-top-quarter.json",
|
||||
"archive": "native/runs/run-01/captures/05-source-top-quarter.json",
|
||||
"bytes": 1157,
|
||||
"sha256": "319a68a9c22d4da6c46bc85b4d4cf7eef7bdcf023fa677c5ca607d0ff8a08d53"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-01\\captures\\06-undo.jpg",
|
||||
"archive": "native/runs/run-01/captures/06-undo.jpg",
|
||||
"bytes": 140069,
|
||||
"sha256": "9a454b2144c2357b7e188e14eb58568b2245f4c2321e7b3537d8c5d4b0e7440e"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-01\\captures\\06-undo.json",
|
||||
"archive": "native/runs/run-01/captures/06-undo.json",
|
||||
"bytes": 1091,
|
||||
"sha256": "7e535a1e3964fe3292f645d8a63aec370329d5dacc4832fbef1059c46eeb0c07"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-01\\captures\\07-redo.jpg",
|
||||
"archive": "native/runs/run-01/captures/07-redo.jpg",
|
||||
"bytes": 141706,
|
||||
"sha256": "6ba27bff465321e43a706b1ba5f1baa02af8762e65259e0807723655a5666120"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-01\\captures\\07-redo.json",
|
||||
"archive": "native/runs/run-01/captures/07-redo.json",
|
||||
"bytes": 1089,
|
||||
"sha256": "603c4bf7930db15ff17e6043237f00aaa562fd8da6afe263df914dc9a6bee48d"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-01\\captures\\08-saved-final.jpg",
|
||||
"archive": "native/runs/run-01/captures/08-saved-final.jpg",
|
||||
"bytes": 141555,
|
||||
"sha256": "e49ec9dc14ffb858324960b480709b34a7dc0bc5c27181e1e122cce935672723"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-01\\captures\\08-saved-final.json",
|
||||
"archive": "native/runs/run-01/captures/08-saved-final.json",
|
||||
"bytes": 1124,
|
||||
"sha256": "7e1e7c3b7d36ff22c5060e3141098c8f65a535a759ca4e2cdee0cb6d7631fc26"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-01\\checks\\00-cancel-baseline.arcadia",
|
||||
"archive": "native/runs/run-01/checks/00-cancel-baseline.arcadia",
|
||||
"bytes": 9715,
|
||||
"sha256": "a05c43d13e9e65872f625456b45f30f8296069159de43c695793194beac7008d"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-01\\checks\\00-cancel-baseline.project.json",
|
||||
"archive": "native/runs/run-01/checks/00-cancel-baseline.project.json",
|
||||
"bytes": 24594,
|
||||
"sha256": "149fcc554b5f41bc41bfa68f1f70edda73e8df868d92f7e1ee8020967b609d67"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-01\\checks\\00-cancel-baseline.receipt.json",
|
||||
"archive": "native/runs/run-01/checks/00-cancel-baseline.receipt.json",
|
||||
"bytes": 2621,
|
||||
"sha256": "255f023e30bfbcb507377c489ed23ca205470150f95fc3fec23e2a72d2b5979d"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-01\\checks\\00-cancel-baseline.stderr.log",
|
||||
"archive": "native/runs/run-01/checks/00-cancel-baseline.stderr.log",
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-01\\checks\\00-cancel-baseline.stdout.log",
|
||||
"archive": "native/runs/run-01/checks/00-cancel-baseline.stdout.log",
|
||||
"bytes": 68,
|
||||
"sha256": "e128921d6c122c4a430aced7b98253b11641137c5e088899b0ed87a8f5469c93"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-01\\checks\\01-adjusted.arcadia",
|
||||
"archive": "native/runs/run-01/checks/01-adjusted.arcadia",
|
||||
"bytes": 9714,
|
||||
"sha256": "41295c41e3b0b95073dba8c6e828ce310f097195a41f68d47a8ae4f2b7ab2aad"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-01\\checks\\01-adjusted.project.json",
|
||||
"archive": "native/runs/run-01/checks/01-adjusted.project.json",
|
||||
"bytes": 24593,
|
||||
"sha256": "d46193e94a3abdc35c8fc90529d9530623a6d958fb3a30f181753805e23a1fea"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-01\\checks\\01-adjusted.receipt.json",
|
||||
"archive": "native/runs/run-01/checks/01-adjusted.receipt.json",
|
||||
"bytes": 2595,
|
||||
"sha256": "6e577e75fdb380adc1dcfbbd3ca15ff1dd4846d0177cd7c8e2c6c96d61ef6e54"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-01\\checks\\01-adjusted.stderr.log",
|
||||
"archive": "native/runs/run-01/checks/01-adjusted.stderr.log",
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-01\\checks\\01-adjusted.stdout.log",
|
||||
"archive": "native/runs/run-01/checks/01-adjusted.stdout.log",
|
||||
"bytes": 68,
|
||||
"sha256": "e128921d6c122c4a430aced7b98253b11641137c5e088899b0ed87a8f5469c93"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-01\\checks\\02-undo.arcadia",
|
||||
"archive": "native/runs/run-01/checks/02-undo.arcadia",
|
||||
"bytes": 9715,
|
||||
"sha256": "a05c43d13e9e65872f625456b45f30f8296069159de43c695793194beac7008d"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-01\\checks\\02-undo.project.json",
|
||||
"archive": "native/runs/run-01/checks/02-undo.project.json",
|
||||
"bytes": 24594,
|
||||
"sha256": "149fcc554b5f41bc41bfa68f1f70edda73e8df868d92f7e1ee8020967b609d67"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-01\\checks\\02-undo.receipt.json",
|
||||
"archive": "native/runs/run-01/checks/02-undo.receipt.json",
|
||||
"bytes": 2577,
|
||||
"sha256": "1e85ecba2a823ea07577265df544643ce56f82e49a1f66239e79fb2d58f76c42"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-01\\checks\\02-undo.stderr.log",
|
||||
"archive": "native/runs/run-01/checks/02-undo.stderr.log",
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-01\\checks\\02-undo.stdout.log",
|
||||
"archive": "native/runs/run-01/checks/02-undo.stdout.log",
|
||||
"bytes": 68,
|
||||
"sha256": "e128921d6c122c4a430aced7b98253b11641137c5e088899b0ed87a8f5469c93"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-01\\checks\\03-redo.arcadia",
|
||||
"archive": "native/runs/run-01/checks/03-redo.arcadia",
|
||||
"bytes": 9714,
|
||||
"sha256": "41295c41e3b0b95073dba8c6e828ce310f097195a41f68d47a8ae4f2b7ab2aad"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-01\\checks\\03-redo.project.json",
|
||||
"archive": "native/runs/run-01/checks/03-redo.project.json",
|
||||
"bytes": 24593,
|
||||
"sha256": "d46193e94a3abdc35c8fc90529d9530623a6d958fb3a30f181753805e23a1fea"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-01\\checks\\03-redo.receipt.json",
|
||||
"archive": "native/runs/run-01/checks/03-redo.receipt.json",
|
||||
"bytes": 2579,
|
||||
"sha256": "aad75e177adc9e825c856447ce8ca49622b61c1fe05b2142eef258fd7e048e1a"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-01\\checks\\03-redo.stderr.log",
|
||||
"archive": "native/runs/run-01/checks/03-redo.stderr.log",
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-01\\checks\\03-redo.stdout.log",
|
||||
"archive": "native/runs/run-01/checks/03-redo.stdout.log",
|
||||
"bytes": 68,
|
||||
"sha256": "e128921d6c122c4a430aced7b98253b11641137c5e088899b0ed87a8f5469c93"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-01\\close-action.json",
|
||||
"archive": "native/runs/run-01/close-action.json",
|
||||
"bytes": 221,
|
||||
"sha256": "c528be2c31635abf25386bb93f05ae3882d0a908bd809b227cbf569969947e6a"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-01\\launch.json",
|
||||
"archive": "native/runs/run-01/launch.json",
|
||||
"bytes": 1934,
|
||||
"sha256": "a0eff5333d97d589ece2a3b2541ef959ed79e865fa985cc4ea3ed7a5034c907a"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-01\\logs\\studio.stderr.log",
|
||||
"archive": "native/runs/run-01/logs/studio.stderr.log",
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-01\\logs\\studio.stdout.log",
|
||||
"archive": "native/runs/run-01/logs/studio.stdout.log",
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-01\\normal-close.json",
|
||||
"archive": "native/runs/run-01/normal-close.json",
|
||||
"bytes": 1679,
|
||||
"sha256": "013e8826c7c9601959e6954186fe00a38c7afa9e7dabe6fdec76769a450737ce"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-02\\captures\\00-reopened-oa.jpg",
|
||||
"archive": "native/runs/run-02/captures/00-reopened-oa.jpg",
|
||||
"bytes": 112013,
|
||||
"sha256": "ebb25a616f1386a54cde2af88536076c9394816f701c218969c401dac443c81b"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-02\\captures\\00-reopened-oa.json",
|
||||
"archive": "native/runs/run-02/captures/00-reopened-oa.json",
|
||||
"bytes": 1130,
|
||||
"sha256": "0c652705646905c5bd63eb8d0f8b381b1bd71882c753de3257fc07a65b1bd7d8"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-02\\captures\\01-reopened-state.jpg",
|
||||
"archive": "native/runs/run-02/captures/01-reopened-state.jpg",
|
||||
"bytes": 143124,
|
||||
"sha256": "e91681d464fbedbd4803ed90e8119915c398e41e5462fd94bde29df0b9cef1b8"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-02\\captures\\01-reopened-state.json",
|
||||
"archive": "native/runs/run-02/captures/01-reopened-state.json",
|
||||
"bytes": 1154,
|
||||
"sha256": "816788a6910db2577750dbb26dcbb68e79c2a1633eae762cd2f7159b173134ae"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-02\\captures\\02-reopened-final-saved.jpg",
|
||||
"archive": "native/runs/run-02/captures/02-reopened-final-saved.jpg",
|
||||
"bytes": 141509,
|
||||
"sha256": "4b2bccd82dd161632bd294459a7caaba0fa5e2c513810463951923aeedfa385b"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-02\\captures\\02-reopened-final-saved.json",
|
||||
"archive": "native/runs/run-02/captures/02-reopened-final-saved.json",
|
||||
"bytes": 1148,
|
||||
"sha256": "bf5a9ed1ce8a62a61c2377ad3f059275c6ef9b8e138ce385c9747027528788a5"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-02\\checks\\00-reopened-saved.arcadia",
|
||||
"archive": "native/runs/run-02/checks/00-reopened-saved.arcadia",
|
||||
"bytes": 9714,
|
||||
"sha256": "41295c41e3b0b95073dba8c6e828ce310f097195a41f68d47a8ae4f2b7ab2aad"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-02\\checks\\00-reopened-saved.project.json",
|
||||
"archive": "native/runs/run-02/checks/00-reopened-saved.project.json",
|
||||
"bytes": 24593,
|
||||
"sha256": "d46193e94a3abdc35c8fc90529d9530623a6d958fb3a30f181753805e23a1fea"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-02\\checks\\00-reopened-saved.receipt.json",
|
||||
"archive": "native/runs/run-02/checks/00-reopened-saved.receipt.json",
|
||||
"bytes": 2619,
|
||||
"sha256": "cc0e027d64017ec8060bb178fd12de9097e945fb3002ab30e51c85c7b8f63d09"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-02\\checks\\00-reopened-saved.stderr.log",
|
||||
"archive": "native/runs/run-02/checks/00-reopened-saved.stderr.log",
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-02\\checks\\00-reopened-saved.stdout.log",
|
||||
"archive": "native/runs/run-02/checks/00-reopened-saved.stdout.log",
|
||||
"bytes": 68,
|
||||
"sha256": "e128921d6c122c4a430aced7b98253b11641137c5e088899b0ed87a8f5469c93"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-02\\close-action.json",
|
||||
"archive": "native/runs/run-02/close-action.json",
|
||||
"bytes": 341,
|
||||
"sha256": "c87ecdc7283fac8baf6d33c4a97f3b77ca9e187c8b4b37b81931d6d8425132ec"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-02\\launch.json",
|
||||
"archive": "native/runs/run-02/launch.json",
|
||||
"bytes": 1996,
|
||||
"sha256": "0da8b27b71d42c0b8a698d01cd63ee0dc153781eb1a004bceb642a6652abb0c8"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-02\\logs\\studio.stderr.log",
|
||||
"archive": "native/runs/run-02/logs/studio.stderr.log",
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-02\\logs\\studio.stdout.log",
|
||||
"archive": "native/runs/run-02/logs/studio.stdout.log",
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\runs\\run-02\\normal-close.json",
|
||||
"archive": "native/runs/run-02/normal-close.json",
|
||||
"bytes": 1679,
|
||||
"sha256": "ba7cbdef1cf94e7ec82c643358c099b3852343c52a3ae5e3a289b0b1a3155cec"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\stage.py",
|
||||
"archive": "native/stage.py",
|
||||
"bytes": 9495,
|
||||
"sha256": "3f1c439d485f4041d583e9eaf5cd3025c33b0c81ab58df5127b3a52c2b690095"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\staging-record.json",
|
||||
"archive": "native/staging-record.json",
|
||||
"bytes": 437,
|
||||
"sha256": "9e87fb89d6c788cd347af7f08cec80fdeac181868a906cf2f5f418b9ba8ac8bb"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\verify.ps1",
|
||||
"archive": "native/verify.ps1",
|
||||
"bytes": 924,
|
||||
"sha256": "e38f44c059b55e53282193a617ee7aed531902d49ec314686838c8c713875395"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923-failed-01\\baseline\\attachments.arcadia",
|
||||
"archive": "failed-stage-01/baseline/attachments.arcadia",
|
||||
"bytes": 9715,
|
||||
"sha256": "a05c43d13e9e65872f625456b45f30f8296069159de43c695793194beac7008d"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923-failed-01\\baseline\\B.project.json",
|
||||
"archive": "failed-stage-01/baseline/B.project.json",
|
||||
"bytes": 24594,
|
||||
"sha256": "149fcc554b5f41bc41bfa68f1f70edda73e8df868d92f7e1ee8020967b609d67"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923-failed-01\\baseline\\stderr.log",
|
||||
"archive": "failed-stage-01/baseline/stderr.log",
|
||||
"bytes": 0,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923-failed-01\\baseline\\stdout.log",
|
||||
"archive": "failed-stage-01/baseline/stdout.log",
|
||||
"bytes": 68,
|
||||
"sha256": "e128921d6c122c4a430aced7b98253b11641137c5e088899b0ed87a8f5469c93"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923-failed-01\\capture.js",
|
||||
"archive": "failed-stage-01/capture.js",
|
||||
"bytes": 2281,
|
||||
"sha256": "b30a588ec99e3c78eef8c0fdaa158d60170e03915161682cfd8d3accf5c68e62"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923-failed-01\\check.py",
|
||||
"archive": "failed-stage-01/check.py",
|
||||
"bytes": 3525,
|
||||
"sha256": "f038e4e1f75d8549ac23bce9e90e39799ced82ea6cbd0fd5d9b18908980d2187"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923-failed-01\\launch.ps1",
|
||||
"archive": "failed-stage-01/launch.ps1",
|
||||
"bytes": 6234,
|
||||
"sha256": "899b1ca6ac6c0cdd62eeaf2b6706d9be3072aa6c14dd5e801c8e5e1d4a6b89b2"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923-failed-01\\native-plan.md",
|
||||
"archive": "failed-stage-01/native-plan.md",
|
||||
"bytes": 2974,
|
||||
"sha256": "8147e652ba49fb17a39eb19f2fb06b7eddbad37198160abade7aa4db19147fa6"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923-failed-01\\provenance\\binary-relocation.json",
|
||||
"archive": "failed-stage-01/provenance/binary-relocation.json",
|
||||
"bytes": 1454,
|
||||
"sha256": "b54c263141d92c863f58637deb8c65a1ddc442b972d14c23e54697e2a6b92884"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923-failed-01\\provenance\\evaluator-reuse.json",
|
||||
"archive": "failed-stage-01/provenance/evaluator-reuse.json",
|
||||
"bytes": 854,
|
||||
"sha256": "f6f7e033b5eb24d890f7f0190759d554f6f64ec93ba1dd5f54885f0c52ac6941"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923-failed-01\\stage.py",
|
||||
"archive": "failed-stage-01/stage.py",
|
||||
"bytes": 9476,
|
||||
"sha256": "715f6bfb68fc721be868f16635e41b88fad059e0b10dee7287240411ce79c82f"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923-failed-01\\verify.ps1",
|
||||
"archive": "failed-stage-01/verify.ps1",
|
||||
"bytes": 924,
|
||||
"sha256": "e38f44c059b55e53282193a617ee7aed531902d49ec314686838c8c713875395"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-stage-review-20260923.md",
|
||||
"archive": "reviews/00-edge-anchors-escape-stage-review-20260923.md",
|
||||
"bytes": 3409,
|
||||
"sha256": "383bb506fe14bb2a0e05a67bd4b69fedf1db11c87ac09279fc49b845a5556f65"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-state-escape-review-20260922.md",
|
||||
"archive": "reviews/01-edge-anchors-state-escape-review-20260922.md",
|
||||
"bytes": 7063,
|
||||
"sha256": "df73163335531e69362bf7a5944433ce59b7261a652286d9b293fe3f1cba36e9"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-run1-review-20260923.md",
|
||||
"archive": "reviews/02-edge-anchors-escape-native-run1-review-20260923.md",
|
||||
"bytes": 6646,
|
||||
"sha256": "d8357d6016bd50fe9cb364e469ec05b3a7c46cbd659168cd5df2d475de2a28db"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-run2-review-20260923.md",
|
||||
"archive": "reviews/03-edge-anchors-escape-native-run2-review-20260923.md",
|
||||
"bytes": 4643,
|
||||
"sha256": "d87fa659b33ea1d1db75aafcb4462579c4044784a51e8882e38b4c50a20f5bc4"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-evidence-20260923\\verify-build.py",
|
||||
"archive": "verify-build.py",
|
||||
"bytes": 9556,
|
||||
"sha256": "4e92f820fe4ec888b395b51e37084b31b5b160408d52e27032886d60423df1db"
|
||||
},
|
||||
{
|
||||
"original": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-evidence-20260923\\build-corrected.py",
|
||||
"archive": "build-corrected.py",
|
||||
"bytes": 4856,
|
||||
"sha256": "147fbcc1d01891b9ac78dfceb298aec064c1bcc7f0f6603b4e46b0572fddeb8f"
|
||||
}
|
||||
],
|
||||
"source_map": "source-map.json",
|
||||
"source_map_sha256": "748eda2b4aa059a203cb244dce2b800309ce5ea24779181bd41f8a3dd7b1c764",
|
||||
"prerequisite_archives": [
|
||||
{
|
||||
"name": "original-stage-01",
|
||||
"manifest_sha256": "2379fb100e529772ea6149554fee71aca80ab956539e97aa4d288b189ff55131"
|
||||
}
|
||||
],
|
||||
"excluded": "Binaries, profiles, mutable working. Original stage is separate immutable prerequisite."
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
"""Build corrected evidence only after both native runs close. Original archive stays read-only."""
|
||||
from pathlib import Path
|
||||
import argparse,importlib.util,hashlib,json
|
||||
HERE=Path(__file__).resolve().parent
|
||||
spec=importlib.util.spec_from_file_location('evidence',HERE/'verify-build.py');h=importlib.util.module_from_spec(spec);spec.loader.exec_module(h)
|
||||
def main():
|
||||
p=argparse.ArgumentParser(description=__doc__);p.add_argument('--native',required=True);p.add_argument('--gate',required=True);p.add_argument('--repo',required=True);p.add_argument('--original-archive',required=True);p.add_argument('--failed-stage',required=True);p.add_argument('--extra',action='append',default=[]);p.add_argument('--output',required=True);a=p.parse_args()
|
||||
native=Path(a.native).resolve();gate=Path(a.gate).resolve();repo=Path(a.repo).resolve();out=Path(a.output).resolve();original=Path(a.original_archive).resolve()
|
||||
for n in (1,2):
|
||||
run=native/'runs'/f'run-{n:02d}'
|
||||
if not (run/'normal-close.json').is_file():raise RuntimeError('Both corrected runs must be closed before archive: '+str(run))
|
||||
close=h.read(run/'normal-close.json');launch=h.read(run/'launch.json')
|
||||
assert close['launch_sha256']==h.digest((run/'launch.json').read_bytes()) and close['pid']==launch['pid'] and close['started_utc']==launch['started_utc']
|
||||
if out.exists():raise RuntimeError('New output required')
|
||||
m=h.read(native/'input-manifest.json');pin=m['source_commit'];summary=h.read(gate/'summary.json');commit=h.read(gate/'commit-readback.json');assert commit['source_commit']==pin
|
||||
out.mkdir(parents=True);inventory=[];sources=[]
|
||||
def copy(src,rel):
|
||||
src=Path(src).resolve();raw=src.read_bytes();dest=out/rel;dest.parent.mkdir(parents=True,exist_ok=True)
|
||||
with dest.open('xb') as f:f.write(raw)
|
||||
assert src.read_bytes()==dest.read_bytes()
|
||||
inventory.append(dict(original=str(src),archive=rel,bytes=len(raw),sha256=h.digest(raw)))
|
||||
def tree(folder,prefix):
|
||||
for src in sorted(folder.rglob('*')):
|
||||
rel=src.relative_to(folder)
|
||||
if not src.is_file() or src.suffix.lower() in ('.exe','.dll','.pdb') or any(v in ('working','profile','package','unrelated-cwd','__pycache__') for v in rel.parts):continue
|
||||
copy(src,prefix+'/'+rel.as_posix())
|
||||
tree(gate,'gates');tree(native,'native');tree(Path(a.failed_stage).resolve(),'failed-stage-01')
|
||||
items=h.read(summary['source_manifest']['path']);paths=[Path(r['path']).resolve().relative_to(repo).as_posix() for r in items];blobs=dict(h.git_blobs(repo,pin,paths))
|
||||
for item,path in zip(items,paths):
|
||||
blob=blobs[path];row={'original':item['path'],'git_path':path,'commit':pin,'bytes':item['bytes'],'sha256':item['sha256']}
|
||||
if len(blob)==item['bytes'] and h.digest(blob)==item['sha256']:row['storage']='git'
|
||||
else:
|
||||
raw=Path(item['path']).read_bytes()
|
||||
if len(raw)!=item['bytes'] or h.digest(raw)!=item['sha256']:raise RuntimeError('Captured raw source changed: '+path)
|
||||
rel='source-overrides/'+pin+'/'+path;dest=out/rel;dest.parent.mkdir(parents=True,exist_ok=True)
|
||||
with dest.open('xb') as f:f.write(raw)
|
||||
row.update(storage='override',archive=rel)
|
||||
sources.append(row)
|
||||
for i,src in enumerate(a.extra):copy(src,f'reviews/{i:02d}-'+Path(src).name)
|
||||
copy(HERE/'verify-build.py','verify-build.py');copy(__file__,'build-corrected.py')
|
||||
h.write(out/'source-map.json',sources)
|
||||
h.write(out/'archive-manifest.json',{'original_receipts_unchanged':True,'files':inventory,'source_map':'source-map.json','source_map_sha256':h.digest((out/'source-map.json').read_bytes()),'prerequisite_archives':[{'name':original.name,'manifest_sha256':h.digest((original/'archive-manifest.json').read_bytes())}],'excluded':'Binaries, profiles, mutable working. Original stage is separate immutable prerequisite.'})
|
||||
(out/'.gitattributes').write_text('* -text\n',encoding='ascii')
|
||||
(out/'README.md').write_text('# Corrected State Escape evidence\n\nPrepared raw evidence for GUI '+pin+'; evaluator remains separately pinned to '+m['evaluator_source_commit']+'. Historical gate results retain their uncommitted-base description; commit-readback and exact captured source mapping establish the later commit. Binary relocation incident remains disclosed. Original archive is a required separate prerequisite, not overwritten or duplicated.\n\nVerify with `python verify-build.py verify --archive . --repo /repository --related-archive /original-stage-01`. Reviews and closed native receipts bound actual claims; preparation alone is not acceptance. Excluded binaries are reported as external. Final narrative and external-reference inventory require parent review before publication.\n',encoding='utf-8')
|
||||
print(json.dumps({'archive':str(out),'originals':len(inventory),'source_records':len(sources),'git_exact':sum(r['storage']=='git' for r in sources),'overrides':sum(r['storage']=='override' for r in sources)},indent=2))
|
||||
if __name__=='__main__':main()
|
||||
@@ -0,0 +1,860 @@
|
||||
{
|
||||
"schema_version": 7,
|
||||
"id": "ea202922-0033-4000-8000-000000000001",
|
||||
"alias": "endpoint_acceptance",
|
||||
"name": "Harbor dispatch — attachment acceptance",
|
||||
"description": "Small native fixture for presentation-only endpoint editing. Names describe stored source-to-target direction.",
|
||||
"elements": {
|
||||
"ea202922-0033-4000-8000-000000000010": {
|
||||
"id": "ea202922-0033-4000-8000-000000000010",
|
||||
"alias": "receive_report",
|
||||
"name": "Receive distress report",
|
||||
"description": "",
|
||||
"parent": null,
|
||||
"body": {
|
||||
"Oa": "Activity"
|
||||
}
|
||||
},
|
||||
"ea202922-0033-4000-8000-000000000011": {
|
||||
"id": "ea202922-0033-4000-8000-000000000011",
|
||||
"alias": "dispatch_crew",
|
||||
"name": "Dispatch rescue crew",
|
||||
"description": "",
|
||||
"parent": null,
|
||||
"body": {
|
||||
"Oa": "Activity"
|
||||
}
|
||||
},
|
||||
"ea202922-0033-4000-8000-000000000030": {
|
||||
"id": "ea202922-0033-4000-8000-000000000030",
|
||||
"alias": "controller",
|
||||
"name": "Rescue readiness controller",
|
||||
"description": "",
|
||||
"parent": null,
|
||||
"body": {
|
||||
"Sa": "System"
|
||||
}
|
||||
},
|
||||
"ea202922-0033-4000-8000-000000000031": {
|
||||
"id": "ea202922-0033-4000-8000-000000000031",
|
||||
"alias": "readiness",
|
||||
"name": "Rescue readiness",
|
||||
"description": "",
|
||||
"parent": "ea202922-0033-4000-8000-000000000030",
|
||||
"body": {
|
||||
"Sa": {
|
||||
"Shared": "StateMachine"
|
||||
}
|
||||
}
|
||||
},
|
||||
"ea202922-0033-4000-8000-000000000032": {
|
||||
"id": "ea202922-0033-4000-8000-000000000032",
|
||||
"alias": "main_region",
|
||||
"name": "Readiness region",
|
||||
"description": "",
|
||||
"parent": "ea202922-0033-4000-8000-000000000031",
|
||||
"body": {
|
||||
"Sa": {
|
||||
"Shared": "Region"
|
||||
}
|
||||
}
|
||||
},
|
||||
"ea202922-0033-4000-8000-000000000033": {
|
||||
"id": "ea202922-0033-4000-8000-000000000033",
|
||||
"alias": "start",
|
||||
"name": "Startup",
|
||||
"description": "",
|
||||
"parent": "ea202922-0033-4000-8000-000000000032",
|
||||
"body": {
|
||||
"Sa": {
|
||||
"Shared": {
|
||||
"State": {
|
||||
"kind": "Initial",
|
||||
"entry": "",
|
||||
"exit": "",
|
||||
"do_activity": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"ea202922-0033-4000-8000-000000000034": {
|
||||
"id": "ea202922-0033-4000-8000-000000000034",
|
||||
"alias": "ready",
|
||||
"name": "Ready",
|
||||
"description": "",
|
||||
"parent": "ea202922-0033-4000-8000-000000000032",
|
||||
"body": {
|
||||
"Sa": {
|
||||
"Shared": {
|
||||
"State": {
|
||||
"kind": "State",
|
||||
"entry": "",
|
||||
"exit": "",
|
||||
"do_activity": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"ea202922-0033-4000-8000-000000000035": {
|
||||
"id": "ea202922-0033-4000-8000-000000000035",
|
||||
"alias": "active",
|
||||
"name": "Active",
|
||||
"description": "",
|
||||
"parent": "ea202922-0033-4000-8000-000000000032",
|
||||
"body": {
|
||||
"Sa": {
|
||||
"Shared": {
|
||||
"State": {
|
||||
"kind": "State",
|
||||
"entry": "",
|
||||
"exit": "",
|
||||
"do_activity": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"ea202922-0033-4000-8000-000000000036": {
|
||||
"id": "ea202922-0033-4000-8000-000000000036",
|
||||
"alias": "decision",
|
||||
"name": "Dispatch decision",
|
||||
"description": "",
|
||||
"parent": "ea202922-0033-4000-8000-000000000032",
|
||||
"body": {
|
||||
"Sa": {
|
||||
"Shared": {
|
||||
"State": {
|
||||
"kind": "Choice",
|
||||
"entry": "",
|
||||
"exit": "",
|
||||
"do_activity": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"ea202922-0033-4000-8000-000000000037": {
|
||||
"id": "ea202922-0033-4000-8000-000000000037",
|
||||
"alias": "finished",
|
||||
"name": "Shutdown complete",
|
||||
"description": "",
|
||||
"parent": "ea202922-0033-4000-8000-000000000032",
|
||||
"body": {
|
||||
"Sa": {
|
||||
"Shared": {
|
||||
"State": {
|
||||
"kind": "Final",
|
||||
"entry": "",
|
||||
"exit": "",
|
||||
"do_activity": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"ea202922-0033-4000-8000-000000000050": {
|
||||
"id": "ea202922-0033-4000-8000-000000000050",
|
||||
"alias": "emit_status",
|
||||
"name": "Emit readiness status",
|
||||
"description": "",
|
||||
"parent": null,
|
||||
"body": {
|
||||
"Sa": "Function"
|
||||
}
|
||||
},
|
||||
"ea202922-0033-4000-8000-000000000051": {
|
||||
"id": "ea202922-0033-4000-8000-000000000051",
|
||||
"alias": "display_status",
|
||||
"name": "Display readiness status",
|
||||
"description": "",
|
||||
"parent": null,
|
||||
"body": {
|
||||
"Sa": "Function"
|
||||
}
|
||||
},
|
||||
"ea202922-0033-4000-8000-000000000052": {
|
||||
"id": "ea202922-0033-4000-8000-000000000052",
|
||||
"alias": "status_out",
|
||||
"name": "Status output",
|
||||
"description": "",
|
||||
"parent": "ea202922-0033-4000-8000-000000000050",
|
||||
"body": {
|
||||
"Sa": {
|
||||
"Shared": {
|
||||
"Port": {
|
||||
"contract": {
|
||||
"FunctionOutput": {
|
||||
"outgoing_items": []
|
||||
}
|
||||
},
|
||||
"legacy": null
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"ea202922-0033-4000-8000-000000000053": {
|
||||
"id": "ea202922-0033-4000-8000-000000000053",
|
||||
"alias": "status_in",
|
||||
"name": "Status input",
|
||||
"description": "",
|
||||
"parent": "ea202922-0033-4000-8000-000000000051",
|
||||
"body": {
|
||||
"Sa": {
|
||||
"Shared": {
|
||||
"Port": {
|
||||
"contract": {
|
||||
"FunctionInput": {
|
||||
"incoming_items": []
|
||||
}
|
||||
},
|
||||
"legacy": null
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"relations": {
|
||||
"ea202922-0033-4000-8000-000000000020": {
|
||||
"id": "ea202922-0033-4000-8000-000000000020",
|
||||
"alias": "dispatch_request",
|
||||
"name": "Dispatch request: Receive → Dispatch",
|
||||
"description": "Semantic sentinel: retain this description and direction.",
|
||||
"body": {
|
||||
"Interaction": {
|
||||
"source": "ea202922-0033-4000-8000-000000000010",
|
||||
"target": "ea202922-0033-4000-8000-000000000011",
|
||||
"items": []
|
||||
}
|
||||
}
|
||||
},
|
||||
"ea202922-0033-4000-8000-000000000040": {
|
||||
"id": "ea202922-0033-4000-8000-000000000040",
|
||||
"alias": "initialize",
|
||||
"name": "Initialize: Startup → Ready",
|
||||
"description": "",
|
||||
"body": {
|
||||
"StateTransition": {
|
||||
"source": "ea202922-0033-4000-8000-000000000033",
|
||||
"target": "ea202922-0033-4000-8000-000000000034",
|
||||
"transition_kind": "External",
|
||||
"triggers": [],
|
||||
"effects": [],
|
||||
"trigger": "",
|
||||
"guard": "",
|
||||
"effect": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"ea202922-0033-4000-8000-000000000041": {
|
||||
"id": "ea202922-0033-4000-8000-000000000041",
|
||||
"alias": "activate",
|
||||
"name": "Activate: Ready → Active",
|
||||
"description": "",
|
||||
"body": {
|
||||
"StateTransition": {
|
||||
"source": "ea202922-0033-4000-8000-000000000034",
|
||||
"target": "ea202922-0033-4000-8000-000000000035",
|
||||
"transition_kind": "External",
|
||||
"triggers": [],
|
||||
"effects": [],
|
||||
"trigger": "",
|
||||
"guard": "crew_assigned",
|
||||
"effect": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"ea202922-0033-4000-8000-000000000042": {
|
||||
"id": "ea202922-0033-4000-8000-000000000042",
|
||||
"alias": "assess",
|
||||
"name": "Assess: Active → Decision",
|
||||
"description": "",
|
||||
"body": {
|
||||
"StateTransition": {
|
||||
"source": "ea202922-0033-4000-8000-000000000035",
|
||||
"target": "ea202922-0033-4000-8000-000000000036",
|
||||
"transition_kind": "External",
|
||||
"triggers": [],
|
||||
"effects": [],
|
||||
"trigger": "",
|
||||
"guard": "",
|
||||
"effect": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"ea202922-0033-4000-8000-000000000043": {
|
||||
"id": "ea202922-0033-4000-8000-000000000043",
|
||||
"alias": "retry",
|
||||
"name": "Retry: Decision → Ready",
|
||||
"description": "",
|
||||
"body": {
|
||||
"StateTransition": {
|
||||
"source": "ea202922-0033-4000-8000-000000000036",
|
||||
"target": "ea202922-0033-4000-8000-000000000034",
|
||||
"transition_kind": "External",
|
||||
"triggers": [],
|
||||
"effects": [],
|
||||
"trigger": "",
|
||||
"guard": "retry_requested",
|
||||
"effect": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"ea202922-0033-4000-8000-000000000044": {
|
||||
"id": "ea202922-0033-4000-8000-000000000044",
|
||||
"alias": "finish",
|
||||
"name": "Finish: Decision → Shutdown",
|
||||
"description": "",
|
||||
"body": {
|
||||
"StateTransition": {
|
||||
"source": "ea202922-0033-4000-8000-000000000036",
|
||||
"target": "ea202922-0033-4000-8000-000000000037",
|
||||
"transition_kind": "External",
|
||||
"triggers": [],
|
||||
"effects": [],
|
||||
"trigger": "",
|
||||
"guard": "else",
|
||||
"effect": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"ea202922-0033-4000-8000-000000000045": {
|
||||
"id": "ea202922-0033-4000-8000-000000000045",
|
||||
"alias": "refresh",
|
||||
"name": "Refresh: Active → Active",
|
||||
"description": "",
|
||||
"body": {
|
||||
"StateTransition": {
|
||||
"source": "ea202922-0033-4000-8000-000000000035",
|
||||
"target": "ea202922-0033-4000-8000-000000000035",
|
||||
"transition_kind": "External",
|
||||
"triggers": [],
|
||||
"effects": [],
|
||||
"trigger": "",
|
||||
"guard": "refresh_requested",
|
||||
"effect": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"ea202922-0033-4000-8000-000000000046": {
|
||||
"id": "ea202922-0033-4000-8000-000000000046",
|
||||
"alias": "internal_check",
|
||||
"name": "Internal status check",
|
||||
"description": "",
|
||||
"body": {
|
||||
"StateTransition": {
|
||||
"source": "ea202922-0033-4000-8000-000000000035",
|
||||
"target": "ea202922-0033-4000-8000-000000000035",
|
||||
"transition_kind": "Internal",
|
||||
"triggers": [],
|
||||
"effects": [],
|
||||
"trigger": "",
|
||||
"guard": "",
|
||||
"effect": "Status unchanged"
|
||||
}
|
||||
}
|
||||
},
|
||||
"ea202922-0033-4000-8000-000000000054": {
|
||||
"id": "ea202922-0033-4000-8000-000000000054",
|
||||
"alias": "status_exchange",
|
||||
"name": "Readiness status: Emit → Display",
|
||||
"description": "",
|
||||
"body": {
|
||||
"FunctionalExchange": {
|
||||
"source": "ea202922-0033-4000-8000-000000000050",
|
||||
"target": "ea202922-0033-4000-8000-000000000051",
|
||||
"source_port": "ea202922-0033-4000-8000-000000000052",
|
||||
"target_port": "ea202922-0033-4000-8000-000000000053",
|
||||
"items": []
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"diagrams": {
|
||||
"ea202922-0033-4000-8000-000000000100": {
|
||||
"id": "ea202922-0033-4000-8000-000000000100",
|
||||
"alias": "dispatch_view",
|
||||
"name": "01 Dispatch — edit attachments",
|
||||
"description": "",
|
||||
"layer": "Oa",
|
||||
"projection": "FunctionalDataflow",
|
||||
"view_options": {
|
||||
"hidden_edges": [],
|
||||
"relation_kinds": "All",
|
||||
"work_categories": "All",
|
||||
"participant_categories": "All",
|
||||
"coverage": "All",
|
||||
"work_contexts": "All",
|
||||
"exchange_labels": "Name"
|
||||
},
|
||||
"nodes": {
|
||||
"ea202922-0033-4000-8000-000000000110": {
|
||||
"id": "ea202922-0033-4000-8000-000000000110",
|
||||
"alias": "dispatch_view_receive",
|
||||
"element": "ea202922-0033-4000-8000-000000000010",
|
||||
"position": {
|
||||
"x": 100.0,
|
||||
"y": 180.0
|
||||
},
|
||||
"size": {
|
||||
"width": 240.0,
|
||||
"height": 120.0
|
||||
},
|
||||
"collapsed": false
|
||||
},
|
||||
"ea202922-0033-4000-8000-000000000111": {
|
||||
"id": "ea202922-0033-4000-8000-000000000111",
|
||||
"alias": "dispatch_view_dispatch",
|
||||
"element": "ea202922-0033-4000-8000-000000000011",
|
||||
"position": {
|
||||
"x": 600.0,
|
||||
"y": 180.0
|
||||
},
|
||||
"size": {
|
||||
"width": 240.0,
|
||||
"height": 120.0
|
||||
},
|
||||
"collapsed": false
|
||||
}
|
||||
},
|
||||
"routes": [
|
||||
{
|
||||
"edge": "ea202922-0033-4000-8000-000000000020",
|
||||
"source_attachment": {
|
||||
"side": "Right",
|
||||
"offset": 0.5
|
||||
},
|
||||
"target_attachment": {
|
||||
"side": "Left",
|
||||
"offset": 0.6
|
||||
},
|
||||
"waypoints": [
|
||||
{
|
||||
"x": 440.0,
|
||||
"y": 340.0
|
||||
}
|
||||
],
|
||||
"label": {
|
||||
"fraction": 0.5,
|
||||
"offset": {
|
||||
"x": 12.0,
|
||||
"y": -18.0
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"ea202922-0033-4000-8000-000000000101": {
|
||||
"id": "ea202922-0033-4000-8000-000000000101",
|
||||
"alias": "dispatch_reference",
|
||||
"name": "02 Dispatch — untouched reference",
|
||||
"description": "",
|
||||
"layer": "Oa",
|
||||
"projection": "FunctionalDataflow",
|
||||
"view_options": {
|
||||
"hidden_edges": [],
|
||||
"relation_kinds": "All",
|
||||
"work_categories": "All",
|
||||
"participant_categories": "All",
|
||||
"coverage": "All",
|
||||
"work_contexts": "All",
|
||||
"exchange_labels": "Name"
|
||||
},
|
||||
"nodes": {
|
||||
"ea202922-0033-4000-8000-000000000120": {
|
||||
"id": "ea202922-0033-4000-8000-000000000120",
|
||||
"alias": "dispatch_reference_receive",
|
||||
"element": "ea202922-0033-4000-8000-000000000010",
|
||||
"position": {
|
||||
"x": 100.0,
|
||||
"y": 180.0
|
||||
},
|
||||
"size": {
|
||||
"width": 240.0,
|
||||
"height": 120.0
|
||||
},
|
||||
"collapsed": false
|
||||
},
|
||||
"ea202922-0033-4000-8000-000000000121": {
|
||||
"id": "ea202922-0033-4000-8000-000000000121",
|
||||
"alias": "dispatch_reference_dispatch",
|
||||
"element": "ea202922-0033-4000-8000-000000000011",
|
||||
"position": {
|
||||
"x": 600.0,
|
||||
"y": 180.0
|
||||
},
|
||||
"size": {
|
||||
"width": 240.0,
|
||||
"height": 120.0
|
||||
},
|
||||
"collapsed": false
|
||||
}
|
||||
},
|
||||
"routes": [
|
||||
{
|
||||
"edge": "ea202922-0033-4000-8000-000000000020",
|
||||
"target_attachment": {
|
||||
"side": "Bottom",
|
||||
"offset": 0.25
|
||||
},
|
||||
"waypoints": [],
|
||||
"label": null
|
||||
}
|
||||
]
|
||||
},
|
||||
"ea202922-0033-4000-8000-000000000200": {
|
||||
"id": "ea202922-0033-4000-8000-000000000200",
|
||||
"alias": "readiness_view",
|
||||
"name": "03 Readiness — edit attachments",
|
||||
"description": "",
|
||||
"layer": "Sa",
|
||||
"projection": {
|
||||
"StateMachine": {
|
||||
"machine": "ea202922-0033-4000-8000-000000000031"
|
||||
}
|
||||
},
|
||||
"view_options": {
|
||||
"hidden_edges": [],
|
||||
"relation_kinds": "All",
|
||||
"work_categories": "All",
|
||||
"participant_categories": "All",
|
||||
"coverage": "All",
|
||||
"work_contexts": "All",
|
||||
"exchange_labels": "Name"
|
||||
},
|
||||
"nodes": {
|
||||
"ea202922-0033-4000-8000-000000000210": {
|
||||
"id": "ea202922-0033-4000-8000-000000000210",
|
||||
"alias": "readiness_view_readiness",
|
||||
"element": "ea202922-0033-4000-8000-000000000031",
|
||||
"position": {
|
||||
"x": 40.0,
|
||||
"y": 40.0
|
||||
},
|
||||
"size": {
|
||||
"width": 980.0,
|
||||
"height": 590.0
|
||||
},
|
||||
"collapsed": false
|
||||
},
|
||||
"ea202922-0033-4000-8000-000000000211": {
|
||||
"id": "ea202922-0033-4000-8000-000000000211",
|
||||
"alias": "readiness_view_main_region",
|
||||
"element": "ea202922-0033-4000-8000-000000000032",
|
||||
"position": {
|
||||
"x": 64.0,
|
||||
"y": 104.0
|
||||
},
|
||||
"size": {
|
||||
"width": 932.0,
|
||||
"height": 500.0
|
||||
},
|
||||
"collapsed": false
|
||||
},
|
||||
"ea202922-0033-4000-8000-000000000212": {
|
||||
"id": "ea202922-0033-4000-8000-000000000212",
|
||||
"alias": "readiness_view_start",
|
||||
"element": "ea202922-0033-4000-8000-000000000033",
|
||||
"position": {
|
||||
"x": 110.0,
|
||||
"y": 252.0
|
||||
},
|
||||
"size": {
|
||||
"width": 20.0,
|
||||
"height": 20.0
|
||||
},
|
||||
"collapsed": false
|
||||
},
|
||||
"ea202922-0033-4000-8000-000000000213": {
|
||||
"id": "ea202922-0033-4000-8000-000000000213",
|
||||
"alias": "readiness_view_ready",
|
||||
"element": "ea202922-0033-4000-8000-000000000034",
|
||||
"position": {
|
||||
"x": 190.0,
|
||||
"y": 210.0
|
||||
},
|
||||
"size": {
|
||||
"width": 240.0,
|
||||
"height": 120.0
|
||||
},
|
||||
"collapsed": false
|
||||
},
|
||||
"ea202922-0033-4000-8000-000000000214": {
|
||||
"id": "ea202922-0033-4000-8000-000000000214",
|
||||
"alias": "readiness_view_active",
|
||||
"element": "ea202922-0033-4000-8000-000000000035",
|
||||
"position": {
|
||||
"x": 570.0,
|
||||
"y": 210.0
|
||||
},
|
||||
"size": {
|
||||
"width": 240.0,
|
||||
"height": 140.0
|
||||
},
|
||||
"collapsed": false
|
||||
},
|
||||
"ea202922-0033-4000-8000-000000000215": {
|
||||
"id": "ea202922-0033-4000-8000-000000000215",
|
||||
"alias": "readiness_view_decision",
|
||||
"element": "ea202922-0033-4000-8000-000000000036",
|
||||
"position": {
|
||||
"x": 670.0,
|
||||
"y": 430.0
|
||||
},
|
||||
"size": {
|
||||
"width": 40.0,
|
||||
"height": 40.0
|
||||
},
|
||||
"collapsed": false
|
||||
},
|
||||
"ea202922-0033-4000-8000-000000000216": {
|
||||
"id": "ea202922-0033-4000-8000-000000000216",
|
||||
"alias": "readiness_view_finished",
|
||||
"element": "ea202922-0033-4000-8000-000000000037",
|
||||
"position": {
|
||||
"x": 880.0,
|
||||
"y": 440.0
|
||||
},
|
||||
"size": {
|
||||
"width": 24.0,
|
||||
"height": 24.0
|
||||
},
|
||||
"collapsed": false
|
||||
}
|
||||
},
|
||||
"routes": [
|
||||
{
|
||||
"edge": "ea202922-0033-4000-8000-000000000041",
|
||||
"source_attachment": {
|
||||
"side": "Right",
|
||||
"offset": 0.5
|
||||
},
|
||||
"target_attachment": {
|
||||
"side": "Left",
|
||||
"offset": 0.6
|
||||
},
|
||||
"waypoints": [
|
||||
{
|
||||
"x": 500.0,
|
||||
"y": 310.0
|
||||
}
|
||||
],
|
||||
"label": {
|
||||
"fraction": 0.5,
|
||||
"offset": {
|
||||
"x": 8.0,
|
||||
"y": -16.0
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"edge": "ea202922-0033-4000-8000-000000000040",
|
||||
"source_attachment": {
|
||||
"side": "Right",
|
||||
"offset": 0.5
|
||||
},
|
||||
"waypoints": [],
|
||||
"label": null
|
||||
},
|
||||
{
|
||||
"edge": "ea202922-0033-4000-8000-000000000044",
|
||||
"source_attachment": {
|
||||
"side": "Right",
|
||||
"offset": 0.5
|
||||
},
|
||||
"waypoints": [],
|
||||
"label": null
|
||||
}
|
||||
]
|
||||
},
|
||||
"ea202922-0033-4000-8000-000000000201": {
|
||||
"id": "ea202922-0033-4000-8000-000000000201",
|
||||
"alias": "readiness_reference",
|
||||
"name": "04 Readiness — untouched reference",
|
||||
"description": "",
|
||||
"layer": "Sa",
|
||||
"projection": {
|
||||
"StateMachine": {
|
||||
"machine": "ea202922-0033-4000-8000-000000000031"
|
||||
}
|
||||
},
|
||||
"view_options": {
|
||||
"hidden_edges": [],
|
||||
"relation_kinds": "All",
|
||||
"work_categories": "All",
|
||||
"participant_categories": "All",
|
||||
"coverage": "All",
|
||||
"work_contexts": "All",
|
||||
"exchange_labels": "Name"
|
||||
},
|
||||
"nodes": {
|
||||
"ea202922-0033-4000-8000-000000000230": {
|
||||
"id": "ea202922-0033-4000-8000-000000000230",
|
||||
"alias": "readiness_reference_readiness",
|
||||
"element": "ea202922-0033-4000-8000-000000000031",
|
||||
"position": {
|
||||
"x": 40.0,
|
||||
"y": 40.0
|
||||
},
|
||||
"size": {
|
||||
"width": 980.0,
|
||||
"height": 590.0
|
||||
},
|
||||
"collapsed": false
|
||||
},
|
||||
"ea202922-0033-4000-8000-000000000231": {
|
||||
"id": "ea202922-0033-4000-8000-000000000231",
|
||||
"alias": "readiness_reference_main_region",
|
||||
"element": "ea202922-0033-4000-8000-000000000032",
|
||||
"position": {
|
||||
"x": 64.0,
|
||||
"y": 104.0
|
||||
},
|
||||
"size": {
|
||||
"width": 932.0,
|
||||
"height": 500.0
|
||||
},
|
||||
"collapsed": false
|
||||
},
|
||||
"ea202922-0033-4000-8000-000000000232": {
|
||||
"id": "ea202922-0033-4000-8000-000000000232",
|
||||
"alias": "readiness_reference_start",
|
||||
"element": "ea202922-0033-4000-8000-000000000033",
|
||||
"position": {
|
||||
"x": 110.0,
|
||||
"y": 212.0
|
||||
},
|
||||
"size": {
|
||||
"width": 20.0,
|
||||
"height": 20.0
|
||||
},
|
||||
"collapsed": false
|
||||
},
|
||||
"ea202922-0033-4000-8000-000000000233": {
|
||||
"id": "ea202922-0033-4000-8000-000000000233",
|
||||
"alias": "readiness_reference_ready",
|
||||
"element": "ea202922-0033-4000-8000-000000000034",
|
||||
"position": {
|
||||
"x": 190.0,
|
||||
"y": 170.0
|
||||
},
|
||||
"size": {
|
||||
"width": 240.0,
|
||||
"height": 120.0
|
||||
},
|
||||
"collapsed": false
|
||||
},
|
||||
"ea202922-0033-4000-8000-000000000234": {
|
||||
"id": "ea202922-0033-4000-8000-000000000234",
|
||||
"alias": "readiness_reference_active",
|
||||
"element": "ea202922-0033-4000-8000-000000000035",
|
||||
"position": {
|
||||
"x": 570.0,
|
||||
"y": 170.0
|
||||
},
|
||||
"size": {
|
||||
"width": 240.0,
|
||||
"height": 140.0
|
||||
},
|
||||
"collapsed": false
|
||||
},
|
||||
"ea202922-0033-4000-8000-000000000235": {
|
||||
"id": "ea202922-0033-4000-8000-000000000235",
|
||||
"alias": "readiness_reference_decision",
|
||||
"element": "ea202922-0033-4000-8000-000000000036",
|
||||
"position": {
|
||||
"x": 670.0,
|
||||
"y": 430.0
|
||||
},
|
||||
"size": {
|
||||
"width": 40.0,
|
||||
"height": 40.0
|
||||
},
|
||||
"collapsed": false
|
||||
},
|
||||
"ea202922-0033-4000-8000-000000000236": {
|
||||
"id": "ea202922-0033-4000-8000-000000000236",
|
||||
"alias": "readiness_reference_finished",
|
||||
"element": "ea202922-0033-4000-8000-000000000037",
|
||||
"position": {
|
||||
"x": 880.0,
|
||||
"y": 440.0
|
||||
},
|
||||
"size": {
|
||||
"width": 24.0,
|
||||
"height": 24.0
|
||||
},
|
||||
"collapsed": false
|
||||
}
|
||||
},
|
||||
"routes": []
|
||||
},
|
||||
"ea202922-0033-4000-8000-000000000300": {
|
||||
"id": "ea202922-0033-4000-8000-000000000300",
|
||||
"alias": "ports_view",
|
||||
"name": "05 Status — semantic ports regression",
|
||||
"description": "",
|
||||
"layer": "Sa",
|
||||
"projection": "FunctionalDataflow",
|
||||
"view_options": {
|
||||
"hidden_edges": [],
|
||||
"relation_kinds": "All",
|
||||
"work_categories": "All",
|
||||
"participant_categories": "All",
|
||||
"coverage": "All",
|
||||
"work_contexts": "All",
|
||||
"exchange_labels": "Name"
|
||||
},
|
||||
"nodes": {
|
||||
"ea202922-0033-4000-8000-000000000310": {
|
||||
"id": "ea202922-0033-4000-8000-000000000310",
|
||||
"alias": "ports_emit",
|
||||
"element": "ea202922-0033-4000-8000-000000000050",
|
||||
"position": {
|
||||
"x": 100.0,
|
||||
"y": 180.0
|
||||
},
|
||||
"size": {
|
||||
"width": 240.0,
|
||||
"height": 120.0
|
||||
},
|
||||
"collapsed": false,
|
||||
"port_anchors": [
|
||||
{
|
||||
"port": "ea202922-0033-4000-8000-000000000052",
|
||||
"side": "Right",
|
||||
"offset": 0.5
|
||||
}
|
||||
]
|
||||
},
|
||||
"ea202922-0033-4000-8000-000000000311": {
|
||||
"id": "ea202922-0033-4000-8000-000000000311",
|
||||
"alias": "ports_display",
|
||||
"element": "ea202922-0033-4000-8000-000000000051",
|
||||
"position": {
|
||||
"x": 600.0,
|
||||
"y": 180.0
|
||||
},
|
||||
"size": {
|
||||
"width": 240.0,
|
||||
"height": 120.0
|
||||
},
|
||||
"collapsed": false,
|
||||
"port_anchors": [
|
||||
{
|
||||
"port": "ea202922-0033-4000-8000-000000000053",
|
||||
"side": "Left",
|
||||
"offset": 0.5
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"routes": []
|
||||
}
|
||||
},
|
||||
"artifact_links": {},
|
||||
"traces": {}
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
// Immutable acceptance baseline: copy before editing. Stable IDs are deliberate.
|
||||
arcadia 7;
|
||||
project endpoint_acceptance "Harbor dispatch — attachment acceptance" id "ea202922-0033-4000-8000-000000000001" {
|
||||
description "Small native fixture for presentation-only endpoint editing. Names describe stored source-to-target direction.";
|
||||
oa_activity receive_report "Receive distress report" id "ea202922-0033-4000-8000-000000000010" { }
|
||||
oa_activity dispatch_crew "Dispatch rescue crew" id "ea202922-0033-4000-8000-000000000011" { }
|
||||
interaction dispatch_request "Dispatch request: Receive → Dispatch" id "ea202922-0033-4000-8000-000000000020" { source @receive_report; target @dispatch_crew; description "Semantic sentinel: retain this description and direction."; }
|
||||
sa_system controller "Rescue readiness controller" id "ea202922-0033-4000-8000-000000000030" { }
|
||||
sa_state_machine readiness "Rescue readiness" id "ea202922-0033-4000-8000-000000000031" { parent @controller; }
|
||||
sa_region main_region "Readiness region" id "ea202922-0033-4000-8000-000000000032" { parent @readiness; }
|
||||
sa_initial start "Startup" id "ea202922-0033-4000-8000-000000000033" { parent @main_region; }
|
||||
sa_state ready "Ready" id "ea202922-0033-4000-8000-000000000034" { parent @main_region; }
|
||||
sa_state active "Active" id "ea202922-0033-4000-8000-000000000035" { parent @main_region; }
|
||||
sa_choice decision "Dispatch decision" id "ea202922-0033-4000-8000-000000000036" { parent @main_region; }
|
||||
sa_final finished "Shutdown complete" id "ea202922-0033-4000-8000-000000000037" { parent @main_region; }
|
||||
state_transition initialize "Initialize: Startup → Ready" id "ea202922-0033-4000-8000-000000000040" { source @start; target @ready; transition_kind External; triggers []; trigger ""; guard ""; effects []; effect ""; }
|
||||
state_transition activate "Activate: Ready → Active" id "ea202922-0033-4000-8000-000000000041" { source @ready; target @active; transition_kind External; triggers []; trigger ""; guard "crew_assigned"; effects []; effect ""; }
|
||||
state_transition assess "Assess: Active → Decision" id "ea202922-0033-4000-8000-000000000042" { source @active; target @decision; transition_kind External; triggers []; trigger ""; guard ""; effects []; effect ""; }
|
||||
state_transition retry "Retry: Decision → Ready" id "ea202922-0033-4000-8000-000000000043" { source @decision; target @ready; transition_kind External; triggers []; trigger ""; guard "retry_requested"; effects []; effect ""; }
|
||||
state_transition finish "Finish: Decision → Shutdown" id "ea202922-0033-4000-8000-000000000044" { source @decision; target @finished; transition_kind External; triggers []; trigger ""; guard "else"; effects []; effect ""; }
|
||||
state_transition refresh "Refresh: Active → Active" id "ea202922-0033-4000-8000-000000000045" { source @active; target @active; transition_kind External; triggers []; trigger ""; guard "refresh_requested"; effects []; effect ""; }
|
||||
state_transition internal_check "Internal status check" id "ea202922-0033-4000-8000-000000000046" { source @active; target @active; transition_kind Internal; triggers []; trigger ""; guard ""; effects []; effect "Status unchanged"; }
|
||||
sa_function emit_status "Emit readiness status" id "ea202922-0033-4000-8000-000000000050" { }
|
||||
sa_function display_status "Display readiness status" id "ea202922-0033-4000-8000-000000000051" { }
|
||||
sa_port status_out "Status output" id "ea202922-0033-4000-8000-000000000052" { parent @emit_status; contract { FunctionOutput { outgoing_items []; }; }; }
|
||||
sa_port status_in "Status input" id "ea202922-0033-4000-8000-000000000053" { parent @display_status; contract { FunctionInput { incoming_items []; }; }; }
|
||||
functional_exchange status_exchange "Readiness status: Emit → Display" id "ea202922-0033-4000-8000-000000000054" { source @emit_status; target @display_status; source_port @status_out; target_port @status_in; items []; }
|
||||
diagram dispatch_view "01 Dispatch — edit attachments" id "ea202922-0033-4000-8000-000000000100" { layer Oa; projection FunctionalDataflow; routes [{ edge @dispatch_request; waypoints [{ x 440; y 340; }]; label { fraction 0.5; offset { x 12; y -18; }; }; source_attachment { side Right; offset 0.5; }; target_attachment { side Left; offset 0.6; }; }]; }
|
||||
diagram dispatch_reference "02 Dispatch — untouched reference" id "ea202922-0033-4000-8000-000000000101" { layer Oa; projection FunctionalDataflow; routes [{ edge @dispatch_request; target_attachment { side Bottom; offset 0.25; }; }]; }
|
||||
node dispatch_view_receive id "ea202922-0033-4000-8000-000000000110" { diagram @dispatch_view; element @receive_report; position { x 100; y 180; }; size { width 240; height 120; }; collapsed false; }
|
||||
node dispatch_view_dispatch id "ea202922-0033-4000-8000-000000000111" { diagram @dispatch_view; element @dispatch_crew; position { x 600; y 180; }; size { width 240; height 120; }; collapsed false; }
|
||||
node dispatch_reference_receive id "ea202922-0033-4000-8000-000000000120" { diagram @dispatch_reference; element @receive_report; position { x 100; y 180; }; size { width 240; height 120; }; collapsed false; }
|
||||
node dispatch_reference_dispatch id "ea202922-0033-4000-8000-000000000121" { diagram @dispatch_reference; element @dispatch_crew; position { x 600; y 180; }; size { width 240; height 120; }; collapsed false; }
|
||||
diagram readiness_view "03 Readiness — edit attachments" id "ea202922-0033-4000-8000-000000000200" { layer Sa; projection { StateMachine { machine @readiness; }; }; routes [{ edge @activate; waypoints [{ x 500; y 310; }]; label { fraction 0.5; offset { x 8; y -16; }; }; source_attachment { side Right; offset 0.5; }; target_attachment { side Left; offset 0.6; }; }, { edge @initialize; source_attachment { side Right; offset 0.5; }; }, { edge @finish; source_attachment { side Right; offset 0.5; }; }]; }
|
||||
diagram readiness_reference "04 Readiness — untouched reference" id "ea202922-0033-4000-8000-000000000201" { layer Sa; projection { StateMachine { machine @readiness; }; }; routes []; }
|
||||
node readiness_view_readiness id "ea202922-0033-4000-8000-000000000210" { diagram @readiness_view; element @readiness; position { x 40; y 40; }; size { width 980; height 590; }; collapsed false; }
|
||||
node readiness_view_main_region id "ea202922-0033-4000-8000-000000000211" { diagram @readiness_view; element @main_region; position { x 64; y 104; }; size { width 932; height 500; }; collapsed false; }
|
||||
node readiness_view_start id "ea202922-0033-4000-8000-000000000212" { diagram @readiness_view; element @start; position { x 110; y 252; }; size { width 20; height 20; }; collapsed false; }
|
||||
node readiness_view_ready id "ea202922-0033-4000-8000-000000000213" { diagram @readiness_view; element @ready; position { x 190; y 210; }; size { width 240; height 120; }; collapsed false; }
|
||||
node readiness_view_active id "ea202922-0033-4000-8000-000000000214" { diagram @readiness_view; element @active; position { x 570; y 210; }; size { width 240; height 140; }; collapsed false; }
|
||||
node readiness_view_decision id "ea202922-0033-4000-8000-000000000215" { diagram @readiness_view; element @decision; position { x 670; y 430; }; size { width 40; height 40; }; collapsed false; }
|
||||
node readiness_view_finished id "ea202922-0033-4000-8000-000000000216" { diagram @readiness_view; element @finished; position { x 880; y 440; }; size { width 24; height 24; }; collapsed false; }
|
||||
node readiness_reference_readiness id "ea202922-0033-4000-8000-000000000230" { diagram @readiness_reference; element @readiness; position { x 40; y 40; }; size { width 980; height 590; }; collapsed false; }
|
||||
node readiness_reference_main_region id "ea202922-0033-4000-8000-000000000231" { diagram @readiness_reference; element @main_region; position { x 64; y 104; }; size { width 932; height 500; }; collapsed false; }
|
||||
node readiness_reference_start id "ea202922-0033-4000-8000-000000000232" { diagram @readiness_reference; element @start; position { x 110; y 212; }; size { width 20; height 20; }; collapsed false; }
|
||||
node readiness_reference_ready id "ea202922-0033-4000-8000-000000000233" { diagram @readiness_reference; element @ready; position { x 190; y 170; }; size { width 240; height 120; }; collapsed false; }
|
||||
node readiness_reference_active id "ea202922-0033-4000-8000-000000000234" { diagram @readiness_reference; element @active; position { x 570; y 170; }; size { width 240; height 140; }; collapsed false; }
|
||||
node readiness_reference_decision id "ea202922-0033-4000-8000-000000000235" { diagram @readiness_reference; element @decision; position { x 670; y 430; }; size { width 40; height 40; }; collapsed false; }
|
||||
node readiness_reference_finished id "ea202922-0033-4000-8000-000000000236" { diagram @readiness_reference; element @finished; position { x 880; y 440; }; size { width 24; height 24; }; collapsed false; }
|
||||
diagram ports_view "05 Status — semantic ports regression" id "ea202922-0033-4000-8000-000000000300" { layer Sa; projection FunctionalDataflow; routes []; }
|
||||
node ports_emit id "ea202922-0033-4000-8000-000000000310" { diagram @ports_view; element @emit_status; position { x 100; y 180; }; size { width 240; height 120; }; collapsed false; port_anchors [{ port @status_out; side Right; offset 0.5; }]; }
|
||||
node ports_display id "ea202922-0033-4000-8000-000000000311" { diagram @ports_view; element @display_status; position { x 600; y 180; }; size { width 240; height 120; }; collapsed false; port_anchors [{ port @status_in; side Left; offset 0.5; }]; }
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
Validated 49 objects and 5 views; saved a complete Project snapshot
|
||||
@@ -0,0 +1,31 @@
|
||||
// Evidence serialization only. Root supplies a freshly observed Sky state.
|
||||
globalThis.captureEscapeState = async function(name, note, currentState) {
|
||||
if (!/^[a-zA-Z0-9_-]+$/.test(name)) throw Error('Invalid capture name');
|
||||
if (!currentState?.screenshots?.length) throw Error('Fresh screenshot required');
|
||||
const root = 'C:/Users/User/Documents/Git/ARCADIA-Studio/.local/edge-anchors-escape-native-20260923';
|
||||
const run = globalThis.escapeRunRoot;
|
||||
if (!run || !run.startsWith(root+'/runs/run-')) throw Error('Bind current run first');
|
||||
const file = await import('node:fs/promises');
|
||||
const crypto = await import('node:crypto');
|
||||
const hash = bytes => crypto.createHash('sha256').update(bytes).digest('hex');
|
||||
const launchBytes = await file.readFile(run+'/launch.json');
|
||||
const launch = JSON.parse(launchBytes.toString('utf8').replace(/^\uFEFF/,''));
|
||||
const manifestBytes = await file.readFile(root+'/input-manifest.json');
|
||||
if (hash(manifestBytes) !== launch.manifest_sha256) throw Error('Manifest changed');
|
||||
const working = await file.readFile(root+'/working/attachments.arcadia');
|
||||
const dir = run+'/captures';
|
||||
await file.mkdir(dir,{recursive:true});
|
||||
const images=[];
|
||||
for (let i=0;i<currentState.screenshots.length;i++) {
|
||||
const s=currentState.screenshots[i];
|
||||
const mime=s.url.slice(5,s.url.indexOf(';'));
|
||||
if (!['image/jpeg','image/png'].includes(mime)) throw Error('Unexpected image type');
|
||||
const bytes=Buffer.from(s.url.split(',')[1],'base64');
|
||||
const filename=name+(i ? '-'+i : '')+(mime==='image/jpeg'?'.jpg':'.png');
|
||||
await file.writeFile(dir+'/'+filename,bytes,{flag:'wx'});
|
||||
images.push({file:filename,id:s.id,width:s.width,height:s.height,originX:s.originX,originY:s.originY,zIndex:s.zIndex,mime,bytes:bytes.length,sha256:hash(bytes)});
|
||||
}
|
||||
const record={utc:new Date().toISOString(),source_commit:launch.source_commit,launch_sha256:hash(launchBytes),pid:launch.pid,process_started_utc:launch.started_utc,manifest_sha256:launch.manifest_sha256,window:currentState.window,images,working_source_sha256:hash(working),note};
|
||||
await file.writeFile(dir+'/'+name+'.json',JSON.stringify(record,null,2)+'\n',{flag:'wx'});
|
||||
return {name,images:images.length,source_commit:record.source_commit};
|
||||
};
|
||||
@@ -0,0 +1,40 @@
|
||||
"""Snapshot a saved source and compare its complete Project with a predeclared checkpoint."""
|
||||
from pathlib import Path
|
||||
import argparse, datetime, json, subprocess, sys
|
||||
sys.dont_write_bytecode=True
|
||||
from stage import HERE, child_env, copy_new, read, record, verify, write
|
||||
|
||||
def main():
|
||||
parser=argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument('--expected',required=True,choices=['B','A1'])
|
||||
parser.add_argument('--output-prefix',required=True,type=Path)
|
||||
parser.add_argument('--actual',type=Path,default=HERE/'working/attachments.arcadia')
|
||||
args=parser.parse_args(); prefix=args.output_prefix.resolve()
|
||||
outputs={suffix:Path(str(prefix)+suffix) for suffix in ('.arcadia','.project.json','.stdout.log','.stderr.log','.receipt.json')}
|
||||
if any(path.exists() for path in outputs.values()): raise RuntimeError('Fresh output prefix required')
|
||||
stage=read(HERE/'staging-record.json'); verify(stage['manifest']); manifest=read(HERE/'input-manifest.json')
|
||||
if stage['source_commit']!=manifest['source_commit']: raise RuntimeError('Stage pin mismatch')
|
||||
for item in manifest['immutable_files']: verify(item)
|
||||
expected=read(HERE/'expected/catalog.json')['checkpoints'][args.expected]; verify(expected)
|
||||
prefix.parent.mkdir(parents=True,exist_ok=True)
|
||||
actual=record(args.actual); copy_new(args.actual,outputs['.arcadia'])
|
||||
started=datetime.datetime.now(datetime.timezone.utc).isoformat(); failure=None; exit_code=None; exact=False; unchanged=False
|
||||
try:
|
||||
with outputs['.stdout.log'].open('xb') as stdout, outputs['.stderr.log'].open('xb') as stderr:
|
||||
proc=subprocess.run([manifest['evaluator']['path'],str(outputs['.arcadia']),str(outputs['.project.json'])],cwd=HERE/'unrelated-cwd',env=child_env(),stdout=stdout,stderr=stderr)
|
||||
exit_code=proc.returncode
|
||||
if exit_code: raise RuntimeError('Snapshot evaluator failed')
|
||||
if outputs['.stderr.log'].stat().st_size: raise RuntimeError('Snapshot stderr is not empty')
|
||||
# Compare complete JSON including exact fields/types; formatting/key order alone are ignored.
|
||||
canonical=lambda value:json.dumps(value,sort_keys=True,ensure_ascii=False,separators=(',',':'),allow_nan=False)
|
||||
exact=canonical(read(outputs['.project.json']))==canonical(read(expected['path']))
|
||||
if not exact: failure='Complete Project differs from predeclared '+args.expected
|
||||
verify(actual)
|
||||
for item in manifest['immutable_files']: verify(item)
|
||||
verify(stage['manifest']); unchanged=True
|
||||
except Exception as error: failure=str(error)
|
||||
artifacts=[record(path) for suffix,path in outputs.items() if suffix!='.receipt.json' and path.exists()]
|
||||
write(outputs['.receipt.json'],{'source_commit':manifest['source_commit'],'evaluator_source_commit':manifest['evaluator_source_commit'],'started_utc':started,'finished_utc':datetime.datetime.now(datetime.timezone.utc).isoformat(),'expected':args.expected,'expected_file':expected,'input':actual,'evaluator':manifest['evaluator'],'manifest':stage['manifest'],'exit_code':exit_code,'failure':failure,'inputs_unchanged':unchanged,'full_project_exact':exact,'artifacts':artifacts,'scope':'Complete saved Project only; no native action/editor/history/camera claim'})
|
||||
if failure or not exact or not unchanged: raise SystemExit('Comparison failed; preserve outputs: '+str(failure))
|
||||
print(args.expected+': complete saved Project exact; inputs unchanged')
|
||||
if __name__=='__main__':main()
|
||||
@@ -0,0 +1,60 @@
|
||||
#Requires -Version 7.0
|
||||
param([ValidateRange(1,99)][int]$Run=1)
|
||||
$ErrorActionPreference='Stop'
|
||||
. (Join-Path $PSScriptRoot 'verify.ps1')
|
||||
$manifestPath=Join-Path $PSScriptRoot 'input-manifest.json'
|
||||
$stagePath=Join-Path $PSScriptRoot 'staging-record.json'
|
||||
$manifest=Read-NativeJson $manifestPath
|
||||
$stage=Read-NativeJson $stagePath
|
||||
if ($manifest.source_commit -notmatch '^[0-9a-f]{40}$' -or $stage.source_commit -cne $manifest.source_commit) { throw 'Wrong staged candidate' }
|
||||
Assert-NativeFiles @($stage.manifest)
|
||||
Assert-NativeFiles $manifest.immutable_files
|
||||
$stageHash=Get-NativeHash $stagePath
|
||||
$working=Join-Path $PSScriptRoot 'working/attachments.arcadia'
|
||||
$runRoot=Join-Path $PSScriptRoot ('runs/run-{0:d2}' -f $Run)
|
||||
$profile=Join-Path $PSScriptRoot 'profile'
|
||||
$cwd=Join-Path $PSScriptRoot 'unrelated-cwd'
|
||||
$previousHash=$null
|
||||
if (Test-Path -LiteralPath $runRoot) { throw 'Never overwrite existing run evidence' }
|
||||
if ($Run -eq 1) {
|
||||
if (Test-Path -LiteralPath (Join-Path $PSScriptRoot 'runs')) { throw 'First run requires fresh runs directory' }
|
||||
Assert-NativeFiles @($manifest.initial_working)
|
||||
foreach($dir in @($profile,$cwd)) { if (-not (Test-Path -LiteralPath $dir -PathType Container) -or @(Get-ChildItem -LiteralPath $dir -Force).Count) { throw 'First run requires staged empty private directories' } }
|
||||
} else {
|
||||
$prior=Join-Path $PSScriptRoot ('runs/run-{0:d2}' -f ($Run-1))
|
||||
$priorClose=Read-NativeJson (Join-Path $prior 'normal-close.json')
|
||||
$priorLaunch=Read-NativeJson (Join-Path $prior 'launch.json')
|
||||
if ($priorClose.exit_code -ne 0 -or $priorClose.stdout.bytes -ne 0 -or $priorClose.stderr.bytes -ne 0 -or -not $priorClose.immutable_inputs_unchanged -or $priorClose.source_commit -cne $manifest.source_commit -or $priorClose.launch_sha256 -cne (Get-NativeHash (Join-Path $prior 'launch.json')) -or $priorLaunch.manifest_sha256 -cne (Get-NativeHash $manifestPath) -or $priorLaunch.pid -ne $priorClose.pid -or $priorLaunch.started_utc -cne $priorClose.started_utc) { throw 'Previous successful bound close required' }
|
||||
Assert-NativeFiles @($priorClose.working_file,$priorClose.stdout,$priorClose.stderr)
|
||||
$previousHash=Get-NativeHash (Join-Path $prior 'normal-close.json')
|
||||
}
|
||||
$package=Join-Path $PSScriptRoot 'package'
|
||||
$childPath=$package+';'+(Join-Path $env:SystemRoot 'System32')+';'+$env:SystemRoot+';'+(Join-Path $env:SystemRoot 'System32/Wbem')
|
||||
$state=[ordered]@{run=$Run;source_commit=$manifest.source_commit;evaluator_source_commit=$manifest.evaluator_source_commit;manifest_sha256=(Get-NativeHash $manifestPath);staging_sha256=$stageHash;script_sha256=(Get-NativeHash $PSCommandPath);native_plan_sha256=$manifest.native_plan_sha256;previous_close_sha256=$previousHash;binary=$manifest.binary;runtime=$manifest.runtime;working_file_before=(Get-NativeRecord $working);localappdata=$profile;working_directory=$cwd;child_path=$childPath;arguments=@();pid=$null;started_utc=$null;environment_scope='Child ProcessStartInfo only'}
|
||||
$process=$null;$outStream=$null;$errStream=$null
|
||||
try {
|
||||
[void][IO.Directory]::CreateDirectory((Join-Path $runRoot 'logs'))
|
||||
$stdout=Join-Path $runRoot 'logs/studio.stdout.log';$stderr=Join-Path $runRoot 'logs/studio.stderr.log'
|
||||
$outStream=[IO.File]::Open($stdout,[IO.FileMode]::CreateNew,[IO.FileAccess]::Write,[IO.FileShare]::Read)
|
||||
$errStream=[IO.File]::Open($stderr,[IO.FileMode]::CreateNew,[IO.FileAccess]::Write,[IO.FileShare]::Read)
|
||||
$info=[Diagnostics.ProcessStartInfo]::new();$info.FileName=$manifest.binary.path;$info.WorkingDirectory=$cwd;$info.UseShellExecute=$false;$info.CreateNoWindow=$true;$info.WindowStyle=[Diagnostics.ProcessWindowStyle]::Hidden;$info.RedirectStandardOutput=$true;$info.RedirectStandardError=$true
|
||||
$info.Environment['LOCALAPPDATA']=$profile;$info.Environment['PATH']=$childPath
|
||||
$process=[Diagnostics.Process]::new();$process.StartInfo=$info
|
||||
if (-not $process.Start()) { throw 'Process start failed' }
|
||||
$outCopy=$process.StandardOutput.BaseStream.CopyToAsync($outStream);$errCopy=$process.StandardError.BaseStream.CopyToAsync($errStream)
|
||||
$state.pid=$process.Id;$state.started_utc=$process.StartTime.ToUniversalTime().ToString('o')
|
||||
Write-NativeJson (Join-Path $runRoot 'launch.json') $state
|
||||
$state|ConvertTo-Json -Depth 15|Write-Output
|
||||
$process.WaitForExit();[Threading.Tasks.Task]::WaitAll([Threading.Tasks.Task[]]@($outCopy,$errCopy))
|
||||
$outStream.Flush($true);$errStream.Flush($true);$outStream.Dispose();$outStream=$null;$errStream.Dispose();$errStream=$null
|
||||
$unchanged=$true;$verificationError=$null
|
||||
try { Assert-NativeFiles $manifest.immutable_files; Assert-NativeFiles @($stage.manifest);if ((Get-NativeHash $stagePath) -cne $stageHash) {throw 'Staging receipt changed'} } catch {$unchanged=$false;$verificationError=$_.Exception.Message}
|
||||
Write-NativeJson (Join-Path $runRoot 'normal-close.json') ([ordered]@{run=$Run;source_commit=$manifest.source_commit;evaluator_source_commit=$manifest.evaluator_source_commit;launch_sha256=(Get-NativeHash (Join-Path $runRoot 'launch.json'));pid=$state.pid;started_utc=$state.started_utc;observed_exit_utc=[DateTime]::UtcNow.ToString('o');exit_code=$process.ExitCode;immutable_inputs_unchanged=$unchanged;verification_error=$verificationError;baseline_file=(Get-NativeRecord (Join-Path $PSScriptRoot 'baseline/attachments.arcadia'));working_file=(Get-NativeRecord $working);stdout=(Get-NativeRecord $stdout);stderr=(Get-NativeRecord $stderr);scope='Observed process exit only; close cause and native interaction acceptance require root observation. No forced termination by observer.'})
|
||||
if (-not $unchanged) {throw $verificationError}
|
||||
if ($process.ExitCode -ne 0 -or (Get-Item -LiteralPath $stdout).Length -ne 0 -or (Get-Item -LiteralPath $stderr).Length -ne 0) {throw 'Nonzero process exit or nonempty GUI logs; preserve evidence and investigate'}
|
||||
} catch {
|
||||
Write-NativeJson (Join-Path $runRoot 'observer-failure.json') ([ordered]@{utc=[DateTime]::UtcNow.ToString('o');pid=$state.pid;error=$_.Exception.Message;owned_process_not_killed=$true})
|
||||
throw
|
||||
} finally {
|
||||
if ($null -ne $outStream) {$outStream.Dispose()};if ($null -ne $errStream) {$errStream.Dispose()};if ($null -ne $process) {$process.Dispose()}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
# Corrected State attachment Escape trial
|
||||
|
||||
Candidate: 53d01a3d4451b94792986f2dfac56f6f04e111a4. This is a bounded native revalidation after the original 3aa80de immediate post-menu Escape finding. The original active Run 2 is untouched.
|
||||
|
||||
Package GUI is the preserved gate artifact (SHA-256 9c7aa0249378cec31639bbbff5ea7b3eaab782333d1637b8ab5e8f3be5d65d2c). Core evaluator is reused from 3aa80de; core tree, Cargo manifests and lockfile are unchanged. Relocation and evaluator receipts state their separate provenance. Shared target executables are not live bindings of this stage.
|
||||
|
||||
Start a fresh observer with `pwsh -File launch.ps1 -Run 1`. Open this stage's `working/attachments.arcadia` using the native file dialog. Baseline is the original frozen authored fixture B, not an original-run saved working file.
|
||||
|
||||
1. Open the State view and select Activate. From its context menu choose Adjust source attachment. Capture armed tool/guidance. Press Escape immediately, without a canvas click. Capture Select / move and removed attachment guidance. Save; compare B.
|
||||
2. Repeat using Adjust target attachment, again with no intervening canvas click. Save; compare B. These two observations supply the native cancellation claim; saved JSON alone does not.
|
||||
3. Arm source attachment and drag Activate's source to Top, offset .25. Save; compare A1. A1 differs from B only in diagram200 relation41 source_attachment. Capture the placed handle and resulting source evidence.
|
||||
4. With canvas/model history ownership, one Undo then Save must compare B; one Redo then Save must compare A1. Record focus and actions, not only resulting snapshots.
|
||||
5. Choose final B (one Undo) or A1 (retain Redo) explicitly in the action record, Save and compare that predetermined catalog name. Close normally. The observer must record exit0 and empty logs. Do not force-close.
|
||||
6. Start `launch.ps1 -Run 2` using the same corrected stage. Reopen the saved working file and compare the same chosen final expected name. Record actual reopen and normal close separately.
|
||||
|
||||
For each closed saved checkpoint: `python check.py --expected B --output-prefix runs/run-01/comparisons/01-source-escape` (use A1 where declared). Output prefixes must be fresh. The checker copies the saved source, invokes the pinned evaluator, compares complete Project JSON, and writes hash-bound receipts. Expectations must not be adapted to observations.
|
||||
|
||||
Load capture.js in the authorized GUI tool session and set `escapeRunRoot` to the exact current run directory. `captureEscapeState(name, note, freshlyObservedState)` writes create-new images/metadata bound to launch PID, start time, manifest and working-source hash. Root owns actual GUI inputs, immediate reobservations, focus/history attribution and close cause.
|
||||
|
||||
This package does not claim broader attachment acceptance, modal/keyboard accessibility coverage, another platform, or continuous input immutability. Its preparation does not launch the GUI or rerun a compiler.
|
||||
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"source_commit": "53d01a3d4451b94792986f2dfac56f6f04e111a4",
|
||||
"original_gate_output": {
|
||||
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\target\\debug\\arcadia-studio.exe",
|
||||
"bytes": 117221376,
|
||||
"sha256": "9c7aa0249378cec31639bbbff5ea7b3eaab782333d1637b8ab5e8f3be5d65d2c"
|
||||
},
|
||||
"preserved_artifact": {
|
||||
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-gates-20260923\\artifacts\\arcadia-studio.exe",
|
||||
"bytes": 117221376,
|
||||
"sha256": "9c7aa0249378cec31639bbbff5ea7b3eaab782333d1637b8ab5e8f3be5d65d2c"
|
||||
},
|
||||
"package": {
|
||||
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-native-20260923\\package\\arcadia-studio.exe",
|
||||
"bytes": 117221376,
|
||||
"sha256": "9c7aa0249378cec31639bbbff5ea7b3eaab782333d1637b8ab5e8f3be5d65d2c"
|
||||
},
|
||||
"reason": "The corrected build overwrote a shared target output transitively bound by the original native stage. Parent preserved this exact corrected artifact, then restored the original target from its old staged package. This stage binds the preserved artifact, never the mutable shared target.",
|
||||
"incident": {
|
||||
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-native-20260922\\runs\\run-02\\shared-build-artifact-incident.json",
|
||||
"bytes": 1051,
|
||||
"sha256": "bacd25b20a2f3a88a87958e69a2382d78557fba95a4adc80b0eb5d3e316c703b"
|
||||
},
|
||||
"original_active_run_untouched": true
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"source_commit": "53d01a3d4451b94792986f2dfac56f6f04e111a4",
|
||||
"evaluator_source_commit": "3aa80de89c5b79200286926781e8f3a192bc61f4",
|
||||
"evaluator": {
|
||||
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-native-20260922\\package\\attachment_snapshot.exe",
|
||||
"bytes": 18957824,
|
||||
"sha256": "4062f5f1301cb39c182ede32dfa928cdb75a14159c3660a375205d680388b110"
|
||||
},
|
||||
"original_gate": {
|
||||
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchor-gates-20260922\\frozen-02\\result.json",
|
||||
"bytes": 6353,
|
||||
"sha256": "25c3534d9f05c8c06356f0a31fd95e01712fe2dddc01887ea4ba11b7e6ec5643"
|
||||
},
|
||||
"same_committed_paths": [
|
||||
"crates/oa-core",
|
||||
"Cargo.lock",
|
||||
"Cargo.toml"
|
||||
],
|
||||
"scope": "Original admitted core evaluator reused for full Project parsing; no corrected evaluator build claim"
|
||||
}
|
||||
@@ -0,0 +1,101 @@
|
||||
"""Prepare immutable native inputs after a clean, successful frozen gate; never launch GUI."""
|
||||
from pathlib import Path
|
||||
import argparse, copy, datetime, hashlib, json, os, shutil, subprocess
|
||||
|
||||
HERE = Path(__file__).resolve().parent
|
||||
RUNTIME_SHA = 'aa282fa47bb2c4e210cea5e470cdbdca58568f0be0bc73e404d86ab9cd95ef6a'
|
||||
def record(path):
|
||||
path = Path(path).resolve(); data = path.read_bytes()
|
||||
return dict(path=str(path), bytes=len(data), sha256=hashlib.sha256(data).hexdigest())
|
||||
def read(path): return json.loads(Path(path).read_text(encoding='utf-8-sig'))
|
||||
def verify(item):
|
||||
actual = record(item['path'])
|
||||
if any(actual[k] != item[k] for k in ('bytes', 'sha256')): raise RuntimeError('Changed bound file: '+item['path'])
|
||||
def write(path, value):
|
||||
with Path(path).open('x', encoding='utf-8', newline='\n') as out:
|
||||
json.dump(value, out, indent=2, ensure_ascii=False); out.write('\n')
|
||||
def copy_new(source, target):
|
||||
with Path(source).open('rb') as src, Path(target).open('xb') as dest: shutil.copyfileobj(src, dest)
|
||||
if record(source)['sha256'] != record(target)['sha256']: raise RuntimeError('Copy mismatch')
|
||||
def child_env():
|
||||
env = os.environ.copy(); root = os.environ['SystemRoot']
|
||||
env['PATH'] = str(HERE/'package')+';'+root+'/System32;'+root
|
||||
env['LOCALAPPDATA'] = str(HERE/'profile')
|
||||
return env
|
||||
|
||||
def main():
|
||||
root=HERE.parent.parent
|
||||
repo=HERE.parent/'edge-anchors-escape-20260923'
|
||||
gates=HERE.parent/'edge-anchors-escape-gates-20260923'
|
||||
original=HERE.parent/'edge-anchors-native-20260922'
|
||||
pin='53d01a3d4451b94792986f2dfac56f6f04e111a4'
|
||||
base='3aa80de89c5b79200286926781e8f3a192bc61f4'
|
||||
def git(*args): return subprocess.check_output(['git','-c','core.longpaths=true',*args],cwd=repo)
|
||||
if git('rev-parse','HEAD').decode().strip()!=pin or git('status','--porcelain'): raise RuntimeError('Exact clean corrected source required')
|
||||
for name in ('package','baseline','working','profile','unrelated-cwd','expected','provenance','input-manifest.json','staging-record.json','runs'):
|
||||
if (HERE/name).exists(): raise RuntimeError('Fresh stage only: '+name)
|
||||
summary=read(gates/'summary.json'); commit=read(gates/'commit-readback.json')
|
||||
if commit['source_commit']!=pin or summary['base_source_commit']!=base: raise RuntimeError('Gate/commit mismatch')
|
||||
bound=[record(gates/'summary.json'),record(gates/'commit-readback.json')]
|
||||
inputs=read(summary['source_manifest']['path']);verify(summary['source_manifest'])
|
||||
for item in inputs: verify(item);bound.append(item)
|
||||
for step in ('targeted-01','desktop-01','clippy-01','build-01','toolchain'):
|
||||
result=read(gates/step/'result.json')
|
||||
if result['exit_code']!=0 or not result['inputs_unchanged']: raise RuntimeError('Failed corrected gate')
|
||||
if inputs!=read(gates/step/'inputs-before.json') or inputs!=read(gates/step/'inputs-after.json'): raise RuntimeError('Corrected gate source differs')
|
||||
verify(result['log']);verify(result['runner'])
|
||||
bound.extend(record(p) for p in sorted((gates/step).iterdir()) if p.is_file())
|
||||
bound.append(result['runner'])
|
||||
for item in commit['source_files']:
|
||||
raw=(repo/item['path']).read_bytes()
|
||||
if hashlib.sha256(raw).hexdigest()!=item['raw_sha256'] or git('show',pin+':'+item['path'])!=raw: raise RuntimeError('Committed tested bytes differ')
|
||||
preserved=commit['preserved_binary'];verify(preserved)
|
||||
if preserved['sha256']!=summary['binary']['sha256']: raise RuntimeError('Relocated build mismatch')
|
||||
bound.append(preserved)
|
||||
previous=read(original/'input-manifest.json'); previous_stage=read(original/'staging-record.json');verify(previous_stage['manifest'])
|
||||
if previous['source_commit']!=base or previous['evaluator_source_commit']!=base: raise RuntimeError('Original evaluator pin differs')
|
||||
evaluator=previous['evaluator']; runtime=previous['runtime'];verify(evaluator);verify(runtime)
|
||||
if runtime['sha256']!=RUNTIME_SHA: raise RuntimeError('Runtime mismatch')
|
||||
oldgate=Path(previous['gate']);oldresult=read(oldgate/'result.json')
|
||||
if not oldresult['passed'] or not oldresult['inputs_unchanged']: raise RuntimeError('Original gate failed')
|
||||
admitted=[e for e in oldresult['outputs'] if Path(e['path']).name=='attachment_snapshot.exe']
|
||||
if len(admitted)!=1 or admitted[0]['sha256']!=evaluator['sha256']: raise RuntimeError('Evaluator does not match original gate')
|
||||
# Compare committed core/build inputs; GUI-only repair does not rebuild this evaluator.
|
||||
core_paths=('crates/oa-core','Cargo.lock','Cargo.toml')
|
||||
for path in core_paths:
|
||||
if git('rev-parse',base+':'+path)!=git('rev-parse',pin+':'+path): raise RuntimeError('Evaluator reuse source changed')
|
||||
bound.extend([record(original/'input-manifest.json'),record(original/'staging-record.json'),record(oldgate/'result.json'),evaluator,runtime])
|
||||
baseline=original/'baseline/attachments.arcadia'
|
||||
admitted_baseline=next(e for e in previous['immutable_files'] if Path(e['path'])==baseline)
|
||||
verify(admitted_baseline);bound.append(admitted_baseline)
|
||||
incident=original/'runs/run-02/shared-build-artifact-incident.json';bound.append(record(incident))
|
||||
for name in ('stage.py','check.py','launch.ps1','verify.ps1','capture.js','native-plan.md'):bound.append(record(HERE/name))
|
||||
for name in ('package','baseline','working','profile','unrelated-cwd','expected','provenance'):(HERE/name).mkdir()
|
||||
copy_new(preserved['path'],HERE/'package/arcadia-studio.exe')
|
||||
copy_new(evaluator['path'],HERE/'package/attachment_snapshot.exe')
|
||||
copy_new(runtime['path'],HERE/'package/libunwind.dll')
|
||||
copy_new(baseline,HERE/'baseline/attachments.arcadia');copy_new(baseline,HERE/'working/attachments.arcadia')
|
||||
write(HERE/'provenance/binary-relocation.json',{'source_commit':pin,'original_gate_output':summary['binary'],'preserved_artifact':preserved,'package':record(HERE/'package/arcadia-studio.exe'),'reason':'The corrected build overwrote a shared target output transitively bound by the original native stage. Parent preserved this exact corrected artifact, then restored the original target from its old staged package. This stage binds the preserved artifact, never the mutable shared target.','incident':record(incident),'original_active_run_untouched':True})
|
||||
write(HERE/'provenance/evaluator-reuse.json',{'source_commit':pin,'evaluator_source_commit':base,'evaluator':evaluator,'original_gate':record(oldgate/'result.json'),'same_committed_paths':list(core_paths),'scope':'Original admitted core evaluator reused for full Project parsing; no corrected evaluator build claim'})
|
||||
with (HERE/'baseline/stdout.log').open('xb') as stdout,(HERE/'baseline/stderr.log').open('xb') as stderr:
|
||||
result=subprocess.run([str(HERE/'package/attachment_snapshot.exe'),str(HERE/'baseline/attachments.arcadia'),str(HERE/'baseline/B.project.json')],cwd=HERE/'unrelated-cwd',env=child_env(),stdout=stdout,stderr=stderr)
|
||||
if result.returncode or (HERE/'baseline/stderr.log').stat().st_size: raise RuntimeError('Baseline evaluator failed')
|
||||
b=read(HERE/'baseline/B.project.json');a=copy.deepcopy(b)
|
||||
uid=lambda n:'ea202922-0033-4000-8000-'+f'{n:012d}'
|
||||
routes=[v for v in a['diagrams'][uid(200)]['routes'] if v['edge']==uid(41)]
|
||||
if len(routes)!=1 or routes[0].get('source_attachment') is not None:raise RuntimeError('Predetermined baseline differs')
|
||||
routes[0]['source_attachment']={'side':'Top','offset':0.25}
|
||||
catalog={}
|
||||
for name,value in [('B',b),('A1',a)]:
|
||||
write(HERE/'expected'/(name+'.project.json'),value);catalog[name]=record(HERE/'expected'/(name+'.project.json'))
|
||||
write(HERE/'expected/catalog.json',{'source_commit':pin,'evaluator_source_commit':base,'basis':'Original frozen authored fixture B before corrected GUI launch; fixed recipe only','checkpoints':catalog,'edits':{'A1':'B with diagram200 Activate relation41 source_attachment Top offset0.25 only; Undo returns B; Redo returns A1'}})
|
||||
for folder in ('package','baseline','expected','provenance'):bound.extend(record(p) for p in sorted((HERE/folder).iterdir()) if p.is_file())
|
||||
for item in bound:verify(item)
|
||||
if git('status','--porcelain') or git('rev-parse','HEAD').decode().strip()!=pin:raise RuntimeError('Source changed')
|
||||
if any((HERE/'profile').iterdir()) or any((HERE/'unrelated-cwd').iterdir()):raise RuntimeError('Private dirs changed')
|
||||
manifest={'source_commit':pin,'evaluator_source_commit':base,'repo':str(repo),'immutable_files':bound,'binary':record(HERE/'package/arcadia-studio.exe'),'runtime':record(HERE/'package/libunwind.dll'),'evaluator':record(HERE/'package/attachment_snapshot.exe'),'initial_working':record(HERE/'working/attachments.arcadia'),'native_plan_sha256':record(HERE/'native-plan.md')['sha256'],'original_native_run_scope':'Read-only baseline/evaluator/provenance reuse; original active Run2 not modified','excluded_live_bindings':['Shared target executables','Original mutable working source','Original private profile','Original live run files except closed incident record']}
|
||||
write(HERE/'input-manifest.json',manifest)
|
||||
write(HERE/'staging-record.json',{'source_commit':pin,'utc':datetime.datetime.now(datetime.timezone.utc).isoformat(),'manifest':record(HERE/'input-manifest.json'),'scope':'Prepared only; no corrected GUI launch or native acceptance'})
|
||||
print('Corrected Escape package staged; no GUI launched')
|
||||
|
||||
if __name__=='__main__':main()
|
||||
@@ -0,0 +1,6 @@
|
||||
Set-StrictMode -Version Latest
|
||||
function Read-NativeJson([string]$Path) { Get-Content -LiteralPath $Path -Raw | ConvertFrom-Json }
|
||||
function Get-NativeHash([string]$Path) { (Get-FileHash -LiteralPath $Path -Algorithm SHA256).Hash.ToLowerInvariant() }
|
||||
function Get-NativeRecord([string]$Path) { [ordered]@{path=$Path;bytes=(Get-Item -LiteralPath $Path).Length;sha256=(Get-NativeHash $Path)} }
|
||||
function Assert-NativeFiles($Files) { foreach($entry in $Files) { if ((Get-Item -LiteralPath $entry.path).Length -ne $entry.bytes -or (Get-NativeHash $entry.path) -cne $entry.sha256) { throw "Bound file changed: $($entry.path)" } } }
|
||||
function Write-NativeJson([string]$Path,$Value) { $json=$Value|ConvertTo-Json -Depth 20; $bytes=[Text.UTF8Encoding]::new($false).GetBytes($json+[Environment]::NewLine); $stream=[IO.File]::Open($Path,[IO.FileMode]::CreateNew); try {$stream.Write($bytes,0,$bytes.Length)} finally {$stream.Dispose()} }
|
||||
@@ -0,0 +1,69 @@
|
||||
diff --git a/crates/oa-desktop/src/app.rs b/crates/oa-desktop/src/app.rs
|
||||
index 037a850..5d1dcdc 100644
|
||||
--- a/crates/oa-desktop/src/app.rs
|
||||
+++ b/crates/oa-desktop/src/app.rs
|
||||
@@ -2334,6 +2334,15 @@ impl App {
|
||||
} else if self.behavior.creation.has_pending() {
|
||||
self.behavior.creation.acknowledge_commit();
|
||||
self.status = "Behavior creation cancelled".into();
|
||||
+ } else if self.page == Page::Behavior
|
||||
+ && matches!(
|
||||
+ self.behavior.diagram.tool,
|
||||
+ behavior::state_edit::Tool::AdjustAttachment { .. }
|
||||
+ )
|
||||
+ {
|
||||
+ // Menu arming invalidates canvas keyboard ownership. Escape
|
||||
+ // must also cancel before the next canvas click grants it.
|
||||
+ self.behavior.diagram.tool = behavior::state_edit::Tool::Select;
|
||||
}
|
||||
if self.connection.take().is_some() {
|
||||
self.status = "Drawing cancelled · Select / move is active".into();
|
||||
diff --git a/crates/oa-desktop/src/app/state_diagram_tests.rs b/crates/oa-desktop/src/app/state_diagram_tests.rs
|
||||
index 0be1b78..b3a7bb5 100644
|
||||
--- a/crates/oa-desktop/src/app/state_diagram_tests.rs
|
||||
+++ b/crates/oa-desktop/src/app/state_diagram_tests.rs
|
||||
@@ -1,5 +1,7 @@
|
||||
//! App transaction and draft boundaries for captured state-canvas messages.
|
||||
use super::*;
|
||||
+#[path = "state_attachment_escape_tests.rs"]
|
||||
+mod attachment_escape;
|
||||
use crate::behavior::{
|
||||
self,
|
||||
state_edit::{self, Context, Endpoint, Event, Tool},
|
||||
diff --git a/crates/oa-desktop/src/behavior/canvas_workspace/tests.rs b/crates/oa-desktop/src/behavior/canvas_workspace/tests.rs
|
||||
index b9d9649..26313ee 100644
|
||||
--- a/crates/oa-desktop/src/behavior/canvas_workspace/tests.rs
|
||||
+++ b/crates/oa-desktop/src/behavior/canvas_workspace/tests.rs
|
||||
@@ -158,6 +158,14 @@ impl Mounted {
|
||||
events: &[iced::Event],
|
||||
cursor: mouse::Cursor,
|
||||
) -> Vec<Message> {
|
||||
+ self.input_with_status(app, events, cursor).0
|
||||
+ }
|
||||
+ pub fn input_with_status(
|
||||
+ &mut self,
|
||||
+ app: &App,
|
||||
+ events: &[iced::Event],
|
||||
+ cursor: mouse::Cursor,
|
||||
+ ) -> (Vec<Message>, Vec<iced::event::Status>) {
|
||||
let mut messages = vec![];
|
||||
let mut ui = UserInterface::build(
|
||||
app.view(),
|
||||
@@ -165,7 +173,7 @@ impl Mounted {
|
||||
std::mem::take(&mut self.cache),
|
||||
&mut self.renderer,
|
||||
);
|
||||
- let _ = ui.update(
|
||||
+ let (_, statuses) = ui.update(
|
||||
events,
|
||||
cursor,
|
||||
&mut self.renderer,
|
||||
@@ -173,7 +181,7 @@ impl Mounted {
|
||||
&mut messages,
|
||||
);
|
||||
self.cache = ui.into_cache();
|
||||
- messages
|
||||
+ (messages, statuses)
|
||||
}
|
||||
pub async fn perform(&mut self, app: &mut App, task: iced::Task<Message>) {
|
||||
let mut ready = vec![];
|
||||
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"source_commit": "3aa80de89c5b79200286926781e8f3a192bc61f4",
|
||||
"working_changes": " M crates/oa-desktop/src/app.rs\n M crates/oa-desktop/src/app/state_diagram_tests.rs\n M crates/oa-desktop/src/behavior/canvas_workspace/tests.rs\n?? crates/oa-desktop/src/app/state_attachment_escape_tests.rs\n",
|
||||
"cwd": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-20260923",
|
||||
"argv": [
|
||||
"cargo",
|
||||
"build",
|
||||
"-p",
|
||||
"oa-desktop",
|
||||
"--bin",
|
||||
"arcadia-studio",
|
||||
"--locked",
|
||||
"--offline"
|
||||
],
|
||||
"started_utc": "2026-09-23T02:21:00.624971+00:00",
|
||||
"environment": {
|
||||
"CARGO_HOME": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo",
|
||||
"RUSTUP_HOME": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\rustup",
|
||||
"RUSTUP_TOOLCHAIN": "stable-x86_64-pc-windows-gnullvm",
|
||||
"CARGO_TARGET_DIR": "C:/Users/User/Documents/Git/ARCADIA-Studio/target",
|
||||
"CARGO_BUILD_JOBS": "1",
|
||||
"CARGO_INCREMENTAL": "0",
|
||||
"CARGO_TARGET_X86_64_PC_WINDOWS_GNULLVM_LINKER": "clang.exe",
|
||||
"RC": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\llvm-mingw-20260908-ucrt-x86_64\\bin\\llvm-windres.exe"
|
||||
},
|
||||
"runner": {
|
||||
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\edge-anchors-escape-gates-20260923\\run.py",
|
||||
"bytes": 1881,
|
||||
"sha256": "99e0db19e19c9d0ae0c93b3f040872f6a4133e79034030fa294c1d29f0970e88"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
Compiling iced_widget v0.14.2 (C:\Users\User\Documents\Git\ARCADIA-Studio\.local\edge-anchors-escape-20260923\crates\vendor\iced_widget)
|
||||
Compiling iced v0.14.0
|
||||
Compiling oa-core v0.2.0 (C:\Users\User\Documents\Git\ARCADIA-Studio\.local\edge-anchors-escape-20260923\crates\oa-core)
|
||||
Compiling oa-desktop v0.2.0 (C:\Users\User\Documents\Git\ARCADIA-Studio\.local\edge-anchors-escape-20260923\crates\oa-desktop)
|
||||
Finished `dev` profile [unoptimized] target(s) in 2m 47s
|
||||