Validate scenario oracle and record first local behavior test results

This commit is contained in:
Codex
2026-09-10 12:10:59 -07:00
parent 632c8feb36
commit ef1a4478c5
8 changed files with 2068 additions and 18 deletions
+23 -7
View File
@@ -1,10 +1,10 @@
# Scenario authoring native contract
Prepared by Codex-956atf /root/release_audit on 2026-09-10. **Source candidate only: compilation, self-check, generation and native execution have not run.** This fixture/oracle is preparation for B2 clicked-slot authoring and B3 caller return, not acceptance evidence.
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.
Only this new Rust source and this README belong to the preparation slice. Generate fixture files after root grants the direct-rustc lease and the checker self-check passes.
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
@@ -14,16 +14,16 @@ Use the current matching `oa_core` and `serde_json` rlibs from root's accepted C
. .local/toolchain/env.ps1
$scenarioCore = 'ABSOLUTE_PATH_TO_CURRENT_liboa_core-HASH.rlib'
$scenarioJson = 'ABSOLUTE_PATH_TO_MATCHING_libserde_json-HASH.rlib'
$scenarioDeps = Split-Path -LiteralPath $scenarioCore -Parent
$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 harness/fixtures/scenario-authoring/base
.local/native-qa/scenario-authoring-contract.exe check baseline harness/fixtures/scenario-authoring/base/project.arcadia
.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 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.
@@ -93,4 +93,20 @@ The checker uses only unique **Kind::Occurrence + layer + predetermined literal
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. Current compile, self-check, generation, native action/return/scroll/recovery, screenshot and release evidence remain pending until recorded by root.
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.
File diff suppressed because it is too large Load Diff
@@ -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 "";
}
}
@@ -0,0 +1,2 @@
// Retain caller/operand evidence: ticket 雨.
// Navigation never edits this note.