From 2cc4d115d0ff28423c7ed87fd5f4065efb011f2d Mon Sep 17 00:00:00 2001 From: Codex Date: Fri, 11 Sep 2026 04:48:44 -0700 Subject: [PATCH] Specify baseline analysis and verified library contract compatibility --- .gitattributes | 2 + .../src/forms/reference_chooser/widget.rs | 3 +- .../analysis-baseline-20260911/README.md | 15 + .../active.arcadia.proposed | 55 + .../build-fixtures.ps1 | 216 ++ .../evaluate-baseline.json | 8 + .../evaluate-degraded.json | 8 + .../evaluate-unmeasured.json | 8 + .../expected-observations.json | 39 + .../fixture-integrity.json | 13 + .../freeze-degraded.json.proposed | 131 + .../portable-document.json.proposed | 425 ++++ .../r7-literal-boundaries.json | 32 + .../EVIDENCE.json | 426 ++++ .../library-compatibility-20260911/README.md | 44 + .../01-initial/management/data1.mount | 5 + .../01-initial/management/left/base.model | 11 + .../01-initial/management/left/lineage.model | 5 + .../01-initial/management/left/map.model | 5 + .../01-initial/management/right/base.model | 11 + .../01-initial/management/right/lineage.model | 5 + .../01-initial/management/right/map.model | 5 + ...986c689f93a54d89c6181b47d6c2f39b33.library | 24 + .../generated-final/01-initial/project.model | 21 + .../01-recompiled/management/data1.mount | 5 + .../01-recompiled/management/left/base.model | 11 + .../management/left/lineage.model | 5 + .../01-recompiled/management/left/map.model | 5 + .../01-recompiled/management/right/base.model | 11 + .../management/right/lineage.model | 5 + .../01-recompiled/management/right/map.model | 5 + ...986c689f93a54d89c6181b47d6c2f39b33.library | 24 + .../01-recompiled/project.model | 21 + .../02-edited/management/data1.mount | 5 + .../02-edited/management/left/base.model | 11 + .../02-edited/management/left/lineage.model | 5 + .../02-edited/management/left/map.model | 5 + .../02-edited/management/right/base.model | 11 + .../02-edited/management/right/lineage.model | 5 + .../02-edited/management/right/map.model | 5 + ...986c689f93a54d89c6181b47d6c2f39b33.library | 24 + .../generated-final/02-edited/project.model | 22 + .../03-updated/management/data1.mount | 5 + .../03-updated/management/data2.mount | 5 + .../03-updated/management/left/base.model | 11 + .../03-updated/management/left/lineage.model | 5 + .../03-updated/management/left/map.model | 5 + .../03-updated/management/right/base.model | 11 + .../03-updated/management/right/lineage.model | 5 + .../03-updated/management/right/map.model | 5 + ...986c689f93a54d89c6181b47d6c2f39b33.library | 24 + ...ed33edd0a3a3c1f589245bb7b123ce4779.library | 24 + .../generated-final/03-updated/project.model | 25 + .../04-reidentified/management/data1.mount | 5 + .../management/left/base.model | 11 + .../management/left/lineage.model | 5 + .../04-reidentified/management/left/map.model | 5 + .../management/right/base.model | 11 + .../management/right/lineage.model | 5 + .../management/right/map.model | 5 + ...986c689f93a54d89c6181b47d6c2f39b33.library | 24 + .../04-reidentified/project.model | 22 + .../management/data1.mount | 5 + .../management/data2.mount | 5 + .../management/left/base.model | 11 + .../management/left/lineage.model | 5 + .../management/left/map.model | 5 + .../management/right/base.model | 11 + .../management/right/lineage.model | 5 + .../management/right/map.model | 5 + ...986c689f93a54d89c6181b47d6c2f39b33.library | 24 + ...ed33edd0a3a3c1f589245bb7b123ce4779.library | 24 + .../05-fresh-process-reopened/project.model | 25 + .../generated-final/RESULTS.md | 24 + .../management/data1.mount | 5 + .../management/data2.mount | 5 + .../management/left/base.model | 11 + .../management/left/lineage.model | 5 + .../management/left/map.model | 5 + .../management/right/base.model | 11 + .../management/right/lineage.model | 5 + .../management/right/map.model | 5 + ...986c689f93a54d89c6181b47d6c2f39b33.library | 24 + ...ed33edd0a3a3c1f589245bb7b123ce4779.library | 24 + .../expected-full-updated/project.model | 25 + .../generated-final/expected-initial.model | 15 + .../expected-key-records.model | 7 + .../generated-final/explicit-bridges.model | 2 + .../generated-final/initial.request | 11 + .../generated-final/local-edit.request | 1 + .../generated-final/oa-sa-transition.model | 256 ++ .../generated-final/package-D1.library | 24 + .../generated-final/package-D2.library | 24 + .../generated-final/package-D3.library | 24 + .../generated-final/package-SA.library | 7 + .../generated-final/selective-update.request | 1 + .../01-initial/management/data1.mount | 5 + .../01-initial/management/left/base.model | 11 + .../01-initial/management/left/lineage.model | 5 + .../01-initial/management/left/map.model | 5 + .../01-initial/management/right/base.model | 11 + .../01-initial/management/right/lineage.model | 5 + .../01-initial/management/right/map.model | 5 + ...923f333b67cac48fc3b33f718280db8947.library | 15 + .../generated/01-initial/project.model | 21 + .../01-recompiled/management/data1.mount | 5 + .../01-recompiled/management/left/base.model | 11 + .../management/left/lineage.model | 5 + .../01-recompiled/management/left/map.model | 5 + .../01-recompiled/management/right/base.model | 11 + .../management/right/lineage.model | 5 + .../01-recompiled/management/right/map.model | 5 + ...923f333b67cac48fc3b33f718280db8947.library | 15 + .../generated/01-recompiled/project.model | 21 + .../02-edited/management/data1.mount | 5 + .../02-edited/management/left/base.model | 11 + .../02-edited/management/left/lineage.model | 5 + .../02-edited/management/left/map.model | 5 + .../02-edited/management/right/base.model | 11 + .../02-edited/management/right/lineage.model | 5 + .../02-edited/management/right/map.model | 5 + ...923f333b67cac48fc3b33f718280db8947.library | 15 + .../generated/02-edited/project.model | 22 + .../03-updated/management/data1.mount | 5 + .../03-updated/management/data2.mount | 5 + .../03-updated/management/left/base.model | 11 + .../03-updated/management/left/lineage.model | 5 + .../03-updated/management/left/map.model | 5 + .../03-updated/management/right/base.model | 11 + .../03-updated/management/right/lineage.model | 5 + .../03-updated/management/right/map.model | 5 + ...79ff26b35cab1fdf0b588584ca06d38a19.library | 15 + ...923f333b67cac48fc3b33f718280db8947.library | 15 + .../generated/03-updated/project.model | 25 + .../04-reidentified/management/data1.mount | 5 + .../management/left/base.model | 11 + .../management/left/lineage.model | 5 + .../04-reidentified/management/left/map.model | 5 + .../management/right/base.model | 11 + .../management/right/lineage.model | 5 + .../management/right/map.model | 5 + ...923f333b67cac48fc3b33f718280db8947.library | 15 + .../generated/04-reidentified/project.model | 22 + .../generated/RESULTS.md | 24 + .../generated/SUPERSEDED.md | 5 + .../management/data1.mount | 5 + .../management/data2.mount | 5 + .../management/left/base.model | 11 + .../management/left/lineage.model | 5 + .../management/left/map.model | 5 + .../management/right/base.model | 11 + .../management/right/lineage.model | 5 + .../management/right/map.model | 5 + ...79ff26b35cab1fdf0b588584ca06d38a19.library | 15 + ...923f333b67cac48fc3b33f718280db8947.library | 15 + .../expected-full-updated/project.model | 25 + .../generated/expected-initial.model | 15 + .../generated/expected-key-records.model | 7 + .../generated/explicit-bridges.model | 2 + .../generated/initial.request | 11 + .../generated/local-edit.request | 1 + .../generated/oa-sa-transition.model | 256 ++ .../generated/package-D1.library | 15 + .../generated/package-D2.library | 15 + .../generated/package-D3.library | 15 + .../generated/package-SA.library | 7 + .../generated/selective-update.request | 1 + .../library-compatibility-20260911/main.rs | 2129 +++++++++++++++++ ...ase-analysis-baseline-contract-20260911.md | 305 +++ ...library-compatibility-contract-20260911.md | 267 +++ harness/release-scenario-native-20260911.md | 56 +- 171 files changed, 6241 insertions(+), 4 deletions(-) create mode 100644 harness/experiments/analysis-baseline-20260911/README.md create mode 100644 harness/experiments/analysis-baseline-20260911/active.arcadia.proposed create mode 100644 harness/experiments/analysis-baseline-20260911/build-fixtures.ps1 create mode 100644 harness/experiments/analysis-baseline-20260911/evaluate-baseline.json create mode 100644 harness/experiments/analysis-baseline-20260911/evaluate-degraded.json create mode 100644 harness/experiments/analysis-baseline-20260911/evaluate-unmeasured.json create mode 100644 harness/experiments/analysis-baseline-20260911/expected-observations.json create mode 100644 harness/experiments/analysis-baseline-20260911/fixture-integrity.json create mode 100644 harness/experiments/analysis-baseline-20260911/freeze-degraded.json.proposed create mode 100644 harness/experiments/analysis-baseline-20260911/portable-document.json.proposed create mode 100644 harness/experiments/analysis-baseline-20260911/r7-literal-boundaries.json create mode 100644 harness/experiments/library-compatibility-20260911/EVIDENCE.json create mode 100644 harness/experiments/library-compatibility-20260911/README.md create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/01-initial/management/data1.mount create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/01-initial/management/left/base.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/01-initial/management/left/lineage.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/01-initial/management/left/map.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/01-initial/management/right/base.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/01-initial/management/right/lineage.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/01-initial/management/right/map.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/01-initial/packages/28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33.library create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/01-initial/project.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/01-recompiled/management/data1.mount create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/01-recompiled/management/left/base.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/01-recompiled/management/left/lineage.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/01-recompiled/management/left/map.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/01-recompiled/management/right/base.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/01-recompiled/management/right/lineage.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/01-recompiled/management/right/map.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/01-recompiled/packages/28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33.library create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/01-recompiled/project.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/02-edited/management/data1.mount create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/02-edited/management/left/base.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/02-edited/management/left/lineage.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/02-edited/management/left/map.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/02-edited/management/right/base.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/02-edited/management/right/lineage.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/02-edited/management/right/map.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/02-edited/packages/28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33.library create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/02-edited/project.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/03-updated/management/data1.mount create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/03-updated/management/data2.mount create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/03-updated/management/left/base.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/03-updated/management/left/lineage.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/03-updated/management/left/map.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/03-updated/management/right/base.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/03-updated/management/right/lineage.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/03-updated/management/right/map.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/03-updated/packages/28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33.library create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/03-updated/packages/a35102e04b9f6822ab409ab43f83eded33edd0a3a3c1f589245bb7b123ce4779.library create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/03-updated/project.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/04-reidentified/management/data1.mount create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/04-reidentified/management/left/base.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/04-reidentified/management/left/lineage.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/04-reidentified/management/left/map.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/04-reidentified/management/right/base.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/04-reidentified/management/right/lineage.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/04-reidentified/management/right/map.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/04-reidentified/packages/28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33.library create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/04-reidentified/project.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/05-fresh-process-reopened/management/data1.mount create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/05-fresh-process-reopened/management/data2.mount create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/05-fresh-process-reopened/management/left/base.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/05-fresh-process-reopened/management/left/lineage.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/05-fresh-process-reopened/management/left/map.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/05-fresh-process-reopened/management/right/base.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/05-fresh-process-reopened/management/right/lineage.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/05-fresh-process-reopened/management/right/map.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/05-fresh-process-reopened/packages/28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33.library create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/05-fresh-process-reopened/packages/a35102e04b9f6822ab409ab43f83eded33edd0a3a3c1f589245bb7b123ce4779.library create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/05-fresh-process-reopened/project.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/RESULTS.md create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/expected-full-updated/management/data1.mount create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/expected-full-updated/management/data2.mount create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/expected-full-updated/management/left/base.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/expected-full-updated/management/left/lineage.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/expected-full-updated/management/left/map.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/expected-full-updated/management/right/base.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/expected-full-updated/management/right/lineage.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/expected-full-updated/management/right/map.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/expected-full-updated/packages/28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33.library create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/expected-full-updated/packages/a35102e04b9f6822ab409ab43f83eded33edd0a3a3c1f589245bb7b123ce4779.library create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/expected-full-updated/project.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/expected-initial.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/expected-key-records.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/explicit-bridges.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/initial.request create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/local-edit.request create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/oa-sa-transition.model create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/package-D1.library create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/package-D2.library create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/package-D3.library create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/package-SA.library create mode 100644 harness/experiments/library-compatibility-20260911/generated-final/selective-update.request create mode 100644 harness/experiments/library-compatibility-20260911/generated/01-initial/management/data1.mount create mode 100644 harness/experiments/library-compatibility-20260911/generated/01-initial/management/left/base.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/01-initial/management/left/lineage.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/01-initial/management/left/map.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/01-initial/management/right/base.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/01-initial/management/right/lineage.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/01-initial/management/right/map.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/01-initial/packages/e89a61c9548b6c5e3bf7c432d8b294923f333b67cac48fc3b33f718280db8947.library create mode 100644 harness/experiments/library-compatibility-20260911/generated/01-initial/project.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/01-recompiled/management/data1.mount create mode 100644 harness/experiments/library-compatibility-20260911/generated/01-recompiled/management/left/base.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/01-recompiled/management/left/lineage.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/01-recompiled/management/left/map.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/01-recompiled/management/right/base.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/01-recompiled/management/right/lineage.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/01-recompiled/management/right/map.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/01-recompiled/packages/e89a61c9548b6c5e3bf7c432d8b294923f333b67cac48fc3b33f718280db8947.library create mode 100644 harness/experiments/library-compatibility-20260911/generated/01-recompiled/project.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/02-edited/management/data1.mount create mode 100644 harness/experiments/library-compatibility-20260911/generated/02-edited/management/left/base.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/02-edited/management/left/lineage.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/02-edited/management/left/map.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/02-edited/management/right/base.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/02-edited/management/right/lineage.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/02-edited/management/right/map.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/02-edited/packages/e89a61c9548b6c5e3bf7c432d8b294923f333b67cac48fc3b33f718280db8947.library create mode 100644 harness/experiments/library-compatibility-20260911/generated/02-edited/project.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/03-updated/management/data1.mount create mode 100644 harness/experiments/library-compatibility-20260911/generated/03-updated/management/data2.mount create mode 100644 harness/experiments/library-compatibility-20260911/generated/03-updated/management/left/base.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/03-updated/management/left/lineage.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/03-updated/management/left/map.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/03-updated/management/right/base.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/03-updated/management/right/lineage.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/03-updated/management/right/map.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/03-updated/packages/43788fdf736f509c0ae19357ee717b79ff26b35cab1fdf0b588584ca06d38a19.library create mode 100644 harness/experiments/library-compatibility-20260911/generated/03-updated/packages/e89a61c9548b6c5e3bf7c432d8b294923f333b67cac48fc3b33f718280db8947.library create mode 100644 harness/experiments/library-compatibility-20260911/generated/03-updated/project.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/04-reidentified/management/data1.mount create mode 100644 harness/experiments/library-compatibility-20260911/generated/04-reidentified/management/left/base.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/04-reidentified/management/left/lineage.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/04-reidentified/management/left/map.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/04-reidentified/management/right/base.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/04-reidentified/management/right/lineage.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/04-reidentified/management/right/map.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/04-reidentified/packages/e89a61c9548b6c5e3bf7c432d8b294923f333b67cac48fc3b33f718280db8947.library create mode 100644 harness/experiments/library-compatibility-20260911/generated/04-reidentified/project.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/RESULTS.md create mode 100644 harness/experiments/library-compatibility-20260911/generated/SUPERSEDED.md create mode 100644 harness/experiments/library-compatibility-20260911/generated/expected-full-updated/management/data1.mount create mode 100644 harness/experiments/library-compatibility-20260911/generated/expected-full-updated/management/data2.mount create mode 100644 harness/experiments/library-compatibility-20260911/generated/expected-full-updated/management/left/base.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/expected-full-updated/management/left/lineage.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/expected-full-updated/management/left/map.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/expected-full-updated/management/right/base.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/expected-full-updated/management/right/lineage.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/expected-full-updated/management/right/map.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/expected-full-updated/packages/43788fdf736f509c0ae19357ee717b79ff26b35cab1fdf0b588584ca06d38a19.library create mode 100644 harness/experiments/library-compatibility-20260911/generated/expected-full-updated/packages/e89a61c9548b6c5e3bf7c432d8b294923f333b67cac48fc3b33f718280db8947.library create mode 100644 harness/experiments/library-compatibility-20260911/generated/expected-full-updated/project.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/expected-initial.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/expected-key-records.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/explicit-bridges.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/initial.request create mode 100644 harness/experiments/library-compatibility-20260911/generated/local-edit.request create mode 100644 harness/experiments/library-compatibility-20260911/generated/oa-sa-transition.model create mode 100644 harness/experiments/library-compatibility-20260911/generated/package-D1.library create mode 100644 harness/experiments/library-compatibility-20260911/generated/package-D2.library create mode 100644 harness/experiments/library-compatibility-20260911/generated/package-D3.library create mode 100644 harness/experiments/library-compatibility-20260911/generated/package-SA.library create mode 100644 harness/experiments/library-compatibility-20260911/generated/selective-update.request create mode 100644 harness/experiments/library-compatibility-20260911/main.rs create mode 100644 harness/release-analysis-baseline-contract-20260911.md create mode 100644 harness/release-library-compatibility-contract-20260911.md diff --git a/.gitattributes b/.gitattributes index 7d3f285e..53515bc4 100644 --- a/.gitattributes +++ b/.gitattributes @@ -29,6 +29,8 @@ harness/fixtures/scenario-authoring/base/** -text whitespace=cr-at-eol harness/experiments/textual-authoring-20260911/** -text whitespace=cr-at-eol harness/experiments/textual-authoring-20260911/observed/split-entry.arcadia whitespace=-blank-at-eol,cr-at-eol harness/experiments/analysis-context-20260911/** -text whitespace=cr-at-eol +harness/experiments/analysis-baseline-20260911/** -text whitespace=cr-at-eol +harness/experiments/library-compatibility-20260911/** -text whitespace=cr-at-eol # Preserve checksum-bound font notices verbatim through Git round trips. scripts/windows-notices/GNOME-Cantarell-61362600e104-COPYING -text diff --git a/crates/oa-desktop/src/forms/reference_chooser/widget.rs b/crates/oa-desktop/src/forms/reference_chooser/widget.rs index d7a28b64..854406c0 100644 --- a/crates/oa-desktop/src/forms/reference_chooser/widget.rs +++ b/crates/oa-desktop/src/forms/reference_chooser/widget.rs @@ -35,8 +35,7 @@ impl Geometry { fn new(anchor: Rectangle, viewport: Size) -> Self { let width = anchor .width - .max(278.) - .min(420.) + .clamp(278., 420.) .min((viewport.width - 2. * MARGIN).max(0.)); let height = 360f32.min((viewport.height - 2. * MARGIN).max(0.)); let x = anchor.x.clamp( diff --git a/harness/experiments/analysis-baseline-20260911/README.md b/harness/experiments/analysis-baseline-20260911/README.md new file mode 100644 index 00000000..5929cc58 --- /dev/null +++ b/harness/experiments/analysis-baseline-20260911/README.md @@ -0,0 +1,15 @@ +# Baseline contract fixtures + +Companion to [the candidate contract](../../release-analysis-baseline-contract-20260911.md). This is proposed schema/source/JSON, not implemented Studio syntax. + +- active.arcadia.proposed is a complete UUID-bearing local model with four base bindings, two cases and one shared check. +- evaluate-*.json are complete candidate REST request bodies. +- portable-document.json.proposed exposes the complete candidate Project, exact source, local definitions and explicitly empty library collections. +- freeze-degraded.json.proposed retains those exact document bytes, a SHA256 commitment, complete effective bindings/checks, and private definition inventory. +- expected-observations.json records hand-derived arithmetic/context expectations, not evaluator output. +- r7-literal-boundaries.json contains full exact JSON literal nodes and their expected canonical source, including 301-digit and 4096-bit boundaries. +- fixture-integrity.json records only transport/source/UUID checks and size counts. + +Run build-fixtures.ps1 with PowerShell 7 to regenerate the JSON fixtures. It writes only within this directory. The script constructs the proposed typed data; it does not parse source, evaluate expressions, run Rust, or establish Project/source semantic equality. Changing the fixture file's exact line endings changes the captured document and digest; preserve these snapshot bytes when publishing. + +The full local capture has no imports, so empty pins/package content are complete for this example. Nonempty pinned-package capture and offline replay remain a required paired library/evaluator acceptance test, not something this local transport fixture has proved. diff --git a/harness/experiments/analysis-baseline-20260911/active.arcadia.proposed b/harness/experiments/analysis-baseline-20260911/active.arcadia.proposed new file mode 100644 index 00000000..55595910 --- /dev/null +++ b/harness/experiments/analysis-baseline-20260911/active.arcadia.proposed @@ -0,0 +1,55 @@ +arcadia 8; +project response_budget "Response budget" id "4210b9f2-7046-47f0-aa3b-153f626a579d" { + description "A complete proposed analysis model. Schema 8 and the new declarations are not implemented source7 syntax."; + + quantity_kind duration "Duration" id "188b911c-5f8b-431c-9eea-2d41f3953767" { + dimension { time: 1; } + algebra Linear; + } + unit second "Second" id "534f4672-1ba5-4157-8b0a-b9cf41d0a3ce" { + kind @duration; scale 1; offset 0; symbol "s"; + } + unit millisecond "Millisecond" id "39053f37-fec9-4708-9f0a-3959d223f891" { + kind @duration; scale ratio(1, 1000); offset 0; symbol "ms"; + } + calculation combine "Combine durations" id "fd7ce7ab-f789-40bc-b699-0c37f1b6902f" { + input a id "28ff40b0-1b8f-4735-8536-5a6ab21b56cb" : Quantity(@duration); + input b id "7a47cc1e-8ae5-4551-b2d8-8a68108e0976" : Quantity(@duration); + result Quantity(@duration); + body $a + $b; + } + + oa_activity respond "Respond" id "cabec6a1-7d5d-48f3-8d2d-a7fc8cf78f59" { + oa_activity receive "Receive" id "4ab9a8a7-7552-488d-9862-e14b89e7b353" {} + oa_activity dispatch "Dispatch" id "6df991ba-4c5e-4535-99e2-524ae274ee8b" {} + } + oa_property receive_time "Receive time" id "63a931c2-675a-4fce-89e5-04361cb99450" { + subject @receive; type Quantity(@duration); display_unit @millisecond; + base 750 [@millisecond]; + } + oa_property dispatch_time "Dispatch time" id "c33fc772-2a60-4044-9af9-73c61c563ace" { + subject @dispatch; type Quantity(@duration); display_unit @second; + base 1 [@second]; + } + oa_property total_time "Total time" id "bd5b68e8-65fc-4e35-9071-a73061316a4b" { + subject @respond; type Quantity(@duration); display_unit @second; + // The formula is shared. Every read uses the requested evaluation context. + base @combine(a: @receive_time, b: @dispatch_time); + } + oa_property limit "Allowed duration" id "437bedbb-2cf4-44ee-a139-6563cc5086ec" { + subject @respond; type Quantity(@duration); display_unit @second; + base 2 [@second]; + } + oa_check budget "Response budget" id "bac0de99-9d2f-4e53-9158-d424ecac61bf" { + subject none; documented_constraint none; + predicate @total_time <= @limit; + } + oa_analysis degraded "Degraded radio" id "38036c65-16d4-449c-837b-91eb141c1d93" { + subject none; base ModelBaseline; + overrides { @receive_time = 1250 [@millisecond]; } + } + oa_analysis unmeasured "Unmeasured radio" id "99d3e09a-0ec3-4194-9dd4-9f3de6625cde" { + subject none; base ModelBaseline; + overrides { @receive_time = unbound; } + } +} diff --git a/harness/experiments/analysis-baseline-20260911/build-fixtures.ps1 b/harness/experiments/analysis-baseline-20260911/build-fixtures.ps1 new file mode 100644 index 00000000..ffdf7c2e --- /dev/null +++ b/harness/experiments/analysis-baseline-20260911/build-fixtures.ps1 @@ -0,0 +1,216 @@ +# Fixture construction only. This does not parse/evaluate the proposed language. +$ErrorActionPreference = 'Stop' +$taskDir = $PSScriptRoot +$ids = @{ + project = '4210b9f2-7046-47f0-aa3b-153f626a579d' + duration = '188b911c-5f8b-431c-9eea-2d41f3953767' + second = '534f4672-1ba5-4157-8b0a-b9cf41d0a3ce' + millisecond = '39053f37-fec9-4708-9f0a-3959d223f891' + combine = 'fd7ce7ab-f789-40bc-b699-0c37f1b6902f' + input_a = '28ff40b0-1b8f-4735-8536-5a6ab21b56cb' + input_b = '7a47cc1e-8ae5-4551-b2d8-8a68108e0976' + respond = 'cabec6a1-7d5d-48f3-8d2d-a7fc8cf78f59' + receive = '4ab9a8a7-7552-488d-9862-e14b89e7b353' + dispatch = '6df991ba-4c5e-4535-99e2-524ae274ee8b' + receive_time = '63a931c2-675a-4fce-89e5-04361cb99450' + dispatch_time = 'c33fc772-2a60-4044-9af9-73c61c563ace' + total_time = 'bd5b68e8-65fc-4e35-9071-a73061316a4b' + limit = '437bedbb-2cf4-44ee-a139-6563cc5086ec' + degraded = '38036c65-16d4-449c-837b-91eb141c1d93' + unmeasured = '99d3e09a-0ec3-4194-9dd4-9f3de6625cde' + budget = 'bac0de99-9d2f-4e53-9158-d424ecac61bf' +} +function Exact([string]$n, [string]$d = '1') { + return @{ numerator = $n; denominator = $d } +} +function Local([string]$name) { return @{ Local = $ids[$name] } } +function ReadProperty([string]$name) { return @{ Property = $ids[$name] } } +function Literal([string]$n, [string]$unit) { + return @{ Quantity = @{ magnitude = (Exact $n); unit = (Local $unit) } } +} +function Bound($expr) { return @{ Expression = $expr } } +function Record([string]$key, [string]$name, $body) { + return @{ + id = $ids[$key]; alias = $key; name = $name; description = ''; body = $body + } +} +function Element([string]$key, [string]$name, $body, $parent = $null) { + $r = Record $key $name $body + $r.parent = $parent + return $r +} +function Property([string]$key, [string]$name, [string]$subject, [string]$unit, $binding) { + return Element $key $name @{ Oa = @{ Shared = @{ EngineeringProperty = @{ + subject = @{ Element = $ids[$subject] } + value_type = $quantityType + display_unit = (Local $unit) + base = $binding + } } } } +} +function OrderedCopy($value) { + if ($null -eq $value) { return $null } + if ($value -is [Collections.IDictionary]) { + $copy = [ordered]@{} + [string[]]$keys = @($value.Keys) + [Array]::Sort($keys, [StringComparer]::Ordinal) + foreach ($key in $keys) { $copy[$key] = OrderedCopy $value[$key] } + return $copy + } + if ($value -is [Collections.IEnumerable] -and $value -isnot [string]) { + $copy = @() + foreach ($item in $value) { $copy += ,(OrderedCopy $item) } + return ,$copy + } + return $value +} +function JsonBytes($value) { + $json = (OrderedCopy $value) | ConvertTo-Json -Depth 100 + $json = $json.Replace([string][char]13 + [string][char]10, [string][char]10) + return [Text.UTF8Encoding]::new($false).GetBytes($json + [string][char]10) +} +function SaveBytes([string]$name, [byte[]]$bytes) { + [IO.File]::WriteAllBytes((Join-Path $taskDir $name), $bytes) +} +$quantityType = @{ Scalar = @{ Quantity = (Local 'duration') } } +$definitions = @{} +$definitions[$ids.duration] = Record 'duration' 'Duration' @{ QuantityKind = @{ + dimension = @(0, 0, 1, 0, 0, 0, 0); algebra = 'Linear' +} } +$definitions[$ids.second] = Record 'second' 'Second' @{ Unit = @{ + kind = (Local 'duration'); scale = (Exact '1'); offset = (Exact '0'); symbol = 's' +} } +$definitions[$ids.millisecond] = Record 'millisecond' 'Millisecond' @{ Unit = @{ + kind = (Local 'duration'); scale = (Exact '1' '1000'); offset = (Exact '0'); symbol = 'ms' +} } +$definitions[$ids.combine] = Record 'combine' 'Combine durations' @{ Calculation = @{ + parameters = @( + @{ id = $ids.input_a; name = 'a'; value_type = $quantityType }, + @{ id = $ids.input_b; name = 'b'; value_type = $quantityType } + ) + result = $quantityType + body = (Bound @{ Binary = @{ + op = 'Add'; left = @{ Parameter = $ids.input_a }; right = @{ Parameter = $ids.input_b } + } }) +} } +$receiveBase = Bound (Literal '750' 'millisecond') +$dispatchBase = Bound (Literal '1' 'second') +$totalBase = Bound @{ Call = @{ + definition = (Local 'combine') + arguments = @{ + $ids.input_a = (ReadProperty 'receive_time') + $ids.input_b = (ReadProperty 'dispatch_time') + } +} } +$limitBase = Bound (Literal '2' 'second') +$degradedBinding = Bound (Literal '1250' 'millisecond') +$predicate = Bound @{ Binary = @{ + op = 'LessOrEqual'; left = (ReadProperty 'total_time'); right = (ReadProperty 'limit') +} } +$elements = @{} +$elements[$ids.respond] = Element 'respond' 'Respond' @{ Oa = 'Activity' } +$elements[$ids.receive] = Element 'receive' 'Receive' @{ Oa = 'Activity' } $ids.respond +$elements[$ids.dispatch] = Element 'dispatch' 'Dispatch' @{ Oa = 'Activity' } $ids.respond +$elements[$ids.receive_time] = Property 'receive_time' 'Receive time' 'receive' 'millisecond' $receiveBase +$elements[$ids.dispatch_time] = Property 'dispatch_time' 'Dispatch time' 'dispatch' 'second' $dispatchBase +$elements[$ids.total_time] = Property 'total_time' 'Total time' 'respond' 'second' $totalBase +$elements[$ids.limit] = Property 'limit' 'Allowed duration' 'respond' 'second' $limitBase +$elements[$ids.budget] = Element 'budget' 'Response budget' @{ Oa = @{ Shared = @{ AnalysisCheck = @{ + subject = $null; documented_constraint = $null; predicate = $predicate +} } } } +$elements[$ids.degraded] = Element 'degraded' 'Degraded radio' @{ Oa = @{ Shared = @{ AnalysisCase = @{ + subject = $null; base = 'ModelBaseline'; overrides = @{ $ids.receive_time = $degradedBinding } +} } } } +$elements[$ids.unmeasured] = Element 'unmeasured' 'Unmeasured radio' @{ Oa = @{ Shared = @{ AnalysisCase = @{ + subject = $null; base = 'ModelBaseline'; overrides = @{ $ids.receive_time = 'Unbound' } +} } } } +$sourceBytes = [IO.File]::ReadAllBytes((Join-Path $taskDir 'active.arcadia.proposed')) +$source = [Text.UTF8Encoding]::new($false, $true).GetString($sourceBytes) +$project = @{ + schema_version = 8; id = $ids.project; alias = 'response_budget'; name = 'Response budget' + description = 'A complete proposed analysis model. Schema 8 and the new declarations are not implemented source7 syntax.' + elements = $elements; relations = @{}; diagrams = @{}; artifact_links = @{}; traces = @{} + definitions = $definitions; imports = @{}; definition_mounts = @{}; library_instances = @{} +} +$document = @{ + model = $project + source = @{ entry = 'active.arcadia'; files = @{ 'active.arcadia' = $source } } + packages = @{} +} +[byte[]]$documentBytes = JsonBytes $document +SaveBytes 'portable-document.json.proposed' $documentBytes +$documentDigest = [Convert]::ToHexString([Security.Cryptography.SHA256]::HashData($documentBytes)).ToLowerInvariant() +$manifest = @( + @{ property = $ids.receive_time; binding = $degradedBinding; origin = @{ CaseOverride = $ids.degraded } }, + @{ property = $ids.dispatch_time; binding = $dispatchBase; origin = 'ModelBaseline' }, + @{ property = $ids.total_time; binding = $totalBase; origin = 'ModelBaseline' }, + @{ property = $ids.limit; binding = $limitBase; origin = 'ModelBaseline' } +) | Sort-Object { $_.property } +$freeze = @{ + format = 'arcadia-analysis-freeze-1-proposal' + captured_document = @{ + media_type = 'application/vnd.arcadia.portable-document+json' + sha256 = $documentDigest + bytes_base64 = [Convert]::ToBase64String($documentBytes) + } + origin = @{ Local = @{ + document_instance = 'd911a3c0-8adb-4203-850c-b16e9b4e4d0a'; accepted_revision = 1 + } } + model_id = $ids.project + context = @{ Case = $ids.degraded } + targets = @{ properties = @($ids.total_time); checks = @($ids.budget) } + numeric_profile = 'Q1-exact-1' + effective_bindings = @($manifest) + check_predicates = @(@{ check = $ids.budget; predicate = $predicate }) + definition_capture = @{ + document_sha256 = $documentDigest + local_definitions = @($ids.duration, $ids.second, $ids.millisecond, $ids.combine | Sort-Object) + imports = @() + } +} +SaveBytes 'freeze-degraded.json.proposed' (JsonBytes $freeze) +$expected = @{ + status = 'Hand-derived expectations, not evaluator output' + baseline = @{ total_canonical_seconds = (Exact '7' '4'); check = 'Satisfied' } + degraded = @{ total_canonical_seconds = (Exact '9' '4'); check = 'Violated' } + unmeasured = @{ total = 'Missing'; input = $ids.receive_time; check = 'Unresolved' } + after_clear_unmeasured_override = @{ total_canonical_seconds = (Exact '7' '4'); check = 'Satisfied' } + after_baseline_dispatch_changes_to_two_seconds = @{ + active_degraded_total = (Exact '13' '4'); frozen_degraded_total = (Exact '9' '4') + } +} +SaveBytes 'expected-observations.json' (JsonBytes $expected) +$largeInteger = [Numerics.BigInteger]::Pow([Numerics.BigInteger]10, 300).ToString() +$smallDenominator = [Numerics.BigInteger]::Pow([Numerics.BigInteger]2, 4095).ToString() +$boundInteger = ([Numerics.BigInteger]::Pow([Numerics.BigInteger]2, 4096) - 1).ToString() +$literalFixtures = @( + @{ name = 'ten_to_300'; expression = @{ Number = (Exact $largeInteger) }; canonical_source = $largeInteger }, + @{ name = 'one_over_two_to_4095'; expression = @{ Number = (Exact '1' $smallDenominator) }; canonical_source = ('ratio(1, ' + $smallDenominator + ')') }, + @{ name = 'negative_4096_bit_bound'; expression = @{ Number = (Exact ('-' + $boundInteger)) }; canonical_source = ('ratio(-' + $boundInteger + ', 1)') } +) +SaveBytes 'r7-literal-boundaries.json' (JsonBytes $literalFixtures) +# Verify only JSON transport, UUID completeness, raw source retention and hashes. +$parsed = Get-Content -LiteralPath (Join-Path $taskDir 'freeze-degraded.json.proposed') -Raw | ConvertFrom-Json +$decoded = [Convert]::FromBase64String($parsed.captured_document.bytes_base64) +if ([Convert]::ToBase64String($decoded) -cne [Convert]::ToBase64String($documentBytes)) { throw 'Document capsule differs' } +$parsedDoc = [Text.Encoding]::UTF8.GetString($decoded) | ConvertFrom-Json +if ($parsedDoc.source.files.'active.arcadia' -cne $source) { throw 'Source changed' } +if ($ids.Count -ne (@($ids.Values | Sort-Object -Unique)).Count) { throw 'Duplicate fixture UUID' } +foreach ($value in $ids.Values) { + [void][guid]::ParseExact($value, 'D') + if (-not $source.Contains('id "' + $value + '"')) { throw "Missing source identity $value" } +} +$stats = @{ + source_lines = ($source -split [string][char]10).Count - 1 + source_utf8_bytes = $sourceBytes.Length + explicit_source_uuids = $ids.Count + project_elements = $elements.Count + local_definitions = $definitions.Count + scoped_parameters = 2 + base_bindings = 4 + override_bindings = 2 + shared_checks = 1 + portable_document_sha256 = $documentDigest + verified = 'JSON transport, 17 syntactically valid distinct UUIDs, exact source bytes, capsule equality. No proposed parser/evaluator execution.' +} +SaveBytes 'fixture-integrity.json' (JsonBytes $stats) +$stats | ConvertTo-Json diff --git a/harness/experiments/analysis-baseline-20260911/evaluate-baseline.json b/harness/experiments/analysis-baseline-20260911/evaluate-baseline.json new file mode 100644 index 00000000..222eaf37 --- /dev/null +++ b/harness/experiments/analysis-baseline-20260911/evaluate-baseline.json @@ -0,0 +1,8 @@ +{ + "context": "ModelBaseline", + "targets": { + "properties": ["bd5b68e8-65fc-4e35-9071-a73061316a4b"], + "checks": ["bac0de99-9d2f-4e53-9158-d424ecac61bf"] + }, + "numeric_profile": "Q1-exact-1" +} diff --git a/harness/experiments/analysis-baseline-20260911/evaluate-degraded.json b/harness/experiments/analysis-baseline-20260911/evaluate-degraded.json new file mode 100644 index 00000000..c69d8a43 --- /dev/null +++ b/harness/experiments/analysis-baseline-20260911/evaluate-degraded.json @@ -0,0 +1,8 @@ +{ + "context": {"Case": "38036c65-16d4-449c-837b-91eb141c1d93"}, + "targets": { + "properties": ["bd5b68e8-65fc-4e35-9071-a73061316a4b"], + "checks": ["bac0de99-9d2f-4e53-9158-d424ecac61bf"] + }, + "numeric_profile": "Q1-exact-1" +} diff --git a/harness/experiments/analysis-baseline-20260911/evaluate-unmeasured.json b/harness/experiments/analysis-baseline-20260911/evaluate-unmeasured.json new file mode 100644 index 00000000..4b9f6717 --- /dev/null +++ b/harness/experiments/analysis-baseline-20260911/evaluate-unmeasured.json @@ -0,0 +1,8 @@ +{ + "context": {"Case": "99d3e09a-0ec3-4194-9dd4-9f3de6625cde"}, + "targets": { + "properties": ["bd5b68e8-65fc-4e35-9071-a73061316a4b"], + "checks": ["bac0de99-9d2f-4e53-9158-d424ecac61bf"] + }, + "numeric_profile": "Q1-exact-1" +} diff --git a/harness/experiments/analysis-baseline-20260911/expected-observations.json b/harness/experiments/analysis-baseline-20260911/expected-observations.json new file mode 100644 index 00000000..f732c846 --- /dev/null +++ b/harness/experiments/analysis-baseline-20260911/expected-observations.json @@ -0,0 +1,39 @@ +{ + "after_baseline_dispatch_changes_to_two_seconds": { + "active_degraded_total": { + "denominator": "4", + "numerator": "13" + }, + "frozen_degraded_total": { + "denominator": "4", + "numerator": "9" + } + }, + "after_clear_unmeasured_override": { + "check": "Satisfied", + "total_canonical_seconds": { + "denominator": "4", + "numerator": "7" + } + }, + "baseline": { + "check": "Satisfied", + "total_canonical_seconds": { + "denominator": "4", + "numerator": "7" + } + }, + "degraded": { + "check": "Violated", + "total_canonical_seconds": { + "denominator": "4", + "numerator": "9" + } + }, + "status": "Hand-derived expectations, not evaluator output", + "unmeasured": { + "check": "Unresolved", + "input": "63a931c2-675a-4fce-89e5-04361cb99450", + "total": "Missing" + } +} diff --git a/harness/experiments/analysis-baseline-20260911/fixture-integrity.json b/harness/experiments/analysis-baseline-20260911/fixture-integrity.json new file mode 100644 index 00000000..b0322951 --- /dev/null +++ b/harness/experiments/analysis-baseline-20260911/fixture-integrity.json @@ -0,0 +1,13 @@ +{ + "base_bindings": 4, + "explicit_source_uuids": 17, + "local_definitions": 4, + "override_bindings": 2, + "portable_document_sha256": "6667773d90f83626f760b2faa2bf7d57638947d95574e3fa3e80b64416f01497", + "project_elements": 10, + "scoped_parameters": 2, + "shared_checks": 1, + "source_lines": 55, + "source_utf8_bytes": 2678, + "verified": "JSON transport, 17 syntactically valid distinct UUIDs, exact source bytes, capsule equality. No proposed parser/evaluator execution." +} diff --git a/harness/experiments/analysis-baseline-20260911/freeze-degraded.json.proposed b/harness/experiments/analysis-baseline-20260911/freeze-degraded.json.proposed new file mode 100644 index 00000000..0694259f --- /dev/null +++ b/harness/experiments/analysis-baseline-20260911/freeze-degraded.json.proposed @@ -0,0 +1,131 @@ +{ + "captured_document": { + "bytes_base64": "ewogICJtb2RlbCI6IHsKICAgICJhbGlhcyI6ICJyZXNwb25zZV9idWRnZXQiLAogICAgImFydGlmYWN0X2xpbmtzIjoge30sCiAgICAiZGVmaW5pdGlvbl9tb3VudHMiOiB7fSwKICAgICJkZWZpbml0aW9ucyI6IHsKICAgICAgIjE4OGI5MTFjLTVmOGItNDMxYy05ZWVhLTJkNDFmMzk1Mzc2NyI6IHsKICAgICAgICAiYWxpYXMiOiAiZHVyYXRpb24iLAogICAgICAgICJib2R5IjogewogICAgICAgICAgIlF1YW50aXR5S2luZCI6IHsKICAgICAgICAgICAgImFsZ2VicmEiOiAiTGluZWFyIiwKICAgICAgICAgICAgImRpbWVuc2lvbiI6IFsKICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAwCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJkZXNjcmlwdGlvbiI6ICIiLAogICAgICAgICJpZCI6ICIxODhiOTExYy01ZjhiLTQzMWMtOWVlYS0yZDQxZjM5NTM3NjciLAogICAgICAgICJuYW1lIjogIkR1cmF0aW9uIgogICAgICB9LAogICAgICAiMzkwNTNmMzctZmVjOS00NzA4LTlmMGEtMzk1OWQyMjNmODkxIjogewogICAgICAgICJhbGlhcyI6ICJtaWxsaXNlY29uZCIsCiAgICAgICAgImJvZHkiOiB7CiAgICAgICAgICAiVW5pdCI6IHsKICAgICAgICAgICAgImtpbmQiOiB7CiAgICAgICAgICAgICAgIkxvY2FsIjogIjE4OGI5MTFjLTVmOGItNDMxYy05ZWVhLTJkNDFmMzk1Mzc2NyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm9mZnNldCI6IHsKICAgICAgICAgICAgICAiZGVub21pbmF0b3IiOiAiMSIsCiAgICAgICAgICAgICAgIm51bWVyYXRvciI6ICIwIgogICAgICAgICAgICB9LAogICAgICAgICAgICAic2NhbGUiOiB7CiAgICAgICAgICAgICAgImRlbm9taW5hdG9yIjogIjEwMDAiLAogICAgICAgICAgICAgICJudW1lcmF0b3IiOiAiMSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInN5bWJvbCI6ICJtcyIKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJkZXNjcmlwdGlvbiI6ICIiLAogICAgICAgICJpZCI6ICIzOTA1M2YzNy1mZWM5LTQ3MDgtOWYwYS0zOTU5ZDIyM2Y4OTEiLAogICAgICAgICJuYW1lIjogIk1pbGxpc2Vjb25kIgogICAgICB9LAogICAgICAiNTM0ZjQ2NzItMWJhNS00MTU3LThiMGEtYjljZjQxZDBhM2NlIjogewogICAgICAgICJhbGlhcyI6ICJzZWNvbmQiLAogICAgICAgICJib2R5IjogewogICAgICAgICAgIlVuaXQiOiB7CiAgICAgICAgICAgICJraW5kIjogewogICAgICAgICAgICAgICJMb2NhbCI6ICIxODhiOTExYy01ZjhiLTQzMWMtOWVlYS0yZDQxZjM5NTM3NjciCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJvZmZzZXQiOiB7CiAgICAgICAgICAgICAgImRlbm9taW5hdG9yIjogIjEiLAogICAgICAgICAgICAgICJudW1lcmF0b3IiOiAiMCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInNjYWxlIjogewogICAgICAgICAgICAgICJkZW5vbWluYXRvciI6ICIxIiwKICAgICAgICAgICAgICAibnVtZXJhdG9yIjogIjEiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJzeW1ib2wiOiAicyIKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJkZXNjcmlwdGlvbiI6ICIiLAogICAgICAgICJpZCI6ICI1MzRmNDY3Mi0xYmE1LTQxNTctOGIwYS1iOWNmNDFkMGEzY2UiLAogICAgICAgICJuYW1lIjogIlNlY29uZCIKICAgICAgfSwKICAgICAgImZkN2NlN2FiLWY3ODktNDBiYy1iNjk5LTBjMzdmMWI2OTAyZiI6IHsKICAgICAgICAiYWxpYXMiOiAiY29tYmluZSIsCiAgICAgICAgImJvZHkiOiB7CiAgICAgICAgICAiQ2FsY3VsYXRpb24iOiB7CiAgICAgICAgICAgICJib2R5IjogewogICAgICAgICAgICAgICJFeHByZXNzaW9uIjogewogICAgICAgICAgICAgICAgIkJpbmFyeSI6IHsKICAgICAgICAgICAgICAgICAgImxlZnQiOiB7CiAgICAgICAgICAgICAgICAgICAgIlBhcmFtZXRlciI6ICIyOGZmNDBiMC0xYjhmLTQ3MzUtODUzNi01YTZhYjIxYjU2Y2IiCiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICJvcCI6ICJBZGQiLAogICAgICAgICAgICAgICAgICAicmlnaHQiOiB7CiAgICAgICAgICAgICAgICAgICAgIlBhcmFtZXRlciI6ICI3YTQ3Y2MxZS04YWU1LTQ1NTEtYjJkOC04YTY4MTA4ZTA5NzYiCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJwYXJhbWV0ZXJzIjogWwogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJpZCI6ICIyOGZmNDBiMC0xYjhmLTQ3MzUtODUzNi01YTZhYjIxYjU2Y2IiLAogICAgICAgICAgICAgICAgIm5hbWUiOiAiYSIsCiAgICAgICAgICAgICAgICAidmFsdWVfdHlwZSI6IHsKICAgICAgICAgICAgICAgICAgIlNjYWxhciI6IHsKICAgICAgICAgICAgICAgICAgICAiUXVhbnRpdHkiOiB7CiAgICAgICAgICAgICAgICAgICAgICAiTG9jYWwiOiAiMTg4YjkxMWMtNWY4Yi00MzFjLTllZWEtMmQ0MWYzOTUzNzY3IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgImlkIjogIjdhNDdjYzFlLThhZTUtNDU1MS1iMmQ4LThhNjgxMDhlMDk3NiIsCiAgICAgICAgICAgICAgICAibmFtZSI6ICJiIiwKICAgICAgICAgICAgICAgICJ2YWx1ZV90eXBlIjogewogICAgICAgICAgICAgICAgICAiU2NhbGFyIjogewogICAgICAgICAgICAgICAgICAgICJRdWFudGl0eSI6IHsKICAgICAgICAgICAgICAgICAgICAgICJMb2NhbCI6ICIxODhiOTExYy01ZjhiLTQzMWMtOWVlYS0yZDQxZjM5NTM3NjciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAicmVzdWx0IjogewogICAgICAgICAgICAgICJTY2FsYXIiOiB7CiAgICAgICAgICAgICAgICAiUXVhbnRpdHkiOiB7CiAgICAgICAgICAgICAgICAgICJMb2NhbCI6ICIxODhiOTExYy01ZjhiLTQzMWMtOWVlYS0yZDQxZjM5NTM3NjciCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAiZGVzY3JpcHRpb24iOiAiIiwKICAgICAgICAiaWQiOiAiZmQ3Y2U3YWItZjc4OS00MGJjLWI2OTktMGMzN2YxYjY5MDJmIiwKICAgICAgICAibmFtZSI6ICJDb21iaW5lIGR1cmF0aW9ucyIKICAgICAgfQogICAgfSwKICAgICJkZXNjcmlwdGlvbiI6ICJBIGNvbXBsZXRlIHByb3Bvc2VkIGFuYWx5c2lzIG1vZGVsLiBTY2hlbWEgOCBhbmQgdGhlIG5ldyBkZWNsYXJhdGlvbnMgYXJlIG5vdCBpbXBsZW1lbnRlZCBzb3VyY2U3IHN5bnRheC4iLAogICAgImRpYWdyYW1zIjoge30sCiAgICAiZWxlbWVudHMiOiB7CiAgICAgICIzODAzNmM2NS0xNmQ0LTQ0OWMtODM3Yi05MWViMTQxYzFkOTMiOiB7CiAgICAgICAgImFsaWFzIjogImRlZ3JhZGVkIiwKICAgICAgICAiYm9keSI6IHsKICAgICAgICAgICJPYSI6IHsKICAgICAgICAgICAgIlNoYXJlZCI6IHsKICAgICAgICAgICAgICAiQW5hbHlzaXNDYXNlIjogewogICAgICAgICAgICAgICAgImJhc2UiOiAiTW9kZWxCYXNlbGluZSIsCiAgICAgICAgICAgICAgICAib3ZlcnJpZGVzIjogewogICAgICAgICAgICAgICAgICAiNjNhOTMxYzItNjc1YS00ZmNlLTg5ZTUtMDQzNjFjYjk5NDUwIjogewogICAgICAgICAgICAgICAgICAgICJFeHByZXNzaW9uIjogewogICAgICAgICAgICAgICAgICAgICAgIlF1YW50aXR5IjogewogICAgICAgICAgICAgICAgICAgICAgICAibWFnbml0dWRlIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICJkZW5vbWluYXRvciI6ICIxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAibnVtZXJhdG9yIjogIjEyNTAiCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICJ1bml0IjogewogICAgICAgICAgICAgICAgICAgICAgICAgICJMb2NhbCI6ICIzOTA1M2YzNy1mZWM5LTQ3MDgtOWYwYS0zOTU5ZDIyM2Y4OTEiCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAic3ViamVjdCI6IG51bGwKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJkZXNjcmlwdGlvbiI6ICIiLAogICAgICAgICJpZCI6ICIzODAzNmM2NS0xNmQ0LTQ0OWMtODM3Yi05MWViMTQxYzFkOTMiLAogICAgICAgICJuYW1lIjogIkRlZ3JhZGVkIHJhZGlvIiwKICAgICAgICAicGFyZW50IjogbnVsbAogICAgICB9LAogICAgICAiNDM3YmVkYmItMmNmNC00NGVlLWExMzktNjU2M2NjNTA4NmVjIjogewogICAgICAgICJhbGlhcyI6ICJsaW1pdCIsCiAgICAgICAgImJvZHkiOiB7CiAgICAgICAgICAiT2EiOiB7CiAgICAgICAgICAgICJTaGFyZWQiOiB7CiAgICAgICAgICAgICAgIkVuZ2luZWVyaW5nUHJvcGVydHkiOiB7CiAgICAgICAgICAgICAgICAiYmFzZSI6IHsKICAgICAgICAgICAgICAgICAgIkV4cHJlc3Npb24iOiB7CiAgICAgICAgICAgICAgICAgICAgIlF1YW50aXR5IjogewogICAgICAgICAgICAgICAgICAgICAgIm1hZ25pdHVkZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImRlbm9taW5hdG9yIjogIjEiLAogICAgICAgICAgICAgICAgICAgICAgICAibnVtZXJhdG9yIjogIjIiCiAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgInVuaXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJMb2NhbCI6ICI1MzRmNDY3Mi0xYmE1LTQxNTctOGIwYS1iOWNmNDFkMGEzY2UiCiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImRpc3BsYXlfdW5pdCI6IHsKICAgICAgICAgICAgICAgICAgIkxvY2FsIjogIjUzNGY0NjcyLTFiYTUtNDE1Ny04YjBhLWI5Y2Y0MWQwYTNjZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAic3ViamVjdCI6IHsKICAgICAgICAgICAgICAgICAgIkVsZW1lbnQiOiAiY2FiZWM2YTEtN2Q1ZC00OGYzLThkMmQtYTdmYzhjZjc4ZjU5IgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ2YWx1ZV90eXBlIjogewogICAgICAgICAgICAgICAgICAiU2NhbGFyIjogewogICAgICAgICAgICAgICAgICAgICJRdWFudGl0eSI6IHsKICAgICAgICAgICAgICAgICAgICAgICJMb2NhbCI6ICIxODhiOTExYy01ZjhiLTQzMWMtOWVlYS0yZDQxZjM5NTM3NjciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAiZGVzY3JpcHRpb24iOiAiIiwKICAgICAgICAiaWQiOiAiNDM3YmVkYmItMmNmNC00NGVlLWExMzktNjU2M2NjNTA4NmVjIiwKICAgICAgICAibmFtZSI6ICJBbGxvd2VkIGR1cmF0aW9uIiwKICAgICAgICAicGFyZW50IjogbnVsbAogICAgICB9LAogICAgICAiNGFiOWE4YTctNzU1Mi00ODhkLTk4NjItZTE0Yjg5ZTdiMzUzIjogewogICAgICAgICJhbGlhcyI6ICJyZWNlaXZlIiwKICAgICAgICAiYm9keSI6IHsKICAgICAgICAgICJPYSI6ICJBY3Rpdml0eSIKICAgICAgICB9LAogICAgICAgICJkZXNjcmlwdGlvbiI6ICIiLAogICAgICAgICJpZCI6ICI0YWI5YThhNy03NTUyLTQ4OGQtOTg2Mi1lMTRiODllN2IzNTMiLAogICAgICAgICJuYW1lIjogIlJlY2VpdmUiLAogICAgICAgICJwYXJlbnQiOiAiY2FiZWM2YTEtN2Q1ZC00OGYzLThkMmQtYTdmYzhjZjc4ZjU5IgogICAgICB9LAogICAgICAiNjNhOTMxYzItNjc1YS00ZmNlLTg5ZTUtMDQzNjFjYjk5NDUwIjogewogICAgICAgICJhbGlhcyI6ICJyZWNlaXZlX3RpbWUiLAogICAgICAgICJib2R5IjogewogICAgICAgICAgIk9hIjogewogICAgICAgICAgICAiU2hhcmVkIjogewogICAgICAgICAgICAgICJFbmdpbmVlcmluZ1Byb3BlcnR5IjogewogICAgICAgICAgICAgICAgImJhc2UiOiB7CiAgICAgICAgICAgICAgICAgICJFeHByZXNzaW9uIjogewogICAgICAgICAgICAgICAgICAgICJRdWFudGl0eSI6IHsKICAgICAgICAgICAgICAgICAgICAgICJtYWduaXR1ZGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJkZW5vbWluYXRvciI6ICIxIiwKICAgICAgICAgICAgICAgICAgICAgICAgIm51bWVyYXRvciI6ICI3NTAiCiAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgInVuaXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJMb2NhbCI6ICIzOTA1M2YzNy1mZWM5LTQ3MDgtOWYwYS0zOTU5ZDIyM2Y4OTEiCiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImRpc3BsYXlfdW5pdCI6IHsKICAgICAgICAgICAgICAgICAgIkxvY2FsIjogIjM5MDUzZjM3LWZlYzktNDcwOC05ZjBhLTM5NTlkMjIzZjg5MSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAic3ViamVjdCI6IHsKICAgICAgICAgICAgICAgICAgIkVsZW1lbnQiOiAiNGFiOWE4YTctNzU1Mi00ODhkLTk4NjItZTE0Yjg5ZTdiMzUzIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ2YWx1ZV90eXBlIjogewogICAgICAgICAgICAgICAgICAiU2NhbGFyIjogewogICAgICAgICAgICAgICAgICAgICJRdWFudGl0eSI6IHsKICAgICAgICAgICAgICAgICAgICAgICJMb2NhbCI6ICIxODhiOTExYy01ZjhiLTQzMWMtOWVlYS0yZDQxZjM5NTM3NjciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAiZGVzY3JpcHRpb24iOiAiIiwKICAgICAgICAiaWQiOiAiNjNhOTMxYzItNjc1YS00ZmNlLTg5ZTUtMDQzNjFjYjk5NDUwIiwKICAgICAgICAibmFtZSI6ICJSZWNlaXZlIHRpbWUiLAogICAgICAgICJwYXJlbnQiOiBudWxsCiAgICAgIH0sCiAgICAgICI2ZGY5OTFiYS00YzVlLTQ1MzUtOTllMi01MjRhZTI3NGVlOGIiOiB7CiAgICAgICAgImFsaWFzIjogImRpc3BhdGNoIiwKICAgICAgICAiYm9keSI6IHsKICAgICAgICAgICJPYSI6ICJBY3Rpdml0eSIKICAgICAgICB9LAogICAgICAgICJkZXNjcmlwdGlvbiI6ICIiLAogICAgICAgICJpZCI6ICI2ZGY5OTFiYS00YzVlLTQ1MzUtOTllMi01MjRhZTI3NGVlOGIiLAogICAgICAgICJuYW1lIjogIkRpc3BhdGNoIiwKICAgICAgICAicGFyZW50IjogImNhYmVjNmExLTdkNWQtNDhmMy04ZDJkLWE3ZmM4Y2Y3OGY1OSIKICAgICAgfSwKICAgICAgIjk5ZDNlMDlhLTBlYzMtNDE5NC05ZGQ0LTlmM2RlNjYyNWNkZSI6IHsKICAgICAgICAiYWxpYXMiOiAidW5tZWFzdXJlZCIsCiAgICAgICAgImJvZHkiOiB7CiAgICAgICAgICAiT2EiOiB7CiAgICAgICAgICAgICJTaGFyZWQiOiB7CiAgICAgICAgICAgICAgIkFuYWx5c2lzQ2FzZSI6IHsKICAgICAgICAgICAgICAgICJiYXNlIjogIk1vZGVsQmFzZWxpbmUiLAogICAgICAgICAgICAgICAgIm92ZXJyaWRlcyI6IHsKICAgICAgICAgICAgICAgICAgIjYzYTkzMWMyLTY3NWEtNGZjZS04OWU1LTA0MzYxY2I5OTQ1MCI6ICJVbmJvdW5kIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJzdWJqZWN0IjogbnVsbAogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgImRlc2NyaXB0aW9uIjogIiIsCiAgICAgICAgImlkIjogIjk5ZDNlMDlhLTBlYzMtNDE5NC05ZGQ0LTlmM2RlNjYyNWNkZSIsCiAgICAgICAgIm5hbWUiOiAiVW5tZWFzdXJlZCByYWRpbyIsCiAgICAgICAgInBhcmVudCI6IG51bGwKICAgICAgfSwKICAgICAgImJhYzBkZTk5LTlkMmYtNGU1My05MTU4LWQ0MjRlY2FjNjFiZiI6IHsKICAgICAgICAiYWxpYXMiOiAiYnVkZ2V0IiwKICAgICAgICAiYm9keSI6IHsKICAgICAgICAgICJPYSI6IHsKICAgICAgICAgICAgIlNoYXJlZCI6IHsKICAgICAgICAgICAgICAiQW5hbHlzaXNDaGVjayI6IHsKICAgICAgICAgICAgICAgICJkb2N1bWVudGVkX2NvbnN0cmFpbnQiOiBudWxsLAogICAgICAgICAgICAgICAgInByZWRpY2F0ZSI6IHsKICAgICAgICAgICAgICAgICAgIkV4cHJlc3Npb24iOiB7CiAgICAgICAgICAgICAgICAgICAgIkJpbmFyeSI6IHsKICAgICAgICAgICAgICAgICAgICAgICJsZWZ0IjogewogICAgICAgICAgICAgICAgICAgICAgICAiUHJvcGVydHkiOiAiYmQ1YjY4ZTgtNjVmYy00ZTM1LTkwNzEtYTczMDYxMzE2YTRiIgogICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICJvcCI6ICJMZXNzT3JFcXVhbCIsCiAgICAgICAgICAgICAgICAgICAgICAicmlnaHQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJQcm9wZXJ0eSI6ICI0MzdiZWRiYi0yY2Y0LTQ0ZWUtYTEzOS02NTYzY2M1MDg2ZWMiCiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInN1YmplY3QiOiBudWxsCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAiZGVzY3JpcHRpb24iOiAiIiwKICAgICAgICAiaWQiOiAiYmFjMGRlOTktOWQyZi00ZTUzLTkxNTgtZDQyNGVjYWM2MWJmIiwKICAgICAgICAibmFtZSI6ICJSZXNwb25zZSBidWRnZXQiLAogICAgICAgICJwYXJlbnQiOiBudWxsCiAgICAgIH0sCiAgICAgICJiZDViNjhlOC02NWZjLTRlMzUtOTA3MS1hNzMwNjEzMTZhNGIiOiB7CiAgICAgICAgImFsaWFzIjogInRvdGFsX3RpbWUiLAogICAgICAgICJib2R5IjogewogICAgICAgICAgIk9hIjogewogICAgICAgICAgICAiU2hhcmVkIjogewogICAgICAgICAgICAgICJFbmdpbmVlcmluZ1Byb3BlcnR5IjogewogICAgICAgICAgICAgICAgImJhc2UiOiB7CiAgICAgICAgICAgICAgICAgICJFeHByZXNzaW9uIjogewogICAgICAgICAgICAgICAgICAgICJDYWxsIjogewogICAgICAgICAgICAgICAgICAgICAgImFyZ3VtZW50cyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgIjI4ZmY0MGIwLTFiOGYtNDczNS04NTM2LTVhNmFiMjFiNTZjYiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvcGVydHkiOiAiNjNhOTMxYzItNjc1YS00ZmNlLTg5ZTUtMDQzNjFjYjk5NDUwIgogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAiN2E0N2NjMWUtOGFlNS00NTUxLWIyZDgtOGE2ODEwOGUwOTc2IjogewogICAgICAgICAgICAgICAgICAgICAgICAgICJQcm9wZXJ0eSI6ICJjMzNmYzc3Mi0yYTYwLTQwNDQtOWFmOS03M2M2MWM1NjNhY2UiCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAiZGVmaW5pdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgIkxvY2FsIjogImZkN2NlN2FiLWY3ODktNDBiYy1iNjk5LTBjMzdmMWI2OTAyZiIKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZGlzcGxheV91bml0IjogewogICAgICAgICAgICAgICAgICAiTG9jYWwiOiAiNTM0ZjQ2NzItMWJhNS00MTU3LThiMGEtYjljZjQxZDBhM2NlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJzdWJqZWN0IjogewogICAgICAgICAgICAgICAgICAiRWxlbWVudCI6ICJjYWJlYzZhMS03ZDVkLTQ4ZjMtOGQyZC1hN2ZjOGNmNzhmNTkiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInZhbHVlX3R5cGUiOiB7CiAgICAgICAgICAgICAgICAgICJTY2FsYXIiOiB7CiAgICAgICAgICAgICAgICAgICAgIlF1YW50aXR5IjogewogICAgICAgICAgICAgICAgICAgICAgIkxvY2FsIjogIjE4OGI5MTFjLTVmOGItNDMxYy05ZWVhLTJkNDFmMzk1Mzc2NyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJkZXNjcmlwdGlvbiI6ICIiLAogICAgICAgICJpZCI6ICJiZDViNjhlOC02NWZjLTRlMzUtOTA3MS1hNzMwNjEzMTZhNGIiLAogICAgICAgICJuYW1lIjogIlRvdGFsIHRpbWUiLAogICAgICAgICJwYXJlbnQiOiBudWxsCiAgICAgIH0sCiAgICAgICJjMzNmYzc3Mi0yYTYwLTQwNDQtOWFmOS03M2M2MWM1NjNhY2UiOiB7CiAgICAgICAgImFsaWFzIjogImRpc3BhdGNoX3RpbWUiLAogICAgICAgICJib2R5IjogewogICAgICAgICAgIk9hIjogewogICAgICAgICAgICAiU2hhcmVkIjogewogICAgICAgICAgICAgICJFbmdpbmVlcmluZ1Byb3BlcnR5IjogewogICAgICAgICAgICAgICAgImJhc2UiOiB7CiAgICAgICAgICAgICAgICAgICJFeHByZXNzaW9uIjogewogICAgICAgICAgICAgICAgICAgICJRdWFudGl0eSI6IHsKICAgICAgICAgICAgICAgICAgICAgICJtYWduaXR1ZGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJkZW5vbWluYXRvciI6ICIxIiwKICAgICAgICAgICAgICAgICAgICAgICAgIm51bWVyYXRvciI6ICIxIgogICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICJ1bml0IjogewogICAgICAgICAgICAgICAgICAgICAgICAiTG9jYWwiOiAiNTM0ZjQ2NzItMWJhNS00MTU3LThiMGEtYjljZjQxZDBhM2NlIgogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJkaXNwbGF5X3VuaXQiOiB7CiAgICAgICAgICAgICAgICAgICJMb2NhbCI6ICI1MzRmNDY3Mi0xYmE1LTQxNTctOGIwYS1iOWNmNDFkMGEzY2UiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInN1YmplY3QiOiB7CiAgICAgICAgICAgICAgICAgICJFbGVtZW50IjogIjZkZjk5MWJhLTRjNWUtNDUzNS05OWUyLTUyNGFlMjc0ZWU4YiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAidmFsdWVfdHlwZSI6IHsKICAgICAgICAgICAgICAgICAgIlNjYWxhciI6IHsKICAgICAgICAgICAgICAgICAgICAiUXVhbnRpdHkiOiB7CiAgICAgICAgICAgICAgICAgICAgICAiTG9jYWwiOiAiMTg4YjkxMWMtNWY4Yi00MzFjLTllZWEtMmQ0MWYzOTUzNzY3IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgImRlc2NyaXB0aW9uIjogIiIsCiAgICAgICAgImlkIjogImMzM2ZjNzcyLTJhNjAtNDA0NC05YWY5LTczYzYxYzU2M2FjZSIsCiAgICAgICAgIm5hbWUiOiAiRGlzcGF0Y2ggdGltZSIsCiAgICAgICAgInBhcmVudCI6IG51bGwKICAgICAgfSwKICAgICAgImNhYmVjNmExLTdkNWQtNDhmMy04ZDJkLWE3ZmM4Y2Y3OGY1OSI6IHsKICAgICAgICAiYWxpYXMiOiAicmVzcG9uZCIsCiAgICAgICAgImJvZHkiOiB7CiAgICAgICAgICAiT2EiOiAiQWN0aXZpdHkiCiAgICAgICAgfSwKICAgICAgICAiZGVzY3JpcHRpb24iOiAiIiwKICAgICAgICAiaWQiOiAiY2FiZWM2YTEtN2Q1ZC00OGYzLThkMmQtYTdmYzhjZjc4ZjU5IiwKICAgICAgICAibmFtZSI6ICJSZXNwb25kIiwKICAgICAgICAicGFyZW50IjogbnVsbAogICAgICB9CiAgICB9LAogICAgImlkIjogIjQyMTBiOWYyLTcwNDYtNDdmMC1hYTNiLTE1M2Y2MjZhNTc5ZCIsCiAgICAiaW1wb3J0cyI6IHt9LAogICAgImxpYnJhcnlfaW5zdGFuY2VzIjoge30sCiAgICAibmFtZSI6ICJSZXNwb25zZSBidWRnZXQiLAogICAgInJlbGF0aW9ucyI6IHt9LAogICAgInNjaGVtYV92ZXJzaW9uIjogOCwKICAgICJ0cmFjZXMiOiB7fQogIH0sCiAgInBhY2thZ2VzIjoge30sCiAgInNvdXJjZSI6IHsKICAgICJlbnRyeSI6ICJhY3RpdmUuYXJjYWRpYSIsCiAgICAiZmlsZXMiOiB7CiAgICAgICJhY3RpdmUuYXJjYWRpYSI6ICJhcmNhZGlhIDg7XG5wcm9qZWN0IHJlc3BvbnNlX2J1ZGdldCBcIlJlc3BvbnNlIGJ1ZGdldFwiIGlkIFwiNDIxMGI5ZjItNzA0Ni00N2YwLWFhM2ItMTUzZjYyNmE1NzlkXCIge1xuICAgIGRlc2NyaXB0aW9uIFwiQSBjb21wbGV0ZSBwcm9wb3NlZCBhbmFseXNpcyBtb2RlbC4gU2NoZW1hIDggYW5kIHRoZSBuZXcgZGVjbGFyYXRpb25zIGFyZSBub3QgaW1wbGVtZW50ZWQgc291cmNlNyBzeW50YXguXCI7XG5cbiAgICBxdWFudGl0eV9raW5kIGR1cmF0aW9uIFwiRHVyYXRpb25cIiBpZCBcIjE4OGI5MTFjLTVmOGItNDMxYy05ZWVhLTJkNDFmMzk1Mzc2N1wiIHtcbiAgICAgICAgZGltZW5zaW9uIHsgdGltZTogMTsgfVxuICAgICAgICBhbGdlYnJhIExpbmVhcjtcbiAgICB9XG4gICAgdW5pdCBzZWNvbmQgXCJTZWNvbmRcIiBpZCBcIjUzNGY0NjcyLTFiYTUtNDE1Ny04YjBhLWI5Y2Y0MWQwYTNjZVwiIHtcbiAgICAgICAga2luZCBAZHVyYXRpb247IHNjYWxlIDE7IG9mZnNldCAwOyBzeW1ib2wgXCJzXCI7XG4gICAgfVxuICAgIHVuaXQgbWlsbGlzZWNvbmQgXCJNaWxsaXNlY29uZFwiIGlkIFwiMzkwNTNmMzctZmVjOS00NzA4LTlmMGEtMzk1OWQyMjNmODkxXCIge1xuICAgICAgICBraW5kIEBkdXJhdGlvbjsgc2NhbGUgcmF0aW8oMSwgMTAwMCk7IG9mZnNldCAwOyBzeW1ib2wgXCJtc1wiO1xuICAgIH1cbiAgICBjYWxjdWxhdGlvbiBjb21iaW5lIFwiQ29tYmluZSBkdXJhdGlvbnNcIiBpZCBcImZkN2NlN2FiLWY3ODktNDBiYy1iNjk5LTBjMzdmMWI2OTAyZlwiIHtcbiAgICAgICAgaW5wdXQgYSBpZCBcIjI4ZmY0MGIwLTFiOGYtNDczNS04NTM2LTVhNmFiMjFiNTZjYlwiIDogUXVhbnRpdHkoQGR1cmF0aW9uKTtcbiAgICAgICAgaW5wdXQgYiBpZCBcIjdhNDdjYzFlLThhZTUtNDU1MS1iMmQ4LThhNjgxMDhlMDk3NlwiIDogUXVhbnRpdHkoQGR1cmF0aW9uKTtcbiAgICAgICAgcmVzdWx0IFF1YW50aXR5KEBkdXJhdGlvbik7XG4gICAgICAgIGJvZHkgJGEgKyAkYjtcbiAgICB9XG5cbiAgICBvYV9hY3Rpdml0eSByZXNwb25kIFwiUmVzcG9uZFwiIGlkIFwiY2FiZWM2YTEtN2Q1ZC00OGYzLThkMmQtYTdmYzhjZjc4ZjU5XCIge1xuICAgICAgICBvYV9hY3Rpdml0eSByZWNlaXZlIFwiUmVjZWl2ZVwiIGlkIFwiNGFiOWE4YTctNzU1Mi00ODhkLTk4NjItZTE0Yjg5ZTdiMzUzXCIge31cbiAgICAgICAgb2FfYWN0aXZpdHkgZGlzcGF0Y2ggXCJEaXNwYXRjaFwiIGlkIFwiNmRmOTkxYmEtNGM1ZS00NTM1LTk5ZTItNTI0YWUyNzRlZThiXCIge31cbiAgICB9XG4gICAgb2FfcHJvcGVydHkgcmVjZWl2ZV90aW1lIFwiUmVjZWl2ZSB0aW1lXCIgaWQgXCI2M2E5MzFjMi02NzVhLTRmY2UtODllNS0wNDM2MWNiOTk0NTBcIiB7XG4gICAgICAgIHN1YmplY3QgQHJlY2VpdmU7IHR5cGUgUXVhbnRpdHkoQGR1cmF0aW9uKTsgZGlzcGxheV91bml0IEBtaWxsaXNlY29uZDtcbiAgICAgICAgYmFzZSA3NTAgW0BtaWxsaXNlY29uZF07XG4gICAgfVxuICAgIG9hX3Byb3BlcnR5IGRpc3BhdGNoX3RpbWUgXCJEaXNwYXRjaCB0aW1lXCIgaWQgXCJjMzNmYzc3Mi0yYTYwLTQwNDQtOWFmOS03M2M2MWM1NjNhY2VcIiB7XG4gICAgICAgIHN1YmplY3QgQGRpc3BhdGNoOyB0eXBlIFF1YW50aXR5KEBkdXJhdGlvbik7IGRpc3BsYXlfdW5pdCBAc2Vjb25kO1xuICAgICAgICBiYXNlIDEgW0BzZWNvbmRdO1xuICAgIH1cbiAgICBvYV9wcm9wZXJ0eSB0b3RhbF90aW1lIFwiVG90YWwgdGltZVwiIGlkIFwiYmQ1YjY4ZTgtNjVmYy00ZTM1LTkwNzEtYTczMDYxMzE2YTRiXCIge1xuICAgICAgICBzdWJqZWN0IEByZXNwb25kOyB0eXBlIFF1YW50aXR5KEBkdXJhdGlvbik7IGRpc3BsYXlfdW5pdCBAc2Vjb25kO1xuICAgICAgICAvLyBUaGUgZm9ybXVsYSBpcyBzaGFyZWQuIEV2ZXJ5IHJlYWQgdXNlcyB0aGUgcmVxdWVzdGVkIGV2YWx1YXRpb24gY29udGV4dC5cbiAgICAgICAgYmFzZSBAY29tYmluZShhOiBAcmVjZWl2ZV90aW1lLCBiOiBAZGlzcGF0Y2hfdGltZSk7XG4gICAgfVxuICAgIG9hX3Byb3BlcnR5IGxpbWl0IFwiQWxsb3dlZCBkdXJhdGlvblwiIGlkIFwiNDM3YmVkYmItMmNmNC00NGVlLWExMzktNjU2M2NjNTA4NmVjXCIge1xuICAgICAgICBzdWJqZWN0IEByZXNwb25kOyB0eXBlIFF1YW50aXR5KEBkdXJhdGlvbik7IGRpc3BsYXlfdW5pdCBAc2Vjb25kO1xuICAgICAgICBiYXNlIDIgW0BzZWNvbmRdO1xuICAgIH1cbiAgICBvYV9jaGVjayBidWRnZXQgXCJSZXNwb25zZSBidWRnZXRcIiBpZCBcImJhYzBkZTk5LTlkMmYtNGU1My05MTU4LWQ0MjRlY2FjNjFiZlwiIHtcbiAgICAgICAgc3ViamVjdCBub25lOyBkb2N1bWVudGVkX2NvbnN0cmFpbnQgbm9uZTtcbiAgICAgICAgcHJlZGljYXRlIEB0b3RhbF90aW1lIDw9IEBsaW1pdDtcbiAgICB9XG4gICAgb2FfYW5hbHlzaXMgZGVncmFkZWQgXCJEZWdyYWRlZCByYWRpb1wiIGlkIFwiMzgwMzZjNjUtMTZkNC00NDljLTgzN2ItOTFlYjE0MWMxZDkzXCIge1xuICAgICAgICBzdWJqZWN0IG5vbmU7IGJhc2UgTW9kZWxCYXNlbGluZTtcbiAgICAgICAgb3ZlcnJpZGVzIHsgQHJlY2VpdmVfdGltZSA9IDEyNTAgW0BtaWxsaXNlY29uZF07IH1cbiAgICB9XG4gICAgb2FfYW5hbHlzaXMgdW5tZWFzdXJlZCBcIlVubWVhc3VyZWQgcmFkaW9cIiBpZCBcIjk5ZDNlMDlhLTBlYzMtNDE5NC05ZGQ0LTlmM2RlNjYyNWNkZVwiIHtcbiAgICAgICAgc3ViamVjdCBub25lOyBiYXNlIE1vZGVsQmFzZWxpbmU7XG4gICAgICAgIG92ZXJyaWRlcyB7IEByZWNlaXZlX3RpbWUgPSB1bmJvdW5kOyB9XG4gICAgfVxufVxuIgogICAgfQogIH0KfQo=", + "media_type": "application/vnd.arcadia.portable-document+json", + "sha256": "6667773d90f83626f760b2faa2bf7d57638947d95574e3fa3e80b64416f01497" + }, + "check_predicates": [ + { + "check": "bac0de99-9d2f-4e53-9158-d424ecac61bf", + "predicate": { + "Expression": { + "Binary": { + "left": { + "Property": "bd5b68e8-65fc-4e35-9071-a73061316a4b" + }, + "op": "LessOrEqual", + "right": { + "Property": "437bedbb-2cf4-44ee-a139-6563cc5086ec" + } + } + } + } + } + ], + "context": { + "Case": "38036c65-16d4-449c-837b-91eb141c1d93" + }, + "definition_capture": { + "document_sha256": "6667773d90f83626f760b2faa2bf7d57638947d95574e3fa3e80b64416f01497", + "imports": [], + "local_definitions": [ + "188b911c-5f8b-431c-9eea-2d41f3953767", + "39053f37-fec9-4708-9f0a-3959d223f891", + "534f4672-1ba5-4157-8b0a-b9cf41d0a3ce", + "fd7ce7ab-f789-40bc-b699-0c37f1b6902f" + ] + }, + "effective_bindings": [ + { + "binding": { + "Expression": { + "Quantity": { + "magnitude": { + "denominator": "1", + "numerator": "2" + }, + "unit": { + "Local": "534f4672-1ba5-4157-8b0a-b9cf41d0a3ce" + } + } + } + }, + "origin": "ModelBaseline", + "property": "437bedbb-2cf4-44ee-a139-6563cc5086ec" + }, + { + "binding": { + "Expression": { + "Quantity": { + "magnitude": { + "denominator": "1", + "numerator": "1250" + }, + "unit": { + "Local": "39053f37-fec9-4708-9f0a-3959d223f891" + } + } + } + }, + "origin": { + "CaseOverride": "38036c65-16d4-449c-837b-91eb141c1d93" + }, + "property": "63a931c2-675a-4fce-89e5-04361cb99450" + }, + { + "binding": { + "Expression": { + "Call": { + "arguments": { + "28ff40b0-1b8f-4735-8536-5a6ab21b56cb": { + "Property": "63a931c2-675a-4fce-89e5-04361cb99450" + }, + "7a47cc1e-8ae5-4551-b2d8-8a68108e0976": { + "Property": "c33fc772-2a60-4044-9af9-73c61c563ace" + } + }, + "definition": { + "Local": "fd7ce7ab-f789-40bc-b699-0c37f1b6902f" + } + } + } + }, + "origin": "ModelBaseline", + "property": "bd5b68e8-65fc-4e35-9071-a73061316a4b" + }, + { + "binding": { + "Expression": { + "Quantity": { + "magnitude": { + "denominator": "1", + "numerator": "1" + }, + "unit": { + "Local": "534f4672-1ba5-4157-8b0a-b9cf41d0a3ce" + } + } + } + }, + "origin": "ModelBaseline", + "property": "c33fc772-2a60-4044-9af9-73c61c563ace" + } + ], + "format": "arcadia-analysis-freeze-1-proposal", + "model_id": "4210b9f2-7046-47f0-aa3b-153f626a579d", + "numeric_profile": "Q1-exact-1", + "origin": { + "Local": { + "accepted_revision": 1, + "document_instance": "d911a3c0-8adb-4203-850c-b16e9b4e4d0a" + } + }, + "targets": { + "checks": [ + "bac0de99-9d2f-4e53-9158-d424ecac61bf" + ], + "properties": [ + "bd5b68e8-65fc-4e35-9071-a73061316a4b" + ] + } +} diff --git a/harness/experiments/analysis-baseline-20260911/portable-document.json.proposed b/harness/experiments/analysis-baseline-20260911/portable-document.json.proposed new file mode 100644 index 00000000..8dc797ae --- /dev/null +++ b/harness/experiments/analysis-baseline-20260911/portable-document.json.proposed @@ -0,0 +1,425 @@ +{ + "model": { + "alias": "response_budget", + "artifact_links": {}, + "definition_mounts": {}, + "definitions": { + "188b911c-5f8b-431c-9eea-2d41f3953767": { + "alias": "duration", + "body": { + "QuantityKind": { + "algebra": "Linear", + "dimension": [ + 0, + 0, + 1, + 0, + 0, + 0, + 0 + ] + } + }, + "description": "", + "id": "188b911c-5f8b-431c-9eea-2d41f3953767", + "name": "Duration" + }, + "39053f37-fec9-4708-9f0a-3959d223f891": { + "alias": "millisecond", + "body": { + "Unit": { + "kind": { + "Local": "188b911c-5f8b-431c-9eea-2d41f3953767" + }, + "offset": { + "denominator": "1", + "numerator": "0" + }, + "scale": { + "denominator": "1000", + "numerator": "1" + }, + "symbol": "ms" + } + }, + "description": "", + "id": "39053f37-fec9-4708-9f0a-3959d223f891", + "name": "Millisecond" + }, + "534f4672-1ba5-4157-8b0a-b9cf41d0a3ce": { + "alias": "second", + "body": { + "Unit": { + "kind": { + "Local": "188b911c-5f8b-431c-9eea-2d41f3953767" + }, + "offset": { + "denominator": "1", + "numerator": "0" + }, + "scale": { + "denominator": "1", + "numerator": "1" + }, + "symbol": "s" + } + }, + "description": "", + "id": "534f4672-1ba5-4157-8b0a-b9cf41d0a3ce", + "name": "Second" + }, + "fd7ce7ab-f789-40bc-b699-0c37f1b6902f": { + "alias": "combine", + "body": { + "Calculation": { + "body": { + "Expression": { + "Binary": { + "left": { + "Parameter": "28ff40b0-1b8f-4735-8536-5a6ab21b56cb" + }, + "op": "Add", + "right": { + "Parameter": "7a47cc1e-8ae5-4551-b2d8-8a68108e0976" + } + } + } + }, + "parameters": [ + { + "id": "28ff40b0-1b8f-4735-8536-5a6ab21b56cb", + "name": "a", + "value_type": { + "Scalar": { + "Quantity": { + "Local": "188b911c-5f8b-431c-9eea-2d41f3953767" + } + } + } + }, + { + "id": "7a47cc1e-8ae5-4551-b2d8-8a68108e0976", + "name": "b", + "value_type": { + "Scalar": { + "Quantity": { + "Local": "188b911c-5f8b-431c-9eea-2d41f3953767" + } + } + } + } + ], + "result": { + "Scalar": { + "Quantity": { + "Local": "188b911c-5f8b-431c-9eea-2d41f3953767" + } + } + } + } + }, + "description": "", + "id": "fd7ce7ab-f789-40bc-b699-0c37f1b6902f", + "name": "Combine durations" + } + }, + "description": "A complete proposed analysis model. Schema 8 and the new declarations are not implemented source7 syntax.", + "diagrams": {}, + "elements": { + "38036c65-16d4-449c-837b-91eb141c1d93": { + "alias": "degraded", + "body": { + "Oa": { + "Shared": { + "AnalysisCase": { + "base": "ModelBaseline", + "overrides": { + "63a931c2-675a-4fce-89e5-04361cb99450": { + "Expression": { + "Quantity": { + "magnitude": { + "denominator": "1", + "numerator": "1250" + }, + "unit": { + "Local": "39053f37-fec9-4708-9f0a-3959d223f891" + } + } + } + } + }, + "subject": null + } + } + } + }, + "description": "", + "id": "38036c65-16d4-449c-837b-91eb141c1d93", + "name": "Degraded radio", + "parent": null + }, + "437bedbb-2cf4-44ee-a139-6563cc5086ec": { + "alias": "limit", + "body": { + "Oa": { + "Shared": { + "EngineeringProperty": { + "base": { + "Expression": { + "Quantity": { + "magnitude": { + "denominator": "1", + "numerator": "2" + }, + "unit": { + "Local": "534f4672-1ba5-4157-8b0a-b9cf41d0a3ce" + } + } + } + }, + "display_unit": { + "Local": "534f4672-1ba5-4157-8b0a-b9cf41d0a3ce" + }, + "subject": { + "Element": "cabec6a1-7d5d-48f3-8d2d-a7fc8cf78f59" + }, + "value_type": { + "Scalar": { + "Quantity": { + "Local": "188b911c-5f8b-431c-9eea-2d41f3953767" + } + } + } + } + } + } + }, + "description": "", + "id": "437bedbb-2cf4-44ee-a139-6563cc5086ec", + "name": "Allowed duration", + "parent": null + }, + "4ab9a8a7-7552-488d-9862-e14b89e7b353": { + "alias": "receive", + "body": { + "Oa": "Activity" + }, + "description": "", + "id": "4ab9a8a7-7552-488d-9862-e14b89e7b353", + "name": "Receive", + "parent": "cabec6a1-7d5d-48f3-8d2d-a7fc8cf78f59" + }, + "63a931c2-675a-4fce-89e5-04361cb99450": { + "alias": "receive_time", + "body": { + "Oa": { + "Shared": { + "EngineeringProperty": { + "base": { + "Expression": { + "Quantity": { + "magnitude": { + "denominator": "1", + "numerator": "750" + }, + "unit": { + "Local": "39053f37-fec9-4708-9f0a-3959d223f891" + } + } + } + }, + "display_unit": { + "Local": "39053f37-fec9-4708-9f0a-3959d223f891" + }, + "subject": { + "Element": "4ab9a8a7-7552-488d-9862-e14b89e7b353" + }, + "value_type": { + "Scalar": { + "Quantity": { + "Local": "188b911c-5f8b-431c-9eea-2d41f3953767" + } + } + } + } + } + } + }, + "description": "", + "id": "63a931c2-675a-4fce-89e5-04361cb99450", + "name": "Receive time", + "parent": null + }, + "6df991ba-4c5e-4535-99e2-524ae274ee8b": { + "alias": "dispatch", + "body": { + "Oa": "Activity" + }, + "description": "", + "id": "6df991ba-4c5e-4535-99e2-524ae274ee8b", + "name": "Dispatch", + "parent": "cabec6a1-7d5d-48f3-8d2d-a7fc8cf78f59" + }, + "99d3e09a-0ec3-4194-9dd4-9f3de6625cde": { + "alias": "unmeasured", + "body": { + "Oa": { + "Shared": { + "AnalysisCase": { + "base": "ModelBaseline", + "overrides": { + "63a931c2-675a-4fce-89e5-04361cb99450": "Unbound" + }, + "subject": null + } + } + } + }, + "description": "", + "id": "99d3e09a-0ec3-4194-9dd4-9f3de6625cde", + "name": "Unmeasured radio", + "parent": null + }, + "bac0de99-9d2f-4e53-9158-d424ecac61bf": { + "alias": "budget", + "body": { + "Oa": { + "Shared": { + "AnalysisCheck": { + "documented_constraint": null, + "predicate": { + "Expression": { + "Binary": { + "left": { + "Property": "bd5b68e8-65fc-4e35-9071-a73061316a4b" + }, + "op": "LessOrEqual", + "right": { + "Property": "437bedbb-2cf4-44ee-a139-6563cc5086ec" + } + } + } + }, + "subject": null + } + } + } + }, + "description": "", + "id": "bac0de99-9d2f-4e53-9158-d424ecac61bf", + "name": "Response budget", + "parent": null + }, + "bd5b68e8-65fc-4e35-9071-a73061316a4b": { + "alias": "total_time", + "body": { + "Oa": { + "Shared": { + "EngineeringProperty": { + "base": { + "Expression": { + "Call": { + "arguments": { + "28ff40b0-1b8f-4735-8536-5a6ab21b56cb": { + "Property": "63a931c2-675a-4fce-89e5-04361cb99450" + }, + "7a47cc1e-8ae5-4551-b2d8-8a68108e0976": { + "Property": "c33fc772-2a60-4044-9af9-73c61c563ace" + } + }, + "definition": { + "Local": "fd7ce7ab-f789-40bc-b699-0c37f1b6902f" + } + } + } + }, + "display_unit": { + "Local": "534f4672-1ba5-4157-8b0a-b9cf41d0a3ce" + }, + "subject": { + "Element": "cabec6a1-7d5d-48f3-8d2d-a7fc8cf78f59" + }, + "value_type": { + "Scalar": { + "Quantity": { + "Local": "188b911c-5f8b-431c-9eea-2d41f3953767" + } + } + } + } + } + } + }, + "description": "", + "id": "bd5b68e8-65fc-4e35-9071-a73061316a4b", + "name": "Total time", + "parent": null + }, + "c33fc772-2a60-4044-9af9-73c61c563ace": { + "alias": "dispatch_time", + "body": { + "Oa": { + "Shared": { + "EngineeringProperty": { + "base": { + "Expression": { + "Quantity": { + "magnitude": { + "denominator": "1", + "numerator": "1" + }, + "unit": { + "Local": "534f4672-1ba5-4157-8b0a-b9cf41d0a3ce" + } + } + } + }, + "display_unit": { + "Local": "534f4672-1ba5-4157-8b0a-b9cf41d0a3ce" + }, + "subject": { + "Element": "6df991ba-4c5e-4535-99e2-524ae274ee8b" + }, + "value_type": { + "Scalar": { + "Quantity": { + "Local": "188b911c-5f8b-431c-9eea-2d41f3953767" + } + } + } + } + } + } + }, + "description": "", + "id": "c33fc772-2a60-4044-9af9-73c61c563ace", + "name": "Dispatch time", + "parent": null + }, + "cabec6a1-7d5d-48f3-8d2d-a7fc8cf78f59": { + "alias": "respond", + "body": { + "Oa": "Activity" + }, + "description": "", + "id": "cabec6a1-7d5d-48f3-8d2d-a7fc8cf78f59", + "name": "Respond", + "parent": null + } + }, + "id": "4210b9f2-7046-47f0-aa3b-153f626a579d", + "imports": {}, + "library_instances": {}, + "name": "Response budget", + "relations": {}, + "schema_version": 8, + "traces": {} + }, + "packages": {}, + "source": { + "entry": "active.arcadia", + "files": { + "active.arcadia": "arcadia 8;\nproject response_budget \"Response budget\" id \"4210b9f2-7046-47f0-aa3b-153f626a579d\" {\n description \"A complete proposed analysis model. Schema 8 and the new declarations are not implemented source7 syntax.\";\n\n quantity_kind duration \"Duration\" id \"188b911c-5f8b-431c-9eea-2d41f3953767\" {\n dimension { time: 1; }\n algebra Linear;\n }\n unit second \"Second\" id \"534f4672-1ba5-4157-8b0a-b9cf41d0a3ce\" {\n kind @duration; scale 1; offset 0; symbol \"s\";\n }\n unit millisecond \"Millisecond\" id \"39053f37-fec9-4708-9f0a-3959d223f891\" {\n kind @duration; scale ratio(1, 1000); offset 0; symbol \"ms\";\n }\n calculation combine \"Combine durations\" id \"fd7ce7ab-f789-40bc-b699-0c37f1b6902f\" {\n input a id \"28ff40b0-1b8f-4735-8536-5a6ab21b56cb\" : Quantity(@duration);\n input b id \"7a47cc1e-8ae5-4551-b2d8-8a68108e0976\" : Quantity(@duration);\n result Quantity(@duration);\n body $a + $b;\n }\n\n oa_activity respond \"Respond\" id \"cabec6a1-7d5d-48f3-8d2d-a7fc8cf78f59\" {\n oa_activity receive \"Receive\" id \"4ab9a8a7-7552-488d-9862-e14b89e7b353\" {}\n oa_activity dispatch \"Dispatch\" id \"6df991ba-4c5e-4535-99e2-524ae274ee8b\" {}\n }\n oa_property receive_time \"Receive time\" id \"63a931c2-675a-4fce-89e5-04361cb99450\" {\n subject @receive; type Quantity(@duration); display_unit @millisecond;\n base 750 [@millisecond];\n }\n oa_property dispatch_time \"Dispatch time\" id \"c33fc772-2a60-4044-9af9-73c61c563ace\" {\n subject @dispatch; type Quantity(@duration); display_unit @second;\n base 1 [@second];\n }\n oa_property total_time \"Total time\" id \"bd5b68e8-65fc-4e35-9071-a73061316a4b\" {\n subject @respond; type Quantity(@duration); display_unit @second;\n // The formula is shared. Every read uses the requested evaluation context.\n base @combine(a: @receive_time, b: @dispatch_time);\n }\n oa_property limit \"Allowed duration\" id \"437bedbb-2cf4-44ee-a139-6563cc5086ec\" {\n subject @respond; type Quantity(@duration); display_unit @second;\n base 2 [@second];\n }\n oa_check budget \"Response budget\" id \"bac0de99-9d2f-4e53-9158-d424ecac61bf\" {\n subject none; documented_constraint none;\n predicate @total_time <= @limit;\n }\n oa_analysis degraded \"Degraded radio\" id \"38036c65-16d4-449c-837b-91eb141c1d93\" {\n subject none; base ModelBaseline;\n overrides { @receive_time = 1250 [@millisecond]; }\n }\n oa_analysis unmeasured \"Unmeasured radio\" id \"99d3e09a-0ec3-4194-9dd4-9f3de6625cde\" {\n subject none; base ModelBaseline;\n overrides { @receive_time = unbound; }\n }\n}\n" + } + } +} diff --git a/harness/experiments/analysis-baseline-20260911/r7-literal-boundaries.json b/harness/experiments/analysis-baseline-20260911/r7-literal-boundaries.json new file mode 100644 index 00000000..9c8aa284 --- /dev/null +++ b/harness/experiments/analysis-baseline-20260911/r7-literal-boundaries.json @@ -0,0 +1,32 @@ +[ + { + "canonical_source": "1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "expression": { + "Number": { + "denominator": "1", + "numerator": "1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + }, + "name": "ten_to_300" + }, + { + "canonical_source": "ratio(1, 522194440706576253345876355358312191289982124523691890192116741641976953985778728424413405967498779170445053357219631418993786719092896803631618043925682638972978488271854999170180795067191859157214035005927973113188159419698856372836167342172293308748403954352901852035642024370059304557233988891799014503343469488440893892973452815095130470299789726716411734651513348221529512507986199933857107770846917779942645743159118957217248367043905936319748237550094520674504208530837546834166925275516486044134775384991808184705966507606898412918594045916828375610659246423184062775112999150206172392431297837246097308511903252956622805412865917690043804311051417135098849101156584508839003337597742539960818209685142687562392007453579567729991395256699805775897135553415567045292136442139895777424891477161767258532611634530697452993846501061481697843891439474220308003706472837459911525285821188577408160690315522951458068463354171428220365223949985950890732881736611925133626529949897998045399734600887312408859224933727829625089164535236559716582775403784110923285873186648442456409760158728501220463308455437074192539205964902261490928669488824051563042951500651206733594863336608245755565801460390869016718045121902354170201577095168)", + "expression": { + "Number": { + "denominator": "522194440706576253345876355358312191289982124523691890192116741641976953985778728424413405967498779170445053357219631418993786719092896803631618043925682638972978488271854999170180795067191859157214035005927973113188159419698856372836167342172293308748403954352901852035642024370059304557233988891799014503343469488440893892973452815095130470299789726716411734651513348221529512507986199933857107770846917779942645743159118957217248367043905936319748237550094520674504208530837546834166925275516486044134775384991808184705966507606898412918594045916828375610659246423184062775112999150206172392431297837246097308511903252956622805412865917690043804311051417135098849101156584508839003337597742539960818209685142687562392007453579567729991395256699805775897135553415567045292136442139895777424891477161767258532611634530697452993846501061481697843891439474220308003706472837459911525285821188577408160690315522951458068463354171428220365223949985950890732881736611925133626529949897998045399734600887312408859224933727829625089164535236559716582775403784110923285873186648442456409760158728501220463308455437074192539205964902261490928669488824051563042951500651206733594863336608245755565801460390869016718045121902354170201577095168", + "numerator": "1" + } + }, + "name": "one_over_two_to_4095" + }, + { + "canonical_source": "ratio(-1044388881413152506691752710716624382579964249047383780384233483283953907971557456848826811934997558340890106714439262837987573438185793607263236087851365277945956976543709998340361590134383718314428070011855946226376318839397712745672334684344586617496807908705803704071284048740118609114467977783598029006686938976881787785946905630190260940599579453432823469303026696443059025015972399867714215541693835559885291486318237914434496734087811872639496475100189041349008417061675093668333850551032972088269550769983616369411933015213796825837188091833656751221318492846368125550225998300412344784862595674492194617023806505913245610825731835380087608622102834270197698202313169017678006675195485079921636419370285375124784014907159135459982790513399611551794271106831134090584272884279791554849782954323534517065223269061394905987693002122963395687782878948440616007412945674919823050571642377154816321380631045902916136926708342856440730447899971901781465763473223850267253059899795996090799469201774624817718449867455659250178329070473119433165550807568221846571746373296884912819520317457002440926616910874148385078411929804522981857338977648103126085903001302413467189726673216491511131602920781738033436090243804708340403154190335, 1)", + "expression": { + "Number": { + "denominator": "1", + "numerator": "-1044388881413152506691752710716624382579964249047383780384233483283953907971557456848826811934997558340890106714439262837987573438185793607263236087851365277945956976543709998340361590134383718314428070011855946226376318839397712745672334684344586617496807908705803704071284048740118609114467977783598029006686938976881787785946905630190260940599579453432823469303026696443059025015972399867714215541693835559885291486318237914434496734087811872639496475100189041349008417061675093668333850551032972088269550769983616369411933015213796825837188091833656751221318492846368125550225998300412344784862595674492194617023806505913245610825731835380087608622102834270197698202313169017678006675195485079921636419370285375124784014907159135459982790513399611551794271106831134090584272884279791554849782954323534517065223269061394905987693002122963395687782878948440616007412945674919823050571642377154816321380631045902916136926708342856440730447899971901781465763473223850267253059899795996090799469201774624817718449867455659250178329070473119433165550807568221846571746373296884912819520317457002440926616910874148385078411929804522981857338977648103126085903001302413467189726673216491511131602920781738033436090243804708340403154190335" + } + }, + "name": "negative_4096_bit_bound" + } +] diff --git a/harness/experiments/library-compatibility-20260911/EVIDENCE.json b/harness/experiments/library-compatibility-20260911/EVIDENCE.json new file mode 100644 index 00000000..f5f3cec0 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/EVIDENCE.json @@ -0,0 +1,426 @@ +{ + "recorded_utc": "2026-09-11T09:28:31.1120792Z", + "compiler": "rustc 1.98.1 (48a229cea 2026-09-01), x86_64-pc-windows-gnullvm, LLVM 22.1.8", + "compiler_commit": "48a229ceaefd4985c50990b14116b6d856af0985", + "flags": [ + "--edition=2024", + "-D", + "warnings", + "-C", + "linker=clang.exe" + ], + "source_sha256": "bc31bacf250f3711758717f18a3104696ed941c3c9b89817caa6a96e6540062a", + "executable_sha256": "652a15a96bd9b0cf2aa732c2273ec5e651c18e9d11d668a1ae5f214d120bb310", + "assertions_passed": 120, + "run_exit_code": 0, + "fresh_process_reopen_exit_code": 0, + "complete_updated_vs_expected_and_reopened_files_equal": 11, + "fixture_count": 81, + "files": [ + { + "path": "generated-final/01-initial/management/data1.mount", + "sha256": "828815e84eefc2efafb03895f19be38e561161a4b714905fa768f82f4b0b9e9e", + "bytes": 137 + }, + { + "path": "generated-final/01-initial/management/left/base.model", + "sha256": "d395e3cd67d2d0ee2cd5c2aeb685a9943cd5cde006c6d2a0c5e9362a2b718404", + "bytes": 501 + }, + { + "path": "generated-final/01-initial/management/left/lineage.model", + "sha256": "009ebf1f520d967b9281248f863f76e3e6df41944292a4bb88cfa3728c646826", + "bytes": 110 + }, + { + "path": "generated-final/01-initial/management/left/map.model", + "sha256": "ac8a85f5ca3faaf77b7a5a25a219c2b2cc9052c0d634a18f136f41b5726d69e9", + "bytes": 85 + }, + { + "path": "generated-final/01-initial/management/right/base.model", + "sha256": "4de79b75cc20bd3f5f66e5e7f2b9a6d11b36c66abc4253dc71243fe16547208e", + "bytes": 523 + }, + { + "path": "generated-final/01-initial/management/right/lineage.model", + "sha256": "3bc877618796da6639d7947ec46197d321e0ce60ec35bf3fb1d3662867b8215e", + "bytes": 120 + }, + { + "path": "generated-final/01-initial/management/right/map.model", + "sha256": "af64ecf111266362f9bf3765c71547608fefde72635a565d44e8acaefd664f5a", + "bytes": 90 + }, + { + "path": "generated-final/01-initial/packages/28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33.library", + "sha256": "28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33", + "bytes": 1116 + }, + { + "path": "generated-final/01-initial/project.model", + "sha256": "a4886ca964c12b435ba73f4df2259268fce8d3ab6297a339776f8bbec095a946", + "bytes": 1374 + }, + { + "path": "generated-final/01-recompiled/management/data1.mount", + "sha256": "828815e84eefc2efafb03895f19be38e561161a4b714905fa768f82f4b0b9e9e", + "bytes": 137 + }, + { + "path": "generated-final/01-recompiled/management/left/base.model", + "sha256": "d395e3cd67d2d0ee2cd5c2aeb685a9943cd5cde006c6d2a0c5e9362a2b718404", + "bytes": 501 + }, + { + "path": "generated-final/01-recompiled/management/left/lineage.model", + "sha256": "009ebf1f520d967b9281248f863f76e3e6df41944292a4bb88cfa3728c646826", + "bytes": 110 + }, + { + "path": "generated-final/01-recompiled/management/left/map.model", + "sha256": "ac8a85f5ca3faaf77b7a5a25a219c2b2cc9052c0d634a18f136f41b5726d69e9", + "bytes": 85 + }, + { + "path": "generated-final/01-recompiled/management/right/base.model", + "sha256": "4de79b75cc20bd3f5f66e5e7f2b9a6d11b36c66abc4253dc71243fe16547208e", + "bytes": 523 + }, + { + "path": "generated-final/01-recompiled/management/right/lineage.model", + "sha256": "3bc877618796da6639d7947ec46197d321e0ce60ec35bf3fb1d3662867b8215e", + "bytes": 120 + }, + { + "path": "generated-final/01-recompiled/management/right/map.model", + "sha256": "af64ecf111266362f9bf3765c71547608fefde72635a565d44e8acaefd664f5a", + "bytes": 90 + }, + { + "path": "generated-final/01-recompiled/packages/28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33.library", + "sha256": "28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33", + "bytes": 1116 + }, + { + "path": "generated-final/01-recompiled/project.model", + "sha256": "a4886ca964c12b435ba73f4df2259268fce8d3ab6297a339776f8bbec095a946", + "bytes": 1374 + }, + { + "path": "generated-final/02-edited/management/data1.mount", + "sha256": "828815e84eefc2efafb03895f19be38e561161a4b714905fa768f82f4b0b9e9e", + "bytes": 137 + }, + { + "path": "generated-final/02-edited/management/left/base.model", + "sha256": "d395e3cd67d2d0ee2cd5c2aeb685a9943cd5cde006c6d2a0c5e9362a2b718404", + "bytes": 501 + }, + { + "path": "generated-final/02-edited/management/left/lineage.model", + "sha256": "009ebf1f520d967b9281248f863f76e3e6df41944292a4bb88cfa3728c646826", + "bytes": 110 + }, + { + "path": "generated-final/02-edited/management/left/map.model", + "sha256": "ac8a85f5ca3faaf77b7a5a25a219c2b2cc9052c0d634a18f136f41b5726d69e9", + "bytes": 85 + }, + { + "path": "generated-final/02-edited/management/right/base.model", + "sha256": "4de79b75cc20bd3f5f66e5e7f2b9a6d11b36c66abc4253dc71243fe16547208e", + "bytes": 523 + }, + { + "path": "generated-final/02-edited/management/right/lineage.model", + "sha256": "3bc877618796da6639d7947ec46197d321e0ce60ec35bf3fb1d3662867b8215e", + "bytes": 120 + }, + { + "path": "generated-final/02-edited/management/right/map.model", + "sha256": "af64ecf111266362f9bf3765c71547608fefde72635a565d44e8acaefd664f5a", + "bytes": 90 + }, + { + "path": "generated-final/02-edited/packages/28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33.library", + "sha256": "28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33", + "bytes": 1116 + }, + { + "path": "generated-final/02-edited/project.model", + "sha256": "3864ae2655459b5881d2ee85a28d5a231a1c33cc9b478ace83eb9627a2603f32", + "bytes": 1416 + }, + { + "path": "generated-final/03-updated/management/data1.mount", + "sha256": "828815e84eefc2efafb03895f19be38e561161a4b714905fa768f82f4b0b9e9e", + "bytes": 137 + }, + { + "path": "generated-final/03-updated/management/data2.mount", + "sha256": "f33c8f5ae9d5d26035dc65cb12ba10c3fe6ce7a9bd412b8af9ffcee5ff2c2bbf", + "bytes": 137 + }, + { + "path": "generated-final/03-updated/management/left/base.model", + "sha256": "60de8b67c76bcf5630a3387b999d65e8e952e2f2147c585827055a1a169859dc", + "bytes": 501 + }, + { + "path": "generated-final/03-updated/management/left/lineage.model", + "sha256": "009ebf1f520d967b9281248f863f76e3e6df41944292a4bb88cfa3728c646826", + "bytes": 110 + }, + { + "path": "generated-final/03-updated/management/left/map.model", + "sha256": "ac8a85f5ca3faaf77b7a5a25a219c2b2cc9052c0d634a18f136f41b5726d69e9", + "bytes": 85 + }, + { + "path": "generated-final/03-updated/management/right/base.model", + "sha256": "4de79b75cc20bd3f5f66e5e7f2b9a6d11b36c66abc4253dc71243fe16547208e", + "bytes": 523 + }, + { + "path": "generated-final/03-updated/management/right/lineage.model", + "sha256": "3bc877618796da6639d7947ec46197d321e0ce60ec35bf3fb1d3662867b8215e", + "bytes": 120 + }, + { + "path": "generated-final/03-updated/management/right/map.model", + "sha256": "af64ecf111266362f9bf3765c71547608fefde72635a565d44e8acaefd664f5a", + "bytes": 90 + }, + { + "path": "generated-final/03-updated/packages/28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33.library", + "sha256": "28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33", + "bytes": 1116 + }, + { + "path": "generated-final/03-updated/packages/a35102e04b9f6822ab409ab43f83eded33edd0a3a3c1f589245bb7b123ce4779.library", + "sha256": "a35102e04b9f6822ab409ab43f83eded33edd0a3a3c1f589245bb7b123ce4779", + "bytes": 1121 + }, + { + "path": "generated-final/03-updated/project.model", + "sha256": "45698cd30d6b1fcd773585c2d4bd8d4c882aaa76f1d896afb183d6780f56dcc0", + "bytes": 1768 + }, + { + "path": "generated-final/04-reidentified/management/data1.mount", + "sha256": "828815e84eefc2efafb03895f19be38e561161a4b714905fa768f82f4b0b9e9e", + "bytes": 137 + }, + { + "path": "generated-final/04-reidentified/management/left/base.model", + "sha256": "d395e3cd67d2d0ee2cd5c2aeb685a9943cd5cde006c6d2a0c5e9362a2b718404", + "bytes": 501 + }, + { + "path": "generated-final/04-reidentified/management/left/lineage.model", + "sha256": "dbfe42380143f2ac00c641696d5084079e77c19c01cbea9f43753d72b113e331", + "bytes": 111 + }, + { + "path": "generated-final/04-reidentified/management/left/map.model", + "sha256": "1d27692c293091242195040269317ed1dd794de48aef37c7c98d4c8f8c194ac7", + "bytes": 86 + }, + { + "path": "generated-final/04-reidentified/management/right/base.model", + "sha256": "4de79b75cc20bd3f5f66e5e7f2b9a6d11b36c66abc4253dc71243fe16547208e", + "bytes": 523 + }, + { + "path": "generated-final/04-reidentified/management/right/lineage.model", + "sha256": "3bc877618796da6639d7947ec46197d321e0ce60ec35bf3fb1d3662867b8215e", + "bytes": 120 + }, + { + "path": "generated-final/04-reidentified/management/right/map.model", + "sha256": "af64ecf111266362f9bf3765c71547608fefde72635a565d44e8acaefd664f5a", + "bytes": 90 + }, + { + "path": "generated-final/04-reidentified/packages/28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33.library", + "sha256": "28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33", + "bytes": 1116 + }, + { + "path": "generated-final/04-reidentified/project.model", + "sha256": "b45e9b41f5aec27b0a39663ecae7154dbb14d5e8e938b93e30f94ca80c2f7104", + "bytes": 1419 + }, + { + "path": "generated-final/05-fresh-process-reopened/management/data1.mount", + "sha256": "828815e84eefc2efafb03895f19be38e561161a4b714905fa768f82f4b0b9e9e", + "bytes": 137 + }, + { + "path": "generated-final/05-fresh-process-reopened/management/data2.mount", + "sha256": "f33c8f5ae9d5d26035dc65cb12ba10c3fe6ce7a9bd412b8af9ffcee5ff2c2bbf", + "bytes": 137 + }, + { + "path": "generated-final/05-fresh-process-reopened/management/left/base.model", + "sha256": "60de8b67c76bcf5630a3387b999d65e8e952e2f2147c585827055a1a169859dc", + "bytes": 501 + }, + { + "path": "generated-final/05-fresh-process-reopened/management/left/lineage.model", + "sha256": "009ebf1f520d967b9281248f863f76e3e6df41944292a4bb88cfa3728c646826", + "bytes": 110 + }, + { + "path": "generated-final/05-fresh-process-reopened/management/left/map.model", + "sha256": "ac8a85f5ca3faaf77b7a5a25a219c2b2cc9052c0d634a18f136f41b5726d69e9", + "bytes": 85 + }, + { + "path": "generated-final/05-fresh-process-reopened/management/right/base.model", + "sha256": "4de79b75cc20bd3f5f66e5e7f2b9a6d11b36c66abc4253dc71243fe16547208e", + "bytes": 523 + }, + { + "path": "generated-final/05-fresh-process-reopened/management/right/lineage.model", + "sha256": "3bc877618796da6639d7947ec46197d321e0ce60ec35bf3fb1d3662867b8215e", + "bytes": 120 + }, + { + "path": "generated-final/05-fresh-process-reopened/management/right/map.model", + "sha256": "af64ecf111266362f9bf3765c71547608fefde72635a565d44e8acaefd664f5a", + "bytes": 90 + }, + { + "path": "generated-final/05-fresh-process-reopened/packages/28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33.library", + "sha256": "28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33", + "bytes": 1116 + }, + { + "path": "generated-final/05-fresh-process-reopened/packages/a35102e04b9f6822ab409ab43f83eded33edd0a3a3c1f589245bb7b123ce4779.library", + "sha256": "a35102e04b9f6822ab409ab43f83eded33edd0a3a3c1f589245bb7b123ce4779", + "bytes": 1121 + }, + { + "path": "generated-final/05-fresh-process-reopened/project.model", + "sha256": "45698cd30d6b1fcd773585c2d4bd8d4c882aaa76f1d896afb183d6780f56dcc0", + "bytes": 1768 + }, + { + "path": "generated-final/expected-full-updated/management/data1.mount", + "sha256": "828815e84eefc2efafb03895f19be38e561161a4b714905fa768f82f4b0b9e9e", + "bytes": 137 + }, + { + "path": "generated-final/expected-full-updated/management/data2.mount", + "sha256": "f33c8f5ae9d5d26035dc65cb12ba10c3fe6ce7a9bd412b8af9ffcee5ff2c2bbf", + "bytes": 137 + }, + { + "path": "generated-final/expected-full-updated/management/left/base.model", + "sha256": "60de8b67c76bcf5630a3387b999d65e8e952e2f2147c585827055a1a169859dc", + "bytes": 501 + }, + { + "path": "generated-final/expected-full-updated/management/left/lineage.model", + "sha256": "009ebf1f520d967b9281248f863f76e3e6df41944292a4bb88cfa3728c646826", + "bytes": 110 + }, + { + "path": "generated-final/expected-full-updated/management/left/map.model", + "sha256": "ac8a85f5ca3faaf77b7a5a25a219c2b2cc9052c0d634a18f136f41b5726d69e9", + "bytes": 85 + }, + { + "path": "generated-final/expected-full-updated/management/right/base.model", + "sha256": "4de79b75cc20bd3f5f66e5e7f2b9a6d11b36c66abc4253dc71243fe16547208e", + "bytes": 523 + }, + { + "path": "generated-final/expected-full-updated/management/right/lineage.model", + "sha256": "3bc877618796da6639d7947ec46197d321e0ce60ec35bf3fb1d3662867b8215e", + "bytes": 120 + }, + { + "path": "generated-final/expected-full-updated/management/right/map.model", + "sha256": "af64ecf111266362f9bf3765c71547608fefde72635a565d44e8acaefd664f5a", + "bytes": 90 + }, + { + "path": "generated-final/expected-full-updated/packages/28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33.library", + "sha256": "28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33", + "bytes": 1116 + }, + { + "path": "generated-final/expected-full-updated/packages/a35102e04b9f6822ab409ab43f83eded33edd0a3a3c1f589245bb7b123ce4779.library", + "sha256": "a35102e04b9f6822ab409ab43f83eded33edd0a3a3c1f589245bb7b123ce4779", + "bytes": 1121 + }, + { + "path": "generated-final/expected-full-updated/project.model", + "sha256": "45698cd30d6b1fcd773585c2d4bd8d4c882aaa76f1d896afb183d6780f56dcc0", + "bytes": 1768 + }, + { + "path": "generated-final/expected-initial.model", + "sha256": "470c2e384d217c6cfc818509381ac22fb38ff33074cd167141aab51858593065", + "bytes": 1035 + }, + { + "path": "generated-final/expected-key-records.model", + "sha256": "cab552e0674d17ecc6bbc2cb2acc7c156680d2aa7ca4b2eef617e59737152667", + "bytes": 558 + }, + { + "path": "generated-final/explicit-bridges.model", + "sha256": "7cc69321432fc414e248eefc76768004a301b76c870e1766ba22534a05bfa7e9", + "bytes": 338 + }, + { + "path": "generated-final/initial.request", + "sha256": "c18e02f799dd8635f979429991b66088fee5b0ef9fe56e9b6a7761fa1d5ec681", + "bytes": 330 + }, + { + "path": "generated-final/local-edit.request", + "sha256": "68a3253cbec698468ee6ee307d179f6e01d825111de5e522fdb6f57f07bca260", + "bytes": 34 + }, + { + "path": "generated-final/oa-sa-transition.model", + "sha256": "bb129c495d8f7dbc7eaaa470a3e83a7d8fb5630016696f4912fdfa5e5714dcb8", + "bytes": 6308 + }, + { + "path": "generated-final/package-D1.library", + "sha256": "28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33", + "bytes": 1116 + }, + { + "path": "generated-final/package-D2.library", + "sha256": "a35102e04b9f6822ab409ab43f83eded33edd0a3a3c1f589245bb7b123ce4779", + "bytes": 1121 + }, + { + "path": "generated-final/package-D3.library", + "sha256": "4b05d6a15115448e318d0c5d567ebb0bb9e0ab6438bd238e5f3a0716c7db1ee8", + "bytes": 1116 + }, + { + "path": "generated-final/package-SA.library", + "sha256": "f52b2a9281b60d35ddc0044fc9624b3b30ee0d35d88d1130c2c3e1af54e05696", + "bytes": 296 + }, + { + "path": "generated-final/RESULTS.md", + "sha256": "0c4456fb62d0de8b31d1d1e24b32d2e54ceff30908a696e01b94956b84c04dcd", + "bytes": 1667 + }, + { + "path": "generated-final/selective-update.request", + "sha256": "961a87fa1c3357101bdd4369b0ec016a56105a7158c90c073dcb6e5babd5284d", + "bytes": 113 + } + ] +} diff --git a/harness/experiments/library-compatibility-20260911/README.md b/harness/experiments/library-compatibility-20260911/README.md new file mode 100644 index 00000000..721e0524 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/README.md @@ -0,0 +1,44 @@ +# Isolated library compatibility experiment + +Codex-956atf `/root/library_compatibility`, 2026-09-11. Read the [candidate contract](../../release-library-compatibility-contract-20260911.md) for the recommended production semantics and explicit limits. + +`main.rs` is a std-only finite-model experiment, not Studio code or accepted source7 grammar. Its archive files use opaque symbolic IDs, a closed pipe-delimited record dialect and integer-millisecond arithmetic. Every final package contains its complete relevant prototype records and definitions. The `SELF` definition-reference category becomes an exact imported reference during materialization; the external sink prototype is mapped by a declared role. The source request starts with a blank project and a supplied package, creates two independent instances, edits one property, then selectively adopts a cosmetic revision while preserving outside consumers. + +Final evidence is exclusively in `generated-final/` and `EVIDENCE.json`. The `generated/` directory contains the superseded preliminary interpreter-default run and is labeled accordingly. Its removal was rejected by automatic approval review; it is not final evidence. + +## Reproduce on this configured Windows host + +Root authorized this isolated compiler invocation. It does not invoke Cargo or write `target`. The toolchain setup path is this workspace's existing local setup, not a portable dependency included in the repository. + +```powershell +. '.local/toolchain/env.ps1' +New-Item -ItemType Directory -Path '.local/library-compatibility-20260911' -Force | Out-Null +rustc --edition=2024 -D warnings -C linker=clang.exe ` + 'harness/experiments/library-compatibility-20260911/main.rs' ` + -o '.local/library-compatibility-20260911/library-compatibility.exe' +& '.local/library-compatibility-20260911/library-compatibility.exe' ` + 'harness/experiments/library-compatibility-20260911/generated-final' +& '.local/library-compatibility-20260911/library-compatibility.exe' --reopen ` + 'harness/experiments/library-compatibility-20260911/generated-final/03-updated' ` + 'harness/experiments/library-compatibility-20260911/generated-final/05-fresh-process-reopened' +``` + +On another host, compile this same std-only source with a suitable Rust compiler and run the executable with the explicit output directory. Omit the Windows linker override where inappropriate. No network, Studio process, package cache or GUI is used. The separate `--reopen` process loads only the declared project/management/package files; it does not recreate the initial package or consult the experiment's package constructors. + +Final compiler: `rustc 1.98.1 (48a229cea 2026-09-01)`, host `x86_64-pc-windows-gnullvm`, LLVM 22.1.8. Final run: 120 assertions, exit 0; fresh-process reopen: exit 0. All 11 files of the updated, expected and fresh-reopened documents have independently matching SHA-256 hashes. + +## Read the experiment + +- `generated-final/package-D1.library`: complete exact original package. D2 changes only version/documentation; D3 changes the field cardinality. The SA package is a distinct explicit target package. +- `initial.request`, `local-edit.request`, `selective-update.request`: concise complete experiment requests. `D1` in the initial request denotes the explicitly supplied D1 archive in the runner, not a cache search. +- `01-initial/`, `02-edited/`, `03-updated/`: complete accepted snapshots. `project.model` declares all package and management paths. Each instance has a full typed `base.model`, `map.model`, and `lineage.model`. +- `expected-initial.model` and `expected-full-updated/`: independently specified literal initial records and complete updated document oracle. The expected changed rows do not come from `update()` or `materialize()`. +- `04-reidentified/`: current-ID remap with the exact original baseline retained and explicit lineage. +- `05-fresh-process-reopened/`: output of a new process loading the updated portable directory. +- `explicit-bridges.model`: two validated pair-specific identity witnesses for the alternative bridge policy. +- `oa-sa-transition.model`: complete finite pinned/derivative dictionary maps, origin/target pins, target functions/ports/exchange and a refined derivative that cannot be silently written back into the original mount. +- `RESULTS.md`: final observed results and limitations. `EVIDENCE.json` is one level above it and records source/executable/fixture hashes. + +The source parser/materializer, full-state parser/writer and finite admission checks are separate paths. Negative controls include strict revision-only consumer rejection, missing explicit bridges, different origins and Energy/Torque, changed contract closure, stale update revision, unresolved expression conflict, field/operation mapping, wrong-layer counterpart, incomplete correspondence, forged package/base/current map, missing imports, reused reserved IDs, local name/subject edits, unrelated additions and dangling outside consumers. + +The frozen archive/source hashes depend on exact bytes. Do not normalize line endings when publishing these fixtures. A compile-time type inference correction and the move from interpreter-supplied prototype defaults to complete package records occurred before the final hash-bound run. They are not counted as passing final experiments. diff --git a/harness/experiments/library-compatibility-20260911/generated-final/01-initial/management/data1.mount b/harness/experiments/library-compatibility-20260911/generated-final/01-initial/management/data1.mount new file mode 100644 index 00000000..ab153a97 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/01-initial/management/data1.mount @@ -0,0 +1,5 @@ +member|Alarm|data1/Alarm +member|Code|data1/Code +member|Flag|data1/Flag +member|Interface|data1/Interface +member|Operation|data1/Operation diff --git a/harness/experiments/library-compatibility-20260911/generated-final/01-initial/management/left/base.model b/harness/experiments/library-compatibility-20260911/generated-final/01-initial/management/left/base.model new file mode 100644 index 00000000..14195ebb --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/01-initial/management/left/base.model @@ -0,0 +1,11 @@ +base|controls1|data1|sink_left|left +original|A|left/A +original|C|left/C +original|E|left/E +original|K|left/K +original|P|left/P +member|A|record|left/A|OA|left Watch|Activity|Monitor alarm +member|C|record|left/C|OA|left Stress|Case|-|left/P=1250@controls1:ms +member|E|record|left/E|OA|left Alarm|Interaction|left/A|sink_left|data1/Alarm +member|K|record|left/K|OA|left Elapsed limit|Check|left/P|1000@controls1:ms +member|P|record|left/P|OA|left Elapsed|Property|left/A|controls1:Duration|750@controls1:ms diff --git a/harness/experiments/library-compatibility-20260911/generated-final/01-initial/management/left/lineage.model b/harness/experiments/library-compatibility-20260911/generated-final/01-initial/management/left/lineage.model new file mode 100644 index 00000000..e4209eb0 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/01-initial/management/left/lineage.model @@ -0,0 +1,5 @@ +lineage|left/A|left/A +lineage|left/C|left/C +lineage|left/E|left/E +lineage|left/K|left/K +lineage|left/P|left/P diff --git a/harness/experiments/library-compatibility-20260911/generated-final/01-initial/management/left/map.model b/harness/experiments/library-compatibility-20260911/generated-final/01-initial/management/left/map.model new file mode 100644 index 00000000..eb6b5bce --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/01-initial/management/left/map.model @@ -0,0 +1,5 @@ +current|A|left/A +current|C|left/C +current|E|left/E +current|K|left/K +current|P|left/P diff --git a/harness/experiments/library-compatibility-20260911/generated-final/01-initial/management/right/base.model b/harness/experiments/library-compatibility-20260911/generated-final/01-initial/management/right/base.model new file mode 100644 index 00000000..a680ebda --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/01-initial/management/right/base.model @@ -0,0 +1,11 @@ +base|controls1|data1|sink_right|right +original|A|right/A +original|C|right/C +original|E|right/E +original|K|right/K +original|P|right/P +member|A|record|right/A|OA|right Watch|Activity|Monitor alarm +member|C|record|right/C|OA|right Stress|Case|-|right/P=1250@controls1:ms +member|E|record|right/E|OA|right Alarm|Interaction|right/A|sink_right|data1/Alarm +member|K|record|right/K|OA|right Elapsed limit|Check|right/P|1000@controls1:ms +member|P|record|right/P|OA|right Elapsed|Property|right/A|controls1:Duration|750@controls1:ms diff --git a/harness/experiments/library-compatibility-20260911/generated-final/01-initial/management/right/lineage.model b/harness/experiments/library-compatibility-20260911/generated-final/01-initial/management/right/lineage.model new file mode 100644 index 00000000..3977d1d3 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/01-initial/management/right/lineage.model @@ -0,0 +1,5 @@ +lineage|right/A|right/A +lineage|right/C|right/C +lineage|right/E|right/E +lineage|right/K|right/K +lineage|right/P|right/P diff --git a/harness/experiments/library-compatibility-20260911/generated-final/01-initial/management/right/map.model b/harness/experiments/library-compatibility-20260911/generated-final/01-initial/management/right/map.model new file mode 100644 index 00000000..87c2bfd1 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/01-initial/management/right/map.model @@ -0,0 +1,5 @@ +current|A|right/A +current|C|right/C +current|E|right/E +current|K|right/K +current|P|right/P diff --git a/harness/experiments/library-compatibility-20260911/generated-final/01-initial/packages/28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33.library b/harness/experiments/library-compatibility-20260911/generated-final/01-initial/packages/28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33.library new file mode 100644 index 00000000..81524593 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/01-initial/packages/28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33.library @@ -0,0 +1,24 @@ +package|ControlPatterns|1.0.0 +description|Monitor alarm +note|Initial documentation +def|Duration|Kind|Neutral|dimension=0,0,1,0,0,0,0;linear|- +def|Energy|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|Torque|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|ms|Unit|Neutral|millis=1|Duration +def|s|Unit|Neutral|millis=1000|Duration +def|Flag|Scalar|OA|Boolean|- +def|Alarm|Item|OA|Flow|Code +def|Code|Field|OA|minimum=1;maximum=1|Alarm,Flag +def|Interface|Interface|OA|-|Operation +def|Operation|Allocation|OA|order=0|Interface,Alarm +prototype|A|record|A|OA|Watch|Activity|Monitor alarm +prototype|E|record|E|OA|Alarm|Interaction|A|H|MOUNT/Alarm +prototype|P|record|P|OA|Elapsed|Property|A|SELF:Duration|750@SELF:ms +prototype|C|record|C|OA|Stress|Case|-|P=1250@SELF:ms +prototype|K|record|K|OA|Elapsed limit|Check|P|1000@SELF:ms +prototype|H|record|H|OA|Prototype receiver|Activity|Context role only +prototype|Q|record|Q|OA|Outside delay|Property|H|SELF:Duration|1000@SELF:ms +prototype|G|record|G|OA|Project-wide study|Case|-|P=2500@SELF:ms,Q=4000@SELF:ms +pattern|monitor|A,E,P,C,K +analysis|P|K|C +role|sink|H|Activity|OA diff --git a/harness/experiments/library-compatibility-20260911/generated-final/01-initial/project.model b/harness/experiments/library-compatibility-20260911/generated-final/01-initial/project.model new file mode 100644 index 00000000..d3bdc3ae --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/01-initial/project.model @@ -0,0 +1,21 @@ +document|Alpha|1 +import|controls1|ControlPatterns|1.0.0|28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33|packages/28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33.library +mount|data1|controls1|management/data1.mount +instance|left|management/left +instance|right|management/right +record|budget|OA|Combined duration|Budget|left/P|right/P|controls1:Duration|2000@controls1:ms +record|global|OA|Unrelated project-wide study|Case|-|left/P=3000@controls1:ms +record|left/A|OA|left Watch|Activity|Monitor alarm +record|left/C|OA|left Stress|Case|-|left/P=1250@controls1:ms +record|left/E|OA|left Alarm|Interaction|left/A|sink_left|data1/Alarm +record|left/K|OA|left Elapsed limit|Check|left/P|1000@controls1:ms +record|left/P|OA|left Elapsed|Property|left/A|controls1:Duration|750@controls1:ms +record|outside|OA|Outside typed receiver|Consumer|left/E|data1/Interface|data1/Operation|data1/Code +record|right/A|OA|right Watch|Activity|Monitor alarm +record|right/C|OA|right Stress|Case|-|right/P=1250@controls1:ms +record|right/E|OA|right Alarm|Interaction|right/A|sink_right|data1/Alarm +record|right/K|OA|right Elapsed limit|Check|right/P|1000@controls1:ms +record|right/P|OA|right Elapsed|Property|right/A|controls1:Duration|750@controls1:ms +record|sink_left|OA|Receive left|Activity| +record|sink_right|OA|Receive right|Activity| +applied|create-two-instances diff --git a/harness/experiments/library-compatibility-20260911/generated-final/01-recompiled/management/data1.mount b/harness/experiments/library-compatibility-20260911/generated-final/01-recompiled/management/data1.mount new file mode 100644 index 00000000..ab153a97 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/01-recompiled/management/data1.mount @@ -0,0 +1,5 @@ +member|Alarm|data1/Alarm +member|Code|data1/Code +member|Flag|data1/Flag +member|Interface|data1/Interface +member|Operation|data1/Operation diff --git a/harness/experiments/library-compatibility-20260911/generated-final/01-recompiled/management/left/base.model b/harness/experiments/library-compatibility-20260911/generated-final/01-recompiled/management/left/base.model new file mode 100644 index 00000000..14195ebb --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/01-recompiled/management/left/base.model @@ -0,0 +1,11 @@ +base|controls1|data1|sink_left|left +original|A|left/A +original|C|left/C +original|E|left/E +original|K|left/K +original|P|left/P +member|A|record|left/A|OA|left Watch|Activity|Monitor alarm +member|C|record|left/C|OA|left Stress|Case|-|left/P=1250@controls1:ms +member|E|record|left/E|OA|left Alarm|Interaction|left/A|sink_left|data1/Alarm +member|K|record|left/K|OA|left Elapsed limit|Check|left/P|1000@controls1:ms +member|P|record|left/P|OA|left Elapsed|Property|left/A|controls1:Duration|750@controls1:ms diff --git a/harness/experiments/library-compatibility-20260911/generated-final/01-recompiled/management/left/lineage.model b/harness/experiments/library-compatibility-20260911/generated-final/01-recompiled/management/left/lineage.model new file mode 100644 index 00000000..e4209eb0 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/01-recompiled/management/left/lineage.model @@ -0,0 +1,5 @@ +lineage|left/A|left/A +lineage|left/C|left/C +lineage|left/E|left/E +lineage|left/K|left/K +lineage|left/P|left/P diff --git a/harness/experiments/library-compatibility-20260911/generated-final/01-recompiled/management/left/map.model b/harness/experiments/library-compatibility-20260911/generated-final/01-recompiled/management/left/map.model new file mode 100644 index 00000000..eb6b5bce --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/01-recompiled/management/left/map.model @@ -0,0 +1,5 @@ +current|A|left/A +current|C|left/C +current|E|left/E +current|K|left/K +current|P|left/P diff --git a/harness/experiments/library-compatibility-20260911/generated-final/01-recompiled/management/right/base.model b/harness/experiments/library-compatibility-20260911/generated-final/01-recompiled/management/right/base.model new file mode 100644 index 00000000..a680ebda --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/01-recompiled/management/right/base.model @@ -0,0 +1,11 @@ +base|controls1|data1|sink_right|right +original|A|right/A +original|C|right/C +original|E|right/E +original|K|right/K +original|P|right/P +member|A|record|right/A|OA|right Watch|Activity|Monitor alarm +member|C|record|right/C|OA|right Stress|Case|-|right/P=1250@controls1:ms +member|E|record|right/E|OA|right Alarm|Interaction|right/A|sink_right|data1/Alarm +member|K|record|right/K|OA|right Elapsed limit|Check|right/P|1000@controls1:ms +member|P|record|right/P|OA|right Elapsed|Property|right/A|controls1:Duration|750@controls1:ms diff --git a/harness/experiments/library-compatibility-20260911/generated-final/01-recompiled/management/right/lineage.model b/harness/experiments/library-compatibility-20260911/generated-final/01-recompiled/management/right/lineage.model new file mode 100644 index 00000000..3977d1d3 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/01-recompiled/management/right/lineage.model @@ -0,0 +1,5 @@ +lineage|right/A|right/A +lineage|right/C|right/C +lineage|right/E|right/E +lineage|right/K|right/K +lineage|right/P|right/P diff --git a/harness/experiments/library-compatibility-20260911/generated-final/01-recompiled/management/right/map.model b/harness/experiments/library-compatibility-20260911/generated-final/01-recompiled/management/right/map.model new file mode 100644 index 00000000..87c2bfd1 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/01-recompiled/management/right/map.model @@ -0,0 +1,5 @@ +current|A|right/A +current|C|right/C +current|E|right/E +current|K|right/K +current|P|right/P diff --git a/harness/experiments/library-compatibility-20260911/generated-final/01-recompiled/packages/28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33.library b/harness/experiments/library-compatibility-20260911/generated-final/01-recompiled/packages/28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33.library new file mode 100644 index 00000000..81524593 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/01-recompiled/packages/28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33.library @@ -0,0 +1,24 @@ +package|ControlPatterns|1.0.0 +description|Monitor alarm +note|Initial documentation +def|Duration|Kind|Neutral|dimension=0,0,1,0,0,0,0;linear|- +def|Energy|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|Torque|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|ms|Unit|Neutral|millis=1|Duration +def|s|Unit|Neutral|millis=1000|Duration +def|Flag|Scalar|OA|Boolean|- +def|Alarm|Item|OA|Flow|Code +def|Code|Field|OA|minimum=1;maximum=1|Alarm,Flag +def|Interface|Interface|OA|-|Operation +def|Operation|Allocation|OA|order=0|Interface,Alarm +prototype|A|record|A|OA|Watch|Activity|Monitor alarm +prototype|E|record|E|OA|Alarm|Interaction|A|H|MOUNT/Alarm +prototype|P|record|P|OA|Elapsed|Property|A|SELF:Duration|750@SELF:ms +prototype|C|record|C|OA|Stress|Case|-|P=1250@SELF:ms +prototype|K|record|K|OA|Elapsed limit|Check|P|1000@SELF:ms +prototype|H|record|H|OA|Prototype receiver|Activity|Context role only +prototype|Q|record|Q|OA|Outside delay|Property|H|SELF:Duration|1000@SELF:ms +prototype|G|record|G|OA|Project-wide study|Case|-|P=2500@SELF:ms,Q=4000@SELF:ms +pattern|monitor|A,E,P,C,K +analysis|P|K|C +role|sink|H|Activity|OA diff --git a/harness/experiments/library-compatibility-20260911/generated-final/01-recompiled/project.model b/harness/experiments/library-compatibility-20260911/generated-final/01-recompiled/project.model new file mode 100644 index 00000000..d3bdc3ae --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/01-recompiled/project.model @@ -0,0 +1,21 @@ +document|Alpha|1 +import|controls1|ControlPatterns|1.0.0|28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33|packages/28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33.library +mount|data1|controls1|management/data1.mount +instance|left|management/left +instance|right|management/right +record|budget|OA|Combined duration|Budget|left/P|right/P|controls1:Duration|2000@controls1:ms +record|global|OA|Unrelated project-wide study|Case|-|left/P=3000@controls1:ms +record|left/A|OA|left Watch|Activity|Monitor alarm +record|left/C|OA|left Stress|Case|-|left/P=1250@controls1:ms +record|left/E|OA|left Alarm|Interaction|left/A|sink_left|data1/Alarm +record|left/K|OA|left Elapsed limit|Check|left/P|1000@controls1:ms +record|left/P|OA|left Elapsed|Property|left/A|controls1:Duration|750@controls1:ms +record|outside|OA|Outside typed receiver|Consumer|left/E|data1/Interface|data1/Operation|data1/Code +record|right/A|OA|right Watch|Activity|Monitor alarm +record|right/C|OA|right Stress|Case|-|right/P=1250@controls1:ms +record|right/E|OA|right Alarm|Interaction|right/A|sink_right|data1/Alarm +record|right/K|OA|right Elapsed limit|Check|right/P|1000@controls1:ms +record|right/P|OA|right Elapsed|Property|right/A|controls1:Duration|750@controls1:ms +record|sink_left|OA|Receive left|Activity| +record|sink_right|OA|Receive right|Activity| +applied|create-two-instances diff --git a/harness/experiments/library-compatibility-20260911/generated-final/02-edited/management/data1.mount b/harness/experiments/library-compatibility-20260911/generated-final/02-edited/management/data1.mount new file mode 100644 index 00000000..ab153a97 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/02-edited/management/data1.mount @@ -0,0 +1,5 @@ +member|Alarm|data1/Alarm +member|Code|data1/Code +member|Flag|data1/Flag +member|Interface|data1/Interface +member|Operation|data1/Operation diff --git a/harness/experiments/library-compatibility-20260911/generated-final/02-edited/management/left/base.model b/harness/experiments/library-compatibility-20260911/generated-final/02-edited/management/left/base.model new file mode 100644 index 00000000..14195ebb --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/02-edited/management/left/base.model @@ -0,0 +1,11 @@ +base|controls1|data1|sink_left|left +original|A|left/A +original|C|left/C +original|E|left/E +original|K|left/K +original|P|left/P +member|A|record|left/A|OA|left Watch|Activity|Monitor alarm +member|C|record|left/C|OA|left Stress|Case|-|left/P=1250@controls1:ms +member|E|record|left/E|OA|left Alarm|Interaction|left/A|sink_left|data1/Alarm +member|K|record|left/K|OA|left Elapsed limit|Check|left/P|1000@controls1:ms +member|P|record|left/P|OA|left Elapsed|Property|left/A|controls1:Duration|750@controls1:ms diff --git a/harness/experiments/library-compatibility-20260911/generated-final/02-edited/management/left/lineage.model b/harness/experiments/library-compatibility-20260911/generated-final/02-edited/management/left/lineage.model new file mode 100644 index 00000000..e4209eb0 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/02-edited/management/left/lineage.model @@ -0,0 +1,5 @@ +lineage|left/A|left/A +lineage|left/C|left/C +lineage|left/E|left/E +lineage|left/K|left/K +lineage|left/P|left/P diff --git a/harness/experiments/library-compatibility-20260911/generated-final/02-edited/management/left/map.model b/harness/experiments/library-compatibility-20260911/generated-final/02-edited/management/left/map.model new file mode 100644 index 00000000..eb6b5bce --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/02-edited/management/left/map.model @@ -0,0 +1,5 @@ +current|A|left/A +current|C|left/C +current|E|left/E +current|K|left/K +current|P|left/P diff --git a/harness/experiments/library-compatibility-20260911/generated-final/02-edited/management/right/base.model b/harness/experiments/library-compatibility-20260911/generated-final/02-edited/management/right/base.model new file mode 100644 index 00000000..a680ebda --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/02-edited/management/right/base.model @@ -0,0 +1,11 @@ +base|controls1|data1|sink_right|right +original|A|right/A +original|C|right/C +original|E|right/E +original|K|right/K +original|P|right/P +member|A|record|right/A|OA|right Watch|Activity|Monitor alarm +member|C|record|right/C|OA|right Stress|Case|-|right/P=1250@controls1:ms +member|E|record|right/E|OA|right Alarm|Interaction|right/A|sink_right|data1/Alarm +member|K|record|right/K|OA|right Elapsed limit|Check|right/P|1000@controls1:ms +member|P|record|right/P|OA|right Elapsed|Property|right/A|controls1:Duration|750@controls1:ms diff --git a/harness/experiments/library-compatibility-20260911/generated-final/02-edited/management/right/lineage.model b/harness/experiments/library-compatibility-20260911/generated-final/02-edited/management/right/lineage.model new file mode 100644 index 00000000..3977d1d3 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/02-edited/management/right/lineage.model @@ -0,0 +1,5 @@ +lineage|right/A|right/A +lineage|right/C|right/C +lineage|right/E|right/E +lineage|right/K|right/K +lineage|right/P|right/P diff --git a/harness/experiments/library-compatibility-20260911/generated-final/02-edited/management/right/map.model b/harness/experiments/library-compatibility-20260911/generated-final/02-edited/management/right/map.model new file mode 100644 index 00000000..87c2bfd1 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/02-edited/management/right/map.model @@ -0,0 +1,5 @@ +current|A|right/A +current|C|right/C +current|E|right/E +current|K|right/K +current|P|right/P diff --git a/harness/experiments/library-compatibility-20260911/generated-final/02-edited/packages/28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33.library b/harness/experiments/library-compatibility-20260911/generated-final/02-edited/packages/28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33.library new file mode 100644 index 00000000..81524593 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/02-edited/packages/28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33.library @@ -0,0 +1,24 @@ +package|ControlPatterns|1.0.0 +description|Monitor alarm +note|Initial documentation +def|Duration|Kind|Neutral|dimension=0,0,1,0,0,0,0;linear|- +def|Energy|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|Torque|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|ms|Unit|Neutral|millis=1|Duration +def|s|Unit|Neutral|millis=1000|Duration +def|Flag|Scalar|OA|Boolean|- +def|Alarm|Item|OA|Flow|Code +def|Code|Field|OA|minimum=1;maximum=1|Alarm,Flag +def|Interface|Interface|OA|-|Operation +def|Operation|Allocation|OA|order=0|Interface,Alarm +prototype|A|record|A|OA|Watch|Activity|Monitor alarm +prototype|E|record|E|OA|Alarm|Interaction|A|H|MOUNT/Alarm +prototype|P|record|P|OA|Elapsed|Property|A|SELF:Duration|750@SELF:ms +prototype|C|record|C|OA|Stress|Case|-|P=1250@SELF:ms +prototype|K|record|K|OA|Elapsed limit|Check|P|1000@SELF:ms +prototype|H|record|H|OA|Prototype receiver|Activity|Context role only +prototype|Q|record|Q|OA|Outside delay|Property|H|SELF:Duration|1000@SELF:ms +prototype|G|record|G|OA|Project-wide study|Case|-|P=2500@SELF:ms,Q=4000@SELF:ms +pattern|monitor|A,E,P,C,K +analysis|P|K|C +role|sink|H|Activity|OA diff --git a/harness/experiments/library-compatibility-20260911/generated-final/02-edited/project.model b/harness/experiments/library-compatibility-20260911/generated-final/02-edited/project.model new file mode 100644 index 00000000..0e0d7428 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/02-edited/project.model @@ -0,0 +1,22 @@ +document|Alpha|2 +import|controls1|ControlPatterns|1.0.0|28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33|packages/28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33.library +mount|data1|controls1|management/data1.mount +instance|left|management/left +instance|right|management/right +record|budget|OA|Combined duration|Budget|left/P|right/P|controls1:Duration|2000@controls1:ms +record|global|OA|Unrelated project-wide study|Case|-|left/P=3000@controls1:ms +record|left/A|OA|left Watch|Activity|Monitor alarm +record|left/C|OA|left Stress|Case|-|left/P=1250@controls1:ms +record|left/E|OA|left Alarm|Interaction|left/A|sink_left|data1/Alarm +record|left/K|OA|left Elapsed limit|Check|left/P|1000@controls1:ms +record|left/P|OA|left Elapsed|Property|left/A|controls1:Duration|900@controls1:ms +record|outside|OA|Outside typed receiver|Consumer|left/E|data1/Interface|data1/Operation|data1/Code +record|right/A|OA|right Watch|Activity|Monitor alarm +record|right/C|OA|right Stress|Case|-|right/P=1250@controls1:ms +record|right/E|OA|right Alarm|Interaction|right/A|sink_right|data1/Alarm +record|right/K|OA|right Elapsed limit|Check|right/P|1000@controls1:ms +record|right/P|OA|right Elapsed|Property|right/A|controls1:Duration|750@controls1:ms +record|sink_left|OA|Receive left|Activity| +record|sink_right|OA|Receive right|Activity| +applied|create-two-instances +applied|edit_base|left/P|900@controls1:ms diff --git a/harness/experiments/library-compatibility-20260911/generated-final/03-updated/management/data1.mount b/harness/experiments/library-compatibility-20260911/generated-final/03-updated/management/data1.mount new file mode 100644 index 00000000..ab153a97 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/03-updated/management/data1.mount @@ -0,0 +1,5 @@ +member|Alarm|data1/Alarm +member|Code|data1/Code +member|Flag|data1/Flag +member|Interface|data1/Interface +member|Operation|data1/Operation diff --git a/harness/experiments/library-compatibility-20260911/generated-final/03-updated/management/data2.mount b/harness/experiments/library-compatibility-20260911/generated-final/03-updated/management/data2.mount new file mode 100644 index 00000000..c1ae4b6e --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/03-updated/management/data2.mount @@ -0,0 +1,5 @@ +member|Alarm|data2/Alarm +member|Code|data2/Code +member|Flag|data2/Flag +member|Interface|data2/Interface +member|Operation|data2/Operation diff --git a/harness/experiments/library-compatibility-20260911/generated-final/03-updated/management/left/base.model b/harness/experiments/library-compatibility-20260911/generated-final/03-updated/management/left/base.model new file mode 100644 index 00000000..52f2ea0e --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/03-updated/management/left/base.model @@ -0,0 +1,11 @@ +base|controls2|data2|sink_left|left +original|A|left/A +original|C|left/C +original|E|left/E +original|K|left/K +original|P|left/P +member|A|record|left/A|OA|left Watch|Activity|Monitor alarm +member|C|record|left/C|OA|left Stress|Case|-|left/P=1250@controls2:ms +member|E|record|left/E|OA|left Alarm|Interaction|left/A|sink_left|data2/Alarm +member|K|record|left/K|OA|left Elapsed limit|Check|left/P|1000@controls2:ms +member|P|record|left/P|OA|left Elapsed|Property|left/A|controls2:Duration|750@controls2:ms diff --git a/harness/experiments/library-compatibility-20260911/generated-final/03-updated/management/left/lineage.model b/harness/experiments/library-compatibility-20260911/generated-final/03-updated/management/left/lineage.model new file mode 100644 index 00000000..e4209eb0 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/03-updated/management/left/lineage.model @@ -0,0 +1,5 @@ +lineage|left/A|left/A +lineage|left/C|left/C +lineage|left/E|left/E +lineage|left/K|left/K +lineage|left/P|left/P diff --git a/harness/experiments/library-compatibility-20260911/generated-final/03-updated/management/left/map.model b/harness/experiments/library-compatibility-20260911/generated-final/03-updated/management/left/map.model new file mode 100644 index 00000000..eb6b5bce --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/03-updated/management/left/map.model @@ -0,0 +1,5 @@ +current|A|left/A +current|C|left/C +current|E|left/E +current|K|left/K +current|P|left/P diff --git a/harness/experiments/library-compatibility-20260911/generated-final/03-updated/management/right/base.model b/harness/experiments/library-compatibility-20260911/generated-final/03-updated/management/right/base.model new file mode 100644 index 00000000..a680ebda --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/03-updated/management/right/base.model @@ -0,0 +1,11 @@ +base|controls1|data1|sink_right|right +original|A|right/A +original|C|right/C +original|E|right/E +original|K|right/K +original|P|right/P +member|A|record|right/A|OA|right Watch|Activity|Monitor alarm +member|C|record|right/C|OA|right Stress|Case|-|right/P=1250@controls1:ms +member|E|record|right/E|OA|right Alarm|Interaction|right/A|sink_right|data1/Alarm +member|K|record|right/K|OA|right Elapsed limit|Check|right/P|1000@controls1:ms +member|P|record|right/P|OA|right Elapsed|Property|right/A|controls1:Duration|750@controls1:ms diff --git a/harness/experiments/library-compatibility-20260911/generated-final/03-updated/management/right/lineage.model b/harness/experiments/library-compatibility-20260911/generated-final/03-updated/management/right/lineage.model new file mode 100644 index 00000000..3977d1d3 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/03-updated/management/right/lineage.model @@ -0,0 +1,5 @@ +lineage|right/A|right/A +lineage|right/C|right/C +lineage|right/E|right/E +lineage|right/K|right/K +lineage|right/P|right/P diff --git a/harness/experiments/library-compatibility-20260911/generated-final/03-updated/management/right/map.model b/harness/experiments/library-compatibility-20260911/generated-final/03-updated/management/right/map.model new file mode 100644 index 00000000..87c2bfd1 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/03-updated/management/right/map.model @@ -0,0 +1,5 @@ +current|A|right/A +current|C|right/C +current|E|right/E +current|K|right/K +current|P|right/P diff --git a/harness/experiments/library-compatibility-20260911/generated-final/03-updated/packages/28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33.library b/harness/experiments/library-compatibility-20260911/generated-final/03-updated/packages/28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33.library new file mode 100644 index 00000000..81524593 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/03-updated/packages/28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33.library @@ -0,0 +1,24 @@ +package|ControlPatterns|1.0.0 +description|Monitor alarm +note|Initial documentation +def|Duration|Kind|Neutral|dimension=0,0,1,0,0,0,0;linear|- +def|Energy|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|Torque|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|ms|Unit|Neutral|millis=1|Duration +def|s|Unit|Neutral|millis=1000|Duration +def|Flag|Scalar|OA|Boolean|- +def|Alarm|Item|OA|Flow|Code +def|Code|Field|OA|minimum=1;maximum=1|Alarm,Flag +def|Interface|Interface|OA|-|Operation +def|Operation|Allocation|OA|order=0|Interface,Alarm +prototype|A|record|A|OA|Watch|Activity|Monitor alarm +prototype|E|record|E|OA|Alarm|Interaction|A|H|MOUNT/Alarm +prototype|P|record|P|OA|Elapsed|Property|A|SELF:Duration|750@SELF:ms +prototype|C|record|C|OA|Stress|Case|-|P=1250@SELF:ms +prototype|K|record|K|OA|Elapsed limit|Check|P|1000@SELF:ms +prototype|H|record|H|OA|Prototype receiver|Activity|Context role only +prototype|Q|record|Q|OA|Outside delay|Property|H|SELF:Duration|1000@SELF:ms +prototype|G|record|G|OA|Project-wide study|Case|-|P=2500@SELF:ms,Q=4000@SELF:ms +pattern|monitor|A,E,P,C,K +analysis|P|K|C +role|sink|H|Activity|OA diff --git a/harness/experiments/library-compatibility-20260911/generated-final/03-updated/packages/a35102e04b9f6822ab409ab43f83eded33edd0a3a3c1f589245bb7b123ce4779.library b/harness/experiments/library-compatibility-20260911/generated-final/03-updated/packages/a35102e04b9f6822ab409ab43f83eded33edd0a3a3c1f589245bb7b123ce4779.library new file mode 100644 index 00000000..a682d20e --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/03-updated/packages/a35102e04b9f6822ab409ab43f83eded33edd0a3a3c1f589245bb7b123ce4779.library @@ -0,0 +1,24 @@ +package|ControlPatterns|1.0.1 +description|Monitor alarm +note|Revised documentation only +def|Duration|Kind|Neutral|dimension=0,0,1,0,0,0,0;linear|- +def|Energy|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|Torque|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|ms|Unit|Neutral|millis=1|Duration +def|s|Unit|Neutral|millis=1000|Duration +def|Flag|Scalar|OA|Boolean|- +def|Alarm|Item|OA|Flow|Code +def|Code|Field|OA|minimum=1;maximum=1|Alarm,Flag +def|Interface|Interface|OA|-|Operation +def|Operation|Allocation|OA|order=0|Interface,Alarm +prototype|A|record|A|OA|Watch|Activity|Monitor alarm +prototype|E|record|E|OA|Alarm|Interaction|A|H|MOUNT/Alarm +prototype|P|record|P|OA|Elapsed|Property|A|SELF:Duration|750@SELF:ms +prototype|C|record|C|OA|Stress|Case|-|P=1250@SELF:ms +prototype|K|record|K|OA|Elapsed limit|Check|P|1000@SELF:ms +prototype|H|record|H|OA|Prototype receiver|Activity|Context role only +prototype|Q|record|Q|OA|Outside delay|Property|H|SELF:Duration|1000@SELF:ms +prototype|G|record|G|OA|Project-wide study|Case|-|P=2500@SELF:ms,Q=4000@SELF:ms +pattern|monitor|A,E,P,C,K +analysis|P|K|C +role|sink|H|Activity|OA diff --git a/harness/experiments/library-compatibility-20260911/generated-final/03-updated/project.model b/harness/experiments/library-compatibility-20260911/generated-final/03-updated/project.model new file mode 100644 index 00000000..492fd2a2 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/03-updated/project.model @@ -0,0 +1,25 @@ +document|Alpha|3 +import|controls1|ControlPatterns|1.0.0|28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33|packages/28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33.library +import|controls2|ControlPatterns|1.0.1|a35102e04b9f6822ab409ab43f83eded33edd0a3a3c1f589245bb7b123ce4779|packages/a35102e04b9f6822ab409ab43f83eded33edd0a3a3c1f589245bb7b123ce4779.library +mount|data1|controls1|management/data1.mount +mount|data2|controls2|management/data2.mount +instance|left|management/left +instance|right|management/right +record|budget|OA|Combined duration|Budget|left/P|right/P|controls1:Duration|2000@controls1:ms +record|global|OA|Unrelated project-wide study|Case|-|left/P=3000@controls1:ms +record|left/A|OA|left Watch|Activity|Monitor alarm +record|left/C|OA|left Stress|Case|-|left/P=1250@controls2:ms +record|left/E|OA|left Alarm|Interaction|left/A|sink_left|data2/Alarm +record|left/K|OA|left Elapsed limit|Check|left/P|1000@controls2:ms +record|left/P|OA|left Elapsed|Property|left/A|controls2:Duration|900@controls1:ms +record|outside|OA|Outside typed receiver|Consumer|left/E|data1/Interface|data1/Operation|data1/Code +record|right/A|OA|right Watch|Activity|Monitor alarm +record|right/C|OA|right Stress|Case|-|right/P=1250@controls1:ms +record|right/E|OA|right Alarm|Interaction|right/A|sink_right|data1/Alarm +record|right/K|OA|right Elapsed limit|Check|right/P|1000@controls1:ms +record|right/P|OA|right Elapsed|Property|right/A|controls1:Duration|750@controls1:ms +record|sink_left|OA|Receive left|Activity| +record|sink_right|OA|Receive right|Activity| +applied|create-two-instances +applied|edit_base|left/P|900@controls1:ms +applied|update|left|28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33|controls2|data2|2|P.base=keep_local diff --git a/harness/experiments/library-compatibility-20260911/generated-final/04-reidentified/management/data1.mount b/harness/experiments/library-compatibility-20260911/generated-final/04-reidentified/management/data1.mount new file mode 100644 index 00000000..ab153a97 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/04-reidentified/management/data1.mount @@ -0,0 +1,5 @@ +member|Alarm|data1/Alarm +member|Code|data1/Code +member|Flag|data1/Flag +member|Interface|data1/Interface +member|Operation|data1/Operation diff --git a/harness/experiments/library-compatibility-20260911/generated-final/04-reidentified/management/left/base.model b/harness/experiments/library-compatibility-20260911/generated-final/04-reidentified/management/left/base.model new file mode 100644 index 00000000..14195ebb --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/04-reidentified/management/left/base.model @@ -0,0 +1,11 @@ +base|controls1|data1|sink_left|left +original|A|left/A +original|C|left/C +original|E|left/E +original|K|left/K +original|P|left/P +member|A|record|left/A|OA|left Watch|Activity|Monitor alarm +member|C|record|left/C|OA|left Stress|Case|-|left/P=1250@controls1:ms +member|E|record|left/E|OA|left Alarm|Interaction|left/A|sink_left|data1/Alarm +member|K|record|left/K|OA|left Elapsed limit|Check|left/P|1000@controls1:ms +member|P|record|left/P|OA|left Elapsed|Property|left/A|controls1:Duration|750@controls1:ms diff --git a/harness/experiments/library-compatibility-20260911/generated-final/04-reidentified/management/left/lineage.model b/harness/experiments/library-compatibility-20260911/generated-final/04-reidentified/management/left/lineage.model new file mode 100644 index 00000000..1a897434 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/04-reidentified/management/left/lineage.model @@ -0,0 +1,5 @@ +lineage|left/A|left/A2 +lineage|left/C|left/C +lineage|left/E|left/E +lineage|left/K|left/K +lineage|left/P|left/P diff --git a/harness/experiments/library-compatibility-20260911/generated-final/04-reidentified/management/left/map.model b/harness/experiments/library-compatibility-20260911/generated-final/04-reidentified/management/left/map.model new file mode 100644 index 00000000..8a7661fe --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/04-reidentified/management/left/map.model @@ -0,0 +1,5 @@ +current|A|left/A2 +current|C|left/C +current|E|left/E +current|K|left/K +current|P|left/P diff --git a/harness/experiments/library-compatibility-20260911/generated-final/04-reidentified/management/right/base.model b/harness/experiments/library-compatibility-20260911/generated-final/04-reidentified/management/right/base.model new file mode 100644 index 00000000..a680ebda --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/04-reidentified/management/right/base.model @@ -0,0 +1,11 @@ +base|controls1|data1|sink_right|right +original|A|right/A +original|C|right/C +original|E|right/E +original|K|right/K +original|P|right/P +member|A|record|right/A|OA|right Watch|Activity|Monitor alarm +member|C|record|right/C|OA|right Stress|Case|-|right/P=1250@controls1:ms +member|E|record|right/E|OA|right Alarm|Interaction|right/A|sink_right|data1/Alarm +member|K|record|right/K|OA|right Elapsed limit|Check|right/P|1000@controls1:ms +member|P|record|right/P|OA|right Elapsed|Property|right/A|controls1:Duration|750@controls1:ms diff --git a/harness/experiments/library-compatibility-20260911/generated-final/04-reidentified/management/right/lineage.model b/harness/experiments/library-compatibility-20260911/generated-final/04-reidentified/management/right/lineage.model new file mode 100644 index 00000000..3977d1d3 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/04-reidentified/management/right/lineage.model @@ -0,0 +1,5 @@ +lineage|right/A|right/A +lineage|right/C|right/C +lineage|right/E|right/E +lineage|right/K|right/K +lineage|right/P|right/P diff --git a/harness/experiments/library-compatibility-20260911/generated-final/04-reidentified/management/right/map.model b/harness/experiments/library-compatibility-20260911/generated-final/04-reidentified/management/right/map.model new file mode 100644 index 00000000..87c2bfd1 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/04-reidentified/management/right/map.model @@ -0,0 +1,5 @@ +current|A|right/A +current|C|right/C +current|E|right/E +current|K|right/K +current|P|right/P diff --git a/harness/experiments/library-compatibility-20260911/generated-final/04-reidentified/packages/28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33.library b/harness/experiments/library-compatibility-20260911/generated-final/04-reidentified/packages/28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33.library new file mode 100644 index 00000000..81524593 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/04-reidentified/packages/28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33.library @@ -0,0 +1,24 @@ +package|ControlPatterns|1.0.0 +description|Monitor alarm +note|Initial documentation +def|Duration|Kind|Neutral|dimension=0,0,1,0,0,0,0;linear|- +def|Energy|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|Torque|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|ms|Unit|Neutral|millis=1|Duration +def|s|Unit|Neutral|millis=1000|Duration +def|Flag|Scalar|OA|Boolean|- +def|Alarm|Item|OA|Flow|Code +def|Code|Field|OA|minimum=1;maximum=1|Alarm,Flag +def|Interface|Interface|OA|-|Operation +def|Operation|Allocation|OA|order=0|Interface,Alarm +prototype|A|record|A|OA|Watch|Activity|Monitor alarm +prototype|E|record|E|OA|Alarm|Interaction|A|H|MOUNT/Alarm +prototype|P|record|P|OA|Elapsed|Property|A|SELF:Duration|750@SELF:ms +prototype|C|record|C|OA|Stress|Case|-|P=1250@SELF:ms +prototype|K|record|K|OA|Elapsed limit|Check|P|1000@SELF:ms +prototype|H|record|H|OA|Prototype receiver|Activity|Context role only +prototype|Q|record|Q|OA|Outside delay|Property|H|SELF:Duration|1000@SELF:ms +prototype|G|record|G|OA|Project-wide study|Case|-|P=2500@SELF:ms,Q=4000@SELF:ms +pattern|monitor|A,E,P,C,K +analysis|P|K|C +role|sink|H|Activity|OA diff --git a/harness/experiments/library-compatibility-20260911/generated-final/04-reidentified/project.model b/harness/experiments/library-compatibility-20260911/generated-final/04-reidentified/project.model new file mode 100644 index 00000000..3f762c85 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/04-reidentified/project.model @@ -0,0 +1,22 @@ +document|Alpha|2 +import|controls1|ControlPatterns|1.0.0|28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33|packages/28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33.library +mount|data1|controls1|management/data1.mount +instance|left|management/left +instance|right|management/right +record|budget|OA|Combined duration|Budget|left/P|right/P|controls1:Duration|2000@controls1:ms +record|global|OA|Unrelated project-wide study|Case|-|left/P=3000@controls1:ms +record|left/A2|OA|left Watch|Activity|Monitor alarm +record|left/C|OA|left Stress|Case|-|left/P=1250@controls1:ms +record|left/E|OA|left Alarm|Interaction|left/A2|sink_left|data1/Alarm +record|left/K|OA|left Elapsed limit|Check|left/P|1000@controls1:ms +record|left/P|OA|left Elapsed|Property|left/A2|controls1:Duration|900@controls1:ms +record|outside|OA|Outside typed receiver|Consumer|left/E|data1/Interface|data1/Operation|data1/Code +record|right/A|OA|right Watch|Activity|Monitor alarm +record|right/C|OA|right Stress|Case|-|right/P=1250@controls1:ms +record|right/E|OA|right Alarm|Interaction|right/A|sink_right|data1/Alarm +record|right/K|OA|right Elapsed limit|Check|right/P|1000@controls1:ms +record|right/P|OA|right Elapsed|Property|right/A|controls1:Duration|750@controls1:ms +record|sink_left|OA|Receive left|Activity| +record|sink_right|OA|Receive right|Activity| +applied|create-two-instances +applied|edit_base|left/P|900@controls1:ms diff --git a/harness/experiments/library-compatibility-20260911/generated-final/05-fresh-process-reopened/management/data1.mount b/harness/experiments/library-compatibility-20260911/generated-final/05-fresh-process-reopened/management/data1.mount new file mode 100644 index 00000000..ab153a97 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/05-fresh-process-reopened/management/data1.mount @@ -0,0 +1,5 @@ +member|Alarm|data1/Alarm +member|Code|data1/Code +member|Flag|data1/Flag +member|Interface|data1/Interface +member|Operation|data1/Operation diff --git a/harness/experiments/library-compatibility-20260911/generated-final/05-fresh-process-reopened/management/data2.mount b/harness/experiments/library-compatibility-20260911/generated-final/05-fresh-process-reopened/management/data2.mount new file mode 100644 index 00000000..c1ae4b6e --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/05-fresh-process-reopened/management/data2.mount @@ -0,0 +1,5 @@ +member|Alarm|data2/Alarm +member|Code|data2/Code +member|Flag|data2/Flag +member|Interface|data2/Interface +member|Operation|data2/Operation diff --git a/harness/experiments/library-compatibility-20260911/generated-final/05-fresh-process-reopened/management/left/base.model b/harness/experiments/library-compatibility-20260911/generated-final/05-fresh-process-reopened/management/left/base.model new file mode 100644 index 00000000..52f2ea0e --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/05-fresh-process-reopened/management/left/base.model @@ -0,0 +1,11 @@ +base|controls2|data2|sink_left|left +original|A|left/A +original|C|left/C +original|E|left/E +original|K|left/K +original|P|left/P +member|A|record|left/A|OA|left Watch|Activity|Monitor alarm +member|C|record|left/C|OA|left Stress|Case|-|left/P=1250@controls2:ms +member|E|record|left/E|OA|left Alarm|Interaction|left/A|sink_left|data2/Alarm +member|K|record|left/K|OA|left Elapsed limit|Check|left/P|1000@controls2:ms +member|P|record|left/P|OA|left Elapsed|Property|left/A|controls2:Duration|750@controls2:ms diff --git a/harness/experiments/library-compatibility-20260911/generated-final/05-fresh-process-reopened/management/left/lineage.model b/harness/experiments/library-compatibility-20260911/generated-final/05-fresh-process-reopened/management/left/lineage.model new file mode 100644 index 00000000..e4209eb0 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/05-fresh-process-reopened/management/left/lineage.model @@ -0,0 +1,5 @@ +lineage|left/A|left/A +lineage|left/C|left/C +lineage|left/E|left/E +lineage|left/K|left/K +lineage|left/P|left/P diff --git a/harness/experiments/library-compatibility-20260911/generated-final/05-fresh-process-reopened/management/left/map.model b/harness/experiments/library-compatibility-20260911/generated-final/05-fresh-process-reopened/management/left/map.model new file mode 100644 index 00000000..eb6b5bce --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/05-fresh-process-reopened/management/left/map.model @@ -0,0 +1,5 @@ +current|A|left/A +current|C|left/C +current|E|left/E +current|K|left/K +current|P|left/P diff --git a/harness/experiments/library-compatibility-20260911/generated-final/05-fresh-process-reopened/management/right/base.model b/harness/experiments/library-compatibility-20260911/generated-final/05-fresh-process-reopened/management/right/base.model new file mode 100644 index 00000000..a680ebda --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/05-fresh-process-reopened/management/right/base.model @@ -0,0 +1,11 @@ +base|controls1|data1|sink_right|right +original|A|right/A +original|C|right/C +original|E|right/E +original|K|right/K +original|P|right/P +member|A|record|right/A|OA|right Watch|Activity|Monitor alarm +member|C|record|right/C|OA|right Stress|Case|-|right/P=1250@controls1:ms +member|E|record|right/E|OA|right Alarm|Interaction|right/A|sink_right|data1/Alarm +member|K|record|right/K|OA|right Elapsed limit|Check|right/P|1000@controls1:ms +member|P|record|right/P|OA|right Elapsed|Property|right/A|controls1:Duration|750@controls1:ms diff --git a/harness/experiments/library-compatibility-20260911/generated-final/05-fresh-process-reopened/management/right/lineage.model b/harness/experiments/library-compatibility-20260911/generated-final/05-fresh-process-reopened/management/right/lineage.model new file mode 100644 index 00000000..3977d1d3 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/05-fresh-process-reopened/management/right/lineage.model @@ -0,0 +1,5 @@ +lineage|right/A|right/A +lineage|right/C|right/C +lineage|right/E|right/E +lineage|right/K|right/K +lineage|right/P|right/P diff --git a/harness/experiments/library-compatibility-20260911/generated-final/05-fresh-process-reopened/management/right/map.model b/harness/experiments/library-compatibility-20260911/generated-final/05-fresh-process-reopened/management/right/map.model new file mode 100644 index 00000000..87c2bfd1 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/05-fresh-process-reopened/management/right/map.model @@ -0,0 +1,5 @@ +current|A|right/A +current|C|right/C +current|E|right/E +current|K|right/K +current|P|right/P diff --git a/harness/experiments/library-compatibility-20260911/generated-final/05-fresh-process-reopened/packages/28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33.library b/harness/experiments/library-compatibility-20260911/generated-final/05-fresh-process-reopened/packages/28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33.library new file mode 100644 index 00000000..81524593 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/05-fresh-process-reopened/packages/28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33.library @@ -0,0 +1,24 @@ +package|ControlPatterns|1.0.0 +description|Monitor alarm +note|Initial documentation +def|Duration|Kind|Neutral|dimension=0,0,1,0,0,0,0;linear|- +def|Energy|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|Torque|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|ms|Unit|Neutral|millis=1|Duration +def|s|Unit|Neutral|millis=1000|Duration +def|Flag|Scalar|OA|Boolean|- +def|Alarm|Item|OA|Flow|Code +def|Code|Field|OA|minimum=1;maximum=1|Alarm,Flag +def|Interface|Interface|OA|-|Operation +def|Operation|Allocation|OA|order=0|Interface,Alarm +prototype|A|record|A|OA|Watch|Activity|Monitor alarm +prototype|E|record|E|OA|Alarm|Interaction|A|H|MOUNT/Alarm +prototype|P|record|P|OA|Elapsed|Property|A|SELF:Duration|750@SELF:ms +prototype|C|record|C|OA|Stress|Case|-|P=1250@SELF:ms +prototype|K|record|K|OA|Elapsed limit|Check|P|1000@SELF:ms +prototype|H|record|H|OA|Prototype receiver|Activity|Context role only +prototype|Q|record|Q|OA|Outside delay|Property|H|SELF:Duration|1000@SELF:ms +prototype|G|record|G|OA|Project-wide study|Case|-|P=2500@SELF:ms,Q=4000@SELF:ms +pattern|monitor|A,E,P,C,K +analysis|P|K|C +role|sink|H|Activity|OA diff --git a/harness/experiments/library-compatibility-20260911/generated-final/05-fresh-process-reopened/packages/a35102e04b9f6822ab409ab43f83eded33edd0a3a3c1f589245bb7b123ce4779.library b/harness/experiments/library-compatibility-20260911/generated-final/05-fresh-process-reopened/packages/a35102e04b9f6822ab409ab43f83eded33edd0a3a3c1f589245bb7b123ce4779.library new file mode 100644 index 00000000..a682d20e --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/05-fresh-process-reopened/packages/a35102e04b9f6822ab409ab43f83eded33edd0a3a3c1f589245bb7b123ce4779.library @@ -0,0 +1,24 @@ +package|ControlPatterns|1.0.1 +description|Monitor alarm +note|Revised documentation only +def|Duration|Kind|Neutral|dimension=0,0,1,0,0,0,0;linear|- +def|Energy|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|Torque|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|ms|Unit|Neutral|millis=1|Duration +def|s|Unit|Neutral|millis=1000|Duration +def|Flag|Scalar|OA|Boolean|- +def|Alarm|Item|OA|Flow|Code +def|Code|Field|OA|minimum=1;maximum=1|Alarm,Flag +def|Interface|Interface|OA|-|Operation +def|Operation|Allocation|OA|order=0|Interface,Alarm +prototype|A|record|A|OA|Watch|Activity|Monitor alarm +prototype|E|record|E|OA|Alarm|Interaction|A|H|MOUNT/Alarm +prototype|P|record|P|OA|Elapsed|Property|A|SELF:Duration|750@SELF:ms +prototype|C|record|C|OA|Stress|Case|-|P=1250@SELF:ms +prototype|K|record|K|OA|Elapsed limit|Check|P|1000@SELF:ms +prototype|H|record|H|OA|Prototype receiver|Activity|Context role only +prototype|Q|record|Q|OA|Outside delay|Property|H|SELF:Duration|1000@SELF:ms +prototype|G|record|G|OA|Project-wide study|Case|-|P=2500@SELF:ms,Q=4000@SELF:ms +pattern|monitor|A,E,P,C,K +analysis|P|K|C +role|sink|H|Activity|OA diff --git a/harness/experiments/library-compatibility-20260911/generated-final/05-fresh-process-reopened/project.model b/harness/experiments/library-compatibility-20260911/generated-final/05-fresh-process-reopened/project.model new file mode 100644 index 00000000..492fd2a2 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/05-fresh-process-reopened/project.model @@ -0,0 +1,25 @@ +document|Alpha|3 +import|controls1|ControlPatterns|1.0.0|28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33|packages/28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33.library +import|controls2|ControlPatterns|1.0.1|a35102e04b9f6822ab409ab43f83eded33edd0a3a3c1f589245bb7b123ce4779|packages/a35102e04b9f6822ab409ab43f83eded33edd0a3a3c1f589245bb7b123ce4779.library +mount|data1|controls1|management/data1.mount +mount|data2|controls2|management/data2.mount +instance|left|management/left +instance|right|management/right +record|budget|OA|Combined duration|Budget|left/P|right/P|controls1:Duration|2000@controls1:ms +record|global|OA|Unrelated project-wide study|Case|-|left/P=3000@controls1:ms +record|left/A|OA|left Watch|Activity|Monitor alarm +record|left/C|OA|left Stress|Case|-|left/P=1250@controls2:ms +record|left/E|OA|left Alarm|Interaction|left/A|sink_left|data2/Alarm +record|left/K|OA|left Elapsed limit|Check|left/P|1000@controls2:ms +record|left/P|OA|left Elapsed|Property|left/A|controls2:Duration|900@controls1:ms +record|outside|OA|Outside typed receiver|Consumer|left/E|data1/Interface|data1/Operation|data1/Code +record|right/A|OA|right Watch|Activity|Monitor alarm +record|right/C|OA|right Stress|Case|-|right/P=1250@controls1:ms +record|right/E|OA|right Alarm|Interaction|right/A|sink_right|data1/Alarm +record|right/K|OA|right Elapsed limit|Check|right/P|1000@controls1:ms +record|right/P|OA|right Elapsed|Property|right/A|controls1:Duration|750@controls1:ms +record|sink_left|OA|Receive left|Activity| +record|sink_right|OA|Receive right|Activity| +applied|create-two-instances +applied|edit_base|left/P|900@controls1:ms +applied|update|left|28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33|controls2|data2|2|P.base=keep_local diff --git a/harness/experiments/library-compatibility-20260911/generated-final/RESULTS.md b/harness/experiments/library-compatibility-20260911/generated-final/RESULTS.md new file mode 100644 index 00000000..4a021045 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/RESULTS.md @@ -0,0 +1,24 @@ +# Finite-model results + +Assertions passed: 120 + +Initial budget: 1500 ms, satisfied. +After one local base edit: 1650 ms, satisfied. +After selected cosmetic update: 1650 ms, satisfied; exact pins differ. +Outside budget/consumer/global case: exact records unchanged. +Updated left baseline: 750 controls2:ms; current: 900 controls1:ms; declared kind controls2:Duration. +Right instance/base/map: exact original. +Contract path projection: data1/Code -> data2/Code and data1/Operation -> data2/Operation. +Changed field cardinality: selective candidate rejected. +Strict revision identity: old/new refs unequal. +Same-origin typed compatibility: cosmetic revision accepted; Energy/Torque, other origin, changed contract rejected. +Bridge alternative: 2 explicit validated direct witnesses; changed contracts rejected. +Stable vocabulary alternative: exact common pin survives pattern change; vocabulary change remains unresolved without compatibility/migration. +Subjectless explicit C+K selected; unrelated G omitted; selected G requires Q boundary. +OA/SA: explicit pinned counterpart or independent local derivative; refined reverse counterpart fails exact transformed contract. + +D1: 28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33 +D2: a35102e04b9f6822ab409ab43f83eded33edd0a3a3c1f589245bb7b123ce4779 +D3: 4b05d6a15115448e318d0c5d567ebb0bb9e0ab6438bd238e5f3a0716c7db1ee8 + +This dialect uses opaque symbolic identities, a restricted AST, one package per import and scalar integer-millisecond arithmetic. It is not Studio source, a full package dependency solver, production UUID allocation, complete data/operation/transition admission, REST or native acceptance. diff --git a/harness/experiments/library-compatibility-20260911/generated-final/expected-full-updated/management/data1.mount b/harness/experiments/library-compatibility-20260911/generated-final/expected-full-updated/management/data1.mount new file mode 100644 index 00000000..ab153a97 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/expected-full-updated/management/data1.mount @@ -0,0 +1,5 @@ +member|Alarm|data1/Alarm +member|Code|data1/Code +member|Flag|data1/Flag +member|Interface|data1/Interface +member|Operation|data1/Operation diff --git a/harness/experiments/library-compatibility-20260911/generated-final/expected-full-updated/management/data2.mount b/harness/experiments/library-compatibility-20260911/generated-final/expected-full-updated/management/data2.mount new file mode 100644 index 00000000..c1ae4b6e --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/expected-full-updated/management/data2.mount @@ -0,0 +1,5 @@ +member|Alarm|data2/Alarm +member|Code|data2/Code +member|Flag|data2/Flag +member|Interface|data2/Interface +member|Operation|data2/Operation diff --git a/harness/experiments/library-compatibility-20260911/generated-final/expected-full-updated/management/left/base.model b/harness/experiments/library-compatibility-20260911/generated-final/expected-full-updated/management/left/base.model new file mode 100644 index 00000000..52f2ea0e --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/expected-full-updated/management/left/base.model @@ -0,0 +1,11 @@ +base|controls2|data2|sink_left|left +original|A|left/A +original|C|left/C +original|E|left/E +original|K|left/K +original|P|left/P +member|A|record|left/A|OA|left Watch|Activity|Monitor alarm +member|C|record|left/C|OA|left Stress|Case|-|left/P=1250@controls2:ms +member|E|record|left/E|OA|left Alarm|Interaction|left/A|sink_left|data2/Alarm +member|K|record|left/K|OA|left Elapsed limit|Check|left/P|1000@controls2:ms +member|P|record|left/P|OA|left Elapsed|Property|left/A|controls2:Duration|750@controls2:ms diff --git a/harness/experiments/library-compatibility-20260911/generated-final/expected-full-updated/management/left/lineage.model b/harness/experiments/library-compatibility-20260911/generated-final/expected-full-updated/management/left/lineage.model new file mode 100644 index 00000000..e4209eb0 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/expected-full-updated/management/left/lineage.model @@ -0,0 +1,5 @@ +lineage|left/A|left/A +lineage|left/C|left/C +lineage|left/E|left/E +lineage|left/K|left/K +lineage|left/P|left/P diff --git a/harness/experiments/library-compatibility-20260911/generated-final/expected-full-updated/management/left/map.model b/harness/experiments/library-compatibility-20260911/generated-final/expected-full-updated/management/left/map.model new file mode 100644 index 00000000..eb6b5bce --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/expected-full-updated/management/left/map.model @@ -0,0 +1,5 @@ +current|A|left/A +current|C|left/C +current|E|left/E +current|K|left/K +current|P|left/P diff --git a/harness/experiments/library-compatibility-20260911/generated-final/expected-full-updated/management/right/base.model b/harness/experiments/library-compatibility-20260911/generated-final/expected-full-updated/management/right/base.model new file mode 100644 index 00000000..a680ebda --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/expected-full-updated/management/right/base.model @@ -0,0 +1,11 @@ +base|controls1|data1|sink_right|right +original|A|right/A +original|C|right/C +original|E|right/E +original|K|right/K +original|P|right/P +member|A|record|right/A|OA|right Watch|Activity|Monitor alarm +member|C|record|right/C|OA|right Stress|Case|-|right/P=1250@controls1:ms +member|E|record|right/E|OA|right Alarm|Interaction|right/A|sink_right|data1/Alarm +member|K|record|right/K|OA|right Elapsed limit|Check|right/P|1000@controls1:ms +member|P|record|right/P|OA|right Elapsed|Property|right/A|controls1:Duration|750@controls1:ms diff --git a/harness/experiments/library-compatibility-20260911/generated-final/expected-full-updated/management/right/lineage.model b/harness/experiments/library-compatibility-20260911/generated-final/expected-full-updated/management/right/lineage.model new file mode 100644 index 00000000..3977d1d3 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/expected-full-updated/management/right/lineage.model @@ -0,0 +1,5 @@ +lineage|right/A|right/A +lineage|right/C|right/C +lineage|right/E|right/E +lineage|right/K|right/K +lineage|right/P|right/P diff --git a/harness/experiments/library-compatibility-20260911/generated-final/expected-full-updated/management/right/map.model b/harness/experiments/library-compatibility-20260911/generated-final/expected-full-updated/management/right/map.model new file mode 100644 index 00000000..87c2bfd1 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/expected-full-updated/management/right/map.model @@ -0,0 +1,5 @@ +current|A|right/A +current|C|right/C +current|E|right/E +current|K|right/K +current|P|right/P diff --git a/harness/experiments/library-compatibility-20260911/generated-final/expected-full-updated/packages/28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33.library b/harness/experiments/library-compatibility-20260911/generated-final/expected-full-updated/packages/28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33.library new file mode 100644 index 00000000..81524593 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/expected-full-updated/packages/28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33.library @@ -0,0 +1,24 @@ +package|ControlPatterns|1.0.0 +description|Monitor alarm +note|Initial documentation +def|Duration|Kind|Neutral|dimension=0,0,1,0,0,0,0;linear|- +def|Energy|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|Torque|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|ms|Unit|Neutral|millis=1|Duration +def|s|Unit|Neutral|millis=1000|Duration +def|Flag|Scalar|OA|Boolean|- +def|Alarm|Item|OA|Flow|Code +def|Code|Field|OA|minimum=1;maximum=1|Alarm,Flag +def|Interface|Interface|OA|-|Operation +def|Operation|Allocation|OA|order=0|Interface,Alarm +prototype|A|record|A|OA|Watch|Activity|Monitor alarm +prototype|E|record|E|OA|Alarm|Interaction|A|H|MOUNT/Alarm +prototype|P|record|P|OA|Elapsed|Property|A|SELF:Duration|750@SELF:ms +prototype|C|record|C|OA|Stress|Case|-|P=1250@SELF:ms +prototype|K|record|K|OA|Elapsed limit|Check|P|1000@SELF:ms +prototype|H|record|H|OA|Prototype receiver|Activity|Context role only +prototype|Q|record|Q|OA|Outside delay|Property|H|SELF:Duration|1000@SELF:ms +prototype|G|record|G|OA|Project-wide study|Case|-|P=2500@SELF:ms,Q=4000@SELF:ms +pattern|monitor|A,E,P,C,K +analysis|P|K|C +role|sink|H|Activity|OA diff --git a/harness/experiments/library-compatibility-20260911/generated-final/expected-full-updated/packages/a35102e04b9f6822ab409ab43f83eded33edd0a3a3c1f589245bb7b123ce4779.library b/harness/experiments/library-compatibility-20260911/generated-final/expected-full-updated/packages/a35102e04b9f6822ab409ab43f83eded33edd0a3a3c1f589245bb7b123ce4779.library new file mode 100644 index 00000000..a682d20e --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/expected-full-updated/packages/a35102e04b9f6822ab409ab43f83eded33edd0a3a3c1f589245bb7b123ce4779.library @@ -0,0 +1,24 @@ +package|ControlPatterns|1.0.1 +description|Monitor alarm +note|Revised documentation only +def|Duration|Kind|Neutral|dimension=0,0,1,0,0,0,0;linear|- +def|Energy|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|Torque|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|ms|Unit|Neutral|millis=1|Duration +def|s|Unit|Neutral|millis=1000|Duration +def|Flag|Scalar|OA|Boolean|- +def|Alarm|Item|OA|Flow|Code +def|Code|Field|OA|minimum=1;maximum=1|Alarm,Flag +def|Interface|Interface|OA|-|Operation +def|Operation|Allocation|OA|order=0|Interface,Alarm +prototype|A|record|A|OA|Watch|Activity|Monitor alarm +prototype|E|record|E|OA|Alarm|Interaction|A|H|MOUNT/Alarm +prototype|P|record|P|OA|Elapsed|Property|A|SELF:Duration|750@SELF:ms +prototype|C|record|C|OA|Stress|Case|-|P=1250@SELF:ms +prototype|K|record|K|OA|Elapsed limit|Check|P|1000@SELF:ms +prototype|H|record|H|OA|Prototype receiver|Activity|Context role only +prototype|Q|record|Q|OA|Outside delay|Property|H|SELF:Duration|1000@SELF:ms +prototype|G|record|G|OA|Project-wide study|Case|-|P=2500@SELF:ms,Q=4000@SELF:ms +pattern|monitor|A,E,P,C,K +analysis|P|K|C +role|sink|H|Activity|OA diff --git a/harness/experiments/library-compatibility-20260911/generated-final/expected-full-updated/project.model b/harness/experiments/library-compatibility-20260911/generated-final/expected-full-updated/project.model new file mode 100644 index 00000000..492fd2a2 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/expected-full-updated/project.model @@ -0,0 +1,25 @@ +document|Alpha|3 +import|controls1|ControlPatterns|1.0.0|28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33|packages/28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33.library +import|controls2|ControlPatterns|1.0.1|a35102e04b9f6822ab409ab43f83eded33edd0a3a3c1f589245bb7b123ce4779|packages/a35102e04b9f6822ab409ab43f83eded33edd0a3a3c1f589245bb7b123ce4779.library +mount|data1|controls1|management/data1.mount +mount|data2|controls2|management/data2.mount +instance|left|management/left +instance|right|management/right +record|budget|OA|Combined duration|Budget|left/P|right/P|controls1:Duration|2000@controls1:ms +record|global|OA|Unrelated project-wide study|Case|-|left/P=3000@controls1:ms +record|left/A|OA|left Watch|Activity|Monitor alarm +record|left/C|OA|left Stress|Case|-|left/P=1250@controls2:ms +record|left/E|OA|left Alarm|Interaction|left/A|sink_left|data2/Alarm +record|left/K|OA|left Elapsed limit|Check|left/P|1000@controls2:ms +record|left/P|OA|left Elapsed|Property|left/A|controls2:Duration|900@controls1:ms +record|outside|OA|Outside typed receiver|Consumer|left/E|data1/Interface|data1/Operation|data1/Code +record|right/A|OA|right Watch|Activity|Monitor alarm +record|right/C|OA|right Stress|Case|-|right/P=1250@controls1:ms +record|right/E|OA|right Alarm|Interaction|right/A|sink_right|data1/Alarm +record|right/K|OA|right Elapsed limit|Check|right/P|1000@controls1:ms +record|right/P|OA|right Elapsed|Property|right/A|controls1:Duration|750@controls1:ms +record|sink_left|OA|Receive left|Activity| +record|sink_right|OA|Receive right|Activity| +applied|create-two-instances +applied|edit_base|left/P|900@controls1:ms +applied|update|left|28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33|controls2|data2|2|P.base=keep_local diff --git a/harness/experiments/library-compatibility-20260911/generated-final/expected-initial.model b/harness/experiments/library-compatibility-20260911/generated-final/expected-initial.model new file mode 100644 index 00000000..81ab673e --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/expected-initial.model @@ -0,0 +1,15 @@ +record|sink_left|OA|Receive left|Activity| +record|sink_right|OA|Receive right|Activity| +record|left/A|OA|left Watch|Activity|Monitor alarm +record|left/E|OA|left Alarm|Interaction|left/A|sink_left|data1/Alarm +record|left/P|OA|left Elapsed|Property|left/A|controls1:Duration|750@controls1:ms +record|left/C|OA|left Stress|Case|-|left/P=1250@controls1:ms +record|left/K|OA|left Elapsed limit|Check|left/P|1000@controls1:ms +record|right/A|OA|right Watch|Activity|Monitor alarm +record|right/E|OA|right Alarm|Interaction|right/A|sink_right|data1/Alarm +record|right/P|OA|right Elapsed|Property|right/A|controls1:Duration|750@controls1:ms +record|right/C|OA|right Stress|Case|-|right/P=1250@controls1:ms +record|right/K|OA|right Elapsed limit|Check|right/P|1000@controls1:ms +record|budget|OA|Combined duration|Budget|left/P|right/P|controls1:Duration|2000@controls1:ms +record|outside|OA|Outside typed receiver|Consumer|left/E|data1/Interface|data1/Operation|data1/Code +record|global|OA|Unrelated project-wide study|Case|-|left/P=3000@controls1:ms diff --git a/harness/experiments/library-compatibility-20260911/generated-final/expected-key-records.model b/harness/experiments/library-compatibility-20260911/generated-final/expected-key-records.model new file mode 100644 index 00000000..6d760e4c --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/expected-key-records.model @@ -0,0 +1,7 @@ +record|left/P|OA|left Elapsed|Property|left/A|controls2:Duration|900@controls1:ms +record|left/E|OA|left Alarm|Interaction|left/A|sink_left|data2/Alarm +record|left/C|OA|left Stress|Case|-|left/P=1250@controls2:ms +record|left/K|OA|left Elapsed limit|Check|left/P|1000@controls2:ms +record|right/P|OA|right Elapsed|Property|right/A|controls1:Duration|750@controls1:ms +record|budget|OA|Combined duration|Budget|left/P|right/P|controls1:Duration|2000@controls1:ms +record|outside|OA|Outside typed receiver|Consumer|left/E|data1/Interface|data1/Operation|data1/Code diff --git a/harness/experiments/library-compatibility-20260911/generated-final/explicit-bridges.model b/harness/experiments/library-compatibility-20260911/generated-final/explicit-bridges.model new file mode 100644 index 00000000..09c57e17 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/explicit-bridges.model @@ -0,0 +1,2 @@ +checked-same-origin|28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33|Duration|a35102e04b9f6822ab409ab43f83eded33edd0a3a3c1f589245bb7b123ce4779|Duration +checked-same-origin|28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33|Interface|a35102e04b9f6822ab409ab43f83eded33edd0a3a3c1f589245bb7b123ce4779|Interface diff --git a/harness/experiments/library-compatibility-20260911/generated-final/initial.request b/harness/experiments/library-compatibility-20260911/generated-final/initial.request new file mode 100644 index 00000000..618589bf --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/initial.request @@ -0,0 +1,11 @@ +new|Alpha +import|controls1|D1 +mount|data1|controls1 +activity|sink_left|Receive left +activity|sink_right|Receive right +instantiate|left|controls1|data1|sink_left +instantiate|right|controls1|data1|sink_right +budget|budget|left/P|right/P|controls1 +consumer|outside|left/E|data1 +global_case|global|left/P +receipt|create-two-instances diff --git a/harness/experiments/library-compatibility-20260911/generated-final/local-edit.request b/harness/experiments/library-compatibility-20260911/generated-final/local-edit.request new file mode 100644 index 00000000..3fd97bb7 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/local-edit.request @@ -0,0 +1 @@ +edit_base|left/P|900@controls1:ms diff --git a/harness/experiments/library-compatibility-20260911/generated-final/oa-sa-transition.model b/harness/experiments/library-compatibility-20260911/generated-final/oa-sa-transition.model new file mode 100644 index 00000000..811494f6 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/oa-sa-transition.model @@ -0,0 +1,256 @@ +pinned-counterpart=Transition { + layer: "SA", + records: { + "SA/Alarm": Definition { + member: "SA/Alarm", + class: "Item", + layer: "SA", + fields: [ + "Flow", + ], + refs: [ + "SA/Code", + ], + }, + "SA/Code": Definition { + member: "SA/Code", + class: "Field", + layer: "SA", + fields: [ + "minimum=1;maximum=1", + ], + refs: [ + "SA/Alarm", + "SA/Flag", + ], + }, + "SA/Flag": Definition { + member: "SA/Flag", + class: "Scalar", + layer: "SA", + fields: [ + "Boolean", + ], + refs: [], + }, + "SA/Interface": Definition { + member: "SA/Interface", + class: "Interface", + layer: "SA", + fields: [], + refs: [ + "SA/Operation", + ], + }, + "SA/Operation": Definition { + member: "SA/Operation", + class: "Allocation", + layer: "SA", + fields: [ + "order=0", + ], + refs: [ + "SA/Interface", + "SA/Alarm", + ], + }, + }, + origin_pin: "a35102e04b9f6822ab409ab43f83eded33edd0a3a3c1f589245bb7b123ce4779", + target_pin: Some( + "f52b2a9281b60d35ddc0044fc9624b3b30ee0d35d88d1130c2c3e1af54e05696", + ), + origin_map: { + "Alarm": "SA/Alarm", + "Code": "SA/Code", + "Flag": "SA/Flag", + "Interface": "SA/Interface", + "Operation": "SA/Operation", + }, + mount: true, +} +pinned-architecture={ + "sa/alarm": FunctionalExchange { + source: "sa/watch", + target: "sa/receive", + source_port: "sa/watch_out", + target_port: "sa/receive_in", + item: "sa_mount/SA/Alarm", + }, + "sa/receive": Function { + name: "Receive left", + }, + "sa/receive_in": Port { + owner: "sa/receive", + direction: "In", + accepted_item: "sa_mount/SA/Alarm", + }, + "sa/watch": Function { + name: "Watch", + }, + "sa/watch_out": Port { + owner: "sa/watch", + direction: "Out", + accepted_item: "sa_mount/SA/Alarm", + }, +} +local-derivative=Transition { + layer: "SA", + records: { + "SA/Alarm": Definition { + member: "SA/Alarm", + class: "Item", + layer: "SA", + fields: [ + "Flow", + ], + refs: [ + "SA/Code", + ], + }, + "SA/Code": Definition { + member: "SA/Code", + class: "Field", + layer: "SA", + fields: [ + "minimum=1;maximum=1", + ], + refs: [ + "SA/Alarm", + "SA/Flag", + ], + }, + "SA/Flag": Definition { + member: "SA/Flag", + class: "Scalar", + layer: "SA", + fields: [ + "Boolean", + ], + refs: [], + }, + "SA/Interface": Definition { + member: "SA/Interface", + class: "Interface", + layer: "SA", + fields: [], + refs: [ + "SA/Operation", + ], + }, + "SA/Operation": Definition { + member: "SA/Operation", + class: "Allocation", + layer: "SA", + fields: [ + "order=0", + ], + refs: [ + "SA/Interface", + "SA/Alarm", + ], + }, + }, + origin_pin: "a35102e04b9f6822ab409ab43f83eded33edd0a3a3c1f589245bb7b123ce4779", + target_pin: None, + origin_map: { + "Alarm": "SA/Alarm", + "Code": "SA/Code", + "Flag": "SA/Flag", + "Interface": "SA/Interface", + "Operation": "SA/Operation", + }, + mount: false, +} +local-architecture={ + "sa/alarm": FunctionalExchange { + source: "sa/watch", + target: "sa/receive", + source_port: "sa/watch_out", + target_port: "sa/receive_in", + item: "SA/Alarm", + }, + "sa/receive": Function { + name: "Receive left", + }, + "sa/receive_in": Port { + owner: "sa/receive", + direction: "In", + accepted_item: "SA/Alarm", + }, + "sa/watch": Function { + name: "Watch", + }, + "sa/watch_out": Port { + owner: "sa/watch", + direction: "Out", + accepted_item: "SA/Alarm", + }, +} +refined-derivative=Transition { + layer: "SA", + records: { + "SA/Alarm": Definition { + member: "SA/Alarm", + class: "Item", + layer: "SA", + fields: [ + "Flow", + ], + refs: [ + "SA/Code", + ], + }, + "SA/Code": Definition { + member: "SA/Code", + class: "Field", + layer: "SA", + fields: [ + "minimum=1;maximum=2", + ], + refs: [ + "SA/Alarm", + "SA/Flag", + ], + }, + "SA/Flag": Definition { + member: "SA/Flag", + class: "Scalar", + layer: "SA", + fields: [ + "Boolean", + ], + refs: [], + }, + "SA/Interface": Definition { + member: "SA/Interface", + class: "Interface", + layer: "SA", + fields: [], + refs: [ + "SA/Operation", + ], + }, + "SA/Operation": Definition { + member: "SA/Operation", + class: "Allocation", + layer: "SA", + fields: [ + "order=0", + ], + refs: [ + "SA/Interface", + "SA/Alarm", + ], + }, + }, + origin_pin: "a35102e04b9f6822ab409ab43f83eded33edd0a3a3c1f589245bb7b123ce4779", + target_pin: None, + origin_map: { + "Alarm": "SA/Alarm", + "Code": "SA/Code", + "Flag": "SA/Flag", + "Interface": "SA/Interface", + "Operation": "SA/Operation", + }, + mount: false, +} diff --git a/harness/experiments/library-compatibility-20260911/generated-final/package-D1.library b/harness/experiments/library-compatibility-20260911/generated-final/package-D1.library new file mode 100644 index 00000000..81524593 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/package-D1.library @@ -0,0 +1,24 @@ +package|ControlPatterns|1.0.0 +description|Monitor alarm +note|Initial documentation +def|Duration|Kind|Neutral|dimension=0,0,1,0,0,0,0;linear|- +def|Energy|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|Torque|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|ms|Unit|Neutral|millis=1|Duration +def|s|Unit|Neutral|millis=1000|Duration +def|Flag|Scalar|OA|Boolean|- +def|Alarm|Item|OA|Flow|Code +def|Code|Field|OA|minimum=1;maximum=1|Alarm,Flag +def|Interface|Interface|OA|-|Operation +def|Operation|Allocation|OA|order=0|Interface,Alarm +prototype|A|record|A|OA|Watch|Activity|Monitor alarm +prototype|E|record|E|OA|Alarm|Interaction|A|H|MOUNT/Alarm +prototype|P|record|P|OA|Elapsed|Property|A|SELF:Duration|750@SELF:ms +prototype|C|record|C|OA|Stress|Case|-|P=1250@SELF:ms +prototype|K|record|K|OA|Elapsed limit|Check|P|1000@SELF:ms +prototype|H|record|H|OA|Prototype receiver|Activity|Context role only +prototype|Q|record|Q|OA|Outside delay|Property|H|SELF:Duration|1000@SELF:ms +prototype|G|record|G|OA|Project-wide study|Case|-|P=2500@SELF:ms,Q=4000@SELF:ms +pattern|monitor|A,E,P,C,K +analysis|P|K|C +role|sink|H|Activity|OA diff --git a/harness/experiments/library-compatibility-20260911/generated-final/package-D2.library b/harness/experiments/library-compatibility-20260911/generated-final/package-D2.library new file mode 100644 index 00000000..a682d20e --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/package-D2.library @@ -0,0 +1,24 @@ +package|ControlPatterns|1.0.1 +description|Monitor alarm +note|Revised documentation only +def|Duration|Kind|Neutral|dimension=0,0,1,0,0,0,0;linear|- +def|Energy|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|Torque|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|ms|Unit|Neutral|millis=1|Duration +def|s|Unit|Neutral|millis=1000|Duration +def|Flag|Scalar|OA|Boolean|- +def|Alarm|Item|OA|Flow|Code +def|Code|Field|OA|minimum=1;maximum=1|Alarm,Flag +def|Interface|Interface|OA|-|Operation +def|Operation|Allocation|OA|order=0|Interface,Alarm +prototype|A|record|A|OA|Watch|Activity|Monitor alarm +prototype|E|record|E|OA|Alarm|Interaction|A|H|MOUNT/Alarm +prototype|P|record|P|OA|Elapsed|Property|A|SELF:Duration|750@SELF:ms +prototype|C|record|C|OA|Stress|Case|-|P=1250@SELF:ms +prototype|K|record|K|OA|Elapsed limit|Check|P|1000@SELF:ms +prototype|H|record|H|OA|Prototype receiver|Activity|Context role only +prototype|Q|record|Q|OA|Outside delay|Property|H|SELF:Duration|1000@SELF:ms +prototype|G|record|G|OA|Project-wide study|Case|-|P=2500@SELF:ms,Q=4000@SELF:ms +pattern|monitor|A,E,P,C,K +analysis|P|K|C +role|sink|H|Activity|OA diff --git a/harness/experiments/library-compatibility-20260911/generated-final/package-D3.library b/harness/experiments/library-compatibility-20260911/generated-final/package-D3.library new file mode 100644 index 00000000..b238b08f --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/package-D3.library @@ -0,0 +1,24 @@ +package|ControlPatterns|2.0.0 +description|Monitor alarm +note|Initial documentation +def|Duration|Kind|Neutral|dimension=0,0,1,0,0,0,0;linear|- +def|Energy|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|Torque|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|ms|Unit|Neutral|millis=1|Duration +def|s|Unit|Neutral|millis=1000|Duration +def|Flag|Scalar|OA|Boolean|- +def|Alarm|Item|OA|Flow|Code +def|Code|Field|OA|minimum=1;maximum=2|Alarm,Flag +def|Interface|Interface|OA|-|Operation +def|Operation|Allocation|OA|order=0|Interface,Alarm +prototype|A|record|A|OA|Watch|Activity|Monitor alarm +prototype|E|record|E|OA|Alarm|Interaction|A|H|MOUNT/Alarm +prototype|P|record|P|OA|Elapsed|Property|A|SELF:Duration|750@SELF:ms +prototype|C|record|C|OA|Stress|Case|-|P=1250@SELF:ms +prototype|K|record|K|OA|Elapsed limit|Check|P|1000@SELF:ms +prototype|H|record|H|OA|Prototype receiver|Activity|Context role only +prototype|Q|record|Q|OA|Outside delay|Property|H|SELF:Duration|1000@SELF:ms +prototype|G|record|G|OA|Project-wide study|Case|-|P=2500@SELF:ms,Q=4000@SELF:ms +pattern|monitor|A,E,P,C,K +analysis|P|K|C +role|sink|H|Activity|OA diff --git a/harness/experiments/library-compatibility-20260911/generated-final/package-SA.library b/harness/experiments/library-compatibility-20260911/generated-final/package-SA.library new file mode 100644 index 00000000..7920f149 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/package-SA.library @@ -0,0 +1,7 @@ +package|ControlPatternsSA|1.0.1 +description|Explicit SA counterpart +def|SA/Alarm|Item|SA|Flow|SA/Code +def|SA/Code|Field|SA|minimum=1;maximum=1|SA/Alarm,SA/Flag +def|SA/Flag|Scalar|SA|Boolean| +def|SA/Interface|Interface|SA||SA/Operation +def|SA/Operation|Allocation|SA|order=0|SA/Interface,SA/Alarm diff --git a/harness/experiments/library-compatibility-20260911/generated-final/selective-update.request b/harness/experiments/library-compatibility-20260911/generated-final/selective-update.request new file mode 100644 index 00000000..d66272e7 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated-final/selective-update.request @@ -0,0 +1 @@ +update|left|28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33|controls2|data2|2|P.base=keep_local diff --git a/harness/experiments/library-compatibility-20260911/generated/01-initial/management/data1.mount b/harness/experiments/library-compatibility-20260911/generated/01-initial/management/data1.mount new file mode 100644 index 00000000..ab153a97 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/01-initial/management/data1.mount @@ -0,0 +1,5 @@ +member|Alarm|data1/Alarm +member|Code|data1/Code +member|Flag|data1/Flag +member|Interface|data1/Interface +member|Operation|data1/Operation diff --git a/harness/experiments/library-compatibility-20260911/generated/01-initial/management/left/base.model b/harness/experiments/library-compatibility-20260911/generated/01-initial/management/left/base.model new file mode 100644 index 00000000..14195ebb --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/01-initial/management/left/base.model @@ -0,0 +1,11 @@ +base|controls1|data1|sink_left|left +original|A|left/A +original|C|left/C +original|E|left/E +original|K|left/K +original|P|left/P +member|A|record|left/A|OA|left Watch|Activity|Monitor alarm +member|C|record|left/C|OA|left Stress|Case|-|left/P=1250@controls1:ms +member|E|record|left/E|OA|left Alarm|Interaction|left/A|sink_left|data1/Alarm +member|K|record|left/K|OA|left Elapsed limit|Check|left/P|1000@controls1:ms +member|P|record|left/P|OA|left Elapsed|Property|left/A|controls1:Duration|750@controls1:ms diff --git a/harness/experiments/library-compatibility-20260911/generated/01-initial/management/left/lineage.model b/harness/experiments/library-compatibility-20260911/generated/01-initial/management/left/lineage.model new file mode 100644 index 00000000..e4209eb0 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/01-initial/management/left/lineage.model @@ -0,0 +1,5 @@ +lineage|left/A|left/A +lineage|left/C|left/C +lineage|left/E|left/E +lineage|left/K|left/K +lineage|left/P|left/P diff --git a/harness/experiments/library-compatibility-20260911/generated/01-initial/management/left/map.model b/harness/experiments/library-compatibility-20260911/generated/01-initial/management/left/map.model new file mode 100644 index 00000000..eb6b5bce --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/01-initial/management/left/map.model @@ -0,0 +1,5 @@ +current|A|left/A +current|C|left/C +current|E|left/E +current|K|left/K +current|P|left/P diff --git a/harness/experiments/library-compatibility-20260911/generated/01-initial/management/right/base.model b/harness/experiments/library-compatibility-20260911/generated/01-initial/management/right/base.model new file mode 100644 index 00000000..a680ebda --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/01-initial/management/right/base.model @@ -0,0 +1,11 @@ +base|controls1|data1|sink_right|right +original|A|right/A +original|C|right/C +original|E|right/E +original|K|right/K +original|P|right/P +member|A|record|right/A|OA|right Watch|Activity|Monitor alarm +member|C|record|right/C|OA|right Stress|Case|-|right/P=1250@controls1:ms +member|E|record|right/E|OA|right Alarm|Interaction|right/A|sink_right|data1/Alarm +member|K|record|right/K|OA|right Elapsed limit|Check|right/P|1000@controls1:ms +member|P|record|right/P|OA|right Elapsed|Property|right/A|controls1:Duration|750@controls1:ms diff --git a/harness/experiments/library-compatibility-20260911/generated/01-initial/management/right/lineage.model b/harness/experiments/library-compatibility-20260911/generated/01-initial/management/right/lineage.model new file mode 100644 index 00000000..3977d1d3 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/01-initial/management/right/lineage.model @@ -0,0 +1,5 @@ +lineage|right/A|right/A +lineage|right/C|right/C +lineage|right/E|right/E +lineage|right/K|right/K +lineage|right/P|right/P diff --git a/harness/experiments/library-compatibility-20260911/generated/01-initial/management/right/map.model b/harness/experiments/library-compatibility-20260911/generated/01-initial/management/right/map.model new file mode 100644 index 00000000..87c2bfd1 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/01-initial/management/right/map.model @@ -0,0 +1,5 @@ +current|A|right/A +current|C|right/C +current|E|right/E +current|K|right/K +current|P|right/P diff --git a/harness/experiments/library-compatibility-20260911/generated/01-initial/packages/e89a61c9548b6c5e3bf7c432d8b294923f333b67cac48fc3b33f718280db8947.library b/harness/experiments/library-compatibility-20260911/generated/01-initial/packages/e89a61c9548b6c5e3bf7c432d8b294923f333b67cac48fc3b33f718280db8947.library new file mode 100644 index 00000000..0dce2908 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/01-initial/packages/e89a61c9548b6c5e3bf7c432d8b294923f333b67cac48fc3b33f718280db8947.library @@ -0,0 +1,15 @@ +package|ControlPatterns|1.0.0 +description|Monitor alarm +note|Initial documentation +def|Duration|Kind|Neutral|dimension=0,0,1,0,0,0,0;linear|- +def|Energy|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|Torque|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|ms|Unit|Neutral|millis=1|Duration +def|s|Unit|Neutral|millis=1000|Duration +def|Flag|Scalar|OA|Boolean|- +def|Alarm|Item|OA|Flow|Code +def|Code|Field|OA|minimum=1;maximum=1|Alarm,Flag +def|Interface|Interface|OA|-|Operation +def|Operation|Allocation|OA|order=0|Interface,Alarm +pattern|monitor|A,E,P,C,K +role|sink|Activity|OA diff --git a/harness/experiments/library-compatibility-20260911/generated/01-initial/project.model b/harness/experiments/library-compatibility-20260911/generated/01-initial/project.model new file mode 100644 index 00000000..59b5949f --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/01-initial/project.model @@ -0,0 +1,21 @@ +document|Alpha|1 +import|controls1|ControlPatterns|1.0.0|e89a61c9548b6c5e3bf7c432d8b294923f333b67cac48fc3b33f718280db8947|packages/e89a61c9548b6c5e3bf7c432d8b294923f333b67cac48fc3b33f718280db8947.library +mount|data1|controls1|management/data1.mount +instance|left|management/left +instance|right|management/right +record|budget|OA|Combined duration|Budget|left/P|right/P|controls1:Duration|2000@controls1:ms +record|global|OA|Unrelated project-wide study|Case|-|left/P=3000@controls1:ms +record|left/A|OA|left Watch|Activity|Monitor alarm +record|left/C|OA|left Stress|Case|-|left/P=1250@controls1:ms +record|left/E|OA|left Alarm|Interaction|left/A|sink_left|data1/Alarm +record|left/K|OA|left Elapsed limit|Check|left/P|1000@controls1:ms +record|left/P|OA|left Elapsed|Property|left/A|controls1:Duration|750@controls1:ms +record|outside|OA|Outside typed receiver|Consumer|left/E|data1/Interface|data1/Operation|data1/Code +record|right/A|OA|right Watch|Activity|Monitor alarm +record|right/C|OA|right Stress|Case|-|right/P=1250@controls1:ms +record|right/E|OA|right Alarm|Interaction|right/A|sink_right|data1/Alarm +record|right/K|OA|right Elapsed limit|Check|right/P|1000@controls1:ms +record|right/P|OA|right Elapsed|Property|right/A|controls1:Duration|750@controls1:ms +record|sink_left|OA|Receive left|Activity| +record|sink_right|OA|Receive right|Activity| +applied|create-two-instances diff --git a/harness/experiments/library-compatibility-20260911/generated/01-recompiled/management/data1.mount b/harness/experiments/library-compatibility-20260911/generated/01-recompiled/management/data1.mount new file mode 100644 index 00000000..ab153a97 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/01-recompiled/management/data1.mount @@ -0,0 +1,5 @@ +member|Alarm|data1/Alarm +member|Code|data1/Code +member|Flag|data1/Flag +member|Interface|data1/Interface +member|Operation|data1/Operation diff --git a/harness/experiments/library-compatibility-20260911/generated/01-recompiled/management/left/base.model b/harness/experiments/library-compatibility-20260911/generated/01-recompiled/management/left/base.model new file mode 100644 index 00000000..14195ebb --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/01-recompiled/management/left/base.model @@ -0,0 +1,11 @@ +base|controls1|data1|sink_left|left +original|A|left/A +original|C|left/C +original|E|left/E +original|K|left/K +original|P|left/P +member|A|record|left/A|OA|left Watch|Activity|Monitor alarm +member|C|record|left/C|OA|left Stress|Case|-|left/P=1250@controls1:ms +member|E|record|left/E|OA|left Alarm|Interaction|left/A|sink_left|data1/Alarm +member|K|record|left/K|OA|left Elapsed limit|Check|left/P|1000@controls1:ms +member|P|record|left/P|OA|left Elapsed|Property|left/A|controls1:Duration|750@controls1:ms diff --git a/harness/experiments/library-compatibility-20260911/generated/01-recompiled/management/left/lineage.model b/harness/experiments/library-compatibility-20260911/generated/01-recompiled/management/left/lineage.model new file mode 100644 index 00000000..e4209eb0 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/01-recompiled/management/left/lineage.model @@ -0,0 +1,5 @@ +lineage|left/A|left/A +lineage|left/C|left/C +lineage|left/E|left/E +lineage|left/K|left/K +lineage|left/P|left/P diff --git a/harness/experiments/library-compatibility-20260911/generated/01-recompiled/management/left/map.model b/harness/experiments/library-compatibility-20260911/generated/01-recompiled/management/left/map.model new file mode 100644 index 00000000..eb6b5bce --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/01-recompiled/management/left/map.model @@ -0,0 +1,5 @@ +current|A|left/A +current|C|left/C +current|E|left/E +current|K|left/K +current|P|left/P diff --git a/harness/experiments/library-compatibility-20260911/generated/01-recompiled/management/right/base.model b/harness/experiments/library-compatibility-20260911/generated/01-recompiled/management/right/base.model new file mode 100644 index 00000000..a680ebda --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/01-recompiled/management/right/base.model @@ -0,0 +1,11 @@ +base|controls1|data1|sink_right|right +original|A|right/A +original|C|right/C +original|E|right/E +original|K|right/K +original|P|right/P +member|A|record|right/A|OA|right Watch|Activity|Monitor alarm +member|C|record|right/C|OA|right Stress|Case|-|right/P=1250@controls1:ms +member|E|record|right/E|OA|right Alarm|Interaction|right/A|sink_right|data1/Alarm +member|K|record|right/K|OA|right Elapsed limit|Check|right/P|1000@controls1:ms +member|P|record|right/P|OA|right Elapsed|Property|right/A|controls1:Duration|750@controls1:ms diff --git a/harness/experiments/library-compatibility-20260911/generated/01-recompiled/management/right/lineage.model b/harness/experiments/library-compatibility-20260911/generated/01-recompiled/management/right/lineage.model new file mode 100644 index 00000000..3977d1d3 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/01-recompiled/management/right/lineage.model @@ -0,0 +1,5 @@ +lineage|right/A|right/A +lineage|right/C|right/C +lineage|right/E|right/E +lineage|right/K|right/K +lineage|right/P|right/P diff --git a/harness/experiments/library-compatibility-20260911/generated/01-recompiled/management/right/map.model b/harness/experiments/library-compatibility-20260911/generated/01-recompiled/management/right/map.model new file mode 100644 index 00000000..87c2bfd1 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/01-recompiled/management/right/map.model @@ -0,0 +1,5 @@ +current|A|right/A +current|C|right/C +current|E|right/E +current|K|right/K +current|P|right/P diff --git a/harness/experiments/library-compatibility-20260911/generated/01-recompiled/packages/e89a61c9548b6c5e3bf7c432d8b294923f333b67cac48fc3b33f718280db8947.library b/harness/experiments/library-compatibility-20260911/generated/01-recompiled/packages/e89a61c9548b6c5e3bf7c432d8b294923f333b67cac48fc3b33f718280db8947.library new file mode 100644 index 00000000..0dce2908 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/01-recompiled/packages/e89a61c9548b6c5e3bf7c432d8b294923f333b67cac48fc3b33f718280db8947.library @@ -0,0 +1,15 @@ +package|ControlPatterns|1.0.0 +description|Monitor alarm +note|Initial documentation +def|Duration|Kind|Neutral|dimension=0,0,1,0,0,0,0;linear|- +def|Energy|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|Torque|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|ms|Unit|Neutral|millis=1|Duration +def|s|Unit|Neutral|millis=1000|Duration +def|Flag|Scalar|OA|Boolean|- +def|Alarm|Item|OA|Flow|Code +def|Code|Field|OA|minimum=1;maximum=1|Alarm,Flag +def|Interface|Interface|OA|-|Operation +def|Operation|Allocation|OA|order=0|Interface,Alarm +pattern|monitor|A,E,P,C,K +role|sink|Activity|OA diff --git a/harness/experiments/library-compatibility-20260911/generated/01-recompiled/project.model b/harness/experiments/library-compatibility-20260911/generated/01-recompiled/project.model new file mode 100644 index 00000000..59b5949f --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/01-recompiled/project.model @@ -0,0 +1,21 @@ +document|Alpha|1 +import|controls1|ControlPatterns|1.0.0|e89a61c9548b6c5e3bf7c432d8b294923f333b67cac48fc3b33f718280db8947|packages/e89a61c9548b6c5e3bf7c432d8b294923f333b67cac48fc3b33f718280db8947.library +mount|data1|controls1|management/data1.mount +instance|left|management/left +instance|right|management/right +record|budget|OA|Combined duration|Budget|left/P|right/P|controls1:Duration|2000@controls1:ms +record|global|OA|Unrelated project-wide study|Case|-|left/P=3000@controls1:ms +record|left/A|OA|left Watch|Activity|Monitor alarm +record|left/C|OA|left Stress|Case|-|left/P=1250@controls1:ms +record|left/E|OA|left Alarm|Interaction|left/A|sink_left|data1/Alarm +record|left/K|OA|left Elapsed limit|Check|left/P|1000@controls1:ms +record|left/P|OA|left Elapsed|Property|left/A|controls1:Duration|750@controls1:ms +record|outside|OA|Outside typed receiver|Consumer|left/E|data1/Interface|data1/Operation|data1/Code +record|right/A|OA|right Watch|Activity|Monitor alarm +record|right/C|OA|right Stress|Case|-|right/P=1250@controls1:ms +record|right/E|OA|right Alarm|Interaction|right/A|sink_right|data1/Alarm +record|right/K|OA|right Elapsed limit|Check|right/P|1000@controls1:ms +record|right/P|OA|right Elapsed|Property|right/A|controls1:Duration|750@controls1:ms +record|sink_left|OA|Receive left|Activity| +record|sink_right|OA|Receive right|Activity| +applied|create-two-instances diff --git a/harness/experiments/library-compatibility-20260911/generated/02-edited/management/data1.mount b/harness/experiments/library-compatibility-20260911/generated/02-edited/management/data1.mount new file mode 100644 index 00000000..ab153a97 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/02-edited/management/data1.mount @@ -0,0 +1,5 @@ +member|Alarm|data1/Alarm +member|Code|data1/Code +member|Flag|data1/Flag +member|Interface|data1/Interface +member|Operation|data1/Operation diff --git a/harness/experiments/library-compatibility-20260911/generated/02-edited/management/left/base.model b/harness/experiments/library-compatibility-20260911/generated/02-edited/management/left/base.model new file mode 100644 index 00000000..14195ebb --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/02-edited/management/left/base.model @@ -0,0 +1,11 @@ +base|controls1|data1|sink_left|left +original|A|left/A +original|C|left/C +original|E|left/E +original|K|left/K +original|P|left/P +member|A|record|left/A|OA|left Watch|Activity|Monitor alarm +member|C|record|left/C|OA|left Stress|Case|-|left/P=1250@controls1:ms +member|E|record|left/E|OA|left Alarm|Interaction|left/A|sink_left|data1/Alarm +member|K|record|left/K|OA|left Elapsed limit|Check|left/P|1000@controls1:ms +member|P|record|left/P|OA|left Elapsed|Property|left/A|controls1:Duration|750@controls1:ms diff --git a/harness/experiments/library-compatibility-20260911/generated/02-edited/management/left/lineage.model b/harness/experiments/library-compatibility-20260911/generated/02-edited/management/left/lineage.model new file mode 100644 index 00000000..e4209eb0 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/02-edited/management/left/lineage.model @@ -0,0 +1,5 @@ +lineage|left/A|left/A +lineage|left/C|left/C +lineage|left/E|left/E +lineage|left/K|left/K +lineage|left/P|left/P diff --git a/harness/experiments/library-compatibility-20260911/generated/02-edited/management/left/map.model b/harness/experiments/library-compatibility-20260911/generated/02-edited/management/left/map.model new file mode 100644 index 00000000..eb6b5bce --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/02-edited/management/left/map.model @@ -0,0 +1,5 @@ +current|A|left/A +current|C|left/C +current|E|left/E +current|K|left/K +current|P|left/P diff --git a/harness/experiments/library-compatibility-20260911/generated/02-edited/management/right/base.model b/harness/experiments/library-compatibility-20260911/generated/02-edited/management/right/base.model new file mode 100644 index 00000000..a680ebda --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/02-edited/management/right/base.model @@ -0,0 +1,11 @@ +base|controls1|data1|sink_right|right +original|A|right/A +original|C|right/C +original|E|right/E +original|K|right/K +original|P|right/P +member|A|record|right/A|OA|right Watch|Activity|Monitor alarm +member|C|record|right/C|OA|right Stress|Case|-|right/P=1250@controls1:ms +member|E|record|right/E|OA|right Alarm|Interaction|right/A|sink_right|data1/Alarm +member|K|record|right/K|OA|right Elapsed limit|Check|right/P|1000@controls1:ms +member|P|record|right/P|OA|right Elapsed|Property|right/A|controls1:Duration|750@controls1:ms diff --git a/harness/experiments/library-compatibility-20260911/generated/02-edited/management/right/lineage.model b/harness/experiments/library-compatibility-20260911/generated/02-edited/management/right/lineage.model new file mode 100644 index 00000000..3977d1d3 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/02-edited/management/right/lineage.model @@ -0,0 +1,5 @@ +lineage|right/A|right/A +lineage|right/C|right/C +lineage|right/E|right/E +lineage|right/K|right/K +lineage|right/P|right/P diff --git a/harness/experiments/library-compatibility-20260911/generated/02-edited/management/right/map.model b/harness/experiments/library-compatibility-20260911/generated/02-edited/management/right/map.model new file mode 100644 index 00000000..87c2bfd1 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/02-edited/management/right/map.model @@ -0,0 +1,5 @@ +current|A|right/A +current|C|right/C +current|E|right/E +current|K|right/K +current|P|right/P diff --git a/harness/experiments/library-compatibility-20260911/generated/02-edited/packages/e89a61c9548b6c5e3bf7c432d8b294923f333b67cac48fc3b33f718280db8947.library b/harness/experiments/library-compatibility-20260911/generated/02-edited/packages/e89a61c9548b6c5e3bf7c432d8b294923f333b67cac48fc3b33f718280db8947.library new file mode 100644 index 00000000..0dce2908 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/02-edited/packages/e89a61c9548b6c5e3bf7c432d8b294923f333b67cac48fc3b33f718280db8947.library @@ -0,0 +1,15 @@ +package|ControlPatterns|1.0.0 +description|Monitor alarm +note|Initial documentation +def|Duration|Kind|Neutral|dimension=0,0,1,0,0,0,0;linear|- +def|Energy|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|Torque|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|ms|Unit|Neutral|millis=1|Duration +def|s|Unit|Neutral|millis=1000|Duration +def|Flag|Scalar|OA|Boolean|- +def|Alarm|Item|OA|Flow|Code +def|Code|Field|OA|minimum=1;maximum=1|Alarm,Flag +def|Interface|Interface|OA|-|Operation +def|Operation|Allocation|OA|order=0|Interface,Alarm +pattern|monitor|A,E,P,C,K +role|sink|Activity|OA diff --git a/harness/experiments/library-compatibility-20260911/generated/02-edited/project.model b/harness/experiments/library-compatibility-20260911/generated/02-edited/project.model new file mode 100644 index 00000000..3110f4ed --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/02-edited/project.model @@ -0,0 +1,22 @@ +document|Alpha|2 +import|controls1|ControlPatterns|1.0.0|e89a61c9548b6c5e3bf7c432d8b294923f333b67cac48fc3b33f718280db8947|packages/e89a61c9548b6c5e3bf7c432d8b294923f333b67cac48fc3b33f718280db8947.library +mount|data1|controls1|management/data1.mount +instance|left|management/left +instance|right|management/right +record|budget|OA|Combined duration|Budget|left/P|right/P|controls1:Duration|2000@controls1:ms +record|global|OA|Unrelated project-wide study|Case|-|left/P=3000@controls1:ms +record|left/A|OA|left Watch|Activity|Monitor alarm +record|left/C|OA|left Stress|Case|-|left/P=1250@controls1:ms +record|left/E|OA|left Alarm|Interaction|left/A|sink_left|data1/Alarm +record|left/K|OA|left Elapsed limit|Check|left/P|1000@controls1:ms +record|left/P|OA|left Elapsed|Property|left/A|controls1:Duration|900@controls1:ms +record|outside|OA|Outside typed receiver|Consumer|left/E|data1/Interface|data1/Operation|data1/Code +record|right/A|OA|right Watch|Activity|Monitor alarm +record|right/C|OA|right Stress|Case|-|right/P=1250@controls1:ms +record|right/E|OA|right Alarm|Interaction|right/A|sink_right|data1/Alarm +record|right/K|OA|right Elapsed limit|Check|right/P|1000@controls1:ms +record|right/P|OA|right Elapsed|Property|right/A|controls1:Duration|750@controls1:ms +record|sink_left|OA|Receive left|Activity| +record|sink_right|OA|Receive right|Activity| +applied|create-two-instances +applied|edit_base|left/P|900@controls1:ms diff --git a/harness/experiments/library-compatibility-20260911/generated/03-updated/management/data1.mount b/harness/experiments/library-compatibility-20260911/generated/03-updated/management/data1.mount new file mode 100644 index 00000000..ab153a97 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/03-updated/management/data1.mount @@ -0,0 +1,5 @@ +member|Alarm|data1/Alarm +member|Code|data1/Code +member|Flag|data1/Flag +member|Interface|data1/Interface +member|Operation|data1/Operation diff --git a/harness/experiments/library-compatibility-20260911/generated/03-updated/management/data2.mount b/harness/experiments/library-compatibility-20260911/generated/03-updated/management/data2.mount new file mode 100644 index 00000000..c1ae4b6e --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/03-updated/management/data2.mount @@ -0,0 +1,5 @@ +member|Alarm|data2/Alarm +member|Code|data2/Code +member|Flag|data2/Flag +member|Interface|data2/Interface +member|Operation|data2/Operation diff --git a/harness/experiments/library-compatibility-20260911/generated/03-updated/management/left/base.model b/harness/experiments/library-compatibility-20260911/generated/03-updated/management/left/base.model new file mode 100644 index 00000000..52f2ea0e --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/03-updated/management/left/base.model @@ -0,0 +1,11 @@ +base|controls2|data2|sink_left|left +original|A|left/A +original|C|left/C +original|E|left/E +original|K|left/K +original|P|left/P +member|A|record|left/A|OA|left Watch|Activity|Monitor alarm +member|C|record|left/C|OA|left Stress|Case|-|left/P=1250@controls2:ms +member|E|record|left/E|OA|left Alarm|Interaction|left/A|sink_left|data2/Alarm +member|K|record|left/K|OA|left Elapsed limit|Check|left/P|1000@controls2:ms +member|P|record|left/P|OA|left Elapsed|Property|left/A|controls2:Duration|750@controls2:ms diff --git a/harness/experiments/library-compatibility-20260911/generated/03-updated/management/left/lineage.model b/harness/experiments/library-compatibility-20260911/generated/03-updated/management/left/lineage.model new file mode 100644 index 00000000..e4209eb0 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/03-updated/management/left/lineage.model @@ -0,0 +1,5 @@ +lineage|left/A|left/A +lineage|left/C|left/C +lineage|left/E|left/E +lineage|left/K|left/K +lineage|left/P|left/P diff --git a/harness/experiments/library-compatibility-20260911/generated/03-updated/management/left/map.model b/harness/experiments/library-compatibility-20260911/generated/03-updated/management/left/map.model new file mode 100644 index 00000000..eb6b5bce --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/03-updated/management/left/map.model @@ -0,0 +1,5 @@ +current|A|left/A +current|C|left/C +current|E|left/E +current|K|left/K +current|P|left/P diff --git a/harness/experiments/library-compatibility-20260911/generated/03-updated/management/right/base.model b/harness/experiments/library-compatibility-20260911/generated/03-updated/management/right/base.model new file mode 100644 index 00000000..a680ebda --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/03-updated/management/right/base.model @@ -0,0 +1,11 @@ +base|controls1|data1|sink_right|right +original|A|right/A +original|C|right/C +original|E|right/E +original|K|right/K +original|P|right/P +member|A|record|right/A|OA|right Watch|Activity|Monitor alarm +member|C|record|right/C|OA|right Stress|Case|-|right/P=1250@controls1:ms +member|E|record|right/E|OA|right Alarm|Interaction|right/A|sink_right|data1/Alarm +member|K|record|right/K|OA|right Elapsed limit|Check|right/P|1000@controls1:ms +member|P|record|right/P|OA|right Elapsed|Property|right/A|controls1:Duration|750@controls1:ms diff --git a/harness/experiments/library-compatibility-20260911/generated/03-updated/management/right/lineage.model b/harness/experiments/library-compatibility-20260911/generated/03-updated/management/right/lineage.model new file mode 100644 index 00000000..3977d1d3 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/03-updated/management/right/lineage.model @@ -0,0 +1,5 @@ +lineage|right/A|right/A +lineage|right/C|right/C +lineage|right/E|right/E +lineage|right/K|right/K +lineage|right/P|right/P diff --git a/harness/experiments/library-compatibility-20260911/generated/03-updated/management/right/map.model b/harness/experiments/library-compatibility-20260911/generated/03-updated/management/right/map.model new file mode 100644 index 00000000..87c2bfd1 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/03-updated/management/right/map.model @@ -0,0 +1,5 @@ +current|A|right/A +current|C|right/C +current|E|right/E +current|K|right/K +current|P|right/P diff --git a/harness/experiments/library-compatibility-20260911/generated/03-updated/packages/43788fdf736f509c0ae19357ee717b79ff26b35cab1fdf0b588584ca06d38a19.library b/harness/experiments/library-compatibility-20260911/generated/03-updated/packages/43788fdf736f509c0ae19357ee717b79ff26b35cab1fdf0b588584ca06d38a19.library new file mode 100644 index 00000000..2a211005 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/03-updated/packages/43788fdf736f509c0ae19357ee717b79ff26b35cab1fdf0b588584ca06d38a19.library @@ -0,0 +1,15 @@ +package|ControlPatterns|1.0.1 +description|Monitor alarm +note|Revised documentation only +def|Duration|Kind|Neutral|dimension=0,0,1,0,0,0,0;linear|- +def|Energy|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|Torque|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|ms|Unit|Neutral|millis=1|Duration +def|s|Unit|Neutral|millis=1000|Duration +def|Flag|Scalar|OA|Boolean|- +def|Alarm|Item|OA|Flow|Code +def|Code|Field|OA|minimum=1;maximum=1|Alarm,Flag +def|Interface|Interface|OA|-|Operation +def|Operation|Allocation|OA|order=0|Interface,Alarm +pattern|monitor|A,E,P,C,K +role|sink|Activity|OA diff --git a/harness/experiments/library-compatibility-20260911/generated/03-updated/packages/e89a61c9548b6c5e3bf7c432d8b294923f333b67cac48fc3b33f718280db8947.library b/harness/experiments/library-compatibility-20260911/generated/03-updated/packages/e89a61c9548b6c5e3bf7c432d8b294923f333b67cac48fc3b33f718280db8947.library new file mode 100644 index 00000000..0dce2908 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/03-updated/packages/e89a61c9548b6c5e3bf7c432d8b294923f333b67cac48fc3b33f718280db8947.library @@ -0,0 +1,15 @@ +package|ControlPatterns|1.0.0 +description|Monitor alarm +note|Initial documentation +def|Duration|Kind|Neutral|dimension=0,0,1,0,0,0,0;linear|- +def|Energy|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|Torque|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|ms|Unit|Neutral|millis=1|Duration +def|s|Unit|Neutral|millis=1000|Duration +def|Flag|Scalar|OA|Boolean|- +def|Alarm|Item|OA|Flow|Code +def|Code|Field|OA|minimum=1;maximum=1|Alarm,Flag +def|Interface|Interface|OA|-|Operation +def|Operation|Allocation|OA|order=0|Interface,Alarm +pattern|monitor|A,E,P,C,K +role|sink|Activity|OA diff --git a/harness/experiments/library-compatibility-20260911/generated/03-updated/project.model b/harness/experiments/library-compatibility-20260911/generated/03-updated/project.model new file mode 100644 index 00000000..c2c03bf4 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/03-updated/project.model @@ -0,0 +1,25 @@ +document|Alpha|3 +import|controls1|ControlPatterns|1.0.0|e89a61c9548b6c5e3bf7c432d8b294923f333b67cac48fc3b33f718280db8947|packages/e89a61c9548b6c5e3bf7c432d8b294923f333b67cac48fc3b33f718280db8947.library +import|controls2|ControlPatterns|1.0.1|43788fdf736f509c0ae19357ee717b79ff26b35cab1fdf0b588584ca06d38a19|packages/43788fdf736f509c0ae19357ee717b79ff26b35cab1fdf0b588584ca06d38a19.library +mount|data1|controls1|management/data1.mount +mount|data2|controls2|management/data2.mount +instance|left|management/left +instance|right|management/right +record|budget|OA|Combined duration|Budget|left/P|right/P|controls1:Duration|2000@controls1:ms +record|global|OA|Unrelated project-wide study|Case|-|left/P=3000@controls1:ms +record|left/A|OA|left Watch|Activity|Monitor alarm +record|left/C|OA|left Stress|Case|-|left/P=1250@controls2:ms +record|left/E|OA|left Alarm|Interaction|left/A|sink_left|data2/Alarm +record|left/K|OA|left Elapsed limit|Check|left/P|1000@controls2:ms +record|left/P|OA|left Elapsed|Property|left/A|controls2:Duration|900@controls1:ms +record|outside|OA|Outside typed receiver|Consumer|left/E|data1/Interface|data1/Operation|data1/Code +record|right/A|OA|right Watch|Activity|Monitor alarm +record|right/C|OA|right Stress|Case|-|right/P=1250@controls1:ms +record|right/E|OA|right Alarm|Interaction|right/A|sink_right|data1/Alarm +record|right/K|OA|right Elapsed limit|Check|right/P|1000@controls1:ms +record|right/P|OA|right Elapsed|Property|right/A|controls1:Duration|750@controls1:ms +record|sink_left|OA|Receive left|Activity| +record|sink_right|OA|Receive right|Activity| +applied|create-two-instances +applied|edit_base|left/P|900@controls1:ms +applied|update|left|e89a61c9548b6c5e3bf7c432d8b294923f333b67cac48fc3b33f718280db8947|controls2|data2|2|P.base=keep_local diff --git a/harness/experiments/library-compatibility-20260911/generated/04-reidentified/management/data1.mount b/harness/experiments/library-compatibility-20260911/generated/04-reidentified/management/data1.mount new file mode 100644 index 00000000..ab153a97 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/04-reidentified/management/data1.mount @@ -0,0 +1,5 @@ +member|Alarm|data1/Alarm +member|Code|data1/Code +member|Flag|data1/Flag +member|Interface|data1/Interface +member|Operation|data1/Operation diff --git a/harness/experiments/library-compatibility-20260911/generated/04-reidentified/management/left/base.model b/harness/experiments/library-compatibility-20260911/generated/04-reidentified/management/left/base.model new file mode 100644 index 00000000..14195ebb --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/04-reidentified/management/left/base.model @@ -0,0 +1,11 @@ +base|controls1|data1|sink_left|left +original|A|left/A +original|C|left/C +original|E|left/E +original|K|left/K +original|P|left/P +member|A|record|left/A|OA|left Watch|Activity|Monitor alarm +member|C|record|left/C|OA|left Stress|Case|-|left/P=1250@controls1:ms +member|E|record|left/E|OA|left Alarm|Interaction|left/A|sink_left|data1/Alarm +member|K|record|left/K|OA|left Elapsed limit|Check|left/P|1000@controls1:ms +member|P|record|left/P|OA|left Elapsed|Property|left/A|controls1:Duration|750@controls1:ms diff --git a/harness/experiments/library-compatibility-20260911/generated/04-reidentified/management/left/lineage.model b/harness/experiments/library-compatibility-20260911/generated/04-reidentified/management/left/lineage.model new file mode 100644 index 00000000..1a897434 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/04-reidentified/management/left/lineage.model @@ -0,0 +1,5 @@ +lineage|left/A|left/A2 +lineage|left/C|left/C +lineage|left/E|left/E +lineage|left/K|left/K +lineage|left/P|left/P diff --git a/harness/experiments/library-compatibility-20260911/generated/04-reidentified/management/left/map.model b/harness/experiments/library-compatibility-20260911/generated/04-reidentified/management/left/map.model new file mode 100644 index 00000000..8a7661fe --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/04-reidentified/management/left/map.model @@ -0,0 +1,5 @@ +current|A|left/A2 +current|C|left/C +current|E|left/E +current|K|left/K +current|P|left/P diff --git a/harness/experiments/library-compatibility-20260911/generated/04-reidentified/management/right/base.model b/harness/experiments/library-compatibility-20260911/generated/04-reidentified/management/right/base.model new file mode 100644 index 00000000..a680ebda --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/04-reidentified/management/right/base.model @@ -0,0 +1,11 @@ +base|controls1|data1|sink_right|right +original|A|right/A +original|C|right/C +original|E|right/E +original|K|right/K +original|P|right/P +member|A|record|right/A|OA|right Watch|Activity|Monitor alarm +member|C|record|right/C|OA|right Stress|Case|-|right/P=1250@controls1:ms +member|E|record|right/E|OA|right Alarm|Interaction|right/A|sink_right|data1/Alarm +member|K|record|right/K|OA|right Elapsed limit|Check|right/P|1000@controls1:ms +member|P|record|right/P|OA|right Elapsed|Property|right/A|controls1:Duration|750@controls1:ms diff --git a/harness/experiments/library-compatibility-20260911/generated/04-reidentified/management/right/lineage.model b/harness/experiments/library-compatibility-20260911/generated/04-reidentified/management/right/lineage.model new file mode 100644 index 00000000..3977d1d3 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/04-reidentified/management/right/lineage.model @@ -0,0 +1,5 @@ +lineage|right/A|right/A +lineage|right/C|right/C +lineage|right/E|right/E +lineage|right/K|right/K +lineage|right/P|right/P diff --git a/harness/experiments/library-compatibility-20260911/generated/04-reidentified/management/right/map.model b/harness/experiments/library-compatibility-20260911/generated/04-reidentified/management/right/map.model new file mode 100644 index 00000000..87c2bfd1 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/04-reidentified/management/right/map.model @@ -0,0 +1,5 @@ +current|A|right/A +current|C|right/C +current|E|right/E +current|K|right/K +current|P|right/P diff --git a/harness/experiments/library-compatibility-20260911/generated/04-reidentified/packages/e89a61c9548b6c5e3bf7c432d8b294923f333b67cac48fc3b33f718280db8947.library b/harness/experiments/library-compatibility-20260911/generated/04-reidentified/packages/e89a61c9548b6c5e3bf7c432d8b294923f333b67cac48fc3b33f718280db8947.library new file mode 100644 index 00000000..0dce2908 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/04-reidentified/packages/e89a61c9548b6c5e3bf7c432d8b294923f333b67cac48fc3b33f718280db8947.library @@ -0,0 +1,15 @@ +package|ControlPatterns|1.0.0 +description|Monitor alarm +note|Initial documentation +def|Duration|Kind|Neutral|dimension=0,0,1,0,0,0,0;linear|- +def|Energy|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|Torque|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|ms|Unit|Neutral|millis=1|Duration +def|s|Unit|Neutral|millis=1000|Duration +def|Flag|Scalar|OA|Boolean|- +def|Alarm|Item|OA|Flow|Code +def|Code|Field|OA|minimum=1;maximum=1|Alarm,Flag +def|Interface|Interface|OA|-|Operation +def|Operation|Allocation|OA|order=0|Interface,Alarm +pattern|monitor|A,E,P,C,K +role|sink|Activity|OA diff --git a/harness/experiments/library-compatibility-20260911/generated/04-reidentified/project.model b/harness/experiments/library-compatibility-20260911/generated/04-reidentified/project.model new file mode 100644 index 00000000..b4640f98 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/04-reidentified/project.model @@ -0,0 +1,22 @@ +document|Alpha|2 +import|controls1|ControlPatterns|1.0.0|e89a61c9548b6c5e3bf7c432d8b294923f333b67cac48fc3b33f718280db8947|packages/e89a61c9548b6c5e3bf7c432d8b294923f333b67cac48fc3b33f718280db8947.library +mount|data1|controls1|management/data1.mount +instance|left|management/left +instance|right|management/right +record|budget|OA|Combined duration|Budget|left/P|right/P|controls1:Duration|2000@controls1:ms +record|global|OA|Unrelated project-wide study|Case|-|left/P=3000@controls1:ms +record|left/A2|OA|left Watch|Activity|Monitor alarm +record|left/C|OA|left Stress|Case|-|left/P=1250@controls1:ms +record|left/E|OA|left Alarm|Interaction|left/A2|sink_left|data1/Alarm +record|left/K|OA|left Elapsed limit|Check|left/P|1000@controls1:ms +record|left/P|OA|left Elapsed|Property|left/A2|controls1:Duration|900@controls1:ms +record|outside|OA|Outside typed receiver|Consumer|left/E|data1/Interface|data1/Operation|data1/Code +record|right/A|OA|right Watch|Activity|Monitor alarm +record|right/C|OA|right Stress|Case|-|right/P=1250@controls1:ms +record|right/E|OA|right Alarm|Interaction|right/A|sink_right|data1/Alarm +record|right/K|OA|right Elapsed limit|Check|right/P|1000@controls1:ms +record|right/P|OA|right Elapsed|Property|right/A|controls1:Duration|750@controls1:ms +record|sink_left|OA|Receive left|Activity| +record|sink_right|OA|Receive right|Activity| +applied|create-two-instances +applied|edit_base|left/P|900@controls1:ms diff --git a/harness/experiments/library-compatibility-20260911/generated/RESULTS.md b/harness/experiments/library-compatibility-20260911/generated/RESULTS.md new file mode 100644 index 00000000..3277598b --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/RESULTS.md @@ -0,0 +1,24 @@ +# Finite-model results + +Assertions passed: 120 + +Initial budget: 1500 ms, satisfied. +After one local base edit: 1650 ms, satisfied. +After selected cosmetic update: 1650 ms, satisfied; exact pins differ. +Outside budget/consumer/global case: exact records unchanged. +Updated left baseline: 750 controls2:ms; current: 900 controls1:ms; declared kind controls2:Duration. +Right instance/base/map: exact original. +Contract path projection: data1/Code -> data2/Code and data1/Operation -> data2/Operation. +Changed field cardinality: selective candidate rejected. +Strict revision identity: old/new refs unequal. +Same-origin typed compatibility: cosmetic revision accepted; Energy/Torque, other origin, changed contract rejected. +Bridge alternative: 2 explicit validated direct witnesses; changed contracts rejected. +Stable vocabulary alternative: exact common pin survives pattern change; vocabulary change remains unresolved without compatibility/migration. +Subjectless explicit C+K selected; unrelated G omitted; selected G requires Q boundary. +OA/SA: explicit pinned counterpart or independent local derivative; refined reverse counterpart fails exact transformed contract. + +D1: e89a61c9548b6c5e3bf7c432d8b294923f333b67cac48fc3b33f718280db8947 +D2: 43788fdf736f509c0ae19357ee717b79ff26b35cab1fdf0b588584ca06d38a19 +D3: a28a93b7fed0e67177f0ec639a911e2326f2de15e2478a072b2fa17d29b3efdf + +This dialect uses opaque symbolic identities, a restricted AST, one package per import and scalar integer-millisecond arithmetic. It is not Studio source, a full package dependency solver, production UUID allocation, complete data/operation/transition admission, REST or native acceptance. diff --git a/harness/experiments/library-compatibility-20260911/generated/SUPERSEDED.md b/harness/experiments/library-compatibility-20260911/generated/SUPERSEDED.md new file mode 100644 index 00000000..545ae69c --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/SUPERSEDED.md @@ -0,0 +1,5 @@ +# Superseded preliminary output + +This directory records the preliminary finite dialect, in which prototype constructor bodies came from fixed interpreter rules. It does not establish a byte-complete reusable package and is not final evidence. + +Use `../generated-final/`, `../EVIDENCE.json`, and the parent README. The final package bytes explicitly contain every prototype/definition/export/role needed by the experiment; all checks were rerun. Automatic approval review rejected removal of this owned preliminary directory as “blocked by policy,” so it remains explicitly isolated and labeled. diff --git a/harness/experiments/library-compatibility-20260911/generated/expected-full-updated/management/data1.mount b/harness/experiments/library-compatibility-20260911/generated/expected-full-updated/management/data1.mount new file mode 100644 index 00000000..ab153a97 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/expected-full-updated/management/data1.mount @@ -0,0 +1,5 @@ +member|Alarm|data1/Alarm +member|Code|data1/Code +member|Flag|data1/Flag +member|Interface|data1/Interface +member|Operation|data1/Operation diff --git a/harness/experiments/library-compatibility-20260911/generated/expected-full-updated/management/data2.mount b/harness/experiments/library-compatibility-20260911/generated/expected-full-updated/management/data2.mount new file mode 100644 index 00000000..c1ae4b6e --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/expected-full-updated/management/data2.mount @@ -0,0 +1,5 @@ +member|Alarm|data2/Alarm +member|Code|data2/Code +member|Flag|data2/Flag +member|Interface|data2/Interface +member|Operation|data2/Operation diff --git a/harness/experiments/library-compatibility-20260911/generated/expected-full-updated/management/left/base.model b/harness/experiments/library-compatibility-20260911/generated/expected-full-updated/management/left/base.model new file mode 100644 index 00000000..52f2ea0e --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/expected-full-updated/management/left/base.model @@ -0,0 +1,11 @@ +base|controls2|data2|sink_left|left +original|A|left/A +original|C|left/C +original|E|left/E +original|K|left/K +original|P|left/P +member|A|record|left/A|OA|left Watch|Activity|Monitor alarm +member|C|record|left/C|OA|left Stress|Case|-|left/P=1250@controls2:ms +member|E|record|left/E|OA|left Alarm|Interaction|left/A|sink_left|data2/Alarm +member|K|record|left/K|OA|left Elapsed limit|Check|left/P|1000@controls2:ms +member|P|record|left/P|OA|left Elapsed|Property|left/A|controls2:Duration|750@controls2:ms diff --git a/harness/experiments/library-compatibility-20260911/generated/expected-full-updated/management/left/lineage.model b/harness/experiments/library-compatibility-20260911/generated/expected-full-updated/management/left/lineage.model new file mode 100644 index 00000000..e4209eb0 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/expected-full-updated/management/left/lineage.model @@ -0,0 +1,5 @@ +lineage|left/A|left/A +lineage|left/C|left/C +lineage|left/E|left/E +lineage|left/K|left/K +lineage|left/P|left/P diff --git a/harness/experiments/library-compatibility-20260911/generated/expected-full-updated/management/left/map.model b/harness/experiments/library-compatibility-20260911/generated/expected-full-updated/management/left/map.model new file mode 100644 index 00000000..eb6b5bce --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/expected-full-updated/management/left/map.model @@ -0,0 +1,5 @@ +current|A|left/A +current|C|left/C +current|E|left/E +current|K|left/K +current|P|left/P diff --git a/harness/experiments/library-compatibility-20260911/generated/expected-full-updated/management/right/base.model b/harness/experiments/library-compatibility-20260911/generated/expected-full-updated/management/right/base.model new file mode 100644 index 00000000..a680ebda --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/expected-full-updated/management/right/base.model @@ -0,0 +1,11 @@ +base|controls1|data1|sink_right|right +original|A|right/A +original|C|right/C +original|E|right/E +original|K|right/K +original|P|right/P +member|A|record|right/A|OA|right Watch|Activity|Monitor alarm +member|C|record|right/C|OA|right Stress|Case|-|right/P=1250@controls1:ms +member|E|record|right/E|OA|right Alarm|Interaction|right/A|sink_right|data1/Alarm +member|K|record|right/K|OA|right Elapsed limit|Check|right/P|1000@controls1:ms +member|P|record|right/P|OA|right Elapsed|Property|right/A|controls1:Duration|750@controls1:ms diff --git a/harness/experiments/library-compatibility-20260911/generated/expected-full-updated/management/right/lineage.model b/harness/experiments/library-compatibility-20260911/generated/expected-full-updated/management/right/lineage.model new file mode 100644 index 00000000..3977d1d3 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/expected-full-updated/management/right/lineage.model @@ -0,0 +1,5 @@ +lineage|right/A|right/A +lineage|right/C|right/C +lineage|right/E|right/E +lineage|right/K|right/K +lineage|right/P|right/P diff --git a/harness/experiments/library-compatibility-20260911/generated/expected-full-updated/management/right/map.model b/harness/experiments/library-compatibility-20260911/generated/expected-full-updated/management/right/map.model new file mode 100644 index 00000000..87c2bfd1 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/expected-full-updated/management/right/map.model @@ -0,0 +1,5 @@ +current|A|right/A +current|C|right/C +current|E|right/E +current|K|right/K +current|P|right/P diff --git a/harness/experiments/library-compatibility-20260911/generated/expected-full-updated/packages/43788fdf736f509c0ae19357ee717b79ff26b35cab1fdf0b588584ca06d38a19.library b/harness/experiments/library-compatibility-20260911/generated/expected-full-updated/packages/43788fdf736f509c0ae19357ee717b79ff26b35cab1fdf0b588584ca06d38a19.library new file mode 100644 index 00000000..2a211005 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/expected-full-updated/packages/43788fdf736f509c0ae19357ee717b79ff26b35cab1fdf0b588584ca06d38a19.library @@ -0,0 +1,15 @@ +package|ControlPatterns|1.0.1 +description|Monitor alarm +note|Revised documentation only +def|Duration|Kind|Neutral|dimension=0,0,1,0,0,0,0;linear|- +def|Energy|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|Torque|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|ms|Unit|Neutral|millis=1|Duration +def|s|Unit|Neutral|millis=1000|Duration +def|Flag|Scalar|OA|Boolean|- +def|Alarm|Item|OA|Flow|Code +def|Code|Field|OA|minimum=1;maximum=1|Alarm,Flag +def|Interface|Interface|OA|-|Operation +def|Operation|Allocation|OA|order=0|Interface,Alarm +pattern|monitor|A,E,P,C,K +role|sink|Activity|OA diff --git a/harness/experiments/library-compatibility-20260911/generated/expected-full-updated/packages/e89a61c9548b6c5e3bf7c432d8b294923f333b67cac48fc3b33f718280db8947.library b/harness/experiments/library-compatibility-20260911/generated/expected-full-updated/packages/e89a61c9548b6c5e3bf7c432d8b294923f333b67cac48fc3b33f718280db8947.library new file mode 100644 index 00000000..0dce2908 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/expected-full-updated/packages/e89a61c9548b6c5e3bf7c432d8b294923f333b67cac48fc3b33f718280db8947.library @@ -0,0 +1,15 @@ +package|ControlPatterns|1.0.0 +description|Monitor alarm +note|Initial documentation +def|Duration|Kind|Neutral|dimension=0,0,1,0,0,0,0;linear|- +def|Energy|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|Torque|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|ms|Unit|Neutral|millis=1|Duration +def|s|Unit|Neutral|millis=1000|Duration +def|Flag|Scalar|OA|Boolean|- +def|Alarm|Item|OA|Flow|Code +def|Code|Field|OA|minimum=1;maximum=1|Alarm,Flag +def|Interface|Interface|OA|-|Operation +def|Operation|Allocation|OA|order=0|Interface,Alarm +pattern|monitor|A,E,P,C,K +role|sink|Activity|OA diff --git a/harness/experiments/library-compatibility-20260911/generated/expected-full-updated/project.model b/harness/experiments/library-compatibility-20260911/generated/expected-full-updated/project.model new file mode 100644 index 00000000..c2c03bf4 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/expected-full-updated/project.model @@ -0,0 +1,25 @@ +document|Alpha|3 +import|controls1|ControlPatterns|1.0.0|e89a61c9548b6c5e3bf7c432d8b294923f333b67cac48fc3b33f718280db8947|packages/e89a61c9548b6c5e3bf7c432d8b294923f333b67cac48fc3b33f718280db8947.library +import|controls2|ControlPatterns|1.0.1|43788fdf736f509c0ae19357ee717b79ff26b35cab1fdf0b588584ca06d38a19|packages/43788fdf736f509c0ae19357ee717b79ff26b35cab1fdf0b588584ca06d38a19.library +mount|data1|controls1|management/data1.mount +mount|data2|controls2|management/data2.mount +instance|left|management/left +instance|right|management/right +record|budget|OA|Combined duration|Budget|left/P|right/P|controls1:Duration|2000@controls1:ms +record|global|OA|Unrelated project-wide study|Case|-|left/P=3000@controls1:ms +record|left/A|OA|left Watch|Activity|Monitor alarm +record|left/C|OA|left Stress|Case|-|left/P=1250@controls2:ms +record|left/E|OA|left Alarm|Interaction|left/A|sink_left|data2/Alarm +record|left/K|OA|left Elapsed limit|Check|left/P|1000@controls2:ms +record|left/P|OA|left Elapsed|Property|left/A|controls2:Duration|900@controls1:ms +record|outside|OA|Outside typed receiver|Consumer|left/E|data1/Interface|data1/Operation|data1/Code +record|right/A|OA|right Watch|Activity|Monitor alarm +record|right/C|OA|right Stress|Case|-|right/P=1250@controls1:ms +record|right/E|OA|right Alarm|Interaction|right/A|sink_right|data1/Alarm +record|right/K|OA|right Elapsed limit|Check|right/P|1000@controls1:ms +record|right/P|OA|right Elapsed|Property|right/A|controls1:Duration|750@controls1:ms +record|sink_left|OA|Receive left|Activity| +record|sink_right|OA|Receive right|Activity| +applied|create-two-instances +applied|edit_base|left/P|900@controls1:ms +applied|update|left|e89a61c9548b6c5e3bf7c432d8b294923f333b67cac48fc3b33f718280db8947|controls2|data2|2|P.base=keep_local diff --git a/harness/experiments/library-compatibility-20260911/generated/expected-initial.model b/harness/experiments/library-compatibility-20260911/generated/expected-initial.model new file mode 100644 index 00000000..81ab673e --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/expected-initial.model @@ -0,0 +1,15 @@ +record|sink_left|OA|Receive left|Activity| +record|sink_right|OA|Receive right|Activity| +record|left/A|OA|left Watch|Activity|Monitor alarm +record|left/E|OA|left Alarm|Interaction|left/A|sink_left|data1/Alarm +record|left/P|OA|left Elapsed|Property|left/A|controls1:Duration|750@controls1:ms +record|left/C|OA|left Stress|Case|-|left/P=1250@controls1:ms +record|left/K|OA|left Elapsed limit|Check|left/P|1000@controls1:ms +record|right/A|OA|right Watch|Activity|Monitor alarm +record|right/E|OA|right Alarm|Interaction|right/A|sink_right|data1/Alarm +record|right/P|OA|right Elapsed|Property|right/A|controls1:Duration|750@controls1:ms +record|right/C|OA|right Stress|Case|-|right/P=1250@controls1:ms +record|right/K|OA|right Elapsed limit|Check|right/P|1000@controls1:ms +record|budget|OA|Combined duration|Budget|left/P|right/P|controls1:Duration|2000@controls1:ms +record|outside|OA|Outside typed receiver|Consumer|left/E|data1/Interface|data1/Operation|data1/Code +record|global|OA|Unrelated project-wide study|Case|-|left/P=3000@controls1:ms diff --git a/harness/experiments/library-compatibility-20260911/generated/expected-key-records.model b/harness/experiments/library-compatibility-20260911/generated/expected-key-records.model new file mode 100644 index 00000000..6d760e4c --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/expected-key-records.model @@ -0,0 +1,7 @@ +record|left/P|OA|left Elapsed|Property|left/A|controls2:Duration|900@controls1:ms +record|left/E|OA|left Alarm|Interaction|left/A|sink_left|data2/Alarm +record|left/C|OA|left Stress|Case|-|left/P=1250@controls2:ms +record|left/K|OA|left Elapsed limit|Check|left/P|1000@controls2:ms +record|right/P|OA|right Elapsed|Property|right/A|controls1:Duration|750@controls1:ms +record|budget|OA|Combined duration|Budget|left/P|right/P|controls1:Duration|2000@controls1:ms +record|outside|OA|Outside typed receiver|Consumer|left/E|data1/Interface|data1/Operation|data1/Code diff --git a/harness/experiments/library-compatibility-20260911/generated/explicit-bridges.model b/harness/experiments/library-compatibility-20260911/generated/explicit-bridges.model new file mode 100644 index 00000000..f95d5ca1 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/explicit-bridges.model @@ -0,0 +1,2 @@ +checked-same-origin|e89a61c9548b6c5e3bf7c432d8b294923f333b67cac48fc3b33f718280db8947|Duration|43788fdf736f509c0ae19357ee717b79ff26b35cab1fdf0b588584ca06d38a19|Duration +checked-same-origin|e89a61c9548b6c5e3bf7c432d8b294923f333b67cac48fc3b33f718280db8947|Interface|43788fdf736f509c0ae19357ee717b79ff26b35cab1fdf0b588584ca06d38a19|Interface diff --git a/harness/experiments/library-compatibility-20260911/generated/initial.request b/harness/experiments/library-compatibility-20260911/generated/initial.request new file mode 100644 index 00000000..618589bf --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/initial.request @@ -0,0 +1,11 @@ +new|Alpha +import|controls1|D1 +mount|data1|controls1 +activity|sink_left|Receive left +activity|sink_right|Receive right +instantiate|left|controls1|data1|sink_left +instantiate|right|controls1|data1|sink_right +budget|budget|left/P|right/P|controls1 +consumer|outside|left/E|data1 +global_case|global|left/P +receipt|create-two-instances diff --git a/harness/experiments/library-compatibility-20260911/generated/local-edit.request b/harness/experiments/library-compatibility-20260911/generated/local-edit.request new file mode 100644 index 00000000..3fd97bb7 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/local-edit.request @@ -0,0 +1 @@ +edit_base|left/P|900@controls1:ms diff --git a/harness/experiments/library-compatibility-20260911/generated/oa-sa-transition.model b/harness/experiments/library-compatibility-20260911/generated/oa-sa-transition.model new file mode 100644 index 00000000..ea030a26 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/oa-sa-transition.model @@ -0,0 +1,256 @@ +pinned-counterpart=Transition { + layer: "SA", + records: { + "SA/Alarm": Definition { + member: "SA/Alarm", + class: "Item", + layer: "SA", + fields: [ + "Flow", + ], + refs: [ + "SA/Code", + ], + }, + "SA/Code": Definition { + member: "SA/Code", + class: "Field", + layer: "SA", + fields: [ + "minimum=1;maximum=1", + ], + refs: [ + "SA/Alarm", + "SA/Flag", + ], + }, + "SA/Flag": Definition { + member: "SA/Flag", + class: "Scalar", + layer: "SA", + fields: [ + "Boolean", + ], + refs: [], + }, + "SA/Interface": Definition { + member: "SA/Interface", + class: "Interface", + layer: "SA", + fields: [], + refs: [ + "SA/Operation", + ], + }, + "SA/Operation": Definition { + member: "SA/Operation", + class: "Allocation", + layer: "SA", + fields: [ + "order=0", + ], + refs: [ + "SA/Interface", + "SA/Alarm", + ], + }, + }, + origin_pin: "43788fdf736f509c0ae19357ee717b79ff26b35cab1fdf0b588584ca06d38a19", + target_pin: Some( + "f52b2a9281b60d35ddc0044fc9624b3b30ee0d35d88d1130c2c3e1af54e05696", + ), + origin_map: { + "Alarm": "SA/Alarm", + "Code": "SA/Code", + "Flag": "SA/Flag", + "Interface": "SA/Interface", + "Operation": "SA/Operation", + }, + mount: true, +} +pinned-architecture={ + "sa/alarm": FunctionalExchange { + source: "sa/watch", + target: "sa/receive", + source_port: "sa/watch_out", + target_port: "sa/receive_in", + item: "sa_mount/SA/Alarm", + }, + "sa/receive": Function { + name: "Receive left", + }, + "sa/receive_in": Port { + owner: "sa/receive", + direction: "In", + accepted_item: "sa_mount/SA/Alarm", + }, + "sa/watch": Function { + name: "Watch", + }, + "sa/watch_out": Port { + owner: "sa/watch", + direction: "Out", + accepted_item: "sa_mount/SA/Alarm", + }, +} +local-derivative=Transition { + layer: "SA", + records: { + "SA/Alarm": Definition { + member: "SA/Alarm", + class: "Item", + layer: "SA", + fields: [ + "Flow", + ], + refs: [ + "SA/Code", + ], + }, + "SA/Code": Definition { + member: "SA/Code", + class: "Field", + layer: "SA", + fields: [ + "minimum=1;maximum=1", + ], + refs: [ + "SA/Alarm", + "SA/Flag", + ], + }, + "SA/Flag": Definition { + member: "SA/Flag", + class: "Scalar", + layer: "SA", + fields: [ + "Boolean", + ], + refs: [], + }, + "SA/Interface": Definition { + member: "SA/Interface", + class: "Interface", + layer: "SA", + fields: [], + refs: [ + "SA/Operation", + ], + }, + "SA/Operation": Definition { + member: "SA/Operation", + class: "Allocation", + layer: "SA", + fields: [ + "order=0", + ], + refs: [ + "SA/Interface", + "SA/Alarm", + ], + }, + }, + origin_pin: "43788fdf736f509c0ae19357ee717b79ff26b35cab1fdf0b588584ca06d38a19", + target_pin: None, + origin_map: { + "Alarm": "SA/Alarm", + "Code": "SA/Code", + "Flag": "SA/Flag", + "Interface": "SA/Interface", + "Operation": "SA/Operation", + }, + mount: false, +} +local-architecture={ + "sa/alarm": FunctionalExchange { + source: "sa/watch", + target: "sa/receive", + source_port: "sa/watch_out", + target_port: "sa/receive_in", + item: "SA/Alarm", + }, + "sa/receive": Function { + name: "Receive left", + }, + "sa/receive_in": Port { + owner: "sa/receive", + direction: "In", + accepted_item: "SA/Alarm", + }, + "sa/watch": Function { + name: "Watch", + }, + "sa/watch_out": Port { + owner: "sa/watch", + direction: "Out", + accepted_item: "SA/Alarm", + }, +} +refined-derivative=Transition { + layer: "SA", + records: { + "SA/Alarm": Definition { + member: "SA/Alarm", + class: "Item", + layer: "SA", + fields: [ + "Flow", + ], + refs: [ + "SA/Code", + ], + }, + "SA/Code": Definition { + member: "SA/Code", + class: "Field", + layer: "SA", + fields: [ + "minimum=1;maximum=2", + ], + refs: [ + "SA/Alarm", + "SA/Flag", + ], + }, + "SA/Flag": Definition { + member: "SA/Flag", + class: "Scalar", + layer: "SA", + fields: [ + "Boolean", + ], + refs: [], + }, + "SA/Interface": Definition { + member: "SA/Interface", + class: "Interface", + layer: "SA", + fields: [], + refs: [ + "SA/Operation", + ], + }, + "SA/Operation": Definition { + member: "SA/Operation", + class: "Allocation", + layer: "SA", + fields: [ + "order=0", + ], + refs: [ + "SA/Interface", + "SA/Alarm", + ], + }, + }, + origin_pin: "43788fdf736f509c0ae19357ee717b79ff26b35cab1fdf0b588584ca06d38a19", + target_pin: None, + origin_map: { + "Alarm": "SA/Alarm", + "Code": "SA/Code", + "Flag": "SA/Flag", + "Interface": "SA/Interface", + "Operation": "SA/Operation", + }, + mount: false, +} diff --git a/harness/experiments/library-compatibility-20260911/generated/package-D1.library b/harness/experiments/library-compatibility-20260911/generated/package-D1.library new file mode 100644 index 00000000..0dce2908 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/package-D1.library @@ -0,0 +1,15 @@ +package|ControlPatterns|1.0.0 +description|Monitor alarm +note|Initial documentation +def|Duration|Kind|Neutral|dimension=0,0,1,0,0,0,0;linear|- +def|Energy|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|Torque|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|ms|Unit|Neutral|millis=1|Duration +def|s|Unit|Neutral|millis=1000|Duration +def|Flag|Scalar|OA|Boolean|- +def|Alarm|Item|OA|Flow|Code +def|Code|Field|OA|minimum=1;maximum=1|Alarm,Flag +def|Interface|Interface|OA|-|Operation +def|Operation|Allocation|OA|order=0|Interface,Alarm +pattern|monitor|A,E,P,C,K +role|sink|Activity|OA diff --git a/harness/experiments/library-compatibility-20260911/generated/package-D2.library b/harness/experiments/library-compatibility-20260911/generated/package-D2.library new file mode 100644 index 00000000..2a211005 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/package-D2.library @@ -0,0 +1,15 @@ +package|ControlPatterns|1.0.1 +description|Monitor alarm +note|Revised documentation only +def|Duration|Kind|Neutral|dimension=0,0,1,0,0,0,0;linear|- +def|Energy|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|Torque|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|ms|Unit|Neutral|millis=1|Duration +def|s|Unit|Neutral|millis=1000|Duration +def|Flag|Scalar|OA|Boolean|- +def|Alarm|Item|OA|Flow|Code +def|Code|Field|OA|minimum=1;maximum=1|Alarm,Flag +def|Interface|Interface|OA|-|Operation +def|Operation|Allocation|OA|order=0|Interface,Alarm +pattern|monitor|A,E,P,C,K +role|sink|Activity|OA diff --git a/harness/experiments/library-compatibility-20260911/generated/package-D3.library b/harness/experiments/library-compatibility-20260911/generated/package-D3.library new file mode 100644 index 00000000..eaf78710 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/package-D3.library @@ -0,0 +1,15 @@ +package|ControlPatterns|2.0.0 +description|Monitor alarm +note|Initial documentation +def|Duration|Kind|Neutral|dimension=0,0,1,0,0,0,0;linear|- +def|Energy|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|Torque|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|- +def|ms|Unit|Neutral|millis=1|Duration +def|s|Unit|Neutral|millis=1000|Duration +def|Flag|Scalar|OA|Boolean|- +def|Alarm|Item|OA|Flow|Code +def|Code|Field|OA|minimum=1;maximum=2|Alarm,Flag +def|Interface|Interface|OA|-|Operation +def|Operation|Allocation|OA|order=0|Interface,Alarm +pattern|monitor|A,E,P,C,K +role|sink|Activity|OA diff --git a/harness/experiments/library-compatibility-20260911/generated/package-SA.library b/harness/experiments/library-compatibility-20260911/generated/package-SA.library new file mode 100644 index 00000000..7920f149 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/package-SA.library @@ -0,0 +1,7 @@ +package|ControlPatternsSA|1.0.1 +description|Explicit SA counterpart +def|SA/Alarm|Item|SA|Flow|SA/Code +def|SA/Code|Field|SA|minimum=1;maximum=1|SA/Alarm,SA/Flag +def|SA/Flag|Scalar|SA|Boolean| +def|SA/Interface|Interface|SA||SA/Operation +def|SA/Operation|Allocation|SA|order=0|SA/Interface,SA/Alarm diff --git a/harness/experiments/library-compatibility-20260911/generated/selective-update.request b/harness/experiments/library-compatibility-20260911/generated/selective-update.request new file mode 100644 index 00000000..83ef4149 --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/generated/selective-update.request @@ -0,0 +1 @@ +update|left|e89a61c9548b6c5e3bf7c432d8b294923f333b67cac48fc3b33f718280db8947|controls2|data2|2|P.base=keep_local diff --git a/harness/experiments/library-compatibility-20260911/main.rs b/harness/experiments/library-compatibility-20260911/main.rs new file mode 100644 index 00000000..0f7aebbf --- /dev/null +++ b/harness/experiments/library-compatibility-20260911/main.rs @@ -0,0 +1,2129 @@ +//! Isolated finite-model experiment. Not Studio syntax or production admission. +use std::collections::{BTreeMap, BTreeSet}; +use std::fs; +use std::path::{Path, PathBuf}; + +type Result = std::result::Result; + +#[derive(Clone, Debug, PartialEq, Eq)] +struct Definition { + member: String, + class: String, + layer: String, + fields: Vec, + refs: Vec, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +struct Package { + identity: String, + version: String, + raw: String, + digest: String, + definitions: BTreeMap, + description: String, + prototype: BTreeMap, + selected: BTreeSet, + role_member: Option, +} + +impl Package { + fn parse(raw: String) -> Result { + let mut identity = None; + let mut version = None; + let mut definitions = BTreeMap::new(); + let mut description = None; + let mut prototype = BTreeMap::new(); + let mut selected = BTreeSet::new(); + let mut role_member = None; + for line in raw.lines() { + let row: Vec<_> = line.split('|').collect(); + match row.as_slice() { + ["package", p, v] if identity.is_none() => { + identity = Some((*p).into()); + version = Some((*v).into()); + } + ["description", text] if description.is_none() => { + description = Some((*text).into()) + } + ["def", member, class, layer, fields, refs] => { + let def = Definition { + member: (*member).into(), + class: (*class).into(), + layer: (*layer).into(), + fields: split(fields), + refs: split(refs), + }; + if definitions.insert((*member).into(), def).is_some() { + return Err("duplicate member".into()); + } + } + ["prototype", member, ..] => { + let record = Record::parse(line.splitn(3, '|').nth(2).ok_or("bad prototype")?)?; + if record.id != *member || prototype.insert((*member).into(), record).is_some() + { + return Err("duplicate or mismatched prototype member".into()); + } + } + ["pattern", "monitor", members] if selected.is_empty() => { + selected = split(members).into_iter().collect() + } + ["role", "sink", member, "Activity", "OA"] if role_member.is_none() => { + role_member = Some((*member).into()) + } + ["note", _] | ["analysis", "P", "K", "C"] => {} + _ => return Err(format!("unrecognized package row: {line}")), + } + } + let value = Self { + identity: identity.ok_or("missing package identity")?, + version: version.ok_or("missing version")?, + digest: sha256(raw.as_bytes()), + raw, + definitions, + description: description.ok_or("missing description")?, + prototype, + selected, + role_member, + }; + for def in value.definitions.values() { + if !matches!( + def.class.as_str(), + "Kind" | "Unit" | "Scalar" | "Item" | "Field" | "Interface" | "Allocation" + ) { + return Err("unsupported contract class".into()); + } + if def.refs.iter().any(|r| !value.definitions.contains_key(r)) { + return Err("unresolved package reference".into()); + } + } + if value + .selected + .iter() + .any(|member| !value.prototype.contains_key(member)) + || value + .role_member + .as_ref() + .is_some_and(|m| !value.prototype.contains_key(m) || value.selected.contains(m)) + { + return Err("incomplete prototype/export/role".into()); + } + Ok(value) + } + fn contract(&self, root: &str) -> Result> { + let mut pending = vec![root.to_string()]; + let mut seen = BTreeSet::new(); + while let Some(id) = pending.pop() { + if seen.insert(id.clone()) { + pending.extend( + self.definitions + .get(&id) + .ok_or("missing contract root")? + .refs + .clone(), + ); + } + } + Ok(seen.iter().map(|id| self.definitions[id].clone()).collect()) + } +} + +fn equivalent(a: &Package, am: &str, b: &Package, bm: &str) -> bool { + a.identity == b.identity + && am == bm + && a.contract(am) + .ok() + .zip(b.contract(bm).ok()) + .is_some_and(|(a, b)| a == b) +} + +#[derive(Clone, Debug)] +enum Policy { + Strict, + SameOrigin, + Bridges(BTreeSet<(String, String)>), +} +fn pair(a: &str, b: &str) -> (String, String) { + if a <= b { + (a.into(), b.into()) + } else { + (b.into(), a.into()) + } +} +fn policy_matches(a: &Package, am: &str, b: &Package, bm: &str, policy: &Policy) -> bool { + if a.identity == b.identity && a.digest == b.digest && am == bm { + return true; + } + match policy { + Policy::Strict => false, + Policy::SameOrigin => equivalent(a, am, b, bm), + Policy::Bridges(witnesses) => { + equivalent(a, am, b, bm) + && witnesses.contains(&pair( + &format!("{}:{am}", a.digest), + &format!("{}:{bm}", b.digest), + )) + } + } +} + +#[derive(Clone, Debug, PartialEq, Eq)] +struct DRef { + import: String, + member: String, +} +impl DRef { + fn new(import: &str, member: &str) -> Self { + Self { + import: import.into(), + member: member.into(), + } + } + fn text(&self) -> String { + format!("{}:{}", self.import, self.member) + } + fn parse(s: &str) -> Result { + let (i, m) = s.split_once(':').ok_or("bad definition reference")?; + Ok(Self::new(i, m)) + } +} + +#[derive(Clone, Debug, PartialEq, Eq)] +struct Literal { + magnitude: i64, + unit: DRef, +} +impl Literal { + fn new(magnitude: i64, import: &str, unit: &str) -> Self { + Self { + magnitude, + unit: DRef::new(import, unit), + } + } + fn text(&self) -> String { + format!("{}@{}", self.magnitude, self.unit.text()) + } + fn parse(s: &str) -> Result { + let (n, u) = s.split_once('@').ok_or("bad literal")?; + Ok(Self { + magnitude: n.parse().map_err(|_| "bad integer")?, + unit: DRef::parse(u)?, + }) + } +} + +#[derive(Clone, Debug, PartialEq, Eq)] +enum Body { + Activity { + description: String, + }, + Interaction { + source: String, + target: String, + item: String, + }, + Property { + subject: String, + kind: DRef, + base: Literal, + }, + Case { + subject: Option, + overrides: BTreeMap, + }, + Check { + property: String, + limit: Literal, + }, + Budget { + left: String, + right: String, + kind: DRef, + limit: Literal, + }, + Consumer { + exchange: String, + interface: String, + allocation: String, + field: String, + }, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +struct Record { + id: String, + layer: String, + name: String, + body: Body, +} + +impl Record { + fn line(&self) -> String { + let tail = match &self.body { + Body::Activity { description } => format!("Activity|{description}"), + Body::Interaction { + source, + target, + item, + } => format!("Interaction|{source}|{target}|{item}"), + Body::Property { + subject, + kind, + base, + } => format!("Property|{subject}|{}|{}", kind.text(), base.text()), + Body::Case { subject, overrides } => format!( + "Case|{}|{}", + subject.as_deref().unwrap_or("-"), + overrides + .iter() + .map(|(p, e)| format!("{p}={}", e.text())) + .collect::>() + .join(",") + ), + Body::Check { property, limit } => format!("Check|{property}|{}", limit.text()), + Body::Budget { + left, + right, + kind, + limit, + } => format!("Budget|{left}|{right}|{}|{}", kind.text(), limit.text()), + Body::Consumer { + exchange, + interface, + allocation, + field, + } => format!("Consumer|{exchange}|{interface}|{allocation}|{field}"), + }; + format!("record|{}|{}|{}|{tail}", self.id, self.layer, self.name) + } + fn parse(line: &str) -> Result { + let r: Vec<_> = line.split('|').collect(); + if r.len() < 5 || r[0] != "record" { + return Err("bad record".into()); + } + let body = match &r[4..] { + ["Activity", description] => Body::Activity { + description: (*description).into(), + }, + ["Interaction", source, target, item] => Body::Interaction { + source: (*source).into(), + target: (*target).into(), + item: (*item).into(), + }, + ["Property", subject, kind, value] => Body::Property { + subject: (*subject).into(), + kind: DRef::parse(kind)?, + base: Literal::parse(value)?, + }, + ["Case", subject, rows] => { + let mut overrides = BTreeMap::new(); + for row in split(rows) { + let (id, value) = row.split_once('=').ok_or("bad override")?; + if overrides + .insert(id.into(), Literal::parse(value)?) + .is_some() + { + return Err("duplicate override".into()); + } + } + Body::Case { + subject: (*subject != "-").then(|| (*subject).into()), + overrides, + } + } + ["Check", property, limit] => Body::Check { + property: (*property).into(), + limit: Literal::parse(limit)?, + }, + ["Budget", left, right, kind, limit] => Body::Budget { + left: (*left).into(), + right: (*right).into(), + kind: DRef::parse(kind)?, + limit: Literal::parse(limit)?, + }, + ["Consumer", exchange, interface, allocation, field] => Body::Consumer { + exchange: (*exchange).into(), + interface: (*interface).into(), + allocation: (*allocation).into(), + field: (*field).into(), + }, + _ => return Err("bad constructor".into()), + }; + Ok(Self { + id: r[1].into(), + layer: r[2].into(), + name: r[3].into(), + body, + }) + } + fn remap_live(&mut self, old: &str, new: &str) { + fn remap(id: &mut String, old: &str, new: &str) { + if id == old { + *id = new.into(); + } + } + remap(&mut self.id, old, new); + match &mut self.body { + Body::Activity { .. } => {} + Body::Interaction { + source, + target, + item, + } => { + remap(source, old, new); + remap(target, old, new); + remap(item, old, new); + } + Body::Property { subject, .. } => remap(subject, old, new), + Body::Case { subject, overrides } => { + if let Some(subject) = subject { + remap(subject, old, new); + } + if let Some(v) = overrides.remove(old) { + overrides.insert(new.into(), v); + } + } + Body::Check { property, .. } => remap(property, old, new), + Body::Budget { left, right, .. } => { + remap(left, old, new); + remap(right, old, new); + } + Body::Consumer { + exchange, + interface, + allocation, + field, + } => { + remap(exchange, old, new); + remap(interface, old, new); + remap(allocation, old, new); + remap(field, old, new); + } + } + } + fn rebind_self_definitions(&mut self, import: &str) { + fn reference(r: &mut DRef, import: &str) { + if r.import == "SELF" { + r.import = import.into(); + } + } + fn literal(l: &mut Literal, import: &str) { + reference(&mut l.unit, import); + } + match &mut self.body { + Body::Property { kind, base, .. } => { + reference(kind, import); + literal(base, import); + } + Body::Case { overrides, .. } => { + for value in overrides.values_mut() { + literal(value, import); + } + } + Body::Check { limit, .. } => literal(limit, import), + Body::Budget { kind, limit, .. } => { + reference(kind, import); + literal(limit, import); + } + Body::Activity { .. } | Body::Interaction { .. } | Body::Consumer { .. } => {} + } + } +} + +#[derive(Clone, Debug, PartialEq, Eq)] +struct Mount { + import: String, + members: BTreeMap, +} +#[derive(Clone, Debug, PartialEq, Eq)] +struct Instance { + import: String, + mount: String, + sink: String, + prefix: String, + original: BTreeMap, + current: BTreeMap>, + lineage: BTreeMap, + base: BTreeMap, +} +#[derive(Clone, Debug, PartialEq, Eq)] +struct Document { + identity: String, + revision: u32, + imports: BTreeMap, + mounts: BTreeMap, + instances: BTreeMap, + live: BTreeMap, + receipts: Vec, +} + +fn materialize(instance: &Instance, package: &Package, mount: &Mount) -> BTreeMap { + package + .selected + .iter() + .map(|member| { + let mut record = package.prototype[member].clone(); + for (foreign, local) in &instance.original { + record.remap_live(foreign, local); + } + if let Some(role_member) = &package.role_member { + record.remap_live(role_member, &instance.sink); + } + for (foreign, local) in &mount.members { + record.remap_live(&format!("MOUNT/{foreign}"), local); + } + record.rebind_self_definitions(&instance.import); + record.name = format!("{} {}", instance.prefix, record.name); + (member.clone(), record) + }) + .collect() +} + +fn split(s: &str) -> Vec { + if s.is_empty() || s == "-" { + vec![] + } else { + s.split(',').map(String::from).collect() + } +} +fn read(path: &Path) -> Result { + fs::read_to_string(path).map_err(|e| format!("{}: {e}", path.display())) +} +fn write(path: &Path, text: &str) -> Result<()> { + if let Some(parent) = path.parent() { + fs::create_dir_all(parent).map_err(|e| e.to_string())?; + } + fs::write(path, text).map_err(|e| e.to_string()) +} + +fn prepare_new(request: &str, packages: &BTreeMap) -> Result { + let mut doc = Document { + identity: String::new(), + revision: 1, + imports: BTreeMap::new(), + mounts: BTreeMap::new(), + instances: BTreeMap::new(), + live: BTreeMap::new(), + receipts: vec![], + }; + for line in request.lines() { + let r: Vec<_> = line.split('|').collect(); + match r.as_slice() { + ["new", id] if doc.identity.is_empty() => doc.identity = (*id).into(), + ["import", alias, package] => { + if doc + .imports + .insert( + (*alias).into(), + packages + .get(*package) + .ok_or("missing supplied package")? + .clone(), + ) + .is_some() + { + return Err("duplicate import".into()); + } + } + ["mount", id, import] => { + let p = doc.imports.get(*import).ok_or("missing import")?; + let members = p + .definitions + .values() + .filter(|d| d.layer == "OA") + .map(|d| (d.member.clone(), format!("{id}/{}", d.member))) + .collect(); + if doc + .mounts + .insert( + (*id).into(), + Mount { + import: (*import).into(), + members, + }, + ) + .is_some() + { + return Err("duplicate mount".into()); + } + } + ["activity", id, name] => { + doc.live.insert( + (*id).into(), + Record { + id: (*id).into(), + layer: "OA".into(), + name: (*name).into(), + body: Body::Activity { + description: String::new(), + }, + }, + ); + } + ["instantiate", id, import, mount, sink] => { + if !doc.live.contains_key(*sink) { + return Err("missing role binding".into()); + } + let original: BTreeMap = ["A", "E", "P", "C", "K"] + .into_iter() + .map(|m| (m.into(), format!("{id}/{m}"))) + .collect(); + let mut instance = Instance { + import: (*import).into(), + mount: (*mount).into(), + sink: (*sink).into(), + prefix: (*id).into(), + current: original + .iter() + .map(|(m, id)| (m.clone(), Some(id.clone()))) + .collect(), + lineage: original + .values() + .map(|id| (id.clone(), id.clone())) + .collect(), + original, + base: BTreeMap::new(), + }; + let mount = doc.mounts.get(*mount).ok_or("missing mount")?; + if mount.import != *import { + return Err("initial mount pin mismatch".into()); + } + instance.base = materialize( + &instance, + doc.imports.get(*import).ok_or("missing import")?, + mount, + ); + for r in instance.base.values() { + if doc.live.insert(r.id.clone(), r.clone()).is_some() { + return Err("identity collision".into()); + } + } + if doc.instances.insert((*id).into(), instance).is_some() { + return Err("duplicate instance".into()); + } + } + ["budget", id, left, right, import] => { + doc.live.insert( + (*id).into(), + Record { + id: (*id).into(), + layer: "OA".into(), + name: "Combined duration".into(), + body: Body::Budget { + left: (*left).into(), + right: (*right).into(), + kind: DRef::new(import, "Duration"), + limit: Literal::new(2000, import, "ms"), + }, + }, + ); + } + ["consumer", id, exchange, mount] => { + let m = doc.mounts.get(*mount).ok_or("missing consumer mount")?; + doc.live.insert( + (*id).into(), + Record { + id: (*id).into(), + layer: "OA".into(), + name: "Outside typed receiver".into(), + body: Body::Consumer { + exchange: (*exchange).into(), + interface: m.members["Interface"].clone(), + allocation: m.members["Operation"].clone(), + field: m.members["Code"].clone(), + }, + }, + ); + } + ["global_case", id, property] => { + doc.live.insert( + (*id).into(), + Record { + id: (*id).into(), + layer: "OA".into(), + name: "Unrelated project-wide study".into(), + body: Body::Case { + subject: None, + overrides: BTreeMap::from([( + (*property).into(), + Literal::new(3000, "controls1", "ms"), + )]), + }, + }, + ); + } + ["receipt", id] => doc.receipts.push((*id).into()), + _ => return Err(format!("unsupported request row: {line}")), + } + } + admit(&doc)?; + Ok(doc) +} + +fn admit(doc: &Document) -> Result<()> { + let mut identities: BTreeSet = doc.live.keys().cloned().collect(); + let mut labels = BTreeMap::new(); + for (alias, p) in &doc.imports { + if sha256(p.raw.as_bytes()) != p.digest { + return Err(format!("wrong package bytes: {alias}")); + } + if Package::parse(p.raw.clone())? != *p { + return Err("forged parsed package".into()); + } + if let Some(prior) = + labels.insert((p.identity.clone(), p.version.clone()), p.digest.clone()) + && prior != p.digest + { + return Err("same package/version has conflicting bytes".into()); + } + } + for mount in doc.mounts.values() { + let p = doc + .imports + .get(&mount.import) + .ok_or("missing mount package")?; + let required: BTreeSet<_> = p + .definitions + .values() + .filter(|d| d.layer == "OA") + .map(|d| d.member.clone()) + .collect(); + if required != mount.members.keys().cloned().collect() { + return Err("mount not complete".into()); + } + for id in mount.members.values() { + if !identities.insert(id.clone()) { + return Err("mount identity collision".into()); + } + } + } + let mut tracked = BTreeSet::new(); + for instance in doc.instances.values() { + let p = doc + .imports + .get(&instance.import) + .ok_or("missing base package")?; + let m = doc + .mounts + .get(&instance.mount) + .ok_or("missing base mount")?; + if m.import != instance.import { + return Err("base mount pin mismatch".into()); + } + if instance.original.keys().cloned().collect::>() + != BTreeSet::from(["A", "E", "P", "C", "K"].map(String::from)) + { + return Err("incomplete original map".into()); + } + if materialize(instance, p, m) != instance.base { + return Err("forged historical base".into()); + } + if instance.current.keys().ne(instance.original.keys()) { + return Err("incomplete correspondence".into()); + } + for (member, live) in &instance.current { + let original = &instance.original[member]; + if let Some(id) = live { + if id != original && identities.contains(original) { + return Err("historical local identity was reused".into()); + } + if !tracked.insert(id.clone()) || !doc.live.contains_key(id) { + return Err("bad current map".into()); + } + if instance.lineage.get(original) != Some(id) { + return Err("missing typed lineage".into()); + } + if std::mem::discriminant(&doc.live[id].body) + != std::mem::discriminant(&instance.base[member].body) + { + return Err("record class changed".into()); + } + } else if identities.contains(original) { + return Err("deleted identity was reused".into()); + } + } + } + for r in doc.live.values() { + let required = match &r.body { + Body::Activity { .. } => vec![], + Body::Interaction { + source, + target, + item, + } => vec![source, target, item], + Body::Property { + subject, + kind, + base, + } => { + kind_compatible(doc, kind, &unit_kind(doc, &base.unit)?)? + .then_some(()) + .ok_or("property unit kind mismatch")?; + vec![subject] + } + Body::Case { subject, overrides } => { + let mut ids: Vec<_> = overrides.keys().collect(); + if let Some(s) = subject { + ids.push(s); + } + for (id, literal) in overrides { + let Body::Property { kind, .. } = + &doc.live.get(id).ok_or("missing override property")?.body + else { + return Err("wrong override kind".into()); + }; + if !kind_compatible(doc, kind, &unit_kind(doc, &literal.unit)?)? { + return Err("override unit kind mismatch".into()); + } + } + ids + } + Body::Check { property, .. } => vec![property], + Body::Budget { left, right, .. } => vec![left, right], + Body::Consumer { + exchange, + interface, + allocation, + field, + } => vec![exchange, interface, allocation, field], + }; + if required.iter().any(|id| !identities.contains(*id)) { + return Err(format!("dangling live reference in {}", r.id)); + } + } + evaluate(doc, "budget")?; + consumer_match(doc, "outside")?; + Ok(()) +} + +fn kind_compatible(doc: &Document, a: &DRef, b: &DRef) -> Result { + let pa = doc.imports.get(&a.import).ok_or("missing kind import")?; + let pb = doc.imports.get(&b.import).ok_or("missing kind import")?; + Ok(pa + .definitions + .get(&a.member) + .is_some_and(|d| d.class == "Kind") + && pb + .definitions + .get(&b.member) + .is_some_and(|d| d.class == "Kind") + && equivalent(pa, &a.member, pb, &b.member)) +} +fn unit_kind(doc: &Document, unit: &DRef) -> Result { + let p = doc.imports.get(&unit.import).ok_or("missing unit import")?; + let d = p.definitions.get(&unit.member).ok_or("missing unit")?; + if d.class != "Unit" || d.refs.len() != 1 { + return Err("wrong unit kind".into()); + } + Ok(DRef::new(&unit.import, &d.refs[0])) +} +fn millis(doc: &Document, literal: &Literal) -> Result { + let p = doc + .imports + .get(&literal.unit.import) + .ok_or("missing unit import")?; + let d = p + .definitions + .get(&literal.unit.member) + .ok_or("missing unit")?; + let scale = d + .fields + .first() + .ok_or("missing scale")? + .strip_prefix("millis=") + .ok_or("bad scale")? + .parse::() + .map_err(|_| "bad scale")?; + literal + .magnitude + .checked_mul(scale) + .ok_or("overflow".into()) +} +fn evaluate(doc: &Document, id: &str) -> Result<(i64, bool)> { + evaluate_policy(doc, id, &Policy::SameOrigin) +} +fn evaluate_check(doc: &Document, check: &str, context: Option<&str>) -> Result<(i64, bool)> { + let Body::Check { property, limit } = &doc.live.get(check).ok_or("missing check")?.body else { + return Err("not check".into()); + }; + let Body::Property { kind, base, .. } = &doc.live.get(property).ok_or("missing property")?.body + else { + return Err("not property".into()); + }; + let effective = if let Some(context) = context { + let Body::Case { overrides, .. } = &doc.live.get(context).ok_or("missing case")?.body + else { + return Err("not case".into()); + }; + overrides.get(property).unwrap_or(base) + } else { + base + }; + if !kind_compatible(doc, kind, &unit_kind(doc, &effective.unit)?)? + || !kind_compatible(doc, kind, &unit_kind(doc, &limit.unit)?)? + { + return Err("check kind mismatch".into()); + } + let value = millis(doc, effective)?; + Ok((value, value <= millis(doc, limit)?)) +} +fn evaluate_policy(doc: &Document, id: &str, policy: &Policy) -> Result<(i64, bool)> { + let Body::Budget { + left, + right, + kind, + limit, + } = &doc.live.get(id).ok_or("missing budget")?.body + else { + return Err("not budget".into()); + }; + let mut total = 0i64; + for id in [left, right] { + let Body::Property { + kind: input_kind, + base, + .. + } = &doc.live.get(id).ok_or("missing property")?.body + else { + return Err("not property".into()); + }; + let unit_kind = unit_kind(doc, &base.unit)?; + if !policy_matches( + &doc.imports[&kind.import], + &kind.member, + &doc.imports[&input_kind.import], + &input_kind.member, + policy, + ) || !policy_matches( + &doc.imports[&input_kind.import], + &input_kind.member, + &doc.imports[&unit_kind.import], + &unit_kind.member, + policy, + ) { + return Err("incompatible budget kind".into()); + } + total += millis(doc, base)?; + } + Ok((total, total <= millis(doc, limit)?)) +} +fn mounted<'a>(doc: &'a Document, id: &str) -> Result<(&'a Mount, String)> { + for mount in doc.mounts.values() { + for (member, local) in &mount.members { + if id == local { + return Ok((mount, member.clone())); + } + } + } + Err("not a mounted member".into()) +} +fn consumer_match(doc: &Document, id: &str) -> Result> { + consumer_match_policy(doc, id, &Policy::SameOrigin) +} +fn consumer_match_policy( + doc: &Document, + id: &str, + policy: &Policy, +) -> Result> { + let Body::Consumer { + exchange, + interface, + allocation, + field, + } = &doc.live.get(id).ok_or("missing consumer")?.body + else { + return Err("not consumer".into()); + }; + let Body::Interaction { item, .. } = &doc.live.get(exchange).ok_or("missing exchange")?.body + else { + return Err("not exchange".into()); + }; + let (actual, member) = mounted(doc, item)?; + let (expected, expected_interface) = mounted(doc, interface)?; + if member != "Alarm" || expected_interface != "Interface" { + return Err("wrong contracted root".into()); + } + let a = &doc.imports[&actual.import]; + let e = &doc.imports[&expected.import]; + if !policy_matches(a, "Interface", e, "Interface", policy) { + return Err("item/interface not compatible".into()); + } + if expected.members.get("Operation") != Some(allocation) + || expected.members.get("Code") != Some(field) + { + return Err("operation or field outside declared root".into()); + } + Ok(expected + .members + .iter() + .map(|(member, local)| (local.clone(), actual.members[member].clone())) + .collect()) +} + +fn apply_edit(doc: &Document, request: &str) -> Result { + let r: Vec<_> = request.trim().split('|').collect(); + let ["edit_base", id, literal] = r.as_slice() else { + return Err("bad edit request".into()); + }; + let mut candidate = doc.clone(); + let Body::Property { base, .. } = &mut candidate + .live + .get_mut(*id) + .ok_or("missing edit target")? + .body + else { + return Err("not property".into()); + }; + *base = Literal::parse(literal)?; + candidate.revision += 1; + candidate.receipts.push(request.trim().into()); + admit(&candidate)?; + Ok(candidate) +} + +fn merge_value(base: &T, local: &T, next: &T, keep_local: bool) -> Result { + if local == base { + Ok(next.clone()) + } else if next == base || local == next || keep_local { + Ok(local.clone()) + } else { + Err("unresolved typed value conflict".into()) + } +} +fn update(doc: &Document, request: &str, package: Package) -> Result { + let r: Vec<_> = request.trim().split('|').collect(); + let [ + "update", + id, + old_digest, + new_import, + new_mount, + expected_revision, + choice, + ] = r.as_slice() + else { + return Err("bad update request".into()); + }; + if expected_revision + .parse::() + .map_err(|_| "bad revision")? + != doc.revision + { + return Err("stale revision".into()); + } + let old = doc.instances.get(*id).ok_or("missing instance")?; + if doc.imports[&old.import].digest != *old_digest { + return Err("stale base pin".into()); + } + let mut candidate = doc.clone(); + if candidate.imports.contains_key(*new_import) || candidate.mounts.contains_key(*new_mount) { + return Err("immutable import/mount collision".into()); + } + let mount = Mount { + import: (*new_import).into(), + members: package + .definitions + .values() + .filter(|d| d.layer == "OA") + .map(|d| (d.member.clone(), format!("{new_mount}/{}", d.member))) + .collect(), + }; + let mut next = old.clone(); + next.import = (*new_import).into(); + next.mount = (*new_mount).into(); + next.original = old + .current + .iter() + .map(|(m, id)| { + id.clone() + .map(|id| (m.clone(), id)) + .ok_or("deleted member needs explicit policy") + }) + .collect::>()?; + next.base = materialize(&next, &package, &mount); + for (member, incoming) in &next.base { + let local_id = old.current[member] + .as_ref() + .ok_or("missing current member")?; + let mut baseline = old.base[member].clone(); + for (original, current) in &old.lineage { + baseline.remap_live(original, current); + } + let local = &doc.live[local_id]; + let value = if local == &baseline { + incoming.clone() + } else if incoming == &baseline || incoming == local { + local.clone() + } else if member == "P" && *choice == "P.base=keep_local" { + let ( + Body::Property { + subject: bs, + kind: bk, + base: bb, + }, + Body::Property { + subject: ls, + kind: lk, + base: lb, + }, + Body::Property { + subject: ns, + kind: nk, + base: nb, + }, + ) = (&baseline.body, &local.body, &incoming.body) + else { + return Err("constructor mismatch".into()); + }; + Record { + id: merge_value(&baseline.id, &local.id, &incoming.id, false)?, + layer: merge_value(&baseline.layer, &local.layer, &incoming.layer, false)?, + name: merge_value(&baseline.name, &local.name, &incoming.name, false)?, + body: Body::Property { + subject: merge_value(bs, ls, ns, false)?, + kind: merge_value(bk, lk, nk, false)?, + base: merge_value(bb, lb, nb, true)?, + }, + } + } else { + return Err(format!("unresolved typed facet conflict: {member}")); + }; + candidate.live.insert(value.id.clone(), value); + } + for id in next.original.values() { + next.lineage.insert(id.clone(), id.clone()); + } + candidate.imports.insert((*new_import).into(), package); + candidate.mounts.insert((*new_mount).into(), mount); + candidate.instances.insert((*id).into(), next); + candidate.revision += 1; + candidate.receipts.push(request.trim().into()); + admit(&candidate)?; + Ok(candidate) +} + +fn save(doc: &Document, dir: &Path) -> Result<()> { + let mut source = format!("document|{}|{}\n", doc.identity, doc.revision); + for (alias, p) in &doc.imports { + let path = format!("packages/{}.library", p.digest); + source += &format!( + "import|{alias}|{}|{}|{}|{path}\n", + p.identity, p.version, p.digest + ); + write(&dir.join(path), &p.raw)?; + } + for (id, m) in &doc.mounts { + source += &format!("mount|{id}|{}|management/{id}.mount\n", m.import); + let body = m + .members + .iter() + .map(|(foreign, local)| format!("member|{foreign}|{local}\n")) + .collect::(); + write(&dir.join(format!("management/{id}.mount")), &body)?; + } + for (id, i) in &doc.instances { + source += &format!("instance|{id}|management/{id}\n"); + let mut base = format!("base|{}|{}|{}|{}\n", i.import, i.mount, i.sink, i.prefix); + for (m, original) in &i.original { + base += &format!("original|{m}|{original}\n"); + } + for (m, r) in &i.base { + base += &format!("member|{m}|{}\n", r.line()); + } + write(&dir.join(format!("management/{id}/base.model")), &base)?; + let map = i + .current + .iter() + .map(|(m, current)| { + format!("current|{m}|{}\n", current.as_deref().unwrap_or("DELETED")) + }) + .collect::(); + write(&dir.join(format!("management/{id}/map.model")), &map)?; + let lineage = i + .lineage + .iter() + .map(|(original, current)| format!("lineage|{original}|{current}\n")) + .collect::(); + write( + &dir.join(format!("management/{id}/lineage.model")), + &lineage, + )?; + } + for r in doc.live.values() { + source += &format!("{}\n", r.line()); + } + for receipt in &doc.receipts { + source += &format!("applied|{receipt}\n"); + } + write(&dir.join("project.model"), &source) +} + +fn declared(dir: &Path, logical: &str) -> Result { + if logical.starts_with('/') + || logical.contains('\\') + || logical + .split('/') + .any(|p| p.is_empty() || p == "." || p == ".." || p.contains(':')) + { + return Err("nonportable logical path".into()); + } + Ok(dir.join(logical)) +} +fn load(dir: &Path) -> Result { + let mut doc = Document { + identity: String::new(), + revision: 0, + imports: BTreeMap::new(), + mounts: BTreeMap::new(), + instances: BTreeMap::new(), + live: BTreeMap::new(), + receipts: vec![], + }; + for line in read(&dir.join("project.model"))?.lines() { + let r: Vec<_> = line.split('|').collect(); + match r.as_slice() { + ["document", id, rev] => { + doc.identity = (*id).into(); + doc.revision = rev.parse().map_err(|_| "bad revision")?; + } + ["import", alias, identity, version, digest, path] => { + let p = Package::parse(read(&declared(dir, path)?)?)?; + if p.digest != *digest || p.identity != *identity || p.version != *version { + return Err("package pin mismatch".into()); + } + if doc.imports.insert((*alias).into(), p).is_some() { + return Err("duplicate import".into()); + } + } + ["mount", id, import, path] => { + let mut members = BTreeMap::new(); + for line in read(&declared(dir, path)?)?.lines() { + let row: Vec<_> = line.split('|').collect(); + let ["member", member, local] = row.as_slice() else { + return Err("bad mount member".into()); + }; + if members.insert((*member).into(), (*local).into()).is_some() { + return Err("duplicate mount member".into()); + } + } + doc.mounts.insert( + (*id).into(), + Mount { + import: (*import).into(), + members, + }, + ); + } + ["instance", id, path] => { + let mut i = Instance { + import: String::new(), + mount: String::new(), + sink: String::new(), + prefix: String::new(), + original: BTreeMap::new(), + current: BTreeMap::new(), + lineage: BTreeMap::new(), + base: BTreeMap::new(), + }; + for line in read(&declared(dir, &format!("{path}/base.model"))?)?.lines() { + let row: Vec<_> = line.split('|').collect(); + match row.as_slice() { + ["base", import, mount, sink, prefix] => { + i.import = (*import).into(); + i.mount = (*mount).into(); + i.sink = (*sink).into(); + i.prefix = (*prefix).into(); + } + ["original", m, local] => { + if i.original.insert((*m).into(), (*local).into()).is_some() { + return Err("duplicate original".into()); + } + } + ["member", m, ..] => { + let body = line.splitn(3, '|').nth(2).ok_or("bad member record")?; + if i.base.insert((*m).into(), Record::parse(body)?).is_some() { + return Err("duplicate base member".into()); + } + } + _ => return Err("bad base row".into()), + } + } + for line in read(&declared(dir, &format!("{path}/map.model"))?)?.lines() { + let row: Vec<_> = line.split('|').collect(); + let ["current", m, local] = row.as_slice() else { + return Err("bad current row".into()); + }; + if i.current + .insert((*m).into(), (*local != "DELETED").then(|| (*local).into())) + .is_some() + { + return Err("duplicate current row".into()); + } + } + for line in read(&declared(dir, &format!("{path}/lineage.model"))?)?.lines() { + let row: Vec<_> = line.split('|').collect(); + let ["lineage", old, new] = row.as_slice() else { + return Err("bad lineage row".into()); + }; + if i.lineage.insert((*old).into(), (*new).into()).is_some() { + return Err("duplicate lineage row".into()); + } + } + doc.instances.insert((*id).into(), i); + } + ["record", ..] => { + let record = Record::parse(line)?; + if doc.live.insert(record.id.clone(), record).is_some() { + return Err("duplicate live record".into()); + } + } + ["applied", ..] => doc.receipts.push(line[8..].into()), + _ => return Err("unknown normalized row".into()), + } + } + admit(&doc)?; + Ok(doc) +} + +#[derive(Clone, Debug, PartialEq, Eq)] +struct Transition { + layer: String, + records: BTreeMap, + origin_pin: String, + target_pin: Option, + origin_map: BTreeMap, + mount: bool, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +enum TargetRecord { + Function { + name: String, + }, + Port { + owner: String, + direction: String, + accepted_item: String, + }, + FunctionalExchange { + source: String, + target: String, + source_port: String, + target_port: String, + item: String, + }, +} +fn target_architecture(transition: &Transition) -> Result> { + let member = transition + .origin_map + .get("Alarm") + .ok_or("missing item correspondence")?; + let item = transition + .records + .get(member) + .ok_or("missing mapped item")?; + if transition.layer != "SA" || item.layer != "SA" || item.class != "Item" { + return Err("invalid SA item disposition".into()); + } + let item = if transition.mount { + format!("sa_mount/{member}") + } else { + member.clone() + }; + Ok(BTreeMap::from([ + ( + "sa/watch".into(), + TargetRecord::Function { + name: "Watch".into(), + }, + ), + ( + "sa/receive".into(), + TargetRecord::Function { + name: "Receive left".into(), + }, + ), + ( + "sa/watch_out".into(), + TargetRecord::Port { + owner: "sa/watch".into(), + direction: "Out".into(), + accepted_item: item.clone(), + }, + ), + ( + "sa/receive_in".into(), + TargetRecord::Port { + owner: "sa/receive".into(), + direction: "In".into(), + accepted_item: item.clone(), + }, + ), + ( + "sa/alarm".into(), + TargetRecord::FunctionalExchange { + source: "sa/watch".into(), + target: "sa/receive".into(), + source_port: "sa/watch_out".into(), + target_port: "sa/receive_in".into(), + item, + }, + ), + ])) +} +fn derivative(package: &Package) -> Transition { + let members = package.definitions.values().filter(|d| d.layer == "OA"); + let records = members + .map(|d| { + let mut copied = d.clone(); + copied.layer = "SA".into(); + copied.member = format!("SA/{}", d.member); + copied.refs = d + .refs + .iter() + .map(|r| { + if package.definitions[r].layer == "OA" { + format!("SA/{r}") + } else { + r.clone() + } + }) + .collect(); + (copied.member.clone(), copied) + }) + .collect(); + Transition { + layer: "SA".into(), + records, + origin_pin: package.digest.clone(), + target_pin: None, + origin_map: package + .definitions + .values() + .filter(|d| d.layer == "OA") + .map(|d| (d.member.clone(), format!("SA/{}", d.member))) + .collect(), + mount: false, + } +} +fn pinned_counterpart( + package: &Package, + target: &Package, + correspondence: &BTreeMap, +) -> Result { + let expected = derivative(package); + let records = target + .definitions + .values() + .filter(|d| d.layer == "SA") + .map(|d| (d.member.clone(), d.clone())) + .collect(); + if expected.records != records || &expected.origin_map != correspondence { + return Err("incomplete/incompatible layer correspondence".into()); + } + Ok(Transition { + layer: "SA".into(), + records, + origin_pin: package.digest.clone(), + target_pin: Some(target.digest.clone()), + origin_map: correspondence.clone(), + mount: true, + }) +} + +fn analysis_scope( + properties: &[&str], + checks: &[&str], + cases: &[&str], + external: &[&str], +) -> Result> { + let mut selected: BTreeSet = properties + .iter() + .chain(checks) + .chain(cases) + .map(|s| (*s).into()) + .collect(); + let boundary: BTreeSet<_> = external.iter().copied().collect(); + loop { + let old = selected.clone(); + for id in &old { + let dependencies = match id.as_str() { + "P" => vec![], + "K" | "C" => vec!["P"], + "G" => vec!["P", "Q"], + "Q" => vec![], + _ => return Err("unknown analysis root".into()), + }; + selected.extend( + dependencies + .into_iter() + .filter(|id| !boundary.contains(id)) + .map(String::from), + ); + } + if selected == old { + break; + } + } + if selected.contains("Q") { + return Err("outside property Q requires explicit subject/property boundary choice".into()); + } + Ok(selected) +} + +fn sha256(bytes: &[u8]) -> String { + const K: [u32; 64] = [ + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, + 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, + 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, + 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, + 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, + 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, + 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, + 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, + 0xc67178f2, + ]; + let mut h: [u32; 8] = [ + 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, + 0x5be0cd19, + ]; + let mut data = bytes.to_vec(); + let bit_len = (data.len() as u64) * 8; + data.push(0x80); + while data.len() % 64 != 56 { + data.push(0); + } + data.extend(bit_len.to_be_bytes()); + for chunk in data.chunks_exact(64) { + let mut w = [0u32; 64]; + for (i, word) in chunk.chunks_exact(4).enumerate() { + w[i] = u32::from_be_bytes(word.try_into().expect("four bytes")); + } + for i in 16..64 { + let s0 = w[i - 15].rotate_right(7) ^ w[i - 15].rotate_right(18) ^ (w[i - 15] >> 3); + let s1 = w[i - 2].rotate_right(17) ^ w[i - 2].rotate_right(19) ^ (w[i - 2] >> 10); + w[i] = w[i - 16] + .wrapping_add(s0) + .wrapping_add(w[i - 7]) + .wrapping_add(s1); + } + let [mut a, mut b, mut c, mut d, mut e, mut f, mut g, mut hh] = h; + for i in 0..64 { + let s1 = e.rotate_right(6) ^ e.rotate_right(11) ^ e.rotate_right(25); + let ch = (e & f) ^ (!e & g); + let t1 = hh + .wrapping_add(s1) + .wrapping_add(ch) + .wrapping_add(K[i]) + .wrapping_add(w[i]); + let s0 = a.rotate_right(2) ^ a.rotate_right(13) ^ a.rotate_right(22); + let maj = (a & b) ^ (a & c) ^ (b & c); + let t2 = s0.wrapping_add(maj); + hh = g; + g = f; + f = e; + e = d.wrapping_add(t1); + d = c; + c = b; + b = a; + a = t1.wrapping_add(t2); + } + for (state, value) in h.iter_mut().zip([a, b, c, d, e, f, g, hh]) { + *state = state.wrapping_add(value); + } + } + h.iter().map(|x| format!("{x:08x}")).collect() +} + +fn main() -> Result<()> { + let args: Vec = std::env::args().skip(1).collect(); + if args.first().is_some_and(|a| a == "--reopen") { + if args.len() != 3 { + return Err("usage: --reopen INPUT_DIRECTORY OUTPUT_DIRECTORY".into()); + } + let doc = load(Path::new(&args[1]))?; + let budget = evaluate(&doc, "budget")?; + save(&doc, Path::new(&args[2]))?; + println!( + "Fresh process reopened {} records at revision {}; budget={} ms satisfied={}", + doc.live.len(), + doc.revision, + budget.0, + budget.1 + ); + return Ok(()); + } + let root = PathBuf::from( + args.first() + .ok_or("provide the owned experiment output directory")?, + ); + fs::create_dir_all(&root).map_err(|e| e.to_string())?; + let mut checks = 0usize; + macro_rules! check { + ($condition:expr) => {{ + checks += 1; + assert!($condition, "check {}: {}", checks, stringify!($condition)); + }}; + } + check!(sha256(b"") == "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"); + check!(sha256(b"abc") == "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"); + let raw = concat!( + "package|ControlPatterns|1.0.0\n", + "description|Monitor alarm\n", + "note|Initial documentation\n", + "def|Duration|Kind|Neutral|dimension=0,0,1,0,0,0,0;linear|-\n", + "def|Energy|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|-\n", + "def|Torque|Kind|Neutral|dimension=2,1,-2,0,0,0,0;linear|-\n", + "def|ms|Unit|Neutral|millis=1|Duration\n", + "def|s|Unit|Neutral|millis=1000|Duration\n", + "def|Flag|Scalar|OA|Boolean|-\n", + "def|Alarm|Item|OA|Flow|Code\n", + "def|Code|Field|OA|minimum=1;maximum=1|Alarm,Flag\n", + "def|Interface|Interface|OA|-|Operation\n", + "def|Operation|Allocation|OA|order=0|Interface,Alarm\n", + "prototype|A|record|A|OA|Watch|Activity|Monitor alarm\n", + "prototype|E|record|E|OA|Alarm|Interaction|A|H|MOUNT/Alarm\n", + "prototype|P|record|P|OA|Elapsed|Property|A|SELF:Duration|750@SELF:ms\n", + "prototype|C|record|C|OA|Stress|Case|-|P=1250@SELF:ms\n", + "prototype|K|record|K|OA|Elapsed limit|Check|P|1000@SELF:ms\n", + "prototype|H|record|H|OA|Prototype receiver|Activity|Context role only\n", + "prototype|Q|record|Q|OA|Outside delay|Property|H|SELF:Duration|1000@SELF:ms\n", + "prototype|G|record|G|OA|Project-wide study|Case|-|P=2500@SELF:ms,Q=4000@SELF:ms\n", + "pattern|monitor|A,E,P,C,K\n", + "analysis|P|K|C\n", + "role|sink|H|Activity|OA\n" + ); + let p1 = Package::parse(raw.into())?; + let p2 = Package::parse( + raw.replace("1.0.0", "1.0.1") + .replace("Initial documentation", "Revised documentation only"), + )?; + let p3 = Package::parse( + raw.replace("1.0.0", "2.0.0") + .replace("maximum=1", "maximum=2"), + )?; + let changed_kind = + Package::parse(raw.replace("dimension=0,0,1,0,0,0,0", "dimension=1,0,0,0,0,0,0"))?; + let other = Package::parse(raw.replace("ControlPatterns", "OtherVocabulary"))?; + check!(p1.digest != p2.digest && p1.raw != p2.raw); + for member in p1.definitions.keys() { + check!(equivalent(&p1, member, &p2, member)); + } + check!(!equivalent(&p1, "Duration", &p1, "Energy")); + check!(!equivalent(&p1, "Energy", &p1, "Torque")); + check!(!equivalent(&p1, "Duration", &other, "Duration")); + check!(!equivalent(&p1, "Duration", &changed_kind, "Duration")); + check!(!equivalent(&p1, "Interface", &p3, "Interface")); + check!(equivalent(&p1, "Duration", &p3, "Duration")); + let packages = BTreeMap::from([("D1".into(), p1.clone()), ("D2".into(), p2.clone())]); + let request = "new|Alpha\nimport|controls1|D1\nmount|data1|controls1\nactivity|sink_left|Receive left\nactivity|sink_right|Receive right\ninstantiate|left|controls1|data1|sink_left\ninstantiate|right|controls1|data1|sink_right\nbudget|budget|left/P|right/P|controls1\nconsumer|outside|left/E|data1\nglobal_case|global|left/P\nreceipt|create-two-instances\n"; + write(&root.join("initial.request"), request)?; + let initial = prepare_new(&read(&root.join("initial.request"))?, &packages)?; + let expected_initial_rows = [ + "record|sink_left|OA|Receive left|Activity|", + "record|sink_right|OA|Receive right|Activity|", + "record|left/A|OA|left Watch|Activity|Monitor alarm", + "record|left/E|OA|left Alarm|Interaction|left/A|sink_left|data1/Alarm", + "record|left/P|OA|left Elapsed|Property|left/A|controls1:Duration|750@controls1:ms", + "record|left/C|OA|left Stress|Case|-|left/P=1250@controls1:ms", + "record|left/K|OA|left Elapsed limit|Check|left/P|1000@controls1:ms", + "record|right/A|OA|right Watch|Activity|Monitor alarm", + "record|right/E|OA|right Alarm|Interaction|right/A|sink_right|data1/Alarm", + "record|right/P|OA|right Elapsed|Property|right/A|controls1:Duration|750@controls1:ms", + "record|right/C|OA|right Stress|Case|-|right/P=1250@controls1:ms", + "record|right/K|OA|right Elapsed limit|Check|right/P|1000@controls1:ms", + "record|budget|OA|Combined duration|Budget|left/P|right/P|controls1:Duration|2000@controls1:ms", + "record|outside|OA|Outside typed receiver|Consumer|left/E|data1/Interface|data1/Operation|data1/Code", + "record|global|OA|Unrelated project-wide study|Case|-|left/P=3000@controls1:ms", + ]; + let expected_initial_live: BTreeMap<_, _> = expected_initial_rows + .iter() + .map(|line| Record::parse(line).map(|r| (r.id.clone(), r))) + .collect::>()?; + check!(initial.live == expected_initial_live); + write( + &root.join("expected-initial.model"), + &(expected_initial_rows.join("\n") + "\n"), + )?; + check!(initial.live.len() == 15); + check!(initial.instances["left"].current.values().all(|id| { + !initial.instances["right"] + .current + .values() + .any(|other| id == other) + })); + check!(evaluate(&initial, "budget")? == (1500, true)); + save(&initial, &root.join("01-initial"))?; + check!(load(&root.join("01-initial"))? == initial); + save( + &load(&root.join("01-initial"))?, + &root.join("01-recompiled"), + )?; + check!( + read(&root.join("01-initial/project.model"))? + == read(&root.join("01-recompiled/project.model"))? + ); + write( + &root.join("local-edit.request"), + "edit_base|left/P|900@controls1:ms\n", + )?; + let edited = apply_edit(&initial, &read(&root.join("local-edit.request"))?)?; + check!(edited.instances == initial.instances); + check!(evaluate(&edited, "budget")? == (1650, true)); + save(&edited, &root.join("02-edited"))?; + let request = format!( + "update|left|{}|controls2|data2|2|P.base=keep_local\n", + p1.digest + ); + write(&root.join("selective-update.request"), &request)?; + check!( + update( + &edited, + &request.replace("P.base=keep_local", "unresolved"), + p2.clone() + ) + .is_err() + ); + check!(update(&edited, &request.replace("|2|", "|1|"), p2.clone()).is_err()); + let updated = update( + &edited, + &read(&root.join("selective-update.request"))?, + p2.clone(), + )?; + check!(evaluate_policy(&initial, "budget", &Policy::Strict)? == (1500, true)); + check!(consumer_match_policy(&initial, "outside", &Policy::Strict).is_ok()); + check!(evaluate_policy(&updated, "budget", &Policy::Strict).is_err()); + check!(consumer_match_policy(&updated, "outside", &Policy::Strict).is_err()); + check!(evaluate(&updated, "budget")? == (1650, true)); + check!(evaluate_check(&updated, "left/K", None)? == (900, true)); + check!(evaluate_check(&updated, "left/K", Some("left/C"))? == (1250, false)); + check!(evaluate_check(&updated, "left/K", Some("global"))? == (3000, false)); + check!(evaluate_check(&updated, "right/K", Some("right/C"))? == (1250, false)); + check!(updated.instances["right"] == edited.instances["right"]); + check!(updated.live["right/P"] == edited.live["right/P"]); + for id in ["outside", "budget", "global", "sink_left", "sink_right"] { + check!(updated.live[id] == edited.live[id]); + } + for (member, current) in &edited.instances["left"].current { + check!(updated.instances["left"].current[member] == *current); + } + let Body::Property { kind, base, .. } = &updated.live["left/P"].body else { + unreachable!() + }; + check!(kind == &DRef::new("controls2", "Duration")); + check!(base == &Literal::new(900, "controls1", "ms")); + let Body::Property { base, .. } = &updated.instances["left"].base["P"].body else { + unreachable!() + }; + check!(base == &Literal::new(750, "controls2", "ms")); + check!(updated.instances["left"].import == "controls2"); + check!( + consumer_match(&updated, "outside")? + == BTreeMap::from([ + ("data1/Alarm".into(), "data2/Alarm".into()), + ("data1/Code".into(), "data2/Code".into()), + ("data1/Flag".into(), "data2/Flag".into()), + ("data1/Interface".into(), "data2/Interface".into()), + ("data1/Operation".into(), "data2/Operation".into()) + ]) + ); + save(&updated, &root.join("03-updated"))?; + check!(load(&root.join("03-updated"))? == updated); + // Independently authored expectations: no materialize()/update() call supplies these rows. + let expected_rows = [ + "record|left/P|OA|left Elapsed|Property|left/A|controls2:Duration|900@controls1:ms", + "record|left/E|OA|left Alarm|Interaction|left/A|sink_left|data2/Alarm", + "record|left/C|OA|left Stress|Case|-|left/P=1250@controls2:ms", + "record|left/K|OA|left Elapsed limit|Check|left/P|1000@controls2:ms", + "record|right/P|OA|right Elapsed|Property|right/A|controls1:Duration|750@controls1:ms", + "record|budget|OA|Combined duration|Budget|left/P|right/P|controls1:Duration|2000@controls1:ms", + "record|outside|OA|Outside typed receiver|Consumer|left/E|data1/Interface|data1/Operation|data1/Code", + ]; + for line in expected_rows { + let expected = Record::parse(line)?; + check!(updated.live[&expected.id] == expected); + } + write( + &root.join("expected-key-records.model"), + &(expected_rows.join("\n") + "\n"), + )?; + // Full independent graph oracle, including every accepted baseline and management map. + let mut expected_live = expected_initial_live; + for line in expected_rows { + let r = Record::parse(line)?; + expected_live.insert(r.id.clone(), r); + } + let expected_mounts = BTreeMap::from([ + ( + "data1".into(), + Mount { + import: "controls1".into(), + members: BTreeMap::from([ + ("Alarm".into(), "data1/Alarm".into()), + ("Code".into(), "data1/Code".into()), + ("Flag".into(), "data1/Flag".into()), + ("Interface".into(), "data1/Interface".into()), + ("Operation".into(), "data1/Operation".into()), + ]), + }, + ), + ( + "data2".into(), + Mount { + import: "controls2".into(), + members: BTreeMap::from([ + ("Alarm".into(), "data2/Alarm".into()), + ("Code".into(), "data2/Code".into()), + ("Flag".into(), "data2/Flag".into()), + ("Interface".into(), "data2/Interface".into()), + ("Operation".into(), "data2/Operation".into()), + ]), + }, + ), + ]); + let mut expected_instances = BTreeMap::new(); + for (prefix, import, mount, sink) in [ + ("left", "controls2", "data2", "sink_left"), + ("right", "controls1", "data1", "sink_right"), + ] { + let original: BTreeMap = ["A", "C", "E", "K", "P"] + .into_iter() + .map(|m| (m.into(), format!("{prefix}/{m}"))) + .collect(); + let mut base: BTreeMap = original + .iter() + .map(|(m, id)| (m.clone(), expected_live[id].clone())) + .collect(); + if prefix == "left" { + base.insert("P".into(), Record::parse("record|left/P|OA|left Elapsed|Property|left/A|controls2:Duration|750@controls2:ms")?); + } + expected_instances.insert( + prefix.into(), + Instance { + import: import.into(), + mount: mount.into(), + sink: sink.into(), + prefix: prefix.into(), + current: original + .iter() + .map(|(m, id)| (m.clone(), Some(id.clone()))) + .collect(), + lineage: original + .values() + .map(|id| (id.clone(), id.clone())) + .collect(), + original, + base, + }, + ); + } + let expected_full = Document { + identity: "Alpha".into(), + revision: 3, + imports: BTreeMap::from([ + ("controls1".into(), p1.clone()), + ("controls2".into(), p2.clone()), + ]), + mounts: expected_mounts, + instances: expected_instances, + live: expected_live, + receipts: vec![ + "create-two-instances".into(), + "edit_base|left/P|900@controls1:ms".into(), + request.trim().into(), + ], + }; + check!(updated == expected_full); + save(&expected_full, &root.join("expected-full-updated"))?; + // Unchanged exact identity remains a stricter relation than compatibility. + check!(updated.imports["controls1"].digest != updated.imports["controls2"].digest); + check!(DRef::new("controls1", "Duration") != DRef::new("controls2", "Duration")); + check!(updated.mounts["data1"].members["Alarm"] != updated.mounts["data2"].members["Alarm"]); + check!(update(&edited, &request, p3.clone()).is_err()); + let mut forged = updated.clone(); + forged + .instances + .get_mut("left") + .unwrap() + .base + .get_mut("P") + .unwrap() + .name = "Forged history".into(); + check!(admit(&forged).is_err()); + let mut forged = updated.clone(); + forged.imports.get_mut("controls1").unwrap().raw.push(' '); + check!(admit(&forged).is_err()); + let mut forged_parsed = updated.clone(); + forged_parsed + .imports + .get_mut("controls1") + .unwrap() + .definitions + .get_mut("Alarm") + .unwrap() + .layer = "SA".into(); + check!(admit(&forged_parsed).is_err()); + let mut label_collision = updated.clone(); + label_collision.imports.insert( + "conflicting_version".into(), + Package::parse( + p1.raw + .replace("Initial documentation", "Another revision claiming 1.0.0"), + )?, + ); + check!(admit(&label_collision).is_err()); + let mut collision = updated.clone(); + collision + .instances + .get_mut("left") + .unwrap() + .current + .insert("P".into(), Some("right/P".into())); + check!(admit(&collision).is_err()); + let mut missing = updated.clone(); + missing.imports.remove("controls1"); + check!(admit(&missing).is_err()); + let mut other_local_edits = edited.clone(); + let property = other_local_edits.live.get_mut("left/P").unwrap(); + property.name = "Local measurement name".into(); + let Body::Property { subject, .. } = &mut property.body else { + unreachable!() + }; + *subject = "sink_left".into(); + let twice_edited = update(&other_local_edits, &request, p2.clone())?; + check!(twice_edited.live["left/P"].name == "Local measurement name"); + let Body::Property { subject, .. } = &twice_edited.live["left/P"].body else { + unreachable!() + }; + check!(subject == "sink_left"); + let mut extended = edited.clone(); + extended.live.insert( + "local_extra".into(), + Record { + id: "local_extra".into(), + layer: "OA".into(), + name: "left Watch".into(), + body: Body::Activity { + description: "Independent extension".into(), + }, + }, + ); + let extended_update = update(&extended, &request, p2.clone())?; + check!(extended_update.live["local_extra"] == extended.live["local_extra"]); + let mut dangling = edited.clone(); + dangling.live.remove("left/E"); + dangling + .instances + .get_mut("left") + .unwrap() + .current + .insert("E".into(), None); + check!(admit(&dangling).is_err()); + // Explicit reidentify changes live references/current map/lineage, never base or foreign origins. + let mut reidentified = edited.clone(); + let mut moved = reidentified.live.remove("left/A").unwrap(); + moved.remap_live("left/A", "left/A2"); + reidentified.live.insert(moved.id.clone(), moved); + for record in reidentified.live.values_mut() { + record.remap_live("left/A", "left/A2"); + } + let i = reidentified.instances.get_mut("left").unwrap(); + i.current.insert("A".into(), Some("left/A2".into())); + i.lineage.insert("left/A".into(), "left/A2".into()); + check!(admit(&reidentified).is_ok()); + check!(reidentified.instances["left"].base == edited.instances["left"].base); + check!(reidentified.imports == edited.imports); + let mut reused = reidentified.clone(); + reused.live.insert( + "left/A".into(), + Record { + id: "left/A".into(), + layer: "OA".into(), + name: "New object".into(), + body: Body::Activity { + description: String::new(), + }, + }, + ); + check!(admit(&reused).is_err()); + save(&reidentified, &root.join("04-reidentified"))?; + check!(load(&root.join("04-reidentified"))? == reidentified); + let reupdated = update(&reidentified, &request, p2.clone())?; + check!(reupdated.live.contains_key("left/A2") && !reupdated.live.contains_key("left/A")); + // A deleted member remains reserved; no implicit resurrection or name adoption. + let mut deleted = edited.clone(); + deleted.live.remove("left/K"); + deleted + .instances + .get_mut("left") + .unwrap() + .current + .insert("K".into(), None); + check!(admit(&deleted).is_ok()); + check!(update(&deleted, &request, p2.clone()).is_err()); + deleted.live.insert( + "left/K".into(), + Record { + id: "left/K".into(), + layer: "OA".into(), + name: "Same-looking new check".into(), + body: Body::Check { + property: "right/P".into(), + limit: Literal::new(1000, "controls1", "ms"), + }, + }, + ); + check!(admit(&deleted).is_err()); + // Subjectless C/K are included only by explicit selection; G is never inverse-pulled. + check!(analysis_scope(&["P"], &[], &[], &[])? == BTreeSet::from(["P".into()])); + check!( + analysis_scope(&["P"], &["K"], &["C"], &[])? + == BTreeSet::from(["P".into(), "K".into(), "C".into()]) + ); + check!(analysis_scope(&[], &[], &["G"], &[]).is_err()); + check!(analysis_scope(&[], &[], &["G"], &["Q"])? == BTreeSet::from(["G".into(), "P".into()])); + // Layer transformation has independent provenance and mutability, not implicit compatibility. + let sa = derivative(&p2); + check!(!sa.mount && sa.layer == "SA" && sa.origin_pin == p2.digest); + check!(sa.records.len() == 5 && sa.origin_map.len() == 5); + let mut sa_raw = + String::from("package|ControlPatternsSA|1.0.1\ndescription|Explicit SA counterpart\n"); + for d in sa.records.values() { + sa_raw += &format!( + "def|{}|{}|{}|{}|{}\n", + d.member, + d.class, + d.layer, + d.fields.join(","), + d.refs.join(",") + ); + } + let sa_package = Package::parse(sa_raw)?; + let pinned = pinned_counterpart(&p2, &sa_package, &sa.origin_map)?; + check!( + pinned.mount + && pinned.records == sa.records + && pinned.target_pin == Some(sa_package.digest.clone()) + ); + check!(!equivalent(&p2, "Alarm", &sa_package, "SA/Alarm")); + let mut incomplete = sa.origin_map.clone(); + incomplete.remove("Code"); + check!(pinned_counterpart(&p2, &sa_package, &incomplete).is_err()); + let mut refined = sa.clone(); + refined.records.get_mut("SA/Code").unwrap().fields = vec!["minimum=1;maximum=2".into()]; + let refined_package = Package::parse(sa_package.raw.replace("maximum=1", "maximum=2"))?; + check!(pinned_counterpart(&p2, &refined_package, &sa.origin_map).is_err()); + check!(derivative(&p2).records == sa.records); // Explicit reverse BindPinned may reuse the original unchanged OA contract. + check!(derivative(&p2).records != refined.records); // Reverse transition of an edited derivative must not mutate the original mount. + let pinned_architecture = target_architecture(&pinned)?; + let local_architecture = target_architecture(&sa)?; + check!(pinned_architecture.len() == 5 && local_architecture.len() == 5); + check!( + pinned_architecture["sa/alarm"] + == TargetRecord::FunctionalExchange { + source: "sa/watch".into(), + target: "sa/receive".into(), + source_port: "sa/watch_out".into(), + target_port: "sa/receive_in".into(), + item: "sa_mount/SA/Alarm".into() + } + ); + check!( + local_architecture["sa/alarm"] + == TargetRecord::FunctionalExchange { + source: "sa/watch".into(), + target: "sa/receive".into(), + source_port: "sa/watch_out".into(), + target_port: "sa/receive_in".into(), + item: "SA/Alarm".into() + } + ); + let mut wrong_layer = sa.clone(); + wrong_layer.records.get_mut("SA/Alarm").unwrap().layer = "OA".into(); + check!(target_architecture(&wrong_layer).is_err()); + check!(sa == derivative(&p2)); // Original source/package revisions have not mutated the captured derivative. + check!(derivative(&p3).records != sa.records); + let mut illegal = p2.clone(); + illegal.definitions.get_mut("Alarm").unwrap().layer = "SA".into(); + check!(!equivalent(&p2, "Alarm", &illegal, "Alarm")); + write( + &root.join("oa-sa-transition.model"), + &format!( + "pinned-counterpart={pinned:#?}\npinned-architecture={pinned_architecture:#?}\nlocal-derivative={sa:#?}\nlocal-architecture={local_architecture:#?}\nrefined-derivative={refined:#?}\n" + ), + )?; + // Checked identity bridges are scoped direct witnesses, not unverified flags or dimension casts. + let bridge = |a: &Package, am: &str, b: &Package, bm: &str| -> Result { + if equivalent(a, am, b, bm) { + Ok(format!( + "checked-same-origin|{}|{am}|{}|{bm}", + a.digest, b.digest + )) + } else { + Err("bridge proof failed".into()) + } + }; + check!(bridge(&p1, "Duration", &p2, "Duration").is_ok()); + check!(bridge(&p1, "Interface", &p2, "Interface").is_ok()); + check!(bridge(&p1, "Energy", &p1, "Torque").is_err()); + check!(bridge(&p1, "Interface", &p3, "Interface").is_err()); + let witnesses = BTreeSet::from([ + pair( + &format!("{}:Duration", p1.digest), + &format!("{}:Duration", p2.digest), + ), + pair( + &format!("{}:Interface", p1.digest), + &format!("{}:Interface", p2.digest), + ), + ]); + let explicit_policy = Policy::Bridges(witnesses); + check!(evaluate_policy(&updated, "budget", &explicit_policy)? == (1650, true)); + check!(consumer_match_policy(&updated, "outside", &explicit_policy).is_ok()); + check!(evaluate_policy(&updated, "budget", &Policy::Bridges(BTreeSet::new())).is_err()); + check!(consumer_match_policy(&updated, "outside", &Policy::Bridges(BTreeSet::new())).is_err()); + // Qualified layered definitions have the same compatibility/layer obligations without materialized IDs. + check!(policy_matches( + &p1, + "Interface", + &p2, + "Interface", + &Policy::SameOrigin + )); + check!(!policy_matches( + &p1, + "Interface", + &p2, + "Interface", + &Policy::Strict + )); + check!(p2.definitions["Alarm"].layer != "SA"); + check!(sa_package.definitions["SA/Alarm"].layer == "SA"); + let bridge_text = format!( + "{}\n{}\n", + bridge(&p1, "Duration", &p2, "Duration")?, + bridge(&p1, "Interface", &p2, "Interface")? + ); + write(&root.join("explicit-bridges.model"), &bridge_text)?; + // Stable vocabulary separates pattern bytes from definition provenance, but vocabulary changes still need the same decision. + let vocabulary_pin = p1.digest.clone(); + let pattern1 = ("PatternRevision1", vocabulary_pin.clone()); + let pattern2 = ("PatternRevision2", vocabulary_pin.clone()); + check!(pattern1.0 != pattern2.0 && pattern1.1 == pattern2.1); + check!(pattern1.1 != p3.digest); + let results = format!( + "# Finite-model results\n\nAssertions passed: {checks}\n\nInitial budget: 1500 ms, satisfied.\nAfter one local base edit: 1650 ms, satisfied.\nAfter selected cosmetic update: 1650 ms, satisfied; exact pins differ.\nOutside budget/consumer/global case: exact records unchanged.\nUpdated left baseline: 750 controls2:ms; current: 900 controls1:ms; declared kind controls2:Duration.\nRight instance/base/map: exact original.\nContract path projection: data1/Code -> data2/Code and data1/Operation -> data2/Operation.\nChanged field cardinality: selective candidate rejected.\nStrict revision identity: old/new refs unequal.\nSame-origin typed compatibility: cosmetic revision accepted; Energy/Torque, other origin, changed contract rejected.\nBridge alternative: 2 explicit validated direct witnesses; changed contracts rejected.\nStable vocabulary alternative: exact common pin survives pattern change; vocabulary change remains unresolved without compatibility/migration.\nSubjectless explicit C+K selected; unrelated G omitted; selected G requires Q boundary.\nOA/SA: explicit pinned counterpart or independent local derivative; refined reverse counterpart fails exact transformed contract.\n\nD1: {}\nD2: {}\nD3: {}\n\nThis dialect uses opaque symbolic identities, a restricted AST, one package per import and scalar integer-millisecond arithmetic. It is not Studio source, a full package dependency solver, production UUID allocation, complete data/operation/transition admission, REST or native acceptance.\n", + p1.digest, p2.digest, p3.digest + ); + write(&root.join("RESULTS.md"), &results)?; + write(&root.join("package-D1.library"), &p1.raw)?; + write(&root.join("package-D2.library"), &p2.raw)?; + write(&root.join("package-D3.library"), &p3.raw)?; + write(&root.join("package-SA.library"), &sa_package.raw)?; + println!( + "{checks} assertions passed\nD1={}\nD2={}\nD3={}", + p1.digest, p2.digest, p3.digest + ); + Ok(()) +} diff --git a/harness/release-analysis-baseline-contract-20260911.md b/harness/release-analysis-baseline-contract-20260911.md new file mode 100644 index 00000000..17b781ed --- /dev/null +++ b/harness/release-analysis-baseline-contract-20260911.md @@ -0,0 +1,305 @@ +# Analysis baseline, effective cases and complete freezing: candidate contract + +Codex-956atf /root/requirements_delta, 2026-09-11. Ownership: this report and the isolated [analysis-baseline fixtures](experiments/analysis-baseline-20260911/). No production, Cargo, native, prior frozen report, ledger, commit or push changes. Read current goal, Gitea issue #1 through #131, the [218-assertion context experiment](release-analysis-context-experiment-20260911.md), [paired review](release-semantic-proposals-review-20260910.md), current reference/session/source/API boundaries, and coordinated the library contract with /root/library_compatibility. Root selected B as the next active-study architecture; this document closes a candidate for criticism and implementation, not a shipped capability or final release scope. + +The experiment supports B's reduction in repeated assumptions: 62 versus 480 bindings in the controlled twenty-case task. It also falsifies evaluation of an inherited formula in its baseline context and demonstrates why a shallow copy cannot freeze a study. It does not prove native usability, actual Studio source admission, numeric/unit behavior or package correctness. Its factored D variant correctly changes a shared threshold in one definition; do not justify B by denying that result. + +## 1. Normative candidate and boundaries + +**Each EngineeringProperty owns one explicit base binding. ModelBaseline means the collection of those bindings in the captured project. A Case selects that same collection and replaces exactly its listed bindings. The evaluator always receives ModelBaseline or Case(id) explicitly. Checks are shared identified predicates, independent of cases.** + +There is no separately created AnalysisBaseline element, baseline UUID, selected/default case, case inheritance, property fallback search, or implicit connection to a DataValue/default/unit string. A baseline context has identity without requiring an extra authored record: the model identity, captured accepted document identity and ModelBaseline selector identify it. Two captures of the same project at different accepted revisions are different evaluation contexts even if the baseline arithmetic happens to match. + +Retain the existing proposed pure definitions, typed expressions and quantities, with the amendments below. Source/JSON names are concrete candidates. Schema 8 in the fixtures denotes the proposed successor to inspected source7, not an already allocated production version. Root must assign the actual next schema version with the combined library/language change. + +~~~rust +enum Binding { Unbound, Expression(Expr) } // required; literal is an Expr leaf +enum BaselineBase { ModelBaseline } // one admitted variant +enum EvaluationContext { ModelBaseline, Case(Id) } +enum AnalysisSubject { Element(Id), Relation(Id) } +enum ScalarType { Boolean, Number, Quantity(DefinitionRef) } +enum AnalysisType { Scalar(ScalarType), List(ScalarType) } // finite, flat + +// New SharedBody variants in existing OA/SA Elements, each with parent == None: +EngineeringProperty { + subject: AnalysisSubject, + value_type: AnalysisType, + display_unit: Option, + base: Binding, +}, +AnalysisCase { + subject: Option, + base: BaselineBase, + overrides: BTreeMap, // EngineeringProperty IDs; duplicate keys reject +}, +AnalysisCheck { + subject: Option, + documented_constraint: Option, + predicate: Binding, // required Boolean expression, or Unbound +}, + +// Neutral Project.definitions catalog; library import/mount/instance additions +// use the paired library contract. Parameters are scoped, not Elements. +struct Definition { id: Id, alias: String, name: String, description: String, + body: DefinitionBody } +enum DefinitionBody { + QuantityKind(QuantityKindDefinition), Unit(UnitDefinition), + Calculation(CalculationDefinition), +} +struct Parameter { id: ParameterId, name: String, value_type: AnalysisType } +struct CalculationDefinition { + parameters: Vec, result: AnalysisType, body: Binding, +} +enum DefinitionRef { + Local(Id), + Imported { import: Id, package: PackageId, member: Id }, +} +struct EvaluationTargets { properties: Vec, checks: Vec } +struct EvaluationRequest { + context: EvaluationContext, targets: EvaluationTargets, + numeric_profile: ProfileId, +} +~~~ + +The scalar/Expr/unit structures and exact rational wire representation remain those in [the earlier proposal, sections 3.2 and 4](release-analysis-semantics-design-20260910.md), except the complete R6 algebra below replaces its incomplete anonymous-type rules. Binding replaces ambiguous optional expressions everywhere. Missing a required base/predicate/body field, supplying null for a Binding, or duplicating an override/argument key rejects. Optional explanatory references may be null. Unknown closed-record fields reject. + +The three analysis kinds are layer-root Elements, preserving the current Element identity/name/alias/description and OA/SA body structure. Property subject is required; case/check subject is optional. Subjects must be existing same-layer semantic Elements or Relations, excluding analysis records. Subjects associate analysis with architecture; they do not create containment, lookup scope, a case selection or an implicit check set. Documented Constraint references must identify a same-layer descriptive Constraint. Formal evaluation uses the check predicate; it does not parse that Constraint's prose. + +Every expression owned by a property/check/case may read only same-layer EngineeringProperties. A Case can be evaluated only with targets in its layer. ModelBaseline may select targets in either/both layers, each retaining separate same-layer dependency graphs. Cross-layer studies require an explicitly reviewed extension; the first integration must not weaken existing layer/reference rules accidentally. Properties are not implicitly restricted to the subjects of the selected check or case. + +Neutral definition IDs share the live project identity reservation domain with existing project records. Parameter IDs are unique within one CalculationDefinition and are qualified by that definition's resolved identity; they are not ordinary project references. Parameter names are unique source identifiers within that definition. Definition aliases follow local source alias uniqueness; imported aliases use the library-qualified resolver. + +## 2. Resolution, shared checks and reusable definitions + +For every property p and explicit context c: + +~~~text +effective(p, ModelBaseline) = p.base +effective(p, Case(k)) = + k.overrides[p], if that key exists; + p.base, otherwise. +~~~ + +The selected binding supplies an expression, not a previously evaluated result. Every Property(q) read recursively evaluates effective(q, c), preserving the original requested c, even when the caller's formula came from p.base. No evaluator API may accept a property ID without an explicit context. A cache key containing only a case's source or override map is invalid. + +| Authored/command state | Meaning | Result when the base is a known value | +| --- | --- | --- | +| Property base is Unbound | The model assumption is explicitly unknown. | Baseline is Missing; an explicit case expression may supply a value. | +| Override key absent | Use that property's base. | The base expression is evaluated in this case. | +| Override key present with Unbound | This case explicitly lacks the value. | Missing; the known base is masked. | +| SetOverride(case, property, Expression(expr)) | Create/replace one override. | Use expr in the case. | +| ClearOverride(case, property) | Remove the override key; absent key is an exact no-op. | Use the base. Clearing a key whose base is Unbound remains Missing. | +| SetBase(property, Unbound) | Change the model assumption to unknown. | Affects baseline and cases that do not override it. | + +Clear is an editing operation, never a persisted third Binding state or null synonym. In full source/JSON replacement, removing an override row is Clear; writing unbound is SetOverride(Unbound). There is no ResetBaseToDefault operation because there is no hidden default. Text and GUI must name these two actions distinctly. + +Proposed narrow Command variants are SetAnalysisBase { property, binding }, SetAnalysisOverride { case, property, binding } and ClearAnalysisOverride { case, property }, using existing externally tagged command JSON and batch admission. The table's shorter names describe these operations. For example, the complete clear command is {"ClearAnalysisOverride":{"case":"99d3e09a-0ec3-4194-9dd4-9f3de6625cde","property":"63a931c2-675a-4fce-89e5-04361cb99450"}}. Ordinary record creation/deletion continues through the shared typed command boundary; source replacement must produce the same accepted result and revision behavior. + +One AnalysisCheck ID identifies one predicate, optionally linked to one documented requirement, evaluated in any explicitly selected compatible context. Cases do not own checks or check lists. Evaluation targets explicitly identify the checks to run. To vary a threshold, use an ordinary typed threshold property and a case override; to express a different predicate, deliberately create/edit a different check. This avoids silently duplicating the same requirement predicate in every case. The example uses four properties (including the threshold), two cases and one shared check. + +CalculationDefinition bodies are pure: they may use scoped Parameter nodes, literals, operators and calls to other definitions; they cannot read Property/Check/Case nodes or capture a project, UI state, file, clock or network. Every call supplies exactly one argument for every declared parameter, with no extra/missing keys or parameter default lookup. Source argument names resolve to stable ParameterIds. All arguments evaluate in the caller's effective context; after that the body sees parameter values only. Declared argument/result types are enforced at the boundary. A Boolean result can be called by a check. + +Parameters have explicit stable IDs after admission. Renaming one changes the scoped declaration/use tokens, including named arguments at call sites, while preserving the ID. Reordering the parameter list preserves call meaning because arguments are keyed by ID; it may change presentation and the specified strict-argument evaluation order. Changing a parameter's type or deleting it must validate/repair all calls atomically. An Unbound definition body is admitted as an incomplete definition and produces a located Missing cause; it is not a silently uninterpreted foreign function. + +## 3. Admission, deletion and outcomes + +Admission validates the baseline dependency graph and the complete effective graph for every stored case in that layer. It cannot validate the baseline and override fragments independently. A baseline edit can create a cycle in an otherwise unchanged case, so every affected effective graph must be rechecked before the one candidate is accepted. An implementation may use sound incremental validation, but its answer must equal full validation. + +All stored references and expression types are checked, including shadowed base expressions, unused branches and overrides outside the current target selection. Property edges come from typed Property nodes. Checks depend on properties; properties cannot read checks. Pure calculation call graphs must be acyclic. Cycles reject even if the cycle's branch would not execute for current values. This deliberately makes validity independent of a transient numeric input or chosen target. Unbound and an evaluated false predicate are both valid authored states; warnings may identify incomplete records. + +| Operation | Required invariant | +| --- | --- | +| Delete a property used by a formula, check or override map | Reject unless the same explicit batch repairs/removes the dependent references or records. Never silently prune a sum term, formula operand or override row. | +| Delete/reidentify a subject | Require explicit removal/rebinding of associated analysis links, or a valid typed identity remap in the same batch. Association is not automatic deletion ownership. | +| Delete a Case | Leaves properties, their bases and shared checks intact. Live references to that Case must be repaired; an external frozen capture remains historical. | +| Delete a unit/kind/calculation/parameter | Repair every live typed use, including display units, definition bodies and calls. An unused display unit is still a live reference. | +| Reidentify a property/case/check/local definition | Update only the corresponding live typed reference categories, including override keys; reject collisions. Do not rewrite UUID-shaped prose or immutable historical snapshots/package bytes. | +| Rename an alias or move an authored declaration between files | Preserve its explicit UUID and exact unaffected source bytes. Use the source index for typed reference tokens; alias text replacement is not an identity operation. | +| OA/SA transition or library export | Use the explicit analysis selection in section 7. Ordinary architectural containment/outgoing references cannot infer subjectless cases/checks. | + +Strict operators evaluate their operands left to right; calls evaluate arguments in parameter declaration order and lists in element order. For a strict node, collect nonvalue causes from its required children before producing a nonvalue; do not perform the numeric operation when a required child has no value. If a call's body is Unbound, add that missing-body cause as well. Boolean and conditional control flow is different: if/and/or evaluates only the branch selected by a known controlling Boolean. A missing/failed condition propagates without inventing a branch. Thus true || unknown is true, while unknown || true is Missing. Both branches remain statically checked. + +~~~rust +enum ValueOutcome { + Value(AnalysisValue), + Missing { causes: NonEmpty }, + Failed { causes: NonEmpty }, // at least one supported-operation failure +} +enum CheckOutcome { + Satisfied, Violated, + Unresolved { causes: NonEmpty }, +} +~~~ + +Missing causes identify an Unbound property binding, check predicate or definition body. Supported-operation failures include division by zero, zero to a negative power, 0^0 and NumericLimit. These are evaluation failures, not false requirements. If a strict expression encounters both missing inputs and a failure, Failed retains both classified causes rather than losing the missing information. Causes are deduplicated by typed origin/location and ordered deterministically; a bounded dependency trace identifies consulted expressions and branches without enumerating exponentially many paths. + +Only Boolean true/false produces Satisfied/Violated. Every nonvalue check is Unresolved with the original causes. An empty requested check list is allowed when properties are requested, and must be described as no checks; an entirely empty or duplicate target selection rejects. Invalid source/type/reference/cycle is an admission/request rejection, not an evaluated Failed value. Q1's closed AST contains only supported operations: an unknown function is a located rejection, while a request for an unavailable numeric profile/conversion is an explicit capability rejection. Do not fabricate an admitted unsupported Expr node to hide missing mathematics. + +## 4. R6: closed internal dimension and operator algebra + +This section is a complete candidate for the exact profile's internal scalar types. It does not infer physical quantity kinds from equal dimensions. + +| Symbol | Internal type | +| --- | --- | +| B | Boolean | +| N | Exact dimensionless Number | +| L(K,d) | Named linear quantity with verified nominal kind key K and dimension d | +| P(K,J,d) | Named affine point kind K with declared linear difference kind J and dimension d | +| A(d) | Anonymous linear intermediate with dimension d, permitted only inside expressions | + +Dimension d is the fixed seven-component integer vector (length, mass, time, electric current, temperature, amount, luminous intensity), each component in -32 through 32. **A(0) is immediately normalized to N**, so there are not two anonymous dimensionless types. A named dimensionless L(K,0) remains named and distinct from N. + +For local kinds, K includes local identity within the captured private project. For imports, sameness uses the paired library contract's verified equivalence key: contract profile, nominal package/member/class origin and canonical rooted typed interpretation graph. Names, comments and archive revisions alone do not determine equivalence; different origins remain distinct even with identical dimensions. Coordinate basis, algebra and difference-kind closure must agree. Exact DefinitionRefs/pins remain provenance. This is the sibling's recommended R2 policy, still requiring root ratification and an executable conformance gate; do not substitute hash-only/name/dimension comparison. + +Public property/call outputs retain their declared kind reference and its verified key. Internal arithmetic uses K; it does not arbitrarily choose the left operand's archive revision as a result identity. This makes same-origin compatible revisions usable without discarding exact pins. An incompatible coordinate basis requires explicit migration, never this equality relation. + +In the table, “same” means identical normalized internal type, including the verified nominal key where present. Every unlisted combination rejects during typing; there are no coercions through JSON numbers, unit strings, Boolean truthiness or list broadcasting. + +| Operation | Permitted operands and result | +| --- | --- | +| Unary minus, abs | N, L(K,d), A(d); preserve type. P and B reject. | +| Logical not | B -> B. | +| Add/subtract, ordinary linear operands | N/N -> N; L(K,d)/same -> same L; A(d)/same -> same A, normalized at d=0. Named/anonymous mixtures and different named kinds reject. | +| Affine arithmetic | P(K,J,d) - same P -> L(J,d); P +/- L(J,d) -> same P; L(J,d) + P -> P. P+P, L-P and other point/interval combinations reject. | +| Multiply/divide, both N | N. Division's zero-domain check is at evaluation. | +| Multiply by N; divide by N | N times L or A, L or A times N, and L or A divided by N preserve the non-Number type. | +| N divided by L or A | A(-d), normalized; a named dimensionless denominator therefore yields N. | +| Product/quotient of two non-Number linear operands | Any L/L, L/A, A/L or A/A yields A(d1+d2) for product or A(d1-d2) for quotient, normalized. No named result is guessed. | +| Integer power | Exponent must be a syntactic integer in -16..16. N stays N. L/A power 0 -> N, power 1 preserves type, all other powers -> A(n*d), normalized. Every point power rejects, including exponent 1. Zero-domain failures are evaluated separately. | +| Numeric order and equality/inequality | N/N, same L, same P, same A -> B. Differently typed numerical values reject, even if their magnitudes happen to be equal. | +| Boolean equality/inequality | B/B -> B. Boolean ordering and list equality reject. | +| and/or | B/B -> B, with the conditional evaluation rule above. | +| if | B condition; both branch types must be the same normalized internal type. Result has that type. There is no inferred common named/anonymous supertype. | +| AsKind(K, value) | Target must be a linear kind. A(d) -> L(K,d) only for matching dimensions. N -> L(K,0) is allowed explicitly, closing the A(0) normalization case. A named operand or affine target rejects, even for a redundant same-name assertion. | +| List construction | Flat, homogeneous exact internal scalar type; no implicit element conversion. An empty list requires a type from its declared destination/call parameter or the explicit Sum initial value. Otherwise reject ambiguous empty type. | +| Sum(list, initial) | Both element type and initial must match N, L or A exactly. Returns that type; empty list returns initial. P/B lists cannot be summed. | +| Assignment, call parameter/result, public property output | Must match the declared Scalar/List(Boolean/Number/Quantity) type. A nonzero anonymous dimension requires AsKind before this boundary. No public anonymous quantity type is introduced. | + +Anonymous addition/comparison is intentional. For example L(Force)*L(Length) + L(Force)*L(Length) produces A(energy-dimension), and one outer AsKind(Energy, ...) is sufficient. A product followed by a quotient stays legal without intervening casts. A quotient of different named kinds with equal dimensions yields N; this is explicit dimensional algebra, not permission to add or directly compare those named kinds. An author can deliberately form Energy/Torque as a scalar ratio, but Energy + Torque and Energy == Torque remain invalid. + +Unit coordinate conversion remains exact magnitude*scale+offset. Linear units require positive rational scale and zero offset. Affine point units use the point kind's coherent basis and declared difference kind; point subtraction yields an interval. Display units must be compatible with the declared quantity type, never choose input interpretation, and cannot alter authored literal magnitude/unit. + +Q1 retains normalized exact rationals with 4096-bit reduced numerator/denominator, canonical decimal string wire components, 1234-digit literal-component maximum with actual bit checking, canonical integer/ratio source closure, finite expression/list/call limits, and no global epsilon. The R7 literal 10^300 and 1/(2^4095) must preserve literal AST identity through source and JSON. 0^0 is explicitly a runtime DomainError in this refinement, removing the earlier proposal's ambiguity about “rejected.” Dimension/exponent overflow is a typing rejection; numeric magnitude/intermediate budget failure is NumericLimit. These bounds need measured implementation review, not claims of performance. + +One further AST distinction must be explicit: expression minus is Unary(Negate), not an implicit constant-folding rule. The ratio literal constructor accepts a signed integer numerator. Therefore a negative Number literal node canonically emits ratio(-n,d), including when d=1; a Unary(Negate, Number(n)) node emits unary minus. A negative Quantity literal similarly uses a signed ratio magnitude before its unit suffix. This preserves both admitted ASTs without requiring a context-sensitive signed-number lexer. The complete negative-boundary packet exercises the literal case; the implementation gate must also retain a distinct unary-negation node. Direct negative numbers remain concise authored expressions, but source formatting may not silently turn one AST category into the other. + +This exact profile remains a foundation. Degree/radian conversion involving pi, trigonometry and other ordinary engineering approximations require a separately specified approximate profile and validation. The release's declared breadth is not satisfied by labeling those operations unsupported indefinitely. This contract does not ratify an exact-only whole release. + +## 5. Complete examples, source contract and minimum authoring + +The [complete proposed source](experiments/analysis-baseline-20260911/active.arcadia.proposed) starts with a project and all required OA subjects, a local Duration kind, second/millisecond units, one pure calculation with two parameters, four properties, one shared check and two subjectless cases. All **17 identities are actual distinct UUIDs**, including the two scoped parameters. There are no omitted imports, management snapshots, diagrams, externally created subjects or placeholder UUIDs. + +It is 55 lines / 2678 UTF-8 bytes with all UUIDs present: four base bindings, two override bindings and one check predicate. These are fixture counts, not a usability result. The calculation definition is intentionally included to exercise parameter identity; replacing its call with inline addition is legal and removes that optional authoring overhead. A first property needs one property declaration with a visible base value, assuming its subject/type/unit already exist. It does not require a case or reusable calculation. A two-duration budget needs its input/result properties and one check; a separate threshold property is optional until threshold reuse/variation is wanted. + +The [complete candidate portable document](experiments/analysis-baseline-20260911/portable-document.json.proposed) includes every current Project collection, all proposed definition/import/mount/instance collections and exact source. Empty maps are explicit. The paired library catalog's final serde/schema details still require common ratification. A PowerShell constructor built these data fixtures and verified JSON transport, distinct UUID spellings, exact retained source bytes and freeze capsule equality. **It did not parse the proposed grammar, evaluate quantities, verify Project/source equality, or run Studio tests.** The expected observations are hand-derived and explicitly labeled. + +Minimum source rules to add to the normative grammar: + +- A property requires base followed by unbound or an expression. A case requires base ModelBaseline and an overrides block; duplicate property keys reject. A check requires predicate. A calculation requires body; an unfinished body is explicitly unbound. Optional explanatory fields have existing none spelling. +- Local @alias in expression value position resolves only a property; @alias(...) resolves only a calculation; [@alias] on a numeric literal resolves a unit. $name resolves only the current definition's parameter. Subject @alias resolves the unique typed Element/Relation category. Imports use the paired qualified-reference mechanism; no separate analysis-only resolver. +- Calls name parameter aliases, which resolve to IDs; serialized argument maps use those IDs. Keywords ratio(n,d), pow(expr, integer), abs(expr), as_kind(@kind, expr), sum(expr, initial: expr), and if condition then expr else expr lower to the already closed AST. ratio is one exact literal node; division is a distinct operator. +- Precedence from tightest to loosest is atom/call/literal-unit suffix, unary minus/not, multiply/divide, add/subtract, one non-associative comparison, and, or, conditional. Arithmetic is left associative; chained comparisons reject; parentheses preserve grouping. pow avoids an additional exponent associativity rule. Both sides of a conditional are expressions; nested conditionals associate through the grammar, not whitespace. +- A sparse dimension clause names only the seven fixed dimensions and lowers to the existing seven-entry vector; duplicate names/out-of-range exponents reject, omitted components mean zero. This is explicit dimension notation, not quantity-kind inference. +- Fresh initial declarations/parameters may omit IDs only through documented shared source admission that inserts and returns them. Established declarations retain IDs. A raw alias rename with unchanged UUID but unrepaired references rejects; typed rename updates declaration and typed uses atomically. Parameter IDs cannot be silently regenerated by renaming an argument. +- Additions, targeted edits and deletion use the same index/update/history boundary as current source. Preserve unaffected comments, quotes, whitespace, includes and authored decimal spelling. Dirty drafts retain their original context and are never silently evaluated/applied as accepted state. + +Suggested minimal GUI transactions match that text. Add analysis value on a selected subject visibly enters Base, type, value and unit and creates one property in one undo transaction. A budget editor can create its complete properties/check in one batch. Create alternative visibly names Model baseline and records only entered overrides. The inspector/evaluation result names Model baseline or the actual case; a case row shows its effective value and whether its binding is Base or Override. Set unbound and Use baseline are separate controls. Evaluating uses the labeled accepted document and does not apply another pending editor. + +These requirements are additive semantic authoring work, not a promise that a few keywords solve the entire large-model language. The [separate text-only audit](release-textual-authoring-design-20260911.md) still owns namespace, declaration/metadata noise and CLI workflow decisions. No new CLI is claimed here. The production slice must provide the same actions via published API/source tooling without a GUI-generated seed. + +## 6. REST, revision/provenance and explicit freeze + +Candidate read-only routes are POST /api/v1/projects/{resource_id}/analysis/evaluate and POST /api/v1/projects/{resource_id}/analysis/freeze. Both require an exact If-Match for the accepted hosted document the caller selected. This deliberately makes the snapshot selection reviewable; no body field can forge the server revision. Capture the matching immutable document under the existing store boundary, then evaluate/export outside the lock. A concurrent later write does not mutate the capture; the response identifies its original revision/ETag. Missing/stale/malformed preconditions retain existing 428/412/400 behavior. + +The complete evaluation bodies are in [baseline](experiments/analysis-baseline-20260911/evaluate-baseline.json), [degraded](experiments/analysis-baseline-20260911/evaluate-degraded.json) and [unmeasured](experiments/analysis-baseline-20260911/evaluate-unmeasured.json). The degraded body, without omitted IDs: + +~~~json +{ + "context": {"Case": "38036c65-16d4-449c-837b-91eb141c1d93"}, + "targets": { + "properties": ["bd5b68e8-65fc-4e35-9071-a73061316a4b"], + "checks": ["bac0de99-9d2f-4e53-9158-d424ecac61bf"] + }, + "numeric_profile": "Q1-exact-1" +} +~~~ + +The baseline context wire value is the unit variant "ModelBaseline"; a Case value is the single-key object shown. Context and numeric profile are mandatory, and target IDs must be unique/right-kind/current. A semantically invalid request returns 422; a false, Missing or failed supported evaluation returns a successful report with the typed outcome, not a save rejection or HTTP failure. Resource/body budgets and strict JSON handling follow the existing API contract. + +Reports identify model.id; server resource/revision/ETag or local accepted document-instance/revision stamp; requested context, targets and numeric profile; exact definition environment capture; and every consulted binding's origin. Origin distinguishes ModelBaseline from CaseOverride(case), with property ID and source/AST location. A base-origin total formula can read an override-origin receive time; reporting only the formula's origin would conceal the assumptions. Public quantity outcomes use canonical exact coordinates and their declared type reference/key; display conversions are separate derived data. + +One accepted model/source pair receives one document revision under the existing rules. There is no separately maintained mutable baseline revision or mandatory per-property revision. Comment-only edits can produce a different accepted document revision with the same numerical result. A cache key must include the accepted capture, context, targets, profile and exact definition environment, either separately or through one complete document identity. Reidentifying a live model cannot rewrite the origin of an earlier frozen capture. An asynchronous UI discards or visibly marks a result from a superseded capture. + +**Preferred first freeze is a whole immutable accepted PortableDocument capture, with explicit context/targets/profile and a validated complete effective-binding manifest.** It is an exported artifact, not a new live baseline/case/check element or an automatically added project history record. + +1. Atomically capture the complete accepted Project, exact SourceBundle, all local definitions, all immutable imports/pin closures and every required package archive's exact bytes. Validate that source/package compilation reproduces the captured Project and that each pin resolves to the supplied bytes. Reject missing/corrupt/incompatible content; do not fetch or consult another project's cache. +2. Include all applicable properties in the effective-binding manifest: all in the selected Case's layer, or both layers for ModelBaseline. Capture each effective Binding, including Unbound, and its Base/Override origin. Include every shared check predicate in those layers; target lists still explicitly determine which outputs were requested. These manifests are derived, validated against the capture, and cannot override it. +3. Retain the entire local pure-definition environment and every imported package in the captured document, including nonselected branches and unused imported declarations. No local definition reference can resolve against a later ambient project. Package bytes/pins and the verified compatibility-profile version travel together; a digest without content is incomplete. +4. Emit a versioned envelope with the exact portable document bytes and their SHA256, originating document stamp, model ID, context/targets/profile, manifests and definition-capture inventory. The concrete fixture uses a base64 UTF-8 JSON byte capsule plus a decoded companion file for inspection. The hash commits the exact captured bytes; it is not claimed as a semantic equivalence hash or a publisher trust proof. Decoding is bounded and strict. +5. Reopen/replay by decoding, checking the digest, admitting the captured PortableDocument through the common validator, and verifying the redundant manifests. Evaluate only that private capture. The same IDs denote historical objects in that private namespace; they are not inserted into the current live Project ID map. Exported descriptions/origin stamps are provenance assertions, not authentication. + +The [complete frozen degraded fixture](experiments/analysis-baseline-20260911/freeze-degraded.json.proposed) contains the exact full portable document, four effective bindings and the shared check, explicit local-definition inventory, and an explicitly empty import/package set. Empty is correct for this fully local example, not a missing imported environment. Its [decoded companion](experiments/analysis-baseline-20260911/portable-document.json.proposed) exposes every captured field; there are no management placeholders. The local origin UUID/revision in the fixture is an illustrative accepted stamp, not a claim of a real Studio session. + +The nonempty pinned-package freeze gate remains mandatory with the sibling's complete library fixture: capture both selected and unselected imported content, remove the ambient source/package files, reopen offline, mutate a byte under an unchanged pin and require rejection, then publish a cosmetic revision and show the frozen original remains unchanged. Experimental package bytes may exercise transport but must not be labeled production archive grammar. Exact archive/pin fields and compatibility proof validation use the paired library contract; the analysis subsystem must not invent a second package format. + +The sibling's final full-prototype [D1 experimental archive](experiments/library-compatibility-20260911/generated-final/package-D1.library) has raw SHA256 28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33; its cosmetic [D2 archive](experiments/library-compatibility-20260911/generated-final/package-D2.library) is a35102e04b9f6822ab409ab43f83eded33edd0a3a3c1f589245bb7b123ce4779. These are concrete nonempty bytes for the paired capture test, not a production archive schema, normative UUID example, or a claim that this report's local fixture imports them. A frozen D1 environment must retain D1 even where verified typed compatibility also permits D2 for a later live use. + +This whole-capture choice costs space and retains unrelated captured architecture/cases. It deliberately avoids guessing a minimal architectural/analysis closure and prevents incomplete freezing of factored definitions. Deduplication may share immutable bytes internally, but every standalone export/recovery must contain them. A smaller closed independent document is a worthwhile later alternative; it must demonstrate exact subject/definition/history closure and unchanged semantics before replacing this contract. A result-only report and a shallow copied Case are different operations and must not be called a reproducible frozen study. + +The artifact can be created and replayed by text/API clients. Creating a local editable independent study from it is an explicit open/fork/import operation with its own identity policy; replay does not silently adopt the snapshot into another project. No new third live evaluation context variant is needed: the private document still evaluates ModelBaseline or Case(id). + +## 7. Integration with libraries, transitions and current boundaries + +The selected-case closure is an **explicit AnalysisSelection** of property IDs, check IDs and whole case IDs, separate from architectural selection. It follows required typed property/definition dependencies, all bindings of every selected whole case and declared external subject/property roles. It never inverse-pulls every case mentioning a selected property, and never silently slices a case's override map. Missing dependencies require explicit inclusion or an external role decision. A subjectless case/check is valid and cannot be inferred from architectural parentage. + +The sibling library contract uses this selection for patterns. Instance materialization allocates new property/check/case IDs and remaps their live typed architectural/property references. ModelBaseline has no UUID to remap; it means the property-owned bases of the resulting instance/project. Imported neutral definitions retain exact qualified pins or become explicit local copies with captured private definitions; they are not accidentally routed through the architectural Element remapper. An unrelated project-wide case sharing a property remains untouched unless explicitly selected. + +OA/SA transition must expose the same analysis inclusion/omission choices and same-layer subject/property remapping. Root's combined transition/library contract owns mounted definitions, exact opposite-layer exports or explicit local derivatives. New analysis Kind mappings alone cannot recover the required associations. No transition should silently create a case, take current evaluated numbers as new baseline literals or claim preserved frozen provenance after remapping. + +| Inspected current boundary | Required integration | +| --- | --- | +| model.rs:13, :229, :1621 | Existing OA/SA layer and Element fields remain authoritative; add closed body variants, definition catalog and identity reservation. No mandatory baseline record. | +| session.rs:11, :170; references.rs:392 | New narrow base/override/parameter edits lower into one clone/validate/admit batch. Existing deletion cleanup must not erase semantic analysis dependencies silently. | +| references.rs:17, :154 | Add typed Expr/subject/check/override-key visitors; distinguish local live IDs, scoped parameters, imported members and frozen historical IDs. | +| source_project.rs:286, :780; source_project/source_migration.rs:4 | Shared compile/stabilize/update/migrate path must cover every new field, ID/ref token and exact source file; new schema must reject old parser claims honestly. | +| semantic/types.rs:88 | History/snapshot closed vocabulary needs deliberate additions; frozen/private captures are not live reference graphs. No UUID-shaped string rewriting. | +| transitions.rs:203, :447 | Explicit analysis selection and inspected same-layer materialization, not only a mapping for new Kind names. | +| docs/api.rst:13, :188, :288 | Preserve accepted model/source revision, ETag and atomic command/source behavior; add pure capture endpoints and full source/JSON/OpenAPI parity. | + +The API already distinguishes service resource identity from model identity and increments revision for source-only changes. It does not retain arbitrary past server revisions. Therefore an origin ETag alone cannot reopen a frozen study; retained exact source/model/package content is essential. No new external standards assertion is needed to derive these rules from the experiment and current code. The earlier primary standards research remains context, not an automatic resolution of Studio's architecture. + +## 8. Falsifiers and exact first implementation slice + +These expected observations are **not runtime results from the proposed model**. The executable 218-assertion experiment establishes the analogous context behavior; the new UUID/source/quantity/library integration still needs implementation. + +| Complete fixture/change | Required observation or rejection | +| --- | --- | +| Baseline total/check | 750 ms + 1 s = 7/4 canonical seconds; Satisfied against 2 s. | +| Degraded Case total/check | Base-origin formula reads overridden receive time: 1250 ms + 1 s = 9/4 seconds; Violated. Returning 7/4 falsifies effective-case resolution. | +| Unmeasured Case | Explicit Unbound receive override gives Missing input 63a931c2-675a-4fce-89e5-04361cb99450 and Unresolved check; no zero/fallback. | +| Clear that override | Exact removal restores 7/4 seconds and Satisfied. Setting the property base to Unbound then clearing remains Missing. | +| Set degraded receive formula to total | Effective dependency cycle rejects the complete batch. Also test a later baseline formula edit that creates a cycle only in an existing case. | +| Change shared limit base to 5/2 seconds | Same check ID now satisfies baseline/degraded; no copied predicates are changed. Override limit only in one case and only that case differs. | +| Change dispatch base from 1 to 2 seconds after freeze | Active degraded total becomes 13/4; frozen degraded stays 9/4 with old inputs/formula/environment. Case source may be unchanged. | +| Change combine body from a+b to a+b+b after freeze | Active degraded becomes 13/4 from the original input bases; frozen stays 9/4. A full binding list retaining a live local definition fails this test. | +| Delete receive, a referenced property, or a used calculation | Reject unless explicit same-batch repair is supplied. Case deletion alone retains all bases/checks. | +| as_kind(Energy, (2 N_force * 3 m) + (4 N_force * 5 m)) | Two A(energy-dimension) intermediates add; explicit result is 26 J with the declared Energy kind. Symbols here denote explicitly defined units in the future R6 fixture. | +| (2 kg * 3 m) / 2 s | Anonymous momentum intermediate with canonical coordinate 3; assign to Momentum only with AsKind. | +| (2 N_force * 3 m) < (4 N_force * 5 m) | True; comparison of same-dimensional anonymous products is permitted. | +| Energy / Torque with equal canonical coordinates | N equal to 1 is permitted; Energy + Torque and direct equality reject. Equal dimensions do not erase named kind identity. | +| anonymous result / same-dimensional anonymous result | N; explicit AsKind of a named dimensionless kind is possible. Implicit named dimensionless -> Number assignment rejects. | +| 20 degrees C - 10 degrees C; 20 degrees C + 5 K_interval | 10 K_interval and 25 degrees C under declared affine definitions. Point+point, point scaling and point power reject. | +| If branches named Energy versus anonymous energy dimension | Reject; explicit AsKind in the anonymous branch repairs it. | +| 1/0, 0^0, false predicate, Unbound input | Failed, Failed, Violated, Missing respectively. No common “false/error” bucket. | +| Literal AST 10^300 and the rational with numerator 1/denominator 2^4095 constructed via JSON | Canonical source spells the full integer/ratio denominator and returns exactly the same literal AST; exponent notation here describes the mathematical fixture, not accepted ratio-argument syntax. [Complete literal packets](experiments/analysis-baseline-20260911/r7-literal-boundaries.json) include the negative 4096-bit boundary as well. | +| Subjectless selected case/check plus an unrelated case sharing p | Explicit pattern/transition selection preserves selected complete analysis and leaves the outside case untouched. | + +The next production slice should be one complete vertical implementation, with independently constructed expected Project/source/REST results: + +1. Admit the complete local fixture through source and JSON using shared core types, then show exactly equal model identity/ASTs. Add base/override/check/definition visitors and transaction validation before desktop forms. Cover Unbound, Clear, shared checks, inherited formula context and baseline-induced case cycles. +2. Implement the closed exact evaluator and R6/R7 boundaries with independent rational/dimension expectations, plus false/Missing/Failed classification and provenance. Include nested anonymous sums/products/quotients, empty Sum typing, compatible mixed-revision kinds, affine operations and literal serialization boundaries. +3. Expose explicit accepted-context evaluation and whole-document freeze/replay through the published REST/source workflow. Verify ETag races, source comments/file layout, complete local definitions, exact nonempty package pins/bytes, private offline resolution and tampered-manifest/package rejection. No hidden cache or GUI initialization may be needed. +4. Add the minimal native property/base/case/check authoring path using the same operations; verify explicit context/origin display, Use baseline versus Unbound, single undo/redo, exact save/reopen and stale result handling. A pending draft must not be applied by Evaluate. +5. Integrate the sibling's two-instance/selective-update/outside-consumer and OA/SA analysis-selection fixture before claiming reusable analysis or transition parity. Keep approximate numeric capability, dense text/source authoring and the rest of the user's release objective open until their own accepted slices exist. + +Root's consequential ratification points are limited and explicit: shared root checks with threshold properties; same-layer analysis plus explicit cross-layer work later; all effective graphs statically valid even for unused branches; strict argument/Boolean evaluation policy; whole capture rather than minimum closure; declared-output kind anchoring with verified same-origin compatibility; and the exact-versus-approximate capability boundary. The B direction is already selected. None of these refinements should silently become production defaults merely because this paper fixture is complete. diff --git a/harness/release-library-compatibility-contract-20260911.md b/harness/release-library-compatibility-contract-20260911.md new file mode 100644 index 00000000..2625887d --- /dev/null +++ b/harness/release-library-compatibility-contract-20260911.md @@ -0,0 +1,267 @@ +# Library provenance, compatibility and source normalization: candidate contract + +Codex-956atf `/root/library_compatibility`, 2026-09-11. Bounded follow-up to R1/R2/R3/R5 of the [paired review](release-semantic-proposals-review-20260910.md). Read current `PROJECT_GOAL.md`, `AGENTS.md`, the paired proposals, issue #1 through #128, the empty open-PR inventory and Wiki Home/Authoring20260911 before work; ownership is in issue comment #130. Coordinated the property-owned baseline, explicit context and shared-check rules with `/root/requirements_delta`. The [original library proposal](release-libraries-semantics-design-20260910.md), original analysis proposal and review remain frozen. + +Owned changes are this report and [the isolated experiment](experiments/library-compatibility-20260911/README.md). No production, shared-ledger, Cargo, `target`, native, commit or push changes. Root granted a bounded std-only compiler lease; it is released. This is a candidate contract supported by a finite-model experiment, not shipped Studio grammar, full data/transition conformance or release acceptance. + +## Recommendation + +Keep exact byte-pinned package closures, immutable imports, editable materialized patterns, exact last-adopted typed bases, explicit current correspondence and three-way updates. Add **verified same-origin typed contract equivalence** for supported definition use sites. Archive identity, reference identity and use compatibility are different relations. A compatible revision does not rewrite an existing reference, merge imported identities, advance a pin, or make historical records current. + +Use the hybrid representation for the next production slice: qualified references for neutral quantity/unit/calculation definitions, immutable mapped local records for layered data/interface definitions, ordinary local records for pattern instances. Require one shared contract resolver and a scoped field/operation correspondence wherever a consumer uses a compatible mounted revision. Preserve layer distinctions. A transition must explicitly bind an exact target-layer package export or create an editable local derivative with historical origin and independent maintenance. + +The experiment demonstrates a real advantage over strict revision-only compatibility: the selected left instance advances while the right instance, outside duration budget and typed receiver retain their exact records. Explicit checked bridges also work but require two additional pair-specific declarations for this example. Stable vocabulary dependencies avoid the pattern-only revision problem when their exact pin stays unchanged; they do not answer vocabulary evolution. Recommend stable vocabulary packages as an authoring convenience, not a mandatory escape from bundled libraries. + +The representation comparison does **not** establish that hybrid mounts are intrinsically easier to implement. Layered qualified references have the same compatibility and transition obligations in this example. The reason to retain the hybrid is that it supports the required independent, editable OA/SA derivatives while keeping the existing layered local-graph meaning. A neutral cross-layer catalog changes that meaning; it must be selected as a separate domain decision if actual engineering workflows require one shared data identity across OA and SA. Reopen this choice if the scoped resolver cannot cover the actual consumers without special cases escaping into each adapter. + +## 1. Evidence and exact scope + +Current implementation evidence matters to the consumer boundary: + +- `crates/oa-core/src/data.rs:129` and `:138` satisfy an item/interface through local identity ancestry. Two new mount maps with different local IDs do not acquire compatibility from having similar payloads. +- `crates/oa-core/src/data.rs:4` defines a carried field by its item, path and field identities. Mapping only the top-level item is insufficient. +- `crates/oa-core/src/model.rs:520` preserves message field paths; `OperationUse` at `:530` contains the exact interface-item allocation reference. The proposal must preserve the distinction between operations that carry the same item. An item-name match cannot replace allocation identity. +- `crates/oa-core/src/transitions.rs:203` maps the existing data/interface classes in both directions. Its closure at `:504` follows references, owned allocations and required fields; independent data associations travel when both endpoint types are already required. It does not discover a subjectless analysis case by following an activity's children. + +The [standalone Rust experiment](experiments/library-compatibility-20260911/main.rs) implements a closed finite dialect. Its final packages explicitly contain every prototype record, definition, export selection and role used by the scenario. It parses concise source requests, materializes two independent instances, writes complete portable source plus base/map/lineage files, applies a local edit and an explicit selective update, and reopens from those files. A complete independently specified expected document is compared with the update result; the oracle does not call the update/materialization planner to supply expected changed records. + +Final results: **120 assertions passed**, warning-free `rustc -D warnings`, process exit 0. A separate process reopened the result: 15 live records, revision 3, 1,650 ms, satisfied. Independent PowerShell SHA-256 reads matched **all 11 files** of the updated document against both the full expected document and the fresh-process reopened document. [EVIDENCE.json](experiments/library-compatibility-20260911/EVIDENCE.json) records all 81 final fixture files and their hashes. + +| Artifact | Final SHA-256 | +| --- | --- | +| Experiment source | `bc31bacf250f3711758717f18a3104696ed941c3c9b89817caa6a96e6540062a` | +| Isolated executable | `652a15a96bd9b0cf2aa732c2273ec5e651c18e9d11d668a1ae5f214d120bb310` | +| D1, complete prototype at 1.0.0 | `28df5ea3447918dfee3c6ed4243d8f986c689f93a54d89c6181b47d6c2f39b33` | +| D2, cosmetic revision at 1.0.1 | `a35102e04b9f6822ab409ab43f83eded33edd0a3a3c1f589245bb7b123ce4779` | +| D3, changed field multiplicity at 2.0.0 | `4b05d6a15115448e318d0c5d567ebb0bb9e0ab6438bd238e5f3a0716c7db1ee8` | + +The probe uses opaque symbolic identities rather than UUIDs, one package per import rather than transitive package graphs, a restricted typed AST and exact integer-millisecond arithmetic. Its archive digest is over its exact finite-dialect file. It does **not** implement the production manifest-framing proposal, package dependency solver, UUID allocator, complete Studio constructor validation, field-path engine, source7 parser, REST or native application. The target transition records are a finite contract model, not an execution of Studio's complete transition planner. The program's SHA-256 outputs are independently checked with PowerShell; no production cryptographic-library choice follows from its small implementation. + +An initial compile needed an explicit Rust map type. A preliminary dialect supplied fixed prototype constructor values from the interpreter; that was inadequate evidence for a byte-complete reusable package. The final version moved all of those records into the package bytes and reran every check. Only `generated-final/` is final evidence. The older `generated/` is labeled superseded: automatic approval review rejected its removal as “blocked by policy.” + +## 2. Three identities and one verified contract relation + +The production contract retains the original exact package pin: + +```text +PackagePin = (PackageId, exact version label, package format, archive digest) +DefinitionRef = Local(DefinitionId) + | Imported(ImportId, PackageId, MemberId) +Origin = (PackageId, MemberId, record class, declared layer or Neutral) +``` + +Resolving an imported reference returns its exact pin and supplied transitive closure. Two aliases resolving to identical pins/members denote the same foreign definition. Two different exact pins remain different references even when the following compatibility relation succeeds. Alias/name spelling never establishes either relation. + +Define a versioned, class-specific `CanonicalContract(root, verified_environment)` as a finite rooted graph: + +1. Parse and admit the exact archive bytes and dependencies. Derive the graph from those admitted records. Reject caller-supplied parsed payloads, semantic hashes or `verified` flags that disagree with the bytes. +2. Include the root and every definition required to interpret its typed contract. Include owned fields, inherited definitions, interface-item allocations, operation identities and other contract-bearing owned records even when an ordinary outgoing-reference visitor would miss them. For associations, specify the same explicit ownership/boundary treatment used by the export; do not pull an unrelated dictionary accidentally. +3. Label each node by stable nominal origin and class/layer. Replace local mount handles and import aliases in typed edges with those origins. Resolve all relevant dependency revisions before removing revision labels from this comparison graph. +4. Include every interpretation-bearing field: scalar/record/enum distinctions, quantity dimension and algebra/coordinate convention, affine difference-kind dependency, exact unit scale/offset, defaults and constraints, inheritance, field type/multiplicity/direction, exchange mechanism, operation allocation identity and contractual ordering, and typed calculation parameters/result/body/dependencies. Preserve semantically ordered collections. Unknown classes/fields/profile versions refuse this proof. +5. Omit only presentation data whose schema meaning is explicitly non-contractual: source whitespace/comments and display aliases/names/descriptions. If a future wire name, discriminator or expression lookup uses such a string semantically, that field must be included. Do not infer equivalence from prose saying a change is cosmetic. +6. Canonicalize field labels and graph-node order; preserve typed AST structure and stable parameter/member identity. Do not prove algebraic equivalence of different expressions or coalesce separately identified fields. Recursive data graphs terminate by visited node identity and serialize as finite graphs, not recursive tree expansion. Unsupported or over-budget graphs refuse compatibility without changing the model. + +The nominal key is: + +```text +CompatibilityKey = (contract profile version, Origin, CanonicalContract) +compatible(a, b) iff CompatibilityKey(a) == CompatibilityKey(b) +``` + +An implementation may index this graph by an internally computed digest; the formal criterion is the verified canonical graph, not a publisher's digest assertion. Equal keys form an equivalence relation. Roots from another PackageId or MemberId never become equal through structural coincidence. Energy and Torque remain distinct even with equal dimensions. Reusing an existing member identity for a different engineering concept violates the publisher's nominal-identity contract; a verifier cannot discover an unstated change of intent from identical typed content. Mint a new member identity for that change. + +For quantities, the resolved internal `KindCompatibilityKey` is the key above for the quantity kind and its relevant definition closure. It must retain an identical canonical coordinate/algebra meaning. Arithmetic can combine matching keys while the authored AST retains each exact reference. Public property/call results use their **declared** output definition reference and key, and report all captured input/definition provenance. Operand order does not choose one package revision as the public result identity. A different coordinate basis requires a checked migration/coercion contract, not this equality rule. + +Units also have their own contracts. A changed unit scale changes that unit's meaning and literal evaluation; it does not automatically change an otherwise identical quantity kind. Keeping exact literal/unit references and exact three-way facets is therefore necessary even when kind compatibility succeeds. No `AsKind(Energy, TorqueValue)` is introduced by this design. + +Compatibility never relaxes package-resolution rules. A missing exact archive, wrong digest, unsupported format, hidden dependency, cycle, or two pins of one PackageId in one root closure still rejects. Two contents claiming the same PackageId/version with different digests still conflict. Separate imports can retain different permitted revisions. A semantically compatible dependency is not a substitute for the exact dependency a package declared. + +## 3. A scoped data-consumer proof, not a global ID rewrite + +A mount has immutable `(ImportId, ExportId, MemberId -> LocalId)` maps. Its derived payload must equal the exact pinned export under that map. Updating selected uses creates a new import and new mount; old local IDs remain where their users still require them. + +The common resolver provides: + +```text +match_contract(actual_root, expected_root, usage_context) + -> ExactMatch | CompatibleMatch { expected_member/path -> actual_member/path } + | Incompatible { located typed differences } +``` + +For an ordinary local type, keep existing identity/ancestry rules. For a verified mount, compatibility may satisfy an expected contract when a carried/provided root, or the appropriate ancestor, has the same verified key. It must still pass the use site's class, direction, mechanism and layer rules. Do not invent inheritance edges between mounts. + +The mapping is scoped by **both** root handles and their verified origin graphs. Translate each expected field-path component and final field to the corresponding actual member. Translate exact interface-item allocation identity in the same scope; two allocations carrying the same item are not interchangeable. Preserve repeated nested field paths and repeated operation occurrences. Ambiguous, omitted, out-of-root or noninjective maps reject. The actual record remains the actual record, including its actual parent and exact pin. + +This mapping is used for compatibility/lookup at the relevant contract boundary. It does not remap architectural occurrence identities, reply correlations, outside source records, local history, trace baselines or UUID-looking strings. A client's read result exposes expected and actual origins so it can inspect why the contract was accepted. Message values authored against the current exchange keep current actual path identities; an unchanged outside consumer can retain its old expected path and receive the scoped correspondence during resolution. + +In the experiment, the unchanged outside receiver requires `data1/Interface`, its exact `data1/Operation`, and `data1/Code`. After the selected exchange carries `data2/Alarm`, the derived correspondence includes: + +```text +data1/Interface -> data2/Interface +data1/Operation -> data2/Operation +data1/Alarm -> data2/Alarm +data1/Code -> data2/Code +data1/Flag -> data2/Flag +``` + +The outside record stays byte-identical. Changing `Code.maximum` from 1 to 2 changes the rooted interface contract and rejects the selective candidate. Updating only `item_satisfies` would be an incomplete implementation: field/operation resolution, port satisfaction, interface contracts, message-value validation and their history/query projections must consume the same proof. + +## 4. R1: source-only requests and fully explicit accepted state + +Distinguish **pending author requests**, **prepared changes**, and **accepted declarative source**. Concise requests are not incomplete accepted instances. + +Proposed public workflow, with spelling/schema version still to be assigned: + +1. The directory explicitly declares its entry source, ordinary includes and digest-addressed package entries. The package loader reads only declared bounded paths and supplies a complete envelope. No GUI, open project, registry lookup or ambient cache is needed. +2. `source prepare` accepts the current envelope plus authored library create/update/detach requests. It resolves exact packages, allocates/reserves new IDs once, materializes members, computes exact typed baselines/maps/lineage, and returns an explicit portable prepared directory with the complete candidate, request identity, original file hashes/document revision and located diagnostics. Preview itself changes no accepted source/history. +3. For an update, the prepared result contains every conflict and outside impact. A text client writes explicit decisions against stable instance/member/facet identities, e.g. `left/P.base = KeepLocal`. It can author a replacement value/order where admitted. A conflict file is not a trusted command batch; the core recomputes the candidate from the request, exact base and choices. +4. `source accept-prepared` checks the original source/package hashes, revision, reserved IDs and plan fingerprint, then adopts the complete candidate once through the same document transaction as GUI/API. An already accepted identical operation is inert; a reused request ID with different content rejects. A stale or incomplete request preserves the accepted directory/document. +5. Accepted source contains ordinary editable materialized records plus explicit management includes/handles. Pending request forms have been replaced by their accepted records and receipt. Ordinary compilation does not replay them or allocate again. Pure compilation of an unnormalized pending request reports `pending_source_operation`; it never silently creates a managed model on a read. + +The exact accepted management state is portable, published source grammar, version controlled and included in canonical export. One possible directory organization is: + +```text +project.arcadia ordinary imports/includes/instance handles +architecture/*.arcadia ordinary editable local instance records +analysis/*.arcadia ordinary editable properties/cases/checks +libraries/contents.arcadia exact pins and declared package paths +libraries/packages//... exact manifest and prototype SourceBundle +libraries/mounts/.arcadia immutable foreign-member/local-ID map +libraries/instances//base.arcadia exact pin/export/policy/bindings/original map/typed base +libraries/instances//map.arcadia live correspondence or reserved deletion per member +libraries/instances//lineage.arcadia explicit original-to-current identity correspondence +libraries/operations.arcadia accepted operation identities and source provenance +``` + +File separation is optional; the data are not. The directory entry declares every file used. A single-file canonical spelling and the REST envelope can carry the same values. A source client may author the full canonical form directly, subject to the same invariants; a generated file has no privileged admission path. + +The base records the exact last adopted prototype transformed by the **stored** original local IDs, bindings, aliases/names and materialization policy. Derive it from those data and the old pinned bytes when verifying; never derive it from today's live values, current alias availability or name similarity. The original map and base remain historical until an accepted update replaces that base. Current reidentification composes a separate typed lineage and current correspondence, leaving the old base untouched. Missing required management files yield located errors; repair must use exact recorded inputs or an explicit detach/re-adopt operation that acknowledges losing that managed history. + +Admission against an existing document also enforces legal management transitions; editing a sidecar is not permission to retroactively replace an old base. Opening a self-contained portable document verifies its internal derivation and identity invariants. It establishes reproducible correspondence, not cryptographic proof that a particular human performed each historical action. No hidden desktop history is required to read the document. + +Diagnostics identify the authored request/record and the exact management/package location responsible. A malformed sidecar must not strand the author in a GUI-only repair path. Native/API/source operations share this preparation and admission service, rather than each implementing a different normalization rule. + +The complete executed requests and outputs are linked below; none omit the management body with a placeholder comment: + +- [Blank-directory authored creation request](experiments/library-compatibility-20260911/generated-final/initial.request); [complete initial normalized directory entry](experiments/library-compatibility-20260911/generated-final/01-initial/project.model). +- [One local edit request](experiments/library-compatibility-20260911/generated-final/local-edit.request); [complete edited state](experiments/library-compatibility-20260911/generated-final/02-edited/project.model). +- [Selective update with exact old pin, revision and explicit choice](experiments/library-compatibility-20260911/generated-final/selective-update.request); [complete accepted updated state](experiments/library-compatibility-20260911/generated-final/03-updated/project.model). +- [Full left base](experiments/library-compatibility-20260911/generated-final/03-updated/management/left/base.model), [current map](experiments/library-compatibility-20260911/generated-final/03-updated/management/left/map.model), [lineage](experiments/library-compatibility-20260911/generated-final/03-updated/management/left/lineage.model), and [full independent expected directory](experiments/library-compatibility-20260911/generated-final/expected-full-updated/project.model). + +The finite initial request has 11 lines; the package has 24. Its normalized complete initial document is 9 files, 92 lines, 4,056 bytes; the edited document is 9 files, 93 lines, 4,098 bytes; the updated document is 11 files, 125 lines, 5,708 bytes. These figures include management and package files for one document, not just the pleasant author-facing snippet. They use symbolic identities and a tiny grammar, so they are not predictions of production UUID source size or human task times. They show that the required bookkeeping has actually been emitted and reopened. + +## 5. Full before/after meaning of the selective update + +D1 defines nominal Duration, Energy and Torque, ms/s, an OA Boolean field/item/interface/operation graph, and a monitor pattern. Its prototype includes Activity A, Interaction E to external receiver H, property P with base `750 ms`, subjectless case C overriding P to `1250 ms`, and shared root check K `P <= 1000 ms`. An unrelated prototype case G mentions P and outside property Q. The explicit export selects A/E plus analysis P/K/C; H is a role, Q/G are outside. These records are in the [exact D1 package](experiments/library-compatibility-20260911/generated-final/package-D1.library). + +Alpha begins entirely from the request and supplied package. It creates two receiving activities, one immutable OA mount, and two instances with disjoint A/E/P/C/K maps. An outside budget reads `left/P + right/P <= 2000 ms`; an outside typed consumer observes `left/E`; an unrelated local subjectless `global` case overrides `left/P` to `3000 ms`. There is no AnalysisBaseline element. ModelBaseline reads the properties' own base bindings, and a named case replaces its explicit entries. K is shared across explicitly requested contexts. + +| State | Left current property | Left stored base | Right current/base | Outside budget | Outside receiver | +| --- | --- | --- | --- | --- | --- | +| Initial revision 1 | type D1.Duration, `750 D1.ms` | exact D1, `750 D1.ms` | exact D1, `750 D1.ms` | 1,500 ms, satisfied | expected/actual data1 | +| Local edit, revision 2 | type D1.Duration, `900 D1.ms` | unchanged exact D1, `750 D1.ms` | unchanged | 1,650 ms, satisfied | unchanged | +| Selected cosmetic update, revision 3 | type D2.Duration, retained AST `900 D1.ms` | exact D2, `750 D2.ms` | unchanged exact D1 | 1,650 ms, satisfied | expected data1, actual data2, verified correspondence | + +D2 changes only the version label and a source documentation line. Its typed definitions and prototype are unchanged. The selected update still changes exact imported references in the new materialized baseline. Because the local literal changed its magnitude and the incoming literal changes its exact unit reference, the conservative typed expression facet conflicts. The explicit `KeepLocal` choice preserves the **whole** `900 D1.ms` literal; it is not silently respelled `900 D2.ms`. The property type itself advances to D2 because its old and local facets matched. Verified kind compatibility admits the retained literal and outside budget. + +This is an instance **based on D2 with a local D1-referenced expression override**, not a claim that every current dependency now comes from D2. Its base is wholly and exactly the selected D2 materialization. Both archives remain present, and exact source/references expose the distinction. Right-instance state, outside budget/receiver/global-case records and all surviving local IDs are unchanged. Left C/K advance their exact neutral references normally. K evaluates to true for ModelBaseline (900 ms), false for Case(left/C) (1,250 ms), and false for the unchanged global case (3,000 ms). + +The whole-document oracle compares all 15 records, both package payloads, both mounts, both instance bases, original/current maps, lineages, receipt sequence and document revision. Additional counterexamples prove that a local property name/subject edit is not lost while resolving only its base-expression conflict; a same-named local extension is retained without adoption; current reidentify preserves old base/package bytes; deleted or historically reidentified identities cannot be reused; dangling outside references, forged parsed packages/bases/maps, missing bytes and conflicting package/version labels reject. + +The experiment's update operation deliberately refuses unresolved deleted-member decisions. The production deletion contract is the explicit matrix below, not automatic resurrection inferred from this simpler implementation. + +## 6. R3: explicit analysis export and transition selection + +Use the [coordinated baseline contract](release-analysis-baseline-contract-20260911.md): each property owns a required literal/formula/Unbound base binding; ModelBaseline is an explicit captured context; Case(id) has one level of property overrides; checks are shared root predicates independent of case ownership. No baseline UUID is created or remapped. + +Every pattern publication and OA/SA transition request has an explicit `AnalysisSelection { properties, checks, whole_cases }` facet alongside architectural selection: + +1. Start with only the explicitly selected property/check/case identities. Selecting an architecture subject may suggest attached analysis for review but does not select it by an inverse traversal. +2. Selecting a case retains its **entire** override map, including Unbound entries. Include the targets and typed dependencies needed to interpret those overrides. Do not silently slice a case to properties whose subjects happen to be selected. +3. Selecting a property includes its declared type/unit and base expression dependencies. Selecting a check includes its complete predicate dependencies and any explicit documented-constraint/subject boundary. Traverse all statically referenced branches, not only the last successful evaluation path. +4. Each required architectural subject or property outside the selected membership must have an explicit typed external role/binding or be included through an explicit selection decision. A role carries expected class/layer/type compatibility and contextual predicates. A selected global case therefore exposes its outside dependencies; it does not pull their whole architecture automatically. +5. Neutral prototype-local definitions become the intended qualified same-package/dependency references when exported and materialized. They do not pass through the ordinary architectural local-ID map. An explicit `CopyLocalDefinitionClosure` policy can instead create fresh editable local definitions; it must copy/map the full required definition closure and mark that independent origin. A hidden private definition without a declared export/copy policy rejects publication. +6. Materialized properties/cases/checks receive distinct local identities per instance and their typed references are mapped. Case's `ModelBaseline` selector becomes the consumer project's captured model context, not a mapped phantom baseline record. All required local property definitions/bindings must therefore be present or explicitly bound. +7. Preview reports omitted attached properties and cases/checks that mention selected properties. These are useful scope diagnostics, not automatic membership. It distinguishes an intentionally architecture-only selection from a complete selected analysis facet. + +In the finite closure check, selecting P alone yields exactly `{P}`. Selecting P/K/C yields exactly `{P,K,C}` even though C is subjectless. G is not pulled in. Selecting G without a boundary for Q returns an unresolved decision; selecting G with an explicit external property Q retains the whole case and closes P. The admitted instance contains C's value and K's predicate, and the unrelated host case remains unchanged. + +The same explicit selection applies in both transition directions. Selected property subjects, case override targets and check expressions map to target-layer records; neutral definition pins remain exact. ModelBaseline/Case selection is explicit in evaluation after transition. Omitted cases stay in their original layer. A freeze is separate: the baseline contract captures the complete immutable accepted Project/SourceBundle and all exact package bytes/definition environment, plus selected context/targets and validated derived provenance. Library compatibility must not replace a captured package with a later compatible revision. + +## 7. R5: exact mounted-item transition dispositions + +An OA mount is immutable OA data. No transition may change its layer, mutate its map/payload or attach that OA record directly to an SA-only contract. Neutral quantity/unit/calculation definitions can remain exact references across a transition; the properties/checks using them remain layer-owned. + +For every required layered-definition closure, the plan offers these explicit choices: + +| Choice | Accepted target | Persisted origin and future update behavior | +| --- | --- | --- | +| `BindPinnedTarget` | A supplied, exact-pinned export in the target layer, with a complete explicit source/target member correspondence satisfying all demanded target uses. | Target remains an immutable target-layer mount with its own import pin. A transition correspondence records the source/target pins and members. Source-package updates do not advance the target mount. | +| `CreateLocalDerivative` | A complete target-layer local data/interface graph with fresh local IDs, mapped owned fields/allocations/associations and all dependencies resolved explicitly. | Historical origin records the exact source pin/export/member map, transition choice and target IDs. The target graph is ordinary editable local content; it is neither a mount nor a managed library instance. Later source-library updates do not change it. | +| No valid choice | Located unresolved disposition, with all required roots and external uses shown. | No candidate adoption or partial transition. | + +`BindPinnedTarget` does not make different OA/SA origin keys globally equivalent. The engineer explicitly selects a counterpart and the transition verifies its full mapping and demanded contracts. The conservative first rule permits identical typed data contracts under the declared member/layer transformation. A refinement/migration that changes payload meaning requires explicit additional semantics and use-site validation, not a name match or an unverified `counterpart` flag. Incomplete paths, wrong class/layer, dropped fields, unmatched allocation identity and inadequate target contracts reject. + +The finite target package is supplied as [exact SA bytes](experiments/library-compatibility-20260911/generated-final/package-SA.library). It has distinct package/member identity. The [full transition states](experiments/library-compatibility-20260911/generated-final/oa-sa-transition.model) contain the complete five-record dictionary, source/target pin/correspondence, mutability disposition, two target functions, their output/input ports and the target functional exchange. For the pinned choice the exchange carries `sa_mount/SA/Alarm`; for the local derivative it carries editable `SA/Alarm`. Wrong-layer items and an incomplete field map reject. + +The original OA project and all its imports/instances are unchanged by either target construction. The local derivative can change `SA/Code.maximum` independently. A reverse request that explicitly binds the unchanged original OA mount succeeds only while the complete inverse-transformed demanded contract still matches. After that refinement, it cannot write the changed field into the immutable original mount: select another valid pinned OA export, explicitly create an OA derivative, or leave the decision unresolved. Ordinary transition traces may record architectural correspondence/review; they do not confer library update management on the derivative. + +A later source revision D3 with a changed multiplicity does not silently edit either target. The pinned SA export stays at its target pin; the derivative stays at its recorded current local content. An explicit semantic transition comparison may propose further changes, but must use the target's actual mutability and current edits. A package-origin note cannot masquerade as an exact three-way library base. + +## 8. Alternative policies tested against the same consumers + +| Policy | Cosmetic selected update + outside budget | Outside item/operation/field consumer | Vocabulary change and transition consequence | +| --- | --- | --- | --- | +| Strict exact revision only | Initial budget works; selected old/new references fail. | Initial exact IDs work; new mount fails old contract. | Requires broader explicit migration or keeping old dependency references. Protects integrity but does not complete the selective-update task. | +| Verified same-origin typed equivalence | 1,650 ms remains satisfied with exact old/new references retained. | A complete scoped correspondence admits the unchanged receiver. | Changed rooted contracts reject. OA/SA still needs an explicit target disposition. Recommended. | +| Strict identity plus explicit checked direct bridges | Same result after adding the Duration D1/D2 witness. Empty witness set fails. | Works after adding the Interface D1/D2 witness with its complete member map. | Witnesses are exact-pair/profile scoped and independently verified. No implicit transitive bridge search; recompute a direct proof for another pair. Changed contracts and Energy/Torque bridge requests fail. Viable explicit policy with additional authoring/management state. | +| Stable vocabulary dependency V | Pattern P1/P2 can both retain the same exact V pin, so no kind bridge is needed. | Same exact vocabulary mount can serve both. | This identity advantage is verified in the finite pin model, not a full transitive-package execution. A change to V still needs compatibility/migration. Useful packaging convention, insufficient universal policy. | + +An identity bridge whose checker proves the same same-origin contract equality has the same semantic safety condition as the recommended policy. Requiring a declaration for it can be a deliberate project policy; it does not make differing structures safe. A real migration for changed contracts must define its transformation, exact endpoints, selection, all affected consumers and complete admission. Automatically composing arbitrary bridges or permitting equal-dimensional named-kind casts is outside this contract. + +For representation, the finite comparison checks both materialized handles and qualified data roots against the same contract rule. Qualified **layered** definitions still reject an OA item used as SA and still need target correspondences/derivatives. Removing mount storage alone does not solve that problem. Qualified **neutral** definitions permit a shared cross-layer root only by changing the layer contract; that may be useful, but it is not an equivalent representation of the existing semantics. Neither comparison uses touched-file counts as evidence. + +## 9. Deterministic admission, reference and deletion rules + +All adapters must pass the same pure before/after document admission. Preparation returns a complete candidate and an inspection plan; acceptance never trusts serialized plan commands or parsed imported payloads supplied by a client. It checks original revision/source/closure fingerprints and recomputes the selected choices. A failed/cancelled preview does not advance a base, reserve accepted history, mutate source or evaluate against a partially changed graph. + +| Reference category | Reidentify/delete/update rule | +| --- | --- | +| Live local architecture/analysis references | Apply the existing typed visitor extended to property subjects, expression property references, case keys and shared checks. Never search strings for UUIDs. Ordinary live-reference/layer admission remains mandatory. | +| Current instance correspondence and current bindings | Update through typed bookkeeping operations; compose actual original-to-current lineage. Surviving members retain current IDs. Do not match by display name, source order or shape. | +| Foreign package/export/member/parameter identity | Never rewrite because a local UUID has equal bits. Package bytes remain exact. Compatibility keys do not authorize identity changes. | +| Historical base/original map | Keep exact old typed records and old original references. Compare through explicit lineage; missing current objects are allowed historical facts. A new source revision does not rewrite the old snapshot. | +| Qualified definition use / mounted handle | Explicit rebind changes the chosen live use; alias rename changes spelling only. A compatible contract never performs that rebind automatically. | +| Scoped expected/actual contract map | Derived from both verified roots for a use site. Not a document-wide replacement map and not a stored historical observation. | +| Existing OA/SA semantic-history references | Keep the existing documented historical remap policy. Do not broaden it to package bases or neutral foreign member IDs. | +| Descriptions, artifact URI/revision/fragment, comments and literal source | Preserve exact content unless that literal is explicitly edited. | + +Three-way comparison remains typed and exact over B/L/N after applying only established local identity correspondence. Compatibility keys do not replace facet equality. If L=B take N; if N=B keep L; if L=N they converge; otherwise require a specific valid choice. Constructor changes and dependent fields are coupled. Ordered arrays use explicit complete-order conflicts until a reviewed stronger ordering algebra exists. Resolving one facet cannot discard a different local edit. + +| Change | Required outcome | +| --- | --- | +| Upstream removes unchanged member | Eligible deletion only after every live outside reference/cascade is shown and explicitly resolved. No hidden deletion of an outside analysis term or consumer. | +| Upstream removes locally edited/referenced member | Explicitly keep and detach it, or delete/rebind the full reviewed impact. No silent discard. | +| Local deletion and upstream edit/reintroduction | Preserve a reserved identity and explicit absence. Require keep-deleted/recreate choice; no same-named automatic adoption. | +| Both sides delete | Converged absence, with enough provenance for the next update. | +| Local addition | Keep as local extension unless explicitly selected for another operation. It cannot become an upstream member by matching its name. | +| Ordinary mutation/cascade touches a mount | Reject unchanged unless an explicit valid fork/rebind/removal operation replaces the whole affected immutable disposition. Nested Batch, Replace, source and REST obey the same rule. | +| Remove mount/import | Refuse while live uses, active bases or other required metadata need it. Historical origin is not a live cascade edge; retain its exact archive where historical inspection/recovery promises require it. | +| Detach managed instance | Keep current local IDs/content/layout, remove active update management, explicitly release absent-member reservations as specified, and preserve a non-live origin note. Other instances/shared mounts remain managed. | +| Fork/transition derivative | Fresh independent local graph plus explicit rebind selection and historical origin. No active library base is fabricated. | + +Reservations include active deleted-member identities and historical original identities still required by an active lineage, preventing a later local object from ambiguously reusing them. Maps are injective and class-preserving; separate instances' live maps and mounts are disjoint. Reidentify follows actual declared correspondence, never a chain inferred from reused names. An accepted new base records the exact map at that adoption; previous bases remain in document history/recovery as exact old snapshots. + +## 10. Conditions before production ratification + +The concrete contradictions in R1/R2/R3/R5 now have a coherent candidate answer and falsifiable source files. Remaining work must not be hidden by the finite pass: + +1. Specify the complete contract profile for all actual data definitions, association closure, defaults, inheritance, operation allocation order and contextual message paths. Audit every real consumer. Prove that no interpretation-bearing field was classified as cosmetic. The experiment covers only one Boolean item/interface path. +2. Implement the shared resolver/admission adapter against actual `Project`, the current source index/updater and transition planner. Test repeated nested paths, two operations carrying the same item, subclass contracts, concurrent versions, historical references, Replace/nested Batch, role changes and deletion impacts. If compatibility requires ad hoc rewriting outside the scoped resolver, revisit the hybrid before UI/API expansion. +3. Implement real transitive archive framing/closure validation, dependency diamonds/cycles/version conflicts, aggregate limits and offline missing-content recovery. Semantic compatibility must never bypass exact resolution. Numeric bounds and production canonical graph limits remain to be benchmarked. +4. Finalize public source/request/sidecar grammar and atomic directory adoption/recovery with existing comment/ID stabilization. Verify UUID reservations, exact source preservation, no-op compile, crash recovery, Undo/Redo and stale source/package rejection in the real document/history service. The fixture's symbolic IDs and finite parser do not establish that behavior. +5. Integrate the coordinated property-owned baseline/check model and explicit analysis selection in both transition directions. Evaluate complete contexts after the merge, including cases outside the instance whose results depend on changed property baselines. Freeze retains actual bytes even when later versions are compatible. +6. Implement and test actual target-layer pinned selection and local derivative creation with complete existing port/operation/trace semantics. The finite target graph is evidence for the disposition contract, not a substitute for full core/GUI transition acceptance. +7. Measure ordinary text and native user tasks: initial package/instance creation, local edit, cosmetic selected update, semantic vocabulary change, case selection, transition and repair from source. Count semantic choices separately from unavoidable identity/management state. Expose origin/compatibility and outside effects without expanding every member into an undifferentiated list. No human timings or native usability claims are made here. + +Root owns semantic ratification, production integration, exact-byte Git attributes, shared ledgers/Wiki synthesis and release acceptance. Preserve `harness/experiments/library-compatibility-20260911/**` without newline conversion before publication; every final fixture and the program are hash-bound by the evidence manifest. diff --git a/harness/release-scenario-native-20260911.md b/harness/release-scenario-native-20260911.md index d9744949..00745c24 100644 --- a/harness/release-scenario-native-20260911.md +++ b/harness/release-scenario-native-20260911.md @@ -92,9 +92,61 @@ predicts the remaining graph. The verified snapshots were preserved before Undo; restored snapshots did not replace them. All checker commands exited0. Tool outputs record both semantic and exact equality passes. +## OA nested state: creation and exact history pass + +On the same immutable80cf197 GUI and minimum1100×700 client, armed Observe state +and scrolled through Outer ALT / Outer chosen operand into Inner ALT / Inner +chosen operand. Clicked the inspector lifeline at the explicit slot before +**OA Inner anchor**. The marker and form both retained that nested operand and +before-slot, with **OA A inspector** preselected. Entered **OA native state** and +selected **OA Ready**. Create inserted the state before the unchanged anchor. + +Save passed `check oa-state`, then a whole-directory copy was preserved as +`oa-state-verified/`. Ctrl+Z/Save passed `check oa-action` and exact `same` against +`oa-action-verified/`; its copy is `oa-state-undo/`. Ctrl+Y/Save passed `check +oa-state` and exact `same` against the original state checkpoint; its copy is +`oa-state-redo/`. Every checker command exited0 and compares the complete Project +and both reachable source files. State UUID is +`b2464322-8178-4587-a76e-711a99f378c8`; the verified entry SHA256 is +`D729602EFEB33B343A4B6275A6A077A06CBE70BD163E993604D8ECECFDA4362B`. + +Two separate native usability findings remain open. The new state form retained +the preceding form's downward scroll, initially clipping the name field; an +explicit upward form scroll restored access while Create/Cancel stayed pinned. +The next Reuse form repeated this retained offset. Its clicked slot near the +bottom of the canvas also moved below the visible canvas when the form reduced +the canvas height. The retained semantic destination stayed correct. These are +not closed by the successful model/source checks. Root owns the workspace fix. + +The first name typing attempt after an observed focused field did not appear, +including a fresh capture. Re-clicking and typing succeeded. This is recorded as +an input/focus observation with unknown cause, not a proven application typing +defect or uninterrupted first-attempt success. Only the visibly correct text was +used for Create. Reuse name entry succeeded on its first observed attempt. + +## OA nested reuse: creation and exact history pass + +Continued at the same minimum size, with the selected Reuse scenario tool. +Clicked the same inner chosen operand before **OA Inner anchor**, after the +new state. Named the occurrence **OA native reuse**, chose **OA B verification**, +and explicitly selected **OA B recorder → OA A recorder** and **OA B inspector → +OA A inspector**. The eligible lists each exposed the compatible local lifeline; +Create became available only after both bindings were supplied. The form's +destination remained the inner chosen operand and original before-anchor slot. + +Create/Save passed `check oa-reuse` and was preserved as `oa-reuse-verified/`. +One Undo/Save passed `check oa-state` plus exact `same` against the original +`oa-state-verified/`; `oa-reuse-undo/` preserves it. One Redo/Save passed `check +oa-reuse` plus exact `same` against the original reuse snapshot; +`oa-reuse-redo/` preserves it. Every check exited0 with full Project and two +exact reachable sources. The new occurrence UUID is +`c46abb1c-2c23-4c40-bfdd-ef1b1147498b`; the verified entry SHA256 is +`FFF7A28855033717DF8060EA9D459B8106FA54E1ACC79E14AAE661161C3B26F9`. +The reusable definition and all existing lifelines retain their original IDs. + ## Open native gates -OA nested state observation/reuse/fragment and all four SA creation checkpoints, +OA fragment and all four SA creation checkpoints, final reopen, blocked navigation/cancellation/recovery, detailed-list definition entry, minimum-size nested caller return, and B4 lifecycle rendering remain open. This report does not infer them from the passing root action. B4 is still a pure @@ -102,6 +154,6 @@ cfg(test) projection; independent Scene review identified lifetime bounds, branch-local activation clipping, incomplete-lane geometry and self-arrow endpoint work before production integration. -Continue from the saved OA action state in the run directory, following the exact +Continue from the saved OA reuse checkpoint in the run directory, following the exact fixture procedure. Root retains native input; concurrent source builds use the separate target tree and must not overwrite the running staged executable.