oa_scenario, sa_scenario |
viewpoint: ScenarioViewpoint; context: ref?; precondition, postcondition: strings; steps: occurrence refs |
-MixedLegacy for omitted schema-2 source; none; ""; ""; [] |
+MixedLegacy when viewpoint is omitted, including newly authored source 7 (see section 4.3); none; ""; ""; [] |
oa_lifeline, sa_lifeline |
represented: participant, work, or role ref? |
@@ -792,49 +792,71 @@ An Enumeration contains unique string literals. For example:
definition { Enumeration { literals ["Clear", "Fog"]; }; };
type_ref { Named @weather_classification; };
These are typed constructors with named fields, not embedded JSON documents.
-Constructor field names and enum spellings are case-sensitive. When replacing
-a constructor, all of its fields MUST be supplied; the containing declaration
-defaults do not silently fill a different constructor's missing fields.
-During schema-2 compatibility, the new Exchange fields message_kind,
-reply_to and values are exceptions: omitted values hydrate as
-Asynchronous, none and [] respectively. Canonical output writes them explicitly.
-This preserves older schema-2 source/JSON without inventing call correlation or
-value annotations. It is not a rule for an unspecified future schema.
+Constructor field names and enum spellings are case-sensitive. A selected
+constructor uses its own field contract; it does not inherit the payload of a
+different constructor from the declaration default. Required fields MUST be
+supplied. Nullability and omission are separate properties: ? denotes a
+value that can be none; a constructor's omission contract determines whether
+the field may be absent. There is no general all-constructor-fields-required
+rule. Other typed constructors use their contracts in the corresponding
+sections; the occurrence rules below do not establish defaults for them.
+The following table records the source-7 OccurrenceBody contracts. Optional
+references may be omitted and then mean none. Exchange also admits omitted
+message_kind and values, meaning Asynchronous and [] respectively.
+These omissions are accepted in newly authored source 7, not only in schema-2
+compatibility input. Earlier schema admission of constructors and fields is
+still governed by its version rules.
+Canonical formatting writes the hydrated occurrence references and default
+message_kind, reply_to and values explicitly. An absent
+operation remains omitted in canonical output. Lossless no-op updates and
+unrelated name edits retain authored omissions; canonical formatting is a
+different operation. An admitted incomplete occurrence can still produce model
+checks requesting its missing work, exchange, lifeline or referenced scenario.
Occurrence body constructors
-
-
+
+
+
Constructor |
Required fields |
+Fields that may be omitted, with their resulting values |
Exchange |
-exchange: exchange relation ref?; sender, receiver: lifeline refs?; message_kind: MessageKind; reply_to: occurrence ref?; values: MessageValue records |
+None |
+exchange: exchange relation ref?, sender, receiver: lifeline refs?, reply_to: occurrence ref?, operation: OperationUse? → none; message_kind: MessageKind → Asynchronous; values: MessageValue records → [] |
Action |
-action: activity/function ref?; lifeline: ref? |
+None |
+action: activity/function ref?, lifeline: ref? → none |
Control |
kind: Choice, Merge, Fork, Join, Loop |
+None |
SequenceReference |
-sequence: process/functional-chain ref? |
+None |
+sequence: process/functional-chain ref? → none |
ScenarioUse |
-scenario: scenario ref?; bindings: LifelineBinding records |
+bindings: LifelineBinding records |
+scenario: scenario ref? → none |
State |
-state: state/mode ref?; lifeline: ref? |
+None |
+state: state/mode ref?, lifeline: ref? → none |
Fragment |
operator: Alternative, Parallel, Loop, Optional; branches: branch occurrence refs |
+None |
Branch |
guard: string; occurrences: occurrence refs |
+None |
diff --git a/docs/language.rst b/docs/language.rst
index 54b5affe..f195aceb 100644
--- a/docs/language.rst
+++ b/docs/language.rst
@@ -120,7 +120,7 @@ lists all additional fields. ``ref`` means ``@alias``; ``ref?`` also accepts
- No implicit contract; ``legacy`` defaults none. OA admits Legacy only.
* - ``oa_scenario``, ``sa_scenario``
- ``viewpoint``: ScenarioViewpoint; ``context``: ref?; ``precondition``, ``postcondition``: strings; ``steps``: occurrence refs
- - MixedLegacy for omitted schema-2 source; none; ``""``; ``""``; ``[]``
+ - MixedLegacy when viewpoint is omitted, including newly authored source 7 (see section 4.3); none; ``""``; ``""``; ``[]``
* - ``oa_lifeline``, ``sa_lifeline``
- ``represented``: participant, work, or role ref?
- none
@@ -155,37 +155,60 @@ An Enumeration contains unique string literals. For example:
type_ref { Named @weather_classification; };
These are typed constructors with named fields, not embedded JSON documents.
-Constructor field names and enum spellings are case-sensitive. When replacing
-a constructor, all of its fields MUST be supplied; the containing declaration
-defaults do not silently fill a different constructor's missing fields.
-During schema-2 compatibility, the new Exchange fields ``message_kind``,
-``reply_to`` and ``values`` are exceptions: omitted values hydrate as
-Asynchronous, none and [] respectively. Canonical output writes them explicitly.
-This preserves older schema-2 source/JSON without inventing call correlation or
-value annotations. It is not a rule for an unspecified future schema.
+Constructor field names and enum spellings are case-sensitive. A selected
+constructor uses its own field contract; it does not inherit the payload of a
+different constructor from the declaration default. Required fields MUST be
+supplied. Nullability and omission are separate properties: ``?`` denotes a
+value that can be ``none``; a constructor's omission contract determines whether
+the field may be absent. There is no general all-constructor-fields-required
+rule. Other typed constructors use their contracts in the corresponding
+sections; the occurrence rules below do not establish defaults for them.
+
+The following table records the source-7 OccurrenceBody contracts. Optional
+references may be omitted and then mean ``none``. Exchange also admits omitted
+``message_kind`` and ``values``, meaning Asynchronous and ``[]`` respectively.
+These omissions are accepted in newly authored source 7, not only in schema-2
+compatibility input. Earlier schema admission of constructors and fields is
+still governed by its version rules.
+
+Canonical formatting writes the hydrated occurrence references and default
+``message_kind``, ``reply_to`` and ``values`` explicitly. An absent
+``operation`` remains omitted in canonical output. Lossless no-op updates and
+unrelated name edits retain authored omissions; canonical formatting is a
+different operation. An admitted incomplete occurrence can still produce model
+checks requesting its missing work, exchange, lifeline or referenced scenario.
.. list-table:: Occurrence body constructors
:header-rows: 1
- :widths: 22 78
+ :widths: 18 36 46
* - Constructor
- Required fields
+ - Fields that may be omitted, with their resulting values
* - Exchange
- - ``exchange``: exchange relation ref?; ``sender``, ``receiver``: lifeline refs?; ``message_kind``: MessageKind; ``reply_to``: occurrence ref?; ``values``: MessageValue records
+ - None
+ - ``exchange``: exchange relation ref?, ``sender``, ``receiver``: lifeline refs?, ``reply_to``: occurrence ref?, ``operation``: OperationUse? → ``none``; ``message_kind``: MessageKind → Asynchronous; ``values``: MessageValue records → ``[]``
* - Action
- - ``action``: activity/function ref?; ``lifeline``: ref?
+ - None
+ - ``action``: activity/function ref?, ``lifeline``: ref? → ``none``
* - Control
- ``kind``: Choice, Merge, Fork, Join, Loop
+ - None
* - SequenceReference
- - ``sequence``: process/functional-chain ref?
+ - None
+ - ``sequence``: process/functional-chain ref? → ``none``
* - ScenarioUse
- - ``scenario``: scenario ref?; ``bindings``: LifelineBinding records
+ - ``bindings``: LifelineBinding records
+ - ``scenario``: scenario ref? → ``none``
* - State
- - ``state``: state/mode ref?; ``lifeline``: ref?
+ - None
+ - ``state``: state/mode ref?, ``lifeline``: ref? → ``none``
* - Fragment
- ``operator``: Alternative, Parallel, Loop, Optional; ``branches``: branch occurrence refs
+ - None
* - Branch
- ``guard``: string; ``occurrences``: occurrence refs
+ - None
For example, ``body { Action { action @assess; lifeline @operator_line; }; };``
selects an Action occurrence. Processes and functional chains contain Exchange,
diff --git a/harness/PLAN.md b/harness/PLAN.md
index 8da4cf78..b607e5e3 100644
--- a/harness/PLAN.md
+++ b/harness/PLAN.md
@@ -7,14 +7,19 @@ Updated 2026-09-11, Codex-9e8r6t `/root`.
## Immediate implementation and acceptance
-1. Commit/publish the now-verified creation integration and matching GUI stage. Final immutable
+1. Preserve the verified creation integration and matching GUI stage, committed
+ as 4bb4aaf and transferred with independent anonymous readback/hash verification. Final immutable
desktop653/653 passed after creation ancestry/guide changes, alongside focused
creation21/guide3. StrictClippy/fmt pass after a behavior-equivalent history
rewrite; affected history63 and GUI build also pass. Preserve exact artifact
scopes and serialize future Cargo/source leases.
-2. Natively test the independently reviewed local creation workflow: explicit
- names/viewpoints/owners, source/property draft retention, SA recovery, first
- Escape and exact source/selection/Undo. Address actual task friction.
+2. Named process/scenario/machine creation, exact Undo/Redo and nine-file reopen
+ have passed at actual minimum size. Wide/minimum cancellation passed; SA draft
+ crash recovery is active. Address observed blank canvases and prerequisite
+ creation detours through the staged-source plan: source subform retains the
+ parent draft and final adoption atomically creates prerequisite and consumer.
+ First slice covers Lifeline, process Work and machine owner, with semantic
+ first-action prompts. Independent review precedes final integration/native QA.
3. Operate the rebuilt app at minimum/normal sizes. Complete the saved basic
supplementary move/camera/invalid-draft and minimum-size story; the main basic
model and explicit transition passed full Project+SourceBundle, Undo/Redo and
diff --git a/harness/STATE.md b/harness/STATE.md
index 13fb3dad..fc0dbbe6 100644
--- a/harness/STATE.md
+++ b/harness/STATE.md
@@ -12,12 +12,14 @@ in that file. It requires constraints/calculations, quantities/units and reusabl
libraries, plus uncluttered human/AI text-only modeling at small and large scale.
Long homogeneous lists and poor behavior editing remain explicit concerns.
-Local branch: `codex/release1-9e8r6t`, base `1797516`, committed head `d114a27` at
-this checkpoint. Scenario integration3978bbe and subsequent Sensor identity fix
-are committed. Named behavior creation is wired and has passing focused tests;
-its final ancestry/guide correction passed full653; post-lint history63, strict
-Clippy/fmt and matching GUI build passed. Preserve all
-workers' edits. No open Gitea PRs at the latest read, comments through118.
+Local branch: `codex/release1-9e8r6t`, base `1797516`, committed head `4bb4aaf`.
+Named behavior creation, its guide and independent oracle, concise text-first
+examples and prior integration evidence are committed and remotely transferred.
+Its final ancestry/guide correction passed full653; post-lint history63, strict
+Clippy/fmt and matching GUI build passed. Current uncommitted work corrects the
+oracle's retained-file rule, clarifies source-7 constructor defaults, records
+native creation and implements contextual prerequisite creation. Preserve all
+workers' edits. No open Gitea PRs at the latest read, comments through138.
## Completed work and scoped evidence
@@ -51,7 +53,26 @@ workers' edits. No open Gitea PRs at the latest read, comments through118.
found no additional correctness blocker. StrictClippy/all-targets/-Dwarnings
and workspacefmt pass after one behavior-equivalent history_fields let-chain
correction; affected history63/63 and matching GUI rebuild pass. Current native
- GUI is `gui-verified` SHA D4D9C2BD…B20C31; native acceptance is active.
+ GUI is `gui-verified` SHA D4D9C2BD…B20C31. At actual 1100×700 client size,
+ named OA Process, explicit ParticipantInteraction Scenario with capability
+ context and SA owner-linked State machine plus requested first view passed
+ complete independent Project/SourceBundle checks at 7/8/9 files. Each single
+ Undo/Redo preserved exact expected semantics, sources and role identities.
+ Reopen/Save retained all nine physical source files byte-for-byte. Wide/minimum
+ draft cancellations retained the initial six files exactly. Detailed report:
+ [native creation](release-behavior-creation-native-20260911.md).
+- Independent creation oracle v2 corrects a harness assumption: Save retains
+ known detached source files after Undo. Full Project and reachable source
+ equality remain mandatory; the complete physical inventory must equal the
+ explicit pre-Undo checkpoint overlaid with expected reachable bytes. Unknown,
+ changed or missing retained files fail. No product defect was hidden by this
+ correction; see [oracle review](release-behavior-creation-oracle-20260911.md).
+- Fresh source-7 constructor probes passed 54 explicit/omitted comparisons and
+ 12 required-field refusals across OA/SA, with complete typed models, canonical
+ reparse and exact authored no-op/name-edit retention. Constructor and Scenario
+ default wording now describes current behavior; strict HTML regeneration
+ passed. Other constructor families are explicitly outside this evidence.
+ See [default review](release-constructor-defaults-review-20260911.md).
- Source schema checks passed: 72 fixtures, 204 schemas, 14 families, 90 scalar
leaves. API/language reST rendered with strict docutils without warnings.
- Packaging committed `b98f135`: portable Linux adapter, shared package checks,
@@ -84,18 +105,29 @@ Detailed evidence: [integrated gates](release-integrated-gates-20260910.md),
## Active ownership and execution
-- Root: integration, common ledgers, source/API checks. Full653 is terminal PASS.
- Computer Use remains authorized; old Escape holds are historical. Native input
- is temporarily leased exclusively to palette_finish for the bounded QA below.
-- `release_audit`: creation/guide/historylint implementation and report frozen,
- all assigned gates passed; Cargo writer released. No duplicate full suite.
-- `behavior_audit`: independent native creation saved-model oracle compiled
- warnings-denied; self-falsifiers and six-source baseline pass. Exe73FA81…A9BFF;
- final report follows. Direct-rustc released; no native.
-- `palette_finish`: exclusive native lease for fresh v4 GUI wide/minimum creation
- drafts, focus, long names, first Escape and exact cancellation. No accepted new
- model objects until the independent oracle; no source/Cargo. Text experiment
- finished and its loopback server is stopped.
+- Root: integration, common ledgers, source/API checks and exclusive native input.
+ Full653 is terminal PASS. V4 creation/Undo/Redo/reopen is complete; actual SA
+ pending-draft crash recovery is active on the same verified GUI. The forced
+ interruption targeted only isolated QA PID5184 after checkpoint persistence;
+ restarted PID1284/window6161106 uses the same private profile and runtime.
+ Recovery is now terminal PASS: full draft fields/IDs retained, autofocus,
+ first Escape and a fresh Save As preserve the complete nine-file model. The
+ current wide GUI is saved on `checkpoint-recovery-cancel/project.arcadia`;
+ treat that checkpoint as immutable and reopen a work copy before editing.
+- `release_audit`: prior creation and constructor reports frozen. Now owns the
+ staged prerequisite creation implementation for Scenario Lifeline/process Work/
+ New machine owner, semantic first-action prompts, relevant App/recovery/guide
+ wiring and focused tests. Cargo writer is reserved to this worker when needed;
+ freeze source during tests and request independent review before integration.
+- `behavior_audit`: v2 native oracle frozen, warnings-denied compilation and
+ falsifiers pass, executable056EEFD…F6A36. Now independently challenges staged
+ source semantics and expected behavior; no production/Cargo/native ownership.
+- `palette_finish`: native report/evidence frozen: 13 creation oracle commands
+ and 19 separate recovery checks pass. Now owns new `crates/oa-cli` for local
+ source check/lint, preview/explicit-write stabilization and alias rename/diff.
+ Uses existing source-file diagnostics/expectations/journal writer, no grammar
+ or core changes. Root owns workspace/lock integration; serialize Cargo with
+ release_audit. Preview UUIDs remain candidates until that invocation writes.
- Separate host Codex-956atf: standalone scenario lifetime projection, independent
native scenario oracle, quantity/calculation design and library design. It has
its own cold toolchain/results. Its source-only reviews are not local passes.
@@ -112,18 +144,24 @@ unassigned-lane map differences that must be addressed before acceptance.
1. Finish native basic supplementary move/camera/focus/minimum matrix and current
scenario/process/state tasks. Main basic/transition/history/reopen passed at
wide size. Check raw drafts, recovery, exact source and real task completion.
-2. Natively verify named local Process/Scenario/State machine creation; address
- contextual missing-source and operand-editing detours from the behavior audit.
+2. Implement/review/natively verify contextual
+ missing-source and first-action flows. Named creation/history/reopen passed;
+ operand-editing and qualified Action allocation remain separate open work.
3. Constraints/calculations and quantity compatibility are currently descriptive
metadata; same-project includes are not maintained cross-project libraries.
Independent semantic designs and falsification are active before broad schema
changes. See [library review brief](release-library-candidate-review-20260910.md).
Other-host proposals expose cosmetic package revision/type compatibility,
subjectless analysis closure and text-only instance normalization decisions;
- full reports are requested but not yet available locally.
-4. Implement and evaluate text-only authoring improvements after synthesizing
- local usability and other-host language designs. Concise examples alone do
- not satisfy modular engineering navigation and safe changes.
+ full reports and paired criticism are now available from verified c6d296a.
+ Its 218-assertion maintenance experiment supports explicit baseline values
+ with one-level Case overrides; complete freeze and effective-case evaluation
+ are required. Refined baseline/library contracts remain active externally.
+4. Implement and evaluate the source-only CLI baseline, then compare language
+ improvements using both local usability and complete other-host proposals.
+ Current grammar+tooling, domain syntax, namespaces and portable identity
+ modules remain distinct candidates. Concise examples/CLI alone do not prove
+ uncluttered modular engineering authoring or safe large-model changes.
5. Run coherent current desktop/core/server, specification, examples, REST and
optimized packaging gates after integration. Prior passes remain scoped.
6. Current Linux runtime requires a viable environment: supported WSL2 import
@@ -140,8 +178,23 @@ anonymous fetch and Gitea MCP still work. Integration3978bbe was published and
independently fetched/hash-verified as a Git bundle on
`codex/integration-transfer-20260910`; Wiki `Integration3978bbe` and issue#97 own
exact transfer instructions. Other host has integrated it and an equivalent
-Sensor fix. Publish the next coherent creation/docs checkpoint similarly;
-preserve its later B4/reference chooser/design work and avoid duplicate patches.
+Sensor fix. Creation4bb4aaf was likewise published on
+`codex/integration-transfer-20260911`, file
+`harness/transfers/creation-4bb4aaf.bundle.b64`: decoded105022 bytes,
+SHA256 `0DEFAE91A56430076C432758F923BC0675911DA9FA7588C9961FF15F47EAEBF6`,
+prerequisite3978bbe. Anonymous Git readback, strict base64 length/hash check and
+`git bundle verify` passed; issue#128 gives selective integration instructions.
+Publish subsequent corrected oracle/native/default evidence similarly; preserve
+the other host's later B4/reference chooser/design work and avoid duplicates.
+
+Other-host c6d296a transfer is verified and imported as local
+`codex/behavior-snapshot-c6d296a`: 334830 bytes,
+SHA256 `526A80E2D32ED0E57A7B2372B5F02D4652E8751DFEBA81953C4F045225D6AACB`,
+prerequisite1797516, from `codex/behavior-transfer-20260910` file
+`harness/transfers/behavior-c6d296a.bundle.b64`. Selected analysis/library/text
+reports, criticism, experiments and independent scenario oracle are restored;
+51 evidence files compare byte-for-byte with Git blobs. No source/ledger merge.
+Issue#136/#143 and refreshed Wiki Authoring20260911 record the handoff.
The old ledgers, including all historical platform and native evidence, were
archived byte-for-byte before this consolidation in
diff --git a/harness/TASK_LEDGER.md b/harness/TASK_LEDGER.md
index ea8eda1e..f9bbe554 100644
--- a/harness/TASK_LEDGER.md
+++ b/harness/TASK_LEDGER.md
@@ -42,8 +42,11 @@ four/six-source independent model oracles; supplementary native cases remain.
Corrected immutable desktop631/631 passed; later Sensor correction passed53/53.
Final creation21/guide3 and matching full desktop653/653 passed after ancestry
label correction. StrictClippy/fmt pass after one behavior-equivalent history
-let-chain rewrite; affected history63 and matching GUI build pass. Native acceptance
-is active. Mounted
+let-chain rewrite; affected history63 and matching GUI build pass. Native named
+creation passes complete model and 7/8/9-source oracles, individual Undo/Redo and
+byte-exact nine-file reopen at actual minimum size. Cancellation preserves the
+six-file baseline. Blank process/scenario canvases provide no useful first-action
+prompt; this is an observed usability finding. SA draft recovery remains active. Mounted
layout tests establish pane geometry, not native task acceptance. Packaging checks
and independent review are scoped to supplied binaries/fixtures, not release
acceptance. Supported WSL2 import failed; a current Linux runtime is unavailable.
@@ -86,7 +89,14 @@ usability nor large-project performance.
- Behavior creation: compact New → three task choices → focused name/owner/
viewpoint card, explicit missing inputs, atomic creation and reserved recovery
- IDs. Implemented and independently reviewed; final gates/native proof pending.
+ IDs. Implemented, reviewed and scoped native creation/history/reopen passed.
+- Contextual prerequisite creation: stage an explicit typed source inside the
+ current parent draft, then validate/adopt source and consumer atomically. This
+ preserves intent and one-step history; a separate Architecture excursion or
+ early source commit loses those guarantees. Initial Lifeline/process Work/
+ machine-owner adapters and semantic first-action prompts are being implemented
+ and independently challenged; acceptance remains pending. See the
+ [bounded plan](release-contextual-source-creation-plan-20260911.md).
- Scenario workspace: compact header, optional Tools/Selection shelves, actual
remaining-height canvas/form, pinned actions, independent scrolling and
explicit Fit/Focus. Mounted tests support this choice; native proof pending.
diff --git a/harness/behavior-creation-contract.rs b/harness/behavior-creation-contract.rs
index 1615138e..773c6979 100644
--- a/harness/behavior-creation-contract.rs
+++ b/harness/behavior-creation-contract.rs
@@ -1,5 +1,5 @@
//! Independent native creation oracle; no desktop producer is imported.
-//! self-check BASE | check STAGE BASE ACTUAL ROLES | same EXPECTED ACTUAL
+//! self-check BASE | check STAGE BASE ACTUAL ROLES | same EXPECTED ACTUAL [UNDO_FROM]
use oa_core::{source_project::*, *};
use std::{
collections::{BTreeMap, BTreeSet},
@@ -41,7 +41,9 @@ impl Stage {
}
}
-fn source_paths(root: &Path, here: &Path, paths: &mut BTreeSet) {
+type DiskSources = BTreeMap>;
+
+fn source_paths(root: &Path, here: &Path, paths: &mut DiskSources) {
for entry in fs::read_dir(here).unwrap() {
let entry = entry.unwrap();
let kind = entry.file_type().unwrap();
@@ -61,11 +63,12 @@ fn source_paths(root: &Path, here: &Path, paths: &mut BTreeSet) {
.to_str()
.unwrap()
.replace('\\', "/"),
+ fs::read(entry.path()).unwrap(),
);
}
}
}
-fn load(entry: &Path) -> CompiledSourceProject {
+fn load_checkpoint(entry: &Path) -> (CompiledSourceProject, DiskSources) {
let files = source_files::load_project(entry, ProjectLimits::default()).unwrap();
let raw = files.reachable_bundle();
let compiled = compile_bundle(&raw, ProjectLimits::default()).unwrap();
@@ -74,13 +77,30 @@ fn load(entry: &Path) -> CompiledSourceProject {
"No migration, normalization or implicit identity insertion"
);
execute_batch(&compiled.decoded.project, &[]).unwrap();
- let mut disk = BTreeSet::new();
+ let mut disk = BTreeMap::new();
let root = entry.parent().unwrap();
source_paths(root, root, &mut disk);
+ (compiled, disk)
+}
+fn predicted_disk(reachable: &SourceBundle, undo_from: Option<&DiskSources>) -> DiskSources {
+ // Saving Undo writes the restored reachable files and deliberately keeps
+ // detached files from the previously saved checkpoint. Never infer their
+ // bytes from the actual Undo directory: its explicit origin is the oracle.
+ let mut expected = undo_from.cloned().unwrap_or_default();
+ expected.extend(
+ reachable
+ .files
+ .iter()
+ .map(|(path, source)| (path.clone(), source.as_bytes().to_vec())),
+ );
+ expected
+}
+fn load(entry: &Path) -> CompiledSourceProject {
+ let (compiled, disk) = load_checkpoint(entry);
assert_eq!(
disk,
- raw.files.keys().cloned().collect(),
- "Reject detached extra source files too"
+ predicted_disk(&compiled.bundle, None),
+ "Ordinary checkpoints must contain exactly their reachable source files; retained Undo files require an explicit origin"
);
compiled
}
@@ -526,6 +546,76 @@ fn self_check(base: &CompiledSourceProject) {
"Reject an altered baseline before use"
);
assert_equal(&original, base);
+ let before = predict(base, Stage::Scenario, &carrier);
+ let created = predict(base, Stage::Machine, &carrier);
+ let origin = predicted_disk(&created.bundle, None);
+ let detached: Vec<_> = created
+ .bundle
+ .files
+ .keys()
+ .filter(|path| !before.bundle.files.contains_key(*path))
+ .cloned()
+ .collect();
+ assert_eq!(
+ detached.len(),
+ 1,
+ "A machine creation adds one source module"
+ );
+ // Independently simulate the saver's observable result: restored reachable
+ // bytes plus the one new module left on disk by the prior creation.
+ let mut retained = predicted_disk(&before.bundle, None);
+ retained.insert(
+ detached[0].clone(),
+ created.bundle.files[&detached[0]].as_bytes().to_vec(),
+ );
+ assert_eq!(
+ retained[&detached[0]], origin[&detached[0]],
+ "Retained bytes must come from the exact created checkpoint"
+ );
+ assert_ne!(
+ retained,
+ predicted_disk(&before.bundle, None),
+ "Ordinary comparison must not accept detached history files"
+ );
+ assert_eq!(
+ retained,
+ predicted_disk(&before.bundle, Some(&origin)),
+ "Explicit Undo origin permits only the expected retained bytes"
+ );
+ let mut unknown = retained.clone();
+ unknown.insert("unknown.arcadia".into(), b"// Unclaimed file\n".to_vec());
+ assert_ne!(
+ unknown,
+ predicted_disk(&before.bundle, Some(&origin)),
+ "Reject unknown detached files"
+ );
+ let mut changed = retained.clone();
+ changed.get_mut(&detached[0]).unwrap().push(b' ');
+ assert_ne!(
+ changed,
+ predicted_disk(&before.bundle, Some(&origin)),
+ "Reject changed detached bytes"
+ );
+ let mut missing = retained.clone();
+ missing.remove(&detached[0]);
+ assert_ne!(
+ missing,
+ predicted_disk(&before.bundle, Some(&origin)),
+ "The retained file set is exact, not optional"
+ );
+ let mut reachable_drift = retained.clone();
+ reachable_drift
+ .get_mut("rationale.arcadia")
+ .unwrap()
+ .push(b' ');
+ assert_ne!(
+ reachable_drift,
+ predicted_disk(&before.bundle, Some(&origin)),
+ "An Undo exemption cannot hide reachable-source changes"
+ );
+ println!(
+ "PASS explicit Undo disk contract: known detached retention accepted; unknown, changed, missing and reachable drift rejected"
+ );
println!("PASS baseline retained unchanged; no native acceptance claimed");
}
fn main() {
@@ -554,15 +644,33 @@ fn main() {
);
}
Some("same") => {
- assert_eq!(args.len(), 4, "same EXPECTED_CHECKPOINT ACTUAL_CHECKPOINT");
+ assert!(
+ matches!(args.len(), 4 | 5),
+ "same EXPECTED_CHECKPOINT ACTUAL_CHECKPOINT [UNDO_FROM_CHECKPOINT]"
+ );
let expected = load(Path::new(&args[2]));
- let actual = load(Path::new(&args[3]));
+ let (actual, disk) = load_checkpoint(Path::new(&args[3]));
assert_equal(&expected, &actual);
+ let origin = args.get(4).map(|entry| {
+ // The first committed checkpoint is itself exact. This keeps
+ // arbitrary pre-existing detached files out of the exception.
+ let committed = load(Path::new(entry));
+ predicted_disk(&committed.bundle, None)
+ });
+ assert_eq!(
+ disk,
+ predicted_disk(&expected.bundle, origin.as_ref()),
+ "Disk source files differ from the exact checkpoint plus explicitly proven retained Undo files"
+ );
println!(
- "PASS exact checkpoint identity/model/{}-file SourceBundle equality",
- actual.bundle.files.len()
+ "PASS exact checkpoint identity/model/{}-file SourceBundle equality; {} exact disk files ({} known retained)",
+ actual.bundle.files.len(),
+ disk.len(),
+ disk.len() - actual.bundle.files.len()
);
}
- _ => panic!("self-check BASE | check STAGE BASE ACTUAL ROLES | same EXPECTED ACTUAL"),
+ _ => panic!(
+ "self-check BASE | check STAGE BASE ACTUAL ROLES | same EXPECTED ACTUAL [UNDO_FROM]"
+ ),
}
}
diff --git a/harness/experiments/analysis-context-20260911/README.md b/harness/experiments/analysis-context-20260911/README.md
new file mode 100644
index 00000000..611314ba
--- /dev/null
+++ b/harness/experiments/analysis-context-20260911/README.md
@@ -0,0 +1,29 @@
+# Analysis context experiment
+
+This standalone Rust program compares explicit baseline/override studies (B) with complete independent case bindings (D). It is an isolated experiment, **not Studio syntax or a production model implementation**. Its expression language is deliberately limited to integer magnitudes in milliseconds, addition/sum, comparison, missing inputs and pure reusable functions.
+
+The source owns the fixture generator, parser, explicit context resolver, dependency-cycle check, evaluator, frozen-snapshot operation, provenance observations and line-diff counter. All comparisons use the same 20 fixed inputs, 2 varying inputs and 20 named cases. The formula/check variants are either inline or factored into reusable pure definitions.
+
+From the repository root, using the installed local toolchain:
+
+```powershell
+. .local/toolchain/env.ps1
+New-Item -ItemType Directory -Force .local/analysis-context-20260911 | Out-Null
+rustc --edition=2024 -D warnings -C linker=clang.exe harness/experiments/analysis-context-20260911/main.rs -o .local/analysis-context-20260911/analysis-context.exe
+if ($LASTEXITCODE -ne 0) { throw 'Experiment compilation failed' }
+& .local/analysis-context-20260911/analysis-context.exe harness/experiments/analysis-context-20260911/generated
+if ($LASTEXITCODE -ne 0) { throw 'Experiment assertions failed' }
+```
+
+The program overwrites its named generated fixtures/results in the output directory. It does not invoke Cargo, modify `target`, or import Studio modules. `EVIDENCE.json` was recorded separately after the verified run and contains exact compiler, program/executable/result hashes and every generated source fixture hash. Rerunning after editing the program requires refreshing that evidence rather than trusting the old manifest.
+
+- [Results](generated/RESULTS.md): executed counts and assertions.
+- [Evidence](generated/EVIDENCE.json): final run identity and 29 fixture hashes.
+- [B with factored calculations](generated/B-factored.study) and [D equivalent](generated/D-factored.study).
+- [B case provenance](generated/B-factored-provenance.md).
+- [Frozen B case](generated/B-factored-frozen-case20.study): complete independent snapshot, copied definitions and explicit captured row origins.
+- [Interpretation and limitations](../../release-analysis-context-experiment-20260911.md).
+
+The small dialect has explicit `study B/D revision`, a shared property catalog, optional pure `function` declarations, an explicit named `baseline` for B, and named cases declaring either `base engineering` or `independent`. `missing` is an entire binding hole. Removing a B override resolves the baseline; removing a required D row rejects. Function parameters cannot capture project properties. No case-to-case inheritance or implicit selected/default case exists.
+
+Generated studies do not have OA/SA subjects, UUID identity, quantity kinds, persistent source editing, JSON/REST, library import resolution or native UI integration. The experiment compares context semantics and the actual emitted text size/edit count, not human completion time or end-to-end product conformance.
diff --git a/harness/experiments/analysis-context-20260911/generated/B-factored-cleared-override.study b/harness/experiments/analysis-context-20260911/generated/B-factored-cleared-override.study
new file mode 100644
index 00000000..a6c5da98
--- /dev/null
+++ b/harness/experiments/analysis-context-20260911/generated/B-factored-cleared-override.study
@@ -0,0 +1,107 @@
+study B revision 1
+properties fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02, total, budget
+function budget_formula(result) = le(result, 22000)
+function total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02) = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+baseline engineering revision 1
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 750
+ varying02 = 1000
+end
+case case01 base engineering
+end
+case case02 base engineering
+ varying01 = 800
+ varying02 = 1025
+end
+case case03 base engineering
+ varying01 = 850
+ varying02 = 1050
+end
+case case04 base engineering
+ varying01 = 900
+ varying02 = 1075
+end
+case case05 base engineering
+ varying01 = 950
+ varying02 = 1100
+end
+case case06 base engineering
+ varying01 = 1000
+ varying02 = 1125
+end
+case case07 base engineering
+ varying01 = 1050
+ varying02 = 1150
+end
+case case08 base engineering
+ varying01 = 1100
+ varying02 = 1175
+end
+case case09 base engineering
+ varying01 = 1150
+ varying02 = 1200
+end
+case case10 base engineering
+ varying01 = 1200
+ varying02 = 1225
+end
+case case11 base engineering
+ varying01 = 1250
+ varying02 = 1250
+end
+case case12 base engineering
+ varying01 = 1300
+ varying02 = 1275
+end
+case case13 base engineering
+ varying01 = 1350
+ varying02 = 1300
+end
+case case14 base engineering
+ varying01 = 1400
+ varying02 = 1325
+end
+case case15 base engineering
+ varying01 = 1450
+ varying02 = 1350
+end
+case case16 base engineering
+ varying01 = 1500
+ varying02 = 1375
+end
+case case17 base engineering
+ varying01 = 1550
+ varying02 = 1400
+end
+case case18 base engineering
+ varying01 = 1600
+ varying02 = 1425
+end
+case case19 base engineering
+ varying01 = 1650
+ varying02 = 1450
+end
+case case20 base engineering
+ varying02 = 1475
+end
diff --git a/harness/experiments/analysis-context-20260911/generated/B-factored-cycle.rejected-study b/harness/experiments/analysis-context-20260911/generated/B-factored-cycle.rejected-study
new file mode 100644
index 00000000..f590771d
--- /dev/null
+++ b/harness/experiments/analysis-context-20260911/generated/B-factored-cycle.rejected-study
@@ -0,0 +1,108 @@
+study B revision 1
+properties fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02, total, budget
+function budget_formula(result) = le(result, 22000)
+function total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02) = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+baseline engineering revision 1
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 750
+ varying02 = 1000
+end
+case case01 base engineering
+end
+case case02 base engineering
+ varying01 = 800
+ varying02 = 1025
+end
+case case03 base engineering
+ varying01 = 850
+ varying02 = 1050
+end
+case case04 base engineering
+ varying01 = 900
+ varying02 = 1075
+end
+case case05 base engineering
+ varying01 = 950
+ varying02 = 1100
+end
+case case06 base engineering
+ varying01 = 1000
+ varying02 = 1125
+end
+case case07 base engineering
+ varying01 = 1050
+ varying02 = 1150
+end
+case case08 base engineering
+ varying01 = 1100
+ varying02 = 1175
+end
+case case09 base engineering
+ varying01 = 1150
+ varying02 = 1200
+end
+case case10 base engineering
+ varying01 = 1200
+ varying02 = 1225
+end
+case case11 base engineering
+ varying01 = 1250
+ varying02 = 1250
+end
+case case12 base engineering
+ varying01 = 1300
+ varying02 = 1275
+end
+case case13 base engineering
+ varying01 = 1350
+ varying02 = 1300
+end
+case case14 base engineering
+ varying01 = 1400
+ varying02 = 1325
+end
+case case15 base engineering
+ varying01 = 1450
+ varying02 = 1350
+end
+case case16 base engineering
+ varying01 = 1500
+ varying02 = 1375
+end
+case case17 base engineering
+ varying01 = 1550
+ varying02 = 1400
+end
+case case18 base engineering
+ varying01 = 1600
+ varying02 = 1425
+end
+case case19 base engineering
+ varying01 = 1650
+ varying02 = 1450
+end
+case case20 base engineering
+ varying01 = total
+ varying02 = 1475
+end
diff --git a/harness/experiments/analysis-context-20260911/generated/B-factored-fixed-all.study b/harness/experiments/analysis-context-20260911/generated/B-factored-fixed-all.study
new file mode 100644
index 00000000..31b17393
--- /dev/null
+++ b/harness/experiments/analysis-context-20260911/generated/B-factored-fixed-all.study
@@ -0,0 +1,108 @@
+study B revision 2
+properties fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02, total, budget
+function budget_formula(result) = le(result, 22000)
+function total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02) = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+baseline engineering revision 2
+ budget = budget_formula(total)
+ fixed01 = 1200
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 750
+ varying02 = 1000
+end
+case case01 base engineering
+end
+case case02 base engineering
+ varying01 = 800
+ varying02 = 1025
+end
+case case03 base engineering
+ varying01 = 850
+ varying02 = 1050
+end
+case case04 base engineering
+ varying01 = 900
+ varying02 = 1075
+end
+case case05 base engineering
+ varying01 = 950
+ varying02 = 1100
+end
+case case06 base engineering
+ varying01 = 1000
+ varying02 = 1125
+end
+case case07 base engineering
+ varying01 = 1050
+ varying02 = 1150
+end
+case case08 base engineering
+ varying01 = 1100
+ varying02 = 1175
+end
+case case09 base engineering
+ varying01 = 1150
+ varying02 = 1200
+end
+case case10 base engineering
+ varying01 = 1200
+ varying02 = 1225
+end
+case case11 base engineering
+ varying01 = 1250
+ varying02 = 1250
+end
+case case12 base engineering
+ varying01 = 1300
+ varying02 = 1275
+end
+case case13 base engineering
+ varying01 = 1350
+ varying02 = 1300
+end
+case case14 base engineering
+ varying01 = 1400
+ varying02 = 1325
+end
+case case15 base engineering
+ varying01 = 1450
+ varying02 = 1350
+end
+case case16 base engineering
+ varying01 = 1500
+ varying02 = 1375
+end
+case case17 base engineering
+ varying01 = 1550
+ varying02 = 1400
+end
+case case18 base engineering
+ varying01 = 1600
+ varying02 = 1425
+end
+case case19 base engineering
+ varying01 = 1650
+ varying02 = 1450
+end
+case case20 base engineering
+ varying01 = 1700
+ varying02 = 1475
+end
diff --git a/harness/experiments/analysis-context-20260911/generated/B-factored-frozen-case20.study b/harness/experiments/analysis-context-20260911/generated/B-factored-frozen-case20.study
new file mode 100644
index 00000000..aac5be0c
--- /dev/null
+++ b/harness/experiments/analysis-context-20260911/generated/B-factored-frozen-case20.study
@@ -0,0 +1,55 @@
+study D revision 1
+origin B:case20:document1:engineering@1
+captured budget = baseline:engineering@1 via case20
+captured fixed01 = baseline:engineering@1 via case20
+captured fixed02 = baseline:engineering@1 via case20
+captured fixed03 = baseline:engineering@1 via case20
+captured fixed04 = baseline:engineering@1 via case20
+captured fixed05 = baseline:engineering@1 via case20
+captured fixed06 = baseline:engineering@1 via case20
+captured fixed07 = baseline:engineering@1 via case20
+captured fixed08 = baseline:engineering@1 via case20
+captured fixed09 = baseline:engineering@1 via case20
+captured fixed10 = baseline:engineering@1 via case20
+captured fixed11 = baseline:engineering@1 via case20
+captured fixed12 = baseline:engineering@1 via case20
+captured fixed13 = baseline:engineering@1 via case20
+captured fixed14 = baseline:engineering@1 via case20
+captured fixed15 = baseline:engineering@1 via case20
+captured fixed16 = baseline:engineering@1 via case20
+captured fixed17 = baseline:engineering@1 via case20
+captured fixed18 = baseline:engineering@1 via case20
+captured fixed19 = baseline:engineering@1 via case20
+captured fixed20 = baseline:engineering@1 via case20
+captured total = baseline:engineering@1 via case20
+captured varying01 = case:case20
+captured varying02 = case:case20
+properties fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02, total, budget
+function budget_formula(result) = le(result, 22000)
+function total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02) = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+case case20 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1700
+ varying02 = 1475
+end
diff --git a/harness/experiments/analysis-context-20260911/generated/B-factored-missing.study b/harness/experiments/analysis-context-20260911/generated/B-factored-missing.study
new file mode 100644
index 00000000..f7588979
--- /dev/null
+++ b/harness/experiments/analysis-context-20260911/generated/B-factored-missing.study
@@ -0,0 +1,108 @@
+study B revision 1
+properties fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02, total, budget
+function budget_formula(result) = le(result, 22000)
+function total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02) = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+baseline engineering revision 1
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 750
+ varying02 = 1000
+end
+case case01 base engineering
+end
+case case02 base engineering
+ varying01 = 800
+ varying02 = 1025
+end
+case case03 base engineering
+ varying01 = 850
+ varying02 = 1050
+end
+case case04 base engineering
+ varying01 = 900
+ varying02 = 1075
+end
+case case05 base engineering
+ varying01 = 950
+ varying02 = 1100
+end
+case case06 base engineering
+ varying01 = 1000
+ varying02 = 1125
+end
+case case07 base engineering
+ varying01 = 1050
+ varying02 = 1150
+end
+case case08 base engineering
+ varying01 = 1100
+ varying02 = 1175
+end
+case case09 base engineering
+ varying01 = 1150
+ varying02 = 1200
+end
+case case10 base engineering
+ varying01 = 1200
+ varying02 = 1225
+end
+case case11 base engineering
+ varying01 = 1250
+ varying02 = 1250
+end
+case case12 base engineering
+ varying01 = 1300
+ varying02 = 1275
+end
+case case13 base engineering
+ varying01 = 1350
+ varying02 = 1300
+end
+case case14 base engineering
+ varying01 = 1400
+ varying02 = 1325
+end
+case case15 base engineering
+ varying01 = 1450
+ varying02 = 1350
+end
+case case16 base engineering
+ varying01 = 1500
+ varying02 = 1375
+end
+case case17 base engineering
+ varying01 = 1550
+ varying02 = 1400
+end
+case case18 base engineering
+ varying01 = 1600
+ varying02 = 1425
+end
+case case19 base engineering
+ varying01 = 1650
+ varying02 = 1450
+end
+case case20 base engineering
+ varying01 = missing
+ varying02 = 1475
+end
diff --git a/harness/experiments/analysis-context-20260911/generated/B-factored-provenance.md b/harness/experiments/analysis-context-20260911/generated/B-factored-provenance.md
new file mode 100644
index 00000000..b452d2fc
--- /dev/null
+++ b/harness/experiments/analysis-context-20260911/generated/B-factored-provenance.md
@@ -0,0 +1,31 @@
+# B-factored: case20 evaluation
+
+Value: Bool(false)
+Document revision: 1
+
+- budget: baseline:engineering@1 via case20
+- fixed01: baseline:engineering@1 via case20
+- fixed02: baseline:engineering@1 via case20
+- fixed03: baseline:engineering@1 via case20
+- fixed04: baseline:engineering@1 via case20
+- fixed05: baseline:engineering@1 via case20
+- fixed06: baseline:engineering@1 via case20
+- fixed07: baseline:engineering@1 via case20
+- fixed08: baseline:engineering@1 via case20
+- fixed09: baseline:engineering@1 via case20
+- fixed10: baseline:engineering@1 via case20
+- fixed11: baseline:engineering@1 via case20
+- fixed12: baseline:engineering@1 via case20
+- fixed13: baseline:engineering@1 via case20
+- fixed14: baseline:engineering@1 via case20
+- fixed15: baseline:engineering@1 via case20
+- fixed16: baseline:engineering@1 via case20
+- fixed17: baseline:engineering@1 via case20
+- fixed18: baseline:engineering@1 via case20
+- fixed19: baseline:engineering@1 via case20
+- fixed20: baseline:engineering@1 via case20
+- total: baseline:engineering@1 via case20
+- varying01: case:case20
+- varying02: case:case20
+
+Rejected cycle: case20: cycle: budget -> total -> varying01 -> total
diff --git a/harness/experiments/analysis-context-20260911/generated/B-factored-threshold.study b/harness/experiments/analysis-context-20260911/generated/B-factored-threshold.study
new file mode 100644
index 00000000..28d73ee7
--- /dev/null
+++ b/harness/experiments/analysis-context-20260911/generated/B-factored-threshold.study
@@ -0,0 +1,108 @@
+study B revision 2
+properties fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02, total, budget
+function budget_formula(result) = le(result, 22500)
+function total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02) = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+baseline engineering revision 1
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 750
+ varying02 = 1000
+end
+case case01 base engineering
+end
+case case02 base engineering
+ varying01 = 800
+ varying02 = 1025
+end
+case case03 base engineering
+ varying01 = 850
+ varying02 = 1050
+end
+case case04 base engineering
+ varying01 = 900
+ varying02 = 1075
+end
+case case05 base engineering
+ varying01 = 950
+ varying02 = 1100
+end
+case case06 base engineering
+ varying01 = 1000
+ varying02 = 1125
+end
+case case07 base engineering
+ varying01 = 1050
+ varying02 = 1150
+end
+case case08 base engineering
+ varying01 = 1100
+ varying02 = 1175
+end
+case case09 base engineering
+ varying01 = 1150
+ varying02 = 1200
+end
+case case10 base engineering
+ varying01 = 1200
+ varying02 = 1225
+end
+case case11 base engineering
+ varying01 = 1250
+ varying02 = 1250
+end
+case case12 base engineering
+ varying01 = 1300
+ varying02 = 1275
+end
+case case13 base engineering
+ varying01 = 1350
+ varying02 = 1300
+end
+case case14 base engineering
+ varying01 = 1400
+ varying02 = 1325
+end
+case case15 base engineering
+ varying01 = 1450
+ varying02 = 1350
+end
+case case16 base engineering
+ varying01 = 1500
+ varying02 = 1375
+end
+case case17 base engineering
+ varying01 = 1550
+ varying02 = 1400
+end
+case case18 base engineering
+ varying01 = 1600
+ varying02 = 1425
+end
+case case19 base engineering
+ varying01 = 1650
+ varying02 = 1450
+end
+case case20 base engineering
+ varying01 = 1700
+ varying02 = 1475
+end
diff --git a/harness/experiments/analysis-context-20260911/generated/B-factored.study b/harness/experiments/analysis-context-20260911/generated/B-factored.study
new file mode 100644
index 00000000..018ab22b
--- /dev/null
+++ b/harness/experiments/analysis-context-20260911/generated/B-factored.study
@@ -0,0 +1,108 @@
+study B revision 1
+properties fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02, total, budget
+function budget_formula(result) = le(result, 22000)
+function total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02) = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+baseline engineering revision 1
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 750
+ varying02 = 1000
+end
+case case01 base engineering
+end
+case case02 base engineering
+ varying01 = 800
+ varying02 = 1025
+end
+case case03 base engineering
+ varying01 = 850
+ varying02 = 1050
+end
+case case04 base engineering
+ varying01 = 900
+ varying02 = 1075
+end
+case case05 base engineering
+ varying01 = 950
+ varying02 = 1100
+end
+case case06 base engineering
+ varying01 = 1000
+ varying02 = 1125
+end
+case case07 base engineering
+ varying01 = 1050
+ varying02 = 1150
+end
+case case08 base engineering
+ varying01 = 1100
+ varying02 = 1175
+end
+case case09 base engineering
+ varying01 = 1150
+ varying02 = 1200
+end
+case case10 base engineering
+ varying01 = 1200
+ varying02 = 1225
+end
+case case11 base engineering
+ varying01 = 1250
+ varying02 = 1250
+end
+case case12 base engineering
+ varying01 = 1300
+ varying02 = 1275
+end
+case case13 base engineering
+ varying01 = 1350
+ varying02 = 1300
+end
+case case14 base engineering
+ varying01 = 1400
+ varying02 = 1325
+end
+case case15 base engineering
+ varying01 = 1450
+ varying02 = 1350
+end
+case case16 base engineering
+ varying01 = 1500
+ varying02 = 1375
+end
+case case17 base engineering
+ varying01 = 1550
+ varying02 = 1400
+end
+case case18 base engineering
+ varying01 = 1600
+ varying02 = 1425
+end
+case case19 base engineering
+ varying01 = 1650
+ varying02 = 1450
+end
+case case20 base engineering
+ varying01 = 1700
+ varying02 = 1475
+end
diff --git a/harness/experiments/analysis-context-20260911/generated/B-inline-cleared-override.study b/harness/experiments/analysis-context-20260911/generated/B-inline-cleared-override.study
new file mode 100644
index 00000000..3ef62e7d
--- /dev/null
+++ b/harness/experiments/analysis-context-20260911/generated/B-inline-cleared-override.study
@@ -0,0 +1,105 @@
+study B revision 1
+properties fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02, total, budget
+baseline engineering revision 1
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 750
+ varying02 = 1000
+end
+case case01 base engineering
+end
+case case02 base engineering
+ varying01 = 800
+ varying02 = 1025
+end
+case case03 base engineering
+ varying01 = 850
+ varying02 = 1050
+end
+case case04 base engineering
+ varying01 = 900
+ varying02 = 1075
+end
+case case05 base engineering
+ varying01 = 950
+ varying02 = 1100
+end
+case case06 base engineering
+ varying01 = 1000
+ varying02 = 1125
+end
+case case07 base engineering
+ varying01 = 1050
+ varying02 = 1150
+end
+case case08 base engineering
+ varying01 = 1100
+ varying02 = 1175
+end
+case case09 base engineering
+ varying01 = 1150
+ varying02 = 1200
+end
+case case10 base engineering
+ varying01 = 1200
+ varying02 = 1225
+end
+case case11 base engineering
+ varying01 = 1250
+ varying02 = 1250
+end
+case case12 base engineering
+ varying01 = 1300
+ varying02 = 1275
+end
+case case13 base engineering
+ varying01 = 1350
+ varying02 = 1300
+end
+case case14 base engineering
+ varying01 = 1400
+ varying02 = 1325
+end
+case case15 base engineering
+ varying01 = 1450
+ varying02 = 1350
+end
+case case16 base engineering
+ varying01 = 1500
+ varying02 = 1375
+end
+case case17 base engineering
+ varying01 = 1550
+ varying02 = 1400
+end
+case case18 base engineering
+ varying01 = 1600
+ varying02 = 1425
+end
+case case19 base engineering
+ varying01 = 1650
+ varying02 = 1450
+end
+case case20 base engineering
+ varying02 = 1475
+end
diff --git a/harness/experiments/analysis-context-20260911/generated/B-inline-cycle.rejected-study b/harness/experiments/analysis-context-20260911/generated/B-inline-cycle.rejected-study
new file mode 100644
index 00000000..2f04435f
--- /dev/null
+++ b/harness/experiments/analysis-context-20260911/generated/B-inline-cycle.rejected-study
@@ -0,0 +1,106 @@
+study B revision 1
+properties fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02, total, budget
+baseline engineering revision 1
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 750
+ varying02 = 1000
+end
+case case01 base engineering
+end
+case case02 base engineering
+ varying01 = 800
+ varying02 = 1025
+end
+case case03 base engineering
+ varying01 = 850
+ varying02 = 1050
+end
+case case04 base engineering
+ varying01 = 900
+ varying02 = 1075
+end
+case case05 base engineering
+ varying01 = 950
+ varying02 = 1100
+end
+case case06 base engineering
+ varying01 = 1000
+ varying02 = 1125
+end
+case case07 base engineering
+ varying01 = 1050
+ varying02 = 1150
+end
+case case08 base engineering
+ varying01 = 1100
+ varying02 = 1175
+end
+case case09 base engineering
+ varying01 = 1150
+ varying02 = 1200
+end
+case case10 base engineering
+ varying01 = 1200
+ varying02 = 1225
+end
+case case11 base engineering
+ varying01 = 1250
+ varying02 = 1250
+end
+case case12 base engineering
+ varying01 = 1300
+ varying02 = 1275
+end
+case case13 base engineering
+ varying01 = 1350
+ varying02 = 1300
+end
+case case14 base engineering
+ varying01 = 1400
+ varying02 = 1325
+end
+case case15 base engineering
+ varying01 = 1450
+ varying02 = 1350
+end
+case case16 base engineering
+ varying01 = 1500
+ varying02 = 1375
+end
+case case17 base engineering
+ varying01 = 1550
+ varying02 = 1400
+end
+case case18 base engineering
+ varying01 = 1600
+ varying02 = 1425
+end
+case case19 base engineering
+ varying01 = 1650
+ varying02 = 1450
+end
+case case20 base engineering
+ varying01 = total
+ varying02 = 1475
+end
diff --git a/harness/experiments/analysis-context-20260911/generated/B-inline-fixed-all.study b/harness/experiments/analysis-context-20260911/generated/B-inline-fixed-all.study
new file mode 100644
index 00000000..e7775036
--- /dev/null
+++ b/harness/experiments/analysis-context-20260911/generated/B-inline-fixed-all.study
@@ -0,0 +1,106 @@
+study B revision 2
+properties fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02, total, budget
+baseline engineering revision 2
+ budget = le(total, 22000)
+ fixed01 = 1200
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 750
+ varying02 = 1000
+end
+case case01 base engineering
+end
+case case02 base engineering
+ varying01 = 800
+ varying02 = 1025
+end
+case case03 base engineering
+ varying01 = 850
+ varying02 = 1050
+end
+case case04 base engineering
+ varying01 = 900
+ varying02 = 1075
+end
+case case05 base engineering
+ varying01 = 950
+ varying02 = 1100
+end
+case case06 base engineering
+ varying01 = 1000
+ varying02 = 1125
+end
+case case07 base engineering
+ varying01 = 1050
+ varying02 = 1150
+end
+case case08 base engineering
+ varying01 = 1100
+ varying02 = 1175
+end
+case case09 base engineering
+ varying01 = 1150
+ varying02 = 1200
+end
+case case10 base engineering
+ varying01 = 1200
+ varying02 = 1225
+end
+case case11 base engineering
+ varying01 = 1250
+ varying02 = 1250
+end
+case case12 base engineering
+ varying01 = 1300
+ varying02 = 1275
+end
+case case13 base engineering
+ varying01 = 1350
+ varying02 = 1300
+end
+case case14 base engineering
+ varying01 = 1400
+ varying02 = 1325
+end
+case case15 base engineering
+ varying01 = 1450
+ varying02 = 1350
+end
+case case16 base engineering
+ varying01 = 1500
+ varying02 = 1375
+end
+case case17 base engineering
+ varying01 = 1550
+ varying02 = 1400
+end
+case case18 base engineering
+ varying01 = 1600
+ varying02 = 1425
+end
+case case19 base engineering
+ varying01 = 1650
+ varying02 = 1450
+end
+case case20 base engineering
+ varying01 = 1700
+ varying02 = 1475
+end
diff --git a/harness/experiments/analysis-context-20260911/generated/B-inline-frozen-case20.study b/harness/experiments/analysis-context-20260911/generated/B-inline-frozen-case20.study
new file mode 100644
index 00000000..84b6591f
--- /dev/null
+++ b/harness/experiments/analysis-context-20260911/generated/B-inline-frozen-case20.study
@@ -0,0 +1,53 @@
+study D revision 1
+origin B:case20:document1:engineering@1
+captured budget = baseline:engineering@1 via case20
+captured fixed01 = baseline:engineering@1 via case20
+captured fixed02 = baseline:engineering@1 via case20
+captured fixed03 = baseline:engineering@1 via case20
+captured fixed04 = baseline:engineering@1 via case20
+captured fixed05 = baseline:engineering@1 via case20
+captured fixed06 = baseline:engineering@1 via case20
+captured fixed07 = baseline:engineering@1 via case20
+captured fixed08 = baseline:engineering@1 via case20
+captured fixed09 = baseline:engineering@1 via case20
+captured fixed10 = baseline:engineering@1 via case20
+captured fixed11 = baseline:engineering@1 via case20
+captured fixed12 = baseline:engineering@1 via case20
+captured fixed13 = baseline:engineering@1 via case20
+captured fixed14 = baseline:engineering@1 via case20
+captured fixed15 = baseline:engineering@1 via case20
+captured fixed16 = baseline:engineering@1 via case20
+captured fixed17 = baseline:engineering@1 via case20
+captured fixed18 = baseline:engineering@1 via case20
+captured fixed19 = baseline:engineering@1 via case20
+captured fixed20 = baseline:engineering@1 via case20
+captured total = baseline:engineering@1 via case20
+captured varying01 = case:case20
+captured varying02 = case:case20
+properties fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02, total, budget
+case case20 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1700
+ varying02 = 1475
+end
diff --git a/harness/experiments/analysis-context-20260911/generated/B-inline-missing.study b/harness/experiments/analysis-context-20260911/generated/B-inline-missing.study
new file mode 100644
index 00000000..94ef6255
--- /dev/null
+++ b/harness/experiments/analysis-context-20260911/generated/B-inline-missing.study
@@ -0,0 +1,106 @@
+study B revision 1
+properties fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02, total, budget
+baseline engineering revision 1
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 750
+ varying02 = 1000
+end
+case case01 base engineering
+end
+case case02 base engineering
+ varying01 = 800
+ varying02 = 1025
+end
+case case03 base engineering
+ varying01 = 850
+ varying02 = 1050
+end
+case case04 base engineering
+ varying01 = 900
+ varying02 = 1075
+end
+case case05 base engineering
+ varying01 = 950
+ varying02 = 1100
+end
+case case06 base engineering
+ varying01 = 1000
+ varying02 = 1125
+end
+case case07 base engineering
+ varying01 = 1050
+ varying02 = 1150
+end
+case case08 base engineering
+ varying01 = 1100
+ varying02 = 1175
+end
+case case09 base engineering
+ varying01 = 1150
+ varying02 = 1200
+end
+case case10 base engineering
+ varying01 = 1200
+ varying02 = 1225
+end
+case case11 base engineering
+ varying01 = 1250
+ varying02 = 1250
+end
+case case12 base engineering
+ varying01 = 1300
+ varying02 = 1275
+end
+case case13 base engineering
+ varying01 = 1350
+ varying02 = 1300
+end
+case case14 base engineering
+ varying01 = 1400
+ varying02 = 1325
+end
+case case15 base engineering
+ varying01 = 1450
+ varying02 = 1350
+end
+case case16 base engineering
+ varying01 = 1500
+ varying02 = 1375
+end
+case case17 base engineering
+ varying01 = 1550
+ varying02 = 1400
+end
+case case18 base engineering
+ varying01 = 1600
+ varying02 = 1425
+end
+case case19 base engineering
+ varying01 = 1650
+ varying02 = 1450
+end
+case case20 base engineering
+ varying01 = missing
+ varying02 = 1475
+end
diff --git a/harness/experiments/analysis-context-20260911/generated/B-inline-provenance.md b/harness/experiments/analysis-context-20260911/generated/B-inline-provenance.md
new file mode 100644
index 00000000..c6400afc
--- /dev/null
+++ b/harness/experiments/analysis-context-20260911/generated/B-inline-provenance.md
@@ -0,0 +1,31 @@
+# B-inline: case20 evaluation
+
+Value: Bool(false)
+Document revision: 1
+
+- budget: baseline:engineering@1 via case20
+- fixed01: baseline:engineering@1 via case20
+- fixed02: baseline:engineering@1 via case20
+- fixed03: baseline:engineering@1 via case20
+- fixed04: baseline:engineering@1 via case20
+- fixed05: baseline:engineering@1 via case20
+- fixed06: baseline:engineering@1 via case20
+- fixed07: baseline:engineering@1 via case20
+- fixed08: baseline:engineering@1 via case20
+- fixed09: baseline:engineering@1 via case20
+- fixed10: baseline:engineering@1 via case20
+- fixed11: baseline:engineering@1 via case20
+- fixed12: baseline:engineering@1 via case20
+- fixed13: baseline:engineering@1 via case20
+- fixed14: baseline:engineering@1 via case20
+- fixed15: baseline:engineering@1 via case20
+- fixed16: baseline:engineering@1 via case20
+- fixed17: baseline:engineering@1 via case20
+- fixed18: baseline:engineering@1 via case20
+- fixed19: baseline:engineering@1 via case20
+- fixed20: baseline:engineering@1 via case20
+- total: baseline:engineering@1 via case20
+- varying01: case:case20
+- varying02: case:case20
+
+Rejected cycle: case20: cycle: budget -> total -> varying01 -> total
diff --git a/harness/experiments/analysis-context-20260911/generated/B-inline-threshold.study b/harness/experiments/analysis-context-20260911/generated/B-inline-threshold.study
new file mode 100644
index 00000000..88b06f42
--- /dev/null
+++ b/harness/experiments/analysis-context-20260911/generated/B-inline-threshold.study
@@ -0,0 +1,106 @@
+study B revision 2
+properties fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02, total, budget
+baseline engineering revision 2
+ budget = le(total, 22500)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 750
+ varying02 = 1000
+end
+case case01 base engineering
+end
+case case02 base engineering
+ varying01 = 800
+ varying02 = 1025
+end
+case case03 base engineering
+ varying01 = 850
+ varying02 = 1050
+end
+case case04 base engineering
+ varying01 = 900
+ varying02 = 1075
+end
+case case05 base engineering
+ varying01 = 950
+ varying02 = 1100
+end
+case case06 base engineering
+ varying01 = 1000
+ varying02 = 1125
+end
+case case07 base engineering
+ varying01 = 1050
+ varying02 = 1150
+end
+case case08 base engineering
+ varying01 = 1100
+ varying02 = 1175
+end
+case case09 base engineering
+ varying01 = 1150
+ varying02 = 1200
+end
+case case10 base engineering
+ varying01 = 1200
+ varying02 = 1225
+end
+case case11 base engineering
+ varying01 = 1250
+ varying02 = 1250
+end
+case case12 base engineering
+ varying01 = 1300
+ varying02 = 1275
+end
+case case13 base engineering
+ varying01 = 1350
+ varying02 = 1300
+end
+case case14 base engineering
+ varying01 = 1400
+ varying02 = 1325
+end
+case case15 base engineering
+ varying01 = 1450
+ varying02 = 1350
+end
+case case16 base engineering
+ varying01 = 1500
+ varying02 = 1375
+end
+case case17 base engineering
+ varying01 = 1550
+ varying02 = 1400
+end
+case case18 base engineering
+ varying01 = 1600
+ varying02 = 1425
+end
+case case19 base engineering
+ varying01 = 1650
+ varying02 = 1450
+end
+case case20 base engineering
+ varying01 = 1700
+ varying02 = 1475
+end
diff --git a/harness/experiments/analysis-context-20260911/generated/B-inline.study b/harness/experiments/analysis-context-20260911/generated/B-inline.study
new file mode 100644
index 00000000..2e37facb
--- /dev/null
+++ b/harness/experiments/analysis-context-20260911/generated/B-inline.study
@@ -0,0 +1,106 @@
+study B revision 1
+properties fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02, total, budget
+baseline engineering revision 1
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 750
+ varying02 = 1000
+end
+case case01 base engineering
+end
+case case02 base engineering
+ varying01 = 800
+ varying02 = 1025
+end
+case case03 base engineering
+ varying01 = 850
+ varying02 = 1050
+end
+case case04 base engineering
+ varying01 = 900
+ varying02 = 1075
+end
+case case05 base engineering
+ varying01 = 950
+ varying02 = 1100
+end
+case case06 base engineering
+ varying01 = 1000
+ varying02 = 1125
+end
+case case07 base engineering
+ varying01 = 1050
+ varying02 = 1150
+end
+case case08 base engineering
+ varying01 = 1100
+ varying02 = 1175
+end
+case case09 base engineering
+ varying01 = 1150
+ varying02 = 1200
+end
+case case10 base engineering
+ varying01 = 1200
+ varying02 = 1225
+end
+case case11 base engineering
+ varying01 = 1250
+ varying02 = 1250
+end
+case case12 base engineering
+ varying01 = 1300
+ varying02 = 1275
+end
+case case13 base engineering
+ varying01 = 1350
+ varying02 = 1300
+end
+case case14 base engineering
+ varying01 = 1400
+ varying02 = 1325
+end
+case case15 base engineering
+ varying01 = 1450
+ varying02 = 1350
+end
+case case16 base engineering
+ varying01 = 1500
+ varying02 = 1375
+end
+case case17 base engineering
+ varying01 = 1550
+ varying02 = 1400
+end
+case case18 base engineering
+ varying01 = 1600
+ varying02 = 1425
+end
+case case19 base engineering
+ varying01 = 1650
+ varying02 = 1450
+end
+case case20 base engineering
+ varying01 = 1700
+ varying02 = 1475
+end
diff --git a/harness/experiments/analysis-context-20260911/generated/D-factored-cycle.rejected-study b/harness/experiments/analysis-context-20260911/generated/D-factored-cycle.rejected-study
new file mode 100644
index 00000000..284cd5f0
--- /dev/null
+++ b/harness/experiments/analysis-context-20260911/generated/D-factored-cycle.rejected-study
@@ -0,0 +1,524 @@
+study D revision 1
+properties fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02, total, budget
+function budget_formula(result) = le(result, 22000)
+function total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02) = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+case case01 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 750
+ varying02 = 1000
+end
+case case02 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 800
+ varying02 = 1025
+end
+case case03 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 850
+ varying02 = 1050
+end
+case case04 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 900
+ varying02 = 1075
+end
+case case05 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 950
+ varying02 = 1100
+end
+case case06 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1000
+ varying02 = 1125
+end
+case case07 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1050
+ varying02 = 1150
+end
+case case08 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1100
+ varying02 = 1175
+end
+case case09 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1150
+ varying02 = 1200
+end
+case case10 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1200
+ varying02 = 1225
+end
+case case11 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1250
+ varying02 = 1250
+end
+case case12 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1300
+ varying02 = 1275
+end
+case case13 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1350
+ varying02 = 1300
+end
+case case14 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1400
+ varying02 = 1325
+end
+case case15 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1450
+ varying02 = 1350
+end
+case case16 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1500
+ varying02 = 1375
+end
+case case17 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1550
+ varying02 = 1400
+end
+case case18 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1600
+ varying02 = 1425
+end
+case case19 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1650
+ varying02 = 1450
+end
+case case20 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = total
+ varying02 = 1475
+end
diff --git a/harness/experiments/analysis-context-20260911/generated/D-factored-deleted-row.rejected-study b/harness/experiments/analysis-context-20260911/generated/D-factored-deleted-row.rejected-study
new file mode 100644
index 00000000..970a7c9e
--- /dev/null
+++ b/harness/experiments/analysis-context-20260911/generated/D-factored-deleted-row.rejected-study
@@ -0,0 +1,523 @@
+study D revision 1
+properties fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02, total, budget
+function budget_formula(result) = le(result, 22000)
+function total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02) = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+case case01 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 750
+ varying02 = 1000
+end
+case case02 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 800
+ varying02 = 1025
+end
+case case03 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 850
+ varying02 = 1050
+end
+case case04 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 900
+ varying02 = 1075
+end
+case case05 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 950
+ varying02 = 1100
+end
+case case06 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1000
+ varying02 = 1125
+end
+case case07 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1050
+ varying02 = 1150
+end
+case case08 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1100
+ varying02 = 1175
+end
+case case09 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1150
+ varying02 = 1200
+end
+case case10 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1200
+ varying02 = 1225
+end
+case case11 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1250
+ varying02 = 1250
+end
+case case12 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1300
+ varying02 = 1275
+end
+case case13 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1350
+ varying02 = 1300
+end
+case case14 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1400
+ varying02 = 1325
+end
+case case15 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1450
+ varying02 = 1350
+end
+case case16 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1500
+ varying02 = 1375
+end
+case case17 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1550
+ varying02 = 1400
+end
+case case18 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1600
+ varying02 = 1425
+end
+case case19 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1650
+ varying02 = 1450
+end
+case case20 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying02 = 1475
+end
diff --git a/harness/experiments/analysis-context-20260911/generated/D-factored-fixed-all.study b/harness/experiments/analysis-context-20260911/generated/D-factored-fixed-all.study
new file mode 100644
index 00000000..f9fa4001
--- /dev/null
+++ b/harness/experiments/analysis-context-20260911/generated/D-factored-fixed-all.study
@@ -0,0 +1,524 @@
+study D revision 2
+properties fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02, total, budget
+function budget_formula(result) = le(result, 22000)
+function total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02) = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+case case01 independent
+ budget = budget_formula(total)
+ fixed01 = 1200
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 750
+ varying02 = 1000
+end
+case case02 independent
+ budget = budget_formula(total)
+ fixed01 = 1200
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 800
+ varying02 = 1025
+end
+case case03 independent
+ budget = budget_formula(total)
+ fixed01 = 1200
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 850
+ varying02 = 1050
+end
+case case04 independent
+ budget = budget_formula(total)
+ fixed01 = 1200
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 900
+ varying02 = 1075
+end
+case case05 independent
+ budget = budget_formula(total)
+ fixed01 = 1200
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 950
+ varying02 = 1100
+end
+case case06 independent
+ budget = budget_formula(total)
+ fixed01 = 1200
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1000
+ varying02 = 1125
+end
+case case07 independent
+ budget = budget_formula(total)
+ fixed01 = 1200
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1050
+ varying02 = 1150
+end
+case case08 independent
+ budget = budget_formula(total)
+ fixed01 = 1200
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1100
+ varying02 = 1175
+end
+case case09 independent
+ budget = budget_formula(total)
+ fixed01 = 1200
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1150
+ varying02 = 1200
+end
+case case10 independent
+ budget = budget_formula(total)
+ fixed01 = 1200
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1200
+ varying02 = 1225
+end
+case case11 independent
+ budget = budget_formula(total)
+ fixed01 = 1200
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1250
+ varying02 = 1250
+end
+case case12 independent
+ budget = budget_formula(total)
+ fixed01 = 1200
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1300
+ varying02 = 1275
+end
+case case13 independent
+ budget = budget_formula(total)
+ fixed01 = 1200
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1350
+ varying02 = 1300
+end
+case case14 independent
+ budget = budget_formula(total)
+ fixed01 = 1200
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1400
+ varying02 = 1325
+end
+case case15 independent
+ budget = budget_formula(total)
+ fixed01 = 1200
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1450
+ varying02 = 1350
+end
+case case16 independent
+ budget = budget_formula(total)
+ fixed01 = 1200
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1500
+ varying02 = 1375
+end
+case case17 independent
+ budget = budget_formula(total)
+ fixed01 = 1200
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1550
+ varying02 = 1400
+end
+case case18 independent
+ budget = budget_formula(total)
+ fixed01 = 1200
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1600
+ varying02 = 1425
+end
+case case19 independent
+ budget = budget_formula(total)
+ fixed01 = 1200
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1650
+ varying02 = 1450
+end
+case case20 independent
+ budget = budget_formula(total)
+ fixed01 = 1200
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1700
+ varying02 = 1475
+end
diff --git a/harness/experiments/analysis-context-20260911/generated/D-factored-frozen-case20.study b/harness/experiments/analysis-context-20260911/generated/D-factored-frozen-case20.study
new file mode 100644
index 00000000..a932652a
--- /dev/null
+++ b/harness/experiments/analysis-context-20260911/generated/D-factored-frozen-case20.study
@@ -0,0 +1,55 @@
+study D revision 1
+origin D:case20:document1
+captured budget = case:case20
+captured fixed01 = case:case20
+captured fixed02 = case:case20
+captured fixed03 = case:case20
+captured fixed04 = case:case20
+captured fixed05 = case:case20
+captured fixed06 = case:case20
+captured fixed07 = case:case20
+captured fixed08 = case:case20
+captured fixed09 = case:case20
+captured fixed10 = case:case20
+captured fixed11 = case:case20
+captured fixed12 = case:case20
+captured fixed13 = case:case20
+captured fixed14 = case:case20
+captured fixed15 = case:case20
+captured fixed16 = case:case20
+captured fixed17 = case:case20
+captured fixed18 = case:case20
+captured fixed19 = case:case20
+captured fixed20 = case:case20
+captured total = case:case20
+captured varying01 = case:case20
+captured varying02 = case:case20
+properties fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02, total, budget
+function budget_formula(result) = le(result, 22000)
+function total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02) = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+case case20 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1700
+ varying02 = 1475
+end
diff --git a/harness/experiments/analysis-context-20260911/generated/D-factored-missing.study b/harness/experiments/analysis-context-20260911/generated/D-factored-missing.study
new file mode 100644
index 00000000..89c04c39
--- /dev/null
+++ b/harness/experiments/analysis-context-20260911/generated/D-factored-missing.study
@@ -0,0 +1,524 @@
+study D revision 1
+properties fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02, total, budget
+function budget_formula(result) = le(result, 22000)
+function total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02) = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+case case01 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 750
+ varying02 = 1000
+end
+case case02 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 800
+ varying02 = 1025
+end
+case case03 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 850
+ varying02 = 1050
+end
+case case04 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 900
+ varying02 = 1075
+end
+case case05 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 950
+ varying02 = 1100
+end
+case case06 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1000
+ varying02 = 1125
+end
+case case07 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1050
+ varying02 = 1150
+end
+case case08 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1100
+ varying02 = 1175
+end
+case case09 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1150
+ varying02 = 1200
+end
+case case10 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1200
+ varying02 = 1225
+end
+case case11 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1250
+ varying02 = 1250
+end
+case case12 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1300
+ varying02 = 1275
+end
+case case13 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1350
+ varying02 = 1300
+end
+case case14 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1400
+ varying02 = 1325
+end
+case case15 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1450
+ varying02 = 1350
+end
+case case16 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1500
+ varying02 = 1375
+end
+case case17 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1550
+ varying02 = 1400
+end
+case case18 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1600
+ varying02 = 1425
+end
+case case19 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1650
+ varying02 = 1450
+end
+case case20 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = missing
+ varying02 = 1475
+end
diff --git a/harness/experiments/analysis-context-20260911/generated/D-factored-provenance.md b/harness/experiments/analysis-context-20260911/generated/D-factored-provenance.md
new file mode 100644
index 00000000..a960a5e8
--- /dev/null
+++ b/harness/experiments/analysis-context-20260911/generated/D-factored-provenance.md
@@ -0,0 +1,31 @@
+# D-factored: case20 evaluation
+
+Value: Bool(false)
+Document revision: 1
+
+- budget: case:case20
+- fixed01: case:case20
+- fixed02: case:case20
+- fixed03: case:case20
+- fixed04: case:case20
+- fixed05: case:case20
+- fixed06: case:case20
+- fixed07: case:case20
+- fixed08: case:case20
+- fixed09: case:case20
+- fixed10: case:case20
+- fixed11: case:case20
+- fixed12: case:case20
+- fixed13: case:case20
+- fixed14: case:case20
+- fixed15: case:case20
+- fixed16: case:case20
+- fixed17: case:case20
+- fixed18: case:case20
+- fixed19: case:case20
+- fixed20: case:case20
+- total: case:case20
+- varying01: case:case20
+- varying02: case:case20
+
+Rejected cycle: case20: cycle: budget -> total -> varying01 -> total
diff --git a/harness/experiments/analysis-context-20260911/generated/D-factored-threshold.study b/harness/experiments/analysis-context-20260911/generated/D-factored-threshold.study
new file mode 100644
index 00000000..2bb0d8da
--- /dev/null
+++ b/harness/experiments/analysis-context-20260911/generated/D-factored-threshold.study
@@ -0,0 +1,524 @@
+study D revision 2
+properties fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02, total, budget
+function budget_formula(result) = le(result, 22500)
+function total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02) = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+case case01 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 750
+ varying02 = 1000
+end
+case case02 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 800
+ varying02 = 1025
+end
+case case03 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 850
+ varying02 = 1050
+end
+case case04 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 900
+ varying02 = 1075
+end
+case case05 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 950
+ varying02 = 1100
+end
+case case06 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1000
+ varying02 = 1125
+end
+case case07 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1050
+ varying02 = 1150
+end
+case case08 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1100
+ varying02 = 1175
+end
+case case09 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1150
+ varying02 = 1200
+end
+case case10 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1200
+ varying02 = 1225
+end
+case case11 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1250
+ varying02 = 1250
+end
+case case12 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1300
+ varying02 = 1275
+end
+case case13 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1350
+ varying02 = 1300
+end
+case case14 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1400
+ varying02 = 1325
+end
+case case15 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1450
+ varying02 = 1350
+end
+case case16 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1500
+ varying02 = 1375
+end
+case case17 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1550
+ varying02 = 1400
+end
+case case18 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1600
+ varying02 = 1425
+end
+case case19 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1650
+ varying02 = 1450
+end
+case case20 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1700
+ varying02 = 1475
+end
diff --git a/harness/experiments/analysis-context-20260911/generated/D-factored.study b/harness/experiments/analysis-context-20260911/generated/D-factored.study
new file mode 100644
index 00000000..a6e0a487
--- /dev/null
+++ b/harness/experiments/analysis-context-20260911/generated/D-factored.study
@@ -0,0 +1,524 @@
+study D revision 1
+properties fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02, total, budget
+function budget_formula(result) = le(result, 22000)
+function total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02) = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+case case01 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 750
+ varying02 = 1000
+end
+case case02 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 800
+ varying02 = 1025
+end
+case case03 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 850
+ varying02 = 1050
+end
+case case04 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 900
+ varying02 = 1075
+end
+case case05 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 950
+ varying02 = 1100
+end
+case case06 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1000
+ varying02 = 1125
+end
+case case07 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1050
+ varying02 = 1150
+end
+case case08 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1100
+ varying02 = 1175
+end
+case case09 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1150
+ varying02 = 1200
+end
+case case10 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1200
+ varying02 = 1225
+end
+case case11 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1250
+ varying02 = 1250
+end
+case case12 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1300
+ varying02 = 1275
+end
+case case13 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1350
+ varying02 = 1300
+end
+case case14 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1400
+ varying02 = 1325
+end
+case case15 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1450
+ varying02 = 1350
+end
+case case16 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1500
+ varying02 = 1375
+end
+case case17 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1550
+ varying02 = 1400
+end
+case case18 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1600
+ varying02 = 1425
+end
+case case19 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1650
+ varying02 = 1450
+end
+case case20 independent
+ budget = budget_formula(total)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = total_formula(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1700
+ varying02 = 1475
+end
diff --git a/harness/experiments/analysis-context-20260911/generated/D-inline-cycle.rejected-study b/harness/experiments/analysis-context-20260911/generated/D-inline-cycle.rejected-study
new file mode 100644
index 00000000..b8323a9a
--- /dev/null
+++ b/harness/experiments/analysis-context-20260911/generated/D-inline-cycle.rejected-study
@@ -0,0 +1,522 @@
+study D revision 1
+properties fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02, total, budget
+case case01 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 750
+ varying02 = 1000
+end
+case case02 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 800
+ varying02 = 1025
+end
+case case03 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 850
+ varying02 = 1050
+end
+case case04 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 900
+ varying02 = 1075
+end
+case case05 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 950
+ varying02 = 1100
+end
+case case06 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1000
+ varying02 = 1125
+end
+case case07 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1050
+ varying02 = 1150
+end
+case case08 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1100
+ varying02 = 1175
+end
+case case09 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1150
+ varying02 = 1200
+end
+case case10 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1200
+ varying02 = 1225
+end
+case case11 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1250
+ varying02 = 1250
+end
+case case12 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1300
+ varying02 = 1275
+end
+case case13 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1350
+ varying02 = 1300
+end
+case case14 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1400
+ varying02 = 1325
+end
+case case15 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1450
+ varying02 = 1350
+end
+case case16 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1500
+ varying02 = 1375
+end
+case case17 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1550
+ varying02 = 1400
+end
+case case18 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1600
+ varying02 = 1425
+end
+case case19 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1650
+ varying02 = 1450
+end
+case case20 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = total
+ varying02 = 1475
+end
diff --git a/harness/experiments/analysis-context-20260911/generated/D-inline-deleted-row.rejected-study b/harness/experiments/analysis-context-20260911/generated/D-inline-deleted-row.rejected-study
new file mode 100644
index 00000000..458e9e6f
--- /dev/null
+++ b/harness/experiments/analysis-context-20260911/generated/D-inline-deleted-row.rejected-study
@@ -0,0 +1,521 @@
+study D revision 1
+properties fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02, total, budget
+case case01 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 750
+ varying02 = 1000
+end
+case case02 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 800
+ varying02 = 1025
+end
+case case03 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 850
+ varying02 = 1050
+end
+case case04 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 900
+ varying02 = 1075
+end
+case case05 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 950
+ varying02 = 1100
+end
+case case06 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1000
+ varying02 = 1125
+end
+case case07 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1050
+ varying02 = 1150
+end
+case case08 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1100
+ varying02 = 1175
+end
+case case09 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1150
+ varying02 = 1200
+end
+case case10 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1200
+ varying02 = 1225
+end
+case case11 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1250
+ varying02 = 1250
+end
+case case12 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1300
+ varying02 = 1275
+end
+case case13 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1350
+ varying02 = 1300
+end
+case case14 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1400
+ varying02 = 1325
+end
+case case15 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1450
+ varying02 = 1350
+end
+case case16 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1500
+ varying02 = 1375
+end
+case case17 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1550
+ varying02 = 1400
+end
+case case18 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1600
+ varying02 = 1425
+end
+case case19 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1650
+ varying02 = 1450
+end
+case case20 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying02 = 1475
+end
diff --git a/harness/experiments/analysis-context-20260911/generated/D-inline-fixed-all.study b/harness/experiments/analysis-context-20260911/generated/D-inline-fixed-all.study
new file mode 100644
index 00000000..f9bdd47e
--- /dev/null
+++ b/harness/experiments/analysis-context-20260911/generated/D-inline-fixed-all.study
@@ -0,0 +1,522 @@
+study D revision 2
+properties fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02, total, budget
+case case01 independent
+ budget = le(total, 22000)
+ fixed01 = 1200
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 750
+ varying02 = 1000
+end
+case case02 independent
+ budget = le(total, 22000)
+ fixed01 = 1200
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 800
+ varying02 = 1025
+end
+case case03 independent
+ budget = le(total, 22000)
+ fixed01 = 1200
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 850
+ varying02 = 1050
+end
+case case04 independent
+ budget = le(total, 22000)
+ fixed01 = 1200
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 900
+ varying02 = 1075
+end
+case case05 independent
+ budget = le(total, 22000)
+ fixed01 = 1200
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 950
+ varying02 = 1100
+end
+case case06 independent
+ budget = le(total, 22000)
+ fixed01 = 1200
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1000
+ varying02 = 1125
+end
+case case07 independent
+ budget = le(total, 22000)
+ fixed01 = 1200
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1050
+ varying02 = 1150
+end
+case case08 independent
+ budget = le(total, 22000)
+ fixed01 = 1200
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1100
+ varying02 = 1175
+end
+case case09 independent
+ budget = le(total, 22000)
+ fixed01 = 1200
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1150
+ varying02 = 1200
+end
+case case10 independent
+ budget = le(total, 22000)
+ fixed01 = 1200
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1200
+ varying02 = 1225
+end
+case case11 independent
+ budget = le(total, 22000)
+ fixed01 = 1200
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1250
+ varying02 = 1250
+end
+case case12 independent
+ budget = le(total, 22000)
+ fixed01 = 1200
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1300
+ varying02 = 1275
+end
+case case13 independent
+ budget = le(total, 22000)
+ fixed01 = 1200
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1350
+ varying02 = 1300
+end
+case case14 independent
+ budget = le(total, 22000)
+ fixed01 = 1200
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1400
+ varying02 = 1325
+end
+case case15 independent
+ budget = le(total, 22000)
+ fixed01 = 1200
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1450
+ varying02 = 1350
+end
+case case16 independent
+ budget = le(total, 22000)
+ fixed01 = 1200
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1500
+ varying02 = 1375
+end
+case case17 independent
+ budget = le(total, 22000)
+ fixed01 = 1200
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1550
+ varying02 = 1400
+end
+case case18 independent
+ budget = le(total, 22000)
+ fixed01 = 1200
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1600
+ varying02 = 1425
+end
+case case19 independent
+ budget = le(total, 22000)
+ fixed01 = 1200
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1650
+ varying02 = 1450
+end
+case case20 independent
+ budget = le(total, 22000)
+ fixed01 = 1200
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1700
+ varying02 = 1475
+end
diff --git a/harness/experiments/analysis-context-20260911/generated/D-inline-fixed-one-only.study b/harness/experiments/analysis-context-20260911/generated/D-inline-fixed-one-only.study
new file mode 100644
index 00000000..61116469
--- /dev/null
+++ b/harness/experiments/analysis-context-20260911/generated/D-inline-fixed-one-only.study
@@ -0,0 +1,522 @@
+study D revision 2
+properties fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02, total, budget
+case case01 independent
+ budget = le(total, 22000)
+ fixed01 = 1200
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 750
+ varying02 = 1000
+end
+case case02 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 800
+ varying02 = 1025
+end
+case case03 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 850
+ varying02 = 1050
+end
+case case04 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 900
+ varying02 = 1075
+end
+case case05 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 950
+ varying02 = 1100
+end
+case case06 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1000
+ varying02 = 1125
+end
+case case07 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1050
+ varying02 = 1150
+end
+case case08 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1100
+ varying02 = 1175
+end
+case case09 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1150
+ varying02 = 1200
+end
+case case10 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1200
+ varying02 = 1225
+end
+case case11 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1250
+ varying02 = 1250
+end
+case case12 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1300
+ varying02 = 1275
+end
+case case13 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1350
+ varying02 = 1300
+end
+case case14 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1400
+ varying02 = 1325
+end
+case case15 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1450
+ varying02 = 1350
+end
+case case16 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1500
+ varying02 = 1375
+end
+case case17 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1550
+ varying02 = 1400
+end
+case case18 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1600
+ varying02 = 1425
+end
+case case19 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1650
+ varying02 = 1450
+end
+case case20 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1700
+ varying02 = 1475
+end
diff --git a/harness/experiments/analysis-context-20260911/generated/D-inline-frozen-case20.study b/harness/experiments/analysis-context-20260911/generated/D-inline-frozen-case20.study
new file mode 100644
index 00000000..34f73f58
--- /dev/null
+++ b/harness/experiments/analysis-context-20260911/generated/D-inline-frozen-case20.study
@@ -0,0 +1,53 @@
+study D revision 1
+origin D:case20:document1
+captured budget = case:case20
+captured fixed01 = case:case20
+captured fixed02 = case:case20
+captured fixed03 = case:case20
+captured fixed04 = case:case20
+captured fixed05 = case:case20
+captured fixed06 = case:case20
+captured fixed07 = case:case20
+captured fixed08 = case:case20
+captured fixed09 = case:case20
+captured fixed10 = case:case20
+captured fixed11 = case:case20
+captured fixed12 = case:case20
+captured fixed13 = case:case20
+captured fixed14 = case:case20
+captured fixed15 = case:case20
+captured fixed16 = case:case20
+captured fixed17 = case:case20
+captured fixed18 = case:case20
+captured fixed19 = case:case20
+captured fixed20 = case:case20
+captured total = case:case20
+captured varying01 = case:case20
+captured varying02 = case:case20
+properties fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02, total, budget
+case case20 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1700
+ varying02 = 1475
+end
diff --git a/harness/experiments/analysis-context-20260911/generated/D-inline-missing.study b/harness/experiments/analysis-context-20260911/generated/D-inline-missing.study
new file mode 100644
index 00000000..6675f405
--- /dev/null
+++ b/harness/experiments/analysis-context-20260911/generated/D-inline-missing.study
@@ -0,0 +1,522 @@
+study D revision 1
+properties fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02, total, budget
+case case01 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 750
+ varying02 = 1000
+end
+case case02 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 800
+ varying02 = 1025
+end
+case case03 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 850
+ varying02 = 1050
+end
+case case04 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 900
+ varying02 = 1075
+end
+case case05 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 950
+ varying02 = 1100
+end
+case case06 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1000
+ varying02 = 1125
+end
+case case07 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1050
+ varying02 = 1150
+end
+case case08 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1100
+ varying02 = 1175
+end
+case case09 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1150
+ varying02 = 1200
+end
+case case10 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1200
+ varying02 = 1225
+end
+case case11 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1250
+ varying02 = 1250
+end
+case case12 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1300
+ varying02 = 1275
+end
+case case13 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1350
+ varying02 = 1300
+end
+case case14 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1400
+ varying02 = 1325
+end
+case case15 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1450
+ varying02 = 1350
+end
+case case16 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1500
+ varying02 = 1375
+end
+case case17 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1550
+ varying02 = 1400
+end
+case case18 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1600
+ varying02 = 1425
+end
+case case19 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1650
+ varying02 = 1450
+end
+case case20 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = missing
+ varying02 = 1475
+end
diff --git a/harness/experiments/analysis-context-20260911/generated/D-inline-provenance.md b/harness/experiments/analysis-context-20260911/generated/D-inline-provenance.md
new file mode 100644
index 00000000..db18226f
--- /dev/null
+++ b/harness/experiments/analysis-context-20260911/generated/D-inline-provenance.md
@@ -0,0 +1,31 @@
+# D-inline: case20 evaluation
+
+Value: Bool(false)
+Document revision: 1
+
+- budget: case:case20
+- fixed01: case:case20
+- fixed02: case:case20
+- fixed03: case:case20
+- fixed04: case:case20
+- fixed05: case:case20
+- fixed06: case:case20
+- fixed07: case:case20
+- fixed08: case:case20
+- fixed09: case:case20
+- fixed10: case:case20
+- fixed11: case:case20
+- fixed12: case:case20
+- fixed13: case:case20
+- fixed14: case:case20
+- fixed15: case:case20
+- fixed16: case:case20
+- fixed17: case:case20
+- fixed18: case:case20
+- fixed19: case:case20
+- fixed20: case:case20
+- total: case:case20
+- varying01: case:case20
+- varying02: case:case20
+
+Rejected cycle: case20: cycle: budget -> total -> varying01 -> total
diff --git a/harness/experiments/analysis-context-20260911/generated/D-inline-threshold.study b/harness/experiments/analysis-context-20260911/generated/D-inline-threshold.study
new file mode 100644
index 00000000..11c65cb6
--- /dev/null
+++ b/harness/experiments/analysis-context-20260911/generated/D-inline-threshold.study
@@ -0,0 +1,522 @@
+study D revision 2
+properties fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02, total, budget
+case case01 independent
+ budget = le(total, 22500)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 750
+ varying02 = 1000
+end
+case case02 independent
+ budget = le(total, 22500)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 800
+ varying02 = 1025
+end
+case case03 independent
+ budget = le(total, 22500)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 850
+ varying02 = 1050
+end
+case case04 independent
+ budget = le(total, 22500)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 900
+ varying02 = 1075
+end
+case case05 independent
+ budget = le(total, 22500)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 950
+ varying02 = 1100
+end
+case case06 independent
+ budget = le(total, 22500)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1000
+ varying02 = 1125
+end
+case case07 independent
+ budget = le(total, 22500)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1050
+ varying02 = 1150
+end
+case case08 independent
+ budget = le(total, 22500)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1100
+ varying02 = 1175
+end
+case case09 independent
+ budget = le(total, 22500)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1150
+ varying02 = 1200
+end
+case case10 independent
+ budget = le(total, 22500)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1200
+ varying02 = 1225
+end
+case case11 independent
+ budget = le(total, 22500)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1250
+ varying02 = 1250
+end
+case case12 independent
+ budget = le(total, 22500)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1300
+ varying02 = 1275
+end
+case case13 independent
+ budget = le(total, 22500)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1350
+ varying02 = 1300
+end
+case case14 independent
+ budget = le(total, 22500)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1400
+ varying02 = 1325
+end
+case case15 independent
+ budget = le(total, 22500)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1450
+ varying02 = 1350
+end
+case case16 independent
+ budget = le(total, 22500)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1500
+ varying02 = 1375
+end
+case case17 independent
+ budget = le(total, 22500)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1550
+ varying02 = 1400
+end
+case case18 independent
+ budget = le(total, 22500)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1600
+ varying02 = 1425
+end
+case case19 independent
+ budget = le(total, 22500)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1650
+ varying02 = 1450
+end
+case case20 independent
+ budget = le(total, 22500)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1700
+ varying02 = 1475
+end
diff --git a/harness/experiments/analysis-context-20260911/generated/D-inline.study b/harness/experiments/analysis-context-20260911/generated/D-inline.study
new file mode 100644
index 00000000..e6741394
--- /dev/null
+++ b/harness/experiments/analysis-context-20260911/generated/D-inline.study
@@ -0,0 +1,522 @@
+study D revision 1
+properties fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02, total, budget
+case case01 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 750
+ varying02 = 1000
+end
+case case02 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 800
+ varying02 = 1025
+end
+case case03 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 850
+ varying02 = 1050
+end
+case case04 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 900
+ varying02 = 1075
+end
+case case05 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 950
+ varying02 = 1100
+end
+case case06 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1000
+ varying02 = 1125
+end
+case case07 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1050
+ varying02 = 1150
+end
+case case08 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1100
+ varying02 = 1175
+end
+case case09 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1150
+ varying02 = 1200
+end
+case case10 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1200
+ varying02 = 1225
+end
+case case11 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1250
+ varying02 = 1250
+end
+case case12 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1300
+ varying02 = 1275
+end
+case case13 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1350
+ varying02 = 1300
+end
+case case14 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1400
+ varying02 = 1325
+end
+case case15 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1450
+ varying02 = 1350
+end
+case case16 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1500
+ varying02 = 1375
+end
+case case17 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1550
+ varying02 = 1400
+end
+case case18 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1600
+ varying02 = 1425
+end
+case case19 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1650
+ varying02 = 1450
+end
+case case20 independent
+ budget = le(total, 22000)
+ fixed01 = 1000
+ fixed02 = 1000
+ fixed03 = 1000
+ fixed04 = 1000
+ fixed05 = 1000
+ fixed06 = 1000
+ fixed07 = 1000
+ fixed08 = 1000
+ fixed09 = 1000
+ fixed10 = 1000
+ fixed11 = 1000
+ fixed12 = 1000
+ fixed13 = 1000
+ fixed14 = 1000
+ fixed15 = 1000
+ fixed16 = 1000
+ fixed17 = 1000
+ fixed18 = 1000
+ fixed19 = 1000
+ fixed20 = 1000
+ total = sum(fixed01, fixed02, fixed03, fixed04, fixed05, fixed06, fixed07, fixed08, fixed09, fixed10, fixed11, fixed12, fixed13, fixed14, fixed15, fixed16, fixed17, fixed18, fixed19, fixed20, varying01, varying02)
+ varying01 = 1700
+ varying02 = 1475
+end
diff --git a/harness/experiments/analysis-context-20260911/generated/EVIDENCE.json b/harness/experiments/analysis-context-20260911/generated/EVIDENCE.json
new file mode 100644
index 00000000..350a4c0e
--- /dev/null
+++ b/harness/experiments/analysis-context-20260911/generated/EVIDENCE.json
@@ -0,0 +1,166 @@
+{
+ "recorded_utc": "2026-09-11T08:50:38.6429749Z",
+ "compiler": [
+ "rustc 1.98.1 (48a229cea 2026-09-01)",
+ "binary: rustc",
+ "commit-hash: 48a229ceaefd4985c50990b14116b6d856af0985",
+ "commit-date: 2026-09-01",
+ "host: x86_64-pc-windows-gnullvm",
+ "release: 1.98.1",
+ "LLVM version: 22.1.8"
+ ],
+ "compile_command": "rustc --edition=2024 -D warnings -C linker=clang.exe harness/experiments/analysis-context-20260911/main.rs -o .local/analysis-context-20260911/analysis-context.exe",
+ "run_command": ".local/analysis-context-20260911/analysis-context.exe harness/experiments/analysis-context-20260911/generated",
+ "process_exit_code": 0,
+ "assertions_passed": 218,
+ "program_sha256": "5632ACAFD06413DCC9961DDC1ADE60C7556FB56B43ED3C667F5106E7559A3733",
+ "executable_sha256": "36E2D5A7F0683CC19F2EB50CA4840F3A793A8350498E3E17EDD75710A78FC675",
+ "results_sha256": "248419751E9B836CDE6D80F97202843DD5DC085D1BEC67CB2FCC5046960C143B",
+ "fixture_hashes": [
+ {
+ "path": "harness/experiments/analysis-context-20260911/generated/B-factored-cleared-override.study",
+ "sha256": "DD740295FB0F849A63815AE3174EB067616687A5D46BD63089A6AA279F9D48B8",
+ "bytes": 2762
+ },
+ {
+ "path": "harness/experiments/analysis-context-20260911/generated/B-factored-cycle.rejected-study",
+ "sha256": "4FF294ACA6EDBAD60CB6C899D2B1D93B8E07337A295DBC63876A4497DC9D58EA",
+ "bytes": 2782
+ },
+ {
+ "path": "harness/experiments/analysis-context-20260911/generated/B-factored-fixed-all.study",
+ "sha256": "A51BD1F3EF7153D67FB63EAB2B9906E9FFB0049A2179B47C632ABB3E9B01A0F4",
+ "bytes": 2781
+ },
+ {
+ "path": "harness/experiments/analysis-context-20260911/generated/B-factored-frozen-case20.study",
+ "sha256": "05370CCB21E0B0AB8F26F9704FBECA1BE44FA1156FBF6C8420E09C436D016476",
+ "bytes": 2665
+ },
+ {
+ "path": "harness/experiments/analysis-context-20260911/generated/B-factored-missing.study",
+ "sha256": "D6D1B53B307836275A417C3CB094881F91755D1FAD0D521CE9B90FE1FD8F039D",
+ "bytes": 2784
+ },
+ {
+ "path": "harness/experiments/analysis-context-20260911/generated/B-factored-threshold.study",
+ "sha256": "86C5DC5FCA452A9CD7FC13318D72BE81973802C13F878D488561551D27F62C67",
+ "bytes": 2781
+ },
+ {
+ "path": "harness/experiments/analysis-context-20260911/generated/B-factored.study",
+ "sha256": "0C2B9F055E4E6993A14688A0F58BD6629F724687DC694D7213166197B197B878",
+ "bytes": 2781
+ },
+ {
+ "path": "harness/experiments/analysis-context-20260911/generated/B-inline-cleared-override.study",
+ "sha256": "8FC77924459D892D1E91CF1756C708ED34005ED840F3A38B98474037BBEC4FA1",
+ "bytes": 2262
+ },
+ {
+ "path": "harness/experiments/analysis-context-20260911/generated/B-inline-cycle.rejected-study",
+ "sha256": "3D8249B3DDB21F36C765AF440F6DE0E9E7B125E6504A07BDD3BA83E7B94CE9E1",
+ "bytes": 2282
+ },
+ {
+ "path": "harness/experiments/analysis-context-20260911/generated/B-inline-fixed-all.study",
+ "sha256": "CD32AE6CDE2E21AFBB536109A9D2911ECC3572A9BE368C2D877EE3EB8F2D2303",
+ "bytes": 2281
+ },
+ {
+ "path": "harness/experiments/analysis-context-20260911/generated/B-inline-frozen-case20.study",
+ "sha256": "B09AF2449DD8E2DAEB5F0B4AE0FF9AC914227B6FE619B4B0139FEF0778B7FB7A",
+ "bytes": 2165
+ },
+ {
+ "path": "harness/experiments/analysis-context-20260911/generated/B-inline-missing.study",
+ "sha256": "0886DE0C602CCD06A7F7AC5C248C7EE9C5670C567880DCD3ED6D37E14C5AA524",
+ "bytes": 2284
+ },
+ {
+ "path": "harness/experiments/analysis-context-20260911/generated/B-inline-threshold.study",
+ "sha256": "54F518BCBB166264F763BC14AFA1437D4E95A3244DFE9DF0B0331591E72C85DD",
+ "bytes": 2281
+ },
+ {
+ "path": "harness/experiments/analysis-context-20260911/generated/B-inline.study",
+ "sha256": "87A97378550BB79DA9A0CAD453700352D9E24C289E6865BA9D8CF554C62FEE36",
+ "bytes": 2281
+ },
+ {
+ "path": "harness/experiments/analysis-context-20260911/generated/D-factored-cycle.rejected-study",
+ "sha256": "DAC04A19992313549D322D70DF564EF9026FBD5F30402DDA591AF579B7F70E26",
+ "bytes": 14027
+ },
+ {
+ "path": "harness/experiments/analysis-context-20260911/generated/D-factored-deleted-row.rejected-study",
+ "sha256": "C00EF4080857E18ADCC309FE57D512CA681E28A46E259B44A34D3852A334E973",
+ "bytes": 14007
+ },
+ {
+ "path": "harness/experiments/analysis-context-20260911/generated/D-factored-fixed-all.study",
+ "sha256": "D746830E424702ACE35B5A26EFE8D2E96D4D2CC028DC2B7E207E6326D0F22597",
+ "bytes": 14026
+ },
+ {
+ "path": "harness/experiments/analysis-context-20260911/generated/D-factored-frozen-case20.study",
+ "sha256": "804F0D3DB792659BFAA1CFB0CF96BF243C379F6971EC1FE357FE98CDF3269ED6",
+ "bytes": 2167
+ },
+ {
+ "path": "harness/experiments/analysis-context-20260911/generated/D-factored-missing.study",
+ "sha256": "32351A6F8BA499AAAD644FABFB08F7D6A067365394B2B6AD33EE7581A9761889",
+ "bytes": 14029
+ },
+ {
+ "path": "harness/experiments/analysis-context-20260911/generated/D-factored-threshold.study",
+ "sha256": "20EC6C0EB3EB599BE6354F2BED4BB0EF07747B4EE0B9CB80B757C59633A4579C",
+ "bytes": 14026
+ },
+ {
+ "path": "harness/experiments/analysis-context-20260911/generated/D-factored.study",
+ "sha256": "17C9CEB39E9B39D867EF732D4DE8BA36C00546BE1BC987547A52B99EEA83BE99",
+ "bytes": 14026
+ },
+ {
+ "path": "harness/experiments/analysis-context-20260911/generated/D-inline-cycle.rejected-study",
+ "sha256": "2C7443440051B7DD31733B7814C86FFC53BE5F7EBDFFE56925B9F9E60693FD84",
+ "bytes": 13242
+ },
+ {
+ "path": "harness/experiments/analysis-context-20260911/generated/D-inline-deleted-row.rejected-study",
+ "sha256": "26970B159D67A5E858298EC77C6B7FFA233EC3EF0FB903E9E860795DE829F28C",
+ "bytes": 13222
+ },
+ {
+ "path": "harness/experiments/analysis-context-20260911/generated/D-inline-fixed-all.study",
+ "sha256": "39AEC6A7457B4A8D9D9518B4B29A8185048811329B7614794FF69E122A972D6C",
+ "bytes": 13241
+ },
+ {
+ "path": "harness/experiments/analysis-context-20260911/generated/D-inline-fixed-one-only.study",
+ "sha256": "83E9F73E7E8CE4AC300979CE1D120707C4B7DD4A1D076C8D9BAB4BC8CF8230E8",
+ "bytes": 13241
+ },
+ {
+ "path": "harness/experiments/analysis-context-20260911/generated/D-inline-frozen-case20.study",
+ "sha256": "88A1A971651E827399775A7D9F6AAD32B7CE1C3E0F78D57E7AC72F207495E2B6",
+ "bytes": 1667
+ },
+ {
+ "path": "harness/experiments/analysis-context-20260911/generated/D-inline-missing.study",
+ "sha256": "8F44E9524A1BFCC96102C2C91CE15C4A87E698509225FD84D9A860EF8F7A23E6",
+ "bytes": 13244
+ },
+ {
+ "path": "harness/experiments/analysis-context-20260911/generated/D-inline-threshold.study",
+ "sha256": "59C77A7DF1488E96B994FE04A32A505B8DFC5F3F92C45A8BD774A043C1C2F5A0",
+ "bytes": 13241
+ },
+ {
+ "path": "harness/experiments/analysis-context-20260911/generated/D-inline.study",
+ "sha256": "7A0FF1A4CCAD6B41344331182820AB6C6C7990DA09B842F8D04C60008A8D5232",
+ "bytes": 13241
+ }
+ ]
+}
diff --git a/harness/experiments/analysis-context-20260911/generated/RESULTS.md b/harness/experiments/analysis-context-20260911/generated/RESULTS.md
new file mode 100644
index 00000000..783c8abe
--- /dev/null
+++ b/harness/experiments/analysis-context-20260911/generated/RESULTS.md
@@ -0,0 +1,14 @@
+# Executed context experiment
+
+All input magnitudes are integer milliseconds. This tiny dialect is not Studio source.
+
+| Variant | Initial lines | Initial bytes | Binding rows | Fixed-all edit removed/added lines | Threshold edit removed/added lines | Initial passing cases | After fixed-all change |
+| --- | ---: | ---: | ---: | --- | --- | ---: | ---: |
+| B-inline | 106 | 2281 | 62 | 3/3 | 3/3 | 4 | 1 |
+| B-factored | 108 | 2781 | 62 | 3/3 | 2/2 | 4 | 1 |
+| D-inline | 522 | 13241 | 480 | 21/21 | 21/21 | 4 | 1 |
+| D-factored | 524 | 14026 | 480 | 21/21 | 2/2 | 4 | 1 |
+
+Executed assertions: 218. All passed. Every accepted fixture was parsed, validated, rendered and parsed back with exact experiment AST equality. Rejected cases were checked separately.
+
+Negative controls: D changing one repeated fixed input changes only that case; B evaluating inherited formulas against baseline inputs instead of effective case inputs gives 21,750 instead of case20's 23,175. A shallow B case copy is not frozen; factored D also needs its definition environment snapshotted. Clearing a B override restores its named baseline value, including an explicitly missing baseline. A deleted D binding row rejects. Baseline chains, recursive definitions and project captures inside pure functions reject.
diff --git a/harness/experiments/analysis-context-20260911/main.rs b/harness/experiments/analysis-context-20260911/main.rs
new file mode 100644
index 00000000..0fb2a8a1
--- /dev/null
+++ b/harness/experiments/analysis-context-20260911/main.rs
@@ -0,0 +1,913 @@
+//! Isolated context experiment. This is deliberately NOT Studio syntax or production code.
+use std::collections::{BTreeMap, BTreeSet};
+use std::fmt::Write as _;
+use std::path::Path;
+
+type Bindings = BTreeMap;
+type Functions = BTreeMap;
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+enum Expr {
+ Int(i64),
+ Missing,
+ Ref(String),
+ Sum(Vec),
+ Le(Box, Box),
+ Call(String, Vec),
+}
+#[derive(Clone, Debug, PartialEq, Eq)]
+struct Function {
+ parameters: Vec,
+ body: Expr,
+}
+#[derive(Clone, Debug, PartialEq, Eq)]
+struct Baseline {
+ name: String,
+ revision: u64,
+ bindings: Bindings,
+}
+#[derive(Clone, Debug, PartialEq, Eq)]
+struct Case {
+ name: String,
+ base: Option,
+ bindings: Bindings,
+}
+#[derive(Clone, Debug, PartialEq, Eq)]
+struct Study {
+ mode: char,
+ revision: u64,
+ properties: Vec,
+ functions: Functions,
+ baseline: Option,
+ cases: Vec,
+ origin: Option,
+ captured_origins: BTreeMap,
+}
+#[derive(Clone, Debug, PartialEq, Eq)]
+enum Value {
+ Int(i64),
+ Bool(bool),
+ Missing(BTreeSet),
+}
+#[derive(Clone, Debug, PartialEq, Eq)]
+struct Observation {
+ value: Value,
+ origins: BTreeMap,
+ document_revision: u64,
+}
+
+fn split_args(s: &str) -> Result, String> {
+ if s.trim().is_empty() {
+ return Ok(vec![]);
+ }
+ let mut depth = 0_i32;
+ let mut start = 0;
+ let mut out = vec![];
+ for (i, ch) in s.char_indices() {
+ match ch {
+ '(' => depth += 1,
+ ')' => {
+ depth -= 1;
+ if depth < 0 {
+ return Err("unbalanced expression".into());
+ }
+ }
+ ',' if depth == 0 => {
+ out.push(s[start..i].trim());
+ start = i + 1;
+ }
+ _ => {}
+ }
+ }
+ if depth != 0 {
+ return Err("unbalanced expression".into());
+ }
+ out.push(s[start..].trim());
+ Ok(out)
+}
+fn expr(s: &str) -> Result {
+ let s = s.trim();
+ if s == "missing" {
+ return Ok(Expr::Missing);
+ }
+ if let Ok(n) = s.parse() {
+ return Ok(Expr::Int(n));
+ }
+ if let Some(at) = s.find('(') {
+ if !s.ends_with(')') {
+ return Err("missing closing parenthesis".into());
+ }
+ let args = split_args(&s[at + 1..s.len() - 1])?
+ .into_iter()
+ .map(expr)
+ .collect::, _>>()?;
+ return match &s[..at] {
+ "sum" => Ok(Expr::Sum(args)),
+ "le" if args.len() == 2 => Ok(Expr::Le(
+ Box::new(args[0].clone()),
+ Box::new(args[1].clone()),
+ )),
+ "le" => Err("le requires two arguments".into()),
+ name => Ok(Expr::Call(name.into(), args)),
+ };
+ }
+ if s.is_empty() || !s.chars().all(|c| c.is_ascii_alphanumeric() || c == '_') {
+ return Err(format!("invalid symbol {s}"));
+ }
+ Ok(Expr::Ref(s.into()))
+}
+fn spelling(e: &Expr) -> String {
+ let list = |xs: &[Expr]| xs.iter().map(spelling).collect::>().join(", ");
+ match e {
+ Expr::Int(v) => v.to_string(),
+ Expr::Missing => "missing".into(),
+ Expr::Ref(s) => s.clone(),
+ Expr::Sum(xs) => format!("sum({})", list(xs)),
+ Expr::Le(a, b) => format!("le({}, {})", spelling(a), spelling(b)),
+ Expr::Call(name, xs) => format!("{name}({})", list(xs)),
+ }
+}
+fn parse(text: &str) -> Result {
+ let mut lines = text.lines().filter(|l| !l.trim().is_empty());
+ let head = lines
+ .next()
+ .ok_or("empty study")?
+ .split_whitespace()
+ .collect::>();
+ if head.len() != 4
+ || head[0] != "study"
+ || head[2] != "revision"
+ || !matches!(head[1], "B" | "D")
+ {
+ return Err("invalid study header".into());
+ }
+ let mut study = Study {
+ mode: head[1].chars().next().unwrap(),
+ revision: head[3].parse().map_err(|_| "bad revision")?,
+ properties: vec![],
+ functions: BTreeMap::new(),
+ baseline: None,
+ cases: vec![],
+ origin: None,
+ captured_origins: BTreeMap::new(),
+ };
+ let mut current: Option<(bool, Case, u64)> = None;
+ for line in lines {
+ let line = line.trim();
+ if line == "end" {
+ let (base, item, revision) = current.take().ok_or("unmatched end")?;
+ if base {
+ if study.baseline.is_some() {
+ return Err("multiple baselines forbidden".into());
+ }
+ study.baseline = Some(Baseline {
+ name: item.name,
+ revision,
+ bindings: item.bindings,
+ });
+ } else {
+ if study.cases.iter().any(|c| c.name == item.name) {
+ return Err("duplicate case".into());
+ }
+ study.cases.push(item);
+ }
+ } else if let Some((_, case, _)) = current.as_mut() {
+ let (name, value) = line.split_once(" = ").ok_or("expected binding")?;
+ if case.bindings.insert(name.into(), expr(value)?).is_some() {
+ return Err("duplicate binding".into());
+ }
+ } else if let Some(properties) = line.strip_prefix("properties ") {
+ if !study.properties.is_empty() {
+ return Err("duplicate properties".into());
+ }
+ study.properties = properties.split(", ").map(String::from).collect();
+ } else if let Some(origin) = line.strip_prefix("origin ") {
+ study.origin = Some(origin.into());
+ } else if let Some(captured) = line.strip_prefix("captured ") {
+ let (property, origin) = captured
+ .split_once(" = ")
+ .ok_or("invalid captured origin")?;
+ if study
+ .captured_origins
+ .insert(property.into(), origin.into())
+ .is_some()
+ {
+ return Err("duplicate captured origin".into());
+ }
+ } else if let Some(def) = line.strip_prefix("function ") {
+ let (left, right) = def.split_once(" = ").ok_or("invalid function")?;
+ let at = left.find('(').ok_or("function parameters required")?;
+ if !left.ends_with(')') {
+ return Err("bad parameters".into());
+ }
+ let f = Function {
+ parameters: split_args(&left[at + 1..left.len() - 1])?
+ .into_iter()
+ .map(String::from)
+ .collect(),
+ body: expr(right)?,
+ };
+ if study.functions.insert(left[..at].into(), f).is_some() {
+ return Err("duplicate function".into());
+ }
+ } else {
+ let words = line.split_whitespace().collect::>();
+ let (base, name, parent, revision) = match words.as_slice() {
+ ["baseline", name, "revision", revision] => (
+ true,
+ *name,
+ None,
+ revision.parse().map_err(|_| "bad baseline revision")?,
+ ),
+ ["case", name, "base", parent] => (false, *name, Some((*parent).to_owned()), 0),
+ ["case", name, "independent"] => (false, *name, None, 0),
+ _ => return Err(format!("invalid declaration: {line}")),
+ };
+ current = Some((
+ base,
+ Case {
+ name: name.into(),
+ base: parent,
+ bindings: BTreeMap::new(),
+ },
+ revision,
+ ));
+ }
+ }
+ if current.is_some() {
+ return Err("unterminated block".into());
+ }
+ validate(&study)?;
+ Ok(study)
+}
+fn render(s: &Study) -> String {
+ let mut text = format!("study {} revision {}\n", s.mode, s.revision);
+ if let Some(origin) = &s.origin {
+ writeln!(text, "origin {origin}").unwrap();
+ }
+ for (property, origin) in &s.captured_origins {
+ writeln!(text, "captured {property} = {origin}").unwrap();
+ }
+ writeln!(text, "properties {}", s.properties.join(", ")).unwrap();
+ for (name, f) in &s.functions {
+ writeln!(
+ text,
+ "function {name}({}) = {}",
+ f.parameters.join(", "),
+ spelling(&f.body)
+ )
+ .unwrap();
+ }
+ let write_bindings = |text: &mut String, bindings: &Bindings| {
+ for (p, e) in bindings {
+ writeln!(text, " {p} = {}", spelling(e)).unwrap();
+ }
+ text.push_str("end\n");
+ };
+ if let Some(b) = &s.baseline {
+ writeln!(text, "baseline {} revision {}", b.name, b.revision).unwrap();
+ write_bindings(&mut text, &b.bindings);
+ }
+ for c in &s.cases {
+ writeln!(
+ text,
+ "case {} {}",
+ c.name,
+ c.base
+ .as_ref()
+ .map_or("independent".into(), |b| format!("base {b}"))
+ )
+ .unwrap();
+ write_bindings(&mut text, &c.bindings);
+ }
+ text
+}
+fn refs(e: &Expr, names: &mut BTreeSet, calls: &mut BTreeSet) {
+ match e {
+ Expr::Ref(p) => {
+ names.insert(p.clone());
+ }
+ Expr::Sum(xs) | Expr::Call(_, xs) => {
+ if let Expr::Call(f, _) = e {
+ calls.insert(f.clone());
+ }
+ for x in xs {
+ refs(x, names, calls);
+ }
+ }
+ Expr::Le(a, b) => {
+ refs(a, names, calls);
+ refs(b, names, calls);
+ }
+ _ => {}
+ }
+}
+fn acyclic(graph: &BTreeMap>) -> Result<(), String> {
+ fn visit(
+ n: &str,
+ graph: &BTreeMap>,
+ path: &mut Vec,
+ done: &mut BTreeSet,
+ ) -> Result<(), String> {
+ if path.iter().any(|p| p == n) {
+ path.push(n.into());
+ return Err(format!("cycle: {}", path.join(" -> ")));
+ }
+ if done.contains(n) {
+ return Ok(());
+ }
+ path.push(n.into());
+ for next in graph
+ .get(n)
+ .ok_or_else(|| format!("unknown dependency {n}"))?
+ {
+ visit(next, graph, path, done)?;
+ }
+ path.pop();
+ done.insert(n.into());
+ Ok(())
+ }
+ let mut done = BTreeSet::new();
+ for n in graph.keys() {
+ visit(n, graph, &mut vec![], &mut done)?;
+ }
+ Ok(())
+}
+fn resolved<'a>(s: &'a Study, c: &'a Case, property: &str) -> Result<(&'a Expr, String), String> {
+ if let Some(e) = c.bindings.get(property) {
+ return Ok((e, format!("case:{}", c.name)));
+ }
+ if let Some(base) = &c.base {
+ let b = s
+ .baseline
+ .as_ref()
+ .filter(|b| &b.name == base)
+ .ok_or("unknown baseline")?;
+ if let Some(e) = b.bindings.get(property) {
+ return Ok((
+ e,
+ format!("baseline:{}@{} via {}", b.name, b.revision, c.name),
+ ));
+ }
+ }
+ Err(format!("missing binding row: {}.{property}", c.name))
+}
+fn validate(s: &Study) -> Result<(), String> {
+ let properties = s.properties.iter().cloned().collect::>();
+ if properties.len() != s.properties.len() || properties.is_empty() {
+ return Err("invalid property catalog".into());
+ }
+ if (s.mode == 'B') != s.baseline.is_some() {
+ return Err("B requires one explicit baseline; D forbids baselines".into());
+ }
+ let mut function_graph = BTreeMap::new();
+ for (name, f) in &s.functions {
+ let mut names = BTreeSet::new();
+ let mut calls = BTreeSet::new();
+ refs(&f.body, &mut names, &mut calls);
+ let parameters = f.parameters.iter().cloned().collect::>();
+ if parameters.len() != f.parameters.len() || !names.is_subset(¶meters) {
+ return Err(format!("function {name} captures unknown/project property"));
+ }
+ function_graph.insert(name.clone(), calls);
+ }
+ acyclic(&function_graph)?;
+ let mut contexts = s.cases.clone();
+ if let Some(b) = &s.baseline {
+ contexts.push(Case {
+ name: format!("baseline_{}", b.name),
+ base: None,
+ bindings: b.bindings.clone(),
+ });
+ }
+ for c in &contexts {
+ if !c.bindings.keys().all(|p| properties.contains(p)) {
+ return Err("unknown binding property".into());
+ }
+ if s.mode == 'D' && c.base.is_some() {
+ return Err("D case cannot inherit".into());
+ }
+ if let Some(name) = &c.base {
+ if s.baseline.as_ref().is_none_or(|b| &b.name != name) {
+ return Err("unknown baseline; case-to-case inheritance forbidden".into());
+ }
+ }
+ let mut graph = BTreeMap::new();
+ for p in &properties {
+ let (e, _) = resolved(s, c, p)?;
+ let mut names = BTreeSet::new();
+ let mut calls = BTreeSet::new();
+ refs(e, &mut names, &mut calls);
+ if !names.is_subset(&properties) || !calls.iter().all(|f| s.functions.contains_key(f)) {
+ return Err("unknown reference".into());
+ }
+ graph.insert(p.clone(), names);
+ }
+ acyclic(&graph).map_err(|e| format!("{}: {e}", c.name))?;
+ for p in &properties {
+ evaluate(s, c, p)?;
+ }
+ }
+ Ok(())
+}
+fn evaluate(s: &Study, c: &Case, property: &str) -> Result {
+ let mut origins = BTreeMap::new();
+ let mut cache = BTreeMap::new();
+ fn property_value(
+ s: &Study,
+ c: &Case,
+ p: &str,
+ origins: &mut BTreeMap,
+ cache: &mut BTreeMap,
+ ) -> Result {
+ if let Some(v) = cache.get(p) {
+ return Ok(v.clone());
+ }
+ let (e, origin) = resolved(s, c, p)?;
+ origins.insert(
+ p.into(),
+ s.captured_origins
+ .get(p)
+ .map_or(origin, |old| format!("frozen:{old}")),
+ );
+ let value = run(s, c, e, &BTreeMap::new(), Some(p), origins, cache)?;
+ if !matches!(value, Value::Missing(_)) && (p == "budget") != matches!(value, Value::Bool(_))
+ {
+ return Err(format!("wrong type for {p}"));
+ }
+ cache.insert(p.into(), value.clone());
+ Ok(value)
+ }
+ fn run(
+ s: &Study,
+ c: &Case,
+ e: &Expr,
+ params: &BTreeMap,
+ missing_property: Option<&str>,
+ origins: &mut BTreeMap,
+ cache: &mut BTreeMap,
+ ) -> Result {
+ match e {
+ Expr::Int(n) => Ok(Value::Int(*n)),
+ Expr::Missing => Ok(Value::Missing(BTreeSet::from([missing_property
+ .unwrap_or("function-body")
+ .into()]))),
+ Expr::Ref(p) => params
+ .get(p)
+ .cloned()
+ .map_or_else(|| property_value(s, c, p, origins, cache), Ok),
+ Expr::Call(name, args) => {
+ let f = s.functions.get(name).ok_or("unknown function")?;
+ if f.parameters.len() != args.len() {
+ return Err("wrong function arity".into());
+ }
+ let mut bound = BTreeMap::new();
+ for (parameter, arg) in f.parameters.iter().zip(args) {
+ bound.insert(
+ parameter.clone(),
+ run(s, c, arg, params, missing_property, origins, cache)?,
+ );
+ }
+ run(s, c, &f.body, &bound, missing_property, origins, cache)
+ }
+ Expr::Sum(xs) => {
+ let mut total = 0_i64;
+ let mut missing = BTreeSet::new();
+ for x in xs {
+ match run(s, c, x, params, missing_property, origins, cache)? {
+ Value::Int(n) => total = total.checked_add(n).ok_or("integer overflow")?,
+ Value::Missing(m) => missing.extend(m),
+ Value::Bool(_) => return Err("sum requires numeric inputs".into()),
+ }
+ }
+ Ok(if missing.is_empty() {
+ Value::Int(total)
+ } else {
+ Value::Missing(missing)
+ })
+ }
+ Expr::Le(a, b) => {
+ let a = run(s, c, a, params, missing_property, origins, cache)?;
+ let b = run(s, c, b, params, missing_property, origins, cache)?;
+ match (a, b) {
+ (Value::Int(a), Value::Int(b)) => Ok(Value::Bool(a <= b)),
+ (Value::Missing(mut a), Value::Missing(b)) => {
+ a.extend(b);
+ Ok(Value::Missing(a))
+ }
+ (Value::Missing(a), Value::Int(_)) | (Value::Int(_), Value::Missing(a)) => {
+ Ok(Value::Missing(a))
+ }
+ _ => Err("le requires numeric inputs".into()),
+ }
+ }
+ }
+ }
+ let value = property_value(s, c, property, &mut origins, &mut cache)?;
+ Ok(Observation {
+ value,
+ origins,
+ document_revision: s.revision,
+ })
+}
+fn fixture(mode: char, factored: bool) -> Study {
+ let inputs = (1..=20)
+ .map(|i| format!("fixed{i:02}"))
+ .chain(["varying01".into(), "varying02".into()])
+ .collect::>();
+ let mut all = inputs.clone();
+ all.extend(["total".into(), "budget".into()]);
+ let mut bindings = (1..=20)
+ .map(|i| (format!("fixed{i:02}"), Expr::Int(1000)))
+ .collect::();
+ bindings.insert("varying01".into(), Expr::Int(750));
+ bindings.insert("varying02".into(), Expr::Int(1000));
+ let total = Expr::Sum(inputs.iter().cloned().map(Expr::Ref).collect());
+ let check = Expr::Le(
+ Box::new(Expr::Ref("total".into())),
+ Box::new(Expr::Int(22000)),
+ );
+ let mut functions = BTreeMap::new();
+ if factored {
+ functions.insert(
+ "total_formula".into(),
+ Function {
+ parameters: inputs.clone(),
+ body: total,
+ },
+ );
+ functions.insert(
+ "budget_formula".into(),
+ Function {
+ parameters: vec!["result".into()],
+ body: Expr::Le(
+ Box::new(Expr::Ref("result".into())),
+ Box::new(Expr::Int(22000)),
+ ),
+ },
+ );
+ bindings.insert(
+ "total".into(),
+ Expr::Call(
+ "total_formula".into(),
+ inputs.into_iter().map(Expr::Ref).collect(),
+ ),
+ );
+ bindings.insert(
+ "budget".into(),
+ Expr::Call("budget_formula".into(), vec![Expr::Ref("total".into())]),
+ );
+ } else {
+ bindings.insert("total".into(), total);
+ bindings.insert("budget".into(), check);
+ }
+ let cases = (0..20)
+ .map(|i| {
+ let mut rows = if mode == 'D' {
+ bindings.clone()
+ } else {
+ BTreeMap::new()
+ };
+ if mode == 'D' || i != 0 {
+ rows.insert("varying01".into(), Expr::Int(750 + 50 * i));
+ rows.insert("varying02".into(), Expr::Int(1000 + 25 * i));
+ }
+ Case {
+ name: format!("case{:02}", i + 1),
+ base: (mode == 'B').then(|| "engineering".into()),
+ bindings: rows,
+ }
+ })
+ .collect();
+ Study {
+ mode,
+ revision: 1,
+ properties: all,
+ functions,
+ baseline: (mode == 'B').then(|| Baseline {
+ name: "engineering".into(),
+ revision: 1,
+ bindings,
+ }),
+ cases,
+ origin: None,
+ captured_origins: BTreeMap::new(),
+ }
+}
+fn freeze(s: &Study, case: usize) -> Study {
+ let c = &s.cases[case];
+ Study {
+ mode: 'D',
+ revision: 1,
+ properties: s.properties.clone(),
+ functions: s.functions.clone(),
+ baseline: None,
+ cases: vec![Case {
+ name: c.name.clone(),
+ base: None,
+ bindings: s
+ .properties
+ .iter()
+ .map(|p| (p.clone(), resolved(s, c, p).unwrap().0.clone()))
+ .collect(),
+ }],
+ origin: Some(format!(
+ "{}:{}:document{}{}",
+ s.mode,
+ c.name,
+ s.revision,
+ s.baseline
+ .as_ref()
+ .map_or(String::new(), |b| format!(":{}@{}", b.name, b.revision))
+ )),
+ captured_origins: s
+ .properties
+ .iter()
+ .map(|p| (p.clone(), resolved(s, c, p).unwrap().1))
+ .collect(),
+ }
+}
+fn write_fixture(dir: &Path, name: &str, s: &Study) -> Result {
+ let source = render(s);
+ let back = parse(&source)?;
+ assert_eq!(&back, s, "exact experiment AST round trip");
+ std::fs::write(dir.join(format!("{name}.study")), &source).map_err(|e| e.to_string())?;
+ Ok(source)
+}
+fn diff(before: &str, after: &str) -> (usize, usize) {
+ let a = before.lines().collect::>();
+ let b = after.lines().collect::>();
+ let mut row = vec![0; b.len() + 1];
+ for x in &a {
+ let mut diagonal = 0;
+ for (j, y) in b.iter().enumerate() {
+ let old = row[j + 1];
+ row[j + 1] = if x == y {
+ diagonal + 1
+ } else {
+ row[j + 1].max(row[j])
+ };
+ diagonal = old;
+ }
+ }
+ (a.len() - row[b.len()], b.len() - row[b.len()])
+}
+fn assert_total(s: &Study, index: usize, expected: i64) {
+ assert_eq!(
+ evaluate(s, &s.cases[index], "total").unwrap().value,
+ Value::Int(expected)
+ );
+}
+fn change_fixed(s: &mut Study, all: bool) {
+ s.revision += 1;
+ if let Some(b) = s.baseline.as_mut() {
+ b.revision += 1;
+ b.bindings.insert("fixed01".into(), Expr::Int(1200));
+ } else {
+ for c in s.cases.iter_mut().take(if all { 20 } else { 1 }) {
+ c.bindings.insert("fixed01".into(), Expr::Int(1200));
+ }
+ }
+}
+fn change_threshold(s: &mut Study, value: i64) {
+ s.revision += 1;
+ if let Some(f) = s.functions.get_mut("budget_formula") {
+ f.body = Expr::Le(
+ Box::new(Expr::Ref("result".into())),
+ Box::new(Expr::Int(value)),
+ );
+ } else {
+ let e = Expr::Le(
+ Box::new(Expr::Ref("total".into())),
+ Box::new(Expr::Int(value)),
+ );
+ if let Some(b) = s.baseline.as_mut() {
+ b.revision += 1;
+ b.bindings.insert("budget".into(), e);
+ } else {
+ for c in &mut s.cases {
+ c.bindings.insert("budget".into(), e.clone());
+ }
+ }
+ }
+}
+fn pass_count(s: &Study) -> usize {
+ s.cases
+ .iter()
+ .filter(|c| evaluate(s, c, "budget").unwrap().value == Value::Bool(true))
+ .count()
+}
+
+fn main() -> Result<(), String> {
+ let out = std::env::args()
+ .nth(1)
+ .ok_or("usage: analysis-context.exe OUTPUT_DIRECTORY")?;
+ let dir = Path::new(&out);
+ std::fs::create_dir_all(dir).map_err(|e| e.to_string())?;
+ let mut report = String::from(
+ "# Executed context experiment\n\nAll input magnitudes are integer milliseconds. This tiny dialect is not Studio source.\n\n| Variant | Initial lines | Initial bytes | Binding rows | Fixed-all edit removed/added lines | Threshold edit removed/added lines | Initial passing cases | After fixed-all change |\n| --- | ---: | ---: | ---: | --- | --- | ---: | ---: |\n",
+ );
+ let mut checks = 0;
+ for mode in ['B', 'D'] {
+ for factored in [false, true] {
+ let name = format!("{mode}-{}", if factored { "factored" } else { "inline" });
+ let original = fixture(mode, factored);
+ validate(&original)?;
+ for i in 0..20 {
+ assert_total(&original, i, 21750 + 75 * i as i64);
+ checks += 1;
+ }
+ assert_eq!(pass_count(&original), 4);
+ checks += 1;
+ let initial = write_fixture(dir, &name, &original)?;
+ let mut changed = original.clone();
+ change_fixed(&mut changed, true);
+ validate(&changed)?;
+ for i in 0..20 {
+ assert_total(&changed, i, 21950 + 75 * i as i64);
+ checks += 1;
+ }
+ assert_eq!(pass_count(&changed), 1);
+ checks += 1;
+ let fixed_source = write_fixture(dir, &format!("{name}-fixed-all"), &changed)?;
+ let mut threshold = original.clone();
+ change_threshold(&mut threshold, 22500);
+ validate(&threshold)?;
+ assert_eq!(pass_count(&threshold), 11);
+ checks += 1;
+ let threshold_source = write_fixture(dir, &format!("{name}-threshold"), &threshold)?;
+ let frozen = freeze(&original, 19);
+ let frozen_before = evaluate(&frozen, &frozen.cases[0], "budget")?;
+ assert_total(&frozen, 0, 23175);
+ checks += 1;
+ change_threshold(&mut changed, 25000);
+ assert_eq!(
+ evaluate(&frozen, &frozen.cases[0], "budget")?,
+ frozen_before
+ );
+ checks += 1;
+ write_fixture(dir, &format!("{name}-frozen-case20"), &frozen)?;
+ // A shallow case copy still follows its baseline and/or shared function environment.
+ let shallow = original.cases[19].clone();
+ if mode == 'B' {
+ assert_eq!(
+ evaluate(&changed, &shallow, "total")?.value,
+ Value::Int(23375)
+ );
+ checks += 1;
+ }
+ if factored {
+ assert_eq!(
+ evaluate(&changed, &shallow, "budget")?.value,
+ Value::Bool(true)
+ );
+ checks += 1;
+ }
+ if mode == 'D' && !factored {
+ assert_eq!(
+ evaluate(&changed, &shallow, "total")?.value,
+ Value::Int(23175)
+ );
+ assert_eq!(
+ evaluate(&changed, &shallow, "budget")?.value,
+ Value::Bool(false)
+ );
+ checks += 2;
+ }
+ assert_eq!(frozen.captured_origins.len(), 24);
+ assert!(
+ evaluate(&frozen, &frozen.cases[0], "total")?
+ .origins
+ .values()
+ .all(|origin| origin.starts_with("frozen:"))
+ );
+ checks += 2;
+ let mut missing = original.clone();
+ missing.cases[19]
+ .bindings
+ .insert("varying01".into(), Expr::Missing);
+ validate(&missing)?;
+ assert_eq!(
+ evaluate(&missing, &missing.cases[19], "budget")?.value,
+ Value::Missing(BTreeSet::from(["varying01".into()]))
+ );
+ checks += 1;
+ write_fixture(dir, &format!("{name}-missing"), &missing)?;
+ let frozen_missing = freeze(&missing, 19);
+ assert_eq!(
+ evaluate(&frozen_missing, &frozen_missing.cases[0], "budget")?.value,
+ Value::Missing(BTreeSet::from(["varying01".into()]))
+ );
+ checks += 1;
+ missing.cases[19].bindings.remove("varying01");
+ if mode == 'B' {
+ validate(&missing)?;
+ assert_total(&missing, 19, 22225);
+ checks += 1;
+ write_fixture(dir, &format!("{name}-cleared-override"), &missing)?;
+ } else {
+ assert!(
+ validate(&missing)
+ .unwrap_err()
+ .contains("missing binding row")
+ );
+ checks += 1;
+ std::fs::write(
+ dir.join(format!("{name}-deleted-row.rejected-study")),
+ render(&missing),
+ )
+ .map_err(|e| e.to_string())?;
+ }
+ let mut cyclic = original.clone();
+ cyclic.cases[19]
+ .bindings
+ .insert("varying01".into(), Expr::Ref("total".into()));
+ let cycle = validate(&cyclic).unwrap_err();
+ assert!(cycle.contains("cycle"));
+ checks += 1;
+ std::fs::write(
+ dir.join(format!("{name}-cycle.rejected-study")),
+ render(&cyclic),
+ )
+ .map_err(|e| e.to_string())?;
+ let observation = evaluate(&original, &original.cases[19], "budget")?;
+ let mut detail = format!(
+ "# {name}: case20 evaluation\n\nValue: {:?}\nDocument revision: {}\n\n",
+ observation.value, observation.document_revision
+ );
+ for (p, origin) in &observation.origins {
+ writeln!(detail, "- {p}: {origin}").unwrap();
+ }
+ writeln!(detail, "\nRejected cycle: {cycle}").unwrap();
+ std::fs::write(dir.join(format!("{name}-provenance.md")), detail)
+ .map_err(|e| e.to_string())?;
+ let rows = original.baseline.as_ref().map_or(0, |b| b.bindings.len())
+ + original
+ .cases
+ .iter()
+ .map(|c| c.bindings.len())
+ .sum::();
+ let (a, b) = diff(&initial, &fixed_source);
+ let (c, d) = diff(&initial, &threshold_source);
+ writeln!(
+ report,
+ "| {name} | {} | {} | {rows} | {a}/{b} | {c}/{d} | 4 | 1 |",
+ initial.lines().count(),
+ initial.len()
+ )
+ .unwrap();
+ }
+ }
+ // Negative controls establish that source locality and isolation differ.
+ let mut d = fixture('D', false);
+ change_fixed(&mut d, false);
+ validate(&d)?;
+ assert_total(&d, 0, 21950);
+ assert_total(&d, 19, 23175);
+ checks += 2;
+ write_fixture(dir, "D-inline-fixed-one-only", &d)?;
+ let b = fixture('B', false);
+ let baseline_case = Case {
+ name: "wrong_baseline_context".into(),
+ base: None,
+ bindings: b.baseline.as_ref().unwrap().bindings.clone(),
+ };
+ assert_eq!(
+ evaluate(&b, &baseline_case, "total")?.value,
+ Value::Int(21750)
+ );
+ assert_total(&b, 19, 23175);
+ checks += 2;
+ let mut explicit = fixture('B', false);
+ explicit
+ .baseline
+ .as_mut()
+ .unwrap()
+ .bindings
+ .insert("varying01".into(), Expr::Missing);
+ explicit.cases[19].bindings.remove("varying01");
+ validate(&explicit)?;
+ assert!(matches!(
+ evaluate(&explicit, &explicit.cases[19], "total")?.value,
+ Value::Missing(_)
+ ));
+ checks += 1;
+ let mut chained = fixture('B', false);
+ chained.cases[1].base = Some("case01".into());
+ assert!(validate(&chained).unwrap_err().contains("case-to-case"));
+ checks += 1;
+ let mut capture = fixture('D', true);
+ capture.functions.get_mut("budget_formula").unwrap().body = Expr::Ref("fixed01".into());
+ assert!(validate(&capture).unwrap_err().contains("captures"));
+ checks += 1;
+ let mut recursive = fixture('D', true);
+ recursive.functions.get_mut("budget_formula").unwrap().body =
+ Expr::Call("budget_formula".into(), vec![Expr::Ref("result".into())]);
+ assert!(validate(&recursive).unwrap_err().contains("cycle"));
+ checks += 1;
+ writeln!(report,"\nExecuted assertions: {checks}. All passed. Every accepted fixture was parsed, validated, rendered and parsed back with exact experiment AST equality. Rejected cases were checked separately.\n").unwrap();
+ report.push_str("Negative controls: D changing one repeated fixed input changes only that case; B evaluating inherited formulas against baseline inputs instead of effective case inputs gives 21,750 instead of case20's 23,175. A shallow B case copy is not frozen; factored D also needs its definition environment snapshotted. Clearing a B override restores its named baseline value, including an explicitly missing baseline. A deleted D binding row rejects. Baseline chains, recursive definitions and project captures inside pure functions reject.\n");
+ std::fs::write(dir.join("RESULTS.md"), &report).map_err(|e| e.to_string())?;
+ println!("{report}");
+ Ok(())
+}
diff --git a/harness/experiments/behavior-creation-native-20260911/manifest.json b/harness/experiments/behavior-creation-native-20260911/manifest.json
new file mode 100644
index 00000000..799b9774
--- /dev/null
+++ b/harness/experiments/behavior-creation-native-20260911/manifest.json
@@ -0,0 +1,671 @@
+{
+ "reviewer": "Codex-9e8r6t /root/palette_finish",
+ "started_utc": "2026-09-11T09:18:19.944507+00:00",
+ "finished_utc": "2026-09-11T09:18:23.213965+00:00",
+ "scope": "Frozen checkpoints only; no live work/profile/UI access or compilation.",
+ "artifacts": [
+ {
+ "path": ".local/behavior-creation-oracle-20260911/behavior-creation-contract-v2.exe",
+ "bytes": 20757504,
+ "sha256": "056eefd444924916bf6ac3c4897ab2ff4a8a4bb892e1dbc16adad32e59bf6a36"
+ },
+ {
+ "path": "harness/behavior-creation-contract.rs",
+ "bytes": 23982,
+ "sha256": "51ab2ffa1826dd949b79f3a9690042a2f9e38daf9ed91517cade3861482117ba"
+ },
+ {
+ "path": "harness/experiments/behavior-creation-native-20260911/verify.py",
+ "bytes": 5348,
+ "sha256": "4921c4615071240c3ac3bbe1223c0db3bf472fe5e3eec2ae5dac12f95b1674df"
+ },
+ {
+ "path": ".local/native-qa/behavior-20260911-v4/bin/arcadia-studio.exe",
+ "bytes": 111163904,
+ "sha256": "d4d9c2bd937e301ff1009d7cb93a34ee5aa6dfc837ff7e87d468c85371b20c31"
+ },
+ {
+ "path": ".local/native-qa/behavior-20260911-v4/bin/libunwind.dll",
+ "bytes": 190976,
+ "sha256": "f45604a12e8bcd839fd86f667c1be1cc7c4f9da2b3c69ff381ac708f0e1ae7d4"
+ },
+ {
+ "path": ".local/native-qa/behavior-20260911-v4/bin/manifest.json",
+ "bytes": 41579,
+ "sha256": "e0470afae0ae21941ac6da63fadfb3c70d0ce646317c65fafa5c186e94f18fe2"
+ },
+ {
+ "path": ".local/native-qa/behavior-20260911-v4/baseline-source-manifest.json",
+ "bytes": 927,
+ "sha256": "7b5bcd66739ad9f3ddaa3a50db7a4bba3be144d13d161e1db85d2d43f3038259"
+ },
+ {
+ "path": ".local/native-qa/behavior-20260911-v4/cancel-save-verification.json",
+ "bytes": 1439,
+ "sha256": "5fb79d14a000fa0ecc046fba64bcd2846d3bc2eb8708a88e334db0ede4ce16a1"
+ },
+ {
+ "path": ".local/native-qa/behavior-20260911-v4/scenario-empty-saved.png",
+ "bytes": 90419,
+ "sha256": "b03fb33d3f4cf1e5f95e7ac4198a4dee30ffd9af5e250d481e0d5dc2a2a0f90c"
+ },
+ {
+ "path": ".local/native-qa/behavior-20260911-v4/machine-created-saved.png",
+ "bytes": 98897,
+ "sha256": "1e7af3d6219c430eaafb0de5afd8df4c51b4efeb80de3f642084188633dcb65b"
+ }
+ ],
+ "checkpoints": {
+ "baseline": {
+ "path": ".local/native-qa/palette-20260910-v3/checkpoint-transition-reopen",
+ "files": {
+ "oa/activities/activity_assess_incident.arcadia": {
+ "bytes": 376,
+ "sha256": "ae41d7c20b062b39c2edab7fb890a3d88a9ce18fd8d03018ef2d6f95eeff62e8"
+ },
+ "oa/participants.arcadia": {
+ "bytes": 403,
+ "sha256": "094cab67f34b64902942c10a35bbcd0f760886d862588a0816d6ceb57bacf51b"
+ },
+ "project.arcadia": {
+ "bytes": 4844,
+ "sha256": "b35a3f63f223cc4fe2760d6308e87b016ed1eadfbef0a3a4bd051b52c9080958"
+ },
+ "rationale.arcadia": {
+ "bytes": 57,
+ "sha256": "c01867c9dc0d40726853119fac3c6ad24a40d8d362a93a8b9d20df04ec2e273f"
+ },
+ "sa/participants.arcadia": {
+ "bytes": 124,
+ "sha256": "fb975b83d3ec164c38936bf27fe7d2021cc46805574902a534744b040f7d3ae8"
+ },
+ "traceability.arcadia": {
+ "bytes": 395,
+ "sha256": "f778acaaa85de0940cedcd9514cd803032a11e782d859454203235febb73e5f0"
+ }
+ }
+ },
+ "process": {
+ "path": ".local/native-qa/behavior-20260911-v4/checkpoint-process",
+ "files": {
+ "oa/activities/activity_assess_incident.arcadia": {
+ "bytes": 376,
+ "sha256": "ae41d7c20b062b39c2edab7fb890a3d88a9ce18fd8d03018ef2d6f95eeff62e8"
+ },
+ "oa/behavior/process_coordinate_rescue.arcadia": {
+ "bytes": 149,
+ "sha256": "8f393d1cee5e7eed5e41af14539b1fe7ae1c7300dd9383ca0ef1ee17254b6253"
+ },
+ "oa/participants.arcadia": {
+ "bytes": 403,
+ "sha256": "094cab67f34b64902942c10a35bbcd0f760886d862588a0816d6ceb57bacf51b"
+ },
+ "project.arcadia": {
+ "bytes": 4906,
+ "sha256": "961d99c287dd7728c8ece8b20ca1a7965ac2d0581b3eaedf11a2b243975b0ea8"
+ },
+ "rationale.arcadia": {
+ "bytes": 57,
+ "sha256": "c01867c9dc0d40726853119fac3c6ad24a40d8d362a93a8b9d20df04ec2e273f"
+ },
+ "sa/participants.arcadia": {
+ "bytes": 124,
+ "sha256": "fb975b83d3ec164c38936bf27fe7d2021cc46805574902a534744b040f7d3ae8"
+ },
+ "traceability.arcadia": {
+ "bytes": 395,
+ "sha256": "f778acaaa85de0940cedcd9514cd803032a11e782d859454203235febb73e5f0"
+ }
+ }
+ },
+ "process-undo": {
+ "path": ".local/native-qa/behavior-20260911-v4/checkpoint-process-undo",
+ "files": {
+ "oa/activities/activity_assess_incident.arcadia": {
+ "bytes": 376,
+ "sha256": "ae41d7c20b062b39c2edab7fb890a3d88a9ce18fd8d03018ef2d6f95eeff62e8"
+ },
+ "oa/behavior/process_coordinate_rescue.arcadia": {
+ "bytes": 149,
+ "sha256": "8f393d1cee5e7eed5e41af14539b1fe7ae1c7300dd9383ca0ef1ee17254b6253"
+ },
+ "oa/participants.arcadia": {
+ "bytes": 403,
+ "sha256": "094cab67f34b64902942c10a35bbcd0f760886d862588a0816d6ceb57bacf51b"
+ },
+ "project.arcadia": {
+ "bytes": 4844,
+ "sha256": "b35a3f63f223cc4fe2760d6308e87b016ed1eadfbef0a3a4bd051b52c9080958"
+ },
+ "rationale.arcadia": {
+ "bytes": 57,
+ "sha256": "c01867c9dc0d40726853119fac3c6ad24a40d8d362a93a8b9d20df04ec2e273f"
+ },
+ "sa/participants.arcadia": {
+ "bytes": 124,
+ "sha256": "fb975b83d3ec164c38936bf27fe7d2021cc46805574902a534744b040f7d3ae8"
+ },
+ "traceability.arcadia": {
+ "bytes": 395,
+ "sha256": "f778acaaa85de0940cedcd9514cd803032a11e782d859454203235febb73e5f0"
+ }
+ }
+ },
+ "process-redo": {
+ "path": ".local/native-qa/behavior-20260911-v4/checkpoint-process-redo",
+ "files": {
+ "oa/activities/activity_assess_incident.arcadia": {
+ "bytes": 376,
+ "sha256": "ae41d7c20b062b39c2edab7fb890a3d88a9ce18fd8d03018ef2d6f95eeff62e8"
+ },
+ "oa/behavior/process_coordinate_rescue.arcadia": {
+ "bytes": 149,
+ "sha256": "8f393d1cee5e7eed5e41af14539b1fe7ae1c7300dd9383ca0ef1ee17254b6253"
+ },
+ "oa/participants.arcadia": {
+ "bytes": 403,
+ "sha256": "094cab67f34b64902942c10a35bbcd0f760886d862588a0816d6ceb57bacf51b"
+ },
+ "project.arcadia": {
+ "bytes": 4906,
+ "sha256": "961d99c287dd7728c8ece8b20ca1a7965ac2d0581b3eaedf11a2b243975b0ea8"
+ },
+ "rationale.arcadia": {
+ "bytes": 57,
+ "sha256": "c01867c9dc0d40726853119fac3c6ad24a40d8d362a93a8b9d20df04ec2e273f"
+ },
+ "sa/participants.arcadia": {
+ "bytes": 124,
+ "sha256": "fb975b83d3ec164c38936bf27fe7d2021cc46805574902a534744b040f7d3ae8"
+ },
+ "traceability.arcadia": {
+ "bytes": 395,
+ "sha256": "f778acaaa85de0940cedcd9514cd803032a11e782d859454203235febb73e5f0"
+ }
+ }
+ },
+ "scenario": {
+ "path": ".local/native-qa/behavior-20260911-v4/checkpoint-scenario",
+ "files": {
+ "oa/activities/activity_assess_incident.arcadia": {
+ "bytes": 376,
+ "sha256": "ae41d7c20b062b39c2edab7fb890a3d88a9ce18fd8d03018ef2d6f95eeff62e8"
+ },
+ "oa/behavior/process_coordinate_rescue.arcadia": {
+ "bytes": 149,
+ "sha256": "8f393d1cee5e7eed5e41af14539b1fe7ae1c7300dd9383ca0ef1ee17254b6253"
+ },
+ "oa/behavior/scenario_rescue_coordination_conversation.arcadia": {
+ "bytes": 284,
+ "sha256": "8eed98446dfb4f4dbd5261f550ce8cae1a21d638975d91b32baaf6f309daba98"
+ },
+ "oa/participants.arcadia": {
+ "bytes": 403,
+ "sha256": "094cab67f34b64902942c10a35bbcd0f760886d862588a0816d6ceb57bacf51b"
+ },
+ "project.arcadia": {
+ "bytes": 4984,
+ "sha256": "1fa6dd826fd53ccdf3c93cfdcdd657487e344313d76dabe0c438e08128851ee6"
+ },
+ "rationale.arcadia": {
+ "bytes": 57,
+ "sha256": "c01867c9dc0d40726853119fac3c6ad24a40d8d362a93a8b9d20df04ec2e273f"
+ },
+ "sa/participants.arcadia": {
+ "bytes": 124,
+ "sha256": "fb975b83d3ec164c38936bf27fe7d2021cc46805574902a534744b040f7d3ae8"
+ },
+ "traceability.arcadia": {
+ "bytes": 395,
+ "sha256": "f778acaaa85de0940cedcd9514cd803032a11e782d859454203235febb73e5f0"
+ }
+ }
+ },
+ "scenario-undo": {
+ "path": ".local/native-qa/behavior-20260911-v4/checkpoint-scenario-undo",
+ "files": {
+ "oa/activities/activity_assess_incident.arcadia": {
+ "bytes": 376,
+ "sha256": "ae41d7c20b062b39c2edab7fb890a3d88a9ce18fd8d03018ef2d6f95eeff62e8"
+ },
+ "oa/behavior/process_coordinate_rescue.arcadia": {
+ "bytes": 149,
+ "sha256": "8f393d1cee5e7eed5e41af14539b1fe7ae1c7300dd9383ca0ef1ee17254b6253"
+ },
+ "oa/behavior/scenario_rescue_coordination_conversation.arcadia": {
+ "bytes": 284,
+ "sha256": "8eed98446dfb4f4dbd5261f550ce8cae1a21d638975d91b32baaf6f309daba98"
+ },
+ "oa/participants.arcadia": {
+ "bytes": 403,
+ "sha256": "094cab67f34b64902942c10a35bbcd0f760886d862588a0816d6ceb57bacf51b"
+ },
+ "project.arcadia": {
+ "bytes": 4906,
+ "sha256": "961d99c287dd7728c8ece8b20ca1a7965ac2d0581b3eaedf11a2b243975b0ea8"
+ },
+ "rationale.arcadia": {
+ "bytes": 57,
+ "sha256": "c01867c9dc0d40726853119fac3c6ad24a40d8d362a93a8b9d20df04ec2e273f"
+ },
+ "sa/participants.arcadia": {
+ "bytes": 124,
+ "sha256": "fb975b83d3ec164c38936bf27fe7d2021cc46805574902a534744b040f7d3ae8"
+ },
+ "traceability.arcadia": {
+ "bytes": 395,
+ "sha256": "f778acaaa85de0940cedcd9514cd803032a11e782d859454203235febb73e5f0"
+ }
+ }
+ },
+ "scenario-redo": {
+ "path": ".local/native-qa/behavior-20260911-v4/checkpoint-scenario-redo",
+ "files": {
+ "oa/activities/activity_assess_incident.arcadia": {
+ "bytes": 376,
+ "sha256": "ae41d7c20b062b39c2edab7fb890a3d88a9ce18fd8d03018ef2d6f95eeff62e8"
+ },
+ "oa/behavior/process_coordinate_rescue.arcadia": {
+ "bytes": 149,
+ "sha256": "8f393d1cee5e7eed5e41af14539b1fe7ae1c7300dd9383ca0ef1ee17254b6253"
+ },
+ "oa/behavior/scenario_rescue_coordination_conversation.arcadia": {
+ "bytes": 284,
+ "sha256": "8eed98446dfb4f4dbd5261f550ce8cae1a21d638975d91b32baaf6f309daba98"
+ },
+ "oa/participants.arcadia": {
+ "bytes": 403,
+ "sha256": "094cab67f34b64902942c10a35bbcd0f760886d862588a0816d6ceb57bacf51b"
+ },
+ "project.arcadia": {
+ "bytes": 4984,
+ "sha256": "1fa6dd826fd53ccdf3c93cfdcdd657487e344313d76dabe0c438e08128851ee6"
+ },
+ "rationale.arcadia": {
+ "bytes": 57,
+ "sha256": "c01867c9dc0d40726853119fac3c6ad24a40d8d362a93a8b9d20df04ec2e273f"
+ },
+ "sa/participants.arcadia": {
+ "bytes": 124,
+ "sha256": "fb975b83d3ec164c38936bf27fe7d2021cc46805574902a534744b040f7d3ae8"
+ },
+ "traceability.arcadia": {
+ "bytes": 395,
+ "sha256": "f778acaaa85de0940cedcd9514cd803032a11e782d859454203235febb73e5f0"
+ }
+ }
+ },
+ "machine": {
+ "path": ".local/native-qa/behavior-20260911-v4/checkpoint-machine",
+ "files": {
+ "oa/activities/activity_assess_incident.arcadia": {
+ "bytes": 376,
+ "sha256": "ae41d7c20b062b39c2edab7fb890a3d88a9ce18fd8d03018ef2d6f95eeff62e8"
+ },
+ "oa/behavior/process_coordinate_rescue.arcadia": {
+ "bytes": 149,
+ "sha256": "8f393d1cee5e7eed5e41af14539b1fe7ae1c7300dd9383ca0ef1ee17254b6253"
+ },
+ "oa/behavior/scenario_rescue_coordination_conversation.arcadia": {
+ "bytes": 284,
+ "sha256": "8eed98446dfb4f4dbd5261f550ce8cae1a21d638975d91b32baaf6f309daba98"
+ },
+ "oa/participants.arcadia": {
+ "bytes": 403,
+ "sha256": "094cab67f34b64902942c10a35bbcd0f760886d862588a0816d6ceb57bacf51b"
+ },
+ "project.arcadia": {
+ "bytes": 5057,
+ "sha256": "59b61b321b0cf4817c1ff9276fa59deafc09518765e761a2ebd9e5602afab9cb"
+ },
+ "rationale.arcadia": {
+ "bytes": 57,
+ "sha256": "c01867c9dc0d40726853119fac3c6ad24a40d8d362a93a8b9d20df04ec2e273f"
+ },
+ "sa/participants.arcadia": {
+ "bytes": 285,
+ "sha256": "9b77b88f66e4e80540ae33b83f1af1f3edcd37dafb98c33a861d4c34c66d2559"
+ },
+ "traceability.arcadia": {
+ "bytes": 395,
+ "sha256": "f778acaaa85de0940cedcd9514cd803032a11e782d859454203235febb73e5f0"
+ },
+ "views/diagram_rescue_team_operating_modes_states.arcadia": {
+ "bytes": 842,
+ "sha256": "498eab80da7ac4523883622a0d008b9033a1305e5bb5f168b8e9d4c41dde62de"
+ }
+ }
+ },
+ "machine-undo": {
+ "path": ".local/native-qa/behavior-20260911-v4/checkpoint-machine-undo",
+ "files": {
+ "oa/activities/activity_assess_incident.arcadia": {
+ "bytes": 376,
+ "sha256": "ae41d7c20b062b39c2edab7fb890a3d88a9ce18fd8d03018ef2d6f95eeff62e8"
+ },
+ "oa/behavior/process_coordinate_rescue.arcadia": {
+ "bytes": 149,
+ "sha256": "8f393d1cee5e7eed5e41af14539b1fe7ae1c7300dd9383ca0ef1ee17254b6253"
+ },
+ "oa/behavior/scenario_rescue_coordination_conversation.arcadia": {
+ "bytes": 284,
+ "sha256": "8eed98446dfb4f4dbd5261f550ce8cae1a21d638975d91b32baaf6f309daba98"
+ },
+ "oa/participants.arcadia": {
+ "bytes": 403,
+ "sha256": "094cab67f34b64902942c10a35bbcd0f760886d862588a0816d6ceb57bacf51b"
+ },
+ "project.arcadia": {
+ "bytes": 4984,
+ "sha256": "1fa6dd826fd53ccdf3c93cfdcdd657487e344313d76dabe0c438e08128851ee6"
+ },
+ "rationale.arcadia": {
+ "bytes": 57,
+ "sha256": "c01867c9dc0d40726853119fac3c6ad24a40d8d362a93a8b9d20df04ec2e273f"
+ },
+ "sa/participants.arcadia": {
+ "bytes": 124,
+ "sha256": "fb975b83d3ec164c38936bf27fe7d2021cc46805574902a534744b040f7d3ae8"
+ },
+ "traceability.arcadia": {
+ "bytes": 395,
+ "sha256": "f778acaaa85de0940cedcd9514cd803032a11e782d859454203235febb73e5f0"
+ },
+ "views/diagram_rescue_team_operating_modes_states.arcadia": {
+ "bytes": 842,
+ "sha256": "498eab80da7ac4523883622a0d008b9033a1305e5bb5f168b8e9d4c41dde62de"
+ }
+ }
+ },
+ "machine-redo": {
+ "path": ".local/native-qa/behavior-20260911-v4/checkpoint-machine-redo",
+ "files": {
+ "oa/activities/activity_assess_incident.arcadia": {
+ "bytes": 376,
+ "sha256": "ae41d7c20b062b39c2edab7fb890a3d88a9ce18fd8d03018ef2d6f95eeff62e8"
+ },
+ "oa/behavior/process_coordinate_rescue.arcadia": {
+ "bytes": 149,
+ "sha256": "8f393d1cee5e7eed5e41af14539b1fe7ae1c7300dd9383ca0ef1ee17254b6253"
+ },
+ "oa/behavior/scenario_rescue_coordination_conversation.arcadia": {
+ "bytes": 284,
+ "sha256": "8eed98446dfb4f4dbd5261f550ce8cae1a21d638975d91b32baaf6f309daba98"
+ },
+ "oa/participants.arcadia": {
+ "bytes": 403,
+ "sha256": "094cab67f34b64902942c10a35bbcd0f760886d862588a0816d6ceb57bacf51b"
+ },
+ "project.arcadia": {
+ "bytes": 5057,
+ "sha256": "59b61b321b0cf4817c1ff9276fa59deafc09518765e761a2ebd9e5602afab9cb"
+ },
+ "rationale.arcadia": {
+ "bytes": 57,
+ "sha256": "c01867c9dc0d40726853119fac3c6ad24a40d8d362a93a8b9d20df04ec2e273f"
+ },
+ "sa/participants.arcadia": {
+ "bytes": 285,
+ "sha256": "9b77b88f66e4e80540ae33b83f1af1f3edcd37dafb98c33a861d4c34c66d2559"
+ },
+ "traceability.arcadia": {
+ "bytes": 395,
+ "sha256": "f778acaaa85de0940cedcd9514cd803032a11e782d859454203235febb73e5f0"
+ },
+ "views/diagram_rescue_team_operating_modes_states.arcadia": {
+ "bytes": 842,
+ "sha256": "498eab80da7ac4523883622a0d008b9033a1305e5bb5f168b8e9d4c41dde62de"
+ }
+ }
+ },
+ "creation-reopen": {
+ "path": ".local/native-qa/behavior-20260911-v4/checkpoint-creation-reopen",
+ "files": {
+ "oa/activities/activity_assess_incident.arcadia": {
+ "bytes": 376,
+ "sha256": "ae41d7c20b062b39c2edab7fb890a3d88a9ce18fd8d03018ef2d6f95eeff62e8"
+ },
+ "oa/behavior/process_coordinate_rescue.arcadia": {
+ "bytes": 149,
+ "sha256": "8f393d1cee5e7eed5e41af14539b1fe7ae1c7300dd9383ca0ef1ee17254b6253"
+ },
+ "oa/behavior/scenario_rescue_coordination_conversation.arcadia": {
+ "bytes": 284,
+ "sha256": "8eed98446dfb4f4dbd5261f550ce8cae1a21d638975d91b32baaf6f309daba98"
+ },
+ "oa/participants.arcadia": {
+ "bytes": 403,
+ "sha256": "094cab67f34b64902942c10a35bbcd0f760886d862588a0816d6ceb57bacf51b"
+ },
+ "project.arcadia": {
+ "bytes": 5057,
+ "sha256": "59b61b321b0cf4817c1ff9276fa59deafc09518765e761a2ebd9e5602afab9cb"
+ },
+ "rationale.arcadia": {
+ "bytes": 57,
+ "sha256": "c01867c9dc0d40726853119fac3c6ad24a40d8d362a93a8b9d20df04ec2e273f"
+ },
+ "sa/participants.arcadia": {
+ "bytes": 285,
+ "sha256": "9b77b88f66e4e80540ae33b83f1af1f3edcd37dafb98c33a861d4c34c66d2559"
+ },
+ "traceability.arcadia": {
+ "bytes": 395,
+ "sha256": "f778acaaa85de0940cedcd9514cd803032a11e782d859454203235febb73e5f0"
+ },
+ "views/diagram_rescue_team_operating_modes_states.arcadia": {
+ "bytes": 842,
+ "sha256": "498eab80da7ac4523883622a0d008b9033a1305e5bb5f168b8e9d4c41dde62de"
+ }
+ }
+ }
+ },
+ "commands": [
+ {
+ "label": "self-check",
+ "command_argv": [
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\behavior-creation-oracle-20260911\\behavior-creation-contract-v2.exe",
+ "self-check",
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\palette-20260910-v3\\checkpoint-transition-reopen\\project.arcadia"
+ ],
+ "exit_code": 0,
+ "elapsed_seconds": 0.967588,
+ "stdout": "PASS self-check Process: full source fixed point; false metadata, unrelated edits and source-only drift rejected\nPASS self-check Scenario: full source fixed point; false metadata, unrelated edits and source-only drift rejected\nPREDICT first view: Rescue team operating modes \u00b7 states; machine-root position Position { x: 60.0, y: 60.0 }, size Size { width: 336.0, height: 104.0 }; 9 exact source files\nPASS self-check Machine: full source fixed point; false metadata, unrelated edits and source-only drift rejected\nPASS explicit Undo disk contract: known detached retention accepted; unknown, changed, missing and reachable drift rejected\nPASS baseline retained unchanged; no native acceptance claimed\n",
+ "stderr": ""
+ },
+ {
+ "label": "baseline",
+ "command_argv": [
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\behavior-creation-oracle-20260911\\behavior-creation-contract-v2.exe",
+ "check",
+ "baseline",
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\palette-20260910-v3\\checkpoint-transition-reopen\\project.arcadia",
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\palette-20260910-v3\\checkpoint-transition-reopen\\project.arcadia",
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\palette-20260910-v3\\checkpoint-transition-reopen\\project.arcadia"
+ ],
+ "exit_code": 0,
+ "elapsed_seconds": 0.119426,
+ "stdout": "PASS Baseline: complete Project + 6 exact source files; only fresh literal-role UUIDs borrowed\n",
+ "stderr": ""
+ },
+ {
+ "label": "process",
+ "command_argv": [
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\behavior-creation-oracle-20260911\\behavior-creation-contract-v2.exe",
+ "check",
+ "process",
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\palette-20260910-v3\\checkpoint-transition-reopen\\project.arcadia",
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\behavior-20260911-v4\\checkpoint-process\\project.arcadia",
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\behavior-20260911-v4\\checkpoint-process\\project.arcadia"
+ ],
+ "exit_code": 0,
+ "elapsed_seconds": 0.163785,
+ "stdout": "PASS Process: complete Project + 7 exact source files; only fresh literal-role UUIDs borrowed\n",
+ "stderr": ""
+ },
+ {
+ "label": "process-undo",
+ "command_argv": [
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\behavior-creation-oracle-20260911\\behavior-creation-contract-v2.exe",
+ "same",
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\palette-20260910-v3\\checkpoint-transition-reopen\\project.arcadia",
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\behavior-20260911-v4\\checkpoint-process-undo\\project.arcadia",
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\behavior-20260911-v4\\checkpoint-process\\project.arcadia"
+ ],
+ "exit_code": 0,
+ "elapsed_seconds": 0.155607,
+ "stdout": "PASS exact checkpoint identity/model/6-file SourceBundle equality; 7 exact disk files (1 known retained)\n",
+ "stderr": ""
+ },
+ {
+ "label": "process-redo",
+ "command_argv": [
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\behavior-creation-oracle-20260911\\behavior-creation-contract-v2.exe",
+ "check",
+ "process",
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\palette-20260910-v3\\checkpoint-transition-reopen\\project.arcadia",
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\behavior-20260911-v4\\checkpoint-process-redo\\project.arcadia",
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\behavior-20260911-v4\\checkpoint-process\\project.arcadia"
+ ],
+ "exit_code": 0,
+ "elapsed_seconds": 0.187937,
+ "stdout": "PASS Process: complete Project + 7 exact source files; only fresh literal-role UUIDs borrowed\n",
+ "stderr": ""
+ },
+ {
+ "label": "scenario",
+ "command_argv": [
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\behavior-creation-oracle-20260911\\behavior-creation-contract-v2.exe",
+ "check",
+ "scenario",
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\palette-20260910-v3\\checkpoint-transition-reopen\\project.arcadia",
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\behavior-20260911-v4\\checkpoint-scenario\\project.arcadia",
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\behavior-20260911-v4\\checkpoint-scenario\\project.arcadia"
+ ],
+ "exit_code": 0,
+ "elapsed_seconds": 0.253057,
+ "stdout": "PASS Scenario: complete Project + 8 exact source files; only fresh literal-role UUIDs borrowed\n",
+ "stderr": ""
+ },
+ {
+ "label": "scenario-undo",
+ "command_argv": [
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\behavior-creation-oracle-20260911\\behavior-creation-contract-v2.exe",
+ "same",
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\behavior-20260911-v4\\checkpoint-process\\project.arcadia",
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\behavior-20260911-v4\\checkpoint-scenario-undo\\project.arcadia",
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\behavior-20260911-v4\\checkpoint-scenario\\project.arcadia"
+ ],
+ "exit_code": 0,
+ "elapsed_seconds": 0.160712,
+ "stdout": "PASS exact checkpoint identity/model/7-file SourceBundle equality; 8 exact disk files (1 known retained)\n",
+ "stderr": ""
+ },
+ {
+ "label": "scenario-redo",
+ "command_argv": [
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\behavior-creation-oracle-20260911\\behavior-creation-contract-v2.exe",
+ "check",
+ "scenario",
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\palette-20260910-v3\\checkpoint-transition-reopen\\project.arcadia",
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\behavior-20260911-v4\\checkpoint-scenario-redo\\project.arcadia",
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\behavior-20260911-v4\\checkpoint-scenario\\project.arcadia"
+ ],
+ "exit_code": 0,
+ "elapsed_seconds": 0.222,
+ "stdout": "PASS Scenario: complete Project + 8 exact source files; only fresh literal-role UUIDs borrowed\n",
+ "stderr": ""
+ },
+ {
+ "label": "machine",
+ "command_argv": [
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\behavior-creation-oracle-20260911\\behavior-creation-contract-v2.exe",
+ "check",
+ "machine",
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\palette-20260910-v3\\checkpoint-transition-reopen\\project.arcadia",
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\behavior-20260911-v4\\checkpoint-machine\\project.arcadia",
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\behavior-20260911-v4\\checkpoint-machine\\project.arcadia"
+ ],
+ "exit_code": 0,
+ "elapsed_seconds": 0.266748,
+ "stdout": "PASS Machine: complete Project + 9 exact source files; only fresh literal-role UUIDs borrowed\n",
+ "stderr": ""
+ },
+ {
+ "label": "machine-undo",
+ "command_argv": [
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\behavior-creation-oracle-20260911\\behavior-creation-contract-v2.exe",
+ "same",
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\behavior-20260911-v4\\checkpoint-scenario\\project.arcadia",
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\behavior-20260911-v4\\checkpoint-machine-undo\\project.arcadia",
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\behavior-20260911-v4\\checkpoint-machine\\project.arcadia"
+ ],
+ "exit_code": 0,
+ "elapsed_seconds": 0.122982,
+ "stdout": "PASS exact checkpoint identity/model/8-file SourceBundle equality; 9 exact disk files (1 known retained)\n",
+ "stderr": ""
+ },
+ {
+ "label": "machine-redo",
+ "command_argv": [
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\behavior-creation-oracle-20260911\\behavior-creation-contract-v2.exe",
+ "check",
+ "machine",
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\palette-20260910-v3\\checkpoint-transition-reopen\\project.arcadia",
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\behavior-20260911-v4\\checkpoint-machine-redo\\project.arcadia",
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\behavior-20260911-v4\\checkpoint-machine\\project.arcadia"
+ ],
+ "exit_code": 0,
+ "elapsed_seconds": 0.229706,
+ "stdout": "PASS Machine: complete Project + 9 exact source files; only fresh literal-role UUIDs borrowed\n",
+ "stderr": ""
+ },
+ {
+ "label": "reopen-contract",
+ "command_argv": [
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\behavior-creation-oracle-20260911\\behavior-creation-contract-v2.exe",
+ "check",
+ "machine",
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\palette-20260910-v3\\checkpoint-transition-reopen\\project.arcadia",
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\behavior-20260911-v4\\checkpoint-creation-reopen\\project.arcadia",
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\behavior-20260911-v4\\checkpoint-machine\\project.arcadia"
+ ],
+ "exit_code": 0,
+ "elapsed_seconds": 0.192465,
+ "stdout": "PASS Machine: complete Project + 9 exact source files; only fresh literal-role UUIDs borrowed\n",
+ "stderr": ""
+ },
+ {
+ "label": "reopen-exact-redo",
+ "command_argv": [
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\behavior-creation-oracle-20260911\\behavior-creation-contract-v2.exe",
+ "same",
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\behavior-20260911-v4\\checkpoint-machine-redo\\project.arcadia",
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\behavior-20260911-v4\\checkpoint-creation-reopen\\project.arcadia"
+ ],
+ "exit_code": 0,
+ "elapsed_seconds": 0.131742,
+ "stdout": "PASS exact checkpoint identity/model/9-file SourceBundle equality; 9 exact disk files (0 known retained)\n",
+ "stderr": ""
+ }
+ ],
+ "all_checkpoint_files_unchanged": true,
+ "machine_redo_reopen_inventory_equal": true,
+ "machine_redo_reopen_direct_byte_comparisons": {
+ "oa/activities/activity_assess_incident.arcadia": true,
+ "oa/behavior/process_coordinate_rescue.arcadia": true,
+ "oa/behavior/scenario_rescue_coordination_conversation.arcadia": true,
+ "oa/participants.arcadia": true,
+ "project.arcadia": true,
+ "rationale.arcadia": true,
+ "sa/participants.arcadia": true,
+ "traceability.arcadia": true,
+ "views/diagram_rescue_team_operating_modes_states.arcadia": true
+ },
+ "log": {
+ "path": "harness/experiments/behavior-creation-native-20260911/commands-results.log",
+ "bytes": 9392,
+ "sha256": "f5bfbee185f7064419b1bd9fe33ec6a48526b5bbe3f818c006feb74eddf8e189"
+ },
+ "pass": true
+}
diff --git a/harness/experiments/behavior-creation-native-20260911/recovery-manifest.json b/harness/experiments/behavior-creation-native-20260911/recovery-manifest.json
new file mode 100644
index 00000000..febbe73c
--- /dev/null
+++ b/harness/experiments/behavior-creation-native-20260911/recovery-manifest.json
@@ -0,0 +1,200 @@
+{
+ "reviewer": "Codex-9e8r6t /root/palette_finish",
+ "started_utc": "2026-09-11T09:22:33.387447+00:00",
+ "finished_utc": "2026-09-11T09:22:34.502189+00:00",
+ "scope": "Immutable evidence only; native observations supplied separately by root. No live work/profile/UI/Cargo access; no persisted Undo claim.",
+ "artifacts": [
+ {
+ "path": "harness/experiments/behavior-creation-native-20260911/verify-recovery.py",
+ "bytes": 5560,
+ "sha256": "3546b4fe68d3e1a2474015be1b652a665af238e5fcf63e04bac3f25df3d35e90"
+ },
+ {
+ "path": "harness/experiments/behavior-creation-native-20260911/manifest.json",
+ "bytes": 30406,
+ "sha256": "356dfbb27dec04764a4b3f2372602f39953b472baac0a3de3e72acd9c1d76b8a"
+ },
+ {
+ "path": ".local/behavior-creation-oracle-20260911/behavior-creation-contract-v2.exe",
+ "bytes": 20757504,
+ "sha256": "056eefd444924916bf6ac3c4897ab2ff4a8a4bb892e1dbc16adad32e59bf6a36"
+ },
+ {
+ "path": ".local/native-qa/behavior-20260911-v4/recovery-evidence/before-interruption.json",
+ "bytes": 27382,
+ "sha256": "0c355aa3c7b9be623d767ff35c4b85cf7b2907eb9bc3be39d619aa610c989692"
+ },
+ {
+ "path": ".local/native-qa/behavior-20260911-v4/recovery-evidence/after-recovery-and-typing.json",
+ "bytes": 27263,
+ "sha256": "fafa7a884275bac09afab365f8ab0063f998ca56c5ffc70be596db6f78a10103"
+ },
+ {
+ "path": ".local/native-qa/behavior-20260911-v4/recovery-evidence/restored-draft.png",
+ "bytes": 113820,
+ "sha256": "8ae0fe8957d5a935b6e2605a6ffb68934bd0e8840f3594c43e63865ab89d03c9"
+ },
+ {
+ "path": ".local/native-qa/behavior-20260911-v4/recovery-launch.json",
+ "bytes": 812,
+ "sha256": "641ff05ea50d551a51e642f728650cf254dbf131cfb2f585865db436a8877396"
+ },
+ {
+ "path": ".local/native-qa/behavior-20260911-v4/bin/arcadia-studio.exe",
+ "bytes": 111163904,
+ "sha256": "d4d9c2bd937e301ff1009d7cb93a34ee5aa6dfc837ff7e87d468c85371b20c31"
+ }
+ ],
+ "input_file_inventories": {
+ ".local\\native-qa\\behavior-20260911-v4\\checkpoint-creation-reopen": {
+ "oa/activities/activity_assess_incident.arcadia": {
+ "path": ".local/native-qa/behavior-20260911-v4/checkpoint-creation-reopen/oa/activities/activity_assess_incident.arcadia",
+ "bytes": 376,
+ "sha256": "ae41d7c20b062b39c2edab7fb890a3d88a9ce18fd8d03018ef2d6f95eeff62e8"
+ },
+ "oa/behavior/process_coordinate_rescue.arcadia": {
+ "path": ".local/native-qa/behavior-20260911-v4/checkpoint-creation-reopen/oa/behavior/process_coordinate_rescue.arcadia",
+ "bytes": 149,
+ "sha256": "8f393d1cee5e7eed5e41af14539b1fe7ae1c7300dd9383ca0ef1ee17254b6253"
+ },
+ "oa/behavior/scenario_rescue_coordination_conversation.arcadia": {
+ "path": ".local/native-qa/behavior-20260911-v4/checkpoint-creation-reopen/oa/behavior/scenario_rescue_coordination_conversation.arcadia",
+ "bytes": 284,
+ "sha256": "8eed98446dfb4f4dbd5261f550ce8cae1a21d638975d91b32baaf6f309daba98"
+ },
+ "oa/participants.arcadia": {
+ "path": ".local/native-qa/behavior-20260911-v4/checkpoint-creation-reopen/oa/participants.arcadia",
+ "bytes": 403,
+ "sha256": "094cab67f34b64902942c10a35bbcd0f760886d862588a0816d6ceb57bacf51b"
+ },
+ "project.arcadia": {
+ "path": ".local/native-qa/behavior-20260911-v4/checkpoint-creation-reopen/project.arcadia",
+ "bytes": 5057,
+ "sha256": "59b61b321b0cf4817c1ff9276fa59deafc09518765e761a2ebd9e5602afab9cb"
+ },
+ "rationale.arcadia": {
+ "path": ".local/native-qa/behavior-20260911-v4/checkpoint-creation-reopen/rationale.arcadia",
+ "bytes": 57,
+ "sha256": "c01867c9dc0d40726853119fac3c6ad24a40d8d362a93a8b9d20df04ec2e273f"
+ },
+ "sa/participants.arcadia": {
+ "path": ".local/native-qa/behavior-20260911-v4/checkpoint-creation-reopen/sa/participants.arcadia",
+ "bytes": 285,
+ "sha256": "9b77b88f66e4e80540ae33b83f1af1f3edcd37dafb98c33a861d4c34c66d2559"
+ },
+ "traceability.arcadia": {
+ "path": ".local/native-qa/behavior-20260911-v4/checkpoint-creation-reopen/traceability.arcadia",
+ "bytes": 395,
+ "sha256": "f778acaaa85de0940cedcd9514cd803032a11e782d859454203235febb73e5f0"
+ },
+ "views/diagram_rescue_team_operating_modes_states.arcadia": {
+ "path": ".local/native-qa/behavior-20260911-v4/checkpoint-creation-reopen/views/diagram_rescue_team_operating_modes_states.arcadia",
+ "bytes": 842,
+ "sha256": "498eab80da7ac4523883622a0d008b9033a1305e5bb5f168b8e9d4c41dde62de"
+ }
+ },
+ ".local\\native-qa\\behavior-20260911-v4\\checkpoint-recovery-cancel": {
+ "oa/activities/activity_assess_incident.arcadia": {
+ "path": ".local/native-qa/behavior-20260911-v4/checkpoint-recovery-cancel/oa/activities/activity_assess_incident.arcadia",
+ "bytes": 376,
+ "sha256": "ae41d7c20b062b39c2edab7fb890a3d88a9ce18fd8d03018ef2d6f95eeff62e8"
+ },
+ "oa/behavior/process_coordinate_rescue.arcadia": {
+ "path": ".local/native-qa/behavior-20260911-v4/checkpoint-recovery-cancel/oa/behavior/process_coordinate_rescue.arcadia",
+ "bytes": 149,
+ "sha256": "8f393d1cee5e7eed5e41af14539b1fe7ae1c7300dd9383ca0ef1ee17254b6253"
+ },
+ "oa/behavior/scenario_rescue_coordination_conversation.arcadia": {
+ "path": ".local/native-qa/behavior-20260911-v4/checkpoint-recovery-cancel/oa/behavior/scenario_rescue_coordination_conversation.arcadia",
+ "bytes": 284,
+ "sha256": "8eed98446dfb4f4dbd5261f550ce8cae1a21d638975d91b32baaf6f309daba98"
+ },
+ "oa/participants.arcadia": {
+ "path": ".local/native-qa/behavior-20260911-v4/checkpoint-recovery-cancel/oa/participants.arcadia",
+ "bytes": 403,
+ "sha256": "094cab67f34b64902942c10a35bbcd0f760886d862588a0816d6ceb57bacf51b"
+ },
+ "project.arcadia": {
+ "path": ".local/native-qa/behavior-20260911-v4/checkpoint-recovery-cancel/project.arcadia",
+ "bytes": 5057,
+ "sha256": "59b61b321b0cf4817c1ff9276fa59deafc09518765e761a2ebd9e5602afab9cb"
+ },
+ "rationale.arcadia": {
+ "path": ".local/native-qa/behavior-20260911-v4/checkpoint-recovery-cancel/rationale.arcadia",
+ "bytes": 57,
+ "sha256": "c01867c9dc0d40726853119fac3c6ad24a40d8d362a93a8b9d20df04ec2e273f"
+ },
+ "sa/participants.arcadia": {
+ "path": ".local/native-qa/behavior-20260911-v4/checkpoint-recovery-cancel/sa/participants.arcadia",
+ "bytes": 285,
+ "sha256": "9b77b88f66e4e80540ae33b83f1af1f3edcd37dafb98c33a861d4c34c66d2559"
+ },
+ "traceability.arcadia": {
+ "path": ".local/native-qa/behavior-20260911-v4/checkpoint-recovery-cancel/traceability.arcadia",
+ "bytes": 395,
+ "sha256": "f778acaaa85de0940cedcd9514cd803032a11e782d859454203235febb73e5f0"
+ },
+ "views/diagram_rescue_team_operating_modes_states.arcadia": {
+ "path": ".local/native-qa/behavior-20260911-v4/checkpoint-recovery-cancel/views/diagram_rescue_team_operating_modes_states.arcadia",
+ "bytes": 842,
+ "sha256": "498eab80da7ac4523883622a0d008b9033a1305e5bb5f168b8e9d4c41dde62de"
+ }
+ }
+ },
+ "checks": {
+ "literal_name_before": true,
+ "literal_name_after": true,
+ "sa_machine": true,
+ "selected_exact_system_actor": true,
+ "first_view_selected": true,
+ "complete_behavior_equal_except_deliberate_suffix": true,
+ "accepted_exact_json_equality": true,
+ "workspace_exact_json_equality": true,
+ "property_exact_json_equality": true,
+ "workflow_exact_json_equality": true,
+ "selected_exact_json_equality": true,
+ "reserved_ids_unchanged": true,
+ "complete_file_inventory_equal": true,
+ "complete_file_bytes_equal": true,
+ "accepted_snapshot_exactly_matches_saved_checkpoint": true,
+ "reserved_objects_not_committed": true,
+ "oracle_same_pass": true,
+ "input_files_unchanged": true,
+ "evidence_and_prior_manifest_unchanged": true
+ },
+ "reserved_ids": {
+ "element": "c6f559f5-401e-4e0d-af93-91faee68d3f5",
+ "diagram": "11ad8f0a-73aa-416a-bbeb-9b886bf39854",
+ "placement": "171f7d7e-3a8f-4200-86f6-a9e2efd87610"
+ },
+ "reopen_recovery_cancel_direct_byte_comparisons": {
+ "views/diagram_rescue_team_operating_modes_states.arcadia": true,
+ "traceability.arcadia": true,
+ "oa/activities/activity_assess_incident.arcadia": true,
+ "sa/participants.arcadia": true,
+ "rationale.arcadia": true,
+ "oa/behavior/process_coordinate_rescue.arcadia": true,
+ "project.arcadia": true,
+ "oa/participants.arcadia": true,
+ "oa/behavior/scenario_rescue_coordination_conversation.arcadia": true
+ },
+ "comparison_origin": "checkpoint-creation-reopen",
+ "command": {
+ "command_argv": [
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\behavior-creation-oracle-20260911\\behavior-creation-contract-v2.exe",
+ "same",
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\behavior-20260911-v4\\checkpoint-creation-reopen\\project.arcadia",
+ "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\native-qa\\behavior-20260911-v4\\checkpoint-recovery-cancel\\project.arcadia"
+ ],
+ "exit_code": 0,
+ "elapsed_seconds": 0.147209,
+ "stdout": "PASS exact checkpoint identity/model/9-file SourceBundle equality; 9 exact disk files (0 known retained)\n",
+ "stderr": ""
+ },
+ "log": {
+ "path": "harness/experiments/behavior-creation-native-20260911/recovery-commands-results.log",
+ "bytes": 641,
+ "sha256": "1dc3e89aa46660bfad796e7b6bf821bebd7e5bc5a7902a826021d461a3e74c68"
+ },
+ "pass": true
+}
diff --git a/harness/experiments/behavior-creation-native-20260911/verify-recovery.py b/harness/experiments/behavior-creation-native-20260911/verify-recovery.py
new file mode 100644
index 00000000..cecf34b9
--- /dev/null
+++ b/harness/experiments/behavior-creation-native-20260911/verify-recovery.py
@@ -0,0 +1,89 @@
+"""Verify immutable recovery evidence; never access live profile/work or UI."""
+from pathlib import Path
+import copy
+import datetime
+import hashlib
+import json
+import os
+import subprocess
+import time
+
+ROOT = Path(__file__).resolve().parents[3]
+OUT = Path(__file__).resolve().parent
+STAGE = ROOT / '.local/native-qa/behavior-20260911-v4'
+EVIDENCE = STAGE / 'recovery-evidence'
+EXPECTED = STAGE / 'checkpoint-creation-reopen'
+ACTUAL = STAGE / 'checkpoint-recovery-cancel'
+EXE = ROOT / '.local/behavior-creation-oracle-20260911/behavior-creation-contract-v2.exe'
+
+
+def record(path):
+ data = path.read_bytes()
+ return {'path': path.relative_to(ROOT).as_posix(), 'bytes': len(data),
+ 'sha256': hashlib.sha256(data).hexdigest()}
+
+
+def inventory(directory):
+ return {p.relative_to(directory).as_posix(): record(p)
+ for p in sorted(directory.rglob('*')) if p.is_file()}
+
+
+artifacts = [record(p) for p in (Path(__file__), OUT / 'manifest.json', EXE,
+ EVIDENCE / 'before-interruption.json', EVIDENCE / 'after-recovery-and-typing.json',
+ EVIDENCE / 'restored-draft.png', STAGE / 'recovery-launch.json', STAGE / 'bin/arcadia-studio.exe')]
+assert artifacts[1]['sha256'] == '356dfbb27dec04764a4b3f2372602f39953b472baac0a3de3e72acd9c1d76b8a'
+assert artifacts[2]['sha256'] == '056eefd444924916bf6ac3c4897ab2ff4a8a4bb892e1dbc16adad32e59bf6a36'
+before = json.loads((EVIDENCE / 'before-interruption.json').read_text(encoding='utf-8-sig'))
+after = json.loads((EVIDENCE / 'after-recovery-and-typing.json').read_text(encoding='utf-8-sig'))
+draft = before['behavior']['draft']
+expected_name = 'Recovery — secours Δ «operating modes»'
+checks = {'literal_name_before': draft['name'] == expected_name,
+ 'literal_name_after': after['behavior']['draft']['name'] == expected_name + ' · resumed',
+ 'sa_machine': draft['layer'] == 'Sa' and draft['family'] == 'Machine',
+ 'selected_exact_system_actor': draft['owner'] == 'c0629449-1209-4b50-afac-f558a9a0fc7f',
+ 'first_view_selected': draft['first_view'] is True}
+normalized = copy.deepcopy(after['behavior'])
+if checks['literal_name_after']:
+ normalized['draft']['name'] = expected_name
+checks['complete_behavior_equal_except_deliberate_suffix'] = normalized == before['behavior']
+for field in ('accepted', 'workspace', 'property', 'workflow', 'selected'):
+ checks[field + '_exact_json_equality'] = before[field] == after[field]
+reserved = {field: draft[field] for field in ('element', 'diagram', 'placement')}
+checks['reserved_ids_unchanged'] = all(after['behavior']['draft'][k] == v for k, v in reserved.items())
+inputs = {str(p.relative_to(ROOT)): inventory(p) for p in (EXPECTED, ACTUAL)}
+expected_names = set(inputs[str(EXPECTED.relative_to(ROOT))])
+actual_names = set(inputs[str(ACTUAL.relative_to(ROOT))])
+checks['complete_file_inventory_equal'] = expected_names == actual_names
+byte_results = {name: (EXPECTED / name).read_bytes() == (ACTUAL / name).read_bytes()
+ for name in expected_names if name in actual_names}
+checks['complete_file_bytes_equal'] = all(byte_results.values()) and len(byte_results) == len(expected_names)
+checks['accepted_snapshot_exactly_matches_saved_checkpoint'] = (
+ set(before['accepted']['files']) == expected_names and
+ all(text.encode('utf-8') == (EXPECTED / name).read_bytes()
+ for name, text in before['accepted']['files'].items()))
+checks['reserved_objects_not_committed'] = all(
+ all(value.encode('utf-8') not in (ACTUAL / name).read_bytes() for value in reserved.values())
+ for name in actual_names)
+command = [str(EXE), 'same', str(EXPECTED / 'project.arcadia'), str(ACTUAL / 'project.arcadia')]
+env = os.environ.copy()
+env['PATH'] = str(STAGE / 'bin') + os.pathsep + env.get('PATH', '')
+started = datetime.datetime.now(datetime.timezone.utc).isoformat()
+tick = time.perf_counter()
+run = subprocess.run(command, cwd=ROOT, env=env, capture_output=True, text=True, encoding='utf-8', errors='replace', timeout=60)
+elapsed = time.perf_counter() - tick
+checks['oracle_same_pass'] = run.returncode == 0
+checks['input_files_unchanged'] = inputs == {str(p.relative_to(ROOT)): inventory(p) for p in (EXPECTED, ACTUAL)}
+checks['evidence_and_prior_manifest_unchanged'] = artifacts == [record(ROOT / item['path']) for item in artifacts]
+result = {'command_argv': command, 'exit_code': run.returncode,
+ 'elapsed_seconds': round(elapsed, 6), 'stdout': run.stdout, 'stderr': run.stderr}
+(OUT / 'recovery-commands-results.log').write_text(json.dumps(result, indent=2) + '\n', encoding='utf-8', newline='\n')
+manifest = {'reviewer': 'Codex-9e8r6t /root/palette_finish', 'started_utc': started,
+ 'finished_utc': datetime.datetime.now(datetime.timezone.utc).isoformat(),
+ 'scope': 'Immutable evidence only; native observations supplied separately by root. No live work/profile/UI/Cargo access; no persisted Undo claim.',
+ 'artifacts': artifacts, 'input_file_inventories': inputs, 'checks': checks,
+ 'reserved_ids': reserved, 'reopen_recovery_cancel_direct_byte_comparisons': byte_results,
+ 'comparison_origin': 'checkpoint-creation-reopen', 'command': result,
+ 'log': record(OUT / 'recovery-commands-results.log'), 'pass': all(checks.values())}
+(OUT / 'recovery-manifest.json').write_text(json.dumps(manifest, indent=2) + '\n', encoding='utf-8', newline='\n')
+print(json.dumps({'pass': manifest['pass'], 'checks': checks, 'manifest': record(OUT / 'recovery-manifest.json')}))
+raise SystemExit(0 if manifest['pass'] else 1)
diff --git a/harness/experiments/behavior-creation-native-20260911/verify.py b/harness/experiments/behavior-creation-native-20260911/verify.py
new file mode 100644
index 00000000..1637b9a2
--- /dev/null
+++ b/harness/experiments/behavior-creation-native-20260911/verify.py
@@ -0,0 +1,93 @@
+"""Read only frozen checkpoints; run the existing v2 oracle without compiling."""
+from pathlib import Path
+import datetime
+import hashlib
+import json
+import os
+import subprocess
+import time
+
+ROOT = Path(__file__).resolve().parents[3]
+OUT = Path(__file__).resolve().parent
+STAGE = ROOT / '.local/native-qa/behavior-20260911-v4'
+BASE = ROOT / '.local/native-qa/palette-20260910-v3/checkpoint-transition-reopen'
+EXE = ROOT / '.local/behavior-creation-oracle-20260911/behavior-creation-contract-v2.exe'
+
+
+def record(path):
+ data = path.read_bytes()
+ return {'path': path.relative_to(ROOT).as_posix(), 'bytes': len(data),
+ 'sha256': hashlib.sha256(data).hexdigest()}
+
+
+def inventory(directory):
+ return {p.relative_to(directory).as_posix(): {
+ 'bytes': p.stat().st_size, 'sha256': hashlib.sha256(p.read_bytes()).hexdigest()
+ } for p in sorted(directory.rglob('*')) if p.is_file()}
+
+
+def entry(directory):
+ return str(directory / 'project.arcadia')
+
+
+checkpoints = {'baseline': BASE}
+for family in ('process', 'scenario', 'machine'):
+ for suffix in ('', '-undo', '-redo'):
+ checkpoints[family + suffix] = STAGE / ('checkpoint-' + family + suffix)
+checkpoints['creation-reopen'] = STAGE / 'checkpoint-creation-reopen'
+before = {name: inventory(path) for name, path in checkpoints.items()}
+artifacts = [record(p) for p in (
+ EXE, ROOT / 'harness/behavior-creation-contract.rs', Path(__file__),
+ STAGE / 'bin/arcadia-studio.exe', STAGE / 'bin/libunwind.dll',
+ STAGE / 'bin/manifest.json', STAGE / 'baseline-source-manifest.json',
+ STAGE / 'cancel-save-verification.json', STAGE / 'scenario-empty-saved.png',
+ STAGE / 'machine-created-saved.png')]
+assert artifacts[0]['sha256'] == '056eefd444924916bf6ac3c4897ab2ff4a8a4bb892e1dbc16adad32e59bf6a36'
+assert artifacts[1]['sha256'] == '51ab2ffa1826dd949b79f3a9690042a2f9e38daf9ed91517cade3861482117ba'
+commands = [('self-check', ['self-check', entry(BASE)]),
+ ('baseline', ['check', 'baseline', entry(BASE), entry(BASE), entry(BASE)])]
+previous = BASE
+for family in ('process', 'scenario', 'machine'):
+ first = checkpoints[family]
+ commands.extend([
+ (family, ['check', family, entry(BASE), entry(first), entry(first)]),
+ (family + '-undo', ['same', entry(previous), entry(checkpoints[family + '-undo']), entry(first)]),
+ (family + '-redo', ['check', family, entry(BASE), entry(checkpoints[family + '-redo']), entry(first)])])
+ previous = first
+commands.extend([
+ ('reopen-contract', ['check', 'machine', entry(BASE), entry(checkpoints['creation-reopen']), entry(checkpoints['machine'])]),
+ ('reopen-exact-redo', ['same', entry(checkpoints['machine-redo']), entry(checkpoints['creation-reopen'])])])
+env = os.environ.copy()
+env['PATH'] = str(STAGE / 'bin') + os.pathsep + env.get('PATH', '')
+started = datetime.datetime.now(datetime.timezone.utc).isoformat()
+results = []
+for label, args in commands:
+ t = time.perf_counter()
+ command = [str(EXE), *args]
+ run = subprocess.run(command, cwd=ROOT, env=env, capture_output=True, text=True, encoding='utf-8', errors='replace', timeout=60)
+ results.append({'label': label, 'command_argv': command, 'exit_code': run.returncode,
+ 'elapsed_seconds': round(time.perf_counter() - t, 6),
+ 'stdout': run.stdout, 'stderr': run.stderr})
+after = {name: inventory(path) for name, path in checkpoints.items()}
+redo_files = checkpoints['machine-redo']
+reopen_files = checkpoints['creation-reopen']
+same_names = set(before['machine-redo']) == set(before['creation-reopen'])
+byte_results = {name: (redo_files / name).read_bytes() == (reopen_files / name).read_bytes()
+ for name in before['machine-redo'] if (reopen_files / name).is_file()}
+success = (all(r['exit_code'] == 0 for r in results) and before == after
+ and same_names and all(byte_results.values()))
+log = '\n\n'.join(f"[{r['label']}] argv={json.dumps(r['command_argv'])}\nexit={r['exit_code']} elapsed={r['elapsed_seconds']}s\nstdout:\n{r['stdout']}stderr:\n{r['stderr']}" for r in results)
+(OUT / 'commands-results.log').write_text(log + '\n', encoding='utf-8', newline='\n')
+manifest = {'reviewer': 'Codex-9e8r6t /root/palette_finish', 'started_utc': started,
+ 'finished_utc': datetime.datetime.now(datetime.timezone.utc).isoformat(),
+ 'scope': 'Frozen checkpoints only; no live work/profile/UI access or compilation.',
+ 'artifacts': artifacts, 'checkpoints': {name: {'path': path.relative_to(ROOT).as_posix(), 'files': before[name]} for name, path in checkpoints.items()},
+ 'commands': results, 'all_checkpoint_files_unchanged': before == after,
+ 'machine_redo_reopen_inventory_equal': same_names,
+ 'machine_redo_reopen_direct_byte_comparisons': byte_results,
+ 'log': record(OUT / 'commands-results.log'), 'pass': success}
+(OUT / 'manifest.json').write_text(json.dumps(manifest, indent=2) + '\n', encoding='utf-8', newline='\n')
+print(json.dumps({'pass': success, 'commands_passed': sum(r['exit_code'] == 0 for r in results),
+ 'commands_total': len(results), 'unchanged_checkpoints': before == after,
+ 'reopen_exact_files': len(byte_results), 'manifest': record(OUT / 'manifest.json')}))
+raise SystemExit(0 if success else 1)
diff --git a/harness/experiments/constructor-defaults-20260911/README.md b/harness/experiments/constructor-defaults-20260911/README.md
new file mode 100644
index 00000000..b2e9d958
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/README.md
@@ -0,0 +1,37 @@
+# Existing source-7 constructor defaults
+
+Compatibility experiment, not proposed grammar. `probe.rs` imports only the
+matching existing `oa_core` rlib; it performs no production or Cargo edits.
+
+In a coordinated direct-rustc writer slot:
+
+```powershell
+. .local/toolchain/env.ps1
+rustc --edition 2024 -D warnings --crate-name constructor_defaults_probe harness/experiments/constructor-defaults-20260911/probe.rs --extern oa_core=.local/target-gnullvm/debug/deps/liboa_core-3e81c616fea1d901.rlib -L dependency=.local/target-gnullvm/debug/deps -C linker=clang.exe -o .local/constructor-defaults-20260911/probe.exe
+& .local/constructor-defaults-20260911/probe.exe NEW_ISOLATED_OUTPUT_DIRECTORY
+```
+
+Use a fresh output directory when reproducing so the committed evidence is not
+overwritten. The rlib SHA256 is
+`5018A1FD7286ED9DFEDCBBF5B68B399AD5D143F2A9AAAED3078CFC934C9589C4`.
+The exact compiler, core source hashes, executable hash and result inventory
+are in `provenance.json`.
+
+`results/results.tsv` records **54 admitted explicit/omitted cases** and
+**12 missing-required-field refusals**, covering both OA and SA source 7.
+Every admitted occurrence is compared with a literal expected typed body and
+the full explicit-case Project. It also requires exact source retention on
+stabilization/no-op, a name-only patch retaining omissions, and canonical
+format/reparse equality. Both scenario viewpoint omission cases separately
+require MixedLegacy equality and canonical stability.
+
+The `.canonical.arcadia` siblings intentionally expand hydrated defaults;
+they are not expected to retain authored omission. Exchange `operation none`
+is deliberately omitted by canonical serialization. Files named
+`omit-bindings`, `omit-kind`, `omit-operator`, `omit-branches`, `omit-guard`, or
+`omit-occurrences` are **expected invalid fixtures**, retained to show the
+specific missing-field diagnostic. They are not modeling examples.
+
+The program/result files are durable evidence. The compiled executable and
+initial/final build logs remain in ignored `.local/constructor-defaults-20260911/`.
+Other constructor families and old schema versions were not exhaustively tested.
diff --git a/harness/experiments/constructor-defaults-20260911/probe.rs b/harness/experiments/constructor-defaults-20260911/probe.rs
new file mode 100644
index 00000000..89695188
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/probe.rs
@@ -0,0 +1,316 @@
+//! Existing source-7 admission experiment; imports no desktop producer.
+use oa_core::{source_project::*, *};
+use std::{fs, path::Path};
+
+struct Case {
+ kind: &'static str,
+ fields: Vec<(&'static str, &'static str, bool)>,
+ expected: OccurrenceBody,
+}
+fn cases() -> Vec {
+ vec![
+ Case {
+ kind: "Exchange",
+ fields: vec![
+ ("exchange", "none", false),
+ ("sender", "none", false),
+ ("receiver", "none", false),
+ ("message_kind", "Asynchronous", false),
+ ("reply_to", "none", false),
+ ("values", "[]", false),
+ ("operation", "none", false),
+ ],
+ expected: OccurrenceBody::Exchange {
+ exchange: None,
+ sender: None,
+ receiver: None,
+ message_kind: MessageKind::Asynchronous,
+ reply_to: None,
+ values: vec![],
+ operation: None,
+ },
+ },
+ Case {
+ kind: "Action",
+ fields: vec![("action", "none", false), ("lifeline", "none", false)],
+ expected: OccurrenceBody::Action {
+ action: None,
+ lifeline: None,
+ },
+ },
+ Case {
+ kind: "State",
+ fields: vec![("state", "none", false), ("lifeline", "none", false)],
+ expected: OccurrenceBody::State {
+ state: None,
+ lifeline: None,
+ },
+ },
+ Case {
+ kind: "SequenceReference",
+ fields: vec![("sequence", "none", false)],
+ expected: OccurrenceBody::SequenceReference { sequence: None },
+ },
+ Case {
+ kind: "ScenarioUse",
+ fields: vec![("scenario", "none", false), ("bindings", "[]", true)],
+ expected: OccurrenceBody::ScenarioUse {
+ scenario: None,
+ bindings: vec![],
+ },
+ },
+ Case {
+ kind: "Control",
+ fields: vec![("kind", "Choice", true)],
+ expected: OccurrenceBody::Control {
+ kind: ControlKind::Choice,
+ },
+ },
+ Case {
+ kind: "Fragment",
+ fields: vec![("operator", "Alternative", true), ("branches", "[]", true)],
+ expected: OccurrenceBody::Fragment {
+ operator: FragmentOperator::Alternative,
+ branches: vec![],
+ },
+ },
+ Case {
+ kind: "Branch",
+ fields: vec![("guard", "\"\"", true), ("occurrences", "[]", true)],
+ expected: OccurrenceBody::Branch {
+ guard: String::new(),
+ occurrences: vec![],
+ },
+ },
+ ]
+}
+fn id(last: u8) -> Id {
+ Id::parse_str(&format!("00000000-0000-4000-8000-{last:012}")).unwrap()
+}
+fn fixture(layer: Layer, kind: &str, fields: &str) -> String {
+ let prefix = if layer == Layer::Oa { "oa" } else { "sa" };
+ let sequence = if layer == Layer::Oa {
+ "oa_process"
+ } else {
+ "sa_functional_chain"
+ };
+ let viewpoint = if layer == Layer::Oa {
+ "OperationalActivity"
+ } else {
+ "Functional"
+ };
+ let root_sequence = matches!(
+ kind,
+ "Exchange" | "Action" | "Control" | "SequenceReference"
+ );
+ let owner_kind = if root_sequence {
+ sequence.to_owned()
+ } else {
+ format!("{prefix}_scenario")
+ };
+ let owner_view = if root_sequence {
+ String::new()
+ } else {
+ format!("viewpoint {viewpoint};")
+ };
+ let step = if kind == "Branch" {
+ "holder"
+ } else {
+ "subject"
+ };
+ let parent = if kind == "Branch" { "holder" } else { "owner" };
+ let holder = if kind == "Branch" {
+ format!(
+ "{prefix}_occurrence holder \"Fragment owner\" id \"{}\" {{ parent @owner; body {{ Fragment {{ operator Alternative; branches [@subject]; }}; }}; }}",
+ id(4)
+ )
+ } else {
+ String::new()
+ };
+ format!(
+ "arcadia 7;\nproject defaults \"Constructor defaults\" id \"{}\" {{\n {owner_kind} owner \"Owner\" id \"{}\" {{ {owner_view} steps [@{step}]; }}\n {holder}\n // Authored omissions must stay omitted through no-op and a name edit.\n {prefix}_occurrence subject \"Subject\" id \"{}\" {{ parent @{parent}; body {{ {kind} {{ {fields} }}; }}; }}\n}}\n",
+ id(1),
+ id(2),
+ id(3)
+ )
+}
+fn bundle(source: &str) -> SourceBundle {
+ SourceBundle {
+ entry: "project.arcadia".into(),
+ files: [("project.arcadia".into(), source.into())]
+ .into_iter()
+ .collect(),
+ }
+}
+fn compile(source: &str) -> Result> {
+ compile_bundle(&bundle(source), ProjectLimits::default())
+}
+fn body(project: &Project) -> &OccurrenceBody {
+ let Some(SharedBody::Occurrence { body, .. }) = project.elements[&id(3)].shared() else {
+ panic!("Subject is not an occurrence")
+ };
+ body
+}
+fn accepted(out: &Path, name: &str, source: &str, expected: &Project) -> usize {
+ fs::write(out.join(format!("{name}.arcadia")), source).unwrap();
+ let compiled = compile(source).unwrap_or_else(|e| panic!("{name}: {e:?}"));
+ assert_eq!(
+ &compiled.decoded.project, expected,
+ "{name}: exact complete Project"
+ );
+ assert_eq!(
+ compiled.bundle,
+ bundle(source),
+ "{name}: explicit UUIDs need no stabilization edit"
+ );
+ execute_batch(expected, &[]).unwrap();
+ let noop = update_bundle(&compiled, expected, ProjectLimits::default()).unwrap();
+ assert_eq!(
+ noop.bundle, compiled.bundle,
+ "{name}: no-op preserves all authored omissions"
+ );
+ let renamed = execute_batch(
+ expected,
+ &[Command::Rename(id(3), "Renamed subject".into())],
+ )
+ .unwrap();
+ let edited = update_bundle(&compiled, &renamed, ProjectLimits::default()).unwrap();
+ assert_eq!(
+ edited.bundle,
+ bundle(&source.replace("\"Subject\"", "\"Renamed subject\"")),
+ "{name}: name-only edit preserves constructor spelling"
+ );
+ let canonical = language::format(expected);
+ fs::write(out.join(format!("{name}.canonical.arcadia")), &canonical).unwrap();
+ assert_eq!(
+ compile(&canonical).unwrap().decoded.project,
+ *expected,
+ "{name}: canonical roundtrip"
+ );
+ if matches!(
+ body(expected),
+ OccurrenceBody::Exchange {
+ operation: None,
+ ..
+ }
+ ) {
+ assert!(canonical.contains("message_kind Asynchronous;"));
+ assert!(canonical.contains("reply_to none;") && canonical.contains("values [];"));
+ assert!(
+ !canonical.contains("operation "),
+ "None operation is deliberately skipped by canonical serialization"
+ );
+ }
+ validation::validate(expected).len()
+}
+fn main() {
+ let out_arg = std::env::args().nth(1).expect("output directory");
+ let out = Path::new(&out_arg);
+ fs::create_dir_all(out).unwrap();
+ let mut rows = String::from("case\tlayer\tresult\tdetail\n");
+ let mut passes = 0;
+ let mut rejects = 0;
+ for layer in [Layer::Oa, Layer::Sa] {
+ for case in cases() {
+ let explicit_fields = case
+ .fields
+ .iter()
+ .map(|(name, value, _)| format!("{name} {value};"))
+ .collect::>()
+ .join(" ");
+ let explicit = fixture(layer, case.kind, &explicit_fields);
+ let baseline = compile(&explicit)
+ .unwrap_or_else(|e| panic!("{layer} {} explicit: {e:?}", case.kind));
+ assert_eq!(body(&baseline.decoded.project), &case.expected);
+ let name = format!("{layer}-{}-explicit", case.kind);
+ let issues = accepted(out, &name, &explicit, &baseline.decoded.project);
+ rows.push_str(&format!("{name}\t{layer}\taccept\texact Project, raw/no-op/name/canonical; {issues} model issues\n"));
+ passes += 1;
+ for (omit, _, required) in &case.fields {
+ let fields = case
+ .fields
+ .iter()
+ .filter(|(field, _, _)| field != omit)
+ .map(|(field, value, _)| format!("{field} {value};"))
+ .collect::>()
+ .join(" ");
+ let source = fixture(layer, case.kind, &fields);
+ let name = format!("{layer}-{}-omit-{omit}", case.kind);
+ if *required {
+ fs::write(out.join(format!("{name}.arcadia")), &source).unwrap();
+ let errors = compile(&source).expect_err("Required field omission must reject");
+ let detail = format!("{errors:?}");
+ assert!(
+ detail.contains("missing field") && detail.contains(omit),
+ "{name}: must fail on the missing constructor field: {detail}"
+ );
+ rows.push_str(&format!("{name}\t{layer}\treject\t{detail}\n"));
+ rejects += 1;
+ } else {
+ let issues = accepted(out, &name, &source, &baseline.decoded.project);
+ rows.push_str(&format!("{name}\t{layer}\taccept\texact Project, raw/no-op/name/canonical; {issues} model issues\n"));
+ passes += 1;
+ }
+ }
+ if case.fields.iter().any(|(_, _, required)| !required) {
+ let fields = case
+ .fields
+ .iter()
+ .filter(|(_, _, required)| *required)
+ .map(|(field, value, _)| format!("{field} {value};"))
+ .collect::>()
+ .join(" ");
+ let name = format!("{layer}-{}-omit-all-optional", case.kind);
+ let issues = accepted(
+ out,
+ &name,
+ &fixture(layer, case.kind, &fields),
+ &baseline.decoded.project,
+ );
+ rows.push_str(&format!("{name}\t{layer}\taccept\texact Project, raw/no-op/name/canonical; {issues} model issues\n"));
+ passes += 1;
+ }
+ }
+ let prefix = if layer == Layer::Oa { "oa" } else { "sa" };
+ let source = format!(
+ "arcadia 7;\nproject defaults \"Defaults\" id \"{}\" {{ {prefix}_scenario scene \"Scene\" id \"{}\" {{ }} }}\n",
+ id(1),
+ id(2)
+ );
+ let compiled = compile(&source).unwrap();
+ let explicit = source.replace("{ }", "{ viewpoint MixedLegacy; }");
+ assert_eq!(
+ compiled.decoded.project,
+ compile(&explicit).unwrap().decoded.project
+ );
+ assert_eq!(compiled.bundle, bundle(&source));
+ assert!(matches!(
+ compiled.decoded.project.elements[&id(2)].shared(),
+ Some(SharedBody::Scenario {
+ viewpoint: ScenarioViewpoint::MixedLegacy,
+ ..
+ })
+ ));
+ let canonical = language::format(&compiled.decoded.project);
+ assert_eq!(
+ compile(&canonical).unwrap().decoded.project,
+ compiled.decoded.project
+ );
+ fs::write(
+ out.join(format!("{layer}-scenario-viewpoint-omitted.arcadia")),
+ source,
+ )
+ .unwrap();
+ fs::write(
+ out.join(format!("{layer}-scenario-viewpoint-explicit.arcadia")),
+ explicit,
+ )
+ .unwrap();
+ rows.push_str(&format!("{layer}-scenario-viewpoint\t{layer}\taccept\texact MixedLegacy Project, retained omission, canonical roundtrip\n"));
+ passes += 1;
+ }
+ fs::write(out.join("results.tsv"), rows).unwrap();
+ println!(
+ "PASS: {passes} accepted explicit/omitted comparisons; {rejects} missing-required-field refusals; both source-7 layers. Full Project, canonical roundtrip, no-op and exact name-only source retention checked."
+ );
+}
diff --git a/harness/experiments/constructor-defaults-20260911/provenance.json b/harness/experiments/constructor-defaults-20260911/provenance.json
new file mode 100644
index 00000000..acbeeb37
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/provenance.json
@@ -0,0 +1,1001 @@
+{
+ "corePath": ".local/target-gnullvm/debug/deps/liboa_core-3e81c616fea1d901.rlib",
+ "artifacts": [
+ {
+ "bytes": 410,
+ "path": "results/OA-Action-explicit.arcadia",
+ "sha256": "B2856BADCD10BC10AAC8E26CB57030E13C8F0503EC50803757126B32B2A2BB39"
+ },
+ {
+ "bytes": 576,
+ "path": "results/OA-Action-explicit.canonical.arcadia",
+ "sha256": "0DEE0D30413717C2139AB1AE5802B09444FEF711326064459B69435E67A78675"
+ },
+ {
+ "bytes": 397,
+ "path": "results/OA-Action-omit-action.arcadia",
+ "sha256": "92E0E8D181C2CCD183A3C6E6FEC8557727497307770C8E5AB3BDC2D07E497388"
+ },
+ {
+ "bytes": 576,
+ "path": "results/OA-Action-omit-action.canonical.arcadia",
+ "sha256": "0DEE0D30413717C2139AB1AE5802B09444FEF711326064459B69435E67A78675"
+ },
+ {
+ "bytes": 383,
+ "path": "results/OA-Action-omit-all-optional.arcadia",
+ "sha256": "0926058672C362AB9394185449B1ACF533CE2A5848808C53DE6F9929CDA6B6C7"
+ },
+ {
+ "bytes": 576,
+ "path": "results/OA-Action-omit-all-optional.canonical.arcadia",
+ "sha256": "0DEE0D30413717C2139AB1AE5802B09444FEF711326064459B69435E67A78675"
+ },
+ {
+ "bytes": 395,
+ "path": "results/OA-Action-omit-lifeline.arcadia",
+ "sha256": "C357EEAF278A55EDE2AC86FAECD9A439AF299F466B5AA3BB90C275A0722CE55D"
+ },
+ {
+ "bytes": 576,
+ "path": "results/OA-Action-omit-lifeline.canonical.arcadia",
+ "sha256": "0DEE0D30413717C2139AB1AE5802B09444FEF711326064459B69435E67A78675"
+ },
+ {
+ "bytes": 604,
+ "path": "results/OA-Branch-explicit.arcadia",
+ "sha256": "929622A1F49B98B5ABD25BB7B621606C7B8A04C4C33CC8FBD216FC5DA8F689ED"
+ },
+ {
+ "bytes": 1017,
+ "path": "results/OA-Branch-explicit.canonical.arcadia",
+ "sha256": "72E19DBE36EFEE4F2B4885244484DA9BDF4936220F8D77F6653BFE859626767A"
+ },
+ {
+ "bytes": 594,
+ "path": "results/OA-Branch-omit-guard.arcadia",
+ "sha256": "AD33E92CF13F6549685F00E01AD7956C7E362C64723C303306B4DD592686CC60"
+ },
+ {
+ "bytes": 588,
+ "path": "results/OA-Branch-omit-occurrences.arcadia",
+ "sha256": "FF9F1B38E5B4B848A3C35557D39D2592EED8C14E08526CA6F63D1DF40C3BF3AD"
+ },
+ {
+ "bytes": 396,
+ "path": "results/OA-Control-explicit.arcadia",
+ "sha256": "278553ED933EC3A7269A0A6A0F9B43C77980C769CF8544E9DB5D3688D12620F9"
+ },
+ {
+ "bytes": 546,
+ "path": "results/OA-Control-explicit.canonical.arcadia",
+ "sha256": "AF30D01DEBD0102C5312219F5508DC2693F2FA54E36BA0A8039C870428C4F043"
+ },
+ {
+ "bytes": 384,
+ "path": "results/OA-Control-omit-kind.arcadia",
+ "sha256": "2FCC2787F957CD4A02A357D985378AC73F4F9A4FFF185FB472A06BA673BCC009"
+ },
+ {
+ "bytes": 496,
+ "path": "results/OA-Exchange-explicit.arcadia",
+ "sha256": "BA6179CDD0690B7BD868AC0B771796EE9030AA9E9136C1850933E6F56634C1C6"
+ },
+ {
+ "bytes": 710,
+ "path": "results/OA-Exchange-explicit.canonical.arcadia",
+ "sha256": "B8EBFDD57E8894AA40E571F7142438341ED994A8CF60EBF02B2754CA2244044F"
+ },
+ {
+ "bytes": 385,
+ "path": "results/OA-Exchange-omit-all-optional.arcadia",
+ "sha256": "D2E6C3177427B3F8CEA9B17075E831848FD2585234E3F72064325B53803874A0"
+ },
+ {
+ "bytes": 710,
+ "path": "results/OA-Exchange-omit-all-optional.canonical.arcadia",
+ "sha256": "B8EBFDD57E8894AA40E571F7142438341ED994A8CF60EBF02B2754CA2244044F"
+ },
+ {
+ "bytes": 481,
+ "path": "results/OA-Exchange-omit-exchange.arcadia",
+ "sha256": "037873086154727B1450ED72F2A702431EB9ED46CFCB4571C7C3DADBDEC5394B"
+ },
+ {
+ "bytes": 710,
+ "path": "results/OA-Exchange-omit-exchange.canonical.arcadia",
+ "sha256": "B8EBFDD57E8894AA40E571F7142438341ED994A8CF60EBF02B2754CA2244044F"
+ },
+ {
+ "bytes": 469,
+ "path": "results/OA-Exchange-omit-message_kind.arcadia",
+ "sha256": "AC07C2D65CC39D1AF7736CE932346E7E57B711BA47B3636B10ADA8404116F1EF"
+ },
+ {
+ "bytes": 710,
+ "path": "results/OA-Exchange-omit-message_kind.canonical.arcadia",
+ "sha256": "B8EBFDD57E8894AA40E571F7142438341ED994A8CF60EBF02B2754CA2244044F"
+ },
+ {
+ "bytes": 480,
+ "path": "results/OA-Exchange-omit-operation.arcadia",
+ "sha256": "341132234936D9F253508B091635F437652F4C19496EA7E92AB685BBAA63A63A"
+ },
+ {
+ "bytes": 710,
+ "path": "results/OA-Exchange-omit-operation.canonical.arcadia",
+ "sha256": "B8EBFDD57E8894AA40E571F7142438341ED994A8CF60EBF02B2754CA2244044F"
+ },
+ {
+ "bytes": 481,
+ "path": "results/OA-Exchange-omit-receiver.arcadia",
+ "sha256": "779568D2BA8D0B6D79002882764E40C62143B739E5B80DF2B3BF779AC54B7C53"
+ },
+ {
+ "bytes": 710,
+ "path": "results/OA-Exchange-omit-receiver.canonical.arcadia",
+ "sha256": "B8EBFDD57E8894AA40E571F7142438341ED994A8CF60EBF02B2754CA2244044F"
+ },
+ {
+ "bytes": 481,
+ "path": "results/OA-Exchange-omit-reply_to.arcadia",
+ "sha256": "EE5314D1500D7FFC646A7D4A69E1DC7D9042BB6F867E58A8F59D69AF373788A1"
+ },
+ {
+ "bytes": 710,
+ "path": "results/OA-Exchange-omit-reply_to.canonical.arcadia",
+ "sha256": "B8EBFDD57E8894AA40E571F7142438341ED994A8CF60EBF02B2754CA2244044F"
+ },
+ {
+ "bytes": 483,
+ "path": "results/OA-Exchange-omit-sender.arcadia",
+ "sha256": "BABAD648E1ACC3CDECDF5486E25F8BB0BA73609B27BA49730D91596EEFA75446"
+ },
+ {
+ "bytes": 710,
+ "path": "results/OA-Exchange-omit-sender.canonical.arcadia",
+ "sha256": "B8EBFDD57E8894AA40E571F7142438341ED994A8CF60EBF02B2754CA2244044F"
+ },
+ {
+ "bytes": 485,
+ "path": "results/OA-Exchange-omit-values.arcadia",
+ "sha256": "49E1D54CAAEF374BC4F5C77E884A304987B656C5137E66AED1FA2B76297A886B"
+ },
+ {
+ "bytes": 710,
+ "path": "results/OA-Exchange-omit-values.canonical.arcadia",
+ "sha256": "B8EBFDD57E8894AA40E571F7142438341ED994A8CF60EBF02B2754CA2244044F"
+ },
+ {
+ "bytes": 450,
+ "path": "results/OA-Fragment-explicit.arcadia",
+ "sha256": "01438C6F8985D8EE732468D136ED4BED5C8E6D297024226583A190AA82719311"
+ },
+ {
+ "bytes": 698,
+ "path": "results/OA-Fragment-explicit.canonical.arcadia",
+ "sha256": "8E384EFCCFF6E15B886DAF9F2D06D56D075FED188B5B4DD45138F0FBC6BD2079"
+ },
+ {
+ "bytes": 437,
+ "path": "results/OA-Fragment-omit-branches.arcadia",
+ "sha256": "A8D98FA8FEB515A6C35A7D3D2D2FA02DEF111DB12239AF8CEFF13B408E00385F"
+ },
+ {
+ "bytes": 428,
+ "path": "results/OA-Fragment-omit-operator.arcadia",
+ "sha256": "8C0332BD56735683E24746F41B63D56DF4F89FAEAFE41348BF60D9C706396AC1"
+ },
+ {
+ "bytes": 180,
+ "path": "results/OA-scenario-viewpoint-explicit.arcadia",
+ "sha256": "04A715448510822A5C5A80FB9B8E27175C22EDC8D470F17CF336CB66D84DC118"
+ },
+ {
+ "bytes": 157,
+ "path": "results/OA-scenario-viewpoint-omitted.arcadia",
+ "sha256": "4EC85A87A4B0B8807D0F98497A9A8870602AB0484089E4845799F53028684558"
+ },
+ {
+ "bytes": 446,
+ "path": "results/OA-ScenarioUse-explicit.arcadia",
+ "sha256": "1E0516E569BC611D573EDC3690BD2D50E3B1CDB96596CD2164BB077F068F3FAA"
+ },
+ {
+ "bytes": 694,
+ "path": "results/OA-ScenarioUse-explicit.canonical.arcadia",
+ "sha256": "027BB8CA6D1EE48DE7B3AA9F7DBB838F7E2E54ACC87429CD2A4C7893C011B10C"
+ },
+ {
+ "bytes": 431,
+ "path": "results/OA-ScenarioUse-omit-all-optional.arcadia",
+ "sha256": "4E7A42E85A18BF40F5D282D3223AF99EFDC5B314806979909674E39673FFE301"
+ },
+ {
+ "bytes": 694,
+ "path": "results/OA-ScenarioUse-omit-all-optional.canonical.arcadia",
+ "sha256": "027BB8CA6D1EE48DE7B3AA9F7DBB838F7E2E54ACC87429CD2A4C7893C011B10C"
+ },
+ {
+ "bytes": 433,
+ "path": "results/OA-ScenarioUse-omit-bindings.arcadia",
+ "sha256": "E610BFA303388AC37E6CB53B412299942C22F3E3C99D379666DB57D56144D2BE"
+ },
+ {
+ "bytes": 431,
+ "path": "results/OA-ScenarioUse-omit-scenario.arcadia",
+ "sha256": "4E7A42E85A18BF40F5D282D3223AF99EFDC5B314806979909674E39673FFE301"
+ },
+ {
+ "bytes": 694,
+ "path": "results/OA-ScenarioUse-omit-scenario.canonical.arcadia",
+ "sha256": "027BB8CA6D1EE48DE7B3AA9F7DBB838F7E2E54ACC87429CD2A4C7893C011B10C"
+ },
+ {
+ "bytes": 408,
+ "path": "results/OA-SequenceReference-explicit.arcadia",
+ "sha256": "6C571B93605EC55EC85BAC19FFB6B8655365514966736D1BB16827FE2B51D8EC"
+ },
+ {
+ "bytes": 558,
+ "path": "results/OA-SequenceReference-explicit.canonical.arcadia",
+ "sha256": "02E5F876154A486EA5CD0AC9973FB7B0FD820D6AB8FE56A3A4BBA984B9847E3D"
+ },
+ {
+ "bytes": 394,
+ "path": "results/OA-SequenceReference-omit-all-optional.arcadia",
+ "sha256": "C8DD7DDFBB0445A3F426FCF3419ED5E6BF544AE3646B9174AE71117E7AA97A10"
+ },
+ {
+ "bytes": 558,
+ "path": "results/OA-SequenceReference-omit-all-optional.canonical.arcadia",
+ "sha256": "02E5F876154A486EA5CD0AC9973FB7B0FD820D6AB8FE56A3A4BBA984B9847E3D"
+ },
+ {
+ "bytes": 394,
+ "path": "results/OA-SequenceReference-omit-sequence.arcadia",
+ "sha256": "C8DD7DDFBB0445A3F426FCF3419ED5E6BF544AE3646B9174AE71117E7AA97A10"
+ },
+ {
+ "bytes": 558,
+ "path": "results/OA-SequenceReference-omit-sequence.canonical.arcadia",
+ "sha256": "02E5F876154A486EA5CD0AC9973FB7B0FD820D6AB8FE56A3A4BBA984B9847E3D"
+ },
+ {
+ "bytes": 439,
+ "path": "results/OA-State-explicit.arcadia",
+ "sha256": "C9D77C67EDE054704025C3E3ED931A995373F8290CCEC66B15390DDD42695514"
+ },
+ {
+ "bytes": 687,
+ "path": "results/OA-State-explicit.canonical.arcadia",
+ "sha256": "BF6EFCAB6ECEC6A941AD33E5764BFC55402AD7750CD4325BC4DEE1C14B2DF870"
+ },
+ {
+ "bytes": 413,
+ "path": "results/OA-State-omit-all-optional.arcadia",
+ "sha256": "619C7012019F9E26F62B82FF2CD691C799167A40056ECED36BA24EBA50B497EB"
+ },
+ {
+ "bytes": 687,
+ "path": "results/OA-State-omit-all-optional.canonical.arcadia",
+ "sha256": "BF6EFCAB6ECEC6A941AD33E5764BFC55402AD7750CD4325BC4DEE1C14B2DF870"
+ },
+ {
+ "bytes": 424,
+ "path": "results/OA-State-omit-lifeline.arcadia",
+ "sha256": "C6C2680DEBD179BE983BD8A9AA84D9D8771DC01533E114E353E1D2757BA678A4"
+ },
+ {
+ "bytes": 687,
+ "path": "results/OA-State-omit-lifeline.canonical.arcadia",
+ "sha256": "BF6EFCAB6ECEC6A941AD33E5764BFC55402AD7750CD4325BC4DEE1C14B2DF870"
+ },
+ {
+ "bytes": 427,
+ "path": "results/OA-State-omit-state.arcadia",
+ "sha256": "32BD00CF088F07B4BE1FB5D1BE1EF0FC751EA45375C7C33D0B07B9A7E074379F"
+ },
+ {
+ "bytes": 687,
+ "path": "results/OA-State-omit-state.canonical.arcadia",
+ "sha256": "BF6EFCAB6ECEC6A941AD33E5764BFC55402AD7750CD4325BC4DEE1C14B2DF870"
+ },
+ {
+ "bytes": 8419,
+ "path": "results/results.tsv",
+ "sha256": "2C1BB97234EDFAC386A5DDCA46C28B5B46972CC879B7CC2B1C4179066BAB8AEF"
+ },
+ {
+ "bytes": 419,
+ "path": "results/SA-Action-explicit.arcadia",
+ "sha256": "C02F4EC5C86E07AC225752C0DF8F2E8E381617F1551043BFAE67EB67B7C05BE3"
+ },
+ {
+ "bytes": 585,
+ "path": "results/SA-Action-explicit.canonical.arcadia",
+ "sha256": "8B659C6AB5295D966744118AC2B52ACBAC0282D3DC6974EF7ED66A97039930D8"
+ },
+ {
+ "bytes": 406,
+ "path": "results/SA-Action-omit-action.arcadia",
+ "sha256": "4BC9E2C7E7B8F4EE35CCFE7AACB9D993AE900E831EB4448B3F0317D75594BABD"
+ },
+ {
+ "bytes": 585,
+ "path": "results/SA-Action-omit-action.canonical.arcadia",
+ "sha256": "8B659C6AB5295D966744118AC2B52ACBAC0282D3DC6974EF7ED66A97039930D8"
+ },
+ {
+ "bytes": 392,
+ "path": "results/SA-Action-omit-all-optional.arcadia",
+ "sha256": "5D52B9401289EB18C175B5F360091F6770DBDF4FCF1D613056117658E947BA67"
+ },
+ {
+ "bytes": 585,
+ "path": "results/SA-Action-omit-all-optional.canonical.arcadia",
+ "sha256": "8B659C6AB5295D966744118AC2B52ACBAC0282D3DC6974EF7ED66A97039930D8"
+ },
+ {
+ "bytes": 404,
+ "path": "results/SA-Action-omit-lifeline.arcadia",
+ "sha256": "360D7FDA81074D59491ACE12606C55EC31C6D8C31470099C071C27A03E4160F1"
+ },
+ {
+ "bytes": 585,
+ "path": "results/SA-Action-omit-lifeline.canonical.arcadia",
+ "sha256": "8B659C6AB5295D966744118AC2B52ACBAC0282D3DC6974EF7ED66A97039930D8"
+ },
+ {
+ "bytes": 595,
+ "path": "results/SA-Branch-explicit.arcadia",
+ "sha256": "2F5667850C6BDCC91B4AD3AF7284B9E1D3358BD671EA53E958FB7F911310B5AA"
+ },
+ {
+ "bytes": 1008,
+ "path": "results/SA-Branch-explicit.canonical.arcadia",
+ "sha256": "0B6F227CFEDCC48F031420508D67A03FF124430FF78F530E7E03995A002997FD"
+ },
+ {
+ "bytes": 585,
+ "path": "results/SA-Branch-omit-guard.arcadia",
+ "sha256": "7753AC98168B6CBA220B446DA01DEAA766BBD8347462722DC4531EE22959A770"
+ },
+ {
+ "bytes": 579,
+ "path": "results/SA-Branch-omit-occurrences.arcadia",
+ "sha256": "74608C96407F3C20E9B24D53434486D4E06A7F74DDFFDD5B9FAC81BC2EC14CB0"
+ },
+ {
+ "bytes": 405,
+ "path": "results/SA-Control-explicit.arcadia",
+ "sha256": "222989078599D385889F6E603273FC96A357623347408CD5B7CB09148F7F9E50"
+ },
+ {
+ "bytes": 555,
+ "path": "results/SA-Control-explicit.canonical.arcadia",
+ "sha256": "DDCE14E3CD1955593EE17A86613B65550FF32F19503FC6E772307D8B8399AC98"
+ },
+ {
+ "bytes": 393,
+ "path": "results/SA-Control-omit-kind.arcadia",
+ "sha256": "62C86948C582E2D167C6589DC1F31916C8BD2380520DCF1E6FDB623A52AB058D"
+ },
+ {
+ "bytes": 505,
+ "path": "results/SA-Exchange-explicit.arcadia",
+ "sha256": "AB600959E5DE90AB21CD4C7DBBD39941C5F824B53F4A08F533A6881D0D5F6C4D"
+ },
+ {
+ "bytes": 719,
+ "path": "results/SA-Exchange-explicit.canonical.arcadia",
+ "sha256": "7B5508169100654EFA6893C2163DE250DD73C90988D419CA6DE93CDC16F43D0C"
+ },
+ {
+ "bytes": 394,
+ "path": "results/SA-Exchange-omit-all-optional.arcadia",
+ "sha256": "5AD2E32C000C2A33DEEBE75DFE42711309F135E528C1F4CC2CB10F372E82A484"
+ },
+ {
+ "bytes": 719,
+ "path": "results/SA-Exchange-omit-all-optional.canonical.arcadia",
+ "sha256": "7B5508169100654EFA6893C2163DE250DD73C90988D419CA6DE93CDC16F43D0C"
+ },
+ {
+ "bytes": 490,
+ "path": "results/SA-Exchange-omit-exchange.arcadia",
+ "sha256": "7FA14291E6BA6B02111B5BFEAFB8F5530D546E4DB544F48591F357E43559D65A"
+ },
+ {
+ "bytes": 719,
+ "path": "results/SA-Exchange-omit-exchange.canonical.arcadia",
+ "sha256": "7B5508169100654EFA6893C2163DE250DD73C90988D419CA6DE93CDC16F43D0C"
+ },
+ {
+ "bytes": 478,
+ "path": "results/SA-Exchange-omit-message_kind.arcadia",
+ "sha256": "BFBC6EDD72E04D291721BFA5A01881CA286957F984D9AF80D748FAC78735DF49"
+ },
+ {
+ "bytes": 719,
+ "path": "results/SA-Exchange-omit-message_kind.canonical.arcadia",
+ "sha256": "7B5508169100654EFA6893C2163DE250DD73C90988D419CA6DE93CDC16F43D0C"
+ },
+ {
+ "bytes": 489,
+ "path": "results/SA-Exchange-omit-operation.arcadia",
+ "sha256": "222ED17452FA6FA54126504AA7F8866F49A8F9BE996F8FBC872FADC303CF3A01"
+ },
+ {
+ "bytes": 719,
+ "path": "results/SA-Exchange-omit-operation.canonical.arcadia",
+ "sha256": "7B5508169100654EFA6893C2163DE250DD73C90988D419CA6DE93CDC16F43D0C"
+ },
+ {
+ "bytes": 490,
+ "path": "results/SA-Exchange-omit-receiver.arcadia",
+ "sha256": "0F479EEFA9117CC3C318E1229D703FEA763DC387D3D4EA749E3EA8ABCDB6F924"
+ },
+ {
+ "bytes": 719,
+ "path": "results/SA-Exchange-omit-receiver.canonical.arcadia",
+ "sha256": "7B5508169100654EFA6893C2163DE250DD73C90988D419CA6DE93CDC16F43D0C"
+ },
+ {
+ "bytes": 490,
+ "path": "results/SA-Exchange-omit-reply_to.arcadia",
+ "sha256": "6DEDB085A300BB7791CCDD4F33AA130C6288F2FC4BE4E37C7369EF1BF35E7B30"
+ },
+ {
+ "bytes": 719,
+ "path": "results/SA-Exchange-omit-reply_to.canonical.arcadia",
+ "sha256": "7B5508169100654EFA6893C2163DE250DD73C90988D419CA6DE93CDC16F43D0C"
+ },
+ {
+ "bytes": 492,
+ "path": "results/SA-Exchange-omit-sender.arcadia",
+ "sha256": "9A0097A61F6853DDAF55D378D69B481247F1D87E805EF10274CAF9216DC47B22"
+ },
+ {
+ "bytes": 719,
+ "path": "results/SA-Exchange-omit-sender.canonical.arcadia",
+ "sha256": "7B5508169100654EFA6893C2163DE250DD73C90988D419CA6DE93CDC16F43D0C"
+ },
+ {
+ "bytes": 494,
+ "path": "results/SA-Exchange-omit-values.arcadia",
+ "sha256": "C2E42697B8661C83DD0C11FDD6A45DF671F38E8AB30241C310B2C7B448FF9D9F"
+ },
+ {
+ "bytes": 719,
+ "path": "results/SA-Exchange-omit-values.canonical.arcadia",
+ "sha256": "7B5508169100654EFA6893C2163DE250DD73C90988D419CA6DE93CDC16F43D0C"
+ },
+ {
+ "bytes": 441,
+ "path": "results/SA-Fragment-explicit.arcadia",
+ "sha256": "3D67F772C4CC437EADDD94A8A64554C1B8457440AA73D9CED124DE04A76DD381"
+ },
+ {
+ "bytes": 689,
+ "path": "results/SA-Fragment-explicit.canonical.arcadia",
+ "sha256": "00BC627F557CFD84599052FC6A0476649C4BA50A8A3A280287E6D65BE5B571BA"
+ },
+ {
+ "bytes": 428,
+ "path": "results/SA-Fragment-omit-branches.arcadia",
+ "sha256": "B9077CF0D204952C21D93EA3350D6D6E86EB54F94DAA06291AA9452435E5CB52"
+ },
+ {
+ "bytes": 419,
+ "path": "results/SA-Fragment-omit-operator.arcadia",
+ "sha256": "B837BED4A6CEF7FECD0615E747A56C0616BE27BDC197477A2C9E6ECC38979559"
+ },
+ {
+ "bytes": 180,
+ "path": "results/SA-scenario-viewpoint-explicit.arcadia",
+ "sha256": "47391866214833C4E85EAD1668AF9A0F1A9AB908E9E9BF4ADB147C3A1F2AEBD2"
+ },
+ {
+ "bytes": 157,
+ "path": "results/SA-scenario-viewpoint-omitted.arcadia",
+ "sha256": "D96F1ACC0D02E478139C838A5F7A11572137D4933C95FD7EAD948FC7C7CEFBF7"
+ },
+ {
+ "bytes": 437,
+ "path": "results/SA-ScenarioUse-explicit.arcadia",
+ "sha256": "A3EE50450FE0CE5D5E65D68C7C33F8B22FEB95AAEA80C5236A6AF192CECEB642"
+ },
+ {
+ "bytes": 685,
+ "path": "results/SA-ScenarioUse-explicit.canonical.arcadia",
+ "sha256": "A9C4E63FAF7BFC7D011950D397C38C6B7EAA99BF8F11808211921465BB92432D"
+ },
+ {
+ "bytes": 422,
+ "path": "results/SA-ScenarioUse-omit-all-optional.arcadia",
+ "sha256": "8CBAFD88B4946167D0C5AD749DEB63E713B6F8445A9ADD6203C6EDEC8A296D78"
+ },
+ {
+ "bytes": 685,
+ "path": "results/SA-ScenarioUse-omit-all-optional.canonical.arcadia",
+ "sha256": "A9C4E63FAF7BFC7D011950D397C38C6B7EAA99BF8F11808211921465BB92432D"
+ },
+ {
+ "bytes": 424,
+ "path": "results/SA-ScenarioUse-omit-bindings.arcadia",
+ "sha256": "EB60EAD7AC12535BE029107C47C5FB8D12AF8A94A866A0F10E04F9331F52A0E8"
+ },
+ {
+ "bytes": 422,
+ "path": "results/SA-ScenarioUse-omit-scenario.arcadia",
+ "sha256": "8CBAFD88B4946167D0C5AD749DEB63E713B6F8445A9ADD6203C6EDEC8A296D78"
+ },
+ {
+ "bytes": 685,
+ "path": "results/SA-ScenarioUse-omit-scenario.canonical.arcadia",
+ "sha256": "A9C4E63FAF7BFC7D011950D397C38C6B7EAA99BF8F11808211921465BB92432D"
+ },
+ {
+ "bytes": 417,
+ "path": "results/SA-SequenceReference-explicit.arcadia",
+ "sha256": "FD0CB7801D9E0C164DBE4BC346FAF17FA32D6F45AD615FB2EC785B9853EF44B8"
+ },
+ {
+ "bytes": 567,
+ "path": "results/SA-SequenceReference-explicit.canonical.arcadia",
+ "sha256": "1E61E6B6C85EB350A8D2DBA6B248F8BD58C3D551047B0FD04FF681A229137081"
+ },
+ {
+ "bytes": 403,
+ "path": "results/SA-SequenceReference-omit-all-optional.arcadia",
+ "sha256": "DF044824FDFE3F704C862191D462DEA1F875F3BE1DE4EAD0A8B5FB86D16C055D"
+ },
+ {
+ "bytes": 567,
+ "path": "results/SA-SequenceReference-omit-all-optional.canonical.arcadia",
+ "sha256": "1E61E6B6C85EB350A8D2DBA6B248F8BD58C3D551047B0FD04FF681A229137081"
+ },
+ {
+ "bytes": 403,
+ "path": "results/SA-SequenceReference-omit-sequence.arcadia",
+ "sha256": "DF044824FDFE3F704C862191D462DEA1F875F3BE1DE4EAD0A8B5FB86D16C055D"
+ },
+ {
+ "bytes": 567,
+ "path": "results/SA-SequenceReference-omit-sequence.canonical.arcadia",
+ "sha256": "1E61E6B6C85EB350A8D2DBA6B248F8BD58C3D551047B0FD04FF681A229137081"
+ },
+ {
+ "bytes": 430,
+ "path": "results/SA-State-explicit.arcadia",
+ "sha256": "D89CC915D95EC328421F3CA566765A0258FA5B27FFE7E5C369C3E83D690CE9C7"
+ },
+ {
+ "bytes": 678,
+ "path": "results/SA-State-explicit.canonical.arcadia",
+ "sha256": "6AD404F8674353802D4D3B8B26F689BE63287E1F1290994698ACA11C8E8A3AEC"
+ },
+ {
+ "bytes": 404,
+ "path": "results/SA-State-omit-all-optional.arcadia",
+ "sha256": "E49EB739A9E6EDF4EBB666DCDC5FDB6D0868EDC5D56B1370EED99FE37F240FA6"
+ },
+ {
+ "bytes": 678,
+ "path": "results/SA-State-omit-all-optional.canonical.arcadia",
+ "sha256": "6AD404F8674353802D4D3B8B26F689BE63287E1F1290994698ACA11C8E8A3AEC"
+ },
+ {
+ "bytes": 415,
+ "path": "results/SA-State-omit-lifeline.arcadia",
+ "sha256": "A7263DB138768E0AE1CAEBF5AF8D76186A5644080F458F0E97C0A733FFD4C3EA"
+ },
+ {
+ "bytes": 678,
+ "path": "results/SA-State-omit-lifeline.canonical.arcadia",
+ "sha256": "6AD404F8674353802D4D3B8B26F689BE63287E1F1290994698ACA11C8E8A3AEC"
+ },
+ {
+ "bytes": 418,
+ "path": "results/SA-State-omit-state.arcadia",
+ "sha256": "F65BD487140BB7C66CF2366F9DD0BB56E58DED44AEA325D3BC32DAEC16899F2B"
+ },
+ {
+ "bytes": 678,
+ "path": "results/SA-State-omit-state.canonical.arcadia",
+ "sha256": "6AD404F8674353802D4D3B8B26F689BE63287E1F1290994698ACA11C8E8A3AEC"
+ }
+ ],
+ "probeSha256": "FAA1A98BEA7A87E24047991D72A54919AE9C66F84B6EB465E24B13FDC82EE040",
+ "result": "PASS54 accepted explicit/omitted comparisons and12 required-field refusals in source7 OA/SA",
+ "head": "4bb4aaf3dc47b9738625b4d3f23ef8c74f286395",
+ "recorded": "2026-09-11T09:05:36.4691011Z",
+ "coreSha256": "5018A1FD7286ED9DFEDCBBF5B68B399AD5D143F2A9AAAED3078CFC934C9589C4",
+ "coreInputs": [
+ {
+ "path": "crates/oa-core/build.rs",
+ "sha256": "AB1BE6AE1FD8BF3EBAEEF6348347A9D5E666BDE693126F199E041659E0B094A9"
+ },
+ {
+ "path": "crates/oa-core/Cargo.toml",
+ "sha256": "64824EC447BE777841A972BF06C894EF2624A37E4725583BCFE0389DEB9F00A3"
+ },
+ {
+ "path": "crates/oa-core/examples/generate_demo.rs",
+ "sha256": "E26F432C95331AECA50985DBB3AD2C558AFFD43023B585811F0F7BFAA59F6661"
+ },
+ {
+ "path": "crates/oa-core/examples/generate_release1.rs",
+ "sha256": "1D5F11165D74893E4BC18DBF3A2F2111F4026BD89FD06EE7F0BAE69E45C4D4B5"
+ },
+ {
+ "path": "crates/oa-core/examples/release_dense_views.rs",
+ "sha256": "A83158488EF9B7394F136C52B1496719BE935C4E5BDFE457CAB5C9894F5F9412"
+ },
+ {
+ "path": "crates/oa-core/examples/routing_workshop.rs",
+ "sha256": "571307B18B6D4FA04700C5A4D4B0C2154C419E93A21292B2028E7B6F46A2FAA7"
+ },
+ {
+ "path": "crates/oa-core/src/data.rs",
+ "sha256": "7F9C7C7DD8353CB5A38597B92CDE6D3E890203D392473187EB387D41FF37414A"
+ },
+ {
+ "path": "crates/oa-core/src/demo.rs",
+ "sha256": "AD62123F96C20FF023CAFC1A9849B0FA06BC62EDD1FB9701799E4599B458600C"
+ },
+ {
+ "path": "crates/oa-core/src/language_nesting_tests.rs",
+ "sha256": "BD061611E8CB6F28AB203C73E544AC98BF275EB464CD314AD5FBD25F773DF33B"
+ },
+ {
+ "path": "crates/oa-core/src/language.rs",
+ "sha256": "638F08A42E9CF4996B5D07F69B4D6F517A518369F3604D25BE1006E40E080765"
+ },
+ {
+ "path": "crates/oa-core/src/language/semantic_source.rs",
+ "sha256": "584B5BB59D87A7B8D44D5DD2D124C3A1323B21492B138A17BC9526C0087C9E29"
+ },
+ {
+ "path": "crates/oa-core/src/lib.rs",
+ "sha256": "52CB6EE7A4FFC00711ECF121C1A1B14CA154863F7CA27B0D2A8E239EDCE8ACA7"
+ },
+ {
+ "path": "crates/oa-core/src/migration_v2/adapter.rs",
+ "sha256": "66741B4C8354A23B8A932ECC5BF1BC3BB6E74279558757B8C35BC2157A7E51B5"
+ },
+ {
+ "path": "crates/oa-core/src/migration_v2/mod.rs",
+ "sha256": "857D8BB13B6814DABA6780CA770C16352943C01CB130245D055F11B3B957B3E9"
+ },
+ {
+ "path": "crates/oa-core/src/migration_v2/model.rs",
+ "sha256": "8AC63EB59B2E57BDECFF2477EE0634096090924D3DD1851E1C454880A889DACB"
+ },
+ {
+ "path": "crates/oa-core/src/migration_v2/references.rs",
+ "sha256": "33A6819ABC83139FDAEBEEBD1B553238A328637106CCE7DD5A535F1791D43E20"
+ },
+ {
+ "path": "crates/oa-core/src/migration_v2/source.rs",
+ "sha256": "74FEE9B24E7C912182C998AB9D9AEEC125E2009C3214959229E844C67AFE2BF6"
+ },
+ {
+ "path": "crates/oa-core/src/migration_v2/state_validation.rs",
+ "sha256": "E29EF071BAB0A68460DDF55C46131C6F66C022D52C3C602C37C013C3649DA1B0"
+ },
+ {
+ "path": "crates/oa-core/src/migration_v2/transitions.rs",
+ "sha256": "F74174C532BA56B57C80B719A11FB4ADEA0A78CCC2828FFF72FE2B9EDA5A10B1"
+ },
+ {
+ "path": "crates/oa-core/src/migration_v2/validation.rs",
+ "sha256": "6D5E4A4E2805AE5045BF789A0485E14A61C63346587BACE2B4A91173A688F780"
+ },
+ {
+ "path": "crates/oa-core/src/migration_v3/mod.rs",
+ "sha256": "F4EDB6A0B50ECFE8670973776D703047B064420CB1F05913129C00FC656B3722"
+ },
+ {
+ "path": "crates/oa-core/src/migration_v4.rs",
+ "sha256": "50C652964F0F309E7F3F54B6EF12C40D42FCECC0490F005995C713DF1179AF70"
+ },
+ {
+ "path": "crates/oa-core/src/model.rs",
+ "sha256": "4585C895C64C4A183941C92CF047A9E52FF0CBE41971E16E78D229EA9DC101FB"
+ },
+ {
+ "path": "crates/oa-core/src/operations.rs",
+ "sha256": "A5FFBBF54CD440316A106D1188BFB699B57DAE59F466EDCB33618C333CD19F41"
+ },
+ {
+ "path": "crates/oa-core/src/persistence.rs",
+ "sha256": "1C01474F906A63E552C0D590B272C95821C00A100B3E79E58E67DBBEAC341A14"
+ },
+ {
+ "path": "crates/oa-core/src/ports.rs",
+ "sha256": "5CAC12EEA70A54EBEBBD6BE77B63CE92E3195325C4BC7D27705C518686CBAC80"
+ },
+ {
+ "path": "crates/oa-core/src/projection.rs",
+ "sha256": "69ED12BACE2CC5024E151752A174AB14034AC2D05EB741FCF13E9A27521C059B"
+ },
+ {
+ "path": "crates/oa-core/src/projection/port_layout.rs",
+ "sha256": "A08D17D10A58BB8B206DD001B19B91D5AA3A9F743B298A4DA57D503223C20079"
+ },
+ {
+ "path": "crates/oa-core/src/projection/state.rs",
+ "sha256": "73A607BAC713EC7FF49A509FEFB1A53C7686DCA93EE241FFC835564D743AFB28"
+ },
+ {
+ "path": "crates/oa-core/src/references.rs",
+ "sha256": "93553C234F32DA35F1F41A7B83AD81C471C9803EFA78CA222CF7DE3C2F86C0BB"
+ },
+ {
+ "path": "crates/oa-core/src/routing.rs",
+ "sha256": "C5EBB350BA76F731F5C48D968BFBBA4B6EF68EC046EB5893D116C4637EF15080"
+ },
+ {
+ "path": "crates/oa-core/src/semantic.rs",
+ "sha256": "F9895DD5B8FB27D10D4CFBB41C3542EF2018365A589B8D5778E5674AE5A1F239"
+ },
+ {
+ "path": "crates/oa-core/src/semantic/catalog.rs",
+ "sha256": "1FF74FCCA18084D178681D7FF38EE1CCAC632C27C4DE0595BA1CEAB8067AB3A4"
+ },
+ {
+ "path": "crates/oa-core/src/semantic/historical.rs",
+ "sha256": "EAF3284BF234312698514CDB636BC8348E1B5D746CB16B18DF777E77D312ABFB"
+ },
+ {
+ "path": "crates/oa-core/src/semantic/linked.rs",
+ "sha256": "6F335B14E809AECFC35DEFCAF77CB821B080D1506DBC46297912B25AF98C07A2"
+ },
+ {
+ "path": "crates/oa-core/src/semantic/mutate.rs",
+ "sha256": "DC2B4C4A6EB156FE468EAA8C85FD37A505C0CD8EA1F226CB69CD01689AFD3D9D"
+ },
+ {
+ "path": "crates/oa-core/src/semantic/review.rs",
+ "sha256": "0C157D2C327E72E89CCA3B423E71EE73798105C5BB7271439C1A101642C91E3E"
+ },
+ {
+ "path": "crates/oa-core/src/semantic/types.rs",
+ "sha256": "6922FE35089F12FAD43AB0CE1C6886D01A3855F90B8E2543E99802AC5E6F1BBB"
+ },
+ {
+ "path": "crates/oa-core/src/session.rs",
+ "sha256": "1EB77B329B2986FC6F5DC0171E77FD860375CDFD8C769A1367B445D6C49EBE00"
+ },
+ {
+ "path": "crates/oa-core/src/source_files.rs",
+ "sha256": "669491DBDDB8E8E6556161426DFFA1A49AC1C826D31020BFF0956D81A4D84683"
+ },
+ {
+ "path": "crates/oa-core/src/source_project.rs",
+ "sha256": "1394370BCC5908873B830C2C11312E6E1611AF41F46C4F43CA0A6BCB713BB466"
+ },
+ {
+ "path": "crates/oa-core/src/source_project/source_migration.rs",
+ "sha256": "ADD463AE85C420F853D324B00A221F0F874164CC3F3ED6BBB07557A9ED7A8C95"
+ },
+ {
+ "path": "crates/oa-core/src/source_project/source_structure.rs",
+ "sha256": "9F1F83315856A7025FE662C0FBB13452F31613224A03663150D6225D1DDC162F"
+ },
+ {
+ "path": "crates/oa-core/src/state_validation.rs",
+ "sha256": "E28D7F74385E2A78763716B34491BD73A00BFECCC085970CEB130627E3FAEE18"
+ },
+ {
+ "path": "crates/oa-core/src/topology_context.rs",
+ "sha256": "16DE69B297DE95D93C73808621607833B713AF811DD082F0169186AE1E5C3E2D"
+ },
+ {
+ "path": "crates/oa-core/src/topology_context/analysis_tests.rs",
+ "sha256": "17839263410815E96FE027D4EBA3AAE0A9AB3B82B16947E2B29EBE0D09782B56"
+ },
+ {
+ "path": "crates/oa-core/src/topology_context/analysis.rs",
+ "sha256": "DEAD6194F0AA60CC46045C0E5EE10DBDBB689158C38634DFBBBC45D2BA88AC65"
+ },
+ {
+ "path": "crates/oa-core/src/transitions.rs",
+ "sha256": "FADD1B07B89CAE4117B91ABB4F1AC9EA81FF818EF20F2175E76EE8CF21FB708D"
+ },
+ {
+ "path": "crates/oa-core/src/transitions/communication.rs",
+ "sha256": "2B476630A88EDD9021B9156CA12A5402E01604095F0D4002AFB452671903A028"
+ },
+ {
+ "path": "crates/oa-core/src/validation.rs",
+ "sha256": "7C1B4AE5E4EBBA13E99AF9158CCDE138DFC5E9A7AFB580E76FBA72D0B64BA74E"
+ },
+ {
+ "path": "crates/oa-core/src/validation/coverage.rs",
+ "sha256": "B08E4B344ECAD055714168C83BEFF7FE29BA4EDC53EDBFFA2EAE04E5580A4D5F"
+ },
+ {
+ "path": "crates/oa-core/src/view_options_tests.rs",
+ "sha256": "64AAC44DE2DF42A1012239A3DD75C473DAF0C8990B3170B7BF7E78A556080208"
+ },
+ {
+ "path": "crates/oa-core/src/view_options.rs",
+ "sha256": "421EDE0A04C593CA1DF0E6E0D06FABCFCC8113CDBCFB0ADC7F5C8EF4D1724208"
+ },
+ {
+ "path": "crates/oa-core/tests/communication_boundary_scenarios.rs",
+ "sha256": "E1100B8F363910A487D90C73ACC7DF543DC6D532158C3C63AD11CD3D40D8E12B"
+ },
+ {
+ "path": "crates/oa-core/tests/communication_means.rs",
+ "sha256": "A25F2749180BC6F4BEB1445BFAD3351EEDF0669131A7439B633AB804439E95A4"
+ },
+ {
+ "path": "crates/oa-core/tests/coverage_diagnostics.rs",
+ "sha256": "E2E9C3996DAAB47F2BD23F5D8C48B4E372AF33331152F5FC85B76F06D04FCDF4"
+ },
+ {
+ "path": "crates/oa-core/tests/language.rs",
+ "sha256": "77F6CB2A69976BFB5F60B243B71C07FB0EDC7505002C1E9E73FCD6DDF6D9496E"
+ },
+ {
+ "path": "crates/oa-core/tests/port_anchors.rs",
+ "sha256": "EFBC0FA18733B1AAAC501F9785A4C392FC49C05C45A5778D26E9B5DD951CA6FA"
+ },
+ {
+ "path": "crates/oa-core/tests/port_migration.rs",
+ "sha256": "1801C376A5435AC7EFB2A8342348B2C7FFEF930BBA65DECA4ACB66B06E0483D7"
+ },
+ {
+ "path": "crates/oa-core/tests/port_source.rs",
+ "sha256": "8D2DDACA4045D330F6EDA2591561497B858AAD53769A823249D0BEA4F5916E12"
+ },
+ {
+ "path": "crates/oa-core/tests/prepared_commands.rs",
+ "sha256": "52CAB1C668064777412DF0A6A3C20D74D579B33794B4B00525B9F151C06EAC9B"
+ },
+ {
+ "path": "crates/oa-core/tests/process_diagnostics.rs",
+ "sha256": "1DBBC590239EF7542BE4A2BDC9543AAA64D108417B03DD312A0894E364745906"
+ },
+ {
+ "path": "crates/oa-core/tests/r3_constructor_ack.rs",
+ "sha256": "E5C44676EA0AAB97F2E091DDAC2F4BC4A4A90F5877F7BBF08B61229600944DD0"
+ },
+ {
+ "path": "crates/oa-core/tests/r3_migration.rs",
+ "sha256": "EBD04120F5215B3956FDC79EE78F6E38734C7D13392F1FC28AABA957912265BD"
+ },
+ {
+ "path": "crates/oa-core/tests/r3_semantic.rs",
+ "sha256": "49C3763EAF2131070A7C46CC23A84F917D292D41610B6404510E5607F8890C32"
+ },
+ {
+ "path": "crates/oa-core/tests/r3_source.rs",
+ "sha256": "F31F60659DF3C7EF601650D1CFF140589D8729F01A3F65A4A6A6C2272F15C408"
+ },
+ {
+ "path": "crates/oa-core/tests/r6_data.rs",
+ "sha256": "5F7FFB3BC73C3C85423623FE56F8680646DC97040327BDBEAD9D47A37E80F155"
+ },
+ {
+ "path": "crates/oa-core/tests/r6_migration.rs",
+ "sha256": "81519BC1512F5E069432E9A1CDAD04C10216D492DF01B4B75B02102480EBD6A1"
+ },
+ {
+ "path": "crates/oa-core/tests/r6_source.rs",
+ "sha256": "88A0AA087A7678E2898FF6057538072CA92072190712F05FFF08372CC56EBED6"
+ },
+ {
+ "path": "crates/oa-core/tests/release_capabilities.rs",
+ "sha256": "B92CBA2A562E78287DDD7DC3E94557848D17FAA0C8A102601B50286B9AF48A30"
+ },
+ {
+ "path": "crates/oa-core/tests/release_diagrams.rs",
+ "sha256": "CEFCC0582D91266D5DE6EE5DAEFCFE41B606AB971AB235B59034A8E1DBC24B7D"
+ },
+ {
+ "path": "crates/oa-core/tests/release_language_limits.rs",
+ "sha256": "8578DA4F76BBD2D0E1BFE295AB1259E2162A3FE3D0D2BA8901915D7A40942806"
+ },
+ {
+ "path": "crates/oa-core/tests/release_ports.rs",
+ "sha256": "506E62BEAB0C7EC0CECE83E9E0C1A810FA1F99285C9E1CAB0C77F06DE55A40E1"
+ },
+ {
+ "path": "crates/oa-core/tests/release_routing.rs",
+ "sha256": "AE168FAABA23769B7CA1FD65F217B9DB671726E67276EB5A04E5E72B1447A462"
+ },
+ {
+ "path": "crates/oa-core/tests/release_scenarios.rs",
+ "sha256": "0F5D876BADEEC653FC7B12610A77D867E9A53582E605253DEFF8D379DA21572F"
+ },
+ {
+ "path": "crates/oa-core/tests/release_states.rs",
+ "sha256": "B1A26ACEE95EABA7F9920F9DA738A1E33606552EB078E6D298895DAFF7E3D811"
+ },
+ {
+ "path": "crates/oa-core/tests/release_topology.rs",
+ "sha256": "C51DBE5AA5A038F9ED830DAA02AA67714472179EB7FD6DA5CE36DC6931C8B3A9"
+ },
+ {
+ "path": "crates/oa-core/tests/release1_teaching.rs",
+ "sha256": "BE179290D871125DC97CFD2A3067C7AC89C8A538FDB0AFAFC5B825BCDFB2BEF2"
+ },
+ {
+ "path": "crates/oa-core/tests/review_regressions.rs",
+ "sha256": "F154E5C88D35E31512E2B07733A1327EA3E2FCFD1EF8EB23066A4E9573F387C1"
+ },
+ {
+ "path": "crates/oa-core/tests/route_source.rs",
+ "sha256": "1A73FDBAC0D0AE0E84D8D67B6AD398E11223958F5DCA007F73757C91827DECFB"
+ },
+ {
+ "path": "crates/oa-core/tests/routing_geometry.rs",
+ "sha256": "2D8EEA4A2BBA535ED0EA6DAABCCDAF87B375828C404BAA10518C7BD7FD6253D3"
+ },
+ {
+ "path": "crates/oa-core/tests/routing_labels.rs",
+ "sha256": "DFF884D799C3C5C9257210248C55767E294E3CB317C605CBD0DDC9600C216EB6"
+ },
+ {
+ "path": "crates/oa-core/tests/semantic_artifact_absence_oracle.rs",
+ "sha256": "D93EAF9667F4221232168BEF0FE9F069E5BE1B1F23410BDA5DD67010B96E5C8A"
+ },
+ {
+ "path": "crates/oa-core/tests/semantic_attachments_gui_oracle.rs",
+ "sha256": "7F526D363BA05E7AC89FAF0FEAD0796E419C34EE204EDF44A1B46C78308B0970"
+ },
+ {
+ "path": "crates/oa-core/tests/source_files.rs",
+ "sha256": "F0429A0B89A443458EA9AF7083C1E4E7411417A7E6B47E618BFBB9266DC164F9"
+ },
+ {
+ "path": "crates/oa-core/tests/source_identity_updates.rs",
+ "sha256": "F52AA38B4D317E532C641AD7463472E4B40E802E60052CF0017556FFC63DA06C"
+ },
+ {
+ "path": "crates/oa-core/tests/source_nested_updates.rs",
+ "sha256": "9AC3390936C0D250651EA94A1B8FAF0ADFB680F061ECECC56F2A52909B5BA855"
+ },
+ {
+ "path": "crates/oa-core/tests/source_project.rs",
+ "sha256": "CEF58ADB16AA4D2527DDC0628AEC3E26F0B42B4BE70014A7E360FAFDAC13A942"
+ },
+ {
+ "path": "crates/oa-core/tests/source6_view_contract.rs",
+ "sha256": "FA566DE53946D40BBBD9033EDFEED177180C4DC44AFA2F2F4667FFDC622EB3BB"
+ },
+ {
+ "path": "crates/oa-core/tests/source7_contract.rs",
+ "sha256": "CAD4F1A135DDBD947BDF3C71D1B44F1E438725095EA8C4D893464BC721C2363F"
+ },
+ {
+ "path": "crates/oa-core/tests/state_diagrams.rs",
+ "sha256": "6B02B387A3AE559CB3AD72DE24292A5ABCB76AAAC0ADBAB5D2AA5211B22CD2E5"
+ },
+ {
+ "path": "crates/oa-core/tests/workflows.rs",
+ "sha256": "BD843DFDDBD5724EC08F657571F887496203056FE2FA5864EF50A168A613B89B"
+ }
+ ],
+ "build": {
+ "started": "2026-09-11T09:02:48.6509187Z",
+ "exitCode": 0,
+ "finished": "2026-09-11T09:02:51.6243422Z"
+ },
+ "executableSha256": "3ADC6F980C2F185AAA41BEC2148066ADFAD54729EDAB1AD4144E4AA1F7E7B684",
+ "command": "rustc --edition 2024 -D warnings --crate-name constructor_defaults_probe harness/experiments/constructor-defaults-20260911/probe.rs --extern oa_core=.local/target-gnullvm/debug/deps/liboa_core-3e81c616fea1d901.rlib -L dependency=.local/target-gnullvm/debug/deps -C linker=clang.exe -o .local/constructor-defaults-20260911/probe.exe",
+ "compiler": [
+ "rustc 1.98.1 (48a229cea 2026-09-01)",
+ "binary: rustc",
+ "commit-hash: 48a229ceaefd4985c50990b14116b6d856af0985",
+ "commit-date: 2026-09-01",
+ "host: x86_64-pc-windows-gnullvm",
+ "release: 1.98.1",
+ "LLVM version: 22.1.8"
+ ]
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-Action-explicit.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-Action-explicit.arcadia
new file mode 100644
index 00000000..3b5cd336
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-Action-explicit.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ oa_process owner "Owner" id "00000000-0000-4000-8000-000000000002" { steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { Action { action none; lifeline none; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-Action-explicit.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-Action-explicit.canonical.arcadia
new file mode 100644
index 00000000..c8bdf8ee
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-Action-explicit.canonical.arcadia
@@ -0,0 +1,24 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ oa_process owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ description "";
+ parent none;
+ steps [@subject];
+ }
+
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ Action {
+ action none;
+ lifeline none;
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-Action-omit-action.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-Action-omit-action.arcadia
new file mode 100644
index 00000000..1be81cc2
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-Action-omit-action.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ oa_process owner "Owner" id "00000000-0000-4000-8000-000000000002" { steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { Action { lifeline none; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-Action-omit-action.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-Action-omit-action.canonical.arcadia
new file mode 100644
index 00000000..c8bdf8ee
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-Action-omit-action.canonical.arcadia
@@ -0,0 +1,24 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ oa_process owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ description "";
+ parent none;
+ steps [@subject];
+ }
+
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ Action {
+ action none;
+ lifeline none;
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-Action-omit-all-optional.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-Action-omit-all-optional.arcadia
new file mode 100644
index 00000000..7ce2cae4
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-Action-omit-all-optional.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ oa_process owner "Owner" id "00000000-0000-4000-8000-000000000002" { steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { Action { }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-Action-omit-all-optional.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-Action-omit-all-optional.canonical.arcadia
new file mode 100644
index 00000000..c8bdf8ee
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-Action-omit-all-optional.canonical.arcadia
@@ -0,0 +1,24 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ oa_process owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ description "";
+ parent none;
+ steps [@subject];
+ }
+
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ Action {
+ action none;
+ lifeline none;
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-Action-omit-lifeline.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-Action-omit-lifeline.arcadia
new file mode 100644
index 00000000..5a3e348f
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-Action-omit-lifeline.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ oa_process owner "Owner" id "00000000-0000-4000-8000-000000000002" { steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { Action { action none; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-Action-omit-lifeline.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-Action-omit-lifeline.canonical.arcadia
new file mode 100644
index 00000000..c8bdf8ee
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-Action-omit-lifeline.canonical.arcadia
@@ -0,0 +1,24 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ oa_process owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ description "";
+ parent none;
+ steps [@subject];
+ }
+
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ Action {
+ action none;
+ lifeline none;
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-Branch-explicit.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-Branch-explicit.arcadia
new file mode 100644
index 00000000..26b49934
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-Branch-explicit.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ oa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" { viewpoint OperationalActivity; steps [@holder]; }
+ oa_occurrence holder "Fragment owner" id "00000000-0000-4000-8000-000000000004" { parent @owner; body { Fragment { operator Alternative; branches [@subject]; }; }; }
+ // Authored omissions must stay omitted through no-op and a name edit.
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @holder; body { Branch { guard ""; occurrences []; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-Branch-explicit.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-Branch-explicit.canonical.arcadia
new file mode 100644
index 00000000..2c886470
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-Branch-explicit.canonical.arcadia
@@ -0,0 +1,41 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ oa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ context none;
+ description "";
+ parent none;
+ postcondition "";
+ precondition "";
+ steps [@holder];
+ viewpoint OperationalActivity;
+ }
+
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ Branch {
+ guard "";
+ occurrences [];
+ };
+ };
+ description "";
+ parent @holder;
+ postcondition "";
+ precondition "";
+ }
+
+ oa_occurrence holder "Fragment owner" id "00000000-0000-4000-8000-000000000004" {
+ body {
+ Fragment {
+ branches [@subject];
+ operator Alternative;
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-Branch-omit-guard.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-Branch-omit-guard.arcadia
new file mode 100644
index 00000000..ce90395a
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-Branch-omit-guard.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ oa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" { viewpoint OperationalActivity; steps [@holder]; }
+ oa_occurrence holder "Fragment owner" id "00000000-0000-4000-8000-000000000004" { parent @owner; body { Fragment { operator Alternative; branches [@subject]; }; }; }
+ // Authored omissions must stay omitted through no-op and a name edit.
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @holder; body { Branch { occurrences []; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-Branch-omit-occurrences.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-Branch-omit-occurrences.arcadia
new file mode 100644
index 00000000..53865c64
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-Branch-omit-occurrences.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ oa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" { viewpoint OperationalActivity; steps [@holder]; }
+ oa_occurrence holder "Fragment owner" id "00000000-0000-4000-8000-000000000004" { parent @owner; body { Fragment { operator Alternative; branches [@subject]; }; }; }
+ // Authored omissions must stay omitted through no-op and a name edit.
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @holder; body { Branch { guard ""; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-Control-explicit.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-Control-explicit.arcadia
new file mode 100644
index 00000000..7520d3c1
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-Control-explicit.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ oa_process owner "Owner" id "00000000-0000-4000-8000-000000000002" { steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { Control { kind Choice; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-Control-explicit.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-Control-explicit.canonical.arcadia
new file mode 100644
index 00000000..e924cf4d
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-Control-explicit.canonical.arcadia
@@ -0,0 +1,23 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ oa_process owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ description "";
+ parent none;
+ steps [@subject];
+ }
+
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ Control {
+ kind Choice;
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-Control-omit-kind.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-Control-omit-kind.arcadia
new file mode 100644
index 00000000..6f7834cb
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-Control-omit-kind.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ oa_process owner "Owner" id "00000000-0000-4000-8000-000000000002" { steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { Control { }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-explicit.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-explicit.arcadia
new file mode 100644
index 00000000..d33e840d
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-explicit.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ oa_process owner "Owner" id "00000000-0000-4000-8000-000000000002" { steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { Exchange { exchange none; sender none; receiver none; message_kind Asynchronous; reply_to none; values []; operation none; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-explicit.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-explicit.canonical.arcadia
new file mode 100644
index 00000000..a5a1336e
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-explicit.canonical.arcadia
@@ -0,0 +1,28 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ oa_process owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ description "";
+ parent none;
+ steps [@subject];
+ }
+
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ Exchange {
+ exchange none;
+ message_kind Asynchronous;
+ receiver none;
+ reply_to none;
+ sender none;
+ values [];
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-all-optional.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-all-optional.arcadia
new file mode 100644
index 00000000..44259c8c
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-all-optional.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ oa_process owner "Owner" id "00000000-0000-4000-8000-000000000002" { steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { Exchange { }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-all-optional.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-all-optional.canonical.arcadia
new file mode 100644
index 00000000..a5a1336e
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-all-optional.canonical.arcadia
@@ -0,0 +1,28 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ oa_process owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ description "";
+ parent none;
+ steps [@subject];
+ }
+
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ Exchange {
+ exchange none;
+ message_kind Asynchronous;
+ receiver none;
+ reply_to none;
+ sender none;
+ values [];
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-exchange.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-exchange.arcadia
new file mode 100644
index 00000000..21b3fa80
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-exchange.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ oa_process owner "Owner" id "00000000-0000-4000-8000-000000000002" { steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { Exchange { sender none; receiver none; message_kind Asynchronous; reply_to none; values []; operation none; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-exchange.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-exchange.canonical.arcadia
new file mode 100644
index 00000000..a5a1336e
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-exchange.canonical.arcadia
@@ -0,0 +1,28 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ oa_process owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ description "";
+ parent none;
+ steps [@subject];
+ }
+
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ Exchange {
+ exchange none;
+ message_kind Asynchronous;
+ receiver none;
+ reply_to none;
+ sender none;
+ values [];
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-message_kind.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-message_kind.arcadia
new file mode 100644
index 00000000..9b5e7349
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-message_kind.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ oa_process owner "Owner" id "00000000-0000-4000-8000-000000000002" { steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { Exchange { exchange none; sender none; receiver none; reply_to none; values []; operation none; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-message_kind.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-message_kind.canonical.arcadia
new file mode 100644
index 00000000..a5a1336e
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-message_kind.canonical.arcadia
@@ -0,0 +1,28 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ oa_process owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ description "";
+ parent none;
+ steps [@subject];
+ }
+
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ Exchange {
+ exchange none;
+ message_kind Asynchronous;
+ receiver none;
+ reply_to none;
+ sender none;
+ values [];
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-operation.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-operation.arcadia
new file mode 100644
index 00000000..9fcee778
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-operation.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ oa_process owner "Owner" id "00000000-0000-4000-8000-000000000002" { steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { Exchange { exchange none; sender none; receiver none; message_kind Asynchronous; reply_to none; values []; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-operation.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-operation.canonical.arcadia
new file mode 100644
index 00000000..a5a1336e
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-operation.canonical.arcadia
@@ -0,0 +1,28 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ oa_process owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ description "";
+ parent none;
+ steps [@subject];
+ }
+
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ Exchange {
+ exchange none;
+ message_kind Asynchronous;
+ receiver none;
+ reply_to none;
+ sender none;
+ values [];
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-receiver.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-receiver.arcadia
new file mode 100644
index 00000000..efe42b53
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-receiver.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ oa_process owner "Owner" id "00000000-0000-4000-8000-000000000002" { steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { Exchange { exchange none; sender none; message_kind Asynchronous; reply_to none; values []; operation none; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-receiver.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-receiver.canonical.arcadia
new file mode 100644
index 00000000..a5a1336e
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-receiver.canonical.arcadia
@@ -0,0 +1,28 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ oa_process owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ description "";
+ parent none;
+ steps [@subject];
+ }
+
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ Exchange {
+ exchange none;
+ message_kind Asynchronous;
+ receiver none;
+ reply_to none;
+ sender none;
+ values [];
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-reply_to.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-reply_to.arcadia
new file mode 100644
index 00000000..cd340b11
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-reply_to.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ oa_process owner "Owner" id "00000000-0000-4000-8000-000000000002" { steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { Exchange { exchange none; sender none; receiver none; message_kind Asynchronous; values []; operation none; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-reply_to.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-reply_to.canonical.arcadia
new file mode 100644
index 00000000..a5a1336e
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-reply_to.canonical.arcadia
@@ -0,0 +1,28 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ oa_process owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ description "";
+ parent none;
+ steps [@subject];
+ }
+
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ Exchange {
+ exchange none;
+ message_kind Asynchronous;
+ receiver none;
+ reply_to none;
+ sender none;
+ values [];
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-sender.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-sender.arcadia
new file mode 100644
index 00000000..413da356
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-sender.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ oa_process owner "Owner" id "00000000-0000-4000-8000-000000000002" { steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { Exchange { exchange none; receiver none; message_kind Asynchronous; reply_to none; values []; operation none; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-sender.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-sender.canonical.arcadia
new file mode 100644
index 00000000..a5a1336e
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-sender.canonical.arcadia
@@ -0,0 +1,28 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ oa_process owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ description "";
+ parent none;
+ steps [@subject];
+ }
+
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ Exchange {
+ exchange none;
+ message_kind Asynchronous;
+ receiver none;
+ reply_to none;
+ sender none;
+ values [];
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-values.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-values.arcadia
new file mode 100644
index 00000000..977037ee
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-values.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ oa_process owner "Owner" id "00000000-0000-4000-8000-000000000002" { steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { Exchange { exchange none; sender none; receiver none; message_kind Asynchronous; reply_to none; operation none; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-values.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-values.canonical.arcadia
new file mode 100644
index 00000000..a5a1336e
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-Exchange-omit-values.canonical.arcadia
@@ -0,0 +1,28 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ oa_process owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ description "";
+ parent none;
+ steps [@subject];
+ }
+
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ Exchange {
+ exchange none;
+ message_kind Asynchronous;
+ receiver none;
+ reply_to none;
+ sender none;
+ values [];
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-Fragment-explicit.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-Fragment-explicit.arcadia
new file mode 100644
index 00000000..c40ec1ed
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-Fragment-explicit.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ oa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" { viewpoint OperationalActivity; steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { Fragment { operator Alternative; branches []; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-Fragment-explicit.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-Fragment-explicit.canonical.arcadia
new file mode 100644
index 00000000..4d745be1
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-Fragment-explicit.canonical.arcadia
@@ -0,0 +1,28 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ oa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ context none;
+ description "";
+ parent none;
+ postcondition "";
+ precondition "";
+ steps [@subject];
+ viewpoint OperationalActivity;
+ }
+
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ Fragment {
+ branches [];
+ operator Alternative;
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-Fragment-omit-branches.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-Fragment-omit-branches.arcadia
new file mode 100644
index 00000000..a3de0d0c
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-Fragment-omit-branches.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ oa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" { viewpoint OperationalActivity; steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { Fragment { operator Alternative; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-Fragment-omit-operator.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-Fragment-omit-operator.arcadia
new file mode 100644
index 00000000..85d0bf86
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-Fragment-omit-operator.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ oa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" { viewpoint OperationalActivity; steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { Fragment { branches []; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-ScenarioUse-explicit.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-ScenarioUse-explicit.arcadia
new file mode 100644
index 00000000..82956fd9
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-ScenarioUse-explicit.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ oa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" { viewpoint OperationalActivity; steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { ScenarioUse { scenario none; bindings []; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-ScenarioUse-explicit.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-ScenarioUse-explicit.canonical.arcadia
new file mode 100644
index 00000000..bf812cf6
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-ScenarioUse-explicit.canonical.arcadia
@@ -0,0 +1,28 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ oa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ context none;
+ description "";
+ parent none;
+ postcondition "";
+ precondition "";
+ steps [@subject];
+ viewpoint OperationalActivity;
+ }
+
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ ScenarioUse {
+ bindings [];
+ scenario none;
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-ScenarioUse-omit-all-optional.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-ScenarioUse-omit-all-optional.arcadia
new file mode 100644
index 00000000..12f1faea
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-ScenarioUse-omit-all-optional.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ oa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" { viewpoint OperationalActivity; steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { ScenarioUse { bindings []; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-ScenarioUse-omit-all-optional.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-ScenarioUse-omit-all-optional.canonical.arcadia
new file mode 100644
index 00000000..bf812cf6
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-ScenarioUse-omit-all-optional.canonical.arcadia
@@ -0,0 +1,28 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ oa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ context none;
+ description "";
+ parent none;
+ postcondition "";
+ precondition "";
+ steps [@subject];
+ viewpoint OperationalActivity;
+ }
+
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ ScenarioUse {
+ bindings [];
+ scenario none;
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-ScenarioUse-omit-bindings.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-ScenarioUse-omit-bindings.arcadia
new file mode 100644
index 00000000..ced56bce
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-ScenarioUse-omit-bindings.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ oa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" { viewpoint OperationalActivity; steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { ScenarioUse { scenario none; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-ScenarioUse-omit-scenario.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-ScenarioUse-omit-scenario.arcadia
new file mode 100644
index 00000000..12f1faea
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-ScenarioUse-omit-scenario.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ oa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" { viewpoint OperationalActivity; steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { ScenarioUse { bindings []; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-ScenarioUse-omit-scenario.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-ScenarioUse-omit-scenario.canonical.arcadia
new file mode 100644
index 00000000..bf812cf6
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-ScenarioUse-omit-scenario.canonical.arcadia
@@ -0,0 +1,28 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ oa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ context none;
+ description "";
+ parent none;
+ postcondition "";
+ precondition "";
+ steps [@subject];
+ viewpoint OperationalActivity;
+ }
+
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ ScenarioUse {
+ bindings [];
+ scenario none;
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-SequenceReference-explicit.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-SequenceReference-explicit.arcadia
new file mode 100644
index 00000000..76ddc0f2
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-SequenceReference-explicit.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ oa_process owner "Owner" id "00000000-0000-4000-8000-000000000002" { steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { SequenceReference { sequence none; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-SequenceReference-explicit.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-SequenceReference-explicit.canonical.arcadia
new file mode 100644
index 00000000..4d88c625
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-SequenceReference-explicit.canonical.arcadia
@@ -0,0 +1,23 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ oa_process owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ description "";
+ parent none;
+ steps [@subject];
+ }
+
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ SequenceReference {
+ sequence none;
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-SequenceReference-omit-all-optional.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-SequenceReference-omit-all-optional.arcadia
new file mode 100644
index 00000000..cba4369a
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-SequenceReference-omit-all-optional.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ oa_process owner "Owner" id "00000000-0000-4000-8000-000000000002" { steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { SequenceReference { }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-SequenceReference-omit-all-optional.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-SequenceReference-omit-all-optional.canonical.arcadia
new file mode 100644
index 00000000..4d88c625
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-SequenceReference-omit-all-optional.canonical.arcadia
@@ -0,0 +1,23 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ oa_process owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ description "";
+ parent none;
+ steps [@subject];
+ }
+
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ SequenceReference {
+ sequence none;
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-SequenceReference-omit-sequence.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-SequenceReference-omit-sequence.arcadia
new file mode 100644
index 00000000..cba4369a
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-SequenceReference-omit-sequence.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ oa_process owner "Owner" id "00000000-0000-4000-8000-000000000002" { steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { SequenceReference { }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-SequenceReference-omit-sequence.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-SequenceReference-omit-sequence.canonical.arcadia
new file mode 100644
index 00000000..4d88c625
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-SequenceReference-omit-sequence.canonical.arcadia
@@ -0,0 +1,23 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ oa_process owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ description "";
+ parent none;
+ steps [@subject];
+ }
+
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ SequenceReference {
+ sequence none;
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-State-explicit.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-State-explicit.arcadia
new file mode 100644
index 00000000..54abba22
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-State-explicit.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ oa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" { viewpoint OperationalActivity; steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { State { state none; lifeline none; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-State-explicit.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-State-explicit.canonical.arcadia
new file mode 100644
index 00000000..73cbbd7c
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-State-explicit.canonical.arcadia
@@ -0,0 +1,28 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ oa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ context none;
+ description "";
+ parent none;
+ postcondition "";
+ precondition "";
+ steps [@subject];
+ viewpoint OperationalActivity;
+ }
+
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ State {
+ lifeline none;
+ state none;
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-State-omit-all-optional.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-State-omit-all-optional.arcadia
new file mode 100644
index 00000000..2609c14d
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-State-omit-all-optional.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ oa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" { viewpoint OperationalActivity; steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { State { }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-State-omit-all-optional.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-State-omit-all-optional.canonical.arcadia
new file mode 100644
index 00000000..73cbbd7c
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-State-omit-all-optional.canonical.arcadia
@@ -0,0 +1,28 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ oa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ context none;
+ description "";
+ parent none;
+ postcondition "";
+ precondition "";
+ steps [@subject];
+ viewpoint OperationalActivity;
+ }
+
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ State {
+ lifeline none;
+ state none;
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-State-omit-lifeline.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-State-omit-lifeline.arcadia
new file mode 100644
index 00000000..4d758c17
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-State-omit-lifeline.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ oa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" { viewpoint OperationalActivity; steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { State { state none; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-State-omit-lifeline.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-State-omit-lifeline.canonical.arcadia
new file mode 100644
index 00000000..73cbbd7c
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-State-omit-lifeline.canonical.arcadia
@@ -0,0 +1,28 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ oa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ context none;
+ description "";
+ parent none;
+ postcondition "";
+ precondition "";
+ steps [@subject];
+ viewpoint OperationalActivity;
+ }
+
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ State {
+ lifeline none;
+ state none;
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-State-omit-state.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-State-omit-state.arcadia
new file mode 100644
index 00000000..f04e1f5e
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-State-omit-state.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ oa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" { viewpoint OperationalActivity; steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { State { lifeline none; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-State-omit-state.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-State-omit-state.canonical.arcadia
new file mode 100644
index 00000000..73cbbd7c
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-State-omit-state.canonical.arcadia
@@ -0,0 +1,28 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ oa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ context none;
+ description "";
+ parent none;
+ postcondition "";
+ precondition "";
+ steps [@subject];
+ viewpoint OperationalActivity;
+ }
+
+ oa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ State {
+ lifeline none;
+ state none;
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-scenario-viewpoint-explicit.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-scenario-viewpoint-explicit.arcadia
new file mode 100644
index 00000000..6d935fc9
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-scenario-viewpoint-explicit.arcadia
@@ -0,0 +1,2 @@
+arcadia 7;
+project defaults "Defaults" id "00000000-0000-4000-8000-000000000001" { oa_scenario scene "Scene" id "00000000-0000-4000-8000-000000000002" { viewpoint MixedLegacy; } }
diff --git a/harness/experiments/constructor-defaults-20260911/results/OA-scenario-viewpoint-omitted.arcadia b/harness/experiments/constructor-defaults-20260911/results/OA-scenario-viewpoint-omitted.arcadia
new file mode 100644
index 00000000..b75d71b5
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/OA-scenario-viewpoint-omitted.arcadia
@@ -0,0 +1,2 @@
+arcadia 7;
+project defaults "Defaults" id "00000000-0000-4000-8000-000000000001" { oa_scenario scene "Scene" id "00000000-0000-4000-8000-000000000002" { } }
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-Action-explicit.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-Action-explicit.arcadia
new file mode 100644
index 00000000..d6fbfaf3
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-Action-explicit.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ sa_functional_chain owner "Owner" id "00000000-0000-4000-8000-000000000002" { steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { Action { action none; lifeline none; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-Action-explicit.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-Action-explicit.canonical.arcadia
new file mode 100644
index 00000000..a893693e
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-Action-explicit.canonical.arcadia
@@ -0,0 +1,24 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ sa_functional_chain owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ description "";
+ parent none;
+ steps [@subject];
+ }
+
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ Action {
+ action none;
+ lifeline none;
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-Action-omit-action.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-Action-omit-action.arcadia
new file mode 100644
index 00000000..e531d27d
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-Action-omit-action.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ sa_functional_chain owner "Owner" id "00000000-0000-4000-8000-000000000002" { steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { Action { lifeline none; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-Action-omit-action.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-Action-omit-action.canonical.arcadia
new file mode 100644
index 00000000..a893693e
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-Action-omit-action.canonical.arcadia
@@ -0,0 +1,24 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ sa_functional_chain owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ description "";
+ parent none;
+ steps [@subject];
+ }
+
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ Action {
+ action none;
+ lifeline none;
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-Action-omit-all-optional.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-Action-omit-all-optional.arcadia
new file mode 100644
index 00000000..70b38048
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-Action-omit-all-optional.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ sa_functional_chain owner "Owner" id "00000000-0000-4000-8000-000000000002" { steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { Action { }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-Action-omit-all-optional.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-Action-omit-all-optional.canonical.arcadia
new file mode 100644
index 00000000..a893693e
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-Action-omit-all-optional.canonical.arcadia
@@ -0,0 +1,24 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ sa_functional_chain owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ description "";
+ parent none;
+ steps [@subject];
+ }
+
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ Action {
+ action none;
+ lifeline none;
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-Action-omit-lifeline.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-Action-omit-lifeline.arcadia
new file mode 100644
index 00000000..20c4bd39
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-Action-omit-lifeline.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ sa_functional_chain owner "Owner" id "00000000-0000-4000-8000-000000000002" { steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { Action { action none; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-Action-omit-lifeline.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-Action-omit-lifeline.canonical.arcadia
new file mode 100644
index 00000000..a893693e
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-Action-omit-lifeline.canonical.arcadia
@@ -0,0 +1,24 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ sa_functional_chain owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ description "";
+ parent none;
+ steps [@subject];
+ }
+
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ Action {
+ action none;
+ lifeline none;
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-Branch-explicit.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-Branch-explicit.arcadia
new file mode 100644
index 00000000..0feb8fc4
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-Branch-explicit.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ sa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" { viewpoint Functional; steps [@holder]; }
+ sa_occurrence holder "Fragment owner" id "00000000-0000-4000-8000-000000000004" { parent @owner; body { Fragment { operator Alternative; branches [@subject]; }; }; }
+ // Authored omissions must stay omitted through no-op and a name edit.
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @holder; body { Branch { guard ""; occurrences []; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-Branch-explicit.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-Branch-explicit.canonical.arcadia
new file mode 100644
index 00000000..bb4af872
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-Branch-explicit.canonical.arcadia
@@ -0,0 +1,41 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ sa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ context none;
+ description "";
+ parent none;
+ postcondition "";
+ precondition "";
+ steps [@holder];
+ viewpoint Functional;
+ }
+
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ Branch {
+ guard "";
+ occurrences [];
+ };
+ };
+ description "";
+ parent @holder;
+ postcondition "";
+ precondition "";
+ }
+
+ sa_occurrence holder "Fragment owner" id "00000000-0000-4000-8000-000000000004" {
+ body {
+ Fragment {
+ branches [@subject];
+ operator Alternative;
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-Branch-omit-guard.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-Branch-omit-guard.arcadia
new file mode 100644
index 00000000..a4849106
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-Branch-omit-guard.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ sa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" { viewpoint Functional; steps [@holder]; }
+ sa_occurrence holder "Fragment owner" id "00000000-0000-4000-8000-000000000004" { parent @owner; body { Fragment { operator Alternative; branches [@subject]; }; }; }
+ // Authored omissions must stay omitted through no-op and a name edit.
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @holder; body { Branch { occurrences []; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-Branch-omit-occurrences.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-Branch-omit-occurrences.arcadia
new file mode 100644
index 00000000..93bc981e
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-Branch-omit-occurrences.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ sa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" { viewpoint Functional; steps [@holder]; }
+ sa_occurrence holder "Fragment owner" id "00000000-0000-4000-8000-000000000004" { parent @owner; body { Fragment { operator Alternative; branches [@subject]; }; }; }
+ // Authored omissions must stay omitted through no-op and a name edit.
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @holder; body { Branch { guard ""; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-Control-explicit.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-Control-explicit.arcadia
new file mode 100644
index 00000000..0b1b01af
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-Control-explicit.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ sa_functional_chain owner "Owner" id "00000000-0000-4000-8000-000000000002" { steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { Control { kind Choice; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-Control-explicit.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-Control-explicit.canonical.arcadia
new file mode 100644
index 00000000..42ec5ae4
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-Control-explicit.canonical.arcadia
@@ -0,0 +1,23 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ sa_functional_chain owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ description "";
+ parent none;
+ steps [@subject];
+ }
+
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ Control {
+ kind Choice;
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-Control-omit-kind.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-Control-omit-kind.arcadia
new file mode 100644
index 00000000..0ddcb907
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-Control-omit-kind.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ sa_functional_chain owner "Owner" id "00000000-0000-4000-8000-000000000002" { steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { Control { }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-explicit.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-explicit.arcadia
new file mode 100644
index 00000000..a46415dd
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-explicit.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ sa_functional_chain owner "Owner" id "00000000-0000-4000-8000-000000000002" { steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { Exchange { exchange none; sender none; receiver none; message_kind Asynchronous; reply_to none; values []; operation none; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-explicit.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-explicit.canonical.arcadia
new file mode 100644
index 00000000..89c53774
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-explicit.canonical.arcadia
@@ -0,0 +1,28 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ sa_functional_chain owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ description "";
+ parent none;
+ steps [@subject];
+ }
+
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ Exchange {
+ exchange none;
+ message_kind Asynchronous;
+ receiver none;
+ reply_to none;
+ sender none;
+ values [];
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-all-optional.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-all-optional.arcadia
new file mode 100644
index 00000000..25483175
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-all-optional.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ sa_functional_chain owner "Owner" id "00000000-0000-4000-8000-000000000002" { steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { Exchange { }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-all-optional.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-all-optional.canonical.arcadia
new file mode 100644
index 00000000..89c53774
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-all-optional.canonical.arcadia
@@ -0,0 +1,28 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ sa_functional_chain owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ description "";
+ parent none;
+ steps [@subject];
+ }
+
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ Exchange {
+ exchange none;
+ message_kind Asynchronous;
+ receiver none;
+ reply_to none;
+ sender none;
+ values [];
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-exchange.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-exchange.arcadia
new file mode 100644
index 00000000..8a3c3354
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-exchange.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ sa_functional_chain owner "Owner" id "00000000-0000-4000-8000-000000000002" { steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { Exchange { sender none; receiver none; message_kind Asynchronous; reply_to none; values []; operation none; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-exchange.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-exchange.canonical.arcadia
new file mode 100644
index 00000000..89c53774
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-exchange.canonical.arcadia
@@ -0,0 +1,28 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ sa_functional_chain owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ description "";
+ parent none;
+ steps [@subject];
+ }
+
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ Exchange {
+ exchange none;
+ message_kind Asynchronous;
+ receiver none;
+ reply_to none;
+ sender none;
+ values [];
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-message_kind.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-message_kind.arcadia
new file mode 100644
index 00000000..17a4e317
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-message_kind.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ sa_functional_chain owner "Owner" id "00000000-0000-4000-8000-000000000002" { steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { Exchange { exchange none; sender none; receiver none; reply_to none; values []; operation none; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-message_kind.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-message_kind.canonical.arcadia
new file mode 100644
index 00000000..89c53774
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-message_kind.canonical.arcadia
@@ -0,0 +1,28 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ sa_functional_chain owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ description "";
+ parent none;
+ steps [@subject];
+ }
+
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ Exchange {
+ exchange none;
+ message_kind Asynchronous;
+ receiver none;
+ reply_to none;
+ sender none;
+ values [];
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-operation.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-operation.arcadia
new file mode 100644
index 00000000..9d645462
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-operation.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ sa_functional_chain owner "Owner" id "00000000-0000-4000-8000-000000000002" { steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { Exchange { exchange none; sender none; receiver none; message_kind Asynchronous; reply_to none; values []; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-operation.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-operation.canonical.arcadia
new file mode 100644
index 00000000..89c53774
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-operation.canonical.arcadia
@@ -0,0 +1,28 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ sa_functional_chain owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ description "";
+ parent none;
+ steps [@subject];
+ }
+
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ Exchange {
+ exchange none;
+ message_kind Asynchronous;
+ receiver none;
+ reply_to none;
+ sender none;
+ values [];
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-receiver.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-receiver.arcadia
new file mode 100644
index 00000000..0cdc0309
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-receiver.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ sa_functional_chain owner "Owner" id "00000000-0000-4000-8000-000000000002" { steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { Exchange { exchange none; sender none; message_kind Asynchronous; reply_to none; values []; operation none; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-receiver.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-receiver.canonical.arcadia
new file mode 100644
index 00000000..89c53774
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-receiver.canonical.arcadia
@@ -0,0 +1,28 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ sa_functional_chain owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ description "";
+ parent none;
+ steps [@subject];
+ }
+
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ Exchange {
+ exchange none;
+ message_kind Asynchronous;
+ receiver none;
+ reply_to none;
+ sender none;
+ values [];
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-reply_to.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-reply_to.arcadia
new file mode 100644
index 00000000..2f8c936b
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-reply_to.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ sa_functional_chain owner "Owner" id "00000000-0000-4000-8000-000000000002" { steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { Exchange { exchange none; sender none; receiver none; message_kind Asynchronous; values []; operation none; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-reply_to.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-reply_to.canonical.arcadia
new file mode 100644
index 00000000..89c53774
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-reply_to.canonical.arcadia
@@ -0,0 +1,28 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ sa_functional_chain owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ description "";
+ parent none;
+ steps [@subject];
+ }
+
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ Exchange {
+ exchange none;
+ message_kind Asynchronous;
+ receiver none;
+ reply_to none;
+ sender none;
+ values [];
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-sender.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-sender.arcadia
new file mode 100644
index 00000000..cc3e3593
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-sender.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ sa_functional_chain owner "Owner" id "00000000-0000-4000-8000-000000000002" { steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { Exchange { exchange none; receiver none; message_kind Asynchronous; reply_to none; values []; operation none; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-sender.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-sender.canonical.arcadia
new file mode 100644
index 00000000..89c53774
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-sender.canonical.arcadia
@@ -0,0 +1,28 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ sa_functional_chain owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ description "";
+ parent none;
+ steps [@subject];
+ }
+
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ Exchange {
+ exchange none;
+ message_kind Asynchronous;
+ receiver none;
+ reply_to none;
+ sender none;
+ values [];
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-values.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-values.arcadia
new file mode 100644
index 00000000..ffee12b8
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-values.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ sa_functional_chain owner "Owner" id "00000000-0000-4000-8000-000000000002" { steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { Exchange { exchange none; sender none; receiver none; message_kind Asynchronous; reply_to none; operation none; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-values.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-values.canonical.arcadia
new file mode 100644
index 00000000..89c53774
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-Exchange-omit-values.canonical.arcadia
@@ -0,0 +1,28 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ sa_functional_chain owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ description "";
+ parent none;
+ steps [@subject];
+ }
+
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ Exchange {
+ exchange none;
+ message_kind Asynchronous;
+ receiver none;
+ reply_to none;
+ sender none;
+ values [];
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-Fragment-explicit.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-Fragment-explicit.arcadia
new file mode 100644
index 00000000..945f14fe
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-Fragment-explicit.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ sa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" { viewpoint Functional; steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { Fragment { operator Alternative; branches []; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-Fragment-explicit.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-Fragment-explicit.canonical.arcadia
new file mode 100644
index 00000000..d06b59d6
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-Fragment-explicit.canonical.arcadia
@@ -0,0 +1,28 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ sa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ context none;
+ description "";
+ parent none;
+ postcondition "";
+ precondition "";
+ steps [@subject];
+ viewpoint Functional;
+ }
+
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ Fragment {
+ branches [];
+ operator Alternative;
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-Fragment-omit-branches.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-Fragment-omit-branches.arcadia
new file mode 100644
index 00000000..ddd550f8
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-Fragment-omit-branches.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ sa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" { viewpoint Functional; steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { Fragment { operator Alternative; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-Fragment-omit-operator.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-Fragment-omit-operator.arcadia
new file mode 100644
index 00000000..d7008ed5
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-Fragment-omit-operator.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ sa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" { viewpoint Functional; steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { Fragment { branches []; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-ScenarioUse-explicit.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-ScenarioUse-explicit.arcadia
new file mode 100644
index 00000000..28270d6b
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-ScenarioUse-explicit.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ sa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" { viewpoint Functional; steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { ScenarioUse { scenario none; bindings []; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-ScenarioUse-explicit.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-ScenarioUse-explicit.canonical.arcadia
new file mode 100644
index 00000000..ecb024d2
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-ScenarioUse-explicit.canonical.arcadia
@@ -0,0 +1,28 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ sa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ context none;
+ description "";
+ parent none;
+ postcondition "";
+ precondition "";
+ steps [@subject];
+ viewpoint Functional;
+ }
+
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ ScenarioUse {
+ bindings [];
+ scenario none;
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-ScenarioUse-omit-all-optional.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-ScenarioUse-omit-all-optional.arcadia
new file mode 100644
index 00000000..6906d729
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-ScenarioUse-omit-all-optional.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ sa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" { viewpoint Functional; steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { ScenarioUse { bindings []; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-ScenarioUse-omit-all-optional.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-ScenarioUse-omit-all-optional.canonical.arcadia
new file mode 100644
index 00000000..ecb024d2
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-ScenarioUse-omit-all-optional.canonical.arcadia
@@ -0,0 +1,28 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ sa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ context none;
+ description "";
+ parent none;
+ postcondition "";
+ precondition "";
+ steps [@subject];
+ viewpoint Functional;
+ }
+
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ ScenarioUse {
+ bindings [];
+ scenario none;
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-ScenarioUse-omit-bindings.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-ScenarioUse-omit-bindings.arcadia
new file mode 100644
index 00000000..f07d3d27
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-ScenarioUse-omit-bindings.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ sa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" { viewpoint Functional; steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { ScenarioUse { scenario none; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-ScenarioUse-omit-scenario.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-ScenarioUse-omit-scenario.arcadia
new file mode 100644
index 00000000..6906d729
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-ScenarioUse-omit-scenario.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ sa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" { viewpoint Functional; steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { ScenarioUse { bindings []; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-ScenarioUse-omit-scenario.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-ScenarioUse-omit-scenario.canonical.arcadia
new file mode 100644
index 00000000..ecb024d2
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-ScenarioUse-omit-scenario.canonical.arcadia
@@ -0,0 +1,28 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ sa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ context none;
+ description "";
+ parent none;
+ postcondition "";
+ precondition "";
+ steps [@subject];
+ viewpoint Functional;
+ }
+
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ ScenarioUse {
+ bindings [];
+ scenario none;
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-SequenceReference-explicit.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-SequenceReference-explicit.arcadia
new file mode 100644
index 00000000..33ae8790
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-SequenceReference-explicit.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ sa_functional_chain owner "Owner" id "00000000-0000-4000-8000-000000000002" { steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { SequenceReference { sequence none; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-SequenceReference-explicit.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-SequenceReference-explicit.canonical.arcadia
new file mode 100644
index 00000000..c8641a6c
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-SequenceReference-explicit.canonical.arcadia
@@ -0,0 +1,23 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ sa_functional_chain owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ description "";
+ parent none;
+ steps [@subject];
+ }
+
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ SequenceReference {
+ sequence none;
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-SequenceReference-omit-all-optional.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-SequenceReference-omit-all-optional.arcadia
new file mode 100644
index 00000000..042133db
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-SequenceReference-omit-all-optional.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ sa_functional_chain owner "Owner" id "00000000-0000-4000-8000-000000000002" { steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { SequenceReference { }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-SequenceReference-omit-all-optional.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-SequenceReference-omit-all-optional.canonical.arcadia
new file mode 100644
index 00000000..c8641a6c
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-SequenceReference-omit-all-optional.canonical.arcadia
@@ -0,0 +1,23 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ sa_functional_chain owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ description "";
+ parent none;
+ steps [@subject];
+ }
+
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ SequenceReference {
+ sequence none;
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-SequenceReference-omit-sequence.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-SequenceReference-omit-sequence.arcadia
new file mode 100644
index 00000000..042133db
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-SequenceReference-omit-sequence.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ sa_functional_chain owner "Owner" id "00000000-0000-4000-8000-000000000002" { steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { SequenceReference { }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-SequenceReference-omit-sequence.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-SequenceReference-omit-sequence.canonical.arcadia
new file mode 100644
index 00000000..c8641a6c
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-SequenceReference-omit-sequence.canonical.arcadia
@@ -0,0 +1,23 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ sa_functional_chain owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ description "";
+ parent none;
+ steps [@subject];
+ }
+
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ SequenceReference {
+ sequence none;
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-State-explicit.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-State-explicit.arcadia
new file mode 100644
index 00000000..0e15faef
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-State-explicit.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ sa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" { viewpoint Functional; steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { State { state none; lifeline none; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-State-explicit.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-State-explicit.canonical.arcadia
new file mode 100644
index 00000000..297d1195
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-State-explicit.canonical.arcadia
@@ -0,0 +1,28 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ sa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ context none;
+ description "";
+ parent none;
+ postcondition "";
+ precondition "";
+ steps [@subject];
+ viewpoint Functional;
+ }
+
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ State {
+ lifeline none;
+ state none;
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-State-omit-all-optional.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-State-omit-all-optional.arcadia
new file mode 100644
index 00000000..47e34183
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-State-omit-all-optional.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ sa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" { viewpoint Functional; steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { State { }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-State-omit-all-optional.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-State-omit-all-optional.canonical.arcadia
new file mode 100644
index 00000000..297d1195
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-State-omit-all-optional.canonical.arcadia
@@ -0,0 +1,28 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ sa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ context none;
+ description "";
+ parent none;
+ postcondition "";
+ precondition "";
+ steps [@subject];
+ viewpoint Functional;
+ }
+
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ State {
+ lifeline none;
+ state none;
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-State-omit-lifeline.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-State-omit-lifeline.arcadia
new file mode 100644
index 00000000..2f094f39
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-State-omit-lifeline.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ sa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" { viewpoint Functional; steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { State { state none; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-State-omit-lifeline.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-State-omit-lifeline.canonical.arcadia
new file mode 100644
index 00000000..297d1195
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-State-omit-lifeline.canonical.arcadia
@@ -0,0 +1,28 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ sa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ context none;
+ description "";
+ parent none;
+ postcondition "";
+ precondition "";
+ steps [@subject];
+ viewpoint Functional;
+ }
+
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ State {
+ lifeline none;
+ state none;
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-State-omit-state.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-State-omit-state.arcadia
new file mode 100644
index 00000000..980c68f7
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-State-omit-state.arcadia
@@ -0,0 +1,7 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ sa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" { viewpoint Functional; steps [@subject]; }
+
+ // Authored omissions must stay omitted through no-op and a name edit.
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" { parent @owner; body { State { lifeline none; }; }; }
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-State-omit-state.canonical.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-State-omit-state.canonical.arcadia
new file mode 100644
index 00000000..297d1195
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-State-omit-state.canonical.arcadia
@@ -0,0 +1,28 @@
+arcadia 7;
+project defaults "Constructor defaults" id "00000000-0000-4000-8000-000000000001" {
+ description "";
+
+ sa_scenario owner "Owner" id "00000000-0000-4000-8000-000000000002" {
+ context none;
+ description "";
+ parent none;
+ postcondition "";
+ precondition "";
+ steps [@subject];
+ viewpoint Functional;
+ }
+
+ sa_occurrence subject "Subject" id "00000000-0000-4000-8000-000000000003" {
+ body {
+ State {
+ lifeline none;
+ state none;
+ };
+ };
+ description "";
+ parent @owner;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-scenario-viewpoint-explicit.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-scenario-viewpoint-explicit.arcadia
new file mode 100644
index 00000000..91a99a41
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-scenario-viewpoint-explicit.arcadia
@@ -0,0 +1,2 @@
+arcadia 7;
+project defaults "Defaults" id "00000000-0000-4000-8000-000000000001" { sa_scenario scene "Scene" id "00000000-0000-4000-8000-000000000002" { viewpoint MixedLegacy; } }
diff --git a/harness/experiments/constructor-defaults-20260911/results/SA-scenario-viewpoint-omitted.arcadia b/harness/experiments/constructor-defaults-20260911/results/SA-scenario-viewpoint-omitted.arcadia
new file mode 100644
index 00000000..ce78dcc4
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/SA-scenario-viewpoint-omitted.arcadia
@@ -0,0 +1,2 @@
+arcadia 7;
+project defaults "Defaults" id "00000000-0000-4000-8000-000000000001" { sa_scenario scene "Scene" id "00000000-0000-4000-8000-000000000002" { } }
diff --git a/harness/experiments/constructor-defaults-20260911/results/results.tsv b/harness/experiments/constructor-defaults-20260911/results/results.tsv
new file mode 100644
index 00000000..98143a80
--- /dev/null
+++ b/harness/experiments/constructor-defaults-20260911/results/results.tsv
@@ -0,0 +1,67 @@
+case layer result detail
+OA-Exchange-explicit OA accept exact Project, raw/no-op/name/canonical; 2 model issues
+OA-Exchange-omit-exchange OA accept exact Project, raw/no-op/name/canonical; 2 model issues
+OA-Exchange-omit-sender OA accept exact Project, raw/no-op/name/canonical; 2 model issues
+OA-Exchange-omit-receiver OA accept exact Project, raw/no-op/name/canonical; 2 model issues
+OA-Exchange-omit-message_kind OA accept exact Project, raw/no-op/name/canonical; 2 model issues
+OA-Exchange-omit-reply_to OA accept exact Project, raw/no-op/name/canonical; 2 model issues
+OA-Exchange-omit-values OA accept exact Project, raw/no-op/name/canonical; 2 model issues
+OA-Exchange-omit-operation OA accept exact Project, raw/no-op/name/canonical; 2 model issues
+OA-Exchange-omit-all-optional OA accept exact Project, raw/no-op/name/canonical; 2 model issues
+OA-Action-explicit OA accept exact Project, raw/no-op/name/canonical; 1 model issues
+OA-Action-omit-action OA accept exact Project, raw/no-op/name/canonical; 1 model issues
+OA-Action-omit-lifeline OA accept exact Project, raw/no-op/name/canonical; 1 model issues
+OA-Action-omit-all-optional OA accept exact Project, raw/no-op/name/canonical; 1 model issues
+OA-State-explicit OA accept exact Project, raw/no-op/name/canonical; 2 model issues
+OA-State-omit-state OA accept exact Project, raw/no-op/name/canonical; 2 model issues
+OA-State-omit-lifeline OA accept exact Project, raw/no-op/name/canonical; 2 model issues
+OA-State-omit-all-optional OA accept exact Project, raw/no-op/name/canonical; 2 model issues
+OA-SequenceReference-explicit OA accept exact Project, raw/no-op/name/canonical; 1 model issues
+OA-SequenceReference-omit-sequence OA accept exact Project, raw/no-op/name/canonical; 1 model issues
+OA-SequenceReference-omit-all-optional OA accept exact Project, raw/no-op/name/canonical; 1 model issues
+OA-ScenarioUse-explicit OA accept exact Project, raw/no-op/name/canonical; 1 model issues
+OA-ScenarioUse-omit-scenario OA accept exact Project, raw/no-op/name/canonical; 1 model issues
+OA-ScenarioUse-omit-bindings OA reject [SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Error, code: "invalid_source", object_id: None, field: None, line: 6, column: 3, message: "missing field `bindings`", span: Span { start: 296, end: 297 } }, related: [] }]
+OA-ScenarioUse-omit-all-optional OA accept exact Project, raw/no-op/name/canonical; 1 model issues
+OA-Control-explicit OA accept exact Project, raw/no-op/name/canonical; 1 model issues
+OA-Control-omit-kind OA reject [SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Error, code: "invalid_source", object_id: None, field: None, line: 6, column: 3, message: "missing field `kind`", span: Span { start: 265, end: 266 } }, related: [] }]
+OA-Fragment-explicit OA accept exact Project, raw/no-op/name/canonical; 0 model issues
+OA-Fragment-omit-operator OA reject [SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Error, code: "invalid_source", object_id: None, field: None, line: 6, column: 3, message: "missing field `operator`", span: Span { start: 296, end: 297 } }, related: [] }]
+OA-Fragment-omit-branches OA reject [SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Error, code: "invalid_source", object_id: None, field: None, line: 6, column: 3, message: "missing field `branches`", span: Span { start: 296, end: 297 } }, related: [] }]
+OA-Branch-explicit OA accept exact Project, raw/no-op/name/canonical; 0 model issues
+OA-Branch-omit-guard OA reject [SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Error, code: "invalid_source", object_id: None, field: None, line: 6, column: 3, message: "missing field `guard`", span: Span { start: 460, end: 461 } }, related: [] }]
+OA-Branch-omit-occurrences OA reject [SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Error, code: "invalid_source", object_id: None, field: None, line: 6, column: 3, message: "missing field `occurrences`", span: Span { start: 460, end: 461 } }, related: [] }]
+OA-scenario-viewpoint OA accept exact MixedLegacy Project, retained omission, canonical roundtrip
+SA-Exchange-explicit SA accept exact Project, raw/no-op/name/canonical; 3 model issues
+SA-Exchange-omit-exchange SA accept exact Project, raw/no-op/name/canonical; 3 model issues
+SA-Exchange-omit-sender SA accept exact Project, raw/no-op/name/canonical; 3 model issues
+SA-Exchange-omit-receiver SA accept exact Project, raw/no-op/name/canonical; 3 model issues
+SA-Exchange-omit-message_kind SA accept exact Project, raw/no-op/name/canonical; 3 model issues
+SA-Exchange-omit-reply_to SA accept exact Project, raw/no-op/name/canonical; 3 model issues
+SA-Exchange-omit-values SA accept exact Project, raw/no-op/name/canonical; 3 model issues
+SA-Exchange-omit-operation SA accept exact Project, raw/no-op/name/canonical; 3 model issues
+SA-Exchange-omit-all-optional SA accept exact Project, raw/no-op/name/canonical; 3 model issues
+SA-Action-explicit SA accept exact Project, raw/no-op/name/canonical; 2 model issues
+SA-Action-omit-action SA accept exact Project, raw/no-op/name/canonical; 2 model issues
+SA-Action-omit-lifeline SA accept exact Project, raw/no-op/name/canonical; 2 model issues
+SA-Action-omit-all-optional SA accept exact Project, raw/no-op/name/canonical; 2 model issues
+SA-State-explicit SA accept exact Project, raw/no-op/name/canonical; 3 model issues
+SA-State-omit-state SA accept exact Project, raw/no-op/name/canonical; 3 model issues
+SA-State-omit-lifeline SA accept exact Project, raw/no-op/name/canonical; 3 model issues
+SA-State-omit-all-optional SA accept exact Project, raw/no-op/name/canonical; 3 model issues
+SA-SequenceReference-explicit SA accept exact Project, raw/no-op/name/canonical; 2 model issues
+SA-SequenceReference-omit-sequence SA accept exact Project, raw/no-op/name/canonical; 2 model issues
+SA-SequenceReference-omit-all-optional SA accept exact Project, raw/no-op/name/canonical; 2 model issues
+SA-ScenarioUse-explicit SA accept exact Project, raw/no-op/name/canonical; 2 model issues
+SA-ScenarioUse-omit-scenario SA accept exact Project, raw/no-op/name/canonical; 2 model issues
+SA-ScenarioUse-omit-bindings SA reject [SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Error, code: "invalid_source", object_id: None, field: None, line: 6, column: 3, message: "missing field `bindings`", span: Span { start: 287, end: 288 } }, related: [] }]
+SA-ScenarioUse-omit-all-optional SA accept exact Project, raw/no-op/name/canonical; 2 model issues
+SA-Control-explicit SA accept exact Project, raw/no-op/name/canonical; 2 model issues
+SA-Control-omit-kind SA reject [SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Error, code: "invalid_source", object_id: None, field: None, line: 6, column: 3, message: "missing field `kind`", span: Span { start: 274, end: 275 } }, related: [] }]
+SA-Fragment-explicit SA accept exact Project, raw/no-op/name/canonical; 1 model issues
+SA-Fragment-omit-operator SA reject [SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Error, code: "invalid_source", object_id: None, field: None, line: 6, column: 3, message: "missing field `operator`", span: Span { start: 287, end: 288 } }, related: [] }]
+SA-Fragment-omit-branches SA reject [SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Error, code: "invalid_source", object_id: None, field: None, line: 6, column: 3, message: "missing field `branches`", span: Span { start: 287, end: 288 } }, related: [] }]
+SA-Branch-explicit SA accept exact Project, raw/no-op/name/canonical; 1 model issues
+SA-Branch-omit-guard SA reject [SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Error, code: "invalid_source", object_id: None, field: None, line: 6, column: 3, message: "missing field `guard`", span: Span { start: 451, end: 452 } }, related: [] }]
+SA-Branch-omit-occurrences SA reject [SourceDiagnostic { path: "project.arcadia", diagnostic: Diagnostic { severity: Error, code: "invalid_source", object_id: None, field: None, line: 6, column: 3, message: "missing field `occurrences`", span: Span { start: 451, end: 452 } }, related: [] }]
+SA-scenario-viewpoint SA accept exact MixedLegacy Project, retained omission, canonical roundtrip
diff --git a/harness/experiments/textual-authoring-20260911/README.md b/harness/experiments/textual-authoring-20260911/README.md
new file mode 100644
index 00000000..c00cd65e
--- /dev/null
+++ b/harness/experiments/textual-authoring-20260911/README.md
@@ -0,0 +1,24 @@
+# Current-source7 authoring probe
+
+Isolated experiment owned by Codex-956atf `/root/requirements_delta`. The complete initial example is `alarm-response.arcadia`; `probe.rs` calls the existing public core. No proposed new syntax is implemented here.
+
+The final run passed with no model warnings on 2026-09-11. See `probe-output.txt` and the parent design report. Generated source alternatives live in `observed/`: open `stabilized.arcadia`, `canonical.arcadia`, `renamed.arcadia` or `reparented.arcadia` individually. The split example consists of `split-entry.arcadia` plus `participants.arcadia`. The six alternatives are not one SourceBundle.
+
+The split-entry snapshot retains the indentation on the blank line left by moving its participant declaration. That trailing whitespace is intentional observed source, not a hand-authored formatting requirement; preserve the snapshot's bytes when using it as evidence.
+
+The reader lease used Rust 1.98.1 gnullvm and core artifact `liboa_core-6c8da57367eec642.rlib`, SHA-256 `D7EFB5F3C423FF8AF13637F53CC481502C7F317BF01E9D072F9EFD64CD954C13`. Root retains Cargo/build ownership. The temporary probe executable was removed; no target artifact was changed.
+
+From the repository root, after the build owner identifies the matching artifact and grants a reader lease:
+
+```powershell
+. .local\toolchain\env.ps1
+$authoringCore = (Get-Item -LiteralPath 'target\debug\deps\liboa_core-6c8da57367eec642.rlib').FullName
+$authoringDeps = Join-Path (Get-Location) 'target\debug\deps'
+$authoringProbe = Join-Path (Get-Location) 'harness\experiments\textual-authoring-20260911\probe.exe'
+rustc --edition=2024 'harness\experiments\textual-authoring-20260911\probe.rs' --extern "oa_core=$authoringCore" -L "dependency=$authoringDeps" -C linker=clang.exe -o $authoringProbe
+if ($LASTEXITCODE -ne 0) { throw 'Probe compilation failed' }
+& $authoringProbe 'harness\experiments\textual-authoring-20260911\alarm-response.arcadia' 'harness\experiments\textual-authoring-20260911\observed-rerun'
+if ($LASTEXITCODE -ne 0) { throw 'Probe assertions failed' }
+```
+
+Each run intentionally authors a new model from omitted IDs, so regenerated UUID bytes differ across runs. Assertions test stable identity only after adopting that run's accepted bundle. The retained `observed/` snapshots are the exact final run, not deterministic UUID fixtures. The probe does not test HTTP/native UI, save recovery, performance or a new grammar.
diff --git a/harness/experiments/textual-authoring-20260911/alarm-response.arcadia b/harness/experiments/textual-authoring-20260911/alarm-response.arcadia
new file mode 100644
index 00000000..f401ca54
--- /dev/null
+++ b/harness/experiments/textual-authoring-20260911/alarm-response.arcadia
@@ -0,0 +1,110 @@
+arcadia 7;
+project alarm_response "Alarm response" {
+ description "A complete small OA/SA source-authoring example. Numerical annotations are descriptive.";
+
+ oa_actor plant_operator "Plant operator" {}
+ oa_entity maintenance "Maintenance team" {}
+ oa_activity manage_alarm "Manage a pressure alarm" {
+ oa_activity detect_alarm "Detect alarm" {}
+ // Assessing the alarm is work decomposition, independently allocated below.
+ oa_activity assess_alarm "Assess alarm" {}
+ }
+ oa_capability safe_response "Respond safely" {}
+ oa_exchange_item alarm_report "Alarm report" {
+ mechanism Flow;
+ oa_data_field reported_pressure "Reported pressure" {
+ type_ref Real;
+ unit "kPa";
+ }
+ }
+ allocation operator_detects "Operator detects" {
+ source @plant_operator; target @detect_alarm;
+ }
+ allocation team_assesses "Team assesses" {
+ source @maintenance; target @assess_alarm;
+ }
+ interaction alarm_message "Pressure alarm report" {
+ source @detect_alarm; target @assess_alarm; items [@alarm_report];
+ }
+ capability_involvement assessment_supports_response "Assessment supports safe response" {
+ source @assess_alarm; target @safe_response;
+ }
+
+ oa_process triage "Alarm triage" {
+ steps [@detect_once, @assess_once];
+ oa_occurrence detect_once "Detect this alarm" {
+ body { Action { action @detect_alarm; lifeline none; }; };
+ }
+ oa_occurrence assess_once "Assess this alarm" {
+ body { Action { action @assess_alarm; lifeline none; }; };
+ }
+ }
+ sequence_link assessment_after_detection "Assess after detecting" {
+ source @detect_once; target @assess_once;
+ }
+ chain_involvement triage_supports_response "Triage supports safe response" {
+ source @triage; target @safe_response;
+ }
+
+ oa_scenario notification "Alarm notification" {
+ viewpoint OperationalActivity;
+ context @safe_response;
+ steps [@notify_once];
+ oa_lifeline detector_line "Detector" { represented @detect_alarm; }
+ oa_lifeline assessor_line "Assessor" { represented @assess_alarm; }
+ oa_occurrence notify_once "Report this pressure" {
+ body { Exchange {
+ exchange @alarm_message; sender @detector_line; receiver @assessor_line;
+ message_kind Asynchronous; reply_to none;
+ values [{ field @reported_pressure; path []; expression "420"; }];
+ }; };
+ }
+ }
+
+ sa_system alarm_console "Alarm console" {
+ sa_state_machine console_status "Console status" {
+ sa_region console_region "Main region" {
+ sa_initial console_start "Start" {}
+ sa_state console_ready "Ready" {}
+ sa_state console_alerting "Alerting" {}
+ }
+ }
+ }
+ sa_function classify_alarm "Classify alarm" {}
+ sa_functional_chain classification_flow "Alarm classification" {
+ steps [@classify_once];
+ sa_occurrence classify_once "Classify this alarm" {
+ body { Action { action @classify_alarm; lifeline none; }; };
+ }
+ }
+ allocation console_classifies "Console classifies" {
+ source @alarm_console; target @classify_alarm;
+ }
+ sa_event alarm_received "Alarm received" {}
+ state_transition initialize_console "Initialize" {
+ source @console_start; target @console_ready;
+ }
+ state_transition display_alarm "Display alarm" {
+ source @console_ready; target @console_alerting; triggers [@alarm_received];
+ }
+ trace assessment_refinement "Alarm classification refines assessment" {
+ oa @assess_alarm; sa @classify_alarm;
+ baseline {
+ oa { name "Assess alarm"; description ""; };
+ sa { name "Classify alarm"; description ""; };
+ };
+ }
+ artifact response_procedure "Response procedure" {
+ owner @assess_alarm; uri "procedures/alarm-response.md"; revision "review-1";
+ }
+
+ diagram response_view "Operational work" { projection FunctionalDataflow; }
+ node detector_card {
+ diagram @response_view; element @detect_alarm;
+ position { x 40; y 40; };
+ }
+ node assessor_card {
+ diagram @response_view; element @assess_alarm;
+ position { x 400; y 40; };
+ }
+}
diff --git a/harness/experiments/textual-authoring-20260911/observed/canonical.arcadia b/harness/experiments/textual-authoring-20260911/observed/canonical.arcadia
new file mode 100644
index 00000000..d4c5ff26
--- /dev/null
+++ b/harness/experiments/textual-authoring-20260911/observed/canonical.arcadia
@@ -0,0 +1,344 @@
+arcadia 7;
+project alarm_response "Alarm response" id "a0f5c4c2-f39c-4095-9816-71f1862e24d8" {
+ description "A complete small OA/SA source-authoring example. Numerical annotations are descriptive.";
+
+ oa_exchange_item alarm_report "Alarm report" id "0a48a460-964a-4578-97c4-428707e8b201" {
+ description "";
+ kind Information;
+ mechanism Flow;
+ parent none;
+ supertype none;
+ }
+
+ oa_data_field reported_pressure "Reported pressure" id "0bf7f442-cc8d-4782-ba65-f357e91fd477" {
+ default none;
+ description "";
+ direction Unspecified;
+ maximum 1;
+ minimum 1;
+ parent @alarm_report;
+ storage Value;
+ type_ref Real;
+ unit "kPa";
+ }
+
+ oa_lifeline assessor_line "Assessor" id "1b421446-9d17-4c8b-90f1-6fbe8b513a04" {
+ description "";
+ parent @notification;
+ represented @assess_alarm;
+ }
+
+ oa_activity manage_alarm "Manage a pressure alarm" id "4154bf39-9fd5-490e-aebf-fba3d67b697c" {
+ description "";
+ parent none;
+ }
+
+ sa_state console_alerting "Alerting" id "4d167878-2bbe-4acd-abd6-ee7dcd42ec50" {
+ description "";
+ do_activity "";
+ entry "";
+ exit "";
+ kind State;
+ parent @console_region;
+ }
+
+ oa_occurrence assess_once "Assess this alarm" id "528d1c78-62d9-4e45-bb4a-cf529d8ed4a9" {
+ body {
+ Action {
+ action @assess_alarm;
+ lifeline none;
+ };
+ };
+ description "";
+ parent @triage;
+ postcondition "";
+ precondition "";
+ }
+
+ sa_functional_chain classification_flow "Alarm classification" id "578dbcd5-3c28-43d8-913e-af27bc51ebde" {
+ description "";
+ parent none;
+ steps [@classify_once];
+ }
+
+ oa_lifeline detector_line "Detector" id "57c62024-6d19-4818-ac8c-66fb4a9b3da7" {
+ description "";
+ parent @notification;
+ represented @detect_alarm;
+ }
+
+ sa_initial console_start "Start" id "5a92c3a8-6af5-452a-849e-c2a17dc33260" {
+ description "";
+ do_activity "";
+ entry "";
+ exit "";
+ kind Initial;
+ parent @console_region;
+ }
+
+ oa_actor plant_operator "Plant operator" id "60539571-2921-4e7d-ab83-bae670d0cb15" {
+ description "";
+ parent none;
+ }
+
+ oa_scenario notification "Alarm notification" id "69e23f04-7bb3-4db1-a2a3-d8e65101c546" {
+ context @safe_response;
+ description "";
+ parent none;
+ postcondition "";
+ precondition "";
+ steps [@notify_once];
+ viewpoint OperationalActivity;
+ }
+
+ oa_entity maintenance "Maintenance team" id "6af96577-1b04-4ba1-b91b-6cef61adc6d6" {
+ description "";
+ parent none;
+ }
+
+ oa_occurrence detect_once "Detect this alarm" id "6ca87cbe-9579-49b3-884e-e6ee63ba8c5b" {
+ body {
+ Action {
+ action @detect_alarm;
+ lifeline none;
+ };
+ };
+ description "";
+ parent @triage;
+ postcondition "";
+ precondition "";
+ }
+
+ sa_event alarm_received "Alarm received" id "7fba860a-721f-4da2-8315-010de2e9c69e" {
+ body {
+ Signal {
+ items [];
+ };
+ };
+ description "";
+ parent none;
+ }
+
+ oa_activity assess_alarm "Assess alarm" id "8cbd5a4f-1c31-49c9-8a01-987144ce962e" {
+ description "";
+ parent @manage_alarm;
+ }
+
+ sa_state console_ready "Ready" id "9064a197-96ea-4bdf-9dd6-2e9ef66856d8" {
+ description "";
+ do_activity "";
+ entry "";
+ exit "";
+ kind State;
+ parent @console_region;
+ }
+
+ oa_process triage "Alarm triage" id "9888d781-09f3-4861-b9dc-7a97080d24d6" {
+ description "";
+ parent none;
+ steps [@detect_once, @assess_once];
+ }
+
+ sa_system alarm_console "Alarm console" id "9ea585b5-be12-4204-8909-02ea9bed49f0" {
+ description "";
+ parent none;
+ }
+
+ oa_occurrence notify_once "Report this pressure" id "a1c37b31-41ed-4e16-a243-a50702ff1bc1" {
+ body {
+ Exchange {
+ exchange @alarm_message;
+ message_kind Asynchronous;
+ receiver @assessor_line;
+ reply_to none;
+ sender @detector_line;
+ values [{
+ expression "420";
+ field @reported_pressure;
+ path [];
+ }];
+ };
+ };
+ description "";
+ parent @notification;
+ postcondition "";
+ precondition "";
+ }
+
+ sa_occurrence classify_once "Classify this alarm" id "a6c37863-8e72-44f9-a8a3-fea06341c714" {
+ body {
+ Action {
+ action @classify_alarm;
+ lifeline none;
+ };
+ };
+ description "";
+ parent @classification_flow;
+ postcondition "";
+ precondition "";
+ }
+
+ sa_state_machine console_status "Console status" id "a6c6f463-5c80-4b02-a2e6-67cd0088b2f2" {
+ description "";
+ parent @alarm_console;
+ }
+
+ sa_function classify_alarm "Classify alarm" id "ad6941ee-f900-4a2b-a368-d8879f1ffece" {
+ description "";
+ parent none;
+ }
+
+ oa_activity detect_alarm "Detect alarm" id "bf9e9d8a-edb2-47f4-93f9-7ae373c42160" {
+ description "";
+ parent @manage_alarm;
+ }
+
+ oa_capability safe_response "Respond safely" id "c097b1b5-45dc-49de-bcf6-89b5ccb752d1" {
+ description "";
+ parent none;
+ }
+
+ sa_region console_region "Main region" id "e8b62edc-2233-4ec4-a811-2e8baf81a6e9" {
+ description "";
+ parent @console_status;
+ }
+
+ interaction alarm_message "Pressure alarm report" id "269e5bdd-2478-4a43-9c77-84d99ac4e8a6" {
+ description "";
+ items [@alarm_report];
+ source @detect_alarm;
+ target @assess_alarm;
+ }
+
+ capability_involvement assessment_supports_response "Assessment supports safe response" id "27633a6d-d962-4d19-9367-9ca3f00de0b0" {
+ description "";
+ source @assess_alarm;
+ target @safe_response;
+ }
+
+ allocation console_classifies "Console classifies" id "294d4262-303f-41db-b01e-fe47c1647693" {
+ description "";
+ source @alarm_console;
+ target @classify_alarm;
+ }
+
+ chain_involvement triage_supports_response "Triage supports safe response" id "2aeba184-bf69-49c7-87ff-cc2da82b006c" {
+ description "";
+ source @triage;
+ target @safe_response;
+ }
+
+ state_transition initialize_console "Initialize" id "839d4359-c78f-414b-867e-5b40b1f145cc" {
+ description "";
+ effect "";
+ effects [];
+ guard "";
+ source @console_start;
+ target @console_ready;
+ transition_kind External;
+ trigger "";
+ triggers [];
+ }
+
+ allocation operator_detects "Operator detects" id "8653fb7d-529d-495d-abde-897dee36b4bb" {
+ description "";
+ source @plant_operator;
+ target @detect_alarm;
+ }
+
+ allocation team_assesses "Team assesses" id "bb36afbf-9878-401b-b172-d04b08ecf603" {
+ description "";
+ source @maintenance;
+ target @assess_alarm;
+ }
+
+ sequence_link assessment_after_detection "Assess after detecting" id "bfd9c0e7-832b-4983-90aa-fc37d23193e2" {
+ description "";
+ guard "";
+ source @detect_once;
+ target @assess_once;
+ }
+
+ state_transition display_alarm "Display alarm" id "dd383165-1b89-46b9-8ae3-80a6b6406a4e" {
+ description "";
+ effect "";
+ effects [];
+ guard "";
+ source @console_ready;
+ target @console_alerting;
+ transition_kind External;
+ trigger "";
+ triggers [@alarm_received];
+ }
+
+ diagram response_view "Operational work" id "a44d9d69-78a0-49de-8eb8-3757aa6c0919" {
+ description "";
+ layer Oa;
+ projection FunctionalDataflow;
+ routes [];
+ view_options {
+ coverage "All";
+ exchange_labels "Name";
+ hidden_edges [];
+ participant_categories "All";
+ relation_kinds "All";
+ work_categories "All";
+ work_contexts "All";
+ };
+ }
+
+ node detector_card id "45f016f4-3558-45b9-9559-da8ef9d5dcad" {
+ collapsed false;
+ diagram @response_view;
+ element @detect_alarm;
+ position {
+ x 40.0;
+ y 40.0;
+ };
+ size {
+ height 94.0;
+ width 224.0;
+ };
+ }
+
+ node assessor_card id "6ee7a0cc-013b-4a0f-8cff-513872e028b7" {
+ collapsed false;
+ diagram @response_view;
+ element @assess_alarm;
+ position {
+ x 400.0;
+ y 40.0;
+ };
+ size {
+ height 94.0;
+ width 224.0;
+ };
+ }
+
+ artifact response_procedure "Response procedure" id "6ba54037-c6f1-495b-ba96-6f2e910a218c" {
+ description "";
+ fragment none;
+ owner @assess_alarm;
+ relation References;
+ revision "review-1";
+ uri "procedures/alarm-response.md";
+ }
+
+ trace assessment_refinement "Alarm classification refines assessment" id "34142333-67c2-4972-a64f-47e140ed93ca" {
+ baseline {
+ oa {
+ description "";
+ name "Assess alarm";
+ };
+ sa {
+ description "";
+ name "Classify alarm";
+ };
+ };
+ description "";
+ kind Refinement;
+ oa @assess_alarm;
+ sa @classify_alarm;
+ }
+
+}
diff --git a/harness/experiments/textual-authoring-20260911/observed/participants.arcadia b/harness/experiments/textual-authoring-20260911/observed/participants.arcadia
new file mode 100644
index 00000000..2d350787
--- /dev/null
+++ b/harness/experiments/textual-authoring-20260911/observed/participants.arcadia
@@ -0,0 +1 @@
+oa_actor plant_operator "Plant operator" id "60539571-2921-4e7d-ab83-bae670d0cb15" {}
diff --git a/harness/experiments/textual-authoring-20260911/observed/renamed.arcadia b/harness/experiments/textual-authoring-20260911/observed/renamed.arcadia
new file mode 100644
index 00000000..71b2aa4c
--- /dev/null
+++ b/harness/experiments/textual-authoring-20260911/observed/renamed.arcadia
@@ -0,0 +1,110 @@
+arcadia 7;
+project alarm_response "Alarm response" id "a0f5c4c2-f39c-4095-9816-71f1862e24d8" {
+ description "A complete small OA/SA source-authoring example. Numerical annotations are descriptive.";
+
+ oa_actor plant_operator "Plant operator" id "60539571-2921-4e7d-ab83-bae670d0cb15" {}
+ oa_entity maintenance "Maintenance team" id "6af96577-1b04-4ba1-b91b-6cef61adc6d6" {}
+ oa_activity manage_alarm "Manage a pressure alarm" id "4154bf39-9fd5-490e-aebf-fba3d67b697c" {
+ oa_activity detect_alarm "Detect alarm" id "bf9e9d8a-edb2-47f4-93f9-7ae373c42160" {}
+ // Assessing the alarm is work decomposition, independently allocated below.
+ oa_activity review_alarm "Assess alarm" id "8cbd5a4f-1c31-49c9-8a01-987144ce962e" {}
+ }
+ oa_capability safe_response "Respond safely" id "c097b1b5-45dc-49de-bcf6-89b5ccb752d1" {}
+ oa_exchange_item alarm_report "Alarm report" id "0a48a460-964a-4578-97c4-428707e8b201" {
+ mechanism Flow;
+ oa_data_field reported_pressure "Reported pressure" id "0bf7f442-cc8d-4782-ba65-f357e91fd477" {
+ type_ref Real;
+ unit "kPa";
+ }
+ }
+ allocation operator_detects "Operator detects" id "8653fb7d-529d-495d-abde-897dee36b4bb" {
+ source @plant_operator; target @detect_alarm;
+ }
+ allocation team_assesses "Team assesses" id "bb36afbf-9878-401b-b172-d04b08ecf603" {
+ source @maintenance; target @review_alarm;
+ }
+ interaction alarm_message "Pressure alarm report" id "269e5bdd-2478-4a43-9c77-84d99ac4e8a6" {
+ source @detect_alarm; target @review_alarm; items [@alarm_report];
+ }
+ capability_involvement assessment_supports_response "Assessment supports safe response" id "27633a6d-d962-4d19-9367-9ca3f00de0b0" {
+ source @review_alarm; target @safe_response;
+ }
+
+ oa_process triage "Alarm triage" id "9888d781-09f3-4861-b9dc-7a97080d24d6" {
+ steps [@detect_once, @assess_once];
+ oa_occurrence detect_once "Detect this alarm" id "6ca87cbe-9579-49b3-884e-e6ee63ba8c5b" {
+ body { Action { action @detect_alarm; lifeline none; }; };
+ }
+ oa_occurrence assess_once "Assess this alarm" id "528d1c78-62d9-4e45-bb4a-cf529d8ed4a9" {
+ body { Action { action @review_alarm; lifeline none; }; };
+ }
+ }
+ sequence_link assessment_after_detection "Assess after detecting" id "bfd9c0e7-832b-4983-90aa-fc37d23193e2" {
+ source @detect_once; target @assess_once;
+ }
+ chain_involvement triage_supports_response "Triage supports safe response" id "2aeba184-bf69-49c7-87ff-cc2da82b006c" {
+ source @triage; target @safe_response;
+ }
+
+ oa_scenario notification "Alarm notification" id "69e23f04-7bb3-4db1-a2a3-d8e65101c546" {
+ viewpoint OperationalActivity;
+ context @safe_response;
+ steps [@notify_once];
+ oa_lifeline detector_line "Detector" id "57c62024-6d19-4818-ac8c-66fb4a9b3da7" { represented @detect_alarm; }
+ oa_lifeline assessor_line "Assessor" id "1b421446-9d17-4c8b-90f1-6fbe8b513a04" { represented @review_alarm; }
+ oa_occurrence notify_once "Report this pressure" id "a1c37b31-41ed-4e16-a243-a50702ff1bc1" {
+ body { Exchange {
+ exchange @alarm_message; sender @detector_line; receiver @assessor_line;
+ message_kind Asynchronous; reply_to none;
+ values [{ field @reported_pressure; path []; expression "420"; }];
+ }; };
+ }
+ }
+
+ sa_system alarm_console "Alarm console" id "9ea585b5-be12-4204-8909-02ea9bed49f0" {
+ sa_state_machine console_status "Console status" id "a6c6f463-5c80-4b02-a2e6-67cd0088b2f2" {
+ sa_region console_region "Main region" id "e8b62edc-2233-4ec4-a811-2e8baf81a6e9" {
+ sa_initial console_start "Start" id "5a92c3a8-6af5-452a-849e-c2a17dc33260" {}
+ sa_state console_ready "Ready" id "9064a197-96ea-4bdf-9dd6-2e9ef66856d8" {}
+ sa_state console_alerting "Alerting" id "4d167878-2bbe-4acd-abd6-ee7dcd42ec50" {}
+ }
+ }
+ }
+ sa_function classify_alarm "Classify alarm" id "ad6941ee-f900-4a2b-a368-d8879f1ffece" {}
+ sa_functional_chain classification_flow "Alarm classification" id "578dbcd5-3c28-43d8-913e-af27bc51ebde" {
+ steps [@classify_once];
+ sa_occurrence classify_once "Classify this alarm" id "a6c37863-8e72-44f9-a8a3-fea06341c714" {
+ body { Action { action @classify_alarm; lifeline none; }; };
+ }
+ }
+ allocation console_classifies "Console classifies" id "294d4262-303f-41db-b01e-fe47c1647693" {
+ source @alarm_console; target @classify_alarm;
+ }
+ sa_event alarm_received "Alarm received" id "7fba860a-721f-4da2-8315-010de2e9c69e" {}
+ state_transition initialize_console "Initialize" id "839d4359-c78f-414b-867e-5b40b1f145cc" {
+ source @console_start; target @console_ready;
+ }
+ state_transition display_alarm "Display alarm" id "dd383165-1b89-46b9-8ae3-80a6b6406a4e" {
+ source @console_ready; target @console_alerting; triggers [@alarm_received];
+ }
+ trace assessment_refinement "Alarm classification refines assessment" id "34142333-67c2-4972-a64f-47e140ed93ca" {
+ oa @review_alarm; sa @classify_alarm;
+ baseline {
+ oa { name "Assess alarm"; description ""; };
+ sa { name "Classify alarm"; description ""; };
+ };
+ }
+ artifact response_procedure "Response procedure" id "6ba54037-c6f1-495b-ba96-6f2e910a218c" {
+ owner @review_alarm; uri "procedures/alarm-response.md"; revision "review-1";
+ }
+
+ diagram response_view "Operational work" id "a44d9d69-78a0-49de-8eb8-3757aa6c0919" { projection FunctionalDataflow; }
+ node detector_card id "45f016f4-3558-45b9-9559-da8ef9d5dcad" {
+ diagram @response_view; element @detect_alarm;
+ position { x 40; y 40; };
+ }
+ node assessor_card id "6ee7a0cc-013b-4a0f-8cff-513872e028b7" {
+ diagram @response_view; element @review_alarm;
+ position { x 400; y 40; };
+ }
+}
diff --git a/harness/experiments/textual-authoring-20260911/observed/reparented.arcadia b/harness/experiments/textual-authoring-20260911/observed/reparented.arcadia
new file mode 100644
index 00000000..428ec642
--- /dev/null
+++ b/harness/experiments/textual-authoring-20260911/observed/reparented.arcadia
@@ -0,0 +1,114 @@
+arcadia 7;
+project alarm_response "Alarm response" id "a0f5c4c2-f39c-4095-9816-71f1862e24d8" {
+ description "A complete small OA/SA source-authoring example. Numerical annotations are descriptive.";
+
+ oa_actor plant_operator "Plant operator" id "60539571-2921-4e7d-ab83-bae670d0cb15" {}
+ oa_entity maintenance "Maintenance team" id "6af96577-1b04-4ba1-b91b-6cef61adc6d6" {}
+ oa_activity manage_alarm "Manage a pressure alarm" id "4154bf39-9fd5-490e-aebf-fba3d67b697c" {
+ oa_activity detect_alarm "Detect alarm" id "bf9e9d8a-edb2-47f4-93f9-7ae373c42160" {}
+
+
+
+ }
+ oa_capability safe_response "Respond safely" id "c097b1b5-45dc-49de-bcf6-89b5ccb752d1" {}
+ oa_exchange_item alarm_report "Alarm report" id "0a48a460-964a-4578-97c4-428707e8b201" {
+ mechanism Flow;
+ oa_data_field reported_pressure "Reported pressure" id "0bf7f442-cc8d-4782-ba65-f357e91fd477" {
+ type_ref Real;
+ unit "kPa";
+ }
+ }
+ allocation operator_detects "Operator detects" id "8653fb7d-529d-495d-abde-897dee36b4bb" {
+ source @plant_operator; target @detect_alarm;
+ }
+ allocation team_assesses "Team assesses" id "bb36afbf-9878-401b-b172-d04b08ecf603" {
+ source @maintenance; target @assess_alarm;
+ }
+ interaction alarm_message "Pressure alarm report" id "269e5bdd-2478-4a43-9c77-84d99ac4e8a6" {
+ source @detect_alarm; target @assess_alarm; items [@alarm_report];
+ }
+ capability_involvement assessment_supports_response "Assessment supports safe response" id "27633a6d-d962-4d19-9367-9ca3f00de0b0" {
+ source @assess_alarm; target @safe_response;
+ }
+
+ oa_process triage "Alarm triage" id "9888d781-09f3-4861-b9dc-7a97080d24d6" {
+ steps [@detect_once, @assess_once];
+ oa_occurrence detect_once "Detect this alarm" id "6ca87cbe-9579-49b3-884e-e6ee63ba8c5b" {
+ body { Action { action @detect_alarm; lifeline none; }; };
+ }
+ oa_occurrence assess_once "Assess this alarm" id "528d1c78-62d9-4e45-bb4a-cf529d8ed4a9" {
+ body { Action { action @assess_alarm; lifeline none; }; };
+ }
+ }
+ sequence_link assessment_after_detection "Assess after detecting" id "bfd9c0e7-832b-4983-90aa-fc37d23193e2" {
+ source @detect_once; target @assess_once;
+ }
+ chain_involvement triage_supports_response "Triage supports safe response" id "2aeba184-bf69-49c7-87ff-cc2da82b006c" {
+ source @triage; target @safe_response;
+ }
+
+ oa_scenario notification "Alarm notification" id "69e23f04-7bb3-4db1-a2a3-d8e65101c546" {
+ viewpoint OperationalActivity;
+ context @safe_response;
+ steps [@notify_once];
+ oa_lifeline detector_line "Detector" id "57c62024-6d19-4818-ac8c-66fb4a9b3da7" { represented @detect_alarm; }
+ oa_lifeline assessor_line "Assessor" id "1b421446-9d17-4c8b-90f1-6fbe8b513a04" { represented @assess_alarm; }
+ oa_occurrence notify_once "Report this pressure" id "a1c37b31-41ed-4e16-a243-a50702ff1bc1" {
+ body { Exchange {
+ exchange @alarm_message; sender @detector_line; receiver @assessor_line;
+ message_kind Asynchronous; reply_to none;
+ values [{ field @reported_pressure; path []; expression "420"; }];
+ }; };
+ }
+ }
+
+ sa_system alarm_console "Alarm console" id "9ea585b5-be12-4204-8909-02ea9bed49f0" {
+ sa_state_machine console_status "Console status" id "a6c6f463-5c80-4b02-a2e6-67cd0088b2f2" {
+ sa_region console_region "Main region" id "e8b62edc-2233-4ec4-a811-2e8baf81a6e9" {
+ sa_initial console_start "Start" id "5a92c3a8-6af5-452a-849e-c2a17dc33260" {}
+ sa_state console_ready "Ready" id "9064a197-96ea-4bdf-9dd6-2e9ef66856d8" {}
+ sa_state console_alerting "Alerting" id "4d167878-2bbe-4acd-abd6-ee7dcd42ec50" {}
+ }
+ }
+ }
+ sa_function classify_alarm "Classify alarm" id "ad6941ee-f900-4a2b-a368-d8879f1ffece" {}
+ sa_functional_chain classification_flow "Alarm classification" id "578dbcd5-3c28-43d8-913e-af27bc51ebde" {
+ steps [@classify_once];
+ sa_occurrence classify_once "Classify this alarm" id "a6c37863-8e72-44f9-a8a3-fea06341c714" {
+ body { Action { action @classify_alarm; lifeline none; }; };
+ }
+ }
+ allocation console_classifies "Console classifies" id "294d4262-303f-41db-b01e-fe47c1647693" {
+ source @alarm_console; target @classify_alarm;
+ }
+ sa_event alarm_received "Alarm received" id "7fba860a-721f-4da2-8315-010de2e9c69e" {}
+ state_transition initialize_console "Initialize" id "839d4359-c78f-414b-867e-5b40b1f145cc" {
+ source @console_start; target @console_ready;
+ }
+ state_transition display_alarm "Display alarm" id "dd383165-1b89-46b9-8ae3-80a6b6406a4e" {
+ source @console_ready; target @console_alerting; triggers [@alarm_received];
+ }
+ trace assessment_refinement "Alarm classification refines assessment" id "34142333-67c2-4972-a64f-47e140ed93ca" {
+ oa @assess_alarm; sa @classify_alarm;
+ baseline {
+ oa { name "Assess alarm"; description ""; };
+ sa { name "Classify alarm"; description ""; };
+ };
+ }
+ artifact response_procedure "Response procedure" id "6ba54037-c6f1-495b-ba96-6f2e910a218c" {
+ owner @assess_alarm; uri "procedures/alarm-response.md"; revision "review-1";
+ }
+
+ diagram response_view "Operational work" id "a44d9d69-78a0-49de-8eb8-3757aa6c0919" { projection FunctionalDataflow; }
+ node detector_card id "45f016f4-3558-45b9-9559-da8ef9d5dcad" {
+ diagram @response_view; element @detect_alarm;
+ position { x 40; y 40; };
+ }
+ node assessor_card id "6ee7a0cc-013b-4a0f-8cff-513872e028b7" {
+ diagram @response_view; element @assess_alarm;
+ position { x 400; y 40; };
+ }
+
+ // Assessing the alarm is work decomposition, independently allocated below.
+ oa_activity assess_alarm "Assess alarm" id "8cbd5a4f-1c31-49c9-8a01-987144ce962e" {}
+}
diff --git a/harness/experiments/textual-authoring-20260911/observed/split-entry.arcadia b/harness/experiments/textual-authoring-20260911/observed/split-entry.arcadia
new file mode 100644
index 00000000..77c05082
--- /dev/null
+++ b/harness/experiments/textual-authoring-20260911/observed/split-entry.arcadia
@@ -0,0 +1,111 @@
+arcadia 7;
+project alarm_response "Alarm response" id "a0f5c4c2-f39c-4095-9816-71f1862e24d8" {
+ description "A complete small OA/SA source-authoring example. Numerical annotations are descriptive.";
+
+
+ oa_entity maintenance "Maintenance team" id "6af96577-1b04-4ba1-b91b-6cef61adc6d6" {}
+ oa_activity manage_alarm "Manage a pressure alarm" id "4154bf39-9fd5-490e-aebf-fba3d67b697c" {
+ oa_activity detect_alarm "Detect alarm" id "bf9e9d8a-edb2-47f4-93f9-7ae373c42160" {}
+ // Assessing the alarm is work decomposition, independently allocated below.
+ oa_activity assess_alarm "Assess alarm" id "8cbd5a4f-1c31-49c9-8a01-987144ce962e" {}
+ }
+ oa_capability safe_response "Respond safely" id "c097b1b5-45dc-49de-bcf6-89b5ccb752d1" {}
+ oa_exchange_item alarm_report "Alarm report" id "0a48a460-964a-4578-97c4-428707e8b201" {
+ mechanism Flow;
+ oa_data_field reported_pressure "Reported pressure" id "0bf7f442-cc8d-4782-ba65-f357e91fd477" {
+ type_ref Real;
+ unit "kPa";
+ }
+ }
+ allocation operator_detects "Operator detects" id "8653fb7d-529d-495d-abde-897dee36b4bb" {
+ source @plant_operator; target @detect_alarm;
+ }
+ allocation team_assesses "Team assesses" id "bb36afbf-9878-401b-b172-d04b08ecf603" {
+ source @maintenance; target @assess_alarm;
+ }
+ interaction alarm_message "Pressure alarm report" id "269e5bdd-2478-4a43-9c77-84d99ac4e8a6" {
+ source @detect_alarm; target @assess_alarm; items [@alarm_report];
+ }
+ capability_involvement assessment_supports_response "Assessment supports safe response" id "27633a6d-d962-4d19-9367-9ca3f00de0b0" {
+ source @assess_alarm; target @safe_response;
+ }
+
+ oa_process triage "Alarm triage" id "9888d781-09f3-4861-b9dc-7a97080d24d6" {
+ steps [@detect_once, @assess_once];
+ oa_occurrence detect_once "Detect this alarm" id "6ca87cbe-9579-49b3-884e-e6ee63ba8c5b" {
+ body { Action { action @detect_alarm; lifeline none; }; };
+ }
+ oa_occurrence assess_once "Assess this alarm" id "528d1c78-62d9-4e45-bb4a-cf529d8ed4a9" {
+ body { Action { action @assess_alarm; lifeline none; }; };
+ }
+ }
+ sequence_link assessment_after_detection "Assess after detecting" id "bfd9c0e7-832b-4983-90aa-fc37d23193e2" {
+ source @detect_once; target @assess_once;
+ }
+ chain_involvement triage_supports_response "Triage supports safe response" id "2aeba184-bf69-49c7-87ff-cc2da82b006c" {
+ source @triage; target @safe_response;
+ }
+
+ oa_scenario notification "Alarm notification" id "69e23f04-7bb3-4db1-a2a3-d8e65101c546" {
+ viewpoint OperationalActivity;
+ context @safe_response;
+ steps [@notify_once];
+ oa_lifeline detector_line "Detector" id "57c62024-6d19-4818-ac8c-66fb4a9b3da7" { represented @detect_alarm; }
+ oa_lifeline assessor_line "Assessor" id "1b421446-9d17-4c8b-90f1-6fbe8b513a04" { represented @assess_alarm; }
+ oa_occurrence notify_once "Report this pressure" id "a1c37b31-41ed-4e16-a243-a50702ff1bc1" {
+ body { Exchange {
+ exchange @alarm_message; sender @detector_line; receiver @assessor_line;
+ message_kind Asynchronous; reply_to none;
+ values [{ field @reported_pressure; path []; expression "420"; }];
+ }; };
+ }
+ }
+
+ sa_system alarm_console "Alarm console" id "9ea585b5-be12-4204-8909-02ea9bed49f0" {
+ sa_state_machine console_status "Console status" id "a6c6f463-5c80-4b02-a2e6-67cd0088b2f2" {
+ sa_region console_region "Main region" id "e8b62edc-2233-4ec4-a811-2e8baf81a6e9" {
+ sa_initial console_start "Start" id "5a92c3a8-6af5-452a-849e-c2a17dc33260" {}
+ sa_state console_ready "Ready" id "9064a197-96ea-4bdf-9dd6-2e9ef66856d8" {}
+ sa_state console_alerting "Alerting" id "4d167878-2bbe-4acd-abd6-ee7dcd42ec50" {}
+ }
+ }
+ }
+ sa_function classify_alarm "Classify alarm" id "ad6941ee-f900-4a2b-a368-d8879f1ffece" {}
+ sa_functional_chain classification_flow "Alarm classification" id "578dbcd5-3c28-43d8-913e-af27bc51ebde" {
+ steps [@classify_once];
+ sa_occurrence classify_once "Classify this alarm" id "a6c37863-8e72-44f9-a8a3-fea06341c714" {
+ body { Action { action @classify_alarm; lifeline none; }; };
+ }
+ }
+ allocation console_classifies "Console classifies" id "294d4262-303f-41db-b01e-fe47c1647693" {
+ source @alarm_console; target @classify_alarm;
+ }
+ sa_event alarm_received "Alarm received" id "7fba860a-721f-4da2-8315-010de2e9c69e" {}
+ state_transition initialize_console "Initialize" id "839d4359-c78f-414b-867e-5b40b1f145cc" {
+ source @console_start; target @console_ready;
+ }
+ state_transition display_alarm "Display alarm" id "dd383165-1b89-46b9-8ae3-80a6b6406a4e" {
+ source @console_ready; target @console_alerting; triggers [@alarm_received];
+ }
+ trace assessment_refinement "Alarm classification refines assessment" id "34142333-67c2-4972-a64f-47e140ed93ca" {
+ oa @assess_alarm; sa @classify_alarm;
+ baseline {
+ oa { name "Assess alarm"; description ""; };
+ sa { name "Classify alarm"; description ""; };
+ };
+ }
+ artifact response_procedure "Response procedure" id "6ba54037-c6f1-495b-ba96-6f2e910a218c" {
+ owner @assess_alarm; uri "procedures/alarm-response.md"; revision "review-1";
+ }
+
+ diagram response_view "Operational work" id "a44d9d69-78a0-49de-8eb8-3757aa6c0919" { projection FunctionalDataflow; }
+ node detector_card id "45f016f4-3558-45b9-9559-da8ef9d5dcad" {
+ diagram @response_view; element @detect_alarm;
+ position { x 40; y 40; };
+ }
+ node assessor_card id "6ee7a0cc-013b-4a0f-8cff-513872e028b7" {
+ diagram @response_view; element @assess_alarm;
+ position { x 400; y 40; };
+ }
+ include "participants.arcadia";
+}
diff --git a/harness/experiments/textual-authoring-20260911/observed/stabilized.arcadia b/harness/experiments/textual-authoring-20260911/observed/stabilized.arcadia
new file mode 100644
index 00000000..277a663e
--- /dev/null
+++ b/harness/experiments/textual-authoring-20260911/observed/stabilized.arcadia
@@ -0,0 +1,110 @@
+arcadia 7;
+project alarm_response "Alarm response" id "a0f5c4c2-f39c-4095-9816-71f1862e24d8" {
+ description "A complete small OA/SA source-authoring example. Numerical annotations are descriptive.";
+
+ oa_actor plant_operator "Plant operator" id "60539571-2921-4e7d-ab83-bae670d0cb15" {}
+ oa_entity maintenance "Maintenance team" id "6af96577-1b04-4ba1-b91b-6cef61adc6d6" {}
+ oa_activity manage_alarm "Manage a pressure alarm" id "4154bf39-9fd5-490e-aebf-fba3d67b697c" {
+ oa_activity detect_alarm "Detect alarm" id "bf9e9d8a-edb2-47f4-93f9-7ae373c42160" {}
+ // Assessing the alarm is work decomposition, independently allocated below.
+ oa_activity assess_alarm "Assess alarm" id "8cbd5a4f-1c31-49c9-8a01-987144ce962e" {}
+ }
+ oa_capability safe_response "Respond safely" id "c097b1b5-45dc-49de-bcf6-89b5ccb752d1" {}
+ oa_exchange_item alarm_report "Alarm report" id "0a48a460-964a-4578-97c4-428707e8b201" {
+ mechanism Flow;
+ oa_data_field reported_pressure "Reported pressure" id "0bf7f442-cc8d-4782-ba65-f357e91fd477" {
+ type_ref Real;
+ unit "kPa";
+ }
+ }
+ allocation operator_detects "Operator detects" id "8653fb7d-529d-495d-abde-897dee36b4bb" {
+ source @plant_operator; target @detect_alarm;
+ }
+ allocation team_assesses "Team assesses" id "bb36afbf-9878-401b-b172-d04b08ecf603" {
+ source @maintenance; target @assess_alarm;
+ }
+ interaction alarm_message "Pressure alarm report" id "269e5bdd-2478-4a43-9c77-84d99ac4e8a6" {
+ source @detect_alarm; target @assess_alarm; items [@alarm_report];
+ }
+ capability_involvement assessment_supports_response "Assessment supports safe response" id "27633a6d-d962-4d19-9367-9ca3f00de0b0" {
+ source @assess_alarm; target @safe_response;
+ }
+
+ oa_process triage "Alarm triage" id "9888d781-09f3-4861-b9dc-7a97080d24d6" {
+ steps [@detect_once, @assess_once];
+ oa_occurrence detect_once "Detect this alarm" id "6ca87cbe-9579-49b3-884e-e6ee63ba8c5b" {
+ body { Action { action @detect_alarm; lifeline none; }; };
+ }
+ oa_occurrence assess_once "Assess this alarm" id "528d1c78-62d9-4e45-bb4a-cf529d8ed4a9" {
+ body { Action { action @assess_alarm; lifeline none; }; };
+ }
+ }
+ sequence_link assessment_after_detection "Assess after detecting" id "bfd9c0e7-832b-4983-90aa-fc37d23193e2" {
+ source @detect_once; target @assess_once;
+ }
+ chain_involvement triage_supports_response "Triage supports safe response" id "2aeba184-bf69-49c7-87ff-cc2da82b006c" {
+ source @triage; target @safe_response;
+ }
+
+ oa_scenario notification "Alarm notification" id "69e23f04-7bb3-4db1-a2a3-d8e65101c546" {
+ viewpoint OperationalActivity;
+ context @safe_response;
+ steps [@notify_once];
+ oa_lifeline detector_line "Detector" id "57c62024-6d19-4818-ac8c-66fb4a9b3da7" { represented @detect_alarm; }
+ oa_lifeline assessor_line "Assessor" id "1b421446-9d17-4c8b-90f1-6fbe8b513a04" { represented @assess_alarm; }
+ oa_occurrence notify_once "Report this pressure" id "a1c37b31-41ed-4e16-a243-a50702ff1bc1" {
+ body { Exchange {
+ exchange @alarm_message; sender @detector_line; receiver @assessor_line;
+ message_kind Asynchronous; reply_to none;
+ values [{ field @reported_pressure; path []; expression "420"; }];
+ }; };
+ }
+ }
+
+ sa_system alarm_console "Alarm console" id "9ea585b5-be12-4204-8909-02ea9bed49f0" {
+ sa_state_machine console_status "Console status" id "a6c6f463-5c80-4b02-a2e6-67cd0088b2f2" {
+ sa_region console_region "Main region" id "e8b62edc-2233-4ec4-a811-2e8baf81a6e9" {
+ sa_initial console_start "Start" id "5a92c3a8-6af5-452a-849e-c2a17dc33260" {}
+ sa_state console_ready "Ready" id "9064a197-96ea-4bdf-9dd6-2e9ef66856d8" {}
+ sa_state console_alerting "Alerting" id "4d167878-2bbe-4acd-abd6-ee7dcd42ec50" {}
+ }
+ }
+ }
+ sa_function classify_alarm "Classify alarm" id "ad6941ee-f900-4a2b-a368-d8879f1ffece" {}
+ sa_functional_chain classification_flow "Alarm classification" id "578dbcd5-3c28-43d8-913e-af27bc51ebde" {
+ steps [@classify_once];
+ sa_occurrence classify_once "Classify this alarm" id "a6c37863-8e72-44f9-a8a3-fea06341c714" {
+ body { Action { action @classify_alarm; lifeline none; }; };
+ }
+ }
+ allocation console_classifies "Console classifies" id "294d4262-303f-41db-b01e-fe47c1647693" {
+ source @alarm_console; target @classify_alarm;
+ }
+ sa_event alarm_received "Alarm received" id "7fba860a-721f-4da2-8315-010de2e9c69e" {}
+ state_transition initialize_console "Initialize" id "839d4359-c78f-414b-867e-5b40b1f145cc" {
+ source @console_start; target @console_ready;
+ }
+ state_transition display_alarm "Display alarm" id "dd383165-1b89-46b9-8ae3-80a6b6406a4e" {
+ source @console_ready; target @console_alerting; triggers [@alarm_received];
+ }
+ trace assessment_refinement "Alarm classification refines assessment" id "34142333-67c2-4972-a64f-47e140ed93ca" {
+ oa @assess_alarm; sa @classify_alarm;
+ baseline {
+ oa { name "Assess alarm"; description ""; };
+ sa { name "Classify alarm"; description ""; };
+ };
+ }
+ artifact response_procedure "Response procedure" id "6ba54037-c6f1-495b-ba96-6f2e910a218c" {
+ owner @assess_alarm; uri "procedures/alarm-response.md"; revision "review-1";
+ }
+
+ diagram response_view "Operational work" id "a44d9d69-78a0-49de-8eb8-3757aa6c0919" { projection FunctionalDataflow; }
+ node detector_card id "45f016f4-3558-45b9-9559-da8ef9d5dcad" {
+ diagram @response_view; element @detect_alarm;
+ position { x 40; y 40; };
+ }
+ node assessor_card id "6ee7a0cc-013b-4a0f-8cff-513872e028b7" {
+ diagram @response_view; element @assess_alarm;
+ position { x 400; y 40; };
+ }
+}
diff --git a/harness/experiments/textual-authoring-20260911/probe-output.txt b/harness/experiments/textual-authoring-20260911/probe-output.txt
new file mode 100644
index 00000000..941a40fc
--- /dev/null
+++ b/harness/experiments/textual-authoring-20260911/probe-output.txt
@@ -0,0 +1,4 @@
+PASS: admission; stable and canonical round-trip; fresh/stable identity; raw alias rejection; command alias rewrite; nested reparent; cross-file move; source7 default probes
+objects=40 elements=25 relations=9 diagrams=1 artifacts=1 traces=1
+authored_bytes=4373 stable_bytes=6053 canonical_bytes=9710 authored_lines=110 stable_lines=110 canonical_lines=344
+warnings=[]
diff --git a/harness/experiments/textual-authoring-20260911/probe.rs b/harness/experiments/textual-authoring-20260911/probe.rs
new file mode 100644
index 00000000..3588e6b2
--- /dev/null
+++ b/harness/experiments/textual-authoring-20260911/probe.rs
@@ -0,0 +1,107 @@
+//! Isolated reader probe for root's build lease; no production dependencies added.
+//! Usage: probe.exe INPUT.arcadia OUTPUT_DIRECTORY
+use oa_core::{language, source_project::*, *};
+use std::{collections::BTreeMap, path::PathBuf};
+
+fn compile(bundle: &SourceBundle) -> CompiledSourceProject {
+ compile_bundle(bundle, ProjectLimits::default()).unwrap_or_else(|issues| {
+ panic!("source admission failed: {issues:#?}")
+ })
+}
+
+fn identity(project: &Project, alias: &str) -> Id {
+ project.identities().into_iter().find(|(_, name)| *name == alias).unwrap().0
+}
+
+fn main() {
+ let arguments: Vec<_> = std::env::args_os().collect();
+ assert_eq!(arguments.len(), 3, "expected input and isolated output directory");
+ let input = std::fs::read_to_string(&arguments[1]).unwrap();
+ let output = PathBuf::from(&arguments[2]);
+ std::fs::create_dir_all(&output).unwrap();
+ let bundle = SourceBundle {
+ entry: "project.arcadia".into(),
+ files: BTreeMap::from([("project.arcadia".into(), input.clone())]),
+ };
+ let compiled = compile(&bundle);
+ let project = &compiled.decoded.project;
+ assert_eq!(project.schema_version, 7);
+ assert_eq!(project.identities().len(), 40);
+ assert_eq!(compile(&compiled.bundle).decoded.project, *project);
+ assert_eq!(compile(&compiled.bundle).bundle, compiled.bundle);
+ assert_ne!(compile(&bundle).decoded.project.id, project.id);
+
+ let stable = &compiled.bundle.files["project.arcadia"];
+ let canonical = language::format(project);
+ assert_eq!(language::parse(&canonical).unwrap(), *project);
+ assert_eq!(language::format(&language::parse(&canonical).unwrap()), canonical);
+ assert_eq!(stable.matches(" id \"").count(), 40);
+ assert!(stable.contains("// Assessing the alarm is work decomposition"));
+
+ let assess = identity(project, "assess_alarm");
+ let mut header_only = compiled.bundle.clone();
+ header_only.files.get_mut("project.arcadia").unwrap().replace_range(
+ stable.find("oa_activity assess_alarm ").unwrap()
+ ..stable.find("oa_activity assess_alarm ").unwrap() + "oa_activity assess_alarm ".len(),
+ "oa_activity review_alarm ",
+ );
+ assert!(compile_bundle(&header_only, ProjectLimits::default()).is_err());
+
+ let alias_plan = prepare_command(project, &Command::SetAlias(assess, "review_alarm".into())).unwrap();
+ let aliased = update_bundle_with_identity_map(
+ &compiled, &alias_plan.project, &alias_plan.identity_map, ProjectLimits::default(),
+ ).unwrap();
+ assert_eq!(identity(&aliased.decoded.project, "review_alarm"), assess);
+ assert!(!aliased.bundle.files["project.arcadia"].contains("@assess_alarm"));
+ assert!(aliased.bundle.files["project.arcadia"].contains("// Assessing the alarm is work decomposition"));
+
+ let moved_plan = prepare_command(project, &Command::Reparent { element: assess, parent: None }).unwrap();
+ let moved = update_bundle_with_identity_map(
+ &compiled, &moved_plan.project, &moved_plan.identity_map, ProjectLimits::default(),
+ ).unwrap();
+ assert_eq!(moved.decoded.project.elements[&assess].parent, None);
+ assert!(moved.bundle.files["project.arcadia"].contains("// Assessing the alarm is work decomposition"));
+
+ let actor = identity(project, "plant_operator");
+ let location = &compiled.index.declarations[&actor];
+ let actor_text = &stable[location.span.start..location.span.end];
+ let mut split_entry = stable.replacen(actor_text, "", 1);
+ let closing = split_entry.rfind('}').unwrap();
+ split_entry.insert_str(closing, " include \"participants.arcadia\";\n");
+ let split = SourceBundle {
+ entry: "project.arcadia".into(),
+ files: BTreeMap::from([
+ ("project.arcadia".into(), split_entry),
+ ("participants.arcadia".into(), format!("{actor_text}\n")),
+ ]),
+ };
+ assert_eq!(compile(&split).decoded.project, *project);
+
+ let mut missing_viewpoint = compiled.bundle.clone();
+ missing_viewpoint.files.insert("project.arcadia".into(), stable.replace("viewpoint OperationalActivity;", ""));
+ let implicit = compile(&missing_viewpoint);
+ let scenario = identity(project, "notification");
+ assert!(matches!(implicit.decoded.project.elements[&scenario].body.shared(),
+ Some(SharedBody::Scenario { viewpoint: ScenarioViewpoint::MixedLegacy, .. })));
+
+ let mut reduced_message = compiled.bundle.clone();
+ reduced_message.files.insert("project.arcadia".into(), stable
+ .replace("message_kind Asynchronous; reply_to none;", "")
+ .replace("lifeline none;", ""));
+ assert_eq!(compile(&reduced_message).decoded.project, *project);
+
+ std::fs::write(output.join("stabilized.arcadia"), stable).unwrap();
+ std::fs::write(output.join("canonical.arcadia"), &canonical).unwrap();
+ std::fs::write(output.join("renamed.arcadia"), &aliased.bundle.files["project.arcadia"]).unwrap();
+ std::fs::write(output.join("reparented.arcadia"), &moved.bundle.files["project.arcadia"]).unwrap();
+ std::fs::write(output.join("split-entry.arcadia"), &split.files["project.arcadia"]).unwrap();
+ std::fs::write(output.join("participants.arcadia"), &split.files["participants.arcadia"]).unwrap();
+
+ println!("PASS: admission; stable and canonical round-trip; fresh/stable identity; raw alias rejection; command alias rewrite; nested reparent; cross-file move; source7 default probes");
+ println!("objects={} elements={} relations={} diagrams={} artifacts={} traces={}",
+ project.identities().len(), project.elements.len(), project.relations.len(),
+ project.diagrams.len(), project.artifact_links.len(), project.traces.len());
+ println!("authored_bytes={} stable_bytes={} canonical_bytes={} authored_lines={} stable_lines={} canonical_lines={}",
+ input.len(), stable.len(), canonical.len(), input.lines().count(), stable.lines().count(), canonical.lines().count());
+ println!("warnings={:#?}", compiled.diagnostics);
+}
diff --git a/harness/fixtures/behavior-creation/README.md b/harness/fixtures/behavior-creation/README.md
index 6bf9cab7..7f570d5a 100644
--- a/harness/fixtures/behavior-creation/README.md
+++ b/harness/fixtures/behavior-creation/README.md
@@ -3,7 +3,8 @@
Independent checker: `harness/behavior-creation-contract.rs`. The contract was
prepared before reading any created output on 2026-09-11. Its direct-rustc build,
self-check and unchanged-baseline comparison pass; native creation acceptance
-is not implied.
+is not implied. Use the corrected **v2** checker: the initial version published
+in `4bb4aaf` incorrectly rejected files safely retained on disk after Undo.
Use a whole-directory copy of the preserved input:
`.local/native-qa/palette-20260910-v3/checkpoint-transition-reopen/project.arcadia`.
@@ -32,8 +33,8 @@ Build only within a coordinated direct-rustc writer window. This imports
```powershell
. .local/toolchain/env.ps1
-rustc --edition 2024 -D warnings --crate-name behavior_creation_contract harness/behavior-creation-contract.rs --extern oa_core=.local/target-gnullvm/debug/deps/liboa_core-3e81c616fea1d901.rlib -L dependency=.local/target-gnullvm/debug/deps -C linker=clang.exe -o .local/behavior-creation-oracle-20260911/behavior-creation-contract.exe
-$oracle = '.local/behavior-creation-oracle-20260911/behavior-creation-contract.exe'
+rustc --edition 2024 -D warnings --crate-name behavior_creation_contract harness/behavior-creation-contract.rs --extern oa_core=.local/target-gnullvm/debug/deps/liboa_core-3e81c616fea1d901.rlib -L dependency=.local/target-gnullvm/debug/deps -C linker=clang.exe -o .local/behavior-creation-oracle-20260911/behavior-creation-contract-v2.exe
+$oracle = '.local/behavior-creation-oracle-20260911/behavior-creation-contract-v2.exe'
$base = '.local/native-qa/palette-20260910-v3/checkpoint-transition-reopen/project.arcadia'
& $oracle self-check $base
& $oracle check baseline $base $base $base
@@ -42,13 +43,15 @@ $base = '.local/native-qa/palette-20260910-v3/checkpoint-transition-reopen/proje
& $oracle check machine $base PATH_TO_MACHINE_ENTRY PATH_TO_MACHINE_ENTRY
```
-After each creation, Undo once and Save into a fresh checkpoint; `same` must
-compare that checkpoint with the preceding accepted stage (the initial baseline
-for Process). Redo once and Save into another fresh checkpoint. For Redo and
+After each creation, Undo once and Save into a fresh checkpoint; `same` compares
+it with the preceding accepted stage (the initial baseline for Process). Supply
+the first committed creation checkpoint as the explicit `UNDO_FROM` argument:
+the safe saver preserves newly detached files instead of deleting them. Redo
+once and Save into another fresh checkpoint. For Redo and
reopen, pass the **first committed checkpoint** as the final role argument:
```powershell
-& $oracle same PREVIOUS_ACCEPTED_ENTRY UNDO_ENTRY
+& $oracle same PREVIOUS_ACCEPTED_ENTRY UNDO_ENTRY FIRST_COMMITTED_ENTRY
& $oracle check machine $base REDO_ENTRY FIRST_MACHINE_ENTRY
& $oracle same FIRST_MACHINE_ENTRY REOPEN_ENTRY
```
@@ -58,16 +61,29 @@ UUIDs across history; using a redo file as its own role carrier would not prove
identity retention. A cancellation has no predicted addition: compare its
checkpoint with the accepted pre-cancellation checkpoint using `same`.
+For Undo, the complete reachable Project and SourceBundle must still equal the
+previous accepted stage. The complete disk `.arcadia` file map must equal the
+exact `UNDO_FROM` file map with those expected reachable files overlaid. Thus
+only known retained paths with exact previously committed bytes are accepted;
+unknown files, changed or missing retained files, or changed reachable bytes
+fail. The supplied first-commit checkpoint must itself contain exactly its
+reachable files. Ordinary creation, cancellation and reopen checks retain that
+strict file-set rule; there is no arbitrary detached-file exemption.
+
The checker borrows only unique fresh UUIDv4 values with exact literal
kind/layer/name, view projection/name, or diagram/element placement roles.
Descriptions, aliases, parents, viewpoint/context, body defaults and geometry
are independently constructed. It compares complete Project and SourceBundle,
-rejects detached extra `.arcadia` files, and uses pinned six-file byte lengths
+checks the exact disk-file policy above, and uses pinned six-file byte lengths
and FNV-1a fingerprints to refuse a substituted baseline. SHA-256 provenance
is recorded in `harness/release-behavior-creation-oracle-20260911.md`.
Self-checks use deliberately false metadata/geometry in the role carrier, then
reject changed scenario semantics, unrelated edits, extra objects/files and
-source-only comment drift. Native focus, readable labels, minimum/wide layout,
+source-only comment drift. V2 additionally accepts an independently constructed
+valid Undo retention case and rejects unknown, changed or missing detached
+files. The existing immutable transition Undo also passes with four reachable
+sources and six exact disk files; real isolated copies with an unknown or
+modified detached file fail. Native focus, readable labels, minimum/wide layout,
selection of the new owner/view, and one-step Undo/Redo are separate observations;
saved equality alone cannot establish them.
diff --git a/harness/fixtures/scenario-authoring/README.md b/harness/fixtures/scenario-authoring/README.md
new file mode 100644
index 00000000..3c87facb
--- /dev/null
+++ b/harness/fixtures/scenario-authoring/README.md
@@ -0,0 +1,112 @@
+# Scenario authoring native contract
+
+Prepared by Codex-956atf /root/release_audit on 2026-09-10. Root compiled the checker with warnings denied, passed its self-check, generated the deterministic baseline and verified the complete model/source on Windows. **Native Studio execution remains pending.** This fixture/oracle prepares B2 clicked-slot authoring and B3 caller return; it does not establish GUI acceptance.
+
+`harness/scenario-authoring-contract.rs` generates deterministic OA and SA versions of the same small scenario tree. Each has Activity/Function choices, a Ready state, explicit lifelines, two nested ALT fragments, and fixed root/operand insertion anchors. A caller contains two distinct uses of B verification; B uses C detail. Each use explicitly maps both referenced lifelines to distinct local lifelines representing the same work. No native action/state/reuse/fragment role exists in the baseline.
+
+The checked-in `base` directory is the verified fixture. Preserve it and copy the whole directory for native work. To reproduce generation, use a fresh output directory after compiling and self-checking the checker.
+
+## Compile and generate
+
+Use the current matching `oa_core` and `serde_json` rlibs from root's accepted Cargo output. Do not build another Cargo tree or select an arbitrary stale rlib. With root's configured Rust environment and clang linker, substitute the exact recorded paths below:
+
+```powershell
+. .local/toolchain/env.ps1
+$scenarioCore = 'ABSOLUTE_PATH_TO_CURRENT_liboa_core-HASH.rlib'
+$scenarioJson = 'ABSOLUTE_PATH_TO_MATCHING_libserde_json-HASH.rlib'
+$scenarioDeps = [IO.Path]::GetDirectoryName($scenarioCore)
+$scenarioLinker = 'ABSOLUTE_PATH_TO_TOOLCHAIN_clang.exe'
+New-Item -ItemType Directory -Force -Path .local/native-qa | Out-Null
+rustc --edition 2024 -D warnings harness/scenario-authoring-contract.rs --extern "oa_core=$scenarioCore" --extern "serde_json=$scenarioJson" -L "dependency=$scenarioDeps" -C "linker=$scenarioLinker" -o .local/native-qa/scenario-authoring-contract.exe
+.local/native-qa/scenario-authoring-contract.exe self-check
+.local/native-qa/scenario-authoring-contract.exe generate .local/native-qa/scenario-generated
+.local/native-qa/scenario-authoring-contract.exe check baseline .local/native-qa/scenario-generated/project.arcadia
+```
+
+The compiler target must match those rlibs; include root's explicit `--target` if its toolchain setup requires one. Record the exact command, compiler/rlib identities, checker hash and result. Generation refuses any existing output directory. It writes `project.arcadia`, an included Unicode/CRLF `rationale.arcadia`, and `expected-baseline.json`. The JSON is a reference artifact, not an additional source document. The root validation record below supplies the exact first-run identities.
+
+Copy the **whole** generated base into separate fresh OA and SA native working directories. Preserve the base. Each layer's four checkpoints start from that same baseline; `sa-action` does not include the OA creations. Preserve the whole working directory after each declared Save/Undo/Redo checkpoint. Do not modify fixture sources or adjust expected fields to match observed output.
+
+## Fixed locations and choices
+
+The UUID namespace is `5ceaa100-0000-4000-8000-000000000000` plus a deterministic integer. Stable aliases make the intended records easy to confirm in the inspector/source. All labels below have `OA ` or `SA ` prepended.
+
+| Role | OA alias / UUID suffix | SA alias / UUID suffix |
+| --- | --- | --- |
+| A caller | `scenario_oa_30` / `000000000082` | `scenario_sa_30` / `0000000000e6` |
+| B verification | `scenario_oa_31` / `000000000083` | `scenario_sa_31` / `0000000000e7` |
+| C detail | `scenario_oa_32` / `000000000084` | `scenario_sa_32` / `0000000000e8` |
+| Inner chosen operand | `scenario_oa_55` / `00000000009b` | `scenario_sa_55` / `0000000000ff` |
+| Inner anchor | `scenario_oa_57` / `00000000009d` | `scenario_sa_57` / `000000000101` |
+| Root entry / Root exit | `scenario_oa_50` / `scenario_oa_62` | `scenario_sa_50` / `scenario_sa_62` |
+| First use of B / Second use of B | `scenario_oa_60` / `scenario_oa_61` | `scenario_sa_60` / `scenario_sa_61` |
+| B use of C | `scenario_oa_64` | `scenario_sa_64` |
+
+The target operand is **Outer ALT → Outer chosen operand → Inner ALT → Inner chosen operand**. The other inner operand and outer fallback are deliberate nearby decoys. Every sibling's records and order must remain unchanged.
+
+## B3 navigation before editing
+
+Open `project.arcadia`, select **OA A caller**, and open **Behavior**. At normal size and at 1100 × 700, record the actual diagram visibility, selected occurrence, selected tool, canvas scroll and outer page scroll. Native screenshots and observations must establish these UI properties; the source checker cannot observe them.
+
+1. Select **OA Second use of B**, then **Open definition**. In **OA B verification**, select **OA B use of C** and open its definition. **Back to caller** must return first to the exact B use, then to the exact **Second use of B** in A, retaining the caller's tool and canvas/page offsets subject to viewport clamping. The first use is a distinct occurrence, not an interchangeable return address.
+2. Repeat through **OA First use of B**. Also exercise the detailed-list **Open OA B verification →** action for one of those uses; it must retain that initiating occurrence. After Back, ordinary scrolling must continue naturally rather than snapping repeatedly to the restored offset.
+3. Save without edits and run `check baseline ENTRY`. There must be no new model Undo entry from navigation. Repeat the two-use return once in **SA A caller**. No new model or source checkpoint is needed: both layers still equal baseline.
+
+For one blocked navigation case, arm Add action, click a valid slot and type `unfinished native action` without creating it. Attempt Open/Back only if those controls are reachable in that pending state. The draft must remain visible/recoverable or the navigation control must be unavailable. Cancel, Save, and check baseline. Record the actual control availability; do not count an unperformed attempt as a pass.
+
+## B2 four creations per layer
+
+Run the same four steps on the separate OA and SA copies. Replace `XX` below with the literal `OA` or `SA`, and lowercase `xx` in checker modes. Select **XX A caller → Behavior**. The compact selector's currently authored labels are **Add action**, **Observe state**, **Reuse scenario**, and **Add fragment**. Choose the tool and click the prescribed visible insertion slot; do not substitute a Tools append action or repair the destination afterward through the inspector.
+
+Before pressing Create, record the form's destination/before-slot label and selected lifeline. This observation proves which native gesture was performed. Full model/source equality then checks the resulting semantics independently.
+
+| Step / checkpoint | Prescribed click and literal form values | Expected insertion |
+| --- | --- | --- |
+| 1. `xx-action` | **Add action**; click on **XX A inspector** at the root slot before **XX Root entry**. Name `XX native action`; work **XX Inspect ticket**; observed lifeline **XX A inspector**. Create. | New Action is the first A root step, before the original root entry. |
+| 2. `xx-state` | **Observe state**; click in **Inner chosen operand** before **XX Inner anchor**, on **XX A inspector**. Name `XX native state`; state **XX Ready**; observed lifeline **XX A inspector**. Create. | The inner chosen operand becomes `[native state, Inner anchor]`. Both enclosing ALT structures retain their original identities/guards. |
+| 3. `xx-reuse` | **Reuse scenario**; click in that same inner operand before **XX Inner anchor**. Name `XX native reuse`; definition **XX B verification**. Explicitly bind **XX B inspector → XX A inspector** and **XX B recorder → XX A recorder**. Create. | Inner operand becomes `[native state, native reuse, Inner anchor]`. No scenario/lifeline definition is cloned. |
+| 4. `xx-fragment` | **Add fragment**; click the root slot before **XX Root exit**. Name `XX native alternative`; operator **ALT · alternatives**; first guard `ticket.priority > 2`; second guard `ticket.priority <= 2`. Create. | One new root Fragment followed by the original Root exit. Its two new operands are empty and named `XX native alternative · operand 1` and `XX native alternative · operand 2`. Existing occurrences are not wrapped or moved into them. |
+
+Before each Create, retain the previously verified stage's whole-directory snapshot (the generated baseline for step 1). After Create: Save, preserve a new whole-directory snapshot and check the declared checkpoint. Undo once, Save and preserve another copy: check the preceding checkpoint **and require `same PREVIOUS_VERIFIED_ENTRY UNDO_ENTRY`**. Redo once, Save and preserve another copy: check the current checkpoint **and require `same CURRENT_VERIFIED_ENTRY REDO_ENTRY`**. The `same` mode compares every Project identity/field and every SourceBundle byte; rerunning a semantic checkpoint alone permits a new set of fresh UUIDs and cannot prove exact history restoration. Never replace the preserved verified snapshots with their restored copies.
+
+In particular, a fragment's creation and both operands must disappear/reappear in one Undo/Redo step with their original IDs. Reopen the final saved entry, Save and preserve the reopened copy, check `xx-fragment`, and require `same FINAL_VERIFIED_ENTRY REOPENED_ENTRY`. Use the normal Save operation in the working directory; save copies by preserving the whole directory so the included source stays attached.
+
+Example checks for an OA run:
+
+```powershell
+.local/native-qa/scenario-authoring-contract.exe check oa-action PATH_TO_SAVED_project.arcadia
+.local/native-qa/scenario-authoring-contract.exe check baseline PATH_TO_ACTION_UNDO_project.arcadia
+.local/native-qa/scenario-authoring-contract.exe same PATH_TO_VERIFIED_BASELINE_project.arcadia PATH_TO_ACTION_UNDO_project.arcadia
+.local/native-qa/scenario-authoring-contract.exe check oa-action PATH_TO_ACTION_REDO_project.arcadia
+.local/native-qa/scenario-authoring-contract.exe same PATH_TO_VERIFIED_ACTION_project.arcadia PATH_TO_ACTION_REDO_project.arcadia
+.local/native-qa/scenario-authoring-contract.exe check oa-state PATH_TO_SAVED_project.arcadia
+.local/native-qa/scenario-authoring-contract.exe check oa-reuse PATH_TO_SAVED_project.arcadia
+.local/native-qa/scenario-authoring-contract.exe check oa-fragment PATH_TO_REOPENED_project.arcadia
+.local/native-qa/scenario-authoring-contract.exe same PATH_TO_VERIFIED_FRAGMENT_project.arcadia PATH_TO_REOPENED_project.arcadia
+```
+
+One cancellation can be inserted before step 1: arm Observe state and click away from a lifeline. The form must require an explicit observed lifeline; it must not silently choose an unrelated lane. Enter an incomplete name, use the form's **Cancel** control, Save, and check baseline. Exercise Escape separately: current behavior cancels the gesture while preserving the pending scenario form/raw draft; it is not form cancellation. Focus, pending-marker visibility, stable canvas origin, Escape delivery, minimum-size reachability and clicked-slot geometry require separate native observations. Do not infer those from a passing file check.
+
+## Independence and limits
+
+The checker uses only unique **Kind::Occurrence + layer + predetermined literal name** roles to discover fresh UUIDv4 IDs. IDs must be distinct and absent from the deterministic baseline. It independently constructs every other field: body, parent, reference targets, binding order and identities, guards, empty operands, pre/postconditions, description, alias and insertion order. It does not read observed fields into the prediction. Any unclaimed object, sibling edit, wrong destination, binding, name/value or source byte causes full equality to fail.
+
+Expected transactions use core typed commands and source writeback, independently of the desktop planners, then compare the whole Project and the complete reachable two-file SourceBundle. The source oracle deliberately shares the core language engine; this fixture validates native GUI-to-model/source parity rather than supplying an independent language implementation. Semantic checkpoint checks plus required exact saved/restored snapshot comparisons prove state and identity restoration only for the captured Undo/Redo/reopen sequence, not arbitrary history internals.
+
+The self-check covers deterministic seeds, all eight OA/SA checkpoint fixed points, carriers with deliberately false parent/body/alias/description, rejected unrelated edits, wrong insertion order/parent/bindings, and a model-neutral change to the retained note. It also constructs two equivalent valid checkpoints with different fresh action IDs: each passes semantic prediction, while exact `same` snapshot comparison rejects their identity difference. It is not a native UI test. Native action/return/scroll/recovery, screenshot and release evidence remain pending.
+
+## Root validation — 2026-09-10
+
+Source `632c8fe` (checker unchanged from `8547b85`), Rust 1.98.1 target `x86_64-pc-windows-gnullvm`, LLVM-MinGW 20260908 clang 23.1.1. The direct `rustc` command above used the already completed core/JSON rlibs from the active cold desktop build, with no second Cargo writer. Compile with `-D warnings`, `self-check`, `generate`, and `check baseline` all exited 0. Generation reported 62 elements and two reachable sources. The initial PowerShell recipe's incompatible `Split-Path -LiteralPath -Parent` was corrected to `IO.Path.GetDirectoryName` before compilation.
+
+| Artifact | SHA256 |
+| --- | --- |
+| Checker executable `.local/native-qa/scenario-authoring-contract.exe` | `407318D5C7CAE6B237F261A21B0FDA55F6FEF655CB9DFCFA3153A7E372638498` |
+| Checker source working bytes | `3BDA3EBC38E99BB658AD3EB9A5889E9C1CC77E8B1F8609079580AE27A4E8E789` |
+| `liboa_core-6c8da57367eec642.rlib` | `D7EFB5F3C423FF8AF13637F53CC481502C7F317BF01E9D072F9EFD64CD954C13` |
+| `libserde_json-da2c4f333fc47818.rlib` | `485300D4125A69DE7DA5413F832EB4B9CDE547E60F103F3B284E49AEE4194D05` |
+| `base/project.arcadia` | `9B1AFBE96B0BF8FA613451B00929492F05A59B9EB2CA74C2C374A8B7BB7CBA9E` |
+| `base/rationale.arcadia` | `82DF210F22F6AA336A3E7E00240977D671C7C3923DB7BC58FB29E6D98B67EF49` |
+| `base/expected-baseline.json` | `ABD8246C939EBB8A2162EF82E23D0FB322EE1A8B4D0D7C28A34037E42E86E841` |
+
+Logs are `.local/logs/scenario-oracle-{compile,self-check,generate,baseline}.log`. These results validate the independent evaluator and fixture only; the desktop test build was still running and no Studio native pass is transferred from them.
diff --git a/harness/fixtures/scenario-authoring/base/expected-baseline.json b/harness/fixtures/scenario-authoring/base/expected-baseline.json
new file mode 100644
index 00000000..b679ffef
--- /dev/null
+++ b/harness/fixtures/scenario-authoring/base/expected-baseline.json
@@ -0,0 +1,1339 @@
+{
+ "schema_version": 7,
+ "id": "5ceaa100-0000-4000-8000-000000000001",
+ "alias": "scenario_authoring",
+ "name": "Scenario authoring contract",
+ "description": "Native clicked-slot and caller-return contract.",
+ "elements": {
+ "5ceaa100-0000-4000-8000-00000000006e": {
+ "id": "5ceaa100-0000-4000-8000-00000000006e",
+ "alias": "scenario_oa_10",
+ "name": "OA Inspect ticket",
+ "description": "",
+ "parent": null,
+ "body": {
+ "Oa": "Activity"
+ }
+ },
+ "5ceaa100-0000-4000-8000-00000000006f": {
+ "id": "5ceaa100-0000-4000-8000-00000000006f",
+ "alias": "scenario_oa_11",
+ "name": "OA Record result",
+ "description": "",
+ "parent": null,
+ "body": {
+ "Oa": "Activity"
+ }
+ },
+ "5ceaa100-0000-4000-8000-000000000078": {
+ "id": "5ceaa100-0000-4000-8000-000000000078",
+ "alias": "scenario_oa_20",
+ "name": "OA Ticket modes",
+ "description": "",
+ "parent": null,
+ "body": {
+ "Oa": {
+ "Shared": "StateMachine"
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-000000000079": {
+ "id": "5ceaa100-0000-4000-8000-000000000079",
+ "alias": "scenario_oa_21",
+ "name": "OA Ticket region",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-000000000078",
+ "body": {
+ "Oa": {
+ "Shared": "Region"
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-00000000007a": {
+ "id": "5ceaa100-0000-4000-8000-00000000007a",
+ "alias": "scenario_oa_22",
+ "name": "OA Ready",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-000000000079",
+ "body": {
+ "Oa": {
+ "Shared": {
+ "State": {
+ "kind": "State",
+ "entry": "",
+ "exit": "",
+ "do_activity": ""
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-000000000082": {
+ "id": "5ceaa100-0000-4000-8000-000000000082",
+ "alias": "scenario_oa_30",
+ "name": "OA A caller",
+ "description": "",
+ "parent": null,
+ "body": {
+ "Oa": {
+ "Shared": {
+ "Scenario": {
+ "viewpoint": "OperationalActivity",
+ "context": null,
+ "precondition": "",
+ "postcondition": "",
+ "steps": [
+ "5ceaa100-0000-4000-8000-000000000096",
+ "5ceaa100-0000-4000-8000-000000000097",
+ "5ceaa100-0000-4000-8000-0000000000a0",
+ "5ceaa100-0000-4000-8000-0000000000a1",
+ "5ceaa100-0000-4000-8000-0000000000a2"
+ ]
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-000000000083": {
+ "id": "5ceaa100-0000-4000-8000-000000000083",
+ "alias": "scenario_oa_31",
+ "name": "OA B verification",
+ "description": "",
+ "parent": null,
+ "body": {
+ "Oa": {
+ "Shared": {
+ "Scenario": {
+ "viewpoint": "OperationalActivity",
+ "context": null,
+ "precondition": "",
+ "postcondition": "",
+ "steps": [
+ "5ceaa100-0000-4000-8000-0000000000a3",
+ "5ceaa100-0000-4000-8000-0000000000a4",
+ "5ceaa100-0000-4000-8000-0000000000a5"
+ ]
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-000000000084": {
+ "id": "5ceaa100-0000-4000-8000-000000000084",
+ "alias": "scenario_oa_32",
+ "name": "OA C detail",
+ "description": "",
+ "parent": null,
+ "body": {
+ "Oa": {
+ "Shared": {
+ "Scenario": {
+ "viewpoint": "OperationalActivity",
+ "context": null,
+ "precondition": "",
+ "postcondition": "",
+ "steps": [
+ "5ceaa100-0000-4000-8000-0000000000a6"
+ ]
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-00000000008c": {
+ "id": "5ceaa100-0000-4000-8000-00000000008c",
+ "alias": "scenario_oa_40",
+ "name": "OA A inspector",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-000000000082",
+ "body": {
+ "Oa": {
+ "Shared": {
+ "Lifeline": {
+ "represented": "5ceaa100-0000-4000-8000-00000000006e"
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-00000000008d": {
+ "id": "5ceaa100-0000-4000-8000-00000000008d",
+ "alias": "scenario_oa_41",
+ "name": "OA A recorder",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-000000000082",
+ "body": {
+ "Oa": {
+ "Shared": {
+ "Lifeline": {
+ "represented": "5ceaa100-0000-4000-8000-00000000006f"
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-00000000008e": {
+ "id": "5ceaa100-0000-4000-8000-00000000008e",
+ "alias": "scenario_oa_42",
+ "name": "OA B inspector",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-000000000083",
+ "body": {
+ "Oa": {
+ "Shared": {
+ "Lifeline": {
+ "represented": "5ceaa100-0000-4000-8000-00000000006e"
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-00000000008f": {
+ "id": "5ceaa100-0000-4000-8000-00000000008f",
+ "alias": "scenario_oa_43",
+ "name": "OA B recorder",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-000000000083",
+ "body": {
+ "Oa": {
+ "Shared": {
+ "Lifeline": {
+ "represented": "5ceaa100-0000-4000-8000-00000000006f"
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-000000000090": {
+ "id": "5ceaa100-0000-4000-8000-000000000090",
+ "alias": "scenario_oa_44",
+ "name": "OA C inspector",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-000000000084",
+ "body": {
+ "Oa": {
+ "Shared": {
+ "Lifeline": {
+ "represented": "5ceaa100-0000-4000-8000-00000000006e"
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-000000000091": {
+ "id": "5ceaa100-0000-4000-8000-000000000091",
+ "alias": "scenario_oa_45",
+ "name": "OA C recorder",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-000000000084",
+ "body": {
+ "Oa": {
+ "Shared": {
+ "Lifeline": {
+ "represented": "5ceaa100-0000-4000-8000-00000000006f"
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-000000000096": {
+ "id": "5ceaa100-0000-4000-8000-000000000096",
+ "alias": "scenario_oa_50",
+ "name": "OA Root entry",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-000000000082",
+ "body": {
+ "Oa": {
+ "Shared": {
+ "Occurrence": {
+ "body": {
+ "Action": {
+ "action": "5ceaa100-0000-4000-8000-00000000006e",
+ "lifeline": "5ceaa100-0000-4000-8000-00000000008c"
+ }
+ },
+ "precondition": "",
+ "postcondition": ""
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-000000000097": {
+ "id": "5ceaa100-0000-4000-8000-000000000097",
+ "alias": "scenario_oa_51",
+ "name": "OA Outer ALT",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-000000000082",
+ "body": {
+ "Oa": {
+ "Shared": {
+ "Occurrence": {
+ "body": {
+ "Fragment": {
+ "operator": "Alternative",
+ "branches": [
+ "5ceaa100-0000-4000-8000-000000000098",
+ "5ceaa100-0000-4000-8000-000000000099"
+ ]
+ }
+ },
+ "precondition": "",
+ "postcondition": ""
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-000000000098": {
+ "id": "5ceaa100-0000-4000-8000-000000000098",
+ "alias": "scenario_oa_52",
+ "name": "OA Outer chosen operand",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-000000000097",
+ "body": {
+ "Oa": {
+ "Shared": {
+ "Occurrence": {
+ "body": {
+ "Branch": {
+ "guard": "ticket.present",
+ "occurrences": [
+ "5ceaa100-0000-4000-8000-00000000009a"
+ ]
+ }
+ },
+ "precondition": "",
+ "postcondition": ""
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-000000000099": {
+ "id": "5ceaa100-0000-4000-8000-000000000099",
+ "alias": "scenario_oa_53",
+ "name": "OA Outer fallback operand",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-000000000097",
+ "body": {
+ "Oa": {
+ "Shared": {
+ "Occurrence": {
+ "body": {
+ "Branch": {
+ "guard": "else",
+ "occurrences": [
+ "5ceaa100-0000-4000-8000-00000000009f"
+ ]
+ }
+ },
+ "precondition": "",
+ "postcondition": ""
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-00000000009a": {
+ "id": "5ceaa100-0000-4000-8000-00000000009a",
+ "alias": "scenario_oa_54",
+ "name": "OA Inner ALT",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-000000000098",
+ "body": {
+ "Oa": {
+ "Shared": {
+ "Occurrence": {
+ "body": {
+ "Fragment": {
+ "operator": "Alternative",
+ "branches": [
+ "5ceaa100-0000-4000-8000-00000000009b",
+ "5ceaa100-0000-4000-8000-00000000009c"
+ ]
+ }
+ },
+ "precondition": "",
+ "postcondition": ""
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-00000000009b": {
+ "id": "5ceaa100-0000-4000-8000-00000000009b",
+ "alias": "scenario_oa_55",
+ "name": "OA Inner chosen operand",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-00000000009a",
+ "body": {
+ "Oa": {
+ "Shared": {
+ "Occurrence": {
+ "body": {
+ "Branch": {
+ "guard": "ticket.ready",
+ "occurrences": [
+ "5ceaa100-0000-4000-8000-00000000009d"
+ ]
+ }
+ },
+ "precondition": "",
+ "postcondition": ""
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-00000000009c": {
+ "id": "5ceaa100-0000-4000-8000-00000000009c",
+ "alias": "scenario_oa_56",
+ "name": "OA Inner other operand",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-00000000009a",
+ "body": {
+ "Oa": {
+ "Shared": {
+ "Occurrence": {
+ "body": {
+ "Branch": {
+ "guard": "else",
+ "occurrences": [
+ "5ceaa100-0000-4000-8000-00000000009e"
+ ]
+ }
+ },
+ "precondition": "",
+ "postcondition": ""
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-00000000009d": {
+ "id": "5ceaa100-0000-4000-8000-00000000009d",
+ "alias": "scenario_oa_57",
+ "name": "OA Inner anchor",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-00000000009b",
+ "body": {
+ "Oa": {
+ "Shared": {
+ "Occurrence": {
+ "body": {
+ "Action": {
+ "action": "5ceaa100-0000-4000-8000-00000000006e",
+ "lifeline": "5ceaa100-0000-4000-8000-00000000008c"
+ }
+ },
+ "precondition": "",
+ "postcondition": ""
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-00000000009e": {
+ "id": "5ceaa100-0000-4000-8000-00000000009e",
+ "alias": "scenario_oa_58",
+ "name": "OA Inner other anchor",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-00000000009c",
+ "body": {
+ "Oa": {
+ "Shared": {
+ "Occurrence": {
+ "body": {
+ "Action": {
+ "action": "5ceaa100-0000-4000-8000-00000000006e",
+ "lifeline": "5ceaa100-0000-4000-8000-00000000008c"
+ }
+ },
+ "precondition": "",
+ "postcondition": ""
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-00000000009f": {
+ "id": "5ceaa100-0000-4000-8000-00000000009f",
+ "alias": "scenario_oa_59",
+ "name": "OA Fallback anchor",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-000000000099",
+ "body": {
+ "Oa": {
+ "Shared": {
+ "Occurrence": {
+ "body": {
+ "Action": {
+ "action": "5ceaa100-0000-4000-8000-00000000006f",
+ "lifeline": "5ceaa100-0000-4000-8000-00000000008d"
+ }
+ },
+ "precondition": "",
+ "postcondition": ""
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-0000000000a0": {
+ "id": "5ceaa100-0000-4000-8000-0000000000a0",
+ "alias": "scenario_oa_60",
+ "name": "OA First use of B",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-000000000082",
+ "body": {
+ "Oa": {
+ "Shared": {
+ "Occurrence": {
+ "body": {
+ "ScenarioUse": {
+ "scenario": "5ceaa100-0000-4000-8000-000000000083",
+ "bindings": [
+ {
+ "referenced": "5ceaa100-0000-4000-8000-00000000008e",
+ "local": "5ceaa100-0000-4000-8000-00000000008c"
+ },
+ {
+ "referenced": "5ceaa100-0000-4000-8000-00000000008f",
+ "local": "5ceaa100-0000-4000-8000-00000000008d"
+ }
+ ]
+ }
+ },
+ "precondition": "",
+ "postcondition": ""
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-0000000000a1": {
+ "id": "5ceaa100-0000-4000-8000-0000000000a1",
+ "alias": "scenario_oa_61",
+ "name": "OA Second use of B",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-000000000082",
+ "body": {
+ "Oa": {
+ "Shared": {
+ "Occurrence": {
+ "body": {
+ "ScenarioUse": {
+ "scenario": "5ceaa100-0000-4000-8000-000000000083",
+ "bindings": [
+ {
+ "referenced": "5ceaa100-0000-4000-8000-00000000008e",
+ "local": "5ceaa100-0000-4000-8000-00000000008c"
+ },
+ {
+ "referenced": "5ceaa100-0000-4000-8000-00000000008f",
+ "local": "5ceaa100-0000-4000-8000-00000000008d"
+ }
+ ]
+ }
+ },
+ "precondition": "",
+ "postcondition": ""
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-0000000000a2": {
+ "id": "5ceaa100-0000-4000-8000-0000000000a2",
+ "alias": "scenario_oa_62",
+ "name": "OA Root exit",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-000000000082",
+ "body": {
+ "Oa": {
+ "Shared": {
+ "Occurrence": {
+ "body": {
+ "Action": {
+ "action": "5ceaa100-0000-4000-8000-00000000006f",
+ "lifeline": "5ceaa100-0000-4000-8000-00000000008d"
+ }
+ },
+ "precondition": "",
+ "postcondition": ""
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-0000000000a3": {
+ "id": "5ceaa100-0000-4000-8000-0000000000a3",
+ "alias": "scenario_oa_63",
+ "name": "OA B entry",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-000000000083",
+ "body": {
+ "Oa": {
+ "Shared": {
+ "Occurrence": {
+ "body": {
+ "Action": {
+ "action": "5ceaa100-0000-4000-8000-00000000006e",
+ "lifeline": "5ceaa100-0000-4000-8000-00000000008e"
+ }
+ },
+ "precondition": "",
+ "postcondition": ""
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-0000000000a4": {
+ "id": "5ceaa100-0000-4000-8000-0000000000a4",
+ "alias": "scenario_oa_64",
+ "name": "OA B use of C",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-000000000083",
+ "body": {
+ "Oa": {
+ "Shared": {
+ "Occurrence": {
+ "body": {
+ "ScenarioUse": {
+ "scenario": "5ceaa100-0000-4000-8000-000000000084",
+ "bindings": [
+ {
+ "referenced": "5ceaa100-0000-4000-8000-000000000090",
+ "local": "5ceaa100-0000-4000-8000-00000000008e"
+ },
+ {
+ "referenced": "5ceaa100-0000-4000-8000-000000000091",
+ "local": "5ceaa100-0000-4000-8000-00000000008f"
+ }
+ ]
+ }
+ },
+ "precondition": "",
+ "postcondition": ""
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-0000000000a5": {
+ "id": "5ceaa100-0000-4000-8000-0000000000a5",
+ "alias": "scenario_oa_65",
+ "name": "OA B exit",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-000000000083",
+ "body": {
+ "Oa": {
+ "Shared": {
+ "Occurrence": {
+ "body": {
+ "Action": {
+ "action": "5ceaa100-0000-4000-8000-00000000006f",
+ "lifeline": "5ceaa100-0000-4000-8000-00000000008f"
+ }
+ },
+ "precondition": "",
+ "postcondition": ""
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-0000000000a6": {
+ "id": "5ceaa100-0000-4000-8000-0000000000a6",
+ "alias": "scenario_oa_66",
+ "name": "OA C entry",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-000000000084",
+ "body": {
+ "Oa": {
+ "Shared": {
+ "Occurrence": {
+ "body": {
+ "Action": {
+ "action": "5ceaa100-0000-4000-8000-00000000006e",
+ "lifeline": "5ceaa100-0000-4000-8000-000000000090"
+ }
+ },
+ "precondition": "",
+ "postcondition": ""
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-0000000000d2": {
+ "id": "5ceaa100-0000-4000-8000-0000000000d2",
+ "alias": "scenario_sa_10",
+ "name": "SA Inspect ticket",
+ "description": "",
+ "parent": null,
+ "body": {
+ "Sa": "Function"
+ }
+ },
+ "5ceaa100-0000-4000-8000-0000000000d3": {
+ "id": "5ceaa100-0000-4000-8000-0000000000d3",
+ "alias": "scenario_sa_11",
+ "name": "SA Record result",
+ "description": "",
+ "parent": null,
+ "body": {
+ "Sa": "Function"
+ }
+ },
+ "5ceaa100-0000-4000-8000-0000000000dc": {
+ "id": "5ceaa100-0000-4000-8000-0000000000dc",
+ "alias": "scenario_sa_20",
+ "name": "SA Ticket modes",
+ "description": "",
+ "parent": null,
+ "body": {
+ "Sa": {
+ "Shared": "StateMachine"
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-0000000000dd": {
+ "id": "5ceaa100-0000-4000-8000-0000000000dd",
+ "alias": "scenario_sa_21",
+ "name": "SA Ticket region",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-0000000000dc",
+ "body": {
+ "Sa": {
+ "Shared": "Region"
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-0000000000de": {
+ "id": "5ceaa100-0000-4000-8000-0000000000de",
+ "alias": "scenario_sa_22",
+ "name": "SA Ready",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-0000000000dd",
+ "body": {
+ "Sa": {
+ "Shared": {
+ "State": {
+ "kind": "State",
+ "entry": "",
+ "exit": "",
+ "do_activity": ""
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-0000000000e6": {
+ "id": "5ceaa100-0000-4000-8000-0000000000e6",
+ "alias": "scenario_sa_30",
+ "name": "SA A caller",
+ "description": "",
+ "parent": null,
+ "body": {
+ "Sa": {
+ "Shared": {
+ "Scenario": {
+ "viewpoint": "Functional",
+ "context": null,
+ "precondition": "",
+ "postcondition": "",
+ "steps": [
+ "5ceaa100-0000-4000-8000-0000000000fa",
+ "5ceaa100-0000-4000-8000-0000000000fb",
+ "5ceaa100-0000-4000-8000-000000000104",
+ "5ceaa100-0000-4000-8000-000000000105",
+ "5ceaa100-0000-4000-8000-000000000106"
+ ]
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-0000000000e7": {
+ "id": "5ceaa100-0000-4000-8000-0000000000e7",
+ "alias": "scenario_sa_31",
+ "name": "SA B verification",
+ "description": "",
+ "parent": null,
+ "body": {
+ "Sa": {
+ "Shared": {
+ "Scenario": {
+ "viewpoint": "Functional",
+ "context": null,
+ "precondition": "",
+ "postcondition": "",
+ "steps": [
+ "5ceaa100-0000-4000-8000-000000000107",
+ "5ceaa100-0000-4000-8000-000000000108",
+ "5ceaa100-0000-4000-8000-000000000109"
+ ]
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-0000000000e8": {
+ "id": "5ceaa100-0000-4000-8000-0000000000e8",
+ "alias": "scenario_sa_32",
+ "name": "SA C detail",
+ "description": "",
+ "parent": null,
+ "body": {
+ "Sa": {
+ "Shared": {
+ "Scenario": {
+ "viewpoint": "Functional",
+ "context": null,
+ "precondition": "",
+ "postcondition": "",
+ "steps": [
+ "5ceaa100-0000-4000-8000-00000000010a"
+ ]
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-0000000000f0": {
+ "id": "5ceaa100-0000-4000-8000-0000000000f0",
+ "alias": "scenario_sa_40",
+ "name": "SA A inspector",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-0000000000e6",
+ "body": {
+ "Sa": {
+ "Shared": {
+ "Lifeline": {
+ "represented": "5ceaa100-0000-4000-8000-0000000000d2"
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-0000000000f1": {
+ "id": "5ceaa100-0000-4000-8000-0000000000f1",
+ "alias": "scenario_sa_41",
+ "name": "SA A recorder",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-0000000000e6",
+ "body": {
+ "Sa": {
+ "Shared": {
+ "Lifeline": {
+ "represented": "5ceaa100-0000-4000-8000-0000000000d3"
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-0000000000f2": {
+ "id": "5ceaa100-0000-4000-8000-0000000000f2",
+ "alias": "scenario_sa_42",
+ "name": "SA B inspector",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-0000000000e7",
+ "body": {
+ "Sa": {
+ "Shared": {
+ "Lifeline": {
+ "represented": "5ceaa100-0000-4000-8000-0000000000d2"
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-0000000000f3": {
+ "id": "5ceaa100-0000-4000-8000-0000000000f3",
+ "alias": "scenario_sa_43",
+ "name": "SA B recorder",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-0000000000e7",
+ "body": {
+ "Sa": {
+ "Shared": {
+ "Lifeline": {
+ "represented": "5ceaa100-0000-4000-8000-0000000000d3"
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-0000000000f4": {
+ "id": "5ceaa100-0000-4000-8000-0000000000f4",
+ "alias": "scenario_sa_44",
+ "name": "SA C inspector",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-0000000000e8",
+ "body": {
+ "Sa": {
+ "Shared": {
+ "Lifeline": {
+ "represented": "5ceaa100-0000-4000-8000-0000000000d2"
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-0000000000f5": {
+ "id": "5ceaa100-0000-4000-8000-0000000000f5",
+ "alias": "scenario_sa_45",
+ "name": "SA C recorder",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-0000000000e8",
+ "body": {
+ "Sa": {
+ "Shared": {
+ "Lifeline": {
+ "represented": "5ceaa100-0000-4000-8000-0000000000d3"
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-0000000000fa": {
+ "id": "5ceaa100-0000-4000-8000-0000000000fa",
+ "alias": "scenario_sa_50",
+ "name": "SA Root entry",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-0000000000e6",
+ "body": {
+ "Sa": {
+ "Shared": {
+ "Occurrence": {
+ "body": {
+ "Action": {
+ "action": "5ceaa100-0000-4000-8000-0000000000d2",
+ "lifeline": "5ceaa100-0000-4000-8000-0000000000f0"
+ }
+ },
+ "precondition": "",
+ "postcondition": ""
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-0000000000fb": {
+ "id": "5ceaa100-0000-4000-8000-0000000000fb",
+ "alias": "scenario_sa_51",
+ "name": "SA Outer ALT",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-0000000000e6",
+ "body": {
+ "Sa": {
+ "Shared": {
+ "Occurrence": {
+ "body": {
+ "Fragment": {
+ "operator": "Alternative",
+ "branches": [
+ "5ceaa100-0000-4000-8000-0000000000fc",
+ "5ceaa100-0000-4000-8000-0000000000fd"
+ ]
+ }
+ },
+ "precondition": "",
+ "postcondition": ""
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-0000000000fc": {
+ "id": "5ceaa100-0000-4000-8000-0000000000fc",
+ "alias": "scenario_sa_52",
+ "name": "SA Outer chosen operand",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-0000000000fb",
+ "body": {
+ "Sa": {
+ "Shared": {
+ "Occurrence": {
+ "body": {
+ "Branch": {
+ "guard": "ticket.present",
+ "occurrences": [
+ "5ceaa100-0000-4000-8000-0000000000fe"
+ ]
+ }
+ },
+ "precondition": "",
+ "postcondition": ""
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-0000000000fd": {
+ "id": "5ceaa100-0000-4000-8000-0000000000fd",
+ "alias": "scenario_sa_53",
+ "name": "SA Outer fallback operand",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-0000000000fb",
+ "body": {
+ "Sa": {
+ "Shared": {
+ "Occurrence": {
+ "body": {
+ "Branch": {
+ "guard": "else",
+ "occurrences": [
+ "5ceaa100-0000-4000-8000-000000000103"
+ ]
+ }
+ },
+ "precondition": "",
+ "postcondition": ""
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-0000000000fe": {
+ "id": "5ceaa100-0000-4000-8000-0000000000fe",
+ "alias": "scenario_sa_54",
+ "name": "SA Inner ALT",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-0000000000fc",
+ "body": {
+ "Sa": {
+ "Shared": {
+ "Occurrence": {
+ "body": {
+ "Fragment": {
+ "operator": "Alternative",
+ "branches": [
+ "5ceaa100-0000-4000-8000-0000000000ff",
+ "5ceaa100-0000-4000-8000-000000000100"
+ ]
+ }
+ },
+ "precondition": "",
+ "postcondition": ""
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-0000000000ff": {
+ "id": "5ceaa100-0000-4000-8000-0000000000ff",
+ "alias": "scenario_sa_55",
+ "name": "SA Inner chosen operand",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-0000000000fe",
+ "body": {
+ "Sa": {
+ "Shared": {
+ "Occurrence": {
+ "body": {
+ "Branch": {
+ "guard": "ticket.ready",
+ "occurrences": [
+ "5ceaa100-0000-4000-8000-000000000101"
+ ]
+ }
+ },
+ "precondition": "",
+ "postcondition": ""
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-000000000100": {
+ "id": "5ceaa100-0000-4000-8000-000000000100",
+ "alias": "scenario_sa_56",
+ "name": "SA Inner other operand",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-0000000000fe",
+ "body": {
+ "Sa": {
+ "Shared": {
+ "Occurrence": {
+ "body": {
+ "Branch": {
+ "guard": "else",
+ "occurrences": [
+ "5ceaa100-0000-4000-8000-000000000102"
+ ]
+ }
+ },
+ "precondition": "",
+ "postcondition": ""
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-000000000101": {
+ "id": "5ceaa100-0000-4000-8000-000000000101",
+ "alias": "scenario_sa_57",
+ "name": "SA Inner anchor",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-0000000000ff",
+ "body": {
+ "Sa": {
+ "Shared": {
+ "Occurrence": {
+ "body": {
+ "Action": {
+ "action": "5ceaa100-0000-4000-8000-0000000000d2",
+ "lifeline": "5ceaa100-0000-4000-8000-0000000000f0"
+ }
+ },
+ "precondition": "",
+ "postcondition": ""
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-000000000102": {
+ "id": "5ceaa100-0000-4000-8000-000000000102",
+ "alias": "scenario_sa_58",
+ "name": "SA Inner other anchor",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-000000000100",
+ "body": {
+ "Sa": {
+ "Shared": {
+ "Occurrence": {
+ "body": {
+ "Action": {
+ "action": "5ceaa100-0000-4000-8000-0000000000d2",
+ "lifeline": "5ceaa100-0000-4000-8000-0000000000f0"
+ }
+ },
+ "precondition": "",
+ "postcondition": ""
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-000000000103": {
+ "id": "5ceaa100-0000-4000-8000-000000000103",
+ "alias": "scenario_sa_59",
+ "name": "SA Fallback anchor",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-0000000000fd",
+ "body": {
+ "Sa": {
+ "Shared": {
+ "Occurrence": {
+ "body": {
+ "Action": {
+ "action": "5ceaa100-0000-4000-8000-0000000000d3",
+ "lifeline": "5ceaa100-0000-4000-8000-0000000000f1"
+ }
+ },
+ "precondition": "",
+ "postcondition": ""
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-000000000104": {
+ "id": "5ceaa100-0000-4000-8000-000000000104",
+ "alias": "scenario_sa_60",
+ "name": "SA First use of B",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-0000000000e6",
+ "body": {
+ "Sa": {
+ "Shared": {
+ "Occurrence": {
+ "body": {
+ "ScenarioUse": {
+ "scenario": "5ceaa100-0000-4000-8000-0000000000e7",
+ "bindings": [
+ {
+ "referenced": "5ceaa100-0000-4000-8000-0000000000f2",
+ "local": "5ceaa100-0000-4000-8000-0000000000f0"
+ },
+ {
+ "referenced": "5ceaa100-0000-4000-8000-0000000000f3",
+ "local": "5ceaa100-0000-4000-8000-0000000000f1"
+ }
+ ]
+ }
+ },
+ "precondition": "",
+ "postcondition": ""
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-000000000105": {
+ "id": "5ceaa100-0000-4000-8000-000000000105",
+ "alias": "scenario_sa_61",
+ "name": "SA Second use of B",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-0000000000e6",
+ "body": {
+ "Sa": {
+ "Shared": {
+ "Occurrence": {
+ "body": {
+ "ScenarioUse": {
+ "scenario": "5ceaa100-0000-4000-8000-0000000000e7",
+ "bindings": [
+ {
+ "referenced": "5ceaa100-0000-4000-8000-0000000000f2",
+ "local": "5ceaa100-0000-4000-8000-0000000000f0"
+ },
+ {
+ "referenced": "5ceaa100-0000-4000-8000-0000000000f3",
+ "local": "5ceaa100-0000-4000-8000-0000000000f1"
+ }
+ ]
+ }
+ },
+ "precondition": "",
+ "postcondition": ""
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-000000000106": {
+ "id": "5ceaa100-0000-4000-8000-000000000106",
+ "alias": "scenario_sa_62",
+ "name": "SA Root exit",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-0000000000e6",
+ "body": {
+ "Sa": {
+ "Shared": {
+ "Occurrence": {
+ "body": {
+ "Action": {
+ "action": "5ceaa100-0000-4000-8000-0000000000d3",
+ "lifeline": "5ceaa100-0000-4000-8000-0000000000f1"
+ }
+ },
+ "precondition": "",
+ "postcondition": ""
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-000000000107": {
+ "id": "5ceaa100-0000-4000-8000-000000000107",
+ "alias": "scenario_sa_63",
+ "name": "SA B entry",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-0000000000e7",
+ "body": {
+ "Sa": {
+ "Shared": {
+ "Occurrence": {
+ "body": {
+ "Action": {
+ "action": "5ceaa100-0000-4000-8000-0000000000d2",
+ "lifeline": "5ceaa100-0000-4000-8000-0000000000f2"
+ }
+ },
+ "precondition": "",
+ "postcondition": ""
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-000000000108": {
+ "id": "5ceaa100-0000-4000-8000-000000000108",
+ "alias": "scenario_sa_64",
+ "name": "SA B use of C",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-0000000000e7",
+ "body": {
+ "Sa": {
+ "Shared": {
+ "Occurrence": {
+ "body": {
+ "ScenarioUse": {
+ "scenario": "5ceaa100-0000-4000-8000-0000000000e8",
+ "bindings": [
+ {
+ "referenced": "5ceaa100-0000-4000-8000-0000000000f4",
+ "local": "5ceaa100-0000-4000-8000-0000000000f2"
+ },
+ {
+ "referenced": "5ceaa100-0000-4000-8000-0000000000f5",
+ "local": "5ceaa100-0000-4000-8000-0000000000f3"
+ }
+ ]
+ }
+ },
+ "precondition": "",
+ "postcondition": ""
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-000000000109": {
+ "id": "5ceaa100-0000-4000-8000-000000000109",
+ "alias": "scenario_sa_65",
+ "name": "SA B exit",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-0000000000e7",
+ "body": {
+ "Sa": {
+ "Shared": {
+ "Occurrence": {
+ "body": {
+ "Action": {
+ "action": "5ceaa100-0000-4000-8000-0000000000d3",
+ "lifeline": "5ceaa100-0000-4000-8000-0000000000f3"
+ }
+ },
+ "precondition": "",
+ "postcondition": ""
+ }
+ }
+ }
+ }
+ },
+ "5ceaa100-0000-4000-8000-00000000010a": {
+ "id": "5ceaa100-0000-4000-8000-00000000010a",
+ "alias": "scenario_sa_66",
+ "name": "SA C entry",
+ "description": "",
+ "parent": "5ceaa100-0000-4000-8000-0000000000e8",
+ "body": {
+ "Sa": {
+ "Shared": {
+ "Occurrence": {
+ "body": {
+ "Action": {
+ "action": "5ceaa100-0000-4000-8000-0000000000d2",
+ "lifeline": "5ceaa100-0000-4000-8000-0000000000f4"
+ }
+ },
+ "precondition": "",
+ "postcondition": ""
+ }
+ }
+ }
+ }
+ }
+ },
+ "relations": {},
+ "diagrams": {},
+ "artifact_links": {},
+ "traces": {}
+}
\ No newline at end of file
diff --git a/harness/fixtures/scenario-authoring/base/project.arcadia b/harness/fixtures/scenario-authoring/base/project.arcadia
new file mode 100644
index 00000000..b7fee00e
--- /dev/null
+++ b/harness/fixtures/scenario-authoring/base/project.arcadia
@@ -0,0 +1,674 @@
+arcadia 7;
+project scenario_authoring "Scenario authoring contract" id "5ceaa100-0000-4000-8000-000000000001" {
+ include "rationale.arcadia";
+ description "Native clicked-slot and caller-return contract.";
+
+ oa_activity scenario_oa_10 "OA Inspect ticket" id "5ceaa100-0000-4000-8000-00000000006e" {
+ description "";
+ parent none;
+ }
+
+ oa_activity scenario_oa_11 "OA Record result" id "5ceaa100-0000-4000-8000-00000000006f" {
+ description "";
+ parent none;
+ }
+
+ oa_state_machine scenario_oa_20 "OA Ticket modes" id "5ceaa100-0000-4000-8000-000000000078" {
+ description "";
+ parent none;
+ }
+
+ oa_region scenario_oa_21 "OA Ticket region" id "5ceaa100-0000-4000-8000-000000000079" {
+ description "";
+ parent @scenario_oa_20;
+ }
+
+ oa_state scenario_oa_22 "OA Ready" id "5ceaa100-0000-4000-8000-00000000007a" {
+ description "";
+ do_activity "";
+ entry "";
+ exit "";
+ kind State;
+ parent @scenario_oa_21;
+ }
+
+ oa_scenario scenario_oa_30 "OA A caller" id "5ceaa100-0000-4000-8000-000000000082" {
+ context none;
+ description "";
+ parent none;
+ postcondition "";
+ precondition "";
+ steps [@scenario_oa_50, @scenario_oa_51, @scenario_oa_60, @scenario_oa_61, @scenario_oa_62];
+ viewpoint OperationalActivity;
+ }
+
+ oa_scenario scenario_oa_31 "OA B verification" id "5ceaa100-0000-4000-8000-000000000083" {
+ context none;
+ description "";
+ parent none;
+ postcondition "";
+ precondition "";
+ steps [@scenario_oa_63, @scenario_oa_64, @scenario_oa_65];
+ viewpoint OperationalActivity;
+ }
+
+ oa_scenario scenario_oa_32 "OA C detail" id "5ceaa100-0000-4000-8000-000000000084" {
+ context none;
+ description "";
+ parent none;
+ postcondition "";
+ precondition "";
+ steps [@scenario_oa_66];
+ viewpoint OperationalActivity;
+ }
+
+ oa_lifeline scenario_oa_40 "OA A inspector" id "5ceaa100-0000-4000-8000-00000000008c" {
+ description "";
+ parent @scenario_oa_30;
+ represented @scenario_oa_10;
+ }
+
+ oa_lifeline scenario_oa_41 "OA A recorder" id "5ceaa100-0000-4000-8000-00000000008d" {
+ description "";
+ parent @scenario_oa_30;
+ represented @scenario_oa_11;
+ }
+
+ oa_lifeline scenario_oa_42 "OA B inspector" id "5ceaa100-0000-4000-8000-00000000008e" {
+ description "";
+ parent @scenario_oa_31;
+ represented @scenario_oa_10;
+ }
+
+ oa_lifeline scenario_oa_43 "OA B recorder" id "5ceaa100-0000-4000-8000-00000000008f" {
+ description "";
+ parent @scenario_oa_31;
+ represented @scenario_oa_11;
+ }
+
+ oa_lifeline scenario_oa_44 "OA C inspector" id "5ceaa100-0000-4000-8000-000000000090" {
+ description "";
+ parent @scenario_oa_32;
+ represented @scenario_oa_10;
+ }
+
+ oa_lifeline scenario_oa_45 "OA C recorder" id "5ceaa100-0000-4000-8000-000000000091" {
+ description "";
+ parent @scenario_oa_32;
+ represented @scenario_oa_11;
+ }
+
+ oa_occurrence scenario_oa_50 "OA Root entry" id "5ceaa100-0000-4000-8000-000000000096" {
+ body {
+ Action {
+ action @scenario_oa_10;
+ lifeline @scenario_oa_40;
+ };
+ };
+ description "";
+ parent @scenario_oa_30;
+ postcondition "";
+ precondition "";
+ }
+
+ oa_occurrence scenario_oa_51 "OA Outer ALT" id "5ceaa100-0000-4000-8000-000000000097" {
+ body {
+ Fragment {
+ branches [@scenario_oa_52, @scenario_oa_53];
+ operator Alternative;
+ };
+ };
+ description "";
+ parent @scenario_oa_30;
+ postcondition "";
+ precondition "";
+ }
+
+ oa_occurrence scenario_oa_52 "OA Outer chosen operand" id "5ceaa100-0000-4000-8000-000000000098" {
+ body {
+ Branch {
+ guard "ticket.present";
+ occurrences [@scenario_oa_54];
+ };
+ };
+ description "";
+ parent @scenario_oa_51;
+ postcondition "";
+ precondition "";
+ }
+
+ oa_occurrence scenario_oa_53 "OA Outer fallback operand" id "5ceaa100-0000-4000-8000-000000000099" {
+ body {
+ Branch {
+ guard "else";
+ occurrences [@scenario_oa_59];
+ };
+ };
+ description "";
+ parent @scenario_oa_51;
+ postcondition "";
+ precondition "";
+ }
+
+ oa_occurrence scenario_oa_54 "OA Inner ALT" id "5ceaa100-0000-4000-8000-00000000009a" {
+ body {
+ Fragment {
+ branches [@scenario_oa_55, @scenario_oa_56];
+ operator Alternative;
+ };
+ };
+ description "";
+ parent @scenario_oa_52;
+ postcondition "";
+ precondition "";
+ }
+
+ oa_occurrence scenario_oa_55 "OA Inner chosen operand" id "5ceaa100-0000-4000-8000-00000000009b" {
+ body {
+ Branch {
+ guard "ticket.ready";
+ occurrences [@scenario_oa_57];
+ };
+ };
+ description "";
+ parent @scenario_oa_54;
+ postcondition "";
+ precondition "";
+ }
+
+ oa_occurrence scenario_oa_56 "OA Inner other operand" id "5ceaa100-0000-4000-8000-00000000009c" {
+ body {
+ Branch {
+ guard "else";
+ occurrences [@scenario_oa_58];
+ };
+ };
+ description "";
+ parent @scenario_oa_54;
+ postcondition "";
+ precondition "";
+ }
+
+ oa_occurrence scenario_oa_57 "OA Inner anchor" id "5ceaa100-0000-4000-8000-00000000009d" {
+ body {
+ Action {
+ action @scenario_oa_10;
+ lifeline @scenario_oa_40;
+ };
+ };
+ description "";
+ parent @scenario_oa_55;
+ postcondition "";
+ precondition "";
+ }
+
+ oa_occurrence scenario_oa_58 "OA Inner other anchor" id "5ceaa100-0000-4000-8000-00000000009e" {
+ body {
+ Action {
+ action @scenario_oa_10;
+ lifeline @scenario_oa_40;
+ };
+ };
+ description "";
+ parent @scenario_oa_56;
+ postcondition "";
+ precondition "";
+ }
+
+ oa_occurrence scenario_oa_59 "OA Fallback anchor" id "5ceaa100-0000-4000-8000-00000000009f" {
+ body {
+ Action {
+ action @scenario_oa_11;
+ lifeline @scenario_oa_41;
+ };
+ };
+ description "";
+ parent @scenario_oa_53;
+ postcondition "";
+ precondition "";
+ }
+
+ oa_occurrence scenario_oa_60 "OA First use of B" id "5ceaa100-0000-4000-8000-0000000000a0" {
+ body {
+ ScenarioUse {
+ bindings [{
+ local @scenario_oa_40;
+ referenced @scenario_oa_42;
+ }, {
+ local @scenario_oa_41;
+ referenced @scenario_oa_43;
+ }];
+ scenario @scenario_oa_31;
+ };
+ };
+ description "";
+ parent @scenario_oa_30;
+ postcondition "";
+ precondition "";
+ }
+
+ oa_occurrence scenario_oa_61 "OA Second use of B" id "5ceaa100-0000-4000-8000-0000000000a1" {
+ body {
+ ScenarioUse {
+ bindings [{
+ local @scenario_oa_40;
+ referenced @scenario_oa_42;
+ }, {
+ local @scenario_oa_41;
+ referenced @scenario_oa_43;
+ }];
+ scenario @scenario_oa_31;
+ };
+ };
+ description "";
+ parent @scenario_oa_30;
+ postcondition "";
+ precondition "";
+ }
+
+ oa_occurrence scenario_oa_62 "OA Root exit" id "5ceaa100-0000-4000-8000-0000000000a2" {
+ body {
+ Action {
+ action @scenario_oa_11;
+ lifeline @scenario_oa_41;
+ };
+ };
+ description "";
+ parent @scenario_oa_30;
+ postcondition "";
+ precondition "";
+ }
+
+ oa_occurrence scenario_oa_63 "OA B entry" id "5ceaa100-0000-4000-8000-0000000000a3" {
+ body {
+ Action {
+ action @scenario_oa_10;
+ lifeline @scenario_oa_42;
+ };
+ };
+ description "";
+ parent @scenario_oa_31;
+ postcondition "";
+ precondition "";
+ }
+
+ oa_occurrence scenario_oa_64 "OA B use of C" id "5ceaa100-0000-4000-8000-0000000000a4" {
+ body {
+ ScenarioUse {
+ bindings [{
+ local @scenario_oa_42;
+ referenced @scenario_oa_44;
+ }, {
+ local @scenario_oa_43;
+ referenced @scenario_oa_45;
+ }];
+ scenario @scenario_oa_32;
+ };
+ };
+ description "";
+ parent @scenario_oa_31;
+ postcondition "";
+ precondition "";
+ }
+
+ oa_occurrence scenario_oa_65 "OA B exit" id "5ceaa100-0000-4000-8000-0000000000a5" {
+ body {
+ Action {
+ action @scenario_oa_11;
+ lifeline @scenario_oa_43;
+ };
+ };
+ description "";
+ parent @scenario_oa_31;
+ postcondition "";
+ precondition "";
+ }
+
+ oa_occurrence scenario_oa_66 "OA C entry" id "5ceaa100-0000-4000-8000-0000000000a6" {
+ body {
+ Action {
+ action @scenario_oa_10;
+ lifeline @scenario_oa_44;
+ };
+ };
+ description "";
+ parent @scenario_oa_32;
+ postcondition "";
+ precondition "";
+ }
+
+ sa_function scenario_sa_10 "SA Inspect ticket" id "5ceaa100-0000-4000-8000-0000000000d2" {
+ description "";
+ parent none;
+ }
+
+ sa_function scenario_sa_11 "SA Record result" id "5ceaa100-0000-4000-8000-0000000000d3" {
+ description "";
+ parent none;
+ }
+
+ sa_state_machine scenario_sa_20 "SA Ticket modes" id "5ceaa100-0000-4000-8000-0000000000dc" {
+ description "";
+ parent none;
+ }
+
+ sa_region scenario_sa_21 "SA Ticket region" id "5ceaa100-0000-4000-8000-0000000000dd" {
+ description "";
+ parent @scenario_sa_20;
+ }
+
+ sa_state scenario_sa_22 "SA Ready" id "5ceaa100-0000-4000-8000-0000000000de" {
+ description "";
+ do_activity "";
+ entry "";
+ exit "";
+ kind State;
+ parent @scenario_sa_21;
+ }
+
+ sa_scenario scenario_sa_30 "SA A caller" id "5ceaa100-0000-4000-8000-0000000000e6" {
+ context none;
+ description "";
+ parent none;
+ postcondition "";
+ precondition "";
+ steps [@scenario_sa_50, @scenario_sa_51, @scenario_sa_60, @scenario_sa_61, @scenario_sa_62];
+ viewpoint Functional;
+ }
+
+ sa_scenario scenario_sa_31 "SA B verification" id "5ceaa100-0000-4000-8000-0000000000e7" {
+ context none;
+ description "";
+ parent none;
+ postcondition "";
+ precondition "";
+ steps [@scenario_sa_63, @scenario_sa_64, @scenario_sa_65];
+ viewpoint Functional;
+ }
+
+ sa_scenario scenario_sa_32 "SA C detail" id "5ceaa100-0000-4000-8000-0000000000e8" {
+ context none;
+ description "";
+ parent none;
+ postcondition "";
+ precondition "";
+ steps [@scenario_sa_66];
+ viewpoint Functional;
+ }
+
+ sa_lifeline scenario_sa_40 "SA A inspector" id "5ceaa100-0000-4000-8000-0000000000f0" {
+ description "";
+ parent @scenario_sa_30;
+ represented @scenario_sa_10;
+ }
+
+ sa_lifeline scenario_sa_41 "SA A recorder" id "5ceaa100-0000-4000-8000-0000000000f1" {
+ description "";
+ parent @scenario_sa_30;
+ represented @scenario_sa_11;
+ }
+
+ sa_lifeline scenario_sa_42 "SA B inspector" id "5ceaa100-0000-4000-8000-0000000000f2" {
+ description "";
+ parent @scenario_sa_31;
+ represented @scenario_sa_10;
+ }
+
+ sa_lifeline scenario_sa_43 "SA B recorder" id "5ceaa100-0000-4000-8000-0000000000f3" {
+ description "";
+ parent @scenario_sa_31;
+ represented @scenario_sa_11;
+ }
+
+ sa_lifeline scenario_sa_44 "SA C inspector" id "5ceaa100-0000-4000-8000-0000000000f4" {
+ description "";
+ parent @scenario_sa_32;
+ represented @scenario_sa_10;
+ }
+
+ sa_lifeline scenario_sa_45 "SA C recorder" id "5ceaa100-0000-4000-8000-0000000000f5" {
+ description "";
+ parent @scenario_sa_32;
+ represented @scenario_sa_11;
+ }
+
+ sa_occurrence scenario_sa_50 "SA Root entry" id "5ceaa100-0000-4000-8000-0000000000fa" {
+ body {
+ Action {
+ action @scenario_sa_10;
+ lifeline @scenario_sa_40;
+ };
+ };
+ description "";
+ parent @scenario_sa_30;
+ postcondition "";
+ precondition "";
+ }
+
+ sa_occurrence scenario_sa_51 "SA Outer ALT" id "5ceaa100-0000-4000-8000-0000000000fb" {
+ body {
+ Fragment {
+ branches [@scenario_sa_52, @scenario_sa_53];
+ operator Alternative;
+ };
+ };
+ description "";
+ parent @scenario_sa_30;
+ postcondition "";
+ precondition "";
+ }
+
+ sa_occurrence scenario_sa_52 "SA Outer chosen operand" id "5ceaa100-0000-4000-8000-0000000000fc" {
+ body {
+ Branch {
+ guard "ticket.present";
+ occurrences [@scenario_sa_54];
+ };
+ };
+ description "";
+ parent @scenario_sa_51;
+ postcondition "";
+ precondition "";
+ }
+
+ sa_occurrence scenario_sa_53 "SA Outer fallback operand" id "5ceaa100-0000-4000-8000-0000000000fd" {
+ body {
+ Branch {
+ guard "else";
+ occurrences [@scenario_sa_59];
+ };
+ };
+ description "";
+ parent @scenario_sa_51;
+ postcondition "";
+ precondition "";
+ }
+
+ sa_occurrence scenario_sa_54 "SA Inner ALT" id "5ceaa100-0000-4000-8000-0000000000fe" {
+ body {
+ Fragment {
+ branches [@scenario_sa_55, @scenario_sa_56];
+ operator Alternative;
+ };
+ };
+ description "";
+ parent @scenario_sa_52;
+ postcondition "";
+ precondition "";
+ }
+
+ sa_occurrence scenario_sa_55 "SA Inner chosen operand" id "5ceaa100-0000-4000-8000-0000000000ff" {
+ body {
+ Branch {
+ guard "ticket.ready";
+ occurrences [@scenario_sa_57];
+ };
+ };
+ description "";
+ parent @scenario_sa_54;
+ postcondition "";
+ precondition "";
+ }
+
+ sa_occurrence scenario_sa_56 "SA Inner other operand" id "5ceaa100-0000-4000-8000-000000000100" {
+ body {
+ Branch {
+ guard "else";
+ occurrences [@scenario_sa_58];
+ };
+ };
+ description "";
+ parent @scenario_sa_54;
+ postcondition "";
+ precondition "";
+ }
+
+ sa_occurrence scenario_sa_57 "SA Inner anchor" id "5ceaa100-0000-4000-8000-000000000101" {
+ body {
+ Action {
+ action @scenario_sa_10;
+ lifeline @scenario_sa_40;
+ };
+ };
+ description "";
+ parent @scenario_sa_55;
+ postcondition "";
+ precondition "";
+ }
+
+ sa_occurrence scenario_sa_58 "SA Inner other anchor" id "5ceaa100-0000-4000-8000-000000000102" {
+ body {
+ Action {
+ action @scenario_sa_10;
+ lifeline @scenario_sa_40;
+ };
+ };
+ description "";
+ parent @scenario_sa_56;
+ postcondition "";
+ precondition "";
+ }
+
+ sa_occurrence scenario_sa_59 "SA Fallback anchor" id "5ceaa100-0000-4000-8000-000000000103" {
+ body {
+ Action {
+ action @scenario_sa_11;
+ lifeline @scenario_sa_41;
+ };
+ };
+ description "";
+ parent @scenario_sa_53;
+ postcondition "";
+ precondition "";
+ }
+
+ sa_occurrence scenario_sa_60 "SA First use of B" id "5ceaa100-0000-4000-8000-000000000104" {
+ body {
+ ScenarioUse {
+ bindings [{
+ local @scenario_sa_40;
+ referenced @scenario_sa_42;
+ }, {
+ local @scenario_sa_41;
+ referenced @scenario_sa_43;
+ }];
+ scenario @scenario_sa_31;
+ };
+ };
+ description "";
+ parent @scenario_sa_30;
+ postcondition "";
+ precondition "";
+ }
+
+ sa_occurrence scenario_sa_61 "SA Second use of B" id "5ceaa100-0000-4000-8000-000000000105" {
+ body {
+ ScenarioUse {
+ bindings [{
+ local @scenario_sa_40;
+ referenced @scenario_sa_42;
+ }, {
+ local @scenario_sa_41;
+ referenced @scenario_sa_43;
+ }];
+ scenario @scenario_sa_31;
+ };
+ };
+ description "";
+ parent @scenario_sa_30;
+ postcondition "";
+ precondition "";
+ }
+
+ sa_occurrence scenario_sa_62 "SA Root exit" id "5ceaa100-0000-4000-8000-000000000106" {
+ body {
+ Action {
+ action @scenario_sa_11;
+ lifeline @scenario_sa_41;
+ };
+ };
+ description "";
+ parent @scenario_sa_30;
+ postcondition "";
+ precondition "";
+ }
+
+ sa_occurrence scenario_sa_63 "SA B entry" id "5ceaa100-0000-4000-8000-000000000107" {
+ body {
+ Action {
+ action @scenario_sa_10;
+ lifeline @scenario_sa_42;
+ };
+ };
+ description "";
+ parent @scenario_sa_31;
+ postcondition "";
+ precondition "";
+ }
+
+ sa_occurrence scenario_sa_64 "SA B use of C" id "5ceaa100-0000-4000-8000-000000000108" {
+ body {
+ ScenarioUse {
+ bindings [{
+ local @scenario_sa_42;
+ referenced @scenario_sa_44;
+ }, {
+ local @scenario_sa_43;
+ referenced @scenario_sa_45;
+ }];
+ scenario @scenario_sa_32;
+ };
+ };
+ description "";
+ parent @scenario_sa_31;
+ postcondition "";
+ precondition "";
+ }
+
+ sa_occurrence scenario_sa_65 "SA B exit" id "5ceaa100-0000-4000-8000-000000000109" {
+ body {
+ Action {
+ action @scenario_sa_11;
+ lifeline @scenario_sa_43;
+ };
+ };
+ description "";
+ parent @scenario_sa_31;
+ postcondition "";
+ precondition "";
+ }
+
+ sa_occurrence scenario_sa_66 "SA C entry" id "5ceaa100-0000-4000-8000-00000000010a" {
+ body {
+ Action {
+ action @scenario_sa_10;
+ lifeline @scenario_sa_44;
+ };
+ };
+ description "";
+ parent @scenario_sa_32;
+ postcondition "";
+ precondition "";
+ }
+
+}
diff --git a/harness/fixtures/scenario-authoring/base/rationale.arcadia b/harness/fixtures/scenario-authoring/base/rationale.arcadia
new file mode 100644
index 00000000..64b58187
--- /dev/null
+++ b/harness/fixtures/scenario-authoring/base/rationale.arcadia
@@ -0,0 +1,2 @@
+// Retain caller/operand evidence: ticket 雨.
+// Navigation never edits this note.
diff --git a/harness/release-analysis-context-experiment-20260911.md b/harness/release-analysis-context-experiment-20260911.md
new file mode 100644
index 00000000..a40a9229
--- /dev/null
+++ b/harness/release-analysis-context-experiment-20260911.md
@@ -0,0 +1,94 @@
+# Executed comparison of baseline values and complete analysis cases
+
+Codex-956atf `/root/semantics_critic`, 2026-09-11. Root assigned this bounded follow-up to the paired semantic review. Read current Gitea issue #1 through #117; announced ownership in #120. Owned only `harness/experiments/analysis-context-20260911/` and this report. Existing proposals, review, production and ledgers were untouched. Root approved the isolated std-only direct-rustc command; no Cargo, `target`, native application or package changes occurred.
+
+## Result and recommendation
+
+**Prefer B for the next engineering-study prototype:** explicit baseline property values/formulas plus one level of named case overrides. In this controlled maintenance task it produces identical results with materially less repeated authored state. Preserve an explicit complete frozen snapshot operation for studies that must stop following the baseline. D remains useful as that independent snapshot form and for studies deliberately maintaining unrelated assumptions.
+
+This recommendation is based on executed semantic examples and text counts, not a measured human usability study or a final metamodel decision. A visible baseline, effective-case formula evaluation, distinguishable Missing/Clear operations, captured revision/provenance and complete freeze semantics are necessary conditions. Removing any of those to make B look simpler reintroduces concrete ambiguity demonstrated below.
+
+## Method
+
+The [standalone program](experiments/analysis-context-20260911/main.rs) generates and parses a small closed experiment dialect. B and D use the same property identities represented by stable symbols, same expression AST, pure function definitions, dependency checks and evaluator. B resolves an explicitly named baseline plus local overrides; D requires each selected case's complete bindings. There is no UI-selected or unnamed default case and no case-to-case inheritance. Both can evaluate unknown inputs without inventing zero.
+
+Twenty fixed inputs are each 1,000 ms. Cases 1–20 have two varying inputs:
+
+```text
+varying01 = 750 + 50 * (case_number - 1) ms
+varying02 = 1000 + 25 * (case_number - 1) ms
+total = sum(all 22 inputs)
+budget = total <= 22000 ms
+```
+
+The independent arithmetic expectation is `total = 21750 + 75 * (case_number - 1)` ms. Cases 1–4 satisfy the check; case 20 gives 23,175 ms and violates it. B's first case explicitly names the baseline and overrides nothing; the other 19 override the two varying inputs. D contains all 22 input bindings in every case. Both also have result and check bindings.
+
+Each context model is tested with inline expressions and with **shared pure reusable calculations**, so D is not penalized merely for repeating the threshold expression. Factored calls bind all arguments explicitly; definitions do not capture project properties. All accepted emitted source is parsed/validated and round-tripped to exact experiment AST equality. Deliberately invalid source is emitted separately as `*.rejected-study`.
+
+Changes are made programmatically to the experimental AST and emitted as complete text, then parsed again. The experiment counts literal changed source lines using longest common subsequence. It does **not** count those changes as human actions, claim the syntax is Studio's, or pretend a generated source edit is an observed engineering task.
+
+## Executed measurements
+
+Final [results](experiments/analysis-context-20260911/generated/RESULTS.md): **218 assertions passed, process exit 0**.
+
+| Variant | Initial lines | UTF-8 bytes | Binding rows | Change one shared fixed assumption: removed/added lines | Change threshold: removed/added lines |
+| --- | ---: | ---: | ---: | ---: | ---: |
+| B, inline | 106 | 2,281 | 62 | 3 / 3 | 3 / 3 |
+| B, factored | 108 | 2,781 | 62 | 3 / 3 | 2 / 2 |
+| D, inline | 522 | 13,241 | 480 | 21 / 21 | 21 / 21 |
+| D, factored | 524 | 14,026 | 480 | 21 / 21 | 2 / 2 |
+
+The fixed-assumption task changes `fixed01` from 1,000 to 1,200 ms across the active study. B edits one binding plus baseline/document revision lines. D edits twenty bindings plus its document revision line. Both correctly add 200 ms to every case and reduce the passing cases from four to one.
+
+For the threshold task, changing 22,000 to 22,500 ms yields eleven passing cases in every variant. B-inline changes one baseline predicate. D-inline changes twenty predicates. **Factoring the predicate removes that difference:** B-factored and D-factored each change one function body and one document revision. This falsifies a blanket claim that D necessarily repeats every formula edit. It does not remove D's repeated fixed input values; factoring also increases initial text because the calls and parameter lists remain explicit.
+
+Binding counts include the result and check. B has 24 baseline bindings and 38 override bindings; D has 20 × 24 = 480. The common property catalog is counted in emitted line/byte size. OA/SA subjects, labels, UUIDs and full type declarations are outside the experiment; these numbers cannot be substituted for complete product-source size.
+
+## Concrete semantic counterexamples
+
+| Operation or mistake | Executed B result | Executed D result | Implication |
+| --- | --- | --- | --- |
+| Change one fixed assumption for the whole active study | One baseline binding affects all twenty cases. | All twenty bindings must change; a negative control editing only the first changes only that case. | B reduces maintenance duplication. D's local isolation is useful when the cases intentionally represent independent assumptions. An atomic bulk editor could reduce D's actions, but not the duplicated source state. |
+| Evaluate an inherited formula in its definition context | Wrong baseline context gives 21,750 ms for case 20; correct effective-case context gives 23,175 ms. | Complete case expressions use their selected case's inputs directly. | B must resolve all property reads in the requested case, even when the formula originated in the baseline. “Inherit the already evaluated baseline result” is incorrect. |
+| Set the varying input override to `missing` | It shadows the known baseline input. Dependent total/check become Missing, with `varying01` as cause. | An explicit missing row also propagates Missing. | Missing is a real authored state, not an absent override or a false predicate. |
+| Remove that row | B clears the override and restores the baseline's 750 ms. Case 20 total becomes 22,225 ms. | A required missing binding row is a structural rejection. | Commands and text must distinguish Clear/Use baseline from Set missing. The same absent-map representation must not mean both. |
+| Clear an override whose baseline itself is missing | Result stays Missing; no fallback value is invented. | Not an inheritance operation. | B resolution terminates at one explicit baseline. It must not search another case or a payload default. |
+| Override `varying01 = total` | Effective case graph rejects a cycle, even though the baseline graph was valid. | The equivalent complete case also rejects. | B cannot validate only the baseline and override fragments independently. Dependency checks must see the fully resolved case. |
+| Point a case at another case | Rejects case-to-case inheritance. | Inheritance is forbidden. | This experiment's B benefit does not require a general inheritance graph. |
+| Copy a case and call it frozen | A shallow case copy still follows later baseline changes. | Inline D's complete copy remains independent; factored D still follows changed shared function bodies. | A freeze contract must capture the definition environment as well as values/formulas. D's complete input rows alone are insufficient once reusable definitions exist. |
+| Use a project property inside a supposedly pure function | Rejected. | Rejected. | Reuse does not secretly capture a current case, which would change the comparison. Recursive definitions also reject. |
+
+The program explicitly calculates both the correct effective-case result and the wrong baseline-context value as a negative control. It does not implement the wrong behavior as an alternative acceptable evaluator.
+
+## Frozen studies and provenance
+
+The experiment's freeze operation creates a complete independent D-style document containing the selected case's effective bindings, expression ASTs, the copied pure definition environment, captured input/formula row origins and original document/baseline revision identity. It keeps explicit Missing inputs. Changes to the original baseline and threshold functions leave the frozen observation unchanged. The frozen file parses and reproduces its exact experimental state without access to the original active study.
+
+See [frozen B case 20](experiments/analysis-context-20260911/generated/B-factored-frozen-case20.study) and [active B provenance](experiments/analysis-context-20260911/generated/B-factored-provenance.md). The latter identifies fixed inputs and result/check formulas as `baseline:engineering@1 via case20`, and varying inputs as `case:case20`. Frozen observations retain their captured origins with an explicit `frozen:` marker. All 24 effective bindings retain an origin.
+
+This is intentionally a larger snapshot than an active B case. Freezing removes future propagation by capturing actual dependencies; it cannot honestly be reduced to a copied case name or cached result. Both the fixed input and pure definition changes were applied after capture. Inline D already has isolated values/formulas, which is its clearest advantage; shared calculation definitions introduce the same capture obligation for D.
+
+The experiment's provenance strings are observations produced by the fixture/evaluator, not a secure import or history authority. Production provenance still needs stable typed identities, exact accepted document/source references and validated snapshot origin. The program does not test UUID renaming, package trust, artifact identity or historical remapping.
+
+## Remaining counterexamples and conditions on the recommendation
+
+1. **Propagation is a visible engineering decision.** In B, the source of an unchanged case can remain byte-identical while its result changes after a baseline edit. Before adopting B, the native/source workflows must expose the named base and show the affected cases or result revision. A cache keyed only by a case's own text would be invalid. The experiment supplies document/baseline provenance but does not test a real asynchronous UI cache.
+2. **Frozen evidence must capture external definitions.** The experiment copies its complete small function environment. Real units/calculations imported from packages need exact pins and retained bytes. A frozen binding graph referring to mutable ambient definitions remains live, whichever context model is chosen.
+3. **Thresholds can be factored in D.** The comparison supports B's reduction of repeated assumptions; it does not establish that D always repeats computation definitions. Avoid justifying B with that stronger, falsified claim.
+4. **Independent studies may prefer D.** If the twenty fixed assumptions are intentionally independent measurements rather than one shared design assumption, B's propagation is unwanted. Explicit independent/frozen studies cover that use case; silently turning every case into a live override would be misleading.
+5. **Actual authoring remains unmeasured.** A visible “Use baseline” control might be clearer than twenty copied values, or engineers may misunderstand inherited formulas. The next native/text task must measure wrong-context changes, recovery and comprehension. This experiment cannot provide human timings, UI clarity, large-project latency or accessibility evidence.
+6. **Metamodel integration is still open.** Subject ownership, OA/SA transitions, library pattern closure, check identity, quantity compatibility and source normalization require root's paired-contract decisions. The tiny interpreter is not a substitute for those contracts. Do not import it into production merely because its examples pass.
+
+The narrow conclusion is that **one-level explicit B is a stronger active-study candidate than compulsory complete-case D for shared-assumption maintenance**. A complete independent snapshot remains useful. This yields a concrete next prototype, not an argument for arbitrary inheritance or hidden defaults.
+
+## Exact execution evidence and reproduction
+
+- Compiler: `rustc 1.98.1 (48a229cea 2026-09-01)`, commit `48a229ceaefd4985c50990b14116b6d856af0985`, host `x86_64-pc-windows-gnullvm`, LLVM 22.1.8.
+- Compile: std-only `rustc --edition=2024 -D warnings -C linker=clang.exe`; no warnings or errors in the completed final build.
+- Final program SHA256: `5632ACAFD06413DCC9961DDC1ADE60C7556FB56B43ED3C667F5106E7559A3733`.
+- Executable: `.local/analysis-context-20260911/analysis-context.exe`; SHA256 `36E2D5A7F0683CC19F2EB50CA4840F3A793A8350498E3E17EDD75710A78FC675`.
+- Results SHA256: `248419751E9B836CDE6D80F97202843DD5DC085D1BEC67CB2FCC5046960C143B`.
+- Final process exit: **0**; **218 assertions passed**. Each assertion count is an experiment check, not a count of independent production tests.
+- [Evidence manifest](experiments/analysis-context-20260911/generated/EVIDENCE.json) records all 29 emitted source fixture hashes, commands and UTC recording time. [README](experiments/analysis-context-20260911/README.md) gives the complete repeatable commands.
+
+All runtime outputs are confined to the owned experiment directory, with the executable isolated under `.local`. Existing Studio tests and release acceptance were not rerun or claimed by this task. Root retains the final semantic choice and implementation ownership.
diff --git a/harness/release-analysis-semantics-design-20260910.md b/harness/release-analysis-semantics-design-20260910.md
new file mode 100644
index 00000000..77b0eada
--- /dev/null
+++ b/harness/release-analysis-semantics-design-20260910.md
@@ -0,0 +1,366 @@
+# Analysis semantics: competing designs and a bounded proposed contract
+
+Codex-956atf `/root/requirements_delta`, 2026-09-10, finalized 2026-09-11. Design proposal for root synthesis and independent criticism, **not a ratified decision, implementation, or release acceptance**. Sole output of this assignment is this file. No production edits, Cargo or native execution. Read Gitea coordination through #81 before starting and through #101 on resuming; announced this work in #83. Coordinated neutral-definition identity and immutable import assumptions with `/root/libraries_design`; incorporated the paired critic's numeric serialization counterexample and library compatibility concern. Root retains build/native ownership.
+
+The authoritative user objective and the delta evidence are recorded in `PROJECT_GOAL.md` and `release-requirements-delta-20260910.md`. This report examines the actual core at `8547b85` and its unchanged analysis-relevant predecessors. The current Constraint/MessageValue expressions remain prose; DataType/DataField units remain strings. This proposal must not reinterpret those existing records during migration.
+
+On resuming, read the full replacement objective at `C:/Users/User/.codex/attachments/a49d1780-25d5-4778-ad68-6140c60e4207/goal-objective.md` (SHA-256 `DD58F75C93D55FE16ED141A23D834898FB6EBC625AE7E7AE379DA552A8312435`). Its explicit requirements for low-clutter notation, reduced cognitive load, human/AI editing and complete small/large model development through text strengthen the authoring gates in sections 3.4 and 7. This design update is not a fresh production audit of the concurrently changing checkout.
+
+## 1. The decision and its evidence
+
+The key question is whether a numerical value belongs directly to a modeled subject, to one explicit analysis case, or to a subject declaration plus case-specific assignment. A second question is how much mathematics the first release must execute. Neither question is settled by having a text field called `expression`.
+
+Capella's official material identifies properties, expressions and dimensions and describes analysis through viewpoints. Its mass/cost/latency examples support useful architectural analysis without requiring behavioral simulation. [Capella comparison](https://mbse-capella.org/arcadia_capella_sysml_tool.html#parametric), [Capella features](https://mbse-capella.org/features.html)
+
+SysML 2.0 separates calculation definitions/applications, Boolean constraints and quantity/unit concepts. Its calculation semantics include pure reusable computations; its quantity treatment distinguishes a quantity kind from a particular unit. Those distinctions inform this proposal; they do not make the proposed Studio language SysML-conformant. [OMG language specification, §§7.8, 7.19, 7.20 and 9.8](https://www.omg.org/spec/SysML/2.0/Language/PDF)
+
+For the temperature falsifier below, BIPM defines the Celsius/Kelvin numerical relationship with the exact offset 273.15 and distinguishes temperature values from intervals. The proposed affine algebra is a Studio design interpretation of that distinction. [BIPM SI Brochure, ninth edition, temperature discussion](https://www.bipm.org/documents/20126/41483022/SI-Brochure-9-EN.pdf/2d2b50bf-f2b4-9661-f402-5f9d66e4b507?version=4.0)
+
+The implementation constraints are concrete:
+
+- `model.rs:603–617,651` contains current unit/expression metadata; `parent_permits` (`validation.rs:92`) permits DataFields only in data/item structures. A payload type default must not become a system property value accidentally.
+- `Project::layer_of` follows an Element's layer or a Relation's source (`model.rs:1803`). There is no neutral modeling layer. New reusable definitions must not masquerade as OA or relax all existing same-layer checks.
+- `prepare_command` clones, applies a complete batch, finishes deletion handling, validates, then returns the candidate (`session.rs:185`). This is the mutation boundary to retain.
+- `visit_element_refs` currently visits live UUID references; expression text has no visited references (`references.rs:17–152`). Actual expression references require a typed visitor, not text search.
+- Transition closure follows references and selected ownership (`transitions.rs:447–606`); `inferred_kind` has a closed catalog. New property/case/check semantics will not transition automatically merely because they use SharedBody.
+- Historical review is a closed typed vocabulary (`semantic/types.rs:88–155`). New live references and historical observations require different validation rules, as in existing source5–7 history.
+
+Paths above are under `crates/oa-core/src`.
+
+## 2. Alternatives and provisional ranking
+
+Ratings below are engineering judgments to be falsified by examples and native tasks, not measurements.
+
+| Architecture | Simple property/budget | Alternative assumptions | Meaning and automation | Main cost |
+| --- | --- | --- | --- | --- |
+| A. Directly owned value/expression; no cases | Best initial simplicity. One property contains its value or derived expression. | Requires editing the one model state or copying declarations/projects. | Clear single-state meaning; weak support for simultaneous alternatives. | Adding cases later may reinterpret every property read. |
+| B. Directly owned baseline value plus explicit override cases | Good initial simplicity; ordinary properties work without a case. | Case chooses a base and stores local overrides. Unchanged properties follow the base. | Viable if every resolved input reports its origin and inheritance rules are explicit. | Two value locations, inherited-change effects, override clearing versus unbound values, and derived-value lookup across scopes. An explicit `UseBase(property)` binding avoids implicit fallback but adds records/actions. |
+| C. Case-owned values with optional subject annotations; no reusable property declarations | A case can be a compact typed worksheet. | Each case owns independent columns/values. | All inputs are explicit and isolated. | “The same system property” in two cases has no stable shared identity without another correspondence mechanism. |
+| D. Subject property declarations plus complete explicit case bindings | One extra named case concept; no value is stored on the property declaration. Inline formulas suffice for small tasks. | The same declaration can have different, visibly separate bindings in nominal/degraded cases. No inheritance or fallback. | Stable property identity, explicit assumptions, one value location per case/property, simple pure evaluation. | More semantic records and source declarations; UI must make the common task one coherent action instead of several catalog detours. |
+
+**Provisional preference: D**, because stable property identity and explicit assumptions support engineering studies and cross-project reuse without implementing override inheritance. This preference is conditional on the low-overhead workflows below. B is a credible competitor, not a straw man. If native comparison shows that engineers mostly enter context-independent facts and D forces repeated case creation or input copying, prefer B with explicit base provenance and a precisely defined override contract, or revisit a visible `UseBase` form. Do not add an invisible “default case” to rescue D; that would change the chosen semantics.
+
+Reusable calculation definitions are orthogonal to A–D. A small budget must support an inline expression. Requiring a reusable function definition, parameter list and application before adding two durations would be unnecessary authoring overhead. “Make reusable” can be a later explicit transformation of a selected expression.
+
+### Numerical alternatives
+
+| Domain | Exact decimal budgets and large integers | Degrees/radians and ordinary functions | Reproducibility / cost | Disposition |
+| --- | --- | --- | --- | --- |
+| Q. Bounded exact rational scalar algebra | Exact within stated size limits; `0.1 + 0.2 == 0.3` and rational divisions are unambiguous. | Cannot generally evaluate π-based conversion, sine, cosine, logarithms or irrational roots. Must report Unsupported. | Small, precise arithmetic contract; bounded big-integer implementation required. | Good **first implementation slice**, insufficient evidence for broad common-unit/calculation usability. |
+| F. Finite binary64 throughout | Decimal rounding and large-integer loss require care. Existing i64 rules must stay independent. | Familiar engineering functions and approximate angular conversion are practical. | Must fix conversion, rounding, math function behavior and comparison policy; CPU/library differences need measured bounds. | Plausible simpler release choice if ordinary numerical breadth dominates exactness. |
+| Q+F. Explicit exact and approximate domains | Exact calculations stay exact; approximation occurs at a visible domain boundary. | An implemented approximate domain handles angles and transcendental functions with explicit result labeling/policy. | More type/evaluation rules and two conformance suites. No implicit approximate-to-exact conversion. | Preferred **target for further release design**, conditional on a justified, independently verified approximate profile. |
+
+This report formalizes Q as a bounded foundation. It does **not** claim that Q alone satisfies the user's complete calculations/quantities requirement. The approximate profile remains a consequential design/acceptance item, not a harmless future convenience. In particular, an everyday `30 deg → rad` or `sin(30 deg)` request must either run under an implemented approximate domain or receive a precise Unsupported result. A decimal constant pretending to be exact π is unacceptable.
+
+Before implementing F, compare a portable pinned Rust math implementation against platform intrinsics using reference values and documented error limits. Select rounding, supported function domains, signed-zero behavior, overflow/underflow and comparison semantics explicitly. Approximation labeling is not an error bound; a user-supplied engineering tolerance is not automatically a proof of numerical accuracy. Do not implement approximate equality by an undocumented global epsilon. That work is outside this exact first slice and must remain open in the release ledger.
+
+## 3. Proposed model and low-overhead authoring
+
+### 3.1 Meanings
+
+An **EngineeringProperty** declares what scalar or finite scalar collection is associated with an existing semantic subject and its type. It stores no value/default. Its subject is an existing Element or Relation in the same layer, excluding analysis records themselves. Using an explicit typed subject reference supports an exchange's latency as well as a function's duration without pretending a Relation can be an Element parent.
+
+An **AnalysisCase** names one set of input assumptions and derived bindings in one layer. It maps property identity to an expression or an explicit unbound value. A property read always means that property's binding in the named case. There is no lookup in another case, payload default, selected diagram, active UI state or external file. Case subject is optional explanatory focus, not an implicit namespace or lookup scope.
+
+An **AnalysisCheck** is an identified, case-owned Boolean predicate. It may link an existing descriptive Constraint as its documented requirement. The old Constraint's prose remains prose; the new check supplies the formal assertion in an explicit case. Several checks/cases may reference the same documented Constraint. A check without that link still expresses a formal engineering constraint.
+
+A neutral **CalculationDefinition** has stable typed parameters, a declared result and an optional pure expression body. A Boolean-valued reusable calculation can supply a predicate to a check. Definitions may call other definitions but cannot capture project properties, cases, UI selection, files, clocks or mutable external state.
+
+### 3.2 Concrete Rust sketch
+
+The names below are proposed, not existing public APIs. Closed Serde records and duplicate-key rejection follow current conventions.
+
+```rust
+// Proposal: three new Kind/SharedBody variants, using existing Element identity.
+enum AnalysisSubject { Element(Id), Relation(Id) }
+
+enum ScalarType {
+ Boolean,
+ Number, // Q1: exact rational
+ Quantity(DefinitionRef), // must resolve to a QuantityKind
+}
+enum AnalysisType { Scalar(ScalarType), List(ScalarType) } // no nested lists
+
+// SharedBody additions:
+EngineeringProperty {
+ subject: AnalysisSubject,
+ value_type: AnalysisType,
+ display_unit: Option, // compatible quantity kind; no value/default
+},
+AnalysisCase {
+ subject: Option,
+ bindings: BTreeMap>, // key is EngineeringProperty identity
+},
+AnalysisCheck { documented_constraint: Option, predicate: Option },
+
+// Project gets a separate neutral definition catalog, coordinated with libraries.
+enum DefinitionRef {
+ Local(Id),
+ Imported { import: Id, package: PackageId, member: Id },
+}
+struct Parameter { id: ParameterId, name: String, value_type: AnalysisType }
+struct CalculationDefinition {
+ parameters: Vec,
+ result: AnalysisType,
+ body: Option,
+}
+
+struct Exact { numerator: CanonicalInteger, denominator: CanonicalPositiveInteger }
+// Wire representation is canonical decimal strings, not JSON floating numbers.
+struct Dimension([i16; 7]); // length, mass, time, current, temperature, amount, luminous intensity
+enum QuantityAlgebra { Linear, Affine { difference_kind: DefinitionRef } }
+struct QuantityKindDefinition { dimension: Dimension, algebra: QuantityAlgebra }
+struct UnitDefinition {
+ kind: DefinitionRef,
+ scale: Exact, // strictly positive in Q1
+ offset: Exact, // zero for a Linear kind
+ symbol: String, // presentation; never identity
+}
+
+enum Expr {
+ Boolean(bool), Number(Exact),
+ Quantity { magnitude: Exact, unit: DefinitionRef },
+ Property(Id), Parameter(ParameterId), List(Vec),
+ Unary { op: UnaryOp, operand: Box },
+ Binary { op: BinaryOp, left: Box, right: Box },
+ If { condition: Box, when_true: Box, when_false: Box },
+ Call { definition: DefinitionRef, arguments: BTreeMap },
+ Sum { values: Box, initial: Box },
+ Power { base: Box, exponent: i8 },
+ AsKind { kind: DefinitionRef, value: Box },
+}
+```
+
+EngineeringProperty and AnalysisCase are layer-root Elements. AnalysisCheck requires parent AnalysisCase. The subject relationship is explicit reference association, not an extra containment rule. Property ownership/attachment is therefore visible in the Properties/Analysis presentation even though it is not an Element child of its subject. If user testing instead requires the property to participate in semantic containment, revisit this choice explicitly; do not give `parent` two meanings.
+
+`display_unit` is permitted only for a quantity scalar or quantity list and must have the property's resolved kind. It chooses result presentation, not input interpretation or a default value. A source literal retains its own magnitude/unit. Without a requested display unit, the wire result remains a canonical coordinate plus resolved kind; the UI must not invent a unit symbol. The Add value/budget forms can explicitly set this field from the visible unit choice.
+
+Parameter IDs are scoped to the defining CalculationDefinition and remain stable through rename. They are not ordinary project Element references. A call's argument keys must exactly match the definition's parameter IDs. Wrong/missing/duplicate argument keys reject; an input whose value is not known is represented by a case binding set to `None`, not an invalid argument map. Empty calculation bodies/check predicates are admitted incomplete records with warnings.
+
+### 3.3 Minimum GUI and source work
+
+For one new property/value, the proposed minimum GUI operation is: select the modeled subject, choose **Add analysis value**, enter name/value/unit, and choose or visibly name the case. One final Create applies a batch creating the property, a new named case when needed, and its binding. The form states the case name and resulting records. Creating “Nominal” is explicit model creation, not implicit fallback. Existing cases are chosen by context, with alternatives visible. No separate global-catalog visit is required.
+
+For a two-duration budget, one compact **New budget** form can show case name, two named input rows with subjects/units, the result expression and threshold. One Create reserves all new IDs and applies one reviewed batch: three properties, one case with three bindings and one check. A reusable definition is not mandatory. Subsequent editing shows nominal and alternative case values side by side or under an explicit case selector; the result always bears its case name. Outside an analysis workspace, a property inspector lists its case values with names rather than silently displaying one “current” value.
+
+Local neutral definitions can make the source self-contained; library imports may supply the same definitions instead. Proposed syntax, not accepted by source7:
+
+```text
+quantity_kind duration "Duration" {
+ dimension [0, 0, 1, 0, 0, 0, 0]; algebra Linear;
+}
+unit s "Second" { kind @duration; scale 1; offset 0; symbol "s"; }
+unit ms "Millisecond" { kind @duration; scale 0.001; offset 0; symbol "ms"; }
+```
+
+The source cost for one property/value is two declarations, using those unit definitions:
+
+```text
+oa_property receive_time "Receive time" { subject @receive; type Quantity(@duration); display_unit @ms; }
+oa_analysis nominal "Nominal" { bindings { @receive_time = 750 [@ms]; } }
+```
+
+The two-case budget can remain concise without inventing a reusable function:
+
+```text
+oa_property receive_time "Receive time" { subject @receive; type Quantity(@duration); }
+oa_property dispatch_time "Dispatch time" { subject @dispatch; type Quantity(@duration); }
+oa_property total_time "Total time" { subject @respond; type Quantity(@duration); display_unit @s; }
+oa_analysis nominal "Nominal" {
+ bindings {
+ @receive_time = 750 [@ms];
+ @dispatch_time = 1 [@s];
+ @total_time = @receive_time + @dispatch_time;
+ }
+}
+oa_analysis degraded "Degraded radio" {
+ bindings {
+ @receive_time = 1250 [@ms];
+ @dispatch_time = 1 [@s];
+ @total_time = @receive_time + @dispatch_time;
+ }
+}
+oa_check nominal_budget "Nominal budget" {
+ parent @nominal; predicate @total_time <= 2 [@s];
+}
+oa_check degraded_budget "Degraded budget" {
+ parent @degraded; predicate @total_time <= 2 [@s];
+}
+```
+
+Optional explicit reuse adds a neutral definition and changes a binding expression:
+
+```text
+calculation combine "Combine durations" {
+ input a : Quantity(@duration);
+ input b : Quantity(@duration);
+ result Quantity(@duration);
+ expression $a + $b;
+}
+// In one case: @total_time = @combine(a: @receive_time, b: @dispatch_time);
+```
+
+Ordinary declaration UUID stabilization follows the existing source identity rule. The proposed authoring form extends optional initial IDs to calculation parameters: accepting a new parameter allocates its ID once, and the accepted source retains it, for example `input a id "10000000-0000-4000-8000-000000000001" : Quantity(@duration);`. This extension is a proposal, not existing source7 behavior. The short examples show initial authored text, not the more verbose stabilized file. Retaining established IDs is required for rename and history; deleting an ID is not a rename mechanism. Stabilization must be available through the shared source admission service without creating records in a GUI. Missing-ID diagnostics and the inserted IDs must be reviewable by a text-only client.
+
+`$name` resolves only a parameter of the current definition. `@name` in value position resolves a case property; `@name(...)` resolves a calculation; `[@name]` resolves a unit. Imported qualified spelling is delegated to the library grammar. Duplicate binding keys reject. Names are parsed to stable IDs, and an accepted rename updates the relevant tokens. `none` is permitted as an entire binding/body/predicate hole, never as an arithmetic scalar. Parentheses, unary operators, multiply/divide, add/subtract, comparisons, `&&`, `||`, and conditional expressions require explicit precedence in the normative extension; comparisons are non-associative, so chained comparisons reject. Quoted prose is never implicitly parsed as this expression language.
+
+To test D against B, compare first-property creation, a two-input budget and a nominal/degraded change in both a small and a dense model. Proposed acceptance: D needs no additional page change and at most one additional context-choice action for the first case; editing an existing case needs no extra case-creation action. If D repeatedly requires recreating declarations or reentering unchanged inputs where B would show clear inheritance, its claimed simplicity is falsified. Record task completion/time and wrong-context errors, not just click counts.
+
+### 3.4 Text-only development and cognitive load
+
+The source examples are a minimum analysis fragment assuming existing subjects `receive`, `dispatch` and `respond`; they do not prove that an entire model can be authored through text. The acceptance fixture must include those OA/SA subjects and all other referenced records, local definitions or explicit supplied package imports, with no prerequisite GUI-created records. Adding a case, defining/reusing a calculation, declaring a quantity/unit, inspecting a missing input and correcting a constraint must all be possible from the published language and API alone.
+
+| Text-authoring concern | Proposed treatment and falsification gate |
+| --- | --- |
+| First useful calculation | Inline arithmetic and local definitions are sufficient; a reusable definition or library publication is optional. An engineer can create the one-value and two-duration examples from a blank source bundle using documented admission, with no form-only operation. |
+| Identity noise | Initial authoring may omit newly allocated IDs; references use readable aliases. Stable IDs remain in accepted declarations and must round-trip. Evaluate both initial and stabilized files; omitting UUIDs from this report is not evidence that the real files are uncluttered. Folding is supplementary, not a requirement for understanding an ordinary editor's text. |
+| Hidden context | Every binding has one explicit case. Property names, unit references and case blocks carry meaning; they must not be removed merely to shorten text. A property read cannot fall back to another case or UI selection. A diagnostics client can locate the case, property and expression token responsible. |
+| Repetition across cases | D repeats unchanged inputs and derived expressions. With 1,000 applicable properties and 20 complete cases, that can mean 20,000 binding rows. This is a material design cost, not solved by a search box or collapsed list. Compare B's baseline plus explicit overrides using the same task and provenance display; reverse D's preference if repetition dominates comprehension or causes divergent copied formulas. |
+| Locality and file organization | Existing explicit source bundles/includes should let authors group properties/cases/definitions into files. Analysis extensions must retain exact authored bytes and targeted token edits, with stable references after a declaration moves between supplied files. Splitting files alone does not solve the current global alias namespace's cognitive cost; scoped naming would need a separate deliberate language decision. |
+| Reuse without expanded clutter | Local calculations and pinned imported definitions need one documented reference form each, with no duplicated editable expansion of sealed definitions. Package transport and import spelling remain shared library-design obligations. A text-only engineer must be able to supply the declared package bytes and pins, not rely on an invisible desktop cache. |
+| Meaningful notation | The seven-entry dimension vector is compact but opaque without its fixed order. Compare it with named nonzero dimensions such as `dimension { time: 1; }` before freezing syntax. The latter is an alternative spelling proposal, not a second admitted grammar. Similarly, repeated `bindings` wrappers and prefix-heavy declarations warrant user comparison; do not add shorthand whose case or type resolution becomes implicit. |
+| Human and AI edits | The normative extension must define precedence, name resolution, ID retention, canonical exact literals and located diagnostics, and provide complete examples. A client following that specification must predict admission and evaluation without private Rust structures or GUI state. A one-input edit should leave unrelated source bytes and accepted identities unchanged. |
+
+Use two authoring evaluations after the semantic choice: a complete small OA/SA example and a generated dense source bundle containing at least 1,000 properties, 20 cases and 100 reusable definitions. Those are proposed stress fixtures, not claims about current capacity. Record source size, changed lines for one assumption, task completion, wrong-case edits, diagnostic locality, and parse/apply/evaluate latency under stated hardware. Include moving a definition between files, a parameter rename retaining identity, adding an alternative, a deliberately invalid unit change followed by repair, and portable save/reopen. Compare D with B before treating D's source ergonomics as settled. A larger standalone textual workflow audit is outside this assignment.
+
+## 4. Bounded Q1 semantics
+
+### 4.1 Admission and expression typing
+
+An accepted case may contain explicit unbound inputs, empty definition bodies and empty checks with completeness warnings. Every live property/unit/kind/calculation/constraint/subject reference must resolve to the correct kind. Every property reference reachable from a case expression must have a binding row in that case; its row may be `None`. Missing rows are a structural error, which a graphical planner can resolve by explicitly adding visible unbound input rows in the same batch. Unknown identities, wrong types, recursive definitions and cyclic case-property dependencies reject the whole candidate. A definition may use parameters and other definitions, never `Property` nodes.
+
+Calculation call graphs and case dependency graphs must be acyclic even if a syntactic branch is currently unused. Both branches/operands are statically type checked. Dynamic `if`, `&&` and `||` use ordinary left-to-right conditional evaluation: only a known condition/left Boolean can select or short-circuit. A missing/error condition propagates; it is not converted to false. Thus `true || unknown` is true because the unknown branch is unnecessary, while `unknown || true` remains unresolved under this explicitly ordered evaluation contract. Reports identify the dependencies actually consulted. That distinction needs source/UI guidance and a falsifier test.
+
+Lists are finite, flat and homogeneous. Empty list typing comes from a declared target/parameter type. Sum takes a homogeneous numeric or linear-quantity list and an explicit typed initial value; empty sum returns that initial value. There is no implicit “sum all children,” open-ended query or dynamic collection discovery. Property aggregation over architecture topology is a separate future design, not an assumed behavior of `sum`.
+
+### 4.2 Exact numbers
+
+Q1 represents a rational as normalized integers `n/d`, `d > 0`, gcd 1, with zero represented only as `0/1`. Canonical wire integers have no plus sign or leading zeroes. Decimal source literals are converted arithmetically to rationals; they never pass through f64. The canonical writer can always emit an integer when `d == 1` or `ratio(n, d)` otherwise; `ratio` is a literal constructor, and division is a separate expression operation. Authored decimal spelling is preserved by ordinary source editing. A terminating decimal may be longer than the allowed literal token, so canonical serialization must not insist on decimal expansion. Noncanonical wire rationals reject instead of being silently rounded or ambiguously compared.
+
+Proposed reference profile: at most 4,096 bits for each reduced numerator/denominator, 1,234 decimal digits in a numeric token's mantissa or canonical ratio component, absolute decimal exponent at most 128, expression depth at most 128, at most 65,536 expression nodes per case/definition closure, list length at most 1,024 and call depth at most 32. Signs and punctuation are not decimal digits. The actual 4,096-bit bound still applies; not every 1,234-digit integer fits. Integer powers are limited to -16 through 16. These are reviewable engineering limits, not measured performance claims. Operations use bounded intermediates, normalize and then enforce the stated result bound; inputs and temporary allocation are bounded before multiplication/division. Crossing a computational bound reports NumericLimit, never a truncated value.
+
+Source, wire and model admission must share these value limits. The earlier 256-digit source proposal was inconsistent with a 4,096-bit admitted literal and is rejected: an accepted `Expr::Number` containing `10^300` must serialize back to the same literal AST. The integer/ratio fallback avoids the exponent bound and also handles, for example, `1 / 2^4095` without emitting 4,095 fractional digits. Exact values at both 4,096-bit boundaries must survive model-to-source-to-model and JSON round-trips; a formatter may not rewrite a literal into an arithmetic AST to evade its literal limits.
+
+Addition/subtraction/multiplication/division and bounded integer powers are exact. Division by zero and zero to a negative power fail evaluation. `0^0` is explicitly rejected in Q1. Comparisons use rational arithmetic; no global epsilon exists. Existing DataValue::Integer remains i64 and retains its current precision/boundary rules. There is no automatic binding to payload type defaults and no implicit conversion of an analysis result into DataValue; a future adapter must check integrality/range/type exactly.
+
+Unary minus/absolute value accept Number or linear quantity; logical negation accepts Boolean. Arithmetic and ordering reject Booleans/lists. Equality/inequality accepts matching Boolean types or compatible numerical scalar types; list equality is outside Q1. Number plus quantity and implicit conversion from a named dimensionless kind to Number reject. Quantity divided by Number preserves the quantity kind; Number divided by a linear quantity yields an anonymous inverse dimension. A quantity power of one preserves its kind, power zero gives Number one when defined, and other powers yield anonymous dimensions. These typing rules apply before evaluation; their numeric zero-domain failures are evaluated separately.
+
+### 4.3 Quantities and units
+
+Quantity kind identity is the resolved definition identity, not its name, symbol or seven-dimensional vector. Two different kinds may share a dimension and still be incompatible. A unit's declared kind must match the value's type. In Q1, canonical coordinate is `magnitude * scale + offset`. Linear units require zero offset. Affine units belong to an affine kind with a declared linear difference kind of the same dimension; both coordinates use the same coherent scale basis. Type checking verifies dimension components and arithmetic exponent bounds.
+
+| Operation | Q1 rule |
+| --- | --- |
+| Linear add/subtract/compare | Same resolved kind required; convert coordinates exactly. |
+| Affine point minus point | Same affine kind; result has its declared linear difference kind. |
+| Point plus/minus interval | Interval must have that affine kind's difference kind; result is a point. Interval plus point is allowed. |
+| Point plus point, interval minus point, point multiply/divide/power | Reject as an invalid operation. Comparisons between points of the same affine kind are allowed. |
+| Number scaling a linear quantity | Preserve kind, with exact scalar scaling. |
+| Product/quotient of different linear quantities | Produce an anonymous derived dimension. Do not guess a named physical kind. |
+| Linear quantity divided by the same kind | Produce an exact dimensionless Number. |
+| `AsKind(kind, value)` | Only an anonymous derived result with matching dimension can acquire the explicitly chosen linear kind. It cannot silently convert an already named kind into another named kind. |
+| Conversion between units | Same resolved kind; exact scale/offset rules. Changing display unit does not mutate the authored literal or its magnitude. |
+
+`Dimension` exponents are ordered exactly as in the Rust sketch and each admitted component is bounded to -32 through 32. An anonymous derived quantity is an intermediate result, not a declared property/parameter type; assigning it to a named result requires explicit AsKind. This is deliberately more explicit than using dimensional equality to label force-times-distance automatically as either energy or torque. Revisit this authoring burden if a catalog of unambiguous registered kind operations can be independently specified and justified.
+
+Q1 does not admit logarithmic units or nonrational scale factors. A prospective π-based UnitDefinition must not be represented by a rational approximation with an “exact” label. An approximate-domain extension needs a distinct scale/expression representation and a corresponding profile; its source/JSON form and numerical guarantees remain an open design item. Until then degree/radian conversion and transcendental functions receive Unsupported in the capability/workflow layer; unknown syntax in strict source remains a located rejection. This limit is material to release scope.
+
+### 4.4 Outcomes and revision identity
+
+Admission and evaluation are different operations. An unmet engineering requirement does not make a structurally valid model unsavable.
+
+```rust
+enum ValueOutcome {
+ Value(AnalysisValue),
+ Missing { inputs: Vec },
+ Unsupported { operation: String, required_domain: String },
+ Failed { diagnostics: Vec },
+}
+enum CheckOutcome {
+ Satisfied,
+ Violated,
+ Unresolved { causes: Vec },
+}
+struct EvaluationReport {
+ case: Id,
+ model_snapshot: SnapshotIdentity,
+ definition_environment: EnvironmentDigest,
+ numeric_profile: ProfileId,
+ values: BTreeMap,
+ checks: BTreeMap,
+}
+```
+
+Public `AnalysisValue` is a Boolean, an Exact Number, a quantity `{resolved_kind, canonical_coordinate: Exact}`, or a homogeneous flat list carrying its resolved element type. Anonymous derived dimensions are internal intermediates only: a declared result/property must acquire its explicit kind before it can produce a public value. Quantity display conversions accompany that result as derived presentation and never replace the authored literal. JSON represents every Exact numerator/denominator as canonical decimal strings, including converted display values.
+
+Cause collections are nonempty for every nonvalue outcome, deduplicated and stably ordered. Missing includes absent input values or admitted empty definition/check bodies. Unsupported is distinct from a failed supported operation such as division by zero. A check returns Satisfied/Violated only for an evaluated true/false Boolean; the other value outcomes become Unresolved with their original classified causes and dependency path. No-check cases report “No checks,” not vacuous whole-model success. A case summary of passed checks is not a claim that every unrelated input is populated.
+
+Q1's admitted AST contains only its supported operations. Consequently an unknown function is a source/admission error, not an accepted Q1 node fabricated solely to produce `ValueOutcome::Unsupported`. In the first slice, Unsupported belongs to capability or explicit conversion/evaluation requests outside Q1; the value outcome variant is reserved for a future multi-profile contract that can admit the requested operation. That extension must define when admission versus evaluation reports unsupported capability. Neither path implements the missing mathematics.
+
+The core evaluator consumes an immutable model plus fully resolved immutable definition environment and explicit case ID. It performs no command, history operation, filesystem/network access or source rewrite. Dependency plans and results are derived data. A client supplies its captured document/server revision stamp; server code takes that stamp from the captured stored envelope, never from an untrusted claim in a request. Results retain the full environment digest and numerical profile. A result can describe only that snapshot. Async desktop results for superseded snapshots must be discarded or visibly marked stale. An accepted source/comment-only revision still gets the current document/service stamp even if numerical values are identical.
+
+Proposed UI behavior: Evaluate never applies another pending editor. Either evaluate the clearly labeled accepted snapshot or require explicit Apply/Cancel of the analysis draft; select one behavior and test it. API evaluation likewise cannot write model state. Proposed route shape can follow current validation endpoints, returning the captured ETag/revision and structured report; exact route naming belongs to the shared API design.
+
+## 5. Falsifying worked examples
+
+| Example | Expected result; what it can falsify |
+| --- | --- |
+| Nominal/degraded duration | Nominal `750 ms + 1 s = 7/4 s`, check `<= 2 s` is Satisfied. Degraded uses the **same property IDs**, binds `1250 ms + 1 s = 9/4 s`, and is Violated. Evaluating either cannot change or read the other's bindings. |
+| Decimal and fractional arithmetic | `0.1 + 0.2 == 0.3` is true; `ratio(1,3) + ratio(1,6) = ratio(1,2)`. Normalized results and exact wire strings are independently predicted, without consulting the evaluator. |
+| Literal serialization closure | An admitted exact literal `10^300`, maximum permitted 4,096-bit numerator, and `ratio(1, 2^4095)` with the denominator expanded as its integer digits all survive canonical source and JSON round-trips with the same literal AST. Reject an actual 4,097-bit component. A long terminating decimal must use the bounded ratio spelling when needed. |
+| Existing large integer | Importing an i64 maximum as an explicitly exact analysis literal preserves 9223372036854775807. Adding one produces the exact rational integer 9223372036854775808, but conversion back into DataValue::Integer must reject. Existing i64 admission must not be changed. |
+| Unit mismatch | `1000 ms == 1 s` is true. `1 s + 1 kg` rejects type checking. A free legacy unit string `"s"` creates no typed unit identity or conversion. |
+| Equal dimension, different kind | Comparing a Torque value with Energy rejects even though dimensions agree. `AsKind(Energy, force * length)` is an explicit dimension-checked assignment; directly `AsKind(Energy, torque)` rejects. |
+| Affine temperature | With explicit point/difference kinds and rational units: 20 Celsius-point converts to 293.15 Kelvin-point; 30 Celsius-point minus 20 Celsius-point gives 10 Kelvin-interval; adding that interval to 20 Celsius-point gives 30 Celsius-point. Adding two temperature points rejects. |
+| Missing/error/false | A declared duration input bound to `none` makes its dependent budget Unresolved/Missing. A known denominator zero gives Unresolved/Failed(DivisionByZero). A computed 9/4 s against 2 s is Violated. None may be displayed as a successful structural validation or the others' outcome. |
+| Everyday nonrational math | `30 deg → rad` and `sin(30 deg)` are Unsupported under Q1, not an “exact” decimal π conversion. A later approximate profile must independently demonstrate results near π/6 and 1/2 with its promised numerical guarantees. This is an open release gate. |
+| Identity and purity | Rename a calculation parameter and its unit alias: stable parameter/definition identity and results remain. A calculation definition containing a project Property reference rejects. A recursive call rejects, including inside an unused branch. |
+| Conditional evaluation | A well-typed `true || missing_boolean` is Satisfied without consulting the right operand; `missing_boolean || true` is Unresolved. An invalid unit/type expression on either side still rejects static validation. |
+| Library revisions | Two cosmetic import aliases resolving to the same digest/member/dependency closure yield the same definition identity. A changed pinned revision is not automatically the same quantity type because a member name/UUID survived. Rebinding is explicit and invalidates results. |
+| Cosmetic package update | Under digest-based kind identity, changing only a package comment still makes its unchanged Duration definition a different kind. Adding old/new Duration values rejects and AsKind cannot bridge them. If the intended selective-update workflow requires these values to mix, the conservative identity rule fails that workflow and an explicit compatibility design is required. |
+| No automatic pruning | Deleting a referenced engineering property or definition without removing/rebinding dependent formulas rejects the whole batch. No term is silently deleted from a sum or constraint. An explicit complete replacement batch may succeed even if its intermediate command sequence is temporarily incomplete. |
+
+## 6. Integration and the library boundary
+
+The sibling library proposal uses `Local(Id)` or import/package/member references. An ImportId's pinned complete dependency closure is immutable: upgrade creates a new import and explicit selected-use rebindings. A resolved definition key includes exact package digest, member identity and dependency closure; alias spelling does not participate. Stable logical origin `(PackageId, MemberId)` remains useful for correspondence, but is not sufficient for type/evaluation equality across revisions. Definitions referenced by Q1 never fetch or resolve “latest.”
+
+Exact evaluation provenance and quantity type compatibility need not ultimately be the same equivalence relation. Treating the full package digest as kind identity is conservative but makes even comment-only repackaging incompatible. Before library release, compare (1) explicit versioned compatibility declarations with checked conversion bridges, (2) a specified semantic definition fingerprint including its semantic dependency closure, and (3) retaining strict identity and requiring all interacting uses to be rebound together. Option 1 needs a trust and validation contract; option 2 needs a normative canonical semantic form and deliberate treatment of labels/metadata; option 3 can defeat selective updates. No alternative is ratified here. Results must retain the exact package/environment digest whichever compatibility policy is selected, and same names or dimensions alone remain insufficient. The bounded Q1 slice has no cross-revision bridge.
+
+The evaluator's minimum interface is a typed resolver returning a validated QuantityKind, Unit or Calculation plus its resolved identity/environment evidence. Root-owned library code chooses package transport/catalog envelopes. Neutral definitions may reference each other through that resolver. Current layer-owned DataType/Interface library mounts, if selected by the sibling design, remain an explicit compatibility adapter; analysis must not assume that `TypeRef::Named(Id)` is already neutral or that mounted architecture instances are pure definitions.
+
+| Existing boundary | Required integration behavior |
+| --- | --- |
+| Model identity | New analysis Elements enter the current global IDs/aliases. Local neutral definitions need identity/name/alias services and collision rules in their catalog. Parameter IDs stay scoped to their definition. Imported definition identity must never be confused with a local Element UUID. |
+| References and deletion | Add typed Model/Definition/Parameter reference traversal for Expr. Existing UUID visitors may wrap Model references but cannot blindly rewrite all UUID-shaped data. Analysis subject deletion either rebinds/removes the declaration and affected bindings/checks in an explicit batch or refuses with impact. Do not reuse existing list-pruning rules to drop an expression operand. |
+| Layer and ownership | Property subjects, case bindings and documented constraints stay in the Element's OA/SA layer. Checks belong to a same-layer case. Neutral definitions cannot capture model records, so permitting a DefinitionRef does not weaken ordinary same-layer references. |
+| OA↔SA transition | Map subject/property/case/check identities and all Expr::Property/documented-constraint references through explicit counterparts. Calculation/unit/kind pins remain the same neutral definitions. Never remap ParameterIds as model IDs or copy a neutral definition into OA/SA. Cases/checks require deliberate new catalog/closure rules and exact forward/reverse tests. |
+| Source and JSON | Introduce a deliberate next schema/language version with closed records, AST grammar, located diagnostics and schema fixtures. Source token ownership must preserve comments and rewrite stable property/definition/parameter references correctly. Generic raw-string replacement is insufficient. |
+| History and recovery | Exact Project+SourceBundle snapshots include accepted definitions/import pins and analysis ASTs. Raw invalid expressions remain drafts. Add closed typed analysis facets/binding keys to semantic review rather than arbitrary JSON patches. Historical imported references must retain enough original pin/origin information to be readable after a live import is removed, without validating them as live references. |
+| Publication and API | Analysis requests operate on captured ETag-qualified snapshots. State-changing analysis/library commands retain current atomic admission and no-op semantics. Schema clients must see real definitions, binding types, numerical representation and classified results; an opaque expression string is not the contract. |
+| Legacy migration | Preserve source7 Constraint/guard/event/message prose and unit strings exactly. Add no heuristic parsing, unit guessing or default numerical values. Structured quantity use in payload DataValue/TypeRef is a further integration slice; these engineering-property examples alone do not prove typed payload parity. |
+
+## 7. Exact first slice, remaining decisions and revisit evidence
+
+The first production slice proposed for root approval is one **Q1 duration budget workflow in both OA and SA**, including exact numbers, local neutral Duration/second/millisecond definitions, two explicit cases sharing typed properties, inline expression, reusable two-parameter calculation, formal check, GUI/source/REST authoring and exact history/recovery. It must not be released as the entire quantity/calculation capability merely because it passes.
+
+Acceptance must establish all of the following:
+
+1. Independently construct the complete nominal/degraded models and sources and obtain exactly 7/4 and 9/4 seconds, with different true/false checks and stable shared property identities. Demonstrate reusable call parameter identity independently of names.
+2. Drive the **same** creation/change through graphical controls, source and real HTTP. Compare full models, accepted source bytes, references and result stamps. Evaluate alone changes no model, revision or Undo/Redo state.
+3. Reject wrong layer/kind/units, duplicate/missing parameter arguments, missing binding rows, definition capture and cycles atomically. Retain admitted explicit `none` inputs and show Missing distinctly from False and DivisionByZero.
+4. Exercise exact decimal/fraction/i64-boundary examples and numerical limits, including literal AST/source/JSON closure at 4,096-bit boundaries and the long terminating-decimal counterexample. Check read-only unit conversion versus changing an authored unit literal. No f64 parse/round-trip is permitted in the Q1 evaluator or exact wire adapter.
+5. Save, Undo, Redo, reopen and recover a raw invalid expression using independently retained complete snapshots. Changing valid UUIDs while preserving names/numbers must fail identity assertions. Pending other editors must not be implicitly applied by Evaluate/navigation.
+6. Exercise creation/editing at minimum and wide native sizes, with a dense model and duplicate names. Test D against the direct-baseline/explicit-override alternative using the action/context-error criteria above. All property/case/function/parameter/unit choices must be reachable without traversing global homogeneous lists.
+7. Demonstrate honest Unsupported behavior for degree/radian/trigonometric requests; keep their approximate-domain acceptance and full structured payload/library integration visibly open. Unsupported is a successful refusal test, not evidence that the requested operation is implemented.
+8. Complete the small source-only workflow from a blank supplied bundle using only the published specification and admission API. Include subject declarations, definitions, both cases, inline and reusable calculations, checks, stable parameter rename, split-file edit, invalid-input repair and save/reopen. Inspect the real stabilized text for identity/boilerplate cost. Run the section 3.4 dense fixture and compare D with B before claiming that the analysis notation supports large-model authoring comfortably.
+
+| Consequential unresolved choice | Evidence that should decide or reopen it |
+| --- | --- |
+| D versus baseline values plus overrides (B) | Native and text-only task comparison including ordinary context-independent properties, creation overhead, repeated assumptions/formulas, stabilized-source noise, propagation surprises and wrong-context edits. Reverse preference if explicit complete case bindings cause more confusion/work than clearly labeled baseline inheritance. |
+| Q1 alone versus F versus Q+F release scope | Representative engineering formulas must include angular conversion and transcendental cases, not only rational budgets. Q1 cannot win a claim of broad capability by excluding these tasks. Freeze a verified approximate profile before claiming their support. |
+| Typed subject association versus true semantic ownership | Deletion, navigation and property discoverability tests on both Element and Relation subjects. Avoid changing parent semantics merely to reuse an existing tree renderer. |
+| Explicit anonymous-dimension AsKind versus registered kind operations | Force/acceleration/energy/torque examples and authoring measurements. A shortcut is acceptable only if the kind algebra is unambiguous and versioned, never inferred from display names. |
+| Structured quantity types in existing data/payload contracts | Real message/default/type workflows need a deliberate shared QuantityValue and type-reference design. Retaining old annotations is compatibility, not completion of that integration. |
+| Definition/package compatibility and historical evidence | Library revision/mount design and independent review must prove pin provenance, selective updates and historical readability. Resolve the unchanged-Duration/comment-only-repackaging falsifier explicitly; exact evaluation provenance must survive any reviewed cross-revision compatibility policy. Do not silently accept same-name or same-member-version changes as type equivalence. |
+
+The root should record the selected alternatives, rejected options, open approximation/payload/library work and resulting release criteria in the durable ledgers. The next highest-information step is independent criticism of these examples and the simple-property authoring flow, followed by one agreed vertical implementation. No statement in this report closes the user's broader goal.
diff --git a/harness/release-behavior-creation-native-20260911.md b/harness/release-behavior-creation-native-20260911.md
new file mode 100644
index 00000000..92531d10
--- /dev/null
+++ b/harness/release-behavior-creation-native-20260911.md
@@ -0,0 +1,149 @@
+# Behavior creation cancellation — native Windows check, 2026-09-11
+
+Codex-9e8r6t /root/palette_finish. Root assigned exclusive native input; all input used the Computer Use skill's `@oai/sky` through `node_repl`. This is a bounded cancellation/layout check, not acceptance of new behavior objects or the complete creation workflow. No Rust/Cargo work occurred.
+
+## Exact candidate and isolated state
+
+Waited for the author's post-lint immutable GUI rather than substituting the earlier build. Copied `.local/behavior-creation-20260911/gui-verified/{arcadia-studio.exe,libunwind.dll,manifest.json}` to `.local/native-qa/behavior-20260911-v4/bin`.
+
+| File | Bytes | SHA256 |
+| --- | ---: | --- |
+| `arcadia-studio.exe` | 111163904 | `d4d9c2bd937e301ff1009d7cb93a34ee5aa6dfc837ff7e87d468c85371b20c31` |
+| `libunwind.dll` | 190976 | `f45604a12e8bcd839fd86f667c1be1cc7c4f9da2b3c69ff381ac708f0e1ae7d4` |
+
+The copied author manifest records the source snapshot and narrow post-lint difference. This reviewer did not rerun its automated gates. GUI started at **08:50:49 UTC**, PID **5184**, with `LOCALAPPDATA` and `APPDATA` redirected to fresh `v4/profile/local` and `v4/profile/roaming`. Runtime PATH contained only the staged bin and Windows/System32 directories. `launch.json` records the executable, environment and timestamp. No existing recents/recovery store was copied.
+
+Copied the entire preserved `.local/native-qa/palette-20260910-v3/checkpoint-transition-reopen` into `v4/work/basic-rescue`; pre-open comparison required all six source files to match exactly. Opened this copy through Studio's native Open dialog. Main returned window **6095570**, exact staged process path; Open dialog **3277858**. A file-dialog `set_value` attempt reported `Requested property was not in the CacheRequest (0x80070057)`. Fresh observation plus coordinate focus/type successfully entered the full authorized path. No user-stop, helper timeout, security prompt or unsupported UI automation occurred.
+
+## Actual window sizes and supported sizing procedure
+
+Initial capture was **1442×932**, corresponding to the configured **1440×900 client**. Minimum capture was actually observed as **1102×732**, corresponding to the supported **1100×700 client**; no screenshot scaling or source setting alone substitutes for this observation.
+
+Direct corner/bottom drag attempts did not resize the window. The working native sequence was:
+
+1. `Alt+Space`; inspect the returned System menu and select **Size**.
+2. Press **Right**, then drag the right edge inward. The capture became 1102×932, with width clamped at the supported minimum.
+3. Repeat `Alt+Space` → **Size**, press **Down**, then drag the bottom edge inward. Capture became 1102×732.
+
+Each input used the current returned window and was followed by a fresh observation. The evidence supports this alternative sizing procedure; it does not identify an underlying defect in the initial direct-drag attempts.
+
+## Observed bounded matrix
+
+Every draft below was canceled; **Create and open was never pressed**. The accepted model count remained the baseline display of 10 objects / 2 links. Source equality was independently checked after the final Save, as recorded below.
+
+| Check | Observed result |
+| --- | --- |
+| Wide OA family chooser | New shows three cards: Operational process, Scenario, State machine, with short purposes. Cancel remains at the bottom of the creation card. |
+| Wide OA process naming | Choosing Operational process focused the name field automatically; typing worked without another field click. A long name containing `雨` and an em dash stayed within the single-line input and horizontally scrolled to the caret. Create/Cancel remained visible. |
+| First Escape from focused process name | One Escape removed the whole draft/card, restored **All changes saved**, and showed **Behavior creation cancelled**. It did not merely unfocus the input. |
+| Minimum OA family/scenario | All family cards and actions fit. Choosing Scenario focused its name input. Two explicit viewpoints were shown, neither initially selected. Selected **Participants · interactions**. Ownership text explicitly said OA layer root. |
+| Minimum optional context | Initially collapsed. Opening it showed search/results in the scrolling field area; Create/Cancel stayed below that area. Search `capability` produced one result, **Rescue capability**, with kind/alias/OA-root context. Selected it and collapsed the picker; the summary retained name, kind, alias and layer. Long scenario name stayed inside the input. Explicit **Cancel · Esc** restored the clean saved state. |
+| Minimum machine owner | Choosing State machine focused its name input. Search `rescue_team` reduced two existing OA participants to the intended Rescue team. Candidate and selected summary showed Entity / rescue_team / OA root. Selected this owner. |
+| Minimum first-view option | **Create the first state view** was initially unchecked; toggled it on as draft state. The explanation that the machine starts without regions/states and both actions remained visible. Refocused the retained long name, then one Escape canceled the machine and optional-view draft together. Clean saved state returned. |
+| Minimum SA family/chain | After cancellation, switched to SA. New correctly offered **Functional chain**, Scenario and State machine. Functional-chain naming autofocused; a long Unicode draft stayed within its input. First Escape canceled it and returned to the existing SA state-machine workspace. |
+| Save after all cancellations | **Save all** completed with **All source files saved** and a clean title. No confirmation or recovery dialog remained. |
+
+Typed long drafts deliberately exercised horizontal input bounds, not multiline text wrapping. The fixture's candidate labels are short root names; this run does not establish wrapping of long ancestor chains, same-name nested-owner discovery, six-result pagination, or large-catalog performance. The optional context's unfiltered list did require scrolling at minimum size; fixed actions remained visible and filtering removed the overflow. No actionable creation defect was found within the exercised matrix.
+
+## Independent source preservation check
+
+At **08:58:59 UTC**, compared complete file inventory, length and SHA256 after all cancellations and native Save against the pre-open baseline: **6/6 files PASS; no added or missing files**. Exact machine-readable records are `v4/baseline-source-manifest.json` and `v4/cancel-save-verification.json`.
+
+| Relative source | Bytes | SHA256 before and after |
+| --- | ---: | --- |
+| `project.arcadia` | 4844 | `b35a3f63f223cc4fe2760d6308e87b016ed1eadfbef0a3a4bd051b52c9080958` |
+| `rationale.arcadia` | 57 | `c01867c9dc0d40726853119fac3c6ad24a40d8d362a93a8b9d20df04ec2e273f` |
+| `traceability.arcadia` | 395 | `f778acaaa85de0940cedcd9514cd803032a11e782d859454203235febb73e5f0` |
+| `oa/participants.arcadia` | 403 | `094cab67f34b64902942c10a35bbcd0f760886d862588a0816d6ceb57bacf51b` |
+| `oa/activities/activity_assess_incident.arcadia` | 376 | `ae41d7c20b062b39c2edab7fb890a3d88a9ce18fd8d03018ef2d6f95eeff62e8` |
+| `sa/participants.arcadia` | 124 | `fb975b83d3ec164c38936bf27fe7d2021cc46805574902a534744b040f7d3ae8` |
+
+`stderr.log` was **0 bytes**. Screenshots were inspected directly in Computer Use results; no separate screenshot archive is claimed.
+
+## Handoff and remaining gates
+
+Native-input lease returned explicitly to root at approximately **08:59 UTC**. PID5184 was left running at minimum size, SA Behavior / States & modes, displaying the baseline **Decoy operating modes** selection. All drafts were canceled, all source saved, no dialog open. This reviewer performed no further native input after handoff.
+
+Actual creation and command-correlated opening, model/source Undo/Redo, recovery of a pending creation, modal-priority Escape, source-write rejection during creation, long nested labels, and crowded picker pagination remain separate acceptance gates. Automated evidence for some of them exists in the owner's report; it is not relabeled as native evidence here. Root owns the independent accepted-object oracle and next native work.
+
+## Follow-up: accepted creation, history and reopen
+
+The section above records this reviewer's earlier cancellation-only session. Root subsequently performed the following native model-producing sequence in the **same D4D9C2BD…1B20C31 candidate**, at the actually observed **1100×700 client**. Root retained exclusive native input; the reviewer independently reran the existing v2 checker against immutable checkpoints at **09:18:19–09:18:23 UTC**. No live `work` model, profile or UI was accessed during that readback, and no Cargo/compiler ran. UI observations below are attributed to root; checkpoint assertions are this reviewer's independent execution of the previously specified oracle.
+
+1. In OA **Behavior → New → Operational process**, type **Coordinate rescue**, then **Create and open**. The new process opened. Save and preserve `checkpoint-process`; Undo **once**, Save and preserve `checkpoint-process-undo`; Redo **once**, Save and preserve `checkpoint-process-redo`.
+2. In OA **Behavior → New → Scenario**, type **Rescue coordination conversation**, explicitly select **Participants · interactions** (`ParticipantInteraction`), expand optional context and select **Rescue capability** (`b451c000-0000-4000-8000-00000000001f`). **Create and open** opened the scenario. Save as `checkpoint-scenario`; separately perform one Undo/Save and one Redo/Save, preserving `checkpoint-scenario-undo` and `checkpoint-scenario-redo`.
+3. Switch to SA, then **Behavior → New → State machine**. Type **Rescue team operating modes**, select the existing SA **Rescue team** SystemActor (`c0629449-1209-4b50-afac-f558a9a0fc7f`), and check **Create the first state view**. **Create and open** selected the expected machine/view. Save as `checkpoint-machine`; separately perform one Undo/Save and one Redo/Save, preserving `checkpoint-machine-undo` and `checkpoint-machine-redo`.
+4. Open the saved project through the actual native file picker, then Save again and preserve `checkpoint-creation-reopen`. Root reported a dialog-target retry: typing against the parent window did not fill the dialog, and a bounds error required fresh dialog observation/retargeting. The subsequent dialog Open succeeded. The final model/source checkpoint proves the resulting reopen, not the failed input attempt.
+
+All ten named checkpoints are whole-directory snapshots under `.local/native-qa/behavior-20260911-v4`. Root reported the same running PID5184/window6095570 and zero-byte stderr at completion; this consolidation did not poll or control that live process.
+
+### Independently rerun contract and exact file checks
+
+**13/13 commands passed**, including the checker's falsifier self-check and pinned baseline check. Every first-commit checkpoint was its own fresh-role carrier; its **original** role identities were then reused for Redo and final reopen. Each Undo used the preceding first-commit stage as expected state and the corresponding creation's first-commit snapshot as explicit `UNDO_FROM`. Thus Redo is not allowed to pass by borrowing newly substituted identities from itself.
+
+| Checkpoint | Complete semantic and source result | Exact physical source files |
+| --- | --- | ---: |
+| Process / Process Redo | Predicted OA process and all previous data; 7 reachable sources | 7 |
+| Process Undo | Exact initial baseline model/identities and 6 reachable sources | 7, including 1 proven retained file |
+| Scenario / Scenario Redo | Cumulative process plus explicitly qualified/contextual scenario; 8 reachable sources | 8 |
+| Scenario Undo | Exact original Process checkpoint; 7 reachable sources | 8, including 1 proven retained file |
+| Machine / Machine Redo | Cumulative objects plus owned machine and opt-in first view; 9 reachable sources | 9 |
+| Machine Undo | Exact original Scenario checkpoint; 8 reachable sources | 9, including 1 proven retained file |
+| Reopen | Full Machine contract using original machine identities, plus exact Machine Redo equality | 9 |
+
+The complete predicted Project and SourceBundle comparisons cover root ownership versus scenario context, explicit viewpoint, exact names/defaults, retained unrelated records, and the new machine's SystemActor parent. The optional view is **Rescue team operating modes · states**, SA StateMachine projection with exactly one machine placement at **60,60**, size **336×104**, no states or regions and default options. These are the independently specified fixture expectations, not values inferred wholesale from the produced model.
+
+In addition to the oracle, the runner compared **every physical file's actual bytes** between `checkpoint-machine-redo` and `checkpoint-creation-reopen`: **9/9 equal**, with identical path inventory. All eleven input directories (baseline plus ten checkpoints) retained the same complete inventory, lengths and SHA256 values before and after execution. No checkpoint source files were copied into the tracked evidence directory.
+
+The durable runner, every command argv/stdout/stderr/exit code/timing, all checkpoint file hashes, and candidate/oracle/screenshot provenance are in `harness/experiments/behavior-creation-native-20260911/`:
+
+| Artifact | SHA256 |
+| --- | --- |
+| `verify.py` | `4921c4615071240c3ac3bbe1223c0db3bf472fe5e3eec2ae5dac12f95b1674df` |
+| `commands-results.log` | `f5bfbee185f7064419b1bd9fe33ec6a48526b5bbe3f818c006feb74eddf8e189` |
+| `manifest.json` | `356dfbb27dec04764a4b3f2372602f39953b472baac0a3de3e72acd9c1d76b8a` |
+| Existing v2 executable | `056eefd444924916bf6ac3c4897ab2ff4a8a4bb892e1dbc16adad32e59bf6a36` |
+| Oracle source | `51ab2ffa1826dd949b79f3a9690042a2f9e38daf9ed91517cade3861482117ba` |
+
+Reproduce without building: run `python harness/experiments/behavior-creation-native-20260911/verify.py` with the preserved existing executable, checkpoints and staged runtime. The script verifies the expected executable/source hashes before executing. It prepends the staged bin to its child runtime PATH. Its JSON records absolute executed arguments and repository-relative input manifests.
+
+**Harness correction:** oracle v1 incorrectly required every disk file to remain reachable after Undo. Studio's documented safe saver retains newly detached files instead of deleting them. V2 accepts only the exact previously committed retained paths/bytes proven by the explicit Undo origin, while still demanding complete model and reachable-source equality. Unknown, missing or modified retained files fail. This is a correction to the test's disk contract, **not a product regression or a relaxation for arbitrary orphan files**; see `harness/release-behavior-creation-oracle-20260911.md`.
+
+### Actionable empty-workspace finding and limits
+
+Root observed that the newly created Process presented a blank white canvas with **Tools / Selection details / Fit overview** but no visible first action. The empty Scenario likewise showed no first-lifeline action; its helper instructed selecting/reordering a lifeline or occurrence when none existed. Both require the engineer to infer that hidden Tools begins modeling. Root retained `v4/scenario-empty-saved.png` (SHA256 `b03fb33d3f4cf1e5f95e7ac4198a4dee30ffd9af5e250d481e0d5dc2a2a0f90c`) and `v4/machine-created-saved.png` (SHA256 `1e7af3d6219c430eaafb0de5afd8df4c51b4efeb80de3f642084188633dcb65b`); their hashes are also in the manifest.
+
+The bounded recommendation and falsifiable acceptance cases are in [the contextual-source creation plan](release-contextual-source-creation-plan-20260911.md): a semantic empty-state **Add first activity/function contribution** or **Add first lifeline** action opens the same contextual authoring form, preserves explicit viewpoint, and offers staged creation of missing sources. This is an open usability finding; successful object creation does not resolve it.
+
+This follow-up establishes the stated three creation/one-step-history/saved-reopen paths, in conjunction with root's native observations. It does **not** establish pending-draft recovery, camera/scroll restoration, modal-priority Escape, write-failure behavior, large-model/long-ancestry usability, or complete release readiness. Earlier cancellation evidence remains intact. No additional native lease was acquired for consolidation.
+
+## Follow-up: pending SA machine recovery, autofocus and cancellation
+
+Root supplied this additional native recovery slice; this reviewer independently verified only its immutable JSON, launch record and saved cancellation checkpoint. The earlier 13-command manifest is preserved byte for byte. This section closes the specific pending-creation recovery case described here, superseding only that portion of the preceding open-gate statement.
+
+After the nine-file saved reopen, root started an SA Machine draft named exactly **Recovery — secours Δ «operating modes»**, selected the existing SA **Rescue team** SystemActor, and checked the first-view option. Root verified the persisted private checkpoint and preserved `v4/recovery-evidence/before-interruption.json`. Root then force-terminated only the verified isolated PID5184 and relaunched the same executable/profile/runtime. `v4/recovery-launch.json` records launch at **09:17:07.8245552 UTC**, new PID **1284**, the original staged GUI SHA256, isolated AppData directories and clean staged-bin/Windows PATH. Root's newly returned native window was **6161106**.
+
+Actual **Home → Recover** restored the SA creation form, selected owner, checked first-view option and name caret. Root typed **` · resumed` without clicking a field**, directly demonstrating recovery autofocus, and preserved `after-recovery-and-typing.json`. Root then pressed **Escape once from the focused input**: the draft disappeared and status read **Behavior creation cancelled**. Actual **Save As** to a new `checkpoint-recovery-cancel/project.arcadia` succeeded. The recovered machine/view draft was never accepted. Root reported zero-byte recovery stderr and a saved recovered copy left open at wide 1442×932; this reviewer did not inspect the running UI or log. Root also compared the original live work copy with the nine-file baseline; this consolidation independently checks the immutable saved recovery copy only.
+
+Independent immutable readback at **09:22:33–09:22:34 UTC** passed **19/19 explicit checks**, including one existing v2 `same` command (exit 0, **0.147209 s**):
+
+- Exact literal Unicode name before interruption and exact deliberate suffix afterward; SA Machine family, original SystemActor UUID and `first_view: true`.
+- Complete `behavior` JSON equality after removing only the deliberate suffix. No other draft fields were normalized or dropped. Reserved element `c6f559f5-401e-4e0d-af93-91faee68d3f5`, diagram `11ad8f0a-73aa-416a-bbeb-9b886bf39854`, and placement `171f7d7e-3a8f-4200-86f6-a9e2efd87610` IDs remained exact.
+- Complete `accepted`, `workspace`, `property`, `workflow` and `selected` JSON values each remained exactly equal. The accepted source snapshot also matched the preceding immutable saved checkpoint's complete nine-file byte map.
+- V2 `same checkpoint-creation-reopen/project.arcadia checkpoint-recovery-cancel/project.arcadia` passed complete Project, identity and nine-file SourceBundle equality, with nine exact disk files and zero retained exceptions. Separate direct-byte comparisons passed **9/9 files**, with identical complete path inventories. None of the three reserved draft IDs appeared in any saved file.
+- All input checkpoint inventories, preserved evidence hashes and the original 13-command manifest remained unchanged during verification.
+
+The wrapper metadata (`origin`, checkpoint identity and modification time) is not asserted equal: recovery opens a distinct unsaved copy. More importantly, **persisted Undo history is not restored**; the UI explicitly explains that limitation. The evidence establishes pending draft/value/identity restoration, native autofocus, first focused Escape cancellation and saved-source preservation. It does not claim Undo/Redo continuation across recovery, accepted creation from the recovered draft, other creation families, or camera/large-model recovery coverage.
+
+Separate durable evidence under `harness/experiments/behavior-creation-native-20260911/`:
+
+| Artifact | SHA256 |
+| --- | --- |
+| `verify-recovery.py` | `3546b4fe68d3e1a2474015be1b652a665af238e5fcf63e04bac3f25df3d35e90` |
+| `recovery-commands-results.log` | `1dc3e89aa46660bfad796e7b6bf821bebd7e5bc5a7902a826021d461a3e74c68` |
+| `recovery-manifest.json` | `68e2fcf653f7a59037c9eb0b31f6c9e629dc0ab88af545d5b78a2bbf8c980a72` |
+| Preserved `before-interruption.json` | `0c355aa3c7b9be623d767ff35c4b85cf7b2907eb9bc3be39d619aa610c989692` |
+| Preserved `after-recovery-and-typing.json` | `fafa7a884275bac09afab365f8ab0063f998ca56c5ffc70be596db6f78a10103` |
+| Root's `restored-draft.png` | `8ae0fe8957d5a935b6e2605a6ffb68934bd0e8840f3594c43e63865ab89d03c9` |
+
+Reproduce with `python harness/experiments/behavior-creation-native-20260911/verify-recovery.py` using the preserved files and existing oracle/runtime. It reads only the explicit immutable inputs, never the live `work` or profile paths mentioned inside JSON. No native input, production changes or compilation occurred during this consolidation.
diff --git a/harness/release-behavior-creation-oracle-20260911.md b/harness/release-behavior-creation-oracle-20260911.md
index b29299eb..8f4d33b9 100644
--- a/harness/release-behavior-creation-oracle-20260911.md
+++ b/harness/release-behavior-creation-oracle-20260911.md
@@ -1,5 +1,10 @@
# Independent native creation oracle — 2026-09-11
+Current checker: **v2**, source `51AB2FFA1826DD949B79F3A9690042A2F9E38DAF9ED91517CADE3861482117BA`,
+executable `056EEFD444924916BF6AC3C4897AB2FF4A8A4BB892E1DBC16ADAD32E59BF6A36`.
+It supersedes the initial version's incorrect strict-disk rule for Undo;
+the initial build evidence below is retained as history.
+
Codex-9e8r6t /root/behavior_audit. Owns only the new standalone
`harness/behavior-creation-contract.rs`, fixture README and this report.
No production Rust, Cargo, native input, commit or push. Read PROJECT_GOAL,
@@ -52,3 +57,38 @@ be mistaken for history preservation. `same` compares all identities and source
bytes with a previously accepted checkpoint. The reused core transaction/layout
and source updater define the published model/source contract; independent
native observations must still establish UI behavior and transaction boundaries.
+
+## V2: explicitly proven retained files after Undo
+
+Root independently found the initial harness defect before new native creation:
+`checkpoint-transition-undo` restores the basic four-source reachable bundle but
+physically retains six source files. This follows `source_files.rs:817` (detached
+files are never deleted) and `docs/language.rst:1854`; the initial `load` check
+would incorrectly fail an otherwise exact Undo. Published `4bb4aaf` contains that
+initial oracle, not this correction. No model or desktop fix was needed.
+
+The corrected `same EXPECTED ACTUAL [UNDO_FROM]` keeps full Project and reachable
+SourceBundle equality. With an explicit origin, expected disk bytes are the
+exact first-committed checkpoint's source file map overlaid with EXPECTED's
+reachable files. The origin is itself checked for an exact reachable file set.
+Without that argument, ordinary comparisons continue to reject detached files.
+Unknown, changed or missing retained files and reachable-source drift all fail.
+
+V2 direct-rustc `-D warnings` compilation passed; lease returned before runtime
+checks. Built-in self-checks now independently simulate one retained machine
+module and falsify unknown/changed/missing detached files and reachable drift.
+The pre-existing immutable native transition Undo passes with **four exact
+reachable sources and six exact disk files, two proven retained**. Separate
+isolated copies with an unknown detached file or an appended byte in retained
+`traceability.arcadia` both return exit 101. The same valid Undo without an
+origin also returns 101, proving there is no general orphan exemption. Baseline
+comparison and all previous model/source self-checks still pass. No new behavior
+creation output was read; the stated three-action expectations are unchanged.
+
+New evidence under `.local/behavior-creation-oracle-20260911/`:
+`build-v2.log`, `build-v2-result.json`, `self-check-v2.log`, `baseline-v2.log`,
+`old-transition-undo-v2.log`, `checks-v2-result.json`,
+`strict-undo-rejection-v2.log`, `unknown-detached-rejection-v2.log`,
+`changed-detached-rejection-v2.log`, `disk-falsifiers-v2-result.json`,
+`manifest-v2.json`, and `behavior-creation-contract-v2.exe`. Initial artifacts
+remain intact; isolated changed copies are named `probe-v2-*`.
diff --git a/harness/release-constructor-defaults-review-20260911.md b/harness/release-constructor-defaults-review-20260911.md
new file mode 100644
index 00000000..8a8ddef5
--- /dev/null
+++ b/harness/release-constructor-defaults-review-20260911.md
@@ -0,0 +1,95 @@
+# Source-7 constructor omission compatibility — 2026-09-11
+
+Codex-9e8r6t `/root/release_audit`. Root assigned a bounded independent check of
+other-host issue 1 comment 122. Read current issue/comments/Wiki, source parser,
+typed model and relevant specification sections before testing. No production
+Rust, Cargo, schema/grammar, GUI or HTML edits were made. Only the constructor
+wording/table and contradictory Scenario default-table entry in
+`docs/language.rst` were corrected; root owns HTML regeneration/publication.
+
+## Finding and executed evidence
+
+The former blanket statement that every explicitly selected constructor field
+must be supplied, with a schema-2-only Exchange exception, contradicts current
+source 7. The declaration parser merges declaration-level defaults, but replaces
+an explicit constructor payload and deserializes that payload through its own
+typed contract (`language.rs`, around the final `serde_json::from_value` of an
+ElementBody). The `OccurrenceBody` definition has nullable references and
+explicit serde defaults, so some fields may be absent without copying the
+payload of the factory's default constructor.
+
+The independent handwritten probe in
+`harness/experiments/constructor-defaults-20260911/probe.rs` passed **54
+accepted comparisons and 12 missing-required-field refusals**, in both OA and
+SA source 7. Fixed explicit UUIDs ensure a full Project equality comparison;
+no generated identities are normalized away. Expected occurrence bodies are
+literal typed values, not obtained from a UI producer or inferred from the
+omitted result. The same accepted cases also pass core command admission.
+
+| Constructor | Omission admitted with this meaning | Omission rejected |
+| --- | --- | --- |
+| Exchange | exchange/sender/receiver/reply_to/operation → None; message_kind → Asynchronous; values → empty list | None of these fields is required to be present. |
+| Action | action/lifeline → None | — |
+| State | state/lifeline → None | — |
+| SequenceReference | sequence → None | — |
+| ScenarioUse | scenario → None | bindings |
+| Control | — | kind |
+| Fragment | — | operator, branches |
+| Branch | — | guard, occurrences |
+
+Each nullable/default field is omitted individually and all optional fields
+are also omitted together. Required-field failures must identify the actual
+missing field, not merely fail unrelated semantic validation. For each of the
+52 admitted occurrence fixtures, exact stabilization/no-op source bytes remain
+unchanged, a Rename changes only the subject's quoted name, and canonical
+format/reparse returns the complete identical Project. Incomplete admitted
+records can still have model-check warnings; no completeness claim is made.
+
+Canonical Exchange output explicitly contains Asynchronous, `reply_to none`
+and `values []`, while `operation None` is absent because its serializer omits
+that value. This distinction is verified, not a general claim that canonical
+output prints every field. Lossless name/no-op editing preserves the authored
+omissions instead of forcing canonical expansion.
+
+Two further fresh source-7 cases, one per layer, omit Scenario viewpoint and
+compare exactly with explicit MixedLegacy. The authored omission is retained
+and canonical formatting reparses identically. This confirms the Scenario
+default table needed the same source-7 clarification already present in
+section 4.3.
+
+## Provenance and reproducibility
+
+- Matching core: `.local/target-gnullvm/debug/deps/liboa_core-3e81c616fea1d901.rlib`,
+ SHA256 `5018A1FD7286ED9DFEDCBBF5B68B399AD5D143F2A9AAAED3078CFC934C9589C4`.
+ All listed current core sources were rehashed against the frozen verified GUI
+ manifest before compilation; none differed.
+- Probe SHA256: `FAA1A98BEA7A87E24047991D72A54919AE9C66F84B6EB465E24B13FDC82EE040`.
+- Results TSV SHA256: `2C1BB97234EDFAC386A5DDCA46C28B5B46972CC879B7CC2B1C4179066BAB8AEF`.
+- `provenance.json` records compiler details, core inputs, executable hash and
+ all 121 result artifacts. `run.log` records the final successful run.
+- Build/run instructions are in the experiment README. The only initial
+ failure was a harness compile typo using struct syntax for tuple
+ `Command::Rename`; it was corrected before any counted execution. Both build
+ attempts remain logged under `.local/constructor-defaults-20260911/`.
+
+The successful direct-rustc build used edition 2024 and `-D warnings`; the
+writer slot was released immediately afterward. No Cargo or native test is
+claimed by this experiment.
+
+## Specification correction and limits
+
+The constructor paragraph now distinguishes declaration defaults, a selected
+constructor's own contract, nullable values and optional presence. The
+OccurrenceBody table explicitly lists required fields and current source-7
+omission values, including `operation`. It documents canonical versus retained
+authored spelling and removes the false schema-2-only restriction. The
+Scenario declaration table now agrees with section 4.3.
+
+This is compatibility clarification: it neither changes admitted syntax nor
+silently rejects source already accepted by the application. Unknown omission
+contracts in other constructor/record families remain a separate audit. In
+particular, this experiment does not establish complete defaults for nested
+MessageKind payloads, MessageValue/OperationUse records, DataTypeDefinition,
+DataValue, PortContract, EventBody, contextual endpoints, projections or history
+facets, and does not test every older schema. Their defaults must not be inferred
+from the OccurrenceBody table. Root owns subsequent broader normative coverage.
diff --git a/harness/release-contextual-source-creation-plan-20260911.md b/harness/release-contextual-source-creation-plan-20260911.md
new file mode 100644
index 00000000..58a10d93
--- /dev/null
+++ b/harness/release-contextual-source-creation-plan-20260911.md
@@ -0,0 +1,89 @@
+# Contextual source creation — bounded implementation plan, 2026-09-11
+
+Codex-9e8r6t /root/palette_finish. Root-assigned design only; Gitea #1 coordination read through #133, ownership recorded in #134. No production edits, Cargo, native input or new language contract. Codex-956atf retains the reference-chooser component; this plan concerns behavior draft orchestration and command planning, not that widget's search, popup, keyboard or scrolling implementation. Root must synthesize before implementation.
+
+## Concrete problem and current seams
+
+An engineer creating behavior can name a contribution or lifeline before discovering that its semantic source is missing. The current guarded workflow requires canceling that draft to create the prerequisite elsewhere, then reconstructing the original intent.
+
+| Current path | Code evidence | User consequence |
+| --- | --- | --- |
+| Scenario → Add lifeline | `behavior/scenario/workspace.rs:331` offers `sources(p, d)` through a named-source picker; `scenario.rs:941` enumerates existing elements filtered by layer/viewpoint. `scenario.rs:1274` requires a chosen compatible target and creates only a Lifeline pointing to it. | Missing Activity/Function/participant cannot be authored from this form. A name already typed belongs to the lifeline, not automatically to a new model source. |
+| Process/chain → Involve work | `behavior/topology.rs:326` enumerates existing same-layer work. `:595` requires an existing target; `topology/view.rs:444` renders that picker separately from the contribution name. | A blank process over a model with no work has no useful work target. The test called `legacy_edit_preserves_order_and_new_work_in_one_undo` adds a contribution referencing an existing target; it does not establish semantic Activity/Function creation. |
+| Scenario → Add action on a lifeline | `scenario.rs:941` offers existing work; action/lifeline association is additionally checked by core endpoint/performer validation (`validation.rs:1290`, `:3045`). | Creating any arbitrary same-layer work is insufficient: a participant lifeline needs a compatible performer relationship, while a work lifeline already represents a particular work identity. |
+| New State machine → owner | `behavior/creation.rs:619` explicitly instructs a user with no matching participant to refine search or cancel and create a participant in Architecture first. | The named machine draft and first-view choice must be reconstructed after the detour. The new creation flow otherwise correctly distinguishes root-owned processes/scenarios from participant-owned machines. |
+| Navigation while pending | `app.rs:1265` blocks leaving Behavior while a behavior form is pending; `App::apply_behavior` rejects conflicting raw source/property drafts. | Sending the user to Architecture while retaining an ordinary active form is not currently supported. Relaxing the global guard would expose unrelated edits and weaken draft protection. |
+| Existing recovery/commit | Scenario and topology drafts serialize raw names, references, insertion/branch positions and browsing state. `app/checkpoints.rs:173` restores behavior before selecting its pending layer/page. `App::execute` at `app.rs:850` adopts through `Document::execute` and updates selection after success. | These are usable boundaries for a nested draft and atomic operation. A new source must not be installed outside them merely to make a picker see it. |
+
+The installed Capella study provides one narrow positive pattern: in OAS, **Activity** at a point created a semantic Activity and its lifeline in place; **Activities** opened an existing-source transfer dialog. Saved XML proved distinct source/InstanceRole identities. Capella also added a capability involvement; Studio must not copy that implicit semantic addition. The exercised SFCD function-involvement picker still required an existing Function, so Capella is not evidence that every source detour is solved. See `release-capella-creation-study-20260910.md` for exact scope.
+
+Root supplied additional native observations after this worker returned its input lease: at minimum size, successful creation opened a blank process canvas with Tools/Selection/Fit controls but no first-action prompt; the empty scenario still said to select a lifeline/occurrence and drag its handle, although none existed. This worker did not repeat that native action. `topology/view.rs` puts authoring tools in the Tools shelf, and `scenario/workspace.rs:173` gives generic Select/reorder guidance without a zero-content branch, consistent with the reported problem.
+
+## Three materially distinct interaction options
+
+| Option | Concrete interaction and commit boundary | Tradeoff |
+| --- | --- | --- |
+| **A. Stage a source inside the current behavior draft — recommended** | Beside the compatible-source field, **Create new activity/function/participant…** opens a small typed subform in the same editor area. **Use this new source** validates/stages it and returns to the parent form. The parent's final Apply/Create commits the source and consuming behavior edit together. | Preserves raw parent state, supports one Undo, and makes Cancel harmless. Requires explicit draft-only identities and a preview project so existing compatibility checks can see staged records. |
+| **B. Suspend the form and visit Architecture** | Preserve a return token and checkpoint, open Architecture, create the source there, then return and bind it. | Reuses a richer editor, but early source creation creates a separate history entry and can leave an orphan when the parent is canceled. Rolling back automatically can remove independently edited work. Deferring every Architecture edit until the original form commits would require a much broader transaction workspace. This is a possible later advanced workflow, not the smallest coherent first slice. |
+| **C. Dedicated source-plus-usage tools** | Scenario **New activity lifeline** or process **New function contribution** opens one combined form and commits both identities immediately on its single Create. Existing-source tools remain separate. | Very direct for an empty canvas, comparable to the observed Capella Activity tool. It multiplies tools and does not solve a source discovered missing inside an already partially completed form or a new machine's owner without separate implementations. It can later be a shortcut over A's planner, not a competing command path. |
+
+Recommend **A**, with the empty-canvas entry points below. It solves the existing-form problem and can support C-like first actions using the same draft and transaction. Do not add a general element catalog, replace the external chooser, auto-create a source from a failed search string, or commit a prerequisite merely when the child form is accepted.
+
+## Proposed first flow and semantic scope
+
+1. Keep **Use existing** as the current reference path. Add one adjacent, explicitly named **Create new…** action where a supported source kind is meaningful. It must remain available even when a search has matches: no matches is not permission to create, and duplicate display names are legal.
+2. Open a source subform replacing the parent's editable field area. Retain a compact context line such as `New activity for lifeline in Assess distress · OA · Operational activities` or `New function for contribution before Verify pressure · SA`. Show only admissible kinds, a separate **Source name**, and the proposed semantic parent. Keep the original lifeline/contribution name separately; do not overwrite it with the source name. Omitted original names can continue to use the source as the existing default.
+3. Use **Use this new source** to return to the original form with a visible `New · ` selected reference. This is still a draft. Preserve original name, viewpoint, branch/slot, guards, values, query, scroll/focus and other selections. **Back** or first Escape from the source subform cancels only that subform, leaving the parent draft unchanged; no model/history change occurs.
+4. The final parent action commits the new source and consumer in one validated `Command::Batch`. Preview exactly what is created: `1 Activity + 1 Lifeline`, `1 Function + 1 contribution`, or `1 Actor + 1 State machine (+ first view if selected)`. On failure retain both forms and all raw values. After success open/select the consumer, not the prerequisite source. One model Undo restores the complete pre-operation model and accepted source bundle.
+
+Admissible initial cases:
+
+| Consumer/reference | New source and explicit semantics |
+| --- | --- |
+| OA OperationalActivity scenario lifeline | New Activity at OA work root, or an explicitly selected valid Activity parent. Create a distinct Lifeline under this scenario with `represented` equal to the new Activity. No allocation, capability involvement or architecture placement inferred. |
+| SA Functional scenario lifeline | New Function with explicit work ownership and distinct Lifeline under this scenario. Missing performer can remain an ordinary completeness warning, matching staged authoring policy. |
+| OA ParticipantInteraction scenario lifeline | Explicit Entity/Actor/Role choice admitted by the actual viewpoint validator; source semantic ownership shown independently from the scenario. No participant subtype guessed from its name. |
+| SA BoundaryInterface scenario lifeline | Explicit System or external Actor choice where admitted. Existing System-of-Interest uniqueness must be respected; do not create a second System or silently substitute an Actor. Creating a participant does not create ports, interfaces or a boundary exchange. |
+| OA process / SA chain Work target | New Activity/Function plus an Action contribution at the preserved insertion. Reuse existing topology planning for explicit links/legacy conversion. Do not parent the work to the process, infer control flow from layout, or alter reusable definitions referenced elsewhere. |
+| State-machine owner in New Behavior | Explicit valid same-layer participant kind/name/parent; then the pending machine owns that exact source reference. Optional first view remains part of the same parent transaction. This must work before any participant exists in the layer. |
+
+**Action-on-lifeline needs a deliberately restricted extension, not generic source insertion.** For a participant lifeline, offer an explicitly labeled **Create activity/function allocated to this participant…** only when the core admits that direct allocation. The preview includes the allocation and new Action occurrence. For a lifeline already representing work, prefer **Use this represented activity/function**; a different newly created work cannot silently replace its `represented` identity. An unresolved lifeline or ambiguous role/performer requires explicit resolution while retaining the Action draft. Do not invent a participant, allocation or lifeline to make validation pass. Implement these qualified Action cases after the three basic consumer adapters above, using the same staging primitive.
+
+New exchanges, operation/interface contracts, scenarios for reuse, machine states, nested library instantiation and arbitrary multi-level source dependencies are outside this first slice. Their source kinds have additional contracts and should not be silently exposed through a generic Create button. Existing references continue through the current/external chooser.
+
+## First action on an empty canvas
+
+When no form is pending and the current semantic sequence genuinely has no content, show one small in-canvas prompt with **Add first activity contribution** (OA process), **Add first function contribution** (SA chain), or **Add first lifeline** (scenario). This opens the corresponding existing parent form at the explicit root append slot; the source field offers existing or staged new source as above. Show the scenario's chosen viewpoint in that prompt so “lifeline” has a concrete meaning. Avoid introducing a second global toolbar.
+
+For a scenario that already has lifelines but no occurrences, the first prompt should change to an applicable **Add first message/action** route. It must not say “select an occurrence” when none exists. Do not infer a compatible exchange or lifecycle event from lifeline names. Keep the existing tools available for alternate starts such as a fragment or reused scenario. Hide the first-action prompt once content or a draft exists; if content is merely offscreen/filtered, offer navigation rather than claiming the model is empty. For process graphs count semantic contributions, not rendered or collapsed nodes.
+
+This is contextual guidance, not an automatic wizard: it must not change model/history just by appearing, steal keyboard focus on passive resize, or reset the user's Tools/Selection shelf on every frame. At 1100×700 client size, the prompt and the source subform's Back/Use actions must fit while the canvas and parent context remain understandable.
+
+## Draft, atomicity and recovery contract for implementation review
+
+Use a **typed source request owned by the parent draft**, containing document identity, layer, parent draft/invocation identity, exact reference field, source kind/semantic parent, and the original consumer context. For a contribution include the exact process/scenario owner, operand/branch and insertion address; for a machine retain pending machine/view IDs. Bind by ID and explicit field, never by display name, current selection, first eligible object or nearest visible lane.
+
+Reserve the new source and any dependent allocation/consumer IDs once and serialize them with the raw source subform. Repeated preview, retry, recovery and final submission must not create fresh identities each time. Build a private preview Project from the staged prerequisite commands, run existing candidate predicates and parent planning against it, then validate the full combined batch through the existing Document/source boundary. Do not insert staged objects into the accepted catalog, source buffers or generic chooser inventory. The exact prepared batch determines the post-success selected consumer; unrelated/trailing commands must not borrow that selection result.
+
+A source subform is the only nested editing level in this first slice. The main application continues to reject unrelated navigation/mutations while it is pending. Route its events through the existing Behavior ownership guard; do not globally waive `has_pending`. The separate reference-chooser component needs at most a host-owned adjacent create action/typed result adapter; do not add model mutation or source creation policy to that component.
+
+On stale document, owner/slot, source-parent eligibility or perspective, refuse final adoption and retain both raw drafts with a precise repair action. Passive viewport events are not model edits and must not invalidate a useful draft. If a model revision changes, revalidate explicitly against it; never silently rebind to same-ID-but-changed-kind/ownership data. For a changed insertion position, require choosing the position again or an explicit append action, preserving entered text. A nested reference's active callee and caller return path must remain distinct.
+
+Cancel source subform: no mutation, restore parent exactly. Cancel parent: discard all its staged sources and dependencies, no mutation. Switching back to an existing source must not accidentally commit the abandoned staged source; keep it as inactive raw draft for toggling/recovery or explicitly discard it, but final reachability of draft dependencies determines the batch. A name collision must never trigger “reuse existing” implicitly.
+
+Checkpoint capture includes both raw forms, staging mode, typed target, fixed IDs and original context. Recovery first restores accepted model/source and then the entire pending behavior state; select the captured layer/consumer and focus the innermost source name when that form is open. Restore lint tasks together with focus. Do not perform automatic creation on recovery. Missing dependencies remain visible and repairable. Existing raw property/source drafts must remain retained and continue to block adoption where they conflict.
+
+Ordinary modal priority remains above this nested draft: first Escape dismisses an active file/hosted/workflow dialog, next Escape backs out of the source subform, next cancels the parent. A focused text input's captured Escape must follow that same route. Undo of an accepted combined command restores exact accepted source/history; restart retains the saved result but does not invent persisted Undo history. Preserve existing source-save behavior for safely retained detached files after Undo, as clarified by the independent oracle in Gitea #132.
+
+## Falsifiable acceptance scenarios
+
+1. **Blank OA activity scenario:** explicit OperationalActivity viewpoint, no Activities. Add first lifeline → Create new Activity, source name `Assess distress`, independently typed lifeline label `Assessment role`. Before final Apply, accepted element/source counts are unchanged. Apply creates exactly one Activity and one Lifeline, correct separate names/ownership/represented UUID; no allocation/capability/view. One Undo restores exact original model and reachable source.
+2. **New function inside an existing chain path:** click an insertion between two contributions, type an occurrence name, stage a new Function, return, then Apply. Exactly the selected insertion/link repair occurs; original guards, sibling paths and referenced reusable definitions survive. Failed validation or source-write budget preserves both names and the insertion. Undo/Redo preserves UUIDs and exact source provenance.
+3. **Machine before owner:** in a layer with no participant, name a machine and opt into first view, stage an explicit valid owner, then return. Cancel parent creates nothing, including no view/placement. A second attempt committed successfully creates owner+machine+requested presentation in one history entry and opens the machine. Repeat in SA with an already existing System; illegal second-System creation refuses without fallback.
+4. **Qualified action:** on a participant lifeline, explicit create-and-allocate yields exactly new work + direct allocation + action occurrence. On a work lifeline, no different work is silently attached. Wrong layer, invalid owner, unresolved lifeline and ambiguous role cases retain drafts and produce explicit errors.
+5. **Recovery and stale responses:** recover while typing the child source name, with a long Unicode parent name and fixed branch slot. Exact raw text, IDs, layer and intended reference survive; no object appears merely on recovery. Late selection/Use events from a canceled or different invocation cannot mutate the new draft. Remove/change the parent or slot between preview and submit: reject and retain intent.
+6. **Existing/new switch and cancellation:** start from an existing reference, stage a same-named new source, cancel child; original reference and raw parent text remain exact. Stage again, then choose existing and commit; no unused source is created. Test focused first Escape and overlay-priority Escape at actual minimum size.
+7. **Empty-state onboarding:** create/open genuinely empty OA process, SA chain and both scenario viewpoint families at 1100×700. An engineer can start the first useful contribution/lifeline without opening a hidden shelf or leaving Behavior. Existing offscreen/filtered content does not trigger a false empty-state prompt. Showing/hiding/resizing the prompt does not mutate source/history or steal input focus.
+8. **Preservation and chooser boundary:** use same-named sources under different owners plus a large candidate list. Only the explicit typed source request affects the parent; existing chooser search/navigation remains unchanged. Verify full Project and accepted SourceBundle equality after Cancel/failed Apply, plus the documented exact reachable/detached file policy after Undo. Do not equate a successful model count with exact-source preservation.
+
+Implementation should start with the staged-source primitive and the Lifeline, process Work, and machine-owner adapters, together with semantic empty-state first actions. Add qualified Action creation only when its explicit allocation/representation gates pass. This is a proposed bounded sequence, not an approved production change or a completed usability result.
diff --git a/harness/release-contextual-source-creation-review-20260911.md b/harness/release-contextual-source-creation-review-20260911.md
new file mode 100644
index 00000000..eed96683
--- /dev/null
+++ b/harness/release-contextual-source-creation-review-20260911.md
@@ -0,0 +1,138 @@
+# Contextual source creation: independent preimplementation review
+
+Codex-9e8r6t /root/behavior_audit, 2026-09-11. Reviewed the proposed
+`release-contextual-source-creation-plan-20260911.md` against committed
+`4bb4aaf3dc47b9738625b4d3f23ef8c74f286395` desktop contracts and current unchanged
+core. Read AGENTS, revised PROJECT_GOAL, Gitea issue1 through #138, empty open PR
+inventory and LocalBehaviorCreation20260911 Wiki. No evolving implementation was
+read; no production edits, Cargo, direct rustc or native input. These are
+source-derived integration traps and exact acceptance expectations, not findings
+against the new implementation. Urgent items were sent directly to its author.
+
+The proposed staged-source transaction is coherent for Lifeline, process Work
+and new machine owner. Keep qualified Action allocation, new ScenarioUse targets
+and the external chooser implementation outside this slice. The following
+existing contracts require explicit handling; a generic wrapper is insufficient.
+
+## Ranked material traps
+
+1. **P1 — New first-action routes can implicitly commit another editor.**
+ In committed `app.rs:2326`, non-creation `starts_form()` invokes `self.apply()`.
+ A new first-lifeline/contribution button routed to the existing Start event,
+ arriving while a valid raw property draft exists, commits that property
+ before opening its form. The explicit Canvas Choose guard does not protect
+ this route. Reject source/property/pending conflicts in the actual new App
+ event path before generic Apply; a disabled button alone cannot guard stale
+ dispatch. Assert accepted snapshot/history and all raw strings unchanged.
+
+2. **P1 — Stale scenario owners can panic before transaction validation.**
+ `scenario.rs`'s `parents()` always includes the supplied owner ID, even if that
+ element is absent. A recovered Lifeline draft therefore passes the first
+ destination check in `Draft::command`, then `sources()` at line 941 indexes
+ `p.elements[&d.owner]`. A removed owner can panic before `execute_batch` gets
+ a chance to reject it. Validate owner existence/kind/layer/viewpoint before
+ candidate rendering and parent planning. Show repair/cancel with both raw
+ drafts retained. Do not interpret a same UUID with changed kind or viewpoint
+ as the unchanged invocation merely because a new source still exists.
+
+3. **P2 — Nesting the old process batch loses consumer selection.**
+ `topology/direct.rs:209` scans only immediate Batch children for a newly
+ created contribution. `Batch[CreateSource, Batch(parent_commands)]` therefore
+ returns no contribution selection. Core `session.rs:386` uses the last
+ selected operation and `SetSteps` at line 703 selects the process owner.
+ Flatten with preserved command order, or carry the exact prepared command's
+ consumer target through success. Test the actual App selection, including
+ rejection of changed/trailing commands borrowing that target.
+
+4. **P2 — Stable source identity does not make the combined plan stable.**
+ `scenario.rs:1274` still creates a fresh Lifeline via `make_element` each
+ prepare; `topology.rs:476–508` creates fresh occurrence and link UUIDs.
+ Reserve/cache the complete created identity set, including repaired links.
+ With a blank consumer label, source and consumer share a display name: the
+ source already owns its alias in the private preview, so the consumer alias
+ includes its UUID suffix. Replacing only the temporary consumer ID leaves an
+ alias derived from a discarded UUID. All aliases, endpoints, SetSteps,
+ parent references and optional machine/view IDs must use the reserved set.
+ Require full prepared-Command equality across preview/retry/recovery, not
+ merely equality of the source UUID or final object count.
+
+5. **P2 — A fresh Work source cannot satisfy every captured insertion.**
+ `topology.rs:438–449` requires a Work target next to an Exchange contribution
+ to equal that exchange's exact source/target UUID. A newly created Function
+ cannot equal an existing endpoint. The plan's successful “between two
+ contributions” case should use Action→Action. An Exchange-adjacent case must
+ refuse and retain both names and the exact slot; it must not retarget the
+ shared exchange, change a reusable definition, choose a different source or
+ silently append. Keep the existing full compatibility check on the preview.
+
+## Semantic constraints that the new source form must expose accurately
+
+`validation.rs:92` separates source containment from its use. Activity may be
+root-owned or owned by Activity; Function by Function; OA Entity/Actor/Role may
+be roots or children of Entity. Current SA System and SystemActor admit no
+semantic parent, so a new SA owner is a root even when its machine is nested
+under it. Neither process, scenario nor lifeline owns new work. A new Lifeline
+belongs directly to its scenario, never an operand, and does not enter its
+ordered steps (`session.rs:336` attaches Occurrences only).
+
+`viewpoint_represents` at validation.rs:1262 admits Activity, Function,
+Entity/Actor/Role, and System/SystemActor for the four explicit viewpoints
+respectively. Role is valid for an OA participant lifeline but **not** a machine
+owner: `Kind::is_performer` at model.rs:153 excludes Role. SA System uniqueness
+is a hard project-wide error at validation.rs:238. A second System must refuse,
+even if named differently; an Actor requires a separate explicit choice.
+
+Do not turn completeness warnings into new blockers. Unallocated leaf work and
+a missing SA System are warnings. Adding a lifeline to an already reused callee
+can also be accepted while existing uses gain `missing_lifeline_binding`
+warnings (`validation.rs:2112`); keep all caller bindings unchanged. By contrast,
+an explicitly incompatible binding is an error. Compatibility uses represented
+identities or explicit RoleRealization/RoleAssignment, never equal names
+(`validation.rs:1283`, `:2073`). A new same-named Role does not impersonate an
+existing referenced role, and staging it creates no realization or allocation.
+
+Persist authored state and reserve identities, but separate it from runtime
+canvas generations. Existing behavior recovery deliberately drops viewport and
+revision tokens (`behavior.rs:789`); App reset gives a fresh `canvas_document`.
+A recovered valid draft must be rebound to that runtime document without
+reusing stale event invocations. A child invocation token must still reject
+late Use/Name/Back events after that child was cancelled/reopened. Passive
+scroll/viewport epoch changes must neither discard input nor count as a semantic
+context change. New optional recovery fields must preserve older pending forms.
+
+## Compact exact acceptance matrix
+
+Use separate fixed symbols for source `S`, consumer `C`, child invocation `I`,
+new link `L`, and optional machine/view/placement `M/V/N`. Only a new cancelled-
+then-reopened invocation may reserve a new set. Every accepted row compares the
+complete Project and SourceBundle against the explicit delta; every refused or
+cancelled row requires exact accepted baseline and raw-draft preservation.
+
+| Case | Exact expected result |
+| --- | --- |
+| OA activity lifeline | OperationalActivity scenario; source **Assess distress**, consumer **Assessment role**. Exactly Activity `S` at selected valid work parent/root and Lifeline `C` under the original scenario with `represented=S`. Names remain separate, description/body defaults empty, scenario steps unchanged. No allocation, capability involvement, actor, view or placement. Blank consumer label uses the source name; explicit label follows the existing consumer trimming policy, while raw text remains exact during staging. |
+| SA function lifeline | Functional scenario, no existing Function/System. Exactly Function `S` at root or selected Function parent plus Lifeline `C`, with fixed represented identity. Missing allocation/System warnings do not cause fallback or automatic participant creation. Wrong-viewpoint source kind refuses. |
+| OA Role and reuse mapping | ParticipantInteraction scenario can create Role `S` plus Lifeline `C`; no relationship is inferred. An existing local Actor maps to an existing referenced Role only through its explicit realization. A new same-named Role without that relationship cannot satisfy the old binding. While editing a reused callee, adding `C` leaves both existing caller-use records byte-for-byte unchanged; missing-binding warnings are expected, not auto-binding or rejection. |
+| SA boundary and new owner kinds | BoundaryInterface permits explicit System/SystemActor, not Function/Role. Empty SA permits one new System; existing System makes another System refuse unchanged. Explicit SystemActor remains valid. Role cannot own a machine. Illegal source-parent choices refuse; source-parent change must not become machine-parent change. |
+| Work at exact Action→Action link | For captured `A —(R, guard g)→ B`, source `S`, contribution `C`: add root/valid-parent work `S`; `C` is `Action { action:S, lifeline:None }` owned by that process. Preserve `R`'s ID/name/alias/guard and change only its target to `C`; add `L: C→B` with empty guard; insert `C` in the captured order. All sibling paths and referenced definitions unchanged. Select `C`. Repeat preparation/recovery with exactly the same new IDs/aliases. |
+| Work next to Exchange / stale slot | A new UUID cannot equal the captured existing exchange endpoint; refuse without changing it. Also remove/change the captured link or presentation-before ID between staging and Apply: retain both drafts and require an explicit position repair. Never fall back to current selection or append. |
+| Machine before participant | Name machine **Rescue modes**, opt into first view, stage explicit valid participant **Rescue team**. Commit exactly participant `S` + machine `M` with `parent=S`; optional view `V` named **Rescue modes · states**, StateMachine projection, one placement `N`, no regions/states/routes. Select/open `M/V`. Child Back restores prior owner; parent Cancel creates nothing. Re-selecting an existing owner commits no abandoned staged source. |
+| Invocation, recovery and Escape | Parent label, source raw name, search, original reference, viewpoint, slot and IDs survive child opening/Back/recovery. Old invocation `I` cannot affect a reopened child `I2`, even with identical names and owner IDs. Restored valid drafts survive the fresh runtime canvas ID; missing owner refuses without panic. Overlay Escape closes the overlay first, then child Back, then parent Cancel. The focused captured-Escape path must follow the same ordering. |
+| Semantic first action and history | With no semantic contributions, first-work action is directly visible; with no lifelines/occurrences, first-lifeline action is visible. An unresolved lifeline (`represented=None`), offscreen content, ScenarioUse or fragment prevents a false “empty” claim. A lifeline-only scenario gets applicable guidance without inventing an exchange/action allocation. CTA appearance/resize and rejected stale Start leave model/source/history/raw properties unchanged. |
+
+For committed names with leading/trailing whitespace, pin source and consumer
+policies explicitly: current scenario/topology planners trim an explicit
+consumer label; they do not overwrite it with the selected source's label. Do
+not claim all committed names remain byte-exact by inspecting only raw recovery.
+
+One Undo must restore the prior Project and reachable SourceBundle, while disk
+Save may retain newly detached source files. Use the corrected oracle's explicit
+history origin: disk equals the first committed checkpoint's file map overlaid
+with expected reachable files; unknown/changed retained bytes fail. Redo/reopen
+uses original committed role IDs, not newly borrowed replacement UUIDs.
+
+This matrix deliberately excludes qualified Action allocation and new reuse
+definitions. Those require further explicit semantic intent; they are not
+required to validate this staged-source slice. The external chooser remains
+owned separately. Implementation review and native evidence follow only after
+the author freezes the new source.
diff --git a/harness/release-libraries-semantics-design-20260910.md b/harness/release-libraries-semantics-design-20260910.md
new file mode 100644
index 00000000..d2df68be
--- /dev/null
+++ b/harness/release-libraries-semantics-design-20260910.md
@@ -0,0 +1,292 @@
+# Reusable libraries: candidate semantics and falsifiers
+
+Codex-956atf `/root/libraries_design`, 2026-09-10. This is a bounded foundational proposal for root synthesis and independent criticism. **No candidate in this report is a ratified decision or implemented capability.** Sole owned file: this report. No production edits, Cargo invocation, native application operation, or new passing test result. Initial source checkpoint was `8547b85`; later root changes through `aa40345` do not change the inspected library/reference architecture.
+
+Read the complete updated `PROJECT_GOAL.md`, the requirements delta, Gitea issue #1 through comment #92, the open PR list (empty), and shared Wiki Home. Ownership is recorded in comments #86 and #93. Coordinated definition interfaces with the separate analysis/quantity designer. Codex-9e8r6t's independent criticism in #90 is incorporated below; that host's scenario/layout/creation/platform work is outside this task. Wiki Home contains older checkpoint evidence, not current release acceptance.
+
+## Proposed outcome and decision boundary
+
+An engineer can publish a reusable library from ordinary modeled content, use its definitions in multiple projects, instantiate an OA/SA pattern more than once with explicit contextual bindings, and selectively update an instance without losing local work. The saved project carries the exact required library content and reopens offline. GUI, textual source and REST expose the same imports, bindings, instance identities and update choices.
+
+The leading candidate is **immutable content-pinned definition imports plus editable, materialized pattern instances with explicit origin maps and three-way update**. It fits the current architecture better than making every architectural object a virtual instance of an external definition. It also provides maintained reuse that source copying alone cannot provide.
+
+The most consequential remaining choice is how existing layer-owned data/interface definitions participate. This report prefers an explicit immutable local mount adapter for those existing records, while new layer-neutral quantity/calculation definitions use a qualified `DefRef`. That is a compatibility boundary requiring criticism and tests, not permission to create two inconsistent library systems. If the adapter cannot satisfy the common identity, source and update rules below, it loses to the more invasive uniform definition-reference alternative.
+
+Local package publication and explicit server upload are sufficient to prove maintained cross-project reuse. A registry, automatic discovery, remote writeback from an instance, arbitrary executable plugins and full SysML/KerML instantiation are separate capabilities; none is assumed to exist under this proposal. This is a proposed bounded implementation strategy for the user's requirement, not a reduction of the acceptance obligations.
+
+## Evidence that constrains the design
+
+| Verified repository fact | Consequence |
+| --- | --- |
+| `model.rs:13` has only `Layer::Oa` and `Layer::Sa`; `Project` at `:1621` has local element/relation/diagram/artifact/trace maps. `identities()` at `:1727` builds one UUID/alias namespace. | A package cannot be another Project merged into the maps without an explicit identity translation and ownership policy. A third neutral layer must not be invented just to store units. |
+| `SharedBody` at `model.rs:593` includes DataType, DataField, ExchangeItem and Interface; `TypeRef::Named(Id)` at `:347` and ordinary semantic references use local UUIDs. `validation.rs:126` expects an existing compatible element in the owner's layer. | Neutral library references are not currently accepted by these paths. Making data definitions neutral requires a deliberate metamodel/refactoring decision. |
+| `parent_permits` at `validation.rs:92` distinguishes semantic containment. Processes/scenarios are layer roots; occurrences, lifelines, ports, data fields and state regions have specific owner kinds. SA admits at most one System of Interest (`language.rst:31`). | Instantiation cannot place every selected object under an arbitrary container or clone another System of Interest. Binding and graphical placement are different operations. |
+| `OccurrenceBody` contains ordered branches, sequence references, ScenarioUse lifeline bindings, reply identities, operation allocations and message-field paths (`model.rs:550`). `ContextualLink` endpoints have occurrence-reference paths. | A pattern is a graph of typed records and references, not a collection of named boxes. Repeated uses, paths and order must retain their distinctions. |
+| `references.rs:5,11` enumerates typed live element/relation references; `:206` also remaps views, placements, artifacts, traces and explicitly typed semantic-history references. Deletion at `:270` can cascade into other records. | Reuse these authoritative classifications where applicable, but do not run one UUID replacement over package metadata, text or historical origins. A library update must preview cross-instance deletion impact. |
+| `semantic/historical.rs:305` deliberately distinguishes historical UUID remapping from deletion; historical facts need not refer to currently live objects. OA/SA review has its own baseline and transition semantics. | A package source member, an old local snapshot identity and a live local reference are different categories. OA/SA counterpart review is not a library merge engine. |
+| `SourceBundle` is an explicit UTF-8 file map (`source_project.rs:17`). The compiler reads no filesystem/network. Includes share the project's global namespace (`language.rst:1692`). | Imports need separate syntax and explicit supplied content. Neither relative include paths nor an ambient cache establish library identity. |
+| `prepare_command` at `session.rs:170` validates a private candidate and returns exact identity correspondence. `update_bundle_with_identity_map` at `source_project.rs:780` checks the old index, preserves authored bytes and recompiles. Server admission at `store.rs:144` uses that boundary. | Library operations must extend this preparation/admission path. An adapter may not accept a model before package resolution and the corresponding source update both succeed. |
+| `Session` stores Project history; desktop/source and server add document-level responsibilities. `Command::Replace` and nested Batch are available (`session.rs:375`). | Read-only widgets are insufficient for immutability. Replace, source Apply, REST writes, nested batches, deletion, identity changes, migration and recovery all need the same semantic guards. |
+
+Capella's official feature page describes reusable collections/replicas packaged in libraries and shared between projects. Its official comparison explains why architectural functions/components are usually treated as distinct usages and why replication/synchronization supports that workflow. These observations support both shared definitions and distinguishable editable architectural occurrences. They do not specify the content-addressing, offline, merge or API rules proposed here. [Capella features](https://mbse-capella.org/features.html), [Capella instance and definition rationale](https://mbse-capella.org/arcadia_capella_sysml_tool.html)
+
+## Materially different candidates
+
+Criteria come from the requested engineering workflow: maintained reuse, separate instances, exact offline reproducibility, complete source/API parity, understandable local editing, and a tractable extension of current semantics. Scores below are qualitative design judgments, not measured performance.
+
+| Candidate | Maintained reuse / local editing | Identity and offline behavior | Existing-core impact | Main falsifier |
+| --- | --- | --- | --- | --- |
+| A. Copy source or model fragments; record a URL in an artifact link | Local editing is simple; comparison/update is manual and correspondence is not authoritative. | Fresh IDs can be generated, but provenance, exact dependency versions and subsequent merge are unspecified. | Small. | Cannot reliably update two differently edited instances of the same pattern. Fails as the final library implementation. |
+| B. Compose immutable external model namespaces; all uses remain qualified references | Excellent shared definitions; architectural local edits require a separate override or specialization model. | Qualified identities and pinned packages can be exact. | Every local lookup, containment/reference validator, query, diagram, transition and command must understand an external model environment. | A supposedly simple rename or deletion of one architecture occurrence modifies the shared definition or requires an unexplained override language. |
+| C. Virtual template instances plus an override log; expand effective models on demand | Strong separation of template and instance; updates can replay or rebase overrides. | Instance identity must remain stable as template shape changes; overridden lists/deletions need their own algebra. | Adds an effective-model layer below nearly all current commands, validation, projection, source and API queries. | Current explicit source records cease to be the editable authoritative model, or effective expansion yields different IDs after reopen. |
+| D. Pinned shared definitions plus materialized editable patterns and explicit three-way update | Ordinary local modeling remains available; origin maps make later comparison possible. | Exact package closure and local maps survive reopen/history; updates are explicit. | New package/document subsystem, reference adapter and merge planner; ordinary architectural records remain local. | Immutability or provenance can be bypassed through Replace/source/REST, or local edits are silently lost during update. Leading candidate if these are disproved. |
+
+D wins over A because it maintains correspondence and update semantics. It wins over B/C for the first release because the existing ordinary local graph remains the engineering workspace, while shared definitions still have their proper distinct role. B is the stronger fallback if uniform qualified references prove simpler than maintaining the proposed legacy-definition mount boundary. C is not selected merely because template expansion is convenient for implementation; its override language would itself need a substantial specification and user workflow.
+
+## Common package, identity and resolution contract
+
+The following rules apply to every export category and both representations of imported definitions.
+
+1. **Logical identity:** a library author allocates one `PackageId` UUID and preserves it across revisions. Each exported item, prototype record, neutral definition and external role has a persistent UUID. Renaming does not change identity. The publisher must create a new identity when a record changes semantic record class. Names and source aliases never establish correspondence.
+2. **Revision identity:** a `PackagePin` contains `package_id`, an exact nonempty version label, a package-format version and a SHA-256 digest. The label is human-facing and is not an implicit compatibility range. No ordering or automatic upgrade follows from a label. A changed digest is a different immutable revision even if all names are unchanged. Two contents claiming the same package ID/version with different digests produce a conflict when compared or brought into the same import graph; there is no last-writer-wins choice.
+3. **Sealing:** a package contains a manifest and one prototype `SourceBundle`. The prototype is an ordinary admitted Project in its own private namespace, including any local neutral definition catalog introduced by the analysis design. The manifest identifies the source entry, exports, member selection, roles and exact dependencies. All package record IDs must already be explicit. Importing sealed content must never insert missing IDs or migrate/reformat bytes silently; an older package requiring migration is republished as a new revision.
+4. **Digest preimage:** define a portable framed byte stream rather than hashing ZIP metadata. Proposal: ASCII `ARCADIA-LIBRARY-1` followed by a NUL; then the manifest UTF-8 byte length as unsigned 64-bit big-endian and its exact bytes; then the entry-path length/bytes; then the file count; then each canonical logical path and source text, each separately length-prefixed, in ascending UTF-8 path-byte order. Counts/lengths are unsigned 64-bit big-endian. The manifest has no self-digest field; it includes dependency pins. Hash exact source bytes, including comments and line endings. The lowercase 64-hex-character digest identifies those bytes. This rule is a Studio proposal, not a claim of conformance to another package format.
+5. **Dependencies:** every package dependency names another exact pin, never a URL to resolve during compilation. The complete transitive graph must be supplied and acyclic. Prototype imports must agree with the manifest's declared dependencies; hidden prototype dependencies are errors. Within one root import closure, each PackageId resolves to exactly one pin. A diamond with two different revisions of the same PackageId is an explicit conflict, even if the author expects them to be compatible. An identical repeated dependency is deduplicated by digest. Report the two requiring paths.
+6. **Concurrent versions:** two separate named imports in one project may have distinct closures and pin different versions of the same package. This permits one instance to advance while another remains pinned. Aliases qualify lookup; they do not make the definitions equal. Identical digest/member/dependency identity reached through two aliases denotes the same imported definition; changed digest is not automatic type equivalence. This matches the analysis designer's proposed exact type identity.
+7. **Import immutability:** once referenced, an ImportId's root pin and closure cannot change. Updating creates a new import and explicitly rebinds selected uses/instances. Renaming the import alias changes source spelling only. Removing an import is refused while a live definition use, mount or managed instance still requires it. Old package bytes remain available to history and recovery even when the current document no longer uses them.
+8. **Resolution:** a pure `VerifiedPackageStore` is derived from explicitly supplied package bytes by digest checking, manifest parsing, bounded graph resolution and prototype validation. No deserialized boolean such as `verified: true` is trusted. Missing content, unknown export/member, forbidden private member, duplicate manifest key/UUID, dependency cycle, wrong digest, unsupported package format and source/admission limit failures return located diagnostics and no candidate. They never substitute a cached different version or an empty definition.
+9. **Budgets:** apply total document/package limits to the deduplicated closure, not fresh limits per package. Initial benchmark candidates are 64 packages, graph depth 16, 256 dependency edges, and 64 MiB combined project/package source, in addition to existing record/parse budgets. These numeric choices require realistic-library measurements before becoming normative; finite configurable refusal is mandatory. A rejected import retains the raw draft and accepted document unchanged.
+
+Digest verification establishes exact content identity; publisher identity or compatibility promises are separate metadata. Registry access, if later added, only supplies bytes to this same admission boundary.
+
+## Export categories and the definition-reference tradeoff
+
+The proposed manifest has three explicit export categories. An engineer sees their purpose, not Rust variant names.
+
+| Export category | Consumer semantics | Layer policy |
+| --- | --- | --- |
+| `Definition` | An immutable reusable quantity kind, unit, calculation or other neutral catalog definition. `DefRef::Imported { import, package, member }` resolves through the supplied closure. Only stable formal parameter IDs and other definitions may be captured; no particular project's property/case/participant identity. | Neutral. Applicability of an analysis property/case remains OA/SA-owned and is checked by the analysis model. |
+| `LayeredDefinition` | An immutable data/interface contract graph mounted once into a consuming project, with an explicit source-member-to-local-ID map. Many local uses point to that one mounted graph. Initial allowed records: DataType, DataField, ExchangeItem, Interface and their data-association/interface-item-allocation closure. | Exactly the layer declared in the prototype export. Mounting does not translate OA to SA or relax same-layer references. A package may publish separate OA/SA exports. |
+| `Pattern` | A set of ordinary OA/SA semantic records materialized with fresh local identities and explicit external bindings. The resulting architectural records are editable, with instance provenance maintained separately. | Original layer of each member is preserved. An export may deliberately span OA/SA and carry explicit mapped traces. An independent layer-transition command remains a different operation. |
+
+The layered-definition adapter preserves current `TypeRef::Named(Id)` and same-layer validators. Mounted records are semantically read-only; they are not editable pattern instances. Their payload must exactly equal the admitted export transformed only by the stored identity/alias map. The mount's revision and member identity/alias map are immutable once created; editing that map in source is not a bypass for renaming/reidentifying an imported payload. The outer import alias remains local spelling. A user can fork/detach definitions explicitly. A new package revision creates a new mount with new local IDs; selected referencing uses are rebound in one reviewed transaction. The old mount can coexist for unchanged uses. A layered definition has no project-specific roles: its complete data/interface dependency graph is included or resolved through other explicitly mounted exact definition exports.
+
+This avoids silently neutralizing current data semantics or converting all architectural references into external references. Its cost is real: local mounted IDs and qualified neutral definition references have different storage shapes. The common resolver must expose one origin descriptor `(pin, export, member)`, one import lifecycle and one read-only/error policy to UI/API clients. The origin descriptor must be discoverable from a mounted local ID and from a `DefRef`. An API must never report the mounted record as ordinary editable content merely because its model field is a UUID.
+
+The competing uniform alternative introduces qualified references for all reusable data/interface/member positions and a neutral definition catalog for those records. It removes materialized mounts, but touches DataField ownership, inherited field lookup, port/interface contracts, operation allocation identities, message field paths, diagrams, transitions and semantic-history source forms. It should win if a focused prototype shows fewer special cases or if the intended engineering workflow requires one exact data identity to span OA and SA. That requirement is not inferred by redefining the existing same-layer rule. Root should resolve this adapter choice before implementing the catalog/reference migration.
+
+## Pattern publication, closure and binding
+
+Use an admitted prototype Project as the authoring context, rather than allowing arbitrary ill-typed placeholder JSON. An export selects prototype members and declares the prototype identities at its boundary as named roles. Those prototype role records demonstrate a valid context, but are not cloned into consumers.
+
+An export's closure is explicitly reviewable and then sealed:
+
+- Start from selected semantic roots. Include all semantically owned descendants required by those roots: ordered occurrences/branches, lifelines, ports, fields, machine regions/states and newly modeled analysis records where their declared subject is included.
+- Include internally owned relation records, not only relations whose endpoint names happen to match. This includes sequence/contextual links, state transitions/actions, interface-item allocations and other relations needed for the selected behavior/contracts. An omitted essential relation is an export error; an intentionally partial external relation requires a declared boundary role.
+- Classify every typed reference as another exported member, an imported definition with an exact pin, or a declared external role. No dangling package-private UUID may escape. Forward references are valid; unresolved references are not converted to `None` to make the export succeed. Existing deliberately incomplete optional fields may remain incomplete and retain their engineering warnings.
+- Give each role a stable ID, label, required reference category, allowed kinds/layer, and context predicates inferred from all its use sites. Parent roles must satisfy `parent_permits`. Scenario roles must respect viewpoint/represented-source rules; operation/port bindings must satisfy their existing ownership contracts. The final materialized candidate still passes complete core validation, which is stronger than matching a kind label.
+- A required role has exactly one explicit binding; an optional role can be explicitly absent only where every use site permits absence. Two roles may bind the same host identity only when their contracts and all resulting relations remain valid. This is shown in preview. There is no bind-by-name fallback.
+- A package System of Interest is a context role, never a cloned member. An SA pattern may require binding to the host's System or leave that separately optional if its contents permit. The operation never creates a second System, translates it into another kind, or silently creates one to satisfy a binding.
+- A prototype Project ID is not an architectural member. Layer roots stay roots unless their kind permits a chosen semantic parent. Importing into a diagram adds placements only through an explicit presentation choice; the diagram is not their semantic owner.
+
+The package author can publish a whole coherent two-layer pattern; the manifest must state which cross-layer trace links are included. New instances may copy those links when both endpoints are resolved. **They do not copy prior semantic-review acknowledgments as though the consumer reviewed the instance.** The initial policy clears copied trace baselines and reports that review is pending. Ordinary accepted local baselines on an existing instance are not automatically refreshed during a library update. Explicitly supplied artifact links preserve URI/revision/fragment literals; UUID-shaped strings are never remapped. A relative artifact target must have an explicit package or consumer base policy before it can be exported portably; no silent rebasing against the user's current directory.
+
+Presentation export is an explicit independent option: include a named diagram with its placements/routes/options only when every referenced semantic identity can be mapped or bound. Allocate fresh diagram and placement UUIDs, remap actual typed references, and preserve geometry. Semantic-only instantiation creates no arbitrary default arrangement; the initiating graphical workflow may supply reviewed placement commands. Updating semantic content does not overwrite local layout unless the user selects a separate presentation change set.
+
+## Proposed persistent model and document shapes
+
+These are type-level sketches, not production Rust or finalized source grammar. Identity wrapper types should prevent passing a foreign member UUID to a local-ID remapper.
+
+```text
+PackagePin { package_id: PackageId, version: String, format: u32, digest: Digest }
+PackageArchive { manifest_source: String, prototype_source: SourceBundle }
+LibraryImport { id: ImportId, alias: Alias, root: PackagePin }
+DefRef = Local(DefinitionId)
+ | Imported { import: ImportId, package: PackageId, member: MemberId }
+
+DefinitionMount {
+ id: MountId, alias: Alias, import: ImportId, export: ExportId,
+ member_map: Map, aliases: Map
+}
+
+LibraryInstance {
+ id: InstanceId, alias: Alias, name: String,
+ base: { import: ImportId, export: ExportId, bindings: RoleBindings,
+ materialization_policy: Policy, original_local_map: MemberMap,
+ snapshot: TypedInstanceGraph },
+ correspondence: Map,
+ identity_lineage: ExplicitLocalIdentityCorrespondence,
+ proposed_binding_defaults: RoleBindings,
+ detached_origins: List
+}
+
+Project additions: imports, definition_mounts, library_instances,
+ local neutral definitions (owned by the analysis design)
+
+PortableDocument {
+ model: Project,
+ source: SourceBundle,
+ packages: Map
+}
+```
+
+The package archive map is authoritative input to pure admission, not an ambient resolver cache. Its parsed model/index can be derived and shared immutably in memory. An implementation may deduplicate immutable bytes between snapshots, but it must not omit them from portable export/recovery or drop a pin required by Undo.
+
+`Project` includes import/mount/instance intent and local editable records. The document compiler derives/verifies mounted payload against exact package content, checks every origin map and definition reference, and rejects forged mismatches. Public JSON that contains mounted records is checked against the same materialization. No special trust attaches to an API caller's supplied project or plan. A core model-only convenience API can use an empty store for projects without imports; it must return `missing_library_content` for imported content unless the required store is explicitly supplied.
+
+The baseline records the actual last adopted package, bindings and materialized typed graph, not a regenerated guess from current local data. Its snapshot includes the exact chosen local aliases/names, identity map, copied presentation policy and constructor payloads. Regenerating aliases with `fresh_alias` against today's project would create a false baseline after unrelated names are added; that is prohibited. Baseline references can be historical and absent, so validate their closed shape, mapping and derivation separately from current live-reference admission. Deleted tracked members retain a reserved local identity so a later import cannot silently reuse that UUID for a different object. The active correspondence is injective, record-class-preserving and disjoint between instances and mounts. Separate instances always allocate separate local members, even with identical bindings and names. Shared immutable definitions can deliberately be common to both.
+
+Explicit local `Reidentify` must update current correspondence and a typed lineage map used during comparison; it does not rewrite the sealed package or the immutable original snapshot. Deletion marks a mapped member absent instead of forgetting its origin. A subsequent new record with a similar name is a local addition, not the deleted member's replacement. A retained upstream-deleted member can be explicitly detached; a later upstream reintroduction cannot silently adopt that local extension.
+
+## Textual source and portable admission
+
+Text must represent the complete library intent. Merely attaching packages to a desktop save dialog would break parity with source Apply and REST.
+
+Proposed source forms illustrate the required information; keyword spelling/version numbers remain subject to grammar review:
+
+```text
+library_import controls_v1 id "" {
+ package "";
+ version "1.0.0";
+ digest "";
+}
+
+definition_mount oa_telemetry id "" {
+ import @controls_v1;
+ export "";
+ members { "" -> "" alias telemetry; }
+}
+
+library_instance left_monitor id "" {
+ import @controls_v1;
+ export "";
+ bindings { "" -> @operator_left; }
+ members { "" -> @monitor_left; }
+ // Exact baseline/correspondence records are typed source values.
+}
+```
+
+For neutral definition use, a readable qualified alias can resolve to the exact imported member (`controls_v1::duration`); canonical output must retain the stable import/member identity, and alias changes must use the source index rather than text replacement. Existing local alias spelling remains globally unique for local records. Member aliases are scoped inside their package; two packages may both export `duration`. Missing/ambiguous export lookup is an error, never a first-result match. Avoid widening current reserved words until the actual grammar is selected.
+
+The pure source compiler accepts **an explicit portable source envelope consisting of the ordinary SourceBundle plus package archives**, resolves imports from that envelope, and returns the entire admitted document. Existing include semantics remain unchanged. Package archives are nested typed source bundles in JSON/REST. A directory export places them at digest-addressed paths and an explicit manifest maps pins to those logical entries; file loading builds the same envelope before calling the compiler. The directory loader may read only those declared bounded paths, just as current includes are explicit. It must never search another open project's cache for a convenient revision.
+
+Canonical source export must offer a self-contained envelope/directory containing every required package, with the invariant `compile_source_document(format_source_document(document)) == document.model` plus exact package bytes. A single source string that contains imports but lacks the explicit package envelope returns missing-content diagnostics. Existing no-library string APIs continue working. A plain model JSON export that needs imports must likewise use the published portable document representation; it must not masquerade as independently reopenable when its required bytes are absent.
+
+`SourceIndex` needs locations for imports, mounts, instance mappings, bindings, definition references and lineage fields, with typed classification of local versus foreign IDs. Derived mounted payload does not receive a second ordinary editable declaration: canonical formatting emits its mount directive/map and the supplied package envelope, and compilation reconstructs/verifies it. The source updater must classify derived mounted records explicitly rather than treating a missing ordinary declaration as a reason to append one. Graphical operations update only affected local tokens and metadata; package bytes are immutable. Editable pattern instances, their diagrams and their source declarations remain ordinary authored records. Exact source/history tests must include comments, duplicate display names, non-ASCII text, mixed file ownership and CRLF content.
+
+## Command boundary, visitor audit and immutability
+
+The shared core should expose pure prepare operations, with no Iced or HTTP-specific library rules:
+
+```text
+inspect_package(archive, supplied_closure, limits) -> PackageInspection
+prepare_import(document, archive_closure, import_identity) -> PreparedDocument
+prepare_mount(document, import, export, reserved_map) -> PreparedDocument
+prepare_instantiate(document, import, export, bindings, presentation, reserved_map)
+ -> PreparedDocument
+preview_instance_update(document, request) -> LibraryUpdatePlan
+prepare_instance_update(document, request, choices, expected_plan_fingerprint)
+ -> PreparedDocument
+prepare_detach_instance / prepare_fork_definition / prepare_remove_import
+```
+
+Preparation resolves exact bytes, reserves IDs once, validates package/mapping/role rules, builds an ordinary candidate command batch, checks complete model semantics, updates the source envelope, recompiles, and compares the resulting full model and pinned content before adoption. The returned selected identity is optional metadata, not proof of acceptance. A preview exposes its base revision/source/closure fingerprint and reserved IDs. Commit recomputes/checks the request and choices against the current document; it never trusts arbitrary serialized commands supplied in a plan. Stale revision, changed source, changed package bytes, lost binding target, unresolved conflict or source-budget failure rejects the whole operation.
+
+Mandatory reference categories and their behavior:
+
+| Category | Example | Rename/reidentify/delete behavior |
+| --- | --- | --- |
+| Live local semantic reference | Parent, endpoint, field path, scenario binding, analysis property subject, local DefRef | Existing typed local visitors apply; same-layer/kind rules remain. Include new analysis and library use sites in impact queries. |
+| Live local library bookkeeping | Instance current correspondence, current binding defaults, imported/mounted object handles | Update through explicit typed library visitors. Reidentify composes actual identity correspondence. Deletion records tombstones or refuses removal of required managed objects as specified. |
+| Qualified definition reference | ImportId plus PackageId/MemberId | Import alias changes source spelling only. Explicit reference rebinding changes revision. A local element reidentify never changes PackageId or MemberId. |
+| Foreign origin | PackageId, export/member/role IDs, dependency IDs and sealed prototype references | Never visited as local identity. Never renamed/deleted because an equal UUID bit pattern happens to occur locally. |
+| Historical baseline/original-map reference | Last-adopted role bindings and original local map | Retain exact stored observations. Use explicit identity-lineage data during comparison rather than rewriting sealed or historical origins. Absence from the current model is allowed. Never include these in deletion cascades. |
+| Existing OA/SA semantic-history reference | Typed SemanticBaseline fields | Preserve the current explicit-remap policy in `semantic/historical.rs`; do not broaden it to package history. No generic scan of UUID-shaped strings. |
+| Literal content | Artifact URI/revision/fragment, descriptions, expression text, comments | Preserve bytes except an explicitly edited literal. A UUID-looking substring is not a reference. |
+
+Audit every affected boundary: `Project.identities/contains/fresh_alias/layer_of/named`, typed reference enumeration/remapping, reserved/tombstone identity checks, deletion impact and finish-deletions, inheritance pruning, kind/reference admission, source normalization/index/update, JSON decoding, migration, semantic baselines and transition preparation, projection/view options, server query/edit endpoints, recovery and both forms of history. An allowlist of editable imported fields in a form is not this audit.
+
+Mounted records reject ordinary Edit/Rename/Reparent/SetAlias/Reidentify/Delete and any transitive command that would mutate their verified payload. If a local deletion would cascade into a mount, the whole operation requires a reviewed rebind/detach/removal instead. Replace and source Apply may propose another **valid immutable revision/import/mount**, but cannot alter bytes while retaining an old pin or forge a mounted payload that does not match the export. The first implementation should centralize this as before/after document admission, so nested Batch and all adapters are covered.
+
+## Three-way update: exact observable rules
+
+For a managed instance, define `B` as its exact stored last-adopted materialized snapshot, validated against the pinned export and stored policy/bindings; `L` is the current local graph and `N` is the proposed new export with explicit proposed bindings and reserved identity/alias map. Match members by stable package member identity, then use the stored correspondence/explicit local identity lineage to compare their local roles. Do not match by name, diagram position or graph similarity, or reconstruct `B` using current local names/values.
+
+Fresh members in `N` reserve new local IDs once. Surviving members keep their current local IDs. A kind/class change under the same source member ID is a conflict, not an identity-preserving edit. A package update may not silently convert an Activity into a Function, an element into a relation, or a definition into an occurrence.
+
+For a typed facet with values `b`, `l`, `n`:
+
+- If `l == b`, the upstream change to `n` is an eligible update.
+- If `n == b`, retain the local change `l`.
+- If `l == n`, the edits have converged.
+- Otherwise, require an explicit local/upstream/valid authored resolution.
+
+Equality is typed and includes exact reference identities. Constructor changes and their dependent fields are one coupled decision. In the first coherent slice, ordered member arrays are compared as complete ordered values; simultaneous local reorder and upstream insertion is a conflict requiring an explicit final order. This conservative rule is preferable to silently inventing an insertion anchor. Truly set-valued collections can compare by identity membership where the existing specification says order is irrelevant.
+
+Deletion is not a special case that bypasses review:
+
+| Situation | Required outcome |
+| --- | --- |
+| Upstream deletes a member; local member is unchanged | Eligible deletion only after all external references and current deletion cascades are shown. Any affected object outside the instance requires explicit resolution. |
+| Upstream deletes a locally edited or locally referenced member | Conflict: keep as detached local content, or explicitly delete/rebind the full reviewed impact. No hidden cascade. |
+| Local member was deleted; upstream changes it | Conflict: preserve local deletion or recreate from upstream using its reserved identity if still admissible. Never resurrect it just because its name appears in the new package. |
+| Upstream and local both delete | Converged absence; provenance remains sufficient for the next update. |
+| Local addition is absent from both package revisions | Preserve it as local extension. Its relations/containment can still make another proposed change invalid. |
+| Upstream changes or removes a role | Review the role/binding facet and all affected use sites. Wrong-layer or missing targets are errors. No fallback to a different same-named participant. |
+
+An ordinary local field edit changes the actual model; it does not retroactively change the package baseline. An explicit rebind action records intended role defaults and changes the selected current use sites, with a preview of any divergent local field. Future additions use the proposed bindings shown in update preview. The tool must not imply that every ordinary reference remains a live parameter substitution after materialization.
+
+The plan covers all choices and the complete candidate, including effects outside the instance, before Apply becomes available. Apply is one document/history transaction. On success the base advances to the exact new package/materialization, even when selected local overrides or deletions remain; they remain differences from that new base. A rejected or cancelled preview leaves the old base unchanged. Evaluating a preview and inspecting changes create no history step.
+
+Semantic and presentation updates have separate choices. Existing OA/SA traces stay ordinary local artifacts: neither updating a package nor changing a binding implies the engineer has reviewed OA/SA consistency. The current semantic reviewer can report resulting changes, but its acknowledgment state is not a substitute for the library baseline.
+
+## Detach, fork and removal
+
+`Detach instance` retains the current local semantic records, IDs, relationships, source spelling and local layout. It removes active update management and reservations for absent members, records a non-live origin note with package digest/export/mapping, and clearly states that future package updates will not be offered for those records. Detaching must not detach another instance sharing an immutable definition.
+
+`Fork imported definition` creates ordinary editable local neutral definitions or a local data graph, with fresh IDs and an explicit reference-rebind selection. It copies the dependency closure needed for the fork or retains explicit pinned references; no dangling private member escapes. The original imported definition and unselected uses remain pinned. This operation is different from changing a package's sealed bytes.
+
+Removing a whole instance uses a reviewed deletion impact and one atomic command. Removing an unused mount/import is explicit; it cannot remove another current use's dependency. Garbage collection may reclaim package bytes only when no current document, history, pending accepted recovery snapshot or retained baseline needs them. Closing the project does not evict information required by its saved portable form.
+
+## Concrete two-project example
+
+Publish package `ControlPatterns`, PackageId `P`, version `1.0.0`, digest `D1`. It exports neutral Duration/ms/s and a reusable calculation, one OA data contract, and a monitor pattern. The OA pattern contains Activity `A`, an owned behavior/scenario with two distinct occurrences and a typed link; external participant role `R` is excluded from cloned membership. A separate SA export can carry Function/port structure and bind the host System. The IDs `P/A/R` are symbolic stable UUIDs for this example, not name-based resolution.
+
+1. Project Alpha imports `D1` as import `I1`; Beta independently imports the exact same package. Both persist all required package bytes.
+2. Alpha instantiates the pattern twice. Maps are `A -> alpha_left` and `A -> alpha_right`, with distinct UUIDs for every copied occurrence/link/placement. Role `R` binds to different existing participants. Both can deliberately use the same immutable Duration definition and OA data mount. Beta's map has entirely different local IDs.
+3. Alpha changes the left activity's description and reorders its two occurrences. The right instance stays unchanged. Beta closes its project and its application.
+4. Publish `1.1.0` with digest `D2`, preserving `A` and other surviving member IDs. It changes the same description, adds a third occurrence, and removes another referenced member. Alpha imports `D2` as `I2`; `I1` is untouched.
+5. Update only Alpha's left instance. Preview shows the description conflict, the complete order conflict, the member addition and outside-reference deletion impact. The engineer keeps the local description, explicitly chooses a valid three-occurrence order and keeps the removed referenced member as detached local content. One Apply advances only this instance to `I2`; its surviving UUIDs remain stable. The right instance remains on `I1`.
+6. Undo restores Alpha's exact model/source/import/instance state and prior accepted package references; Redo restores the same reserved IDs and choices. Save and close Alpha, clear only disposable resolver caches, disconnect the network, and reopen Alpha/Beta from their portable files. Alpha has its selected `D2` instance plus the pinned `D1` instance; Beta still has `D1`. Their type/evaluation identities and results are derived from those exact bytes.
+
+A variation binds a role to an invalid SA actor for the OA export, supplies two different pins of a shared dependency within one closure, modifies one package source byte without updating its digest, or removes a required archived package. Each variation rejects with a precise diagnostic and preserves the accepted project. A variation uses two package versions under distinct imports; it succeeds without conflating their definitions by alias or stable member ID alone.
+
+## REST, migration and release acceptance
+
+Extend the existing published Studio API, not an undocumented desktop-only endpoint. Read/query responses expose imports, origin, definition mutability, instance status and exact pins. Package inspection/upload accepts bounded explicit archives; import/instantiate/rebind/detach/update use the same pure core preparation as the GUI. A read-only preview response includes revision/closure identity and structured changes/conflicts; commit requires the current ETag and complete choices. A stale ETag or changed dependency rejects atomically. Independent clients must not need private Rust enum knowledge beyond the published schemas/examples. This is not a claim to implement the OMG Systems Modeling API.
+
+A deliberate next schema/source version must add the chosen forms. Existing source7 includes remain ordinary project modules. Existing ScenarioUse/SequenceReference remain within-project reuse. Existing annotations, artifact links or filenames that look like library references do not become imports by heuristic. The default migration adds empty library state and preserves all accepted source/comments/IDs; neutral analysis migration is coordinated with its own design. Package-format evolution is independent and explicit: old immutable bytes keep their old digest, and supported readers either interpret that format correctly or request a republished/migrated revision.
+
+The first vertical slice is complete only when it proves the following through core, source, REST and the actual native application. None has been executed in this report.
+
+| Acceptance / falsifier | Required independent observation |
+| --- | --- |
+| L1. Shared definitions plus distinct architecture | Publish a package containing a usable data definition, neutral unit/calculation and OA/SA pattern exports; consume in two fresh projects and instantiate twice in one. Compare complete models, maps, typed references and exact package bytes. Two instances must not alias accidentally. |
+| L2. Real maintained update | Execute the description/order/deletion example above. Check local changes and outside references, explicit choices, base advancement, untouched old-version uses and stable surviving IDs. Compare against a separately constructed expected graph, not the planner's own candidate. |
+| L3. Exact history/recovery | Save/reopen, Undo/Redo and crash recovery retain exact authored source, all pins/maps, reserved IDs and raw invalid bindings/update drafts. Compare saved snapshots byte-for-byte and full models; semantically similar regenerated IDs fail. Preview/cancel creates no revision/history step. |
+| L4. Offline and missing content | Close both applications/projects, discard disposable caches, reopen offline. Exact pinned definitions/results remain available. Remove a required archive and observe a clear unresolved import with no mutation or fallback, then supply the exact bytes and recover. |
+| L5. Dependency and namespace failures | Test a diamond with conflicting dependency versions, a dependency cycle, same package/version with different content, duplicate manifest keys and IDs, case-colliding logical paths, unknown/private exports, alias collisions and aggregate-budget exhaustion. Test two legitimate concurrent versions under different imports. |
+| L6. Immutability on every adapter | Attempt direct/multi-level-Batch/Replace/source/REST mutations, reidentification and cascaded deletion of mounted/imported content. Every path either rejects unchanged or performs an explicit valid fork/rebind/removal. Changing an origin UUID or digest cannot make forged payload authoritative. |
+| L7. Typed visitor traps | Put identical UUID bits in a live local ID, package member, historical original map, artifact URI, description and expression text. Reidentify/delete the local object. Only the specified typed categories change; package bytes/literal content remain exact. Include current OA/SA historical semantics and a deleted managed member. |
+| L8. Domain closure | Pattern contains nested ALT/LOOP occurrences, ScenarioUse repeated bindings, operation allocation and message-field paths, contextual links, state machine transitions, OA/SA traces and data inheritance. Instantiate with valid/invalid bindings. Full core admission passes/rejects appropriately; no required relation is dropped to force success. |
+| L9. Layer and singleton fidelity | OA cannot bind an SA role; importing an SA pattern never clones a second System of Interest. Explicit parent and graphical placement choices preserve existing containment semantics. New neutral definitions do not bypass architectural layer checks. |
+| L10. Graphical task usability | At minimum and wide windows, publish/import, choose an export, bind the intended participant among repeated names, instantiate, inspect origin and resolve update conflicts. Use scope/kind groups, contextual search and a focused detail editor. A package browser or change review must not expand every member into one long homogeneous list. Record an action/time budget before the comparison and observe real task completion. |
+| L11. Independent API/source client | A client using the published OpenAPI and reST can supply package bytes, create imports/instances, query origin, preview/apply update, handle stale ETag, detach and export a portable document. Build equivalent accepted models through GUI/source/API and compare them fully. |
+
+## Highest-value next experiment and reasons to revisit
+
+Before a large implementation, run a small pure-core prototype against one existing DataType/Interface graph and the proposed neutral Duration/calculation definition. Implement only import resolution, one immutable mount, one pattern map and the exact document round-trip in an isolated experiment. Falsify the two-reference-shape bridge with source rename, local Reidentify, deletion, Replace, duplicate UUID bits and concurrent versions. If special cases spread into ordinary projection/command code instead of a confined resolver/admission adapter, switch to the uniform definition-reference design before proceeding.
+
+Then implement the three-way update example with a conservative typed-facet merge. A complete valid candidate plus exact source history is the success criterion; a visually plausible diff is not. Native workflow design can use real inspection data from that prototype, but the package/reference contract must be reviewed before downstream UI/API/schema work.
+
+Reasons to reopen the leading choice include a demonstrated need for virtual instances/overrides, exact shared data identity across layers, registry-driven dependency solving, collaborative package authoring, package signatures as a workflow requirement, or unacceptable measured size/performance of preserved package/history content. These would justify explicit design expansion, not hidden changes to pin or identity semantics.
diff --git a/harness/release-scenario-native-20260911.md b/harness/release-scenario-native-20260911.md
new file mode 100644
index 00000000..d9744949
--- /dev/null
+++ b/harness/release-scenario-native-20260911.md
@@ -0,0 +1,107 @@
+# Scenario authoring: native Windows evidence, 2026-09-11
+
+Codex-956atf `/root`. This is a partial capability checkpoint, not first-release
+acceptance. Actual Studio was operated through the Computer Use `sky` API against
+copies of the independently generated [fixture](fixtures/scenario-authoring/README.md).
+No fixture fields or expected transactions were changed to match the observed UI.
+
+## Build and execution identity
+
+- Rust implementation: `80cf197be6f1d400bf0b9c84bf8557f88c895aa6`.
+- `cargo build --locked -p oa-desktop --bin arcadia-studio`: exit0, 3m28s,
+ warning-free dev build. Log `.local/logs/desktop-gui-integrated-20260911.log`.
+- Executable SHA256: `A5ED6DF334B1BFB620425AFDF3E863F0B522990E6FB47C6C401A71CF4443954A`.
+- Immutable native staging directory: `.local/native-qa/studio-80cf197/`.
+- Bundled `libunwind.dll` SHA256:
+ `AA282FA47BB2C4E210CEA5E470CDBDCA58568F0BE0BC73E404D86AB9CD95EF6A`.
+- Process4416 opened the real Iced workspace. The launch helper initially reported
+ no targetable window; a fresh window listing found the completed workspace.
+ No second instance was launched. The debug console window was not automated.
+- Full desktop tests passed642/642 before this native run. Their executable/hash
+ differ from the GUI; see [STATE](STATE.md). Formatting passed. Subsequent strict
+ Clippy found two collapsible-if statements, corrected after this immutable build;
+ the current lint gate is not yet claimed passing.
+
+The native checker requires the task-local runtime on PATH; an initial invocation
+without the toolchain environment exited `-1073741515`. Sourcing
+`.local/toolchain/env.ps1` resolved that launch dependency. Both new OA/SA working
+copies then passed the baseline checker. This was a checker-launch error, not a
+semantic fixture failure. The GUI stage includes its runtime beside the executable.
+
+## Observed navigation and layout
+
+Opened `.local/native-qa/scenario-20260911/oa/project.arcadia` through Studio's
+normal Open dialog. The initial window captured1442×932 pixels, corresponding to
+the1440×900 client. The project contains62 elements, zero relations and11 fixture
+engineering warnings; that matches the independently constructed baseline.
+
+At normal size, selected OA A caller and Behavior & scenarios. The new workspace
+keeps the scenario selector and compact controls above the remaining-height canvas.
+Fit displayed the whole nested caller at42%; opening Selection reduced available
+height and recomputed35%. These overview scales are for navigation, not readable
+detailed editing of every nested label.
+
+1. Selected **OA Second use of B**, verified its name and alias
+ `scenario_oa_61`, then Selection → Open definition. The canvas changed to
+ **OA B verification** with Back to caller available.
+2. Selected **OA B use of C** (`scenario_oa_64`), opened C, then Back twice.
+ First return restored B's exact use; second restored A's **Second use of B**,
+ its Selection panel and35% overview. The initiating use was not replaced by the
+ similarly targeted first use.
+3. Repeated A→B→A through **OA First use of B** (`scenario_oa_60`). Return selected
+ that first occurrence and preserved its presentation.
+4. Switched A to100%, scrolled the actual canvas until the two reuse blocks were
+ visible, opened B and returned. The first-use block returned to the same visible
+ y-position (top646, label666 in the captured window) and remained selected.
+ A subsequent upward scroll moved naturally; Save did not snap it back.
+5. Save all completed. Independent `check baseline` passed the whole Project and
+ both reachable source files, including the retained note. Navigation introduced
+ no accepted source/model difference in this checkpoint.
+
+Resized through the Windows system-menu Size command, using Right/Down then a
+pointer placement. The resulting capture was1102×732 pixels:1100×700 client, the
+application's configured minimum. The initial corner drag did not resize; it is
+not counted as a sizing result. At minimum size, Fit recomputed21% with Selection
+open and28% after closing Selection. Focus canvas hid the side panels and Restore
+panels remained accessible. Normal-scale editing retained a real scrollable canvas.
+
+## OA action: creation and exact history pass
+
+Performed the fixture's prescribed `oa-action` task at the minimum1100×700 client,
+with focused canvas and100% scale. Tools → Add action exposed an explicit root
+insertion line labeled before **OA Root entry**. Clicked that line at the
+**OA A inspector** lifeline, not the Tools append action.
+
+The pending marker retained the chosen owner/before-slot/lifeline. The bottom form
+kept **Create** and **Cancel** pinned while its fields scrolled independently.
+Entered literal name **OA native action**, selected work **OA Inspect ticket**,
+and confirmed the preselected observed lifeline **OA A inspector**. Create added
+one action before Root entry; the canvas showed63 objects and selected the new
+action. Save all completed.
+
+| Native stage | Independent result | Preserved whole-directory snapshot |
+| --- | --- | --- |
+| Before Create | Previously checked baseline | `.local/native-qa/scenario-20260911/oa-baseline-verified/` |
+| Create, Save | `check oa-action` PASS | `oa-action-verified/` under the same run directory |
+| Ctrl+Z, Save | `check baseline` PASS; `same baseline-verified working` PASS | `oa-action-undo/` |
+| Ctrl+Y, Save | `check oa-action` PASS; `same action-verified working` PASS | `oa-action-redo/` |
+
+Every `same` comparison covers all Project identities/fields and every SourceBundle
+byte. The semantic checker borrows only the unique fresh role UUID and independently
+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.
+
+## Open native gates
+
+OA nested state observation/reuse/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
+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
+fixture procedure. Root retains native input; concurrent source builds use the
+separate target tree and must not overwrite the running staged executable.
diff --git a/harness/release-semantic-proposals-review-20260910.md b/harness/release-semantic-proposals-review-20260910.md
new file mode 100644
index 00000000..7e125fec
--- /dev/null
+++ b/harness/release-semantic-proposals-review-20260910.md
@@ -0,0 +1,124 @@
+# Independent review of the paired analysis and library proposals
+
+Codex-956atf `/root/semantics_critic`, resumed 2026-09-11. This is a design review, not an implementation test or release acceptance. Read the full revised objective in attachment `a49d1780-25d5-4778-ad68-6140c60e4207`, both proposals, the requirements delta, Gitea issue #1 through #102, the empty open-PR list and Wiki Home. Ownership is recorded in #103. Wiki Home describes an older checkpoint. Another host's earlier comments do not establish current activity.
+
+Owned output is this file only. No production or ledger edits, Cargo, native application input, commits or pushes. Root was integrating unrelated behavior/packaging changes while this review ran; inspected semantic boundaries remained unchanged. Source HEAD observed during review: `865cd55e21e622985322d711b23e6d653b563d3d`.
+
+References below use **A** for [analysis proposal](release-analysis-semantics-design-20260910.md) and **L** for [library proposal](release-libraries-semantics-design-20260910.md). Line numbers identify the versions initially reviewed; section names and quoted concepts identify the locations if the authors add follow-up text. Both explicitly remain proposals. A deliberate exclusion or unfinished experiment is not reported as a shipped defect. P1 means a contract decision or required workflow must be resolved before the relevant production foundation is ratified; P2 means a concrete design weakness or incompleteness to resolve before acceptance.
+
+The analysis author revised and froze A during review. Re-read its new section 3.4, exact literal rules and compatibility discussion. Final observed SHA256: A `BF631450F46FF19AA09D142B964B60FA380309E4A728F895D1ECEC3ECBF6EF41`; L `29687171ED01FE4A5A8C2F3B3493008C144189D44349524CDFF825862D41BE72`. R7 is corrected at proposal level; R2/R4 are now explicitly acknowledged consequential choices in A. That acknowledgment improves the proposal without resolving the choices.
+
+## Recommendation
+
+Keep the pure evaluator, typed expression references, exact package pinning, editable materialized architecture, explicit bindings, complete old instance baseline and atomic document admission. These are compatible foundations. Do not ratify the entire paired design yet. In particular, byte-level package identity must not accidentally become the only available engineering compatibility policy; and a source export with omitted management records does not demonstrate text-only authoring.
+
+The strongest immediate comparison is a compact direct-value/baseline design with one explicitly based alternative case against A's complete-case design, using both authored text and the native workflow. For libraries, retain materialized patterns, but decide the cross-revision definition policy and source creation/update normalization before committing to the hybrid mount implementation.
+
+## Findings
+
+### R1 — P1: the source example omits the information needed to author a managed instance
+
+**Locations:** L, “Textual source and portable admission,” lines 145–175, especially the comment at 165; “Proposed persistent model,” lines 112–139. A, “Minimum GUI and source work,” lines 192–203. Existing contract: `docs/language.rst:1772–1781`; `crates/oa-core/src/source_project.rs:286`; `crates/oa-server/src/store.rs:116–130`.
+
+The library example names an import, export, binding and member, then replaces the exact baseline/correspondence with a comment. Those records are authoritative for future updates, not optional display details. The proposed portable envelope solves transport and offline availability, but does not specify how an engineer creates, updates or repairs those records using text alone. A full serializer grammar would establish expressiveness; requiring users to hand-copy the old typed graph, identity map and lineage still fails the new low-clutter authoring criterion.
+
+**Minimal falsifier:** start with an empty project directory and an available package, without a GUI or preexisting instance. Write a readable declaration for two instances; normalize/compile it; edit one local occurrence; upgrade that instance to a new package while retaining the edit. The proposal currently has no specified text operation that creates the complete baseline and no complete example of the update. Supplying a GUI-generated snapshot as the starting point would evade this task.
+
+**Smallest convergence:** distinguish a concise authored creation/update request from its accepted, fully explicit normalized state. A Rust source command may allocate/stabilize IDs once and emit a declared, version-controlled management module containing the exact base/map/lineage. Specify when this happens, how repeated compilation stays inert, how conflicts are expressed and committed from text, and how diagnostics point to authored input or generated metadata. That module is part of the portable source envelope and published grammar, never an invisible desktop cache. An alternative is a fully authored management syntax, but it must win the same task without manually rebuilding snapshots. Existing missing-UUID stabilization is a useful precedent, not proof that instance normalization already exists.
+
+**Acceptance:** a human-readable tutorial performs initial publication/import/two instantiations/local edit/selective update/detach entirely through text plus the published Rust tooling. Reopen from only the directory and packages. Compare the full model and exact accepted metadata to independently constructed expectations. Measure relevant text edits and incidental identity/bookkeeping edits separately. A smaller displayed snippet must not hide mandatory work.
+
+### R2 — P1: cosmetic package changes can make selective updates unusable across unchanged definitions
+
+**Locations:** L common contract lines 51–56, layered mounts line 72, two-project example 253–260; A unit rules 227–241 and library boundary 293–300. Existing layered compatibility: `crates/oa-core/src/data.rs:129–145` checks local identity ancestry.
+
+L hashes exact comments/line endings and assigns new revision identity to changed bytes. A makes that whole pinned revision part of quantity-kind equality and rejects named-kind-to-named-kind `AsKind`. This is a deliberate conservative policy, but its interaction with selective instance updates is not closed by the worked example.
+
+**Minimal falsifier:** package P contains Duration, second and two-duration calculation plus a monitor pattern. Alpha has two P@D1 instances and a total budget over both. Publish D2 changing only a pattern description or a source comment; all Duration/unit definitions and stable member IDs are identical. Update only Alpha's left instance as required by L2. If its imported references advance, left Duration@D2 and right Duration@D1 cannot be added. The supported unit conversion requires equal kind and `AsKind` refuses this named-to-named conversion. If references stay on D1 instead, the proposal needs a defined mixed-version materialization/base policy and must not claim the instance now derives wholly from D2.
+
+The analogous mount problem is concrete: a new mount receives new local IDs. An unchanged item/interface in D2 is not in D1's local ancestry, so existing item/interface satisfaction does not consider it compatible. Rebinding only the chosen pattern can require edits to unchanged outside ports, allocations and message paths. An explicit rejection protects integrity but does not by itself complete a usable selective update.
+
+**Choose one policy before ratification:**
+
+- Keep exact byte pins for reproducibility and additionally define validated semantic identity/compatibility over a typed definition and its relevant dependency closure. Cosmetic package bytes may differ while the verified definition remains compatible. Do not substitute name matching or a publisher's unverified flag.
+- Keep strict revision types and provide a first-class, checked compatibility bridge or selected-use migration that works for genuinely unchanged definitions and shows all affected consumers. Specify bridge scope and composition.
+- Deliberately require stable shared vocabulary packages, so pattern-only packages can change while unit/data dependencies stay pinned. This is the smallest initial experiment, but it imposes a package-authoring constraint and does not solve updates to the vocabulary itself. Revise the bundled-definition example accordingly and retain the wider gate.
+
+Do not silently choose structural equivalence for all equal-dimensional kinds: Energy/Torque still require their intended distinction. The needed distinction is between archive reproducibility, definition identity, and permitted use-site compatibility.
+
+### R3 — P1: a valid subjectless analysis case falls out of the proposed pattern closure
+
+**Locations:** A meanings 59–63, root placement 132 and integration 305–307; L publication closure 84–87. Existing transition closure: `crates/oa-core/src/transitions.rs:504–571`; existing kind mapping `:203–235`.
+
+A deliberately makes property/case records layer roots, gives a property an outgoing subject reference, and allows a case's explanatory subject to be absent. L says to include new analysis records whose subject is included. Those rules do not find a subjectless case that binds the included properties. Checks have a case parent and no subject. Following ordinary ownership or outgoing references from the activity cannot recover this inverse relationship.
+
+**Minimal falsifier:** Activity A has property p. Subjectless case C binds p to 750 ms and owns check K. Publish A as a reusable pattern with its analysis. The stated closure can include p because its subject is A, but neither C nor K qualifies by subject. The resulting instance has the property declaration and loses its value/check. Conversely, blindly including every case that mentions p can pull an unrelated project-wide case, its other properties and their architectural subjects into this small pattern.
+
+The same topology matters to OA→SA: selecting A with Subtree currently follows children and outgoing references. New kind mappings alone do not make root-associated p/C/K travel with A. A acknowledges that transition rules need work; this example identifies the decision those rules must make.
+
+**Smallest convergence:** specify analysis selection as its own reviewed export/transition facet: explicitly selected whole cases, their checks, the properties they use, and declared external property/subject bindings. Show omitted analysis on the selected subject instead of silently treating its absence as complete. Do not automatically slice a case's formula graph or copy all mentioning cases. Decide how reusable patterns store shared formulas versus per-instance assumptions. Add a prototype-local neutral-definition reference rule: a pattern's `Local(Duration)` must become the intended pinned imported reference or explicitly copied local definition; it cannot be sent through the ordinary local architectural ID remapper without a category decision.
+
+**Acceptance:** use one subjectless local case and one project-wide case sharing p; publish/instantiate and forward/reverse-transition the small subject with explicit choices. Assert retained/omitted values, checks, external bindings, neutral pins and untouched outside analysis. No graph traversal may choose the scope by accident.
+
+### R4 — P2: complete independent cases duplicate the very formulas and fixed inputs engineers need to maintain once
+
+**Locations:** A candidate ranking 34–41, examples 164–198 and comparison 203. The report already makes D conditional; the current evidence does not justify promoting it over B.
+
+**Minimal falsifier:** two cases use the same inputs/formula/check except one duration. The provided example repeats the unchanged dispatch value, total expression and predicate. Change the requirement threshold once. Unless the engineer locates every separate check, the two cases now test different requirements while both can still reference the same descriptive Constraint. Factoring a calculation helps the formula but still adds parameters/calls/bindings and does not automatically share the check's threshold.
+
+At a larger, explicit scale, take 20 fixed inputs and 2 varying inputs in each of 20 cases. D needs 440 input assignments before repeated results/checks; baseline plus overrides needs 22 baseline assignments and 38 changed input assignments for 19 alternatives. These are representation counts, not measured human task times. Some independent studies truly need frozen separate assumptions; ordinary engineering properties do not all need that semantics.
+
+**Alternative worth prototyping:** a property contains its baseline value or derived formula; each optional case explicitly names that baseline and stores only deviations, with a single inheritance level. Evaluation reports each input's origin and the captured baseline/case revision. Distinguish “clear override/use baseline” from explicit unbound. No dependence on active UI selection and no unnamed hidden default case. If frozen assumptions are needed, make snapshotting a deliberate operation. This introduces resolution rules but removes routine duplicate authoring; compare the costs, rather than treating record-count simplicity inside the evaluator as user simplicity.
+
+**Decision test:** first single property, two-input budget, 20-case single-threshold change, and intentionally frozen study. Measure source lines/edits, wrong-context changes and native task completion. D can still win if its complete-case isolation proves materially clearer, but the comparison must include maintenance rather than only first creation.
+
+### R5 — P1: crossing OA/SA with mounted data needs an explicit origin and update disposition
+
+**Locations:** L layered-definition policy 69–76, pattern layer policy 70 and acceptance L9; A transition rule 307. Existing transition mapping includes DataType/DataField/Interface/ExchangeItem (`transitions.rs:213–233`) and follows the required contracts (`:522–539,568–571`).
+
+**Minimal falsifier:** an OA activity exchanges a mounted library item. Transition the activity/exchange to SA. Same-layer validation requires a compatible SA item. L forbids treating the OA mount as an SA mount, and a package need not provide a matching SA export. Current transition behavior can copy the shared data body into ordinary local SA records; retaining a mount marker would instead violate the immutable mapped payload/layer. Neither outcome has a specified library lifecycle in the proposal.
+
+**Smallest convergence:** offer an explicit choice in the transition plan: bind a compatible exact-pinned SA export, or create a local SA derivative with preserved origin/trace and clearly defined independence from library updates. If neither is valid, return a located unresolved decision. Do not silently fork, silently retain an invalid mount, or require the engineer to abandon the whole normal transition workflow. The reverse transition and later source-library update must follow the same policy. An ordinary OA/SA semantic trace may record correspondence, but it cannot pretend that package update management was preserved.
+
+This does not require globally neutralizing existing data semantics. It is the concrete test that should decide whether the hybrid mount adapter is simpler than uniform qualified data definitions for this product.
+
+### R6 — P2: anonymous derived dimensions need a closed intermediate operator algebra
+
+**Locations:** A ScalarType 75–80, Expr 118–129, numeric rules 223, unit table 229–241 and public value 271.
+
+**Minimal falsifier:** evaluate `AsKind(Energy, f1 * length1 + f2 * length2)`. Each product is specified to become an anonymous dimension. Addition is specified for equal resolved kinds; anonymous values have no such kind. The sketch contains no intermediate type, so accepting, rejecting or requiring two inner `AsKind` operations is currently an implementation choice. Similarly examine `(mass * length) / time`, comparison of two anonymous products, and anonymous dimensionless intermediates.
+
+**Smallest convergence:** define a separate closed internal type algebra including anonymous dimensions, then specify every permitted unary/binary/conditional/Sum combination and when the result retains or loses a named kind. It is reasonable to require explicit kind assertion at a declared output; it is unnecessary to force extra casts solely because the internal type sketch is incomplete. A worked force/energy expression should compile to an unambiguous typed tree before GUI/schema work. The conservative affine point/difference table itself does not supply a counterexample and can be retained.
+
+### R7 — corrected during review: source numeric limits must admit every accepted exact literal AST
+
+**Locations:** A exact-number contract 217–221. Existing round-trip obligation: `docs/language.rst:1772–1781`; the server explicitly compares the formatted/recompiled model (`store.rs:116–122`).
+
+Initial proposal allows a 4,096-bit canonical wire numerator/denominator, but source numeric tokens have at most 256 decimal digits and exponents at most 128. `Expr::Number(10^300/1)` is within 4,096 bits, yet its integer spelling has 301 digits and its compact decimal exponent exceeds 128. Rewriting it as arithmetic changes the AST; full model parity is not merely numerical equality. A read-only .NET BigInteger calculation confirmed the 301-digit spelling; no evaluator was run.
+
+The analysis author acknowledged and corrected this in the frozen section 4.2, now lines 238–244: up to 1,234 decimal component digits, actual 4,096-bit admission bounds, canonical integer/ratio output, and explicit literal AST/source/JSON closure. I read back that correction. The added `1/2^4095` example also avoids demanding an excessively long terminating decimal spelling. This closes the identified proposal contradiction; runtime conformance remains untested. Boundary tests must construct an accepted literal via JSON and round-trip the exact AST through source; testing only arithmetic results misses the problem.
+
+## Choices that can converge now
+
+| Product criterion | Candidate comparison | Recommended next decision |
+| --- | --- | --- |
+| Small-model text and graphical authoring | Baseline properties avoid a compulsory separate case/binding for each first value; complete cases make assumptions explicit but add authored records. | Prototype B and D against the same maintenance tasks. Do not ratify D from evaluator simplicity alone. |
+| Maintained reuse with ordinary local editing | Materialized patterns preserve the current authored graph; virtual instances introduce another effective-model/override system. | Keep materialized patterns and exact typed three-way comparison. |
+| Offline reproducibility | Exact pins, supplied package bytes and immutable revision imports are consistent across both designs. | Keep them; separate type compatibility from archive identity under R2. |
+| Source-only engineering | Full-state serialization is necessary but does not define initial authoring or update resolution. | Require concise authored requests plus explicit normalized management state, or demonstrate an equally usable complete alternative. |
+| OA/SA fidelity | Hybrid mounts preserve current layer checks; uniform references may simplify shared definition identity. | Decide using the mounted-item transition and selective-update falsifiers, not the number of touched Rust files. |
+| Numeric correctness and breadth | Q1 gives a precise rational foundation; approximate engineering functions remain openly unresolved. | A bounded exact experiment is reasonable. It cannot stand in for the declared broader release capability; freeze operator closure and source/JSON limits first. |
+
+No new factual standards claim was needed for these findings. They follow from the proposals, revised user requirements and inspected repository code. Primary standards cited by the authors can inform the later capability boundary but do not resolve Studio's identity or source-authoring choices automatically.
+
+## Deliberately not reported as defects
+
+The exact stored old baseline, immutable original map plus explicit current lineage, typed foreign/live/historical reference categories, no UUID-shaped string rewriting, complete source/package admission, stale-preview rejection, explicit order conflicts and no hidden deletion cascade are coherent requirements. The prototypes must prove them; merely noting that current code does not yet implement new proposals would not be an independent finding. Existing `vacant`/Project identity checks and deletion visitors do require the already-planned reservation/category changes, but that is acknowledged integration work.
+
+The affine point/difference separation, exact rational budget, distinct false/missing/failed outcomes and evaluation purity are compatible as specified. Unsupported trigonometry is openly a scope/acceptance decision rather than a secret arithmetic defect. A future approximate domain needs a justified profile; this review does not prescribe a full solver or all of SysML.
+
+## Focused experiment handoff
+
+Before broad production changes, build one disposable pure model/source experiment that can be driven without Iced: two properties and a budget; a subjectless case; one package containing units, an item/interface graph and a pattern; two consumers and two instances. Exercise R1–R3/R5 together: authored creation, cosmetic package revision, selected update with an outside budget/contract, explicit analysis selection, and OA/SA transition. Add the exact literal and anonymous-dimension expressions from R6/R7. Independently construct expected accepted graphs and rejected decisions.
+
+The useful output is a contract choice supported by the complete small workflow, including the final authored text and normalized metadata. Passing a resolver-only prototype or showing a shorter source excerpt would not answer these questions. Root owns ratification, implementation and all remaining release gates.
diff --git a/harness/release-textual-authoring-design-20260911.md b/harness/release-textual-authoring-design-20260911.md
new file mode 100644
index 00000000..ea559e88
--- /dev/null
+++ b/harness/release-textual-authoring-design-20260911.md
@@ -0,0 +1,214 @@
+# Text-only systems modeling: current source7 and competing authoring designs
+
+Codex-956atf `/root/requirements_delta`, 2026-09-11. Bounded language-design investigation for root synthesis and independent criticism. **No candidate below is ratified, and this report does not accept the release.** Owned files are this report and the isolated `harness/experiments/textual-authoring-20260911/` experiment. No production parser, specification, model, GUI or API edits; no Cargo or native application input.
+
+Read the complete current `PROJECT_GOAL.md`, SHA-256 `DD58F75C93D55FE16ED141A23D834898FB6EBC625AE7E7AE379DA552A8312435`, AGENTS.md, issue #1 through #117, the empty open-PR list and Wiki Home. The Wiki records an older checkpoint. Coordination is in #112. Codex-9e8r6t `/root/palette_finish` independently owns the task-based usability audit and narrow documentation corrections (#113/#116); this report concentrates on language coverage, identity, source/API behavior and architecture alternatives. Their separate small-recipe execution is #117. Root owns integration and all release decisions.
+
+Inspected source began at `865cd55`; the completed probe ran while HEAD was `80cf197be6f1d400bf0b9c84bf8557f88c895aa6`. Root granted a bounded reader lease after its desktop suite, then continued its GUI build. The probe used the completed core artifact identified below and wrote only isolated experiment files. The lease is finished. Source line references identify the inspected local version; the other host's pending documentation corrections can shift them.
+
+## 1. What the evidence establishes
+
+Source7 can express the current persistent OA/SA model through readable declarations, typed values and explicit references. It already supports useful omission of ordinary defaults, nested ownership, forward references, multiple files and identity-preserving updates. A complete engineering example authored without existing GUI records passes the real core. Calling this merely a JSON export, or claiming that text-only modeling is absent, would be incorrect.
+
+The principal weaknesses are the amount of identity and constructor scaffolding exposed during ordinary work, a project-wide alias namespace even across nested modules, limited source-oriented refactoring/navigation, and the absence of an ordinary local check/stabilize/refactor command-line tool. REST can support a source-only workflow today, but engineers must manage the bundle, returned stable identities and revision protocol. Canonical export makes default values explicit and expands small models substantially; it should not be used as a proxy for the best current authored syntax.
+
+**Leading candidate for an experiment:** preserve the current authoritative model and exact source envelope, provide a real source-only tooling path, and trial domain-specific syntax that lowers to the existing model with explicit identity and order rules. Compare that approach against a redesigned declaration/namespace language and against separating identity/history metadata. Keeping today's UUID clauses is a conservative trial boundary, not a conclusion that the new low-clutter requirement has been satisfied.
+
+The newly required calculations, quantities and maintained libraries remain separate semantic work. Better spelling for source7 cannot supply their missing behavior; their unratified designs and paired criticism are in the adjacent analysis/library reports. Conversely, adding those concepts with raw implementation-shaped records would deepen the present authoring problem.
+
+## 2. Complete small example and executable evidence
+
+The complete initial source is [alarm-response.arcadia](experiments/textual-authoring-20260911/alarm-response.arcadia). It has no external includes, libraries, missing GUI-created subjects or unexplained UUID prerequisites. Starting with an empty editor, an engineer can author this file and submit it as one source bundle.
+
+It models a plant operator detecting an alarm and a maintenance team assessing it, explicit responsibility allocation, a pressure-report payload, a capability, a two-contribution operational process and a typed notification scenario. SA adds a console, classification function and chain, an owned state machine, a signal-triggered transition and a reviewed OA/SA refinement. An artifact link identifies procedure evidence, and a saved view places both operational activities. The pressure text is a descriptive annotation under current semantics; it is not an evaluated quantity. The URI is opaque evidence metadata, not a claim that a procedure was fetched.
+
+There are 40 persistent identities: project, 25 elements, 9 relations, one diagram, two placements, one artifact and one trace. The final example produces **no structural errors and no engineering warnings**. That establishes a complete admissible small source example, not the engineering adequacy of every imaginable alarm system or the usability of its rendered diagram.
+
+| Form | UTF-8 bytes | Lines | What was measured |
+| --- | ---: | ---: | --- |
+| Initially authored, new IDs omitted | 4,373 | 110 | Exact initial fixture, already omitting ordinary default fields and nesting owned elements. |
+| Accepted/stabilized | 6,053 | 110 | Actual `compile_bundle` result; 40 explicit UUID clauses inserted, existing source retained. |
+| Canonical single-file export | 9,710 | 344 | Actual `language::format` result from that same model; defaults and flat records emitted. |
+
+Stabilization adds exactly 1,680 characters here: 40 clauses of 42 characters each. That is 38.4% growth over the initially authored text. Canonical export is 2.22 times the initial byte count and 3.13 times its line count. These are representation measurements, not measured task times or proof that fewer characters always improve comprehension. The initial source has 41 reference occurrences, 78 semicolons, 108 brace characters, 10 empty declaration bodies, four `none` tokens and one empty-list token. Display names and aliases are separately required for every named declaration; the two placement declarations omit display names by design.
+
+The saved canonical result contains 39 empty description fields, 18 `none` tokens and seven empty-list tokens. Some of those fields represent required reviewed history, so these counts must not be converted into a blanket deletion rule. The authored example intentionally retains the two empty descriptions in its reviewed trace baseline because historical observations and live defaults have different meanings.
+
+### Probe scope and reproducibility
+
+[probe.rs](experiments/textual-authoring-20260911/probe.rs) was compiled directly with Rust 1.98.1, host `x86_64-pc-windows-gnullvm`, without Cargo. Root designated `target/debug/deps/liboa_core-6c8da57367eec642.rlib` as the completed suite's core artifact; SHA-256 before and after was `D7EFB5F3C423FF8AF13637F53CC481502C7F317BF01E9D072F9EFD64CD954C13`. The successful output is [probe-output.txt](experiments/textual-authoring-20260911/probe-output.txt). The temporary executable was removed after use.
+
+Executed assertions and reported diagnostics establish:
+
+1. Initial source7 admission, all 40 expected identities and no warnings; canonical parse equality and canonical idempotence.
+2. Recompiling the returned stabilized source preserves the exact model and bundle. Recompiling the original missing-ID source allocates a different project identity.
+3. Renaming only a raw declaration alias rejects because its old uses remain unresolved. A prepared `SetAlias` command keeps the UUID and rewrites every live reference while retaining the attached comment.
+4. Reparenting the nested assessment activity to the root through the shared prepared command/updater retains its identity and attached comment. Moving a root participant into an included file preserves the entire model.
+5. Omission of a fresh source7 scenario's viewpoint resolves to `MixedLegacy`. Removing `Action.lifeline none` and `Exchange.message_kind Asynchronous`/`reply_to none` from this fixture leaves the admitted model unchanged.
+
+Actual source snapshots are retained under [observed](experiments/textual-authoring-20260911/observed/stabilized.arcadia): stabilized, canonical, renamed, reparented, and a split entry plus participant fragment. They are separate experiment outputs, not one bundle containing all six alternatives. The initial fixture SHA-256 is `D5E75F60081A7D99B0E10387C5D722064ABBE022A022F376D7BF742AC0D69B0B`; the final probe source is `F62AD8C55DD06B15F59E7A86AC11A7A77505456BE09F5AA96DB7F681280CC18C`.
+
+The probe is deliberately bounded. It did not run HTTP, the native editor, save-journal fault injection, a new language prototype, a performance benchmark or a comprehensive comment-preservation suite. Existing test source supplies additional contract evidence but is not a newly executed result in this report. The first probe had three honest completeness warnings; the final source resolved them with an explicit Flow mechanism, reviewed trace prose and SA chain rather than suppressing validation.
+
+To reproduce after root grants access to a matching built artifact, initialize `.local/toolchain/env.ps1`, compile the probe with `rustc --edition=2024`, an explicit `--extern oa_core=`, `-L dependency=` and `-C linker=clang.exe`, then pass the initial fixture path and a new isolated output directory. Do not use a different toolchain's or target's rlib and infer a semantic failure from linker incompatibility. A portable product CLI is a proposed outcome, not this developer-only command.
+
+## 3. Current semantic-family reachability
+
+The declaration dispatcher is generated from all supported `Kind::ALL`/layer pairs and all `RelationKind::ALL`, plus diagrams, placements, artifacts and traces (`language.rs:295–330`; `model.rs:69–109,900–925`). The typed resolver then validates closed records (`language.rs:1594–1808`). Thus the following is a current representational coverage map, not a claim that each authoring task has been timed or independently exercised through all interfaces.
+
+All source paths below are under `crates/oa-core/src` unless otherwise stated.
+
+| Semantic family | Current text-only path and evidence | Important authoring cost or boundary |
+| --- | --- | --- |
+| OA participants, roles, work, missions and capabilities | `oa_entity`, `oa_actor`, `oa_role`, `oa_activity`, `oa_mission`, `oa_capability`; nested decomposition plus explicit allocation/role/mission/capability relations. `docs/language.rst:94–102,210–224,240–290`; `examples/source-project/oa.arcadia`. | Nesting is containment only. Allocation must remain explicit. Global aliases are needed even for locally nested work. |
+| SA boundary, actors, functions and services | `sa_system`, `sa_actor`, `sa_function`, `sa_mission`, `sa_capability`, `sa_functional_chain`; corresponding relations and explicit OA/SA trace. Same declaration catalog and `examples/source-project/sa/`. | There is at most one System. A function nested inside its performer would be an ownership mistake, not helpful syntax. Source must express functional decomposition separately. |
+| Exchanges, contracts and interfaces | Items, categories, data types/fields, interface allocation, associations, typed ports, communication means, functional/boundary exchanges, exchange/port allocations, interface provision/requirement. `docs/language.rst:103–120,149–165,240–263,303–307`; `examples/release1/oa/types.arcadia` and SA types. | `type_ref { Named @type; };` and nested typed contracts expose constructor wrappers. Functional exchange endpoints require explicit function and port references. GUI convenience may create several records; raw text must supply their full valid graph. |
+| Process/chain contributions and reuse | `steps`, Action/Exchange/Control/SequenceReference occurrences, SequenceLink, ContextualLink with owner/reference path/leaf/purpose. `docs/language.rst:167–205,548–614`; `examples/release1/oa/behavior/process_oa_assessment_procedure.arcadia`. | Owning an occurrence does not add it to `steps`; declaration order does not create precedence. A reusable-call path identifies an occurrence instance, not just a named callee or work element. Simplification must preserve those distinctions. |
+| Scenarios, fragments, calls/replies and reuse | Explicit viewpoint/context; lifelines; Exchange/Action/State/Fragment/Branch/ScenarioUse; ordered membership, bindings, operation identity and qualified MessageValues. `docs/language.rst:617–743`; `model.rs:550–589`; `examples/release1/oa/behavior/scenario_oa_full_scenario.arcadia`. | A repeated message needs a new occurrence identity. Nested Branch/Fragment/ScenarioUse constructors plus explicit membership/binding lists are among the most verbose ordinary authoring forms. No syntax sugar may flatten alternatives or erase caller qualification. |
+| State and mode behavior | Machines, regions, all 13 StateKind vertices, events, transitions, state actions and availability. `docs/language.rst:130–141,745–873`; `examples/release1/sa/behavior/state_machine_sa_monitor.arcadia`. | Hierarchical nesting already removes most `parent` repetition. Event constructors and typed/prose action alternatives still require clear guidance. State geometry and transition topology are separate records. |
+| Constraint and value annotations | `oa_constraint`/`sa_constraint`, message expressions, entry/exit/do/guard/event strings; existing bounded data defaults. `docs/language.rst:142–165,201–205,658–670`. | Existing strings are fully editable but not evaluated calculations or unit consistency. The requirements delta and analysis proposal remain authoritative about the missing numerical semantics. |
+| Saved presentation | `diagram`, `node`, projection constructors, routes/labels/anchors, view options and categories; `docs/language.rst:1009–1176`; `examples/release1/views/`. | Every persistent view field is representable. Typing coordinates is possible, but default overlapping placements do not make a good diagram. Derived camera/selection/viewport data must stay outside the semantic source. |
+| External artifacts | `artifact` with owner, relation, URI, revision and fragment; `language.rs:1778–1788`; the complete example above. | Opaque URI/revision strings are usable from text; their existence is not evidence of retrieval, synchronization or file execution. |
+| OA/SA trace and review history | `trace`, endpoints, kind, prose baseline and typed semantic facets; `docs/language.rst:1179–1490`; `language/semantic_source.rs`; `harness/fixtures/release1-native/semantic-keyed.arcadia:392–430`. | Historical `uuid` literals may refer to deleted records. Their keys/review observations are meaning-bearing state, not optional comments or live `@alias` links. Manual history authoring is expressible but burdensome; review APIs can generate the accepted facts. |
+| Whole-document lifecycle and modularity | SourceBundle, explicit includes, source migration, exact updater; `docs/language.rst:1645–1885`; `source_project.rs:286,780`; `source_files.rs:329,819,1041`. | Pure compilation reads supplied files only. Current bundles reject unreachable supplied files; desktop draft buffers may additionally retain detached files before selecting the reachable bundle. No package namespaces or maintained library imports are implied by includes. |
+
+This covers all major current semantic families, including the less visible historical and presentation data. The general parse/format contract represents all persistent fields, but it does not prove comfortable authoring. Maintained cross-project library semantics and evaluated analysis remain unimplemented extensions; text/GUI/API designs for them must enter the same coverage matrix before the intended full end state can be accepted.
+
+## 4. Identity, references, partial edits and source-only workflow
+
+### What current identity actually means
+
+`Project`, elements, relations, views, placements, artifacts and traces share one UUID and alias namespace (`docs/language.rst:48–56`). Display names may duplicate. An alias is a stored source label, not identity derived from a name. Aliases are ASCII identifiers; strings may carry Unicode and JSON escapes (`:1578–1590`).
+
+`Parser::optional_id` allocates a fresh random UUID whenever the clause is absent (`language.rs:1226–1228`). `compile_bundle` inserts those IDs and recompiles the actual returned bytes before migration/indexing (`source_project.rs:286–300,660–675`). A plain `language::parse` returns a model but no stabilized source bundle. Lint is read-only and addresses raw bytes; accepting lint output does not preserve allocated identities. These distinctions matter to every external editor or AI client.
+
+| Operation | Correct current source-only behavior | Failure or cognitive trap |
+| --- | --- | --- |
+| Create from empty input | Author a complete header and declarations with new IDs omitted; compile/import the bundle, adopt its returned stabilized files. | Repeatedly submitting the original missing-ID buffers creates new identities even if names and text look unchanged. |
+| Change a display name | Retain alias and UUID; edit the quoted name. | Recomputing the alias from that name changes references unnecessarily. Trace drift may properly require a later review. |
+| Rename an alias | Change its declaration and all live uses in one complete source candidate, or use the documented SetAlias command and retrieve updated source. The probe verifies both rejection and safe rewrite paths. | Editing only the header does not trigger automatic refactoring during parse. Blind text replacement can corrupt prose, comments and historical values. |
+| Reidentify | Use explicit identity-change commands when retaining original-record provenance is intended. | Raw replacement of a UUID is removal/creation correspondence, not an inferred rename. Same name or alias is insufficient to preserve history/comment ownership through identity swaps. |
+| Add one new declaration to an existing file | Keep established IDs; only new headers may omit them. | Reformatting the whole file without old IDs can replace the entire modeled graph. A safe client must retain the returned source after every accepted change. |
+| Reparent a nested element | Move the declaration into its new valid owner's body or to root, retaining IDs; remove/update an explicit parent if needed. Prepared Reparent performs that relocation with source trivia. | Lexical nesting and an explicit parent cannot disagree. Moving a work element must not silently alter allocation. |
+| Move a declaration between files | Retain IDs and semantic parent; update includes and supply all reachable files atomically. The probe verifies a root participant move. | An include does not create a namespace or implicit owner. Moving a nested declaration to a top-level fragment without an explicit parent changes its model meaning. |
+| Delete a referenced record | Supply a complete repaired candidate or use a typed command with the current deletion policy. | Raw source deletion does not automatically remove every dependent relationship or ordered reference. Structural rejection is correct; copying a GUI gesture's text deletion alone is insufficient. |
+| Work with incomplete input | Keep raw drafts in the external editor; lint without adopting them; submit a structurally valid complete bundle when ready. Explicit permitted holes warn. | Parser admission may stop at the first syntax/conversion error. Partial declaration indexing is not a partially accepted model or per-file transaction. |
+| Preserve review/history | Keep full accepted source plus semantic model snapshots; retain historical `uuid` forms exactly. | Replacing historical UUID observations with current alias lookup loses facts after deletion or reidentification. Server revision storage is not desktop Undo history. |
+
+`update_bundle_with_identity_map` checks the old compiled index/model/bundle and requires valid correspondence before writing (`source_project.rs:780–849`). The updater retains omitted defaults, literal spelling, comments between `@` and alias, list-entry comments and CRLF/LF choices under defined ownership rules (`docs/language.rst:1812–1876`). Existing tests target identity swaps, nested cross-file moves, orphan comments, constructors and keyed lists (`tests/source_identity_updates.rs:37,81`; `tests/source_nested_updates.rs:49,77,244,345`; `tests/source_project.rs:900,966,1030,1097`). These are valuable obligations for a new grammar, not incidental old-editor behavior to discard.
+
+### Genuine source-only access today
+
+The REST service can import an authored complete SourceBundle through `POST /api/v1/projects/import-source-project`, retrieve it with `GET .../source-project`, and accept a conditional complete `PUT` (`docs/api.rst:85–99,164–204`; `oa-server/src/routes.rs:339,505,519`). A client can prepare ordinary text files, encode them as the documented `entry`/`files` JSON transport, import, read back stable files, edit, validate and submit using the returned ETag. JSON encoding of transport strings is not intended to be the engineer's modeling notation.
+
+Candidate validation and typed command transactions are available without graphical controls (`docs/api.rst:115–120,288–302,445–464`). SetAlias/Reparent commands use the same admission and source updater. Transition and semantic-review query/preview/apply endpoints mean text-only clients need not hand-construct every counterpart baseline. The operation still requires an explicit command/decision; ordinary source does not contain executable transition instructions.
+
+The service currently requires an existing project resource for candidate validation, so it is not a standalone offline compiler endpoint. It retains only the current revision, and writes require the captured ETag; a source-only client must retain draft and accepted snapshots itself (`docs/api.rst:13–49`). `/source` is canonical model interchange, whereas `/source-project` preserves authored text. Substituting the former can defeat a client's goal of retaining its files and comments.
+
+The shipped desktop command-line entry has only `--write-example` before launching Iced (`oa-desktop/src/main.rs:36–48`). The server binary exposes service configuration, not check/stabilize/refactor commands (`oa-server/src/main.rs:31–78`). Core has useful filesystem loading/saving and pure APIs, but writing a custom Rust client is not a comfortable systems-engineer workflow. There is no inspected ordinary local language CLI or LSP route providing source-position definition/references/rename. Existing desktop `source_navigation.rs` is literal per-buffer search and line navigation; model-to-source selection and file-tree navigation are useful but different facilities.
+
+## 5. Where noise is avoidable, and where explicitness carries meaning
+
+The current source7 file authored above is already much smaller than generated release examples. Across the actual 30 `examples/release1` Arcadia files, the summed UTF-8 size is 78,414 bytes with 258 identity clauses, 357 empty-description occurrences, 34 `parent none` fields, 29 empty lists and 69 `none` tokens. These lexical counts include historical records; they do not prove that all matching text is redundant. The independent other-host audit in [Gitea #113](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/issues/1#issuecomment-113) reports the same 30 files/258 UUID clauses and complementary process/reuse counts. Neither corpus is a performance benchmark.
+
+Four distinct problems should not be conflated:
+
+1. **Default-heavy presentation.** Empty descriptions, root parent-none fields and ordinary defaults can often be omitted in authored declarations already. Current canonical export intentionally writes them, and graphical creation uses canonical declaration text. A minimal authoring writer could improve newly created material without changing semantics. It must compare against versioned parser defaults, preserve explicitly authored values and retain required historical observations.
+2. **Structural wrapper noise.** `body { Action { action @work; lifeline none; }; };`, `type_ref { Named @type; };` and Fragment/Branch/ScenarioUse records make engineers read metamodel serialization structure. These need a domain-focused surface syntax if an authoring trial finds the wrappers impair work. They are typed constructors today, not embedded arbitrary JSON, but their shape still reflects implementation records.
+3. **Repeated relationship authoring.** A sequence owner has a `steps` list and separate owned occurrences. Fragment/branch membership and reuse binding maps have related duplication. Some of this can be generated from one explicit authored block, but contribution order, precedence, containment, exchange occurrence and reuse identity must remain distinct. Simply interpreting all nested declarations as an execution order would change semantics.
+4. **Identity, history and modular context.** UUIDs, reviewed fact records and global aliases create cost that ordinary whitespace formatting cannot remove. Moving these facts elsewhere requires an exact portable representation and conflict rules; hiding them in a desktop cache would break the new text-only requirement.
+
+The specification also has concrete inconsistencies, independently checked before any redesign:
+
+| Finding | Evidence and current disposition |
+| --- | --- |
+| EBNF version is stale | `docs/language.rst:1599` says `arcadia 5`; its header and actual parser support current 7. The other host owns the correction in #116. |
+| Fresh-source viewpoint default is misleadingly documented as legacy-only | Catalog `:123` and scenario discussion `:631` frame omission as schema-2 hydration; `language.rs:1668–1671` sets MixedLegacy whenever the field is absent. The probe confirms fresh source7 behavior. #116 owns explicit guidance, with no semantic default change ratified. |
+| Constructor-required-field rule overstates current admission | `docs/language.rst:157–165,173–176` says supplied constructors require all fields and frames new message-field defaults as schema-2 exceptions. `model.rs:550–566` and the probe show fresh source7 accepts omitted Action.lifeline and Exchange.message_kind/reply_to while producing the same values. Root should reconcile the normative rule and actual supported defaults deliberately, preserving accepted source, rather than silently tighten the parser. |
+
+This last inconsistency matters directly to authoring counts: a reader following the general specification may type more fields than the implementation needs. It also shows why a new syntax must have executable normative examples and versioned default rules instead of relying on implicit Serde behavior.
+
+### Larger-model needs
+
+All includes and nested declarations share one global alias namespace (`docs/language.rst:1692–1696,1759–1762`). There is no current package-level scope or import alias resolution. Engineers must invent globally unique labels such as `oa_left_controller_pressure` even when the file tree already communicates much of that context. Splitting a project into files reduces local display size; it does not provide scoped names, cross-file reference navigation or independently compilable semantic modules.
+
+Core bundles allow 256 files, depth 32 and 1,024 include edges by default. Desktop policy permits 64 MiB/100,000 graph objects/250,000 records/500,000 ordered references; REST currently limits model/source-bundle JSON to 8 MiB and 5,000 graph objects/20,000 records/50,000 ordered references (`oa-desktop/src/source_workspace.rs:9–18`; `docs/api.rst:137–153`). These different capacity policies must be visible in a large-model workflow. A model that opens locally may not fit the hosted service. Neither raising the cap nor claiming core has an unlimited parse entry establishes responsive editing.
+
+SysML 2.0 distinguishes namespaces, owned/non-owned memberships, imports and qualified names rather than equating a physical file with semantic scope. That is a useful candidate vocabulary for Studio's unresolved naming design; importing the entire SysML metamodel is not required by this evidence. [OMG SysML 2.0, §7.5 and §8.2.2.5](https://www.omg.org/spec/SysML/2.0/Language/PDF)
+
+A Studio namespace choice must define whether scope is a model record or an authoring-only name environment; how it relates to current globally stored aliases; how moving a declaration affects references; what happens on local/imported name collision; and how GUI/REST display and rename the same identity. Secretly encoding qualified source names into generated global aliases would merely move the mismatch unless both representations and their mapping are specified.
+
+## 6. Materially different candidates
+
+Ratings are provisional judgments, not user-test measurements. Low implementation cost alone cannot win against the user's full authoring requirement.
+
+| Candidate | Small-model effort | Large-model context | Identity/comment/history continuity | Main failure mode | Provisional treatment |
+| --- | --- | --- | --- | --- | --- |
+| A. Current grammar with an authoring writer, source CLI and semantic navigation/refactoring | Removes generated defaults; allows ordinary editors to check, stabilize and rename safely. Existing short declarations remain. | Better tools and file navigation, but still global aliases and constructor/list burden. | Strongest reuse of current invariants and updater. | Mistaking tooling and hidden/folded UUIDs for a sufficiently clear language. | Useful baseline and immediate vertical infrastructure; insufficient alone if the measured wrapper/context burden persists. |
+| B. Domain-specific syntax over the same authoritative model, with an explicit CST-to-model mapping | Can replace constructor wrappers and duplicated membership with coherent domain statements/blocks. | Reuse syntax and selective qualified references can improve context, but namespace policy still requires a decision. | Existing UUIDs and model commands remain; updater must preserve the chosen syntax and each generated record's stable identity. | Sugar becomes a one-way macro that canonicalizes after GUI edits or recreates hidden occurrence/link IDs. | Leading bounded experiment, paired with A's real source-only tools. Must lose if lossless bidirectional mapping is too fragile. |
+| C. Redesigned declarative grammar with explicit semantic namespaces and integrated domain notation | Potentially most coherent whole-model authoring rather than accumulated keywords. | Can supply real local/imported naming and domain modules. | Highest migration cost; must map every accepted record, historical fact, source comment and ID, and preserve raw invalid drafts with their original language context. | Large new language designed before identity, library and analysis semantics are settled; coercing current ownership into namespace ownership. | Serious competitor for the full end state; require one complete alternative model and adversarial migration prototype before selection. |
+| D. Separate engineering text from explicit portable identity/layout/history management modules | The ordinary model file can become much cleaner. | Management data can be localized, but cross-file consistency and conflict review become essential. | Possible only if all modules are version-controlled, portable, typed and atomically admitted; no ambient cache or hidden database authority. | Renaming/moving text breaks sidecar identity, Git conflicts silently remap records, or text-only users must manually rebuild baselines. | Evaluate independently from surface grammar. Could complement B/C, but does not get assumed merely because the sample looks cleaner. |
+
+A and B are materially different: A changes authoring tools and generated output without new syntax; B changes where an engineer states semantic facts and therefore requires a new lossless parser/updater mapping. C changes the overall naming/declaration model. D changes the location and authority of persistent identity/history metadata. Combining selected parts must be justified by the same complete workflow, not by accumulating every feature.
+
+### Identity alternatives that must be tested explicitly
+
+| Identity mechanism | Benefit | Non-negotiable problem to solve |
+| --- | --- | --- |
+| Current inline UUID clauses | Self-contained and stable through rename/move; exact existing model/API compatibility. | Visually long; initial missing-ID buffers must be replaced by stabilized output. Folding cannot be the sole means of understanding ordinary text. |
+| Short stable authoring anchors with an explicit UUID map | References and headers can be shorter while public model UUIDs survive. | Define map authority, duplicate/absent anchors, merge conflicts, copy/fork, reidentify and baseline references. Anchor allocation cannot depend on current file position or display name. |
+| Separate identity management module keyed by a stable declared anchor | Keeps normal engineering declarations compact and portable metadata explicit. | Ordinary rename/move must keep the anchor/map coherent without invisible GUI state; partial commits and hand edits need precise diagnostics. An alias-only map is not rename-stable. |
+| IDs derived from names, file paths, AST positions or full content | Looks convenient for a fresh example. | Routine rename/move/edit changes identity and destroys required continuity. Reject as the durable identity mechanism unless an independent stable anchor is introduced, which returns to another candidate. |
+
+None of the alternatives may reinterpret historical UUID observations as live aliases. A management module also cannot store only a hash of a required old baseline if the actual old facts are needed for review or library updates. Exact data and corresponding source must travel in the portable model envelope.
+
+## 7. Preferred experiment and its falsifiers
+
+Trial B against A and one representative C/D form, retaining current UUID identity and the current model for the first prototype. Keep parser language version and semantic schema version conceptually distinct: a syntax-only form need not pretend that its mathematical or Arcadia semantics changed. The repository currently couples them through `Project.schema_version`; separating them is itself a public-format decision, not an implementation shortcut.
+
+Current bundle migration already stabilizes missing IDs first, then upgrades valid older source using targeted token changes, preserving file placement, nesting and comments (`source_project.rs:286–300`; `source_project/source_migration.rs:4–105`). Earlier readers explicitly reject later fields rather than silently absorbing new semantics. A new grammar must retain frozen source7 interpretation, including its actual default behavior, and provide an explicit migration report and reviewable diff for accepted documents. Invalid raw drafts cannot be semantically migrated as if they were valid ASTs: retain their exact bytes and original language context beside the accepted snapshot. Desktop recovery already distinguishes clean accepted buffers from dirty/unapplied ones (`oa-desktop/src/source_workspace.rs:34–48`). A successful accepted-source migration must not erase such a draft, rewrite a historical observation into a live reference, or regenerate occurrence identities from new syntax order.
+
+For example, a **proposed, currently invalid** process authoring block could be:
+
+```text
+oa_process triage "Alarm triage" id "...existing process UUID..." {
+ contributions {
+ action detect_once "Detect this alarm" id "...existing occurrence UUID..." do @detect_alarm;
+ action assess_once "Assess this alarm" id "...existing occurrence UUID..." do @assess_alarm;
+ }
+}
+sequence_link assessment_after_detection "Assess after detecting" id "...existing link UUID..." {
+ source @detect_once; target @assess_once;
+}
+```
+
+This spelling is not a promise of a finished grammar. In the candidate, each `action` explicitly owns one ordinary Action occurrence with the displayed identity and derives the process's ordered `steps` membership from block order. The existing SequenceLink remains explicit: contribution order is not an invented execution edge. The block cannot coexist with a conflicting `steps` field; it cannot absorb independently owned callee contributions, silently create a reuse clone, or allocate fresh IDs on every parse. The three UUID placeholders deliberately expose the unresolved real header cost; they must be replaced by actual accepted IDs in a measured prototype.
+
+A message/fragment/reuse form needs similarly explicit ownership, occurrence identity, viewpoint and bindings. A blanket `send A -> B` shortcut is inadequate if it conflates work exchanges, participant boundaries, operation allocations, receiver lifelines and repeated occurrences. A data-field shorthand needs exact optionality/multiplicity/type/default semantics. A state-transition shorthand must preserve trigger alternatives, local/internal/external kind, typed work effects and descriptive text. These are required next representatives, not assumed consequences of implementing `contributions`.
+
+Required implementation laws for any selected form:
+
+- Parsing and lowering produce the same complete Project as the explicit current form, including all IDs, list order, views, artifacts and historical facts.
+- Missing identities normalize once into the accepted portable source. Repeated admission is inert. All generated persistent records have explicit stable source identity; position-based IDs or unrecorded macro expansions fail.
+- GUI/REST edits update the original selected notation, preserving unaffected token bytes and comments. A parser that can import the new form but an updater that rewrites it into canonical source7 fails bidirectionality.
+- Source locations identify the actual authoring token responsible for each lowered property/reference. There are no synthetic error spans into an invisible expansion.
+- A reference edit can preserve comments and historical facts even when two model records share a source construct. Constructor changes, reorder, nested move, UUID swap, delete/reuse and removal of an optional field have specified trivia ownership.
+- A full accepted source bundle and model share one atomic admission/history/revision boundary. Invalid drafts remain drafts. Applying a semantic command cannot silently resolve an unrelated source draft.
+
+The main falsifiers are concrete: two repeated uses of one work item receive the same occurrence identity; moving a nested declaration changes its performer; reordering a contribution block invents SequenceLinks; GUI Rename destroys the authored short syntax or comments; changing a file alias remaps historical facts; or a source-only update requires opening a GUI form. Any one invalidates that candidate until its representation changes.
+
+## 8. Minimum vertical slice and full end-state obligations
+
+The first coherent production slice should make **one complete OA/SA model developable and maintainable through ordinary text tools**, while establishing reusable lossless language infrastructure. It should not consist only of a new keyword.
+
+1. Publish an exact source-only check/stabilize/refactor path. A local CLI over existing core/source-files APIs is the strongest initial candidate: read an explicit root file, diagnose raw bytes, write accepted stabilization only on request, preserve external-change detection, and expose explicit semantic alias rename/reparent with a reviewable file diff. Reuse the same protocol in an editor/LSP adapter later; do not make a network service mandatory for local modeling.
+2. Reconcile the proven current version/default documentation inconsistencies with executable fixtures. Respect the other host's ownership of EBNF/MixedLegacy corrections. Specify constructor omissions by version and keep existing accepted source meaningful.
+3. Implement one lossless domain-syntax representative only after the comparison: operational process/SA chain contributions plus their ordering and existing explicit relationships, with the complete alarm model retained. Extend the syntax-to-model location/update mechanism so a later scenario/data/analysis form does not require another ad hoc text-rewrite subsystem.
+4. Drive initial creation, display-name and alias rename, reparent, duplicate-name reference selection, file split/move, raw invalid edit and repair, counterpart review and an ordinary graphical edit through that same model. Preserve full models and exact unrelated source bytes; use API ETags and desktop accepted history where appropriate. A text-only engineer must not need to manufacture private Rust enums or edit GUI-only metadata.
+5. Compare the real initial **and stabilized** A/B/C/D texts, including all identity/history management modules. Measure completion and error recovery on the small model and on a generated large model with repeated local names, nested reuse, multiple files and 5,000 graph objects under the service cap. Also characterize the desktop's larger declared policy separately; do not extrapolate service measurements to 100,000 objects.
+
+For that comparison record source bytes, required fact entry, edited lines for a one-record change, wrong-reference/ownership/order errors, completion time, diagnostic locality and measured parse/lint/apply latency. Include an engineer and an independent AI client working only from the published contract. Count total portable source, not just the pretty primary file. Establish hardware and practical latency thresholds before judging outcomes; no performance number is supplied by this report.
+
+The broader release still requires a coherent notation for every current family in section 3 plus the selected calculation/quantity/library semantics, a deliberate naming/namespace decision for large models, practical source navigation/refactoring and accurate reST/API contracts. It must carry exact library pins and update bases, support real calculation results and formal constraints, and preserve graphic/text/API equivalence. Intermediate compatibility forms can be retained when explicit, but an unbounded collection of implementation-shaped escape hatches cannot stand in for the requested usable text-only language.
+
+Root should record the candidate comparison, selected identity/default/namespace policies and migration obligations before major parser work. The current evidence justifies a complete source-only workflow and a focused bidirectional syntax experiment; it does not yet justify a wholesale rewrite, a hidden sidecar, or a claim that current source7 already meets the new usability end state.
diff --git a/harness/scenario-authoring-contract.rs b/harness/scenario-authoring-contract.rs
new file mode 100644
index 00000000..e8383ac5
--- /dev/null
+++ b/harness/scenario-authoring-contract.rs
@@ -0,0 +1,672 @@
+//! Independent B2/B3 native fixture; no desktop implementation is linked.
+//! generate DIR | check CHECKPOINT ENTRY | same VERIFIED_ENTRY RESTORED_ENTRY | self-check
+use oa_core::{source_project::*, *};
+use std::{
+ collections::{BTreeMap, BTreeSet},
+ fs,
+ path::Path,
+};
+
+fn id(n: u128) -> Id {
+ Id::from_u128(0x5ceaa100000040008000000000000000 + n)
+}
+#[derive(Clone, Copy)]
+struct Side {
+ layer: Layer,
+ word: &'static str,
+ base: u128,
+}
+const SIDES: [Side; 2] = [
+ Side {
+ layer: Layer::Oa,
+ word: "OA",
+ base: 100,
+ },
+ Side {
+ layer: Layer::Sa,
+ word: "SA",
+ base: 200,
+ },
+];
+impl Side {
+ fn id(self, n: u128) -> Id {
+ id(self.base + n)
+ }
+ fn name(self, text: &str) -> String {
+ format!("{} {text}", self.word)
+ }
+}
+fn seed(p: &mut Project, side: Side, n: u128, kind: Kind, text: &str, parent: Option) {
+ let mut element = p
+ .make_element(kind, side.layer, &side.name(text), parent)
+ .unwrap();
+ element.id = side.id(n);
+ element.alias = format!("scenario_{}_{}", side.word.to_lowercase(), n);
+ p.elements.insert(element.id, element);
+}
+fn seed_occurrence(
+ p: &mut Project,
+ side: Side,
+ n: u128,
+ text: &str,
+ parent: u128,
+ body: OccurrenceBody,
+) {
+ seed(p, side, n, Kind::Occurrence, text, Some(side.id(parent)));
+ *p.elements
+ .get_mut(&side.id(n))
+ .unwrap()
+ .shared_mut()
+ .unwrap() = SharedBody::Occurrence {
+ body,
+ precondition: String::new(),
+ postcondition: String::new(),
+ };
+}
+fn action(side: Side, work: u128, line: u128) -> OccurrenceBody {
+ OccurrenceBody::Action {
+ action: Some(side.id(work)),
+ lifeline: Some(side.id(line)),
+ }
+}
+fn reuse(side: Side, target: u128, remote: [u128; 2], local: [u128; 2]) -> OccurrenceBody {
+ OccurrenceBody::ScenarioUse {
+ scenario: Some(side.id(target)),
+ bindings: remote
+ .into_iter()
+ .zip(local)
+ .map(|(referenced, local)| LifelineBinding {
+ referenced: side.id(referenced),
+ local: side.id(local),
+ })
+ .collect(),
+ }
+}
+fn fixture() -> Project {
+ let mut p = Project::empty();
+ p.id = id(1);
+ p.alias = "scenario_authoring".into();
+ p.name = "Scenario authoring contract".into();
+ p.description = "Native clicked-slot and caller-return contract.".into();
+ for side in SIDES {
+ let work = if side.layer == Layer::Oa {
+ Kind::Activity
+ } else {
+ Kind::Function
+ };
+ seed(&mut p, side, 10, work, "Inspect ticket", None);
+ seed(&mut p, side, 11, work, "Record result", None);
+ seed(&mut p, side, 20, Kind::StateMachine, "Ticket modes", None);
+ seed(
+ &mut p,
+ side,
+ 21,
+ Kind::Region,
+ "Ticket region",
+ Some(side.id(20)),
+ );
+ seed(&mut p, side, 22, Kind::State, "Ready", Some(side.id(21)));
+ for (n, text) in [(30, "A caller"), (31, "B verification"), (32, "C detail")] {
+ seed(&mut p, side, n, Kind::Scenario, text, None);
+ }
+ for (n, owner, represented, text) in [
+ (40, 30, 10, "A inspector"),
+ (41, 30, 11, "A recorder"),
+ (42, 31, 10, "B inspector"),
+ (43, 31, 11, "B recorder"),
+ (44, 32, 10, "C inspector"),
+ (45, 32, 11, "C recorder"),
+ ] {
+ seed(&mut p, side, n, Kind::Lifeline, text, Some(side.id(owner)));
+ *p.elements
+ .get_mut(&side.id(n))
+ .unwrap()
+ .shared_mut()
+ .unwrap() = SharedBody::Lifeline {
+ represented: Some(side.id(represented)),
+ };
+ }
+ seed_occurrence(&mut p, side, 50, "Root entry", 30, action(side, 10, 40));
+ seed_occurrence(
+ &mut p,
+ side,
+ 51,
+ "Outer ALT",
+ 30,
+ OccurrenceBody::Fragment {
+ operator: FragmentOperator::Alternative,
+ branches: vec![side.id(52), side.id(53)],
+ },
+ );
+ seed_occurrence(
+ &mut p,
+ side,
+ 52,
+ "Outer chosen operand",
+ 51,
+ OccurrenceBody::Branch {
+ guard: "ticket.present".into(),
+ occurrences: vec![side.id(54)],
+ },
+ );
+ seed_occurrence(
+ &mut p,
+ side,
+ 53,
+ "Outer fallback operand",
+ 51,
+ OccurrenceBody::Branch {
+ guard: "else".into(),
+ occurrences: vec![side.id(59)],
+ },
+ );
+ seed_occurrence(
+ &mut p,
+ side,
+ 54,
+ "Inner ALT",
+ 52,
+ OccurrenceBody::Fragment {
+ operator: FragmentOperator::Alternative,
+ branches: vec![side.id(55), side.id(56)],
+ },
+ );
+ seed_occurrence(
+ &mut p,
+ side,
+ 55,
+ "Inner chosen operand",
+ 54,
+ OccurrenceBody::Branch {
+ guard: "ticket.ready".into(),
+ occurrences: vec![side.id(57)],
+ },
+ );
+ seed_occurrence(
+ &mut p,
+ side,
+ 56,
+ "Inner other operand",
+ 54,
+ OccurrenceBody::Branch {
+ guard: "else".into(),
+ occurrences: vec![side.id(58)],
+ },
+ );
+ for (n, text, parent, line) in [
+ (57, "Inner anchor", 55, 40),
+ (58, "Inner other anchor", 56, 40),
+ (59, "Fallback anchor", 53, 41),
+ (62, "Root exit", 30, 41),
+ (63, "B entry", 31, 42),
+ (65, "B exit", 31, 43),
+ (66, "C entry", 32, 44),
+ ] {
+ seed_occurrence(
+ &mut p,
+ side,
+ n,
+ text,
+ parent,
+ action(side, if line % 2 == 0 { 10 } else { 11 }, line),
+ );
+ }
+ seed_occurrence(
+ &mut p,
+ side,
+ 60,
+ "First use of B",
+ 30,
+ reuse(side, 31, [42, 43], [40, 41]),
+ );
+ seed_occurrence(
+ &mut p,
+ side,
+ 61,
+ "Second use of B",
+ 30,
+ reuse(side, 31, [42, 43], [40, 41]),
+ );
+ seed_occurrence(
+ &mut p,
+ side,
+ 64,
+ "B use of C",
+ 31,
+ reuse(side, 32, [44, 45], [42, 43]),
+ );
+ for (owner, steps) in [
+ (30, vec![50, 51, 60, 61, 62]),
+ (31, vec![63, 64, 65]),
+ (32, vec![66]),
+ ] {
+ *p.elements
+ .get_mut(&side.id(owner))
+ .unwrap()
+ .steps_mut()
+ .unwrap() = steps.into_iter().map(|n| side.id(n)).collect();
+ }
+ }
+ execute_batch(&p, &[]).expect("deterministic fixture must satisfy core admission")
+}
+fn bundle(p: &Project) -> CompiledSourceProject {
+ let entry = language::format(p).replacen("{\n", "{\n include \"rationale.arcadia\";\n", 1);
+ let raw = SourceBundle {
+ entry: "project.arcadia".into(),
+ files: BTreeMap::from([
+ ("project.arcadia".into(), entry),
+ ("rationale.arcadia".into(), "// Retain caller/operand evidence: ticket 雨.\r\n// Navigation never edits this note.\r\n".into()),
+ ]),
+ };
+ let compiled = compile_bundle(&raw, ProjectLimits::default()).unwrap();
+ assert_eq!(compiled.decoded.project, *p);
+ assert_eq!(compiled.bundle, raw);
+ compiled
+}
+fn load(entry: &Path) -> CompiledSourceProject {
+ let files = source_files::load_project(entry, ProjectLimits::default()).unwrap();
+ let raw = files.reachable_bundle();
+ let compiled = compile_bundle(&raw, ProjectLimits::default()).unwrap();
+ assert_eq!(
+ compiled.bundle, raw,
+ "No migration or source normalization permitted"
+ );
+ execute_batch(&compiled.decoded.project, &[]).unwrap();
+ compiled
+}
+fn advance(base: &mut CompiledSourceProject, commands: Vec) {
+ let expected = execute_batch(&base.decoded.project, &[Command::Batch(commands)]).unwrap();
+ *base = update_bundle(base, &expected, ProjectLimits::default()).unwrap();
+}
+struct Roles<'a> {
+ actual: &'a Project,
+ baseline: Project,
+ used: BTreeSet,
+}
+impl Roles<'_> {
+ fn occurrence(&mut self, side: Side, text: &str) -> Id {
+ let name = side.name(text);
+ let found: Vec<_> = self
+ .actual
+ .elements
+ .values()
+ .filter(|e| e.kind() == Kind::Occurrence && e.layer() == side.layer && e.name == name)
+ .map(|e| e.id)
+ .collect();
+ assert_eq!(
+ found.len(),
+ 1,
+ "Exactly one fresh occurrence for role {name}"
+ );
+ let id = found[0];
+ assert_eq!(
+ id.get_version_num(),
+ 4,
+ "Native occurrence needs UUIDv4: {name}"
+ );
+ assert!(!self.baseline.contains(id), "Role reused a seed: {name}");
+ assert!(
+ self.used.insert(id),
+ "Role identities must be distinct: {name}"
+ );
+ id
+ }
+}
+fn authored(
+ p: &Project,
+ side: Side,
+ id: Id,
+ text: &str,
+ parent: Id,
+ body: OccurrenceBody,
+) -> Element {
+ let name = side.name(text);
+ Element {
+ id,
+ alias: p.fresh_alias(&name, "element", id),
+ name,
+ description: String::new(),
+ parent: Some(parent),
+ body: ElementBody::shared_in(
+ side.layer,
+ SharedBody::Occurrence {
+ body,
+ precondition: String::new(),
+ postcondition: String::new(),
+ },
+ ),
+ }
+}
+fn insert_before(base: &mut CompiledSourceProject, parent: Id, anchor: Id, elements: Vec) {
+ let mut steps = base.decoded.project.elements[&parent]
+ .steps()
+ .unwrap()
+ .clone();
+ let position = steps
+ .iter()
+ .position(|id| *id == anchor)
+ .expect("declared insertion anchor");
+ let inserted: Vec<_> = elements
+ .iter()
+ .filter(|e| e.parent == Some(parent))
+ .map(|e| e.id)
+ .collect();
+ steps.splice(position..position, inserted);
+ let mut commands: Vec<_> = elements.into_iter().map(Command::CreateElement).collect();
+ commands.push(Command::SetSteps(parent, steps));
+ advance(base, commands);
+}
+fn checkpoint(mode: &str) -> Option<(Side, usize)> {
+ if mode == "baseline" {
+ return None;
+ }
+ let (prefix, stage) = mode
+ .split_once('-')
+ .expect("checkpoint is baseline or oa/sa-stage");
+ let side = match prefix {
+ "oa" => SIDES[0],
+ "sa" => SIDES[1],
+ _ => panic!("Unknown layer"),
+ };
+ let count = match stage {
+ "action" => 1,
+ "state" => 2,
+ "reuse" => 3,
+ "fragment" => 4,
+ _ => panic!("Unknown checkpoint"),
+ };
+ Some((side, count))
+}
+fn expected(mode: &str, actual: &Project) -> CompiledSourceProject {
+ let baseline = fixture();
+ let mut base = bundle(&baseline);
+ let Some((side, count)) = checkpoint(mode) else {
+ return base;
+ };
+ let mut roles = Roles {
+ actual,
+ baseline,
+ used: BTreeSet::new(),
+ };
+ let key = roles.occurrence(side, "native action");
+ let e = authored(
+ &base.decoded.project,
+ side,
+ key,
+ "native action",
+ side.id(30),
+ action(side, 10, 40),
+ );
+ insert_before(&mut base, side.id(30), side.id(50), vec![e]);
+ if count == 1 {
+ return base;
+ }
+ let key = roles.occurrence(side, "native state");
+ let e = authored(
+ &base.decoded.project,
+ side,
+ key,
+ "native state",
+ side.id(55),
+ OccurrenceBody::State {
+ state: Some(side.id(22)),
+ lifeline: Some(side.id(40)),
+ },
+ );
+ insert_before(&mut base, side.id(55), side.id(57), vec![e]);
+ if count == 2 {
+ return base;
+ }
+ let key = roles.occurrence(side, "native reuse");
+ let e = authored(
+ &base.decoded.project,
+ side,
+ key,
+ "native reuse",
+ side.id(55),
+ reuse(side, 31, [42, 43], [40, 41]),
+ );
+ insert_before(&mut base, side.id(55), side.id(57), vec![e]);
+ if count == 3 {
+ return base;
+ }
+ let fragment = roles.occurrence(side, "native alternative");
+ let branch1 = roles.occurrence(side, "native alternative · operand 1");
+ let branch2 = roles.occurrence(side, "native alternative · operand 2");
+ let p = &base.decoded.project;
+ let elements = vec![
+ authored(
+ p,
+ side,
+ fragment,
+ "native alternative",
+ side.id(30),
+ OccurrenceBody::Fragment {
+ operator: FragmentOperator::Alternative,
+ branches: vec![],
+ },
+ ),
+ authored(
+ p,
+ side,
+ branch1,
+ "native alternative · operand 1",
+ fragment,
+ OccurrenceBody::Branch {
+ guard: "ticket.priority > 2".into(),
+ occurrences: vec![],
+ },
+ ),
+ authored(
+ p,
+ side,
+ branch2,
+ "native alternative · operand 2",
+ fragment,
+ OccurrenceBody::Branch {
+ guard: "ticket.priority <= 2".into(),
+ occurrences: vec![],
+ },
+ ),
+ ];
+ insert_before(&mut base, side.id(30), side.id(62), elements);
+ base
+}
+fn same_snapshot(verified: &CompiledSourceProject, restored: &CompiledSourceProject) -> bool {
+ verified.decoded.project == restored.decoded.project && verified.bundle == restored.bundle
+}
+fn self_check() {
+ let baseline = fixture();
+ assert_eq!(
+ baseline,
+ fixture(),
+ "seed identities and fields must be deterministic"
+ );
+ let base = bundle(&baseline);
+ assert_eq!(expected("baseline", &baseline).bundle, base.bundle);
+ for side in SIDES {
+ // Role carrier intentionally has wrong parent, alias and occurrence body.
+ // Only its fresh IDs may survive in any prediction.
+ let mut carrier = baseline.clone();
+ for text in [
+ "native action",
+ "native state",
+ "native reuse",
+ "native alternative",
+ "native alternative · operand 1",
+ "native alternative · operand 2",
+ ] {
+ let mut e = carrier
+ .make_element(Kind::Occurrence, side.layer, &side.name(text), None)
+ .unwrap();
+ e.alias = "wrong_carrier_alias".into();
+ e.description = "must never enter the prediction".into();
+ carrier.elements.insert(e.id, e);
+ }
+ for stage in ["action", "state", "reuse", "fragment"] {
+ let mode = format!("{}-{stage}", side.word.to_lowercase());
+ let correct = expected(&mode, &carrier);
+ assert_ne!(correct.decoded.project, carrier);
+ let again = expected(&mode, &correct.decoded.project);
+ assert_eq!(again.decoded.project, correct.decoded.project);
+ assert_eq!(
+ again.bundle, correct.bundle,
+ "full source checkpoint fixed point"
+ );
+ let mut wrong = correct.decoded.project.clone();
+ wrong.elements.get_mut(&side.id(10)).unwrap().description =
+ "unrequested seed edit".into();
+ assert_ne!(expected(&mode, &wrong).decoded.project, wrong);
+ let native = wrong
+ .elements
+ .values()
+ .find(|e| e.name == side.name("native action"))
+ .unwrap()
+ .id;
+ let mut wrong = correct.decoded.project.clone();
+ wrong.elements.get_mut(&native).unwrap().parent = Some(side.id(55));
+ assert_ne!(
+ expected(&mode, &wrong).decoded.project,
+ wrong,
+ "parent is predicted, not read back"
+ );
+ let mut wrong = correct.decoded.project.clone();
+ wrong
+ .elements
+ .get_mut(&side.id(30))
+ .unwrap()
+ .steps_mut()
+ .unwrap()
+ .swap(0, 1);
+ assert_ne!(
+ expected(&mode, &wrong).decoded.project,
+ wrong,
+ "clicked order is independently fixed"
+ );
+ }
+ let mode = format!("{}-fragment", side.word.to_lowercase());
+ let correct = expected(&mode, &carrier);
+ // Both semantic checks may legitimately discover fresh native IDs. An
+ // Undo/Redo check must additionally pin them to the earlier snapshot.
+ let mut other_carrier = carrier.clone();
+ let old = other_carrier
+ .elements
+ .values()
+ .find(|e| e.name == side.name("native action"))
+ .unwrap()
+ .id;
+ let mut replaced = other_carrier.elements.remove(&old).unwrap();
+ replaced.id = Id::new_v4();
+ other_carrier.elements.insert(replaced.id, replaced);
+ let recreated = expected(&mode, &other_carrier);
+ let correct_prediction = expected(&mode, &correct.decoded.project);
+ let recreated_prediction = expected(&mode, &recreated.decoded.project);
+ assert!(same_snapshot(&correct_prediction, &correct));
+ assert!(same_snapshot(&recreated_prediction, &recreated));
+ assert!(
+ !same_snapshot(&correct, &recreated),
+ "recreated native IDs pass semantic roles but must fail exact history restoration"
+ );
+ let mut wrong = correct.decoded.project.clone();
+ let e = wrong
+ .elements
+ .values_mut()
+ .find(|e| e.name == side.name("native reuse"))
+ .unwrap();
+ let Some(SharedBody::Occurrence {
+ body: OccurrenceBody::ScenarioUse { bindings, .. },
+ ..
+ }) = e.shared_mut()
+ else {
+ unreachable!()
+ };
+ bindings[0].local = side.id(41);
+ assert_ne!(
+ expected(&mode, &wrong).decoded.project,
+ wrong,
+ "bindings are never copied from actual"
+ );
+ let mut changed_source = correct.bundle.clone();
+ changed_source
+ .files
+ .get_mut("rationale.arcadia")
+ .unwrap()
+ .push_str("// unrequested note\n");
+ let changed = compile_bundle(&changed_source, ProjectLimits::default()).unwrap();
+ assert_eq!(changed.decoded.project, correct.decoded.project);
+ assert_ne!(
+ changed.bundle,
+ expected(&mode, &changed.decoded.project).bundle
+ );
+ }
+ println!(
+ "PASS self-check: deterministic OA/SA baseline, eight semantic checkpoints, independent fields/source bytes and exact history identity discrimination"
+ );
+}
+fn main() {
+ assert_eq!(SCHEMA_VERSION, 7);
+ let args: Vec<_> = std::env::args().collect();
+ if args.get(1).is_some_and(|s| s == "self-check") {
+ assert_eq!(args.len(), 2);
+ self_check();
+ return;
+ }
+ if args.get(1).is_some_and(|s| s == "generate") {
+ assert_eq!(args.len(), 3);
+ let dir = Path::new(&args[2]);
+ assert!(
+ !dir.exists(),
+ "Generate only into a fresh directory; preserve existing evidence"
+ );
+ let p = fixture();
+ let base = bundle(&p);
+ fs::create_dir_all(dir).unwrap();
+ for (name, bytes) in base.bundle.files {
+ fs::write(dir.join(name), bytes).unwrap();
+ }
+ fs::write(
+ dir.join("expected-baseline.json"),
+ serde_json::to_vec_pretty(&p).unwrap(),
+ )
+ .unwrap();
+ println!(
+ "PASS generated deterministic OA/SA fixture: {} elements, 2 sources; native roles absent",
+ p.elements.len()
+ );
+ return;
+ }
+ if args.get(1).is_some_and(|s| s == "same") {
+ assert_eq!(args.len(), 4, "same VERIFIED_SAVED_ENTRY RESTORED_ENTRY");
+ let verified = load(Path::new(&args[2]));
+ let restored = load(Path::new(&args[3]));
+ assert!(
+ same_snapshot(&verified, &restored),
+ "Restored snapshot must preserve every Project identity/field and every SourceBundle byte"
+ );
+ println!(
+ "PASS same: exact saved/restored Project and SourceBundle, including all native identities"
+ );
+ return;
+ }
+ assert_eq!(
+ args.len(),
+ 4,
+ "check baseline|oa-action|oa-state|oa-reuse|oa-fragment|sa-action|sa-state|sa-reuse|sa-fragment ENTRY"
+ );
+ assert_eq!(args[1], "check");
+ let actual = load(Path::new(&args[3]));
+ let prediction = expected(&args[2], &actual.decoded.project);
+ assert_eq!(
+ actual.decoded.project, prediction.decoded.project,
+ "Complete Project differs from independent checkpoint"
+ );
+ assert_eq!(
+ actual.bundle, prediction.bundle,
+ "Complete source bundle differs, including retained note bytes"
+ );
+ println!(
+ "PASS {}: whole model and {} exact reachable sources; only unique fresh role IDs borrowed",
+ args[2],
+ actual.bundle.files.len()
+ );
+}