Publish admitted service Details fixture and core edit evidence

This commit is contained in:
2026-09-13 04:48:08 -07:00
parent e859d65de5
commit 698126e1a0
41 changed files with 11628 additions and 0 deletions
@@ -0,0 +1 @@
* -text -whitespace
@@ -0,0 +1,46 @@
# Service Details fixture: completed core admission and edit probe
Core source: [0409a481c7571e887f8912f0a8cdb93cfdcc01a7](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/commit/0409a481c7571e887f8912f0a8cdb93cfdcc01a7). This archive publishes the self-contained [service-details.arcadia fixture](original/service-details.arcadia), its [baseline and edit expectations](original/baseline-and-edits.json), and the completed core-only evidence. The fixture models a console calling a valve service: two operation allocations, two correlated Call/Reply pairs, typed input/return values and one saved Scenario arrangement.
| Closed stage | Result | Evidence |
| --- | --- | --- |
| Isolated core probe build 02 | Exit 0; empty compiler log; 952 bound inputs unchanged | [receipt](original/core-build-02/build-receipt.json), [log](original/core-build-02/compile.log), [toolchain](original/core-build-02/toolchain.json) |
| Core probe run 01 | Exit 0; exact report passed; 13 bound inputs unchanged | [run receipt](original/core-run-01/run-receipt.json), [stdout](original/core-run-01/stdout.log), [stderr](original/core-run-01/stderr.log), [result](original/core-run-01/probe-output/result.json) |
The successful probe used the actual `source_files::load_project` → `compile_bundle` → `Session::try_new` admission path. The original and compiled SourceBundle were equal: no implicit migration, generated identity insertion or source rewrite was admitted. The original source/expectation bytes also remained unchanged after execution. Baseline assertions checked all four complete Exchange bodies, operation allocations, interface/port resolution and Scenario step order.
## Accepted changes and rejection
The [executed probe](original/core-probe.rs) translated the listed edits into real single-record `Command::EditElement` operations. Separately constructed expected Projects changed only the intended fields. Every complete actual Project equalled its expected Project; all unrelated model data, including the control Call/Reply pair and saved arrangement, stayed unchanged.
| Task | Complete allowed delta |
| --- | --- |
| 1 | First Call's expression: `"primary"` → `"secondary"` |
| 3a | Remove the first Reply's existing read-result value |
| 3b | First Call's allocation: ReadStatus → SetLimit; its value field becomes Pressure and its expression becomes `18.75` |
| 3c | Add Accepted = `true` to that exact first Reply |
| 3d | First Call's Pressure expression: `18.75` → `19.25` |
After task 1, changing only the first Call's operation allocation while retaining its incompatible input and Reply values failed with `message_value_field`. The executing assertions required unchanged complete Project, revision, dirty state and Undo/Redo flags. Actual Undo still returned directly to baseline. Each accepted edit had exact one-step Undo/Redo, and the final history drain/replay required exactly **five** accepted records. Both Replies continued to derive their operation from their exact correlated Calls, including allocation, item, interface, ports and transmission; their stored operation remained absent.
All [12 original probe outputs](original/core-run-01/probe-output/) are preserved: the baseline Project, five complete actual/expected Project pairs and the result. Archive preparation independently compared each pair byte for byte and reconstructed the complete successive Projects from the baseline and edit manifest. The separate [parent model-difference readback](original/core-run-01/parent-model-diffs.json) enumerates the same deltas and no others. That readback was created after the run; it is **not** one of the 12 probe outputs or an original run-receipt artifact. An absent `before` or `after` property there denotes addition or removal.
## Initial compile diagnostic
Build 01 failed before execution with E0609: the local probe accessed `SourceDiagnostic.severity` instead of its wrapped `SourceDiagnostic.diagnostic.severity`. The [original source](original/core-build-01/core-probe-original.rs), [compiler log](original/core-build-01/compile.log), [receipt](original/core-build-01/build-receipt.json), [toolchain](original/core-build-01/toolchain.json) and [correction record](original/core-build-01/correction.json) remain intact. Archive preparation verified the only source change was `d.severity` → `d.diagnostic.severity`. No production source changed. The corrected probe was then compiled and executed successfully as recorded above.
The two duplicate-sized failed-build input manifests and its dependency-information file are intentionally omitted; their hashes and sizes remain listed as exclusions. The complete successful build input closure is retained. Original preparation notes and hashes may still say “unexecuted” or bind the original probe: those are historical preparation records. This root note describes the completed core scope without rewriting them.
## Identity and limits
Build 02 ran from 11:34:15.5331347 to 11:34:45.7793523 UTC on 2026-09-13. Run 01 ran from 11:38:26.3003189 to 11:38:31.9384161 UTC. The [direct-rustc builder](original/build-core-probe.ps1) reused the exact existing `oa_core-86a2622fbe014324` and `serde_json-da2c4f333fc47818` artifacts from the [closed 0409 desktop listing](../scenario-spacing-gates-0409a48-20260913/README.md). The [runner](original/run-core-probe.ps1) bound the build receipt, executable, runtime, fixture, expectations and probe source before and after its child process.
The excluded executable is 19,905,536 bytes, SHA-256 `7d80f9bca005a9aee7f985235fa520f3e25fe0192d44d00696c2da8b8cb6c439`. The excluded runtime DLL is 190,464 bytes, SHA-256 `aa282fa47bb2c4e210cea5e470cdbdca58568f0be0bc73e404d86ab9cd95ef6a`. Their identities are preserved, not their bytes. The fixture SHA-256 is `0e4325222a451b9d4e503974ce86bb95a9931edd0d2d65b8cd9db8d0f99d69e5`; expectations SHA-256 is `6670cd0a07c109dde46128bd094a12d00ea008fc65efd73ad9477efcff976063`.
The payload expressions here are stored strings associated with declared typed fields; this probe does not evaluate literal/expression types, calculations or units.
This establishes core admission, operation/field-signature semantics, atomic command rejection and model history for this fixture. It establishes **no native Details-form behavior, draft recovery, desktop source-writer synchronization, Save/reopen, graphical interaction or whole-application acceptance**. The original native checklist remains a proposed workflow. Original absolute paths are historical provenance; portable fixture/evidence links are provided here. Reproduction requires a compatible source/dependency checkout and fresh output paths, rather than assuming another machine has the original `.local` layout.
## Archive integrity
All **38 selected originals (680,337 bytes)** are copied byte for byte under `original/`. [manifest.json](manifest.json) records byte counts, SHA-256/Git blob hashes, exclusions and independent comparison checks; it excludes itself. Attributes prevent newline conversion. The four logs—both build `compile.log` files plus run `stdout.log` and empty `stderr.log`—are Git-ignored and require `git add -f`. Archive preparation performed no compilation, probe execution, staging, commit or publication and did not touch the live primary desktop gate.
@@ -0,0 +1,367 @@
{
"schema": "scenario_service_details_core_archive_v1",
"source_commit": "0409a481c7571e887f8912f0a8cdb93cfdcc01a7",
"archive_base": "e859d65de5a013b72b9f8f01cff43b7f56d0408a",
"original_file_count": 38,
"original_bytes": 680337,
"checks": {
"build_bound_input_count": 952,
"run_bound_input_count": 13,
"build_and_run_inputs_identical": true,
"full_project_pairs": [
{
"task": "1",
"actual_expected_bytes_equal": true,
"independent_manifest_reconstruction_equal": true,
"sha256": "c03cf59f83bc1ae4db64584abf1257efc775cc47b49f2b2db4ac47159dfb90a0",
"bytes": 10578
},
{
"task": "3a",
"actual_expected_bytes_equal": true,
"independent_manifest_reconstruction_equal": true,
"sha256": "ce3d58385815d0a1d01320bdd711d707cb4c530f0614545eca2b83533077b6f0",
"bytes": 10495
},
{
"task": "3b",
"actual_expected_bytes_equal": true,
"independent_manifest_reconstruction_equal": true,
"sha256": "81f16c54db0e7be1960be5de6a89a6e16a56d6c62d45e15aa7f59bc9d85c8925",
"bytes": 10487
},
{
"task": "3c",
"actual_expected_bytes_equal": true,
"independent_manifest_reconstruction_equal": true,
"sha256": "3c4521eef6cf2a6024275f8c6bf5e9a55d7f6e10cb58c9cc846be56cfa121aca",
"bytes": 10565
},
{
"task": "3d",
"actual_expected_bytes_equal": true,
"independent_manifest_reconstruction_equal": true,
"sha256": "36dfe596c1e2f39a82795237f545787996e9138d9c160217611b201da14ce66a",
"bytes": 10565
}
],
"result_exactly_matches_run_receipt_and_stdout": true,
"only_probe_source_correction": "d.severity -> d.diagnostic.severity",
"no_production_change": true,
"parent_readback_preserved_separately": true
},
"excluded": [
{
"path": "core-build-01/core-probe.d",
"bytes": 1310,
"sha256": "74d36d62fae86472081e701bf2383f39e4a0795d2000ac4162b7fddca80777e6",
"reason": "duplicate failed-build capture or dependency record; successful build closure retained"
},
{
"path": "core-build-01/inputs-after.json",
"bytes": 231766,
"sha256": "2f89bae9db3cc4a31f03304b7a926506d5e7ce2ddf27785a6a6d2925505a2fc7",
"reason": "duplicate failed-build capture or dependency record; successful build closure retained"
},
{
"path": "core-build-01/inputs-before.json",
"bytes": 231766,
"sha256": "2f89bae9db3cc4a31f03304b7a926506d5e7ce2ddf27785a6a6d2925505a2fc7",
"reason": "duplicate failed-build capture or dependency record; successful build closure retained"
},
{
"path": "core-build-02/libunwind.dll",
"bytes": 190464,
"sha256": "aa282fa47bb2c4e210cea5e470cdbdca58568f0be0bc73e404d86ab9cd95ef6a",
"reason": "executable/runtime bytes excluded"
},
{
"path": "core-build-02/service-details-core-probe.exe",
"bytes": 19905536,
"sha256": "7d80f9bca005a9aee7f985235fa520f3e25fe0192d44d00696c2da8b8cb6c439",
"reason": "executable/runtime bytes excluded"
}
],
"files": [
{
"path": "original/baseline-and-edits.json",
"original": "baseline-and-edits.json",
"bytes": 4666,
"sha256": "6670cd0a07c109dde46128bd094a12d00ea008fc65efd73ad9477efcff976063",
"git_blob": "beb8940ed58c5c8f6585a96149ffa2a38ae05c32"
},
{
"path": "original/build-core-probe.ps1",
"original": "build-core-probe.ps1",
"bytes": 10633,
"sha256": "85b0a3cb25292573076a5e395dcfe08b4b179b5f44d510225247b43e20fddde3",
"git_blob": "ebbd9e2d4a2575463cd2011531c87f8f9fd6bf57"
},
{
"path": "original/core-probe-preparation.json",
"original": "core-probe-preparation.json",
"bytes": 956,
"sha256": "7e1f81be1a7b96878ca56d3e4a0fc0cb7d9df46f7402018eb85d7505f3f8bb22",
"git_blob": "0201ddc54fff049b5d451099466433b07a7064fd"
},
{
"path": "original/core-probe.md",
"original": "core-probe.md",
"bytes": 6169,
"sha256": "2a191d4ff03e4584669ee547dea94423a2e36eeffa07fd925ca4d8f265a6b538",
"git_blob": "d6dbad701e778d97d5e3d67dd223a3a14936725d"
},
{
"path": "original/core-probe.rs",
"original": "core-probe.rs",
"bytes": 13615,
"sha256": "7a8a63557b24066243848d907763883396c89cc766e5a34227ed766bc2a56a1c",
"git_blob": "55caec7a68e8af6a66ed7552cd462300921a24db"
},
{
"path": "original/manifest.json",
"original": "manifest.json",
"bytes": 1101,
"sha256": "f411ff905208a711a3ab2f67a41345b8ace7be2d1a34b7ea76be22bce5c08e21",
"git_blob": "18e190d3b8dc143433a46e2284af715029a5a99a"
},
{
"path": "original/README.md",
"original": "README.md",
"bytes": 7075,
"sha256": "f7b31d73cea87a57c21654ed7c8ed5d38579285f8c8f490fe173a5dcf327dbc0",
"git_blob": "dc5ee5965f648e37dfc6f26278415b04a2bb9074"
},
{
"path": "original/run-core-probe.ps1",
"original": "run-core-probe.ps1",
"bytes": 9902,
"sha256": "935945d4d329e1cec04ae21247aae31590f2f40019969812e728d8a78fafb1ae",
"git_blob": "5acb705819d1d70170e4f1129fac95fe3ef786d8"
},
{
"path": "original/service-details.arcadia",
"original": "service-details.arcadia",
"bytes": 6132,
"sha256": "0e4325222a451b9d4e503974ce86bb95a9931edd0d2d65b8cd9db8d0f99d69e5",
"git_blob": "4321d9650a307c72a1a20577ec94ab35e1c2b6c9"
},
{
"path": "original/core-build-02/build-receipt.json",
"original": "core-build-02/build-receipt.json",
"bytes": 2661,
"sha256": "7d9b4ac133d54bb43da2db8646c75ba25419bfe3dbb3331e3eee17834f5ba8a0",
"git_blob": "bd3d84a07b7ac7a057e73a8132c5d2a5e15c1eb4"
},
{
"path": "original/core-build-02/compile.log",
"original": "core-build-02/compile.log",
"bytes": 0,
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"git_blob": "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"
},
{
"path": "original/core-build-02/core-probe.d",
"original": "core-build-02/core-probe.d",
"bytes": 1310,
"sha256": "8a09bb2102f56adab2c8871b267f835b4a1abb4e0b3c46ca5fc709d3c399e39f",
"git_blob": "bd1ee2a51ae1d1150007f3b0f7c8ca0c5b85c355"
},
{
"path": "original/core-build-02/inputs-after.json",
"original": "core-build-02/inputs-after.json",
"bytes": 231766,
"sha256": "5618c35cf166d47caf0668d34b87af5a79ab4efd9f1db073ab9a7b06fa026ca3",
"git_blob": "199955471c20cef680ad273e1e4379b593399832"
},
{
"path": "original/core-build-02/inputs-before.json",
"original": "core-build-02/inputs-before.json",
"bytes": 231766,
"sha256": "5618c35cf166d47caf0668d34b87af5a79ab4efd9f1db073ab9a7b06fa026ca3",
"git_blob": "199955471c20cef680ad273e1e4379b593399832"
},
{
"path": "original/core-build-02/toolchain.json",
"original": "core-build-02/toolchain.json",
"bytes": 784,
"sha256": "1f3f645058e5021f9c50e8301d21f7a07fa2b4a49eebafa386f83dedeba2730f",
"git_blob": "befb9e8d9213f90e8e76df26c6884acc643f2f42"
},
{
"path": "original/core-run-01/inputs-after.json",
"original": "core-run-01/inputs-after.json",
"bytes": 3379,
"sha256": "d7e3bc1dc1ce30923451e475d6490ed8630fba6623ba30f52b35acbb0fda5325",
"git_blob": "c1e15d1cc40e57373cc02bb1fc937f41e8de9bbd"
},
{
"path": "original/core-run-01/inputs-before.json",
"original": "core-run-01/inputs-before.json",
"bytes": 3379,
"sha256": "d7e3bc1dc1ce30923451e475d6490ed8630fba6623ba30f52b35acbb0fda5325",
"git_blob": "c1e15d1cc40e57373cc02bb1fc937f41e8de9bbd"
},
{
"path": "original/core-run-01/parent-model-diffs.json",
"original": "core-run-01/parent-model-diffs.json",
"bytes": 1916,
"sha256": "94ddc15465c86c04ce7667150c013844d17c8bc2217d9056936d9c1078b973e0",
"git_blob": "08a34ed73cceebc33e4c1447fb2400d68ab96efd",
"provenance": "Parent readback after execution; not one of the 12 probe outputs or original run-receipt artifacts"
},
{
"path": "original/core-run-01/probe-output/after-1.actual.project.json",
"original": "core-run-01/probe-output/after-1.actual.project.json",
"bytes": 10578,
"sha256": "c03cf59f83bc1ae4db64584abf1257efc775cc47b49f2b2db4ac47159dfb90a0",
"git_blob": "82224a02eef26ca9b92010d8063031f25191c88c"
},
{
"path": "original/core-run-01/probe-output/after-1.expected.project.json",
"original": "core-run-01/probe-output/after-1.expected.project.json",
"bytes": 10578,
"sha256": "c03cf59f83bc1ae4db64584abf1257efc775cc47b49f2b2db4ac47159dfb90a0",
"git_blob": "82224a02eef26ca9b92010d8063031f25191c88c"
},
{
"path": "original/core-run-01/probe-output/after-3a.actual.project.json",
"original": "core-run-01/probe-output/after-3a.actual.project.json",
"bytes": 10495,
"sha256": "ce3d58385815d0a1d01320bdd711d707cb4c530f0614545eca2b83533077b6f0",
"git_blob": "dd4a369399b0f227391ac42007cb5497fbc6cadf"
},
{
"path": "original/core-run-01/probe-output/after-3a.expected.project.json",
"original": "core-run-01/probe-output/after-3a.expected.project.json",
"bytes": 10495,
"sha256": "ce3d58385815d0a1d01320bdd711d707cb4c530f0614545eca2b83533077b6f0",
"git_blob": "dd4a369399b0f227391ac42007cb5497fbc6cadf"
},
{
"path": "original/core-run-01/probe-output/after-3b.actual.project.json",
"original": "core-run-01/probe-output/after-3b.actual.project.json",
"bytes": 10487,
"sha256": "81f16c54db0e7be1960be5de6a89a6e16a56d6c62d45e15aa7f59bc9d85c8925",
"git_blob": "4c56266639b04d34e6a160f3e34d4e523ba52ea5"
},
{
"path": "original/core-run-01/probe-output/after-3b.expected.project.json",
"original": "core-run-01/probe-output/after-3b.expected.project.json",
"bytes": 10487,
"sha256": "81f16c54db0e7be1960be5de6a89a6e16a56d6c62d45e15aa7f59bc9d85c8925",
"git_blob": "4c56266639b04d34e6a160f3e34d4e523ba52ea5"
},
{
"path": "original/core-run-01/probe-output/after-3c.actual.project.json",
"original": "core-run-01/probe-output/after-3c.actual.project.json",
"bytes": 10565,
"sha256": "3c4521eef6cf2a6024275f8c6bf5e9a55d7f6e10cb58c9cc846be56cfa121aca",
"git_blob": "431ef9bc350f0befc8ed19ed2e4f56785d3a134e"
},
{
"path": "original/core-run-01/probe-output/after-3c.expected.project.json",
"original": "core-run-01/probe-output/after-3c.expected.project.json",
"bytes": 10565,
"sha256": "3c4521eef6cf2a6024275f8c6bf5e9a55d7f6e10cb58c9cc846be56cfa121aca",
"git_blob": "431ef9bc350f0befc8ed19ed2e4f56785d3a134e"
},
{
"path": "original/core-run-01/probe-output/after-3d.actual.project.json",
"original": "core-run-01/probe-output/after-3d.actual.project.json",
"bytes": 10565,
"sha256": "36dfe596c1e2f39a82795237f545787996e9138d9c160217611b201da14ce66a",
"git_blob": "08fc91b9a439512f426a9fb9ea7c9ffe2c2f48bc"
},
{
"path": "original/core-run-01/probe-output/after-3d.expected.project.json",
"original": "core-run-01/probe-output/after-3d.expected.project.json",
"bytes": 10565,
"sha256": "36dfe596c1e2f39a82795237f545787996e9138d9c160217611b201da14ce66a",
"git_blob": "08fc91b9a439512f426a9fb9ea7c9ffe2c2f48bc"
},
{
"path": "original/core-run-01/probe-output/baseline.project.json",
"original": "core-run-01/probe-output/baseline.project.json",
"bytes": 10576,
"sha256": "e59d4f08fda2bae23ca2b84bda0c8679703b1b75a0b7c1916b2f49d2762a90c6",
"git_blob": "f4bdedac2507bc7ba945cba400257be9351e58ae"
},
{
"path": "original/core-run-01/probe-output/result.json",
"original": "core-run-01/probe-output/result.json",
"bytes": 1274,
"sha256": "4e4d209fd14fd5027e72336c4e1aef97632a9211a84dceff05d9b780d6df82d5",
"git_blob": "e7f51c8c826d0e9583f4b78e1844588ae18d9d2e"
},
{
"path": "original/core-run-01/run-receipt.json",
"original": "core-run-01/run-receipt.json",
"bytes": 6763,
"sha256": "9bceeddc309095d29ec8bb2942bc3e8a85d008917199a2502e4b64e22b830571",
"git_blob": "a8e4f78aafedc56cd068b46d10e4c77110a5ff44"
},
{
"path": "original/core-run-01/stderr.log",
"original": "core-run-01/stderr.log",
"bytes": 0,
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"git_blob": "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"
},
{
"path": "original/core-run-01/stdout.log",
"original": "core-run-01/stdout.log",
"bytes": 1040,
"sha256": "15b0c6e16d704b0e375b301952974b84ae5655ae782bad4c974abe0b68df8e01",
"git_blob": "78112758a1dfbff4d7c4281861f16a3160936b30"
},
{
"path": "original/core-build-01/compile.log",
"original": "core-build-01/compile.log",
"bytes": 803,
"sha256": "a3dd52bfa03b6275d932cf5cb1f8181f6d4cd3e4250d96f6a465573d0cd48358",
"git_blob": "c7b5eaddf66fac49f01ba97daa17401d7dc40114"
},
{
"path": "original/core-build-01/core-probe-original.rs",
"original": "core-build-01/core-probe-original.rs",
"bytes": 13604,
"sha256": "cc9bc0679e5936605bfa17f9654e5ee3b302f0ea26fab0a151f7e17fe882a53b",
"git_blob": "47001a292cd81bc812965225e9904eb02e162170"
},
{
"path": "original/core-build-01/correction.json",
"original": "core-build-01/correction.json",
"bytes": 515,
"sha256": "5ebe59f99e818053153e26b65b1d9e075bd836ef06a24e9200204a0424cfccff",
"git_blob": "d7dfa2e140c725c352e4af4a7abef84f20a41e5f"
},
{
"path": "original/core-build-01/build-receipt.json",
"original": "core-build-01/build-receipt.json",
"bytes": 2388,
"sha256": "355521a6ac9d2be51c9862da5e5764a237b8353defcf84cc52b55a36362f476b",
"git_blob": "aab3f161adf0e2607d880f35450c0d436a32ec48"
},
{
"path": "original/core-build-01/toolchain.json",
"original": "core-build-01/toolchain.json",
"bytes": 784,
"sha256": "14e6384805dbf1d686e42ecd528f504a7e8fc701ef03116a6d5153d066f6a2c4",
"git_blob": "49af4fd134216e201350b266a575e3edb0698672"
},
{
"path": "README.md",
"bytes": 7346,
"sha256": "ac8f60753dc0e2da97706a001ae20ee1d08ce749c757b27da8e7f631d27f77f8",
"git_blob": "bba26ce7422182452fb8f0f1375cb03fadcd4c1a"
},
{
"path": ".gitattributes",
"bytes": 20,
"sha256": "e97602ab9cac70102245345c5ab0fc9830df8b17f1072b188265a662a3a547ae",
"git_blob": "bd2de00cda30e433943ceb23971ade38d5a3fc86"
}
],
"manifest_excludes_itself": true
}
@@ -0,0 +1,28 @@
# Existing-call Details trial preparation
Status: valid-intended source fixture, not parsed, admitted, rendered or executed. Parent must admit service-details.arcadia with the compiled current core before any GUI trial. Target source pin: 0409a481c7571e887f8912f0a8cdb93cfdcc01a7. This task ran no Cargo/rustc, native input or Gitea write.
The fixture supplies an SA BoundaryInterface scenario, concrete Standard Requires/Provides ports, one channel carrying two distinct synchronous operation items, two exact InterfaceItemAllocation identities, named String/Real/Boolean parameter types, and two separately correlated Call/Reply pairs. A saved Scenario view keeps all four messages identifiable. Parameters are optional (0..1), so an explicitly removed annotation does not invent a mandatory value. Expressions are exact descriptive text, not evaluated/type-checked runtime literals; incompatibility here means a field identity is outside the selected operation signature.
The existing [boundary-only probe](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/src/commit/0409a481c7571e887f8912f0a8cdb93cfdcc01a7/harness/fixtures/interface-operation-probe/output/boundary-only.json#L1) was inspected. It is schema6 with parameterless calls, no stored operation selections and no Replies. It is useful endpoint/allocation precedent, but cannot by itself evaluate current existing-call operation/payload editing. This new source7 fixture avoids relying on migration or inferring operations from names.
## Native tasks and independent oracle
Use an existing occurrence's Details/property form, not the New Message form. If a required existing-record control is absent, inaccessible or unusable, record that observation; do not substitute a creation flow or source edit and claim the original task succeeded. baseline-and-edits.json records exact IDs and allowed semantic changes.
1. **Edit one existing payload.** Select first_call (Read primary status), confirm ReadStatus allocation and the Scope String parameter, then change its expression from the literal text \"primary\" to \"secondary\" and Apply. Only first_call.values[0].expression changes. Re-select first_reply: reply_to remains first_call, operation remains absent, its derived operation remains ReadStatus, and its Status expression remains \"READY\". The separate SetLimit control pair and all types, relations, order and saved geometry remain exact. One Undo/Redo must restore/reapply the complete accepted Project and source bundle.
2. **Reject incompatible operation change without value loss.** In first_call's existing Details, select SetLimit allocation while retaining the Scope annotation. Before Apply, the raw expression must remain available for repair; selection is not authorization to prune it. Apply must refuse the whole candidate: both first_call's Scope field and first_reply's Status field belong to ReadStatus, not SetLimit. Accepted Project/source/history remain at task1; do not assert a particular error ordering. Cancel restores the accepted ReadStatus inspection. Core validation is expected to report message_value_field for these incompatible direct field references; operation eligibility itself need not filter the allocation out.
3. **Explicitly repair, then change the operation.** First remove first_reply's Status value row explicitly and Apply (only that values vector becomes []). Next edit first_call: select SetLimit, explicitly replace/remove the old Scope address and choose Pressure limit, enter expression 18.75, then Apply. This changes only first_call.operation.allocation and its single (path=[], field, expression) record. It must not rename messages, retarget reply_to or choose the other Call. first_reply now derives SetLimit from first_call, still stores no operation, and still has no values. Add its Accepted Return field with expression true and Apply; only first_reply.values changes. Finally change first_call's pressure expression to 19.25 and Apply; re-inspect that exact first_reply and the untouched control pair. These are deliberately separate accepted edits because the property editor edits one occurrence at a time; no silent multi-record migration is expected.
For each successful Apply, compare the full parsed Project with only the explicitly listed change(s), and preserve all UUIDs, names, parameters/types, channel items, scenario.steps, other messages and Diagram layout. A rejected Apply must preserve the accepted snapshot; raw-draft recovery is a separate UI assertion. Save/reopen and Undo/Redo checks concern the accepted source bundle, without requiring the formatter to preserve the handwritten fixture's initial whitespace.
## Existing contract and implementation seams
- [Operation identity, exact ports, Reply derivation and refusal of incompatible retained values](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/src/commit/0409a481c7571e887f8912f0a8cdb93cfdcc01a7/docs/language.rst#L719), especially lines743–758. [Typed value path/direction and non-evaluated expression contract](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/src/commit/0409a481c7571e887f8912f0a8cdb93cfdcc01a7/docs/language.rst#L705).
- [Core operation resolver](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/src/commit/0409a481c7571e887f8912f0a8cdb93cfdcc01a7/crates/oa-core/src/operations.rs#L34): Reply follows its exact Call; lines139–218 prove selected allocation, channel, lifelines and Standard ports. [Eligible allocations](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/src/commit/0409a481c7571e887f8912f0a8cdb93cfdcc01a7/crates/oa-core/src/operations.rs#L300) checks operation context, separately from retained value validation.
- [Selected signature validation](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/src/commit/0409a481c7571e887f8912f0a8cdb93cfdcc01a7/crates/oa-core/src/validation.rs#L1818) uses the selected item, not the channel's union; [invalid field and empty-expression handling](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/src/commit/0409a481c7571e887f8912f0a8cdb93cfdcc01a7/crates/oa-core/src/validation.rs#L1992) distinguishes errors from warnings.
- [Existing-record operation picker](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/src/commit/0409a481c7571e887f8912f0a8cdb93cfdcc01a7/crates/oa-desktop/src/forms/data_fields.rs#L124), [retained address needing review](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/src/commit/0409a481c7571e887f8912f0a8cdb93cfdcc01a7/crates/oa-desktop/src/forms/data_fields.rs#L503), and [explicit array-row removal](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/src/commit/0409a481c7571e887f8912f0a8cdb93cfdcc01a7/crates/oa-desktop/src/forms.rs#L2016). These source seams do not establish actual Details discoverability or native usability.
No schema, feature or gesture policy is selected here. Named field types do not mean expression strings are executable or validated as those typed scalar values. Actual admission and each native result remain pending.
@@ -0,0 +1,166 @@
{
"status": "valid-intended; unexecuted; requires actual core admission",
"sourcePin": "0409a481c7571e887f8912f0a8cdb93cfdcc01a7",
"project": "80300000-0000-4000-8000-000000000000",
"scenario": "80300000-0000-4000-8000-000000000050",
"diagram": "80300000-0000-4000-8000-000000000070",
"allocations": {
"readStatus": {
"allocation": "80300000-0000-4000-8000-000000000041",
"interface": "80300000-0000-4000-8000-000000000040",
"item": "80300000-0000-4000-8000-000000000020"
},
"setLimit": {
"allocation": "80300000-0000-4000-8000-000000000042",
"interface": "80300000-0000-4000-8000-000000000040",
"item": "80300000-0000-4000-8000-000000000030"
}
},
"ports": {
"caller": "80300000-0000-4000-8000-000000000003",
"provider": "80300000-0000-4000-8000-000000000004"
},
"baselineMessages": [
{
"id": "80300000-0000-4000-8000-000000000060",
"alias": "first_call",
"kind": "Call",
"operation": {
"allocation": "80300000-0000-4000-8000-000000000041"
},
"reply_to": null,
"values": [
{
"path": [],
"field": "80300000-0000-4000-8000-000000000021",
"expression": "\"primary\""
}
]
},
{
"id": "80300000-0000-4000-8000-000000000061",
"alias": "first_reply",
"kind": "Reply",
"operation": null,
"reply_to": "80300000-0000-4000-8000-000000000060",
"derivedAllocation": "80300000-0000-4000-8000-000000000041",
"values": [
{
"path": [],
"field": "80300000-0000-4000-8000-000000000022",
"expression": "\"READY\""
}
]
},
{
"id": "80300000-0000-4000-8000-000000000062",
"alias": "control_call",
"kind": "Call",
"operation": {
"allocation": "80300000-0000-4000-8000-000000000042"
},
"reply_to": null,
"values": [
{
"path": [],
"field": "80300000-0000-4000-8000-000000000031",
"expression": "12.5"
}
]
},
{
"id": "80300000-0000-4000-8000-000000000063",
"alias": "control_reply",
"kind": "Reply",
"operation": null,
"reply_to": "80300000-0000-4000-8000-000000000062",
"derivedAllocation": "80300000-0000-4000-8000-000000000042",
"values": [
{
"path": [],
"field": "80300000-0000-4000-8000-000000000032",
"expression": "true"
}
]
}
],
"acceptedEditsInOrder": [
{
"task": "1",
"owner": "80300000-0000-4000-8000-000000000060",
"replace": {
"values[0].expression": "\"secondary\""
}
},
{
"task": "3a",
"owner": "80300000-0000-4000-8000-000000000061",
"replace": {
"values": []
}
},
{
"task": "3b",
"owner": "80300000-0000-4000-8000-000000000060",
"replace": {
"operation": {
"allocation": "80300000-0000-4000-8000-000000000042"
},
"values": [
{
"path": [],
"field": "80300000-0000-4000-8000-000000000031",
"expression": "18.75"
}
]
}
},
{
"task": "3c",
"owner": "80300000-0000-4000-8000-000000000061",
"replace": {
"values": [
{
"path": [],
"field": "80300000-0000-4000-8000-000000000032",
"expression": "true"
}
]
}
},
{
"task": "3d",
"owner": "80300000-0000-4000-8000-000000000060",
"replace": {
"values[0].expression": "19.25"
}
}
],
"rejectedEdit": {
"afterTask": "1",
"owner": "80300000-0000-4000-8000-000000000060",
"proposedAllocation": "80300000-0000-4000-8000-000000000042",
"retainedIncompatibleFields": [
{
"occurrence": "80300000-0000-4000-8000-000000000060",
"field": "80300000-0000-4000-8000-000000000021"
},
{
"occurrence": "80300000-0000-4000-8000-000000000061",
"field": "80300000-0000-4000-8000-000000000022"
}
],
"acceptedDelta": "none; history and accepted source unchanged"
},
"invariants": {
"scenarioSteps": [
"80300000-0000-4000-8000-000000000060",
"80300000-0000-4000-8000-000000000061",
"80300000-0000-4000-8000-000000000062",
"80300000-0000-4000-8000-000000000063"
],
"replyStoredOperation": "always absent/null, never copied from Call",
"controlPair": "complete exact baseline retained throughout",
"allOtherProjectFields": "exactly unchanged for each accepted edit"
}
}
@@ -0,0 +1,125 @@
#Requires -Version 7.0
[CmdletBinding()]
param(
[Parameter(Mandatory=$true)][string]$ReferenceReceipt,
[Parameter(Mandatory=$true)][string]$DesktopFingerprint,
[Parameter(Mandatory=$true)][string]$CoreRlib,
[Parameter(Mandatory=$true)][string]$SerdeJsonRlib,
[Parameter(Mandatory=$true)][string]$Output,
[string]$RuntimeDll='C:/Users/User/Documents/Git/ARCADIA-Studio/.local/navigation-rename-native-a49b0ec-20260913/package/libunwind.dll'
)
Set-StrictMode -Version Latest
$ErrorActionPreference='Stop'
$pin='0409a481c7571e887f8912f0a8cdb93cfdcc01a7'
$workspace=(Resolve-Path (Join-Path $PSScriptRoot '../scenario-spacing-fixes-ytr83r-20260913')).Path
$root=(Resolve-Path (Join-Path $PSScriptRoot '../..')).Path
$deps=[IO.Path]::GetFullPath((Join-Path $root 'target/debug/deps'))
$fingerprints=[IO.Path]::GetFullPath((Join-Path $root 'target/debug/.fingerprint'))
$native=[IO.Path]::GetFullPath((Join-Path $root '.local/toolchain/cargo/registry/src/index.crates.io-1949cf8c6b5b557f/windows_x86_64_gnullvm-0.52.6/lib'))
function Hash([string]$Path){(Get-FileHash -LiteralPath $Path -Algorithm SHA256).Hash.ToLowerInvariant()}
function Json([string]$Path){Get-Content -Raw -LiteralPath $Path|ConvertFrom-Json}
function Save([string]$Name,$Value){
$path=Join-Path $Output $Name
$stream=[IO.File]::Open($path,[IO.FileMode]::CreateNew,[IO.FileAccess]::Write,[IO.FileShare]::Read)
try{$bytes=[Text.UTF8Encoding]::new($false).GetBytes(($Value|ConvertTo-Json -Depth 20)+"`n");$stream.Write($bytes,0,$bytes.Length)}finally{$stream.Dispose()}
}
function Assert-Source {
Push-Location -LiteralPath $workspace
try{if((git rev-parse HEAD) -cne $pin -or $LASTEXITCODE -ne 0){throw 'Wrong core reference source pin'};if(@(git status --porcelain).Count -or $LASTEXITCODE -ne 0){throw 'Reference source must be clean'}}finally{Pop-Location}
}
Assert-Source
$ReferenceReceipt=(Resolve-Path -LiteralPath $ReferenceReceipt).Path
$reference=Json $ReferenceReceipt
if($reference.base -cne $pin){throw 'Reference receipt must bind the exact 0409 source pin'}
if($reference.cargoExitCode -ne 0 -or -not $reference.selectionValid -or -not $reference.inputsUnchanged -or -not $reference.testBinaryBindingValid -or $null -ne $reference.postflightFailure){throw 'A closed successful desktop receipt with executable binding is required'}
$evidence=Split-Path $ReferenceReceipt
$versionPath=Join-Path $evidence 'toolchain-versions.json'
$versions=Json $versionPath
if((Hash $versionPath) -cne $reference.toolchainVersionsSha256){throw 'Changed toolchain record'}
$capturePath=Join-Path $evidence ('inputs-complete-'+$reference.stage+'-after.json')
if((Hash $capturePath) -cne $reference.afterCaptureSha256){throw 'Changed source capture'}
$locks=@((Json $capturePath).files|Where-Object path -CEQ 'Cargo.lock')
if($locks.Count -ne 1 -or (Hash (Join-Path $workspace 'Cargo.lock')) -cne $locks[0].sha256){throw 'Reference dependency graph differs from experiment lockfile'}
$DesktopFingerprint=(Resolve-Path -LiteralPath $DesktopFingerprint).Path
$desktop=Json $DesktopFingerprint
$folder=Split-Path $DesktopFingerprint -Parent
if((Split-Path $DesktopFingerprint -Leaf) -cne 'test-bin-arcadia-studio.json' -or (Split-Path $folder -Leaf) -cnotmatch '^oa-desktop-([0-9a-f]{16})$'){throw 'Explicit desktop test fingerprint required'}
$testExe=Join-Path $deps ('arcadia_studio-'+$Matches[1]+'.exe')
$bound=@($reference.testExecutables|Where-Object {$_.path -ieq $testExe})
if($bound.Count -ne 1 -or (Get-Item $testExe).Length -ne $bound[0].bytes -or (Hash $testExe) -cne $bound[0].sha256){throw 'Fingerprint must belong to the exact reference test executable'}
$selected=@{oa_core=$CoreRlib;serde_json=$SerdeJsonRlib}
$selectedRecords=@()
foreach($name in @('oa_core','serde_json')){
$file=(Resolve-Path -LiteralPath $selected[$name]).Path
if((Split-Path $file -Parent) -ine $deps -or (Split-Path $file -Leaf) -cnotmatch ('^lib'+$name+'-([0-9a-f]{16})\.rlib$')){throw "Wrong explicit rlib: $name"}
$package=if($name -ceq 'oa_core'){'oa-core'}else{$name}
$sidecar=Join-Path $fingerprints ($package+'-'+$Matches[1]+'/lib-'+$name)
$hex=(Get-Content -Raw -LiteralPath $sidecar).Trim()
if($hex -cnotmatch '^[0-9a-f]{16}$'){throw 'Invalid Cargo fingerprint sidecar'}
$bytes=[Convert]::FromHexString($hex);if(-not [BitConverter]::IsLittleEndian){[Array]::Reverse($bytes)}
$value=[BitConverter]::ToUInt64($bytes,0)
$edges=@($desktop.deps|Where-Object {$_[1] -ceq $name})
if($edges.Count -ne 1 -or [UInt64]$edges[0][3] -ne $value){throw "Reference dependency edge differs: $name"}
$record=Json ($sidecar+'.json')
if($record.rustc -ne $desktop.rustc){throw 'Mixed Cargo compiler fingerprints'}
$selected[$name]=$file
$selectedRecords+=@($sidecar,($sidecar+'.json'),(Join-Path $deps ($name+'-'+([IO.Path]::GetFileNameWithoutExtension($file).Split('-')[-1])+'.d')))
}
# Verify the selected core's serde_json edge as well as the desktop's two edges.
$coreName=[IO.Path]::GetFileNameWithoutExtension($selected.oa_core).Substring('lib'.Length)
$coreJson=Json (Join-Path $fingerprints ($coreName.Replace('oa_core-','oa-core-')+'/lib-oa_core.json'))
$serdeEdge=@($desktop.deps|Where-Object {$_[1] -ceq 'serde_json'})
$coreSerdeEdge=@($coreJson.deps|Where-Object {$_[1] -ceq 'serde_json'})
if($coreSerdeEdge.Count -ne 1 -or [UInt64]$coreSerdeEdge[0][3] -ne [UInt64]$serdeEdge[0][3]){throw 'Core serde_json linkage differs from selected desktop dependency'}
$coreInputs=@((Json $capturePath).files|Where-Object {$_.path.StartsWith('crates/oa-core/')})
if($coreInputs.Count -lt 1){throw 'Closed receipt does not enumerate core source inputs'}
foreach($inputFile in $coreInputs){if((Hash (Join-Path $workspace $inputFile.path)) -cne $inputFile.sha256){throw ('Core source differs from compiled reference: '+$inputFile.path)}}
if(Test-Path -LiteralPath $Output){throw 'Output must be a new evidence directory'}
$Output=[IO.Path]::GetFullPath($Output)
$environment=$versions.externalEnvironmentPath
if((Hash $environment) -cne $versions.externalEnvironmentSha256){throw 'Changed compiler environment'}
. $environment
$rustc=(Get-Command rustc -CommandType Application).Source
$clang=(Get-Command clang -CommandType Application).Source
if($rustc -ine $versions.rustcPath -or $clang -ine $versions.clangPath){throw 'Compiler/linker paths differ from the reference'}
$toolchain=Join-Path $env:RUSTUP_HOME ('toolchains/'+$env:RUSTUP_TOOLCHAIN)
$sysroot=Join-Path $toolchain 'lib/rustlib/x86_64-pc-windows-gnullvm/lib'
$wrapper=Join-Path $PSScriptRoot 'core-probe.rs'
$sources=@($wrapper,(Join-Path $PSScriptRoot 'service-details.arcadia'),(Join-Path $PSScriptRoot 'baseline-and-edits.json'))
if((Hash $sources[1]) -cne '0e4325222a451b9d4e503974ce86bb95a9931edd0d2d65b8cd9db8d0f99d69e5' -or (Hash $sources[2]) -cne '6670cd0a07c109dde46128bd094a12d00ea008fc65efd73ad9477efcff976063'){throw 'Prepared fixture or edit expectations changed'}
function Inputs {
$paths=@($PSCommandPath,$ReferenceReceipt,$DesktopFingerprint,$versionPath,$capturePath,$testExe,$environment,$rustc,$clang,$RuntimeDll,(Join-Path $toolchain 'bin/rustc.exe'),(Join-Path $workspace 'Cargo.lock'),(Join-Path $workspace 'Cargo.toml'),(Join-Path $workspace 'crates/oa-core/Cargo.toml'))+$sources+$selectedRecords
foreach($directory in @($deps,$native,$sysroot)){$paths+=@(Get-ChildItem -LiteralPath $directory -File|Where-Object {$_.Extension -in @('.rlib','.rmeta','.dll','.lib','.a')}|ForEach-Object FullName)}
@($paths|ForEach-Object {(Resolve-Path -LiteralPath $_).Path}|Sort-Object -Unique|ForEach-Object {$item=Get-Item -LiteralPath $_;[ordered]@{path=$item.FullName;bytes=$item.Length;sha256=(Hash $item.FullName)}})
}
[void][IO.Directory]::CreateDirectory($Output)
$before=@(Inputs);Save 'inputs-before.json' $before
$PSNativeCommandUseErrorActionPreference=$false
$rustcVersion=@(& $rustc --version --verbose 2>&1|ForEach-Object ToString);$rustcExit=$LASTEXITCODE
$clangVersion=@(& $clang --version 2>&1|ForEach-Object ToString);$clangExit=$LASTEXITCODE
Save 'toolchain.json' @{rustc=$rustcVersion;rustc_exit=$rustcExit;clang=$clangVersion;clang_exit=$clangExit}
if($rustcExit -ne 0 -or $clangExit -ne 0 -or ($rustcVersion -join "`n") -cne (@($versions.rustc) -join "`n") -or ($clangVersion -join "`n") -cne (@($versions.clang) -join "`n")){throw 'Compiler/linker versions differ'}
$exe=Join-Path $Output 'service-details-core-probe.exe'
$argsForRustc=@('--edition=2024','--crate-name','service_details_core_probe','-D','warnings',$wrapper,'--extern',('oa_core='+$selected.oa_core),'--extern',('serde_json='+$selected.serde_json),'-L',('dependency='+$deps),'-L',('native='+$native),'-C',('linker='+$clang),'--emit',('link,dep-info='+(Join-Path $Output 'core-probe.d')),'-o',$exe)
$start=[DateTime]::UtcNow.ToString('o')
& $rustc @argsForRustc *> (Join-Path $Output 'compile.log')
$exit=$LASTEXITCODE
$end=[DateTime]::UtcNow.ToString('o')
$unchanged=$false;$failure=$null
try{
$after=@(Inputs);Save 'inputs-after.json' $after
if(($before|ConvertTo-Json -Depth 6 -Compress) -cne ($after|ConvertTo-Json -Depth 6 -Compress)){throw 'A source/link input changed'}
Assert-Source
$unchanged=$true
}catch{$failure=$_.Exception.Message}
$binary=if(Test-Path -LiteralPath $exe){$item=Get-Item $exe;@{path=$exe;bytes=$item.Length;sha256=(Hash $exe)}}else{$null}
if($exit -eq 0 -and $unchanged){
try{
$runtimeInput=@($before|Where-Object {$_.path -ieq (Resolve-Path -LiteralPath $RuntimeDll).Path})
[IO.File]::Copy($RuntimeDll,(Join-Path $Output 'libunwind.dll'),$false)
if($runtimeInput.Count -ne 1 -or (Hash (Join-Path $Output 'libunwind.dll')) -cne $runtimeInput[0].sha256){throw 'Staged runtime differs from bound input'}
}catch{$unchanged=$false;$failure=$_.Exception.Message}
}
Save 'build-receipt.json' @{source_commit=$pin;reference_receipt=$ReferenceReceipt;reference_receipt_sha256=(Hash $ReferenceReceipt);command=@($rustc)+$argsForRustc;start_utc=$start;end_utc=$end;exit_code=$exit;inputs_unchanged=$unchanged;postflight_failure=$failure;binary=$binary;runtime_sha256=(Hash $RuntimeDll);before_manifest_sha256=(Hash (Join-Path $Output 'inputs-before.json'));after_manifest_sha256=if(Test-Path (Join-Path $Output 'inputs-after.json')){Hash (Join-Path $Output 'inputs-after.json')}else{$null};toolchain_sha256=(Hash (Join-Path $Output 'toolchain.json'));compile_log_sha256=(Hash (Join-Path $Output 'compile.log'));tests_executed=$false}
if($exit -ne 0 -or -not $unchanged -or $null -eq $binary -or $binary.bytes -le 0){throw 'Isolated compilation or input provenance failed; preserve evidence'}
Write-Output 'Core probe compiled only; admission and edit execution remain separate.'
@@ -0,0 +1,40 @@
{
"command": [
"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\bin\\rustc.exe",
"--edition=2024",
"--crate-name",
"service_details_core_probe",
"-D",
"warnings",
"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\core-probe.rs",
"--extern",
"oa_core=C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\target\\debug\\deps\\liboa_core-86a2622fbe014324.rlib",
"--extern",
"serde_json=C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\target\\debug\\deps\\libserde_json-da2c4f333fc47818.rlib",
"-L",
"dependency=C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\target\\debug\\deps",
"-L",
"native=C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\windows_x86_64_gnullvm-0.52.6\\lib",
"-C",
"linker=C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\llvm-mingw-20260908-ucrt-x86_64\\bin\\clang.exe",
"--emit",
"link,dep-info=C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\core-build-01\\core-probe.d",
"-o",
"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\core-build-01\\service-details-core-probe.exe"
],
"after_manifest_sha256": "2f89bae9db3cc4a31f03304b7a926506d5e7ce2ddf27785a6a6d2925505a2fc7",
"postflight_failure": null,
"exit_code": 1,
"runtime_sha256": "aa282fa47bb2c4e210cea5e470cdbdca58568f0be0bc73e404d86ab9cd95ef6a",
"reference_receipt_sha256": "0b3ae67b7826d30bd9c32b1addd03b2529297baa3b91ded3398b7e4f32a27eef",
"start_utc": "2026-09-13T11:27:06.1090215Z",
"reference_receipt": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-spacing-gates-attempt3-20260913\\list-receipt.json",
"binary": null,
"inputs_unchanged": true,
"tests_executed": false,
"compile_log_sha256": "a3dd52bfa03b6275d932cf5cb1f8181f6d4cd3e4250d96f6a465573d0cd48358",
"source_commit": "0409a481c7571e887f8912f0a8cdb93cfdcc01a7",
"toolchain_sha256": "14e6384805dbf1d686e42ecd528f504a7e8fc701ef03116a6d5153d066f6a2c4",
"end_utc": "2026-09-13T11:27:17.1832840Z",
"before_manifest_sha256": "2f89bae9db3cc4a31f03304b7a926506d5e7ce2ddf27785a6a6d2925505a2fc7"
}
@@ -0,0 +1,14 @@
error[E0609]: no field `severity` on type `&SourceDiagnostic`
--> C:\Users\User\Documents\Git\ARCADIA-Studio\.local\scenario-details-native-preparation-20260913\core-probe.rs:108:50
|
108 | assert!(!loaded.diagnostics.iter().any(|d| d.severity == Severity::Error), "load errors: {:?}", loaded.diagnostics);
| ^^^^^^^^ unknown field
|
help: one of the expressions' fields has a field of the same name
|
108 | assert!(!loaded.diagnostics.iter().any(|d| d.diagnostic.severity == Severity::Error), "load errors: {:?}", loaded.diagnostics);
| +++++++++++
error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0609`.
@@ -0,0 +1,202 @@
//! Local-only evaluator. Compiles the original source and exercises core commands;
//! it does not exercise desktop source synchronization or native Details forms.
use oa_core::{
AcquisitionProtocol, Command, Element, Id, MessageKind, MessageValue, OccurrenceBody,
OperationUse, Project, RelationBody, Session, SharedBody, TransmissionProtocol, operations,
source_files, source_project::{ProjectLimits, compile_bundle}, validation::Severity,
};
use serde_json::{Value, json};
use std::{fs, io::Write, path::Path};
const SOURCE: &[u8] = include_bytes!("service-details.arcadia");
const EXPECTATIONS: &[u8] = include_bytes!("baseline-and-edits.json");
fn id(suffix: u128) -> Id { Id::from_u128(0x80300000000040008000000000000000 | suffix) }
fn value(field: u128, expression: &str) -> MessageValue {
MessageValue { path: vec![], field: id(field), expression: expression.into() }
}
fn body(element: &Element) -> &OccurrenceBody {
match element.shared().expect("shared element") {
SharedBody::Occurrence { body, .. } => body,
_ => panic!("expected an occurrence"),
}
}
fn body_mut(element: &mut Element) -> &mut OccurrenceBody {
match element.shared_mut().expect("shared element") {
SharedBody::Occurrence { body, .. } => body,
_ => panic!("expected an occurrence"),
}
}
fn exchange(kind: MessageKind, call: Option<u128>, allocation: Option<u128>, values: Vec<MessageValue>) -> OccurrenceBody {
let reply = kind == MessageKind::Reply;
OccurrenceBody::Exchange {
exchange: Some(id(0x45)), sender: Some(id(if reply { 0x52 } else { 0x51 })),
receiver: Some(id(if reply { 0x51 } else { 0x52 })), message_kind: kind,
reply_to: call.map(id), operation: allocation.map(|a| OperationUse { allocation: Some(id(a)) }), values,
}
}
// Sort only object keys. Array order and scalar serialization (including numeric
// spelling) remain significant. This compares the entire Project, not a projection.
fn canonical(v: &Value) -> String {
match v {
Value::Object(m) => {
let mut keys: Vec<_> = m.keys().collect(); keys.sort();
format!("{{{}}}", keys.into_iter().map(|k| format!("{}:{}", serde_json::to_string(k).unwrap(), canonical(&m[k]))).collect::<Vec<_>>().join(","))
}
Value::Array(a) => format!("[{}]", a.iter().map(canonical).collect::<Vec<_>>().join(",")),
_ => serde_json::to_string(v).unwrap(),
}
}
fn full(p: &Project) -> String { canonical(&serde_json::to_value(p).unwrap()) }
fn put(out: &Path, name: &str, bytes: &[u8]) {
let mut f = fs::OpenOptions::new().write(true).create_new(true).open(out.join(name)).unwrap();
f.write_all(bytes).unwrap(); f.sync_all().unwrap();
}
fn assert_derived(p: &Project, call: u128, reply: u128, allocation: u128, item: u128) {
for occurrence in [call, reply] {
let operations::OperationResolution::Selected(actual) = operations::resolve(p, id(occurrence)).unwrap() else { panic!("operation was not resolved") };
assert_eq!(actual.invocation, id(call));
assert_eq!(actual.allocation, id(allocation));
assert_eq!(actual.interface, id(0x40)); assert_eq!(actual.item, id(item));
assert_eq!(actual.caller_port, id(0x03)); assert_eq!(actual.provider_port, id(0x04));
assert_eq!(actual.transmission, TransmissionProtocol::Synchronous);
}
assert!(matches!(body(&p.elements[&id(reply)]), OccurrenceBody::Exchange { operation: None, reply_to: Some(actual), .. } if *actual == id(call)));
}
fn manifest_command(p: &Project, edit: &Value) -> Command {
let owner: Id = serde_json::from_value(edit["owner"].clone()).unwrap();
let mut element = p.elements[&owner].clone();
let OccurrenceBody::Exchange { operation, values, .. } = body_mut(&mut element) else { panic!("exchange required") };
for (key, v) in edit["replace"].as_object().unwrap() {
match key.as_str() {
"operation" => *operation = serde_json::from_value(v.clone()).unwrap(),
"values" => *values = serde_json::from_value(v.clone()).unwrap(),
"values[0].expression" => values[0].expression = v.as_str().unwrap().into(),
_ => panic!("unexpected edit key {key}"),
}
}
Command::EditElement(owner, element)
}
// Independent hard-coded expectation: this does not reuse the manifest translator,
// its constructed replacement Element, or any command result.
fn expected_after(previous: &Project, task: &str) -> Project {
let mut p = previous.clone();
let owner = if matches!(task, "3a" | "3c") { 0x61 } else { 0x60 };
let OccurrenceBody::Exchange { operation, values, .. } = body_mut(p.elements.get_mut(&id(owner)).unwrap()) else { panic!("exchange required") };
match task {
"1" => values[0].expression = "\"secondary\"".into(),
"3a" => values.clear(),
"3b" => { *operation = Some(OperationUse { allocation: Some(id(0x42)) }); *values = vec![value(0x31, "18.75")]; }
"3c" => *values = vec![value(0x32, "true")],
"3d" => values[0].expression = "19.25".into(),
_ => panic!("unexpected task"),
}
p
}
fn main() {
let args: Vec<_> = std::env::args_os().skip(1).collect();
assert_eq!(args.len(), 3, "core-probe FIXTURE EXPECTATIONS NEW_OUTPUT_DIRECTORY");
let source_path = Path::new(&args[0]); let manifest_path = Path::new(&args[1]); let out = Path::new(&args[2]);
assert_eq!(fs::read(source_path).unwrap(), SOURCE);
assert_eq!(fs::read(manifest_path).unwrap(), EXPECTATIONS);
assert!(!out.exists(), "preserve prior evidence"); fs::create_dir(out).unwrap();
let manifest: Value = serde_json::from_slice(EXPECTATIONS).unwrap();
assert_eq!(manifest["sourcePin"], "0409a481c7571e887f8912f0a8cdb93cfdcc01a7");
assert_eq!(manifest["project"], json!(id(0))); assert_eq!(manifest["scenario"], json!(id(0x50)));
assert_eq!(manifest["diagram"], json!(id(0x70)));
let loaded = source_files::load_project(source_path, ProjectLimits::default()).unwrap();
assert!(!loaded.diagnostics.iter().any(|d| d.severity == Severity::Error), "load errors: {:?}", loaded.diagnostics);
let original_bundle = loaded.reachable_bundle(); assert_eq!(original_bundle.files.len(), 1);
let compiled = compile_bundle(&original_bundle, ProjectLimits::default()).unwrap();
assert_eq!(compiled.bundle, original_bundle, "implicit migration, ID insertion, or other source rewrite");
let baseline = compiled.decoded.project;
let baseline_json = full(&baseline);
assert_eq!(baseline.id, id(0));
let expected_bodies = [
exchange(MessageKind::Call, None, Some(0x41), vec![value(0x21, "\"primary\"")]),
exchange(MessageKind::Reply, Some(0x60), None, vec![value(0x22, "\"READY\"")]),
exchange(MessageKind::Call, None, Some(0x42), vec![value(0x31, "12.5")]),
exchange(MessageKind::Reply, Some(0x62), None, vec![value(0x32, "true")]),
];
assert_eq!(manifest["baselineMessages"].as_array().unwrap().len(), 4);
for (index, expected) in expected_bodies.iter().enumerate() {
let owner = id(0x60 + index as u128); let e = &baseline.elements[&owner];
assert_eq!(body(e), expected); assert_eq!(e.parent, Some(id(0x50)));
let row = &manifest["baselineMessages"][index];
assert_eq!(row["id"], json!(owner)); assert_eq!(row["alias"], json!(e.alias));
let OccurrenceBody::Exchange { message_kind, reply_to, operation, values, .. } = expected else { unreachable!() };
assert_eq!(row["kind"], json!(message_kind)); assert_eq!(row["reply_to"], json!(reply_to));
assert_eq!(row["operation"], json!(operation)); assert_eq!(row["values"], json!(values));
}
for (allocation, item, order, key) in [(0x41, 0x20, 0, "readStatus"), (0x42, 0x30, 1, "setLimit")] {
assert_eq!(baseline.relations[&id(allocation)].body, RelationBody::InterfaceItemAllocation {
source: id(0x40), target: id(item), order,
transmission: TransmissionProtocol::Synchronous, acquisition: AcquisitionProtocol::Accept,
});
assert_eq!(manifest["allocations"][key], json!({"allocation":id(allocation),"interface":id(0x40),"item":id(item)}));
}
assert_eq!(manifest["ports"], json!({"caller":id(0x03),"provider":id(0x04)}));
let SharedBody::Scenario { steps, .. } = baseline.elements[&id(0x50)].shared().unwrap() else { panic!("scenario required") };
assert_eq!(steps, &vec![id(0x60),id(0x61),id(0x62),id(0x63)]);
assert_eq!(manifest["invariants"]["scenarioSteps"], json!(steps));
assert_derived(&baseline, 0x60, 0x61, 0x41, 0x20); assert_derived(&baseline, 0x62, 0x63, 0x42, 0x30);
assert_eq!(manifest["baselineMessages"][1]["derivedAllocation"], json!(id(0x41)));
assert_eq!(manifest["baselineMessages"][3]["derivedAllocation"], json!(id(0x42)));
let mut session = Session::try_new(baseline.clone()).expect("core admission");
assert!(!session.dirty() && !session.can_undo() && !session.can_redo());
assert_eq!(full(session.project()), baseline_json);
put(out, "baseline.project.json", baseline_json.as_bytes());
let edits = manifest["acceptedEditsInOrder"].as_array().unwrap();
assert_eq!(edits.iter().map(|e| e["task"].as_str().unwrap()).collect::<Vec<_>>(), ["1","3a","3b","3c","3d"]);
let mut expected = baseline.clone(); let mut records = Vec::new(); let mut rejection = Value::Null;
for edit in edits {
let task = edit["task"].as_str().unwrap(); let previous = expected.clone();
expected = expected_after(&previous, task);
let revision = session.revision();
session.execute(manifest_command(session.project(), edit)).unwrap();
assert_eq!(session.revision(), revision + 1); assert!(session.dirty());
assert_eq!(full(session.project()), full(&expected), "complete Project after {task}");
assert_eq!(session.project().elements[&id(0x62)], baseline.elements[&id(0x62)]);
assert_eq!(session.project().elements[&id(0x63)], baseline.elements[&id(0x63)]);
let changed = matches!(task, "3b" | "3c" | "3d");
assert_derived(session.project(), 0x60, 0x61, if changed {0x42} else {0x41}, if changed {0x30} else {0x20});
assert_derived(session.project(), 0x62, 0x63, 0x42, 0x30);
if task == "1" {
let rejected = &manifest["rejectedEdit"];
assert_eq!(rejected["afterTask"], "1"); assert_eq!(rejected["owner"], json!(id(0x60)));
assert_eq!(rejected["proposedAllocation"], json!(id(0x42)));
assert_eq!(rejected["retainedIncompatibleFields"], json!([
{"occurrence":id(0x60),"field":id(0x21)}, {"occurrence":id(0x61),"field":id(0x22)}
]));
let proposal = json!({"owner":rejected["owner"],"replace":{"operation":{"allocation":rejected["proposedAllocation"]}}});
let before = (full(session.project()), session.revision(), session.dirty(), session.can_undo(), session.can_redo());
let error = session.execute(manifest_command(session.project(), &proposal)).expect_err("retained incompatible values must be rejected");
assert_eq!((full(session.project()), session.revision(), session.dirty(), session.can_undo(), session.can_redo()), before);
rejection = json!({"status":"rejected_without_mutation","error":error.to_string(),"after_task":"1"});
}
// One undo must recover the exact previous Project, including after the
// failed operation change. Redo must recover exactly this accepted record.
session.undo(); assert_eq!(full(session.project()), full(&previous));
assert!(session.can_redo());
if task == "1" { assert!(!session.can_undo() && !session.dirty()); }
session.redo(); assert_eq!(full(session.project()), full(&expected)); assert!(!session.can_redo());
put(out, &format!("after-{task}.actual.project.json"), full(session.project()).as_bytes());
put(out, &format!("after-{task}.expected.project.json"), full(&expected).as_bytes());
records.push(json!({"task":task,"complete_project_equal":true,"one_undo_redo_exact":true,"reply_derivation_exact":true}));
}
// Drain actual history as an additional check that no hidden failed/no-op
// transaction inserted a second state. Exactly five accepted records exist.
let mut expected_stack = vec![baseline.clone()];
for task in ["1","3a","3b","3c","3d"] { expected_stack.push(expected_after(expected_stack.last().unwrap(), task)); }
for p in expected_stack[..5].iter().rev() { assert!(session.can_undo()); session.undo(); assert_eq!(full(session.project()), full(p)); }
assert!(!session.can_undo() && !session.dirty());
for p in expected_stack[1..].iter() { assert!(session.can_redo()); session.redo(); assert_eq!(full(session.project()), full(p)); }
assert!(!session.can_redo());
assert_eq!(full(&baseline), baseline_json);
assert_eq!(fs::read(source_path).unwrap(), SOURCE); assert_eq!(fs::read(manifest_path).unwrap(), EXPECTATIONS);
let report = json!({"schema":"service_details_core_probe_v1","status":"passed","fixture_core_admitted":true,
"source_bundle_unchanged_on_compile":true,"accepted":records,"rejected":rejection,"history_depth":5,
"scope":"Real source load/compile/core Session only. No desktop SourceBundle edits, property-form recovery, native interaction, Save or reopen evidence."});
put(out, "result.json", &serde_json::to_vec_pretty(&report).unwrap());
println!("SERVICE_DETAILS_CORE_PROBE_JSON={report}");
}
@@ -0,0 +1,9 @@
{
"classification": "failed isolated probe compilation",
"exit": 1,
"inputs_unchanged": true,
"diagnosis": "SourceDiagnostic wraps Diagnostic; severity is diagnostic.severity per actual source_project.rs definition",
"correction": "Only d.severity to d.diagnostic.severity in core probe; no production change",
"source_original_sha256": "cc9bc0679e5936605bfa17f9654e5ee3b302f0ea26fab0a151f7e17fe882a53b",
"source_corrected_sha256": "7a8a63557b24066243848d907763883396c89cc766e5a34227ed766bc2a56a1c"
}
@@ -0,0 +1,20 @@
{
"rustc_exit": 0,
"rustc": [
"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"
],
"clang": [
"clang version 23.1.1 (https://github.com/llvm/llvm-project.git 6dfe1677ab8dffbc6ec13d53a1e0215d75147689)",
"Target: x86_64-w64-windows-gnu",
"Thread model: posix",
"InstalledDir: C:/Users/User/Documents/Git/ARCADIA-Studio/.local/toolchain/llvm-mingw-20260908-ucrt-x86_64/bin",
"Configuration file: C:/Users/User/Documents/Git/ARCADIA-Studio/.local/toolchain/llvm-mingw-20260908-ucrt-x86_64/bin/x86_64-w64-windows-gnu.cfg"
],
"clang_exit": 0
}
@@ -0,0 +1,44 @@
{
"after_manifest_sha256": "5618c35cf166d47caf0668d34b87af5a79ab4efd9f1db073ab9a7b06fa026ca3",
"tests_executed": false,
"compile_log_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"start_utc": "2026-09-13T11:34:15.5331347Z",
"command": [
"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\bin\\rustc.exe",
"--edition=2024",
"--crate-name",
"service_details_core_probe",
"-D",
"warnings",
"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\core-probe.rs",
"--extern",
"oa_core=C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\target\\debug\\deps\\liboa_core-86a2622fbe014324.rlib",
"--extern",
"serde_json=C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\target\\debug\\deps\\libserde_json-da2c4f333fc47818.rlib",
"-L",
"dependency=C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\target\\debug\\deps",
"-L",
"native=C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\windows_x86_64_gnullvm-0.52.6\\lib",
"-C",
"linker=C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\llvm-mingw-20260908-ucrt-x86_64\\bin\\clang.exe",
"--emit",
"link,dep-info=C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\core-build-02\\core-probe.d",
"-o",
"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\core-build-02\\service-details-core-probe.exe"
],
"end_utc": "2026-09-13T11:34:45.7793523Z",
"exit_code": 0,
"inputs_unchanged": true,
"binary": {
"sha256": "7d80f9bca005a9aee7f985235fa520f3e25fe0192d44d00696c2da8b8cb6c439",
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\core-build-02\\service-details-core-probe.exe",
"bytes": 19905536
},
"reference_receipt": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-spacing-gates-attempt3-20260913\\list-receipt.json",
"source_commit": "0409a481c7571e887f8912f0a8cdb93cfdcc01a7",
"runtime_sha256": "aa282fa47bb2c4e210cea5e470cdbdca58568f0be0bc73e404d86ab9cd95ef6a",
"toolchain_sha256": "1f3f645058e5021f9c50e8301d21f7a07fa2b4a49eebafa386f83dedeba2730f",
"postflight_failure": null,
"reference_receipt_sha256": "0b3ae67b7826d30bd9c32b1addd03b2529297baa3b91ded3398b7e4f32a27eef",
"before_manifest_sha256": "5618c35cf166d47caf0668d34b87af5a79ab4efd9f1db073ab9a7b06fa026ca3"
}
@@ -0,0 +1,7 @@
C:\Users\User\Documents\Git\ARCADIA-Studio\.local\scenario-details-native-preparation-20260913\core-build-02\core-probe.d: C:\Users\User\Documents\Git\ARCADIA-Studio\.local\scenario-details-native-preparation-20260913\core-probe.rs C:\Users\User\Documents\Git\ARCADIA-Studio\.local\scenario-details-native-preparation-20260913\service-details.arcadia C:\Users\User\Documents\Git\ARCADIA-Studio\.local\scenario-details-native-preparation-20260913\baseline-and-edits.json
C:\Users\User\Documents\Git\ARCADIA-Studio\.local\scenario-details-native-preparation-20260913\core-build-02\service-details-core-probe.exe: C:\Users\User\Documents\Git\ARCADIA-Studio\.local\scenario-details-native-preparation-20260913\core-probe.rs C:\Users\User\Documents\Git\ARCADIA-Studio\.local\scenario-details-native-preparation-20260913\service-details.arcadia C:\Users\User\Documents\Git\ARCADIA-Studio\.local\scenario-details-native-preparation-20260913\baseline-and-edits.json
C:\Users\User\Documents\Git\ARCADIA-Studio\.local\scenario-details-native-preparation-20260913\core-probe.rs:
C:\Users\User\Documents\Git\ARCADIA-Studio\.local\scenario-details-native-preparation-20260913\service-details.arcadia:
C:\Users\User\Documents\Git\ARCADIA-Studio\.local\scenario-details-native-preparation-20260913\baseline-and-edits.json:
@@ -0,0 +1,20 @@
{
"rustc": [
"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"
],
"clang": [
"clang version 23.1.1 (https://github.com/llvm/llvm-project.git 6dfe1677ab8dffbc6ec13d53a1e0215d75147689)",
"Target: x86_64-w64-windows-gnu",
"Thread model: posix",
"InstalledDir: C:/Users/User/Documents/Git/ARCADIA-Studio/.local/toolchain/llvm-mingw-20260908-ucrt-x86_64/bin",
"Configuration file: C:/Users/User/Documents/Git/ARCADIA-Studio/.local/toolchain/llvm-mingw-20260908-ucrt-x86_64/bin/x86_64-w64-windows-gnu.cfg"
],
"rustc_exit": 0,
"clang_exit": 0
}
@@ -0,0 +1,32 @@
{
"status": "prepared; uncompiled and unexecuted",
"source_pin": "0409a481c7571e887f8912f0a8cdb93cfdcc01a7",
"powershell_syntax": "passed; Parser.ParseFile only",
"files": [
{
"path": "core-probe.rs",
"bytes": 13604,
"sha256": "cc9bc0679e5936605bfa17f9654e5ee3b302f0ea26fab0a151f7e17fe882a53b"
},
{
"path": "build-core-probe.ps1",
"bytes": 10633,
"sha256": "85b0a3cb25292573076a5e395dcfe08b4b179b5f44d510225247b43e20fddde3"
},
{
"path": "core-probe.md",
"bytes": 6169,
"sha256": "2a191d4ff03e4584669ee547dea94423a2e36eeffa07fd925ca4d8f265a6b538"
},
{
"path": "service-details.arcadia",
"bytes": 6132,
"sha256": "0e4325222a451b9d4e503974ce86bb95a9931edd0d2d65b8cd9db8d0f99d69e5"
},
{
"path": "baseline-and-edits.json",
"bytes": 4666,
"sha256": "6670cd0a07c109dde46128bd094a12d00ea008fc65efd73ad9477efcff976063"
}
]
}
@@ -0,0 +1,105 @@
# Service Details core probe — prepared, unexecuted
This local-only probe exercises the actual `oa_core` source loader, compiler,
admission and Session commands. It has not been compiled or run. It is independent
of desktop Details forms, event dispatch, source-writing, Save/reopen, and native
recovery; none of those claims follows from a successful result here.
Inputs are the existing immutable `service-details.arcadia` and
`baseline-and-edits.json`. Their original SHA-256 values are respectively
`0e4325222a451b9d4e503974ce86bb95a9931edd0d2d65b8cd9db8d0f99d69e5`
and `6670cd0a07c109dde46128bd094a12d00ea008fc65efd73ad9477efcff976063`.
The probe embeds and compares both exact input byte strings at execution. The
builder additionally requires those hashes before compilation.
## Evaluator
1. `source_files::load_project` → `reachable_bundle` → `compile_bundle`, with no
loader errors and exact original/compiled SourceBundle equality. There must be
exactly one source file and no implicit migration or generated identity patch.
`Session::try_new` performs actual core admission.
2. Independently constructed complete Exchange bodies check the four baseline
Calls/Replies, endpoints, channel, operation selections, reply correlations and
typed values. Exact allocation records, interface, carried items, port
resolutions, Scenario steps and manifest correspondence are checked.
3. The manifest is translated into real single-record `Command::EditElement`
operations. A separate hard-coded expectation function mutates only the named
expected field(s) on a cloned previous Project. Every accepted result is
compared as a complete canonical Project, retaining array order and scalar
serialization. The unrelated control Call/Reply are also checked explicitly.
4. After task 1, changing only the Call allocation to SetLimit while retaining
its read-scope value and the Reply's read-result value must fail. Complete
Project, revision, dirty/undo/redo flags must be unchanged. An actual Undo must
still return directly to the baseline, followed by exact Redo.
5. All five accepted edits each admit exactly one history record. Their actual
Undo/Redo states equal the independent previous/current complete Projects. A
final history drain/replay requires exactly five records. Both Reply operation
resolutions must use their exact correlated Calls throughout; stored Reply
operation remains absent. Source fixture and expectation bytes remain intact.
Expected reports are baseline Project JSON, five pairs of actual/independently
expected complete Project JSON, and `result.json` with schema
`service_details_core_probe_v1`. Only a completed successful run may report
`status: passed`. A panic/nonzero exit is an evaluator or admission failure, not
native acceptance. Partial output directories must be preserved.
## Concrete build recipe (parent's isolated compiler slot only)
The already observed 0409 desktop test fingerprint is
`target/debug/.fingerprint/oa-desktop-27db9628b266bf39/test-bin-arcadia-studio.json`.
Its selected existing artifacts are:
| Crate | Explicit artifact | Cargo dependency fingerprint |
| --- | --- | --- |
| oa_core | `target/debug/deps/liboa_core-86a2622fbe014324.rlib` | `4419379373038517442` |
| serde_json | `target/debug/deps/libserde_json-da2c4f333fc47818.rlib` | `9111881576180166571` |
These were read from the existing sidecars, not inferred from newest filenames.
The build script revalidates both desktop edges and the core→serde_json edge,
the exact closed receipt's executable, core source hashes and Cargo.lock, clean
0409 source, compiler/linker paths and versions. It binds source, receipts,
fingerprints, actual compiler, existing link libraries and runtime DLL before and
after isolated compilation. It never invokes Cargo, rebuilds a dependency or
automatically runs the probe. The reference may be the successful closed list
receipt; focused failures do not invalidate compilation provenance.
From the repository root, once the parent grants the local slot:
```powershell
$prep = Join-Path $PWD '.local/scenario-details-native-preparation-20260913'
& (Join-Path $prep 'build-core-probe.ps1') `
-ReferenceReceipt "$PWD/.local/scenario-spacing-gates-attempt3-20260913/list-receipt.json" `
-DesktopFingerprint "$PWD/target/debug/.fingerprint/oa-desktop-27db9628b266bf39/test-bin-arcadia-studio.json" `
-CoreRlib "$PWD/target/debug/deps/liboa_core-86a2622fbe014324.rlib" `
-SerdeJsonRlib "$PWD/target/debug/deps/libserde_json-da2c4f333fc47818.rlib" `
-Output (Join-Path $prep 'core-build-01')
```
The underlying command is direct `rustc --edition=2024 --crate-name
service_details_core_probe -D warnings core-probe.rs --extern oa_core=<exact rlib>
--extern serde_json=<exact rlib> -L dependency=<target/debug/deps> -L
native=<windows_x86_64_gnullvm-0.52.6/lib> -C linker=<gated clang> --emit
link,dep-info=<new output/core-probe.d> -o <new output/exe>`.
After checking `build-receipt.json` has exit_code 0, inputs_unchanged true, no
postflight_failure, and the current executable/runtime match its hashes, run
separately with fresh output and logs:
```powershell
& (Join-Path $prep 'core-build-01/service-details-core-probe.exe') `
(Join-Path $prep 'service-details.arcadia') `
(Join-Path $prep 'baseline-and-edits.json') `
(Join-Path $prep 'core-run-01') *> (Join-Path $prep 'core-run-01.log')
$probeExit = $LASTEXITCODE
# Parent records start/end, probeExit, binary/DLL/source hashes before and after,
# raw log and result.json. Require probeExit 0 and the exact completed result.
```
Use a fresh numbered log/output for every attempt; the sample redirection must
not overwrite a previous log. No native executable is launched by preparation.
Unmet prerequisites: Rust compilation/type/link checking; execution against the
actual admitted fixture; and a captured successful exit/report. In particular,
the intended fixture and accepted sequence are not yet proven valid. Core
history checks provide no evidence that a desktop failed property-form edit
retains its draft or that source synchronization/Save/reopen behaves correctly.
@@ -0,0 +1,202 @@
//! Local-only evaluator. Compiles the original source and exercises core commands;
//! it does not exercise desktop source synchronization or native Details forms.
use oa_core::{
AcquisitionProtocol, Command, Element, Id, MessageKind, MessageValue, OccurrenceBody,
OperationUse, Project, RelationBody, Session, SharedBody, TransmissionProtocol, operations,
source_files, source_project::{ProjectLimits, compile_bundle}, validation::Severity,
};
use serde_json::{Value, json};
use std::{fs, io::Write, path::Path};
const SOURCE: &[u8] = include_bytes!("service-details.arcadia");
const EXPECTATIONS: &[u8] = include_bytes!("baseline-and-edits.json");
fn id(suffix: u128) -> Id { Id::from_u128(0x80300000000040008000000000000000 | suffix) }
fn value(field: u128, expression: &str) -> MessageValue {
MessageValue { path: vec![], field: id(field), expression: expression.into() }
}
fn body(element: &Element) -> &OccurrenceBody {
match element.shared().expect("shared element") {
SharedBody::Occurrence { body, .. } => body,
_ => panic!("expected an occurrence"),
}
}
fn body_mut(element: &mut Element) -> &mut OccurrenceBody {
match element.shared_mut().expect("shared element") {
SharedBody::Occurrence { body, .. } => body,
_ => panic!("expected an occurrence"),
}
}
fn exchange(kind: MessageKind, call: Option<u128>, allocation: Option<u128>, values: Vec<MessageValue>) -> OccurrenceBody {
let reply = kind == MessageKind::Reply;
OccurrenceBody::Exchange {
exchange: Some(id(0x45)), sender: Some(id(if reply { 0x52 } else { 0x51 })),
receiver: Some(id(if reply { 0x51 } else { 0x52 })), message_kind: kind,
reply_to: call.map(id), operation: allocation.map(|a| OperationUse { allocation: Some(id(a)) }), values,
}
}
// Sort only object keys. Array order and scalar serialization (including numeric
// spelling) remain significant. This compares the entire Project, not a projection.
fn canonical(v: &Value) -> String {
match v {
Value::Object(m) => {
let mut keys: Vec<_> = m.keys().collect(); keys.sort();
format!("{{{}}}", keys.into_iter().map(|k| format!("{}:{}", serde_json::to_string(k).unwrap(), canonical(&m[k]))).collect::<Vec<_>>().join(","))
}
Value::Array(a) => format!("[{}]", a.iter().map(canonical).collect::<Vec<_>>().join(",")),
_ => serde_json::to_string(v).unwrap(),
}
}
fn full(p: &Project) -> String { canonical(&serde_json::to_value(p).unwrap()) }
fn put(out: &Path, name: &str, bytes: &[u8]) {
let mut f = fs::OpenOptions::new().write(true).create_new(true).open(out.join(name)).unwrap();
f.write_all(bytes).unwrap(); f.sync_all().unwrap();
}
fn assert_derived(p: &Project, call: u128, reply: u128, allocation: u128, item: u128) {
for occurrence in [call, reply] {
let operations::OperationResolution::Selected(actual) = operations::resolve(p, id(occurrence)).unwrap() else { panic!("operation was not resolved") };
assert_eq!(actual.invocation, id(call));
assert_eq!(actual.allocation, id(allocation));
assert_eq!(actual.interface, id(0x40)); assert_eq!(actual.item, id(item));
assert_eq!(actual.caller_port, id(0x03)); assert_eq!(actual.provider_port, id(0x04));
assert_eq!(actual.transmission, TransmissionProtocol::Synchronous);
}
assert!(matches!(body(&p.elements[&id(reply)]), OccurrenceBody::Exchange { operation: None, reply_to: Some(actual), .. } if *actual == id(call)));
}
fn manifest_command(p: &Project, edit: &Value) -> Command {
let owner: Id = serde_json::from_value(edit["owner"].clone()).unwrap();
let mut element = p.elements[&owner].clone();
let OccurrenceBody::Exchange { operation, values, .. } = body_mut(&mut element) else { panic!("exchange required") };
for (key, v) in edit["replace"].as_object().unwrap() {
match key.as_str() {
"operation" => *operation = serde_json::from_value(v.clone()).unwrap(),
"values" => *values = serde_json::from_value(v.clone()).unwrap(),
"values[0].expression" => values[0].expression = v.as_str().unwrap().into(),
_ => panic!("unexpected edit key {key}"),
}
}
Command::EditElement(owner, element)
}
// Independent hard-coded expectation: this does not reuse the manifest translator,
// its constructed replacement Element, or any command result.
fn expected_after(previous: &Project, task: &str) -> Project {
let mut p = previous.clone();
let owner = if matches!(task, "3a" | "3c") { 0x61 } else { 0x60 };
let OccurrenceBody::Exchange { operation, values, .. } = body_mut(p.elements.get_mut(&id(owner)).unwrap()) else { panic!("exchange required") };
match task {
"1" => values[0].expression = "\"secondary\"".into(),
"3a" => values.clear(),
"3b" => { *operation = Some(OperationUse { allocation: Some(id(0x42)) }); *values = vec![value(0x31, "18.75")]; }
"3c" => *values = vec![value(0x32, "true")],
"3d" => values[0].expression = "19.25".into(),
_ => panic!("unexpected task"),
}
p
}
fn main() {
let args: Vec<_> = std::env::args_os().skip(1).collect();
assert_eq!(args.len(), 3, "core-probe FIXTURE EXPECTATIONS NEW_OUTPUT_DIRECTORY");
let source_path = Path::new(&args[0]); let manifest_path = Path::new(&args[1]); let out = Path::new(&args[2]);
assert_eq!(fs::read(source_path).unwrap(), SOURCE);
assert_eq!(fs::read(manifest_path).unwrap(), EXPECTATIONS);
assert!(!out.exists(), "preserve prior evidence"); fs::create_dir(out).unwrap();
let manifest: Value = serde_json::from_slice(EXPECTATIONS).unwrap();
assert_eq!(manifest["sourcePin"], "0409a481c7571e887f8912f0a8cdb93cfdcc01a7");
assert_eq!(manifest["project"], json!(id(0))); assert_eq!(manifest["scenario"], json!(id(0x50)));
assert_eq!(manifest["diagram"], json!(id(0x70)));
let loaded = source_files::load_project(source_path, ProjectLimits::default()).unwrap();
assert!(!loaded.diagnostics.iter().any(|d| d.diagnostic.severity == Severity::Error), "load errors: {:?}", loaded.diagnostics);
let original_bundle = loaded.reachable_bundle(); assert_eq!(original_bundle.files.len(), 1);
let compiled = compile_bundle(&original_bundle, ProjectLimits::default()).unwrap();
assert_eq!(compiled.bundle, original_bundle, "implicit migration, ID insertion, or other source rewrite");
let baseline = compiled.decoded.project;
let baseline_json = full(&baseline);
assert_eq!(baseline.id, id(0));
let expected_bodies = [
exchange(MessageKind::Call, None, Some(0x41), vec![value(0x21, "\"primary\"")]),
exchange(MessageKind::Reply, Some(0x60), None, vec![value(0x22, "\"READY\"")]),
exchange(MessageKind::Call, None, Some(0x42), vec![value(0x31, "12.5")]),
exchange(MessageKind::Reply, Some(0x62), None, vec![value(0x32, "true")]),
];
assert_eq!(manifest["baselineMessages"].as_array().unwrap().len(), 4);
for (index, expected) in expected_bodies.iter().enumerate() {
let owner = id(0x60 + index as u128); let e = &baseline.elements[&owner];
assert_eq!(body(e), expected); assert_eq!(e.parent, Some(id(0x50)));
let row = &manifest["baselineMessages"][index];
assert_eq!(row["id"], json!(owner)); assert_eq!(row["alias"], json!(e.alias));
let OccurrenceBody::Exchange { message_kind, reply_to, operation, values, .. } = expected else { unreachable!() };
assert_eq!(row["kind"], json!(message_kind)); assert_eq!(row["reply_to"], json!(reply_to));
assert_eq!(row["operation"], json!(operation)); assert_eq!(row["values"], json!(values));
}
for (allocation, item, order, key) in [(0x41, 0x20, 0, "readStatus"), (0x42, 0x30, 1, "setLimit")] {
assert_eq!(baseline.relations[&id(allocation)].body, RelationBody::InterfaceItemAllocation {
source: id(0x40), target: id(item), order,
transmission: TransmissionProtocol::Synchronous, acquisition: AcquisitionProtocol::Accept,
});
assert_eq!(manifest["allocations"][key], json!({"allocation":id(allocation),"interface":id(0x40),"item":id(item)}));
}
assert_eq!(manifest["ports"], json!({"caller":id(0x03),"provider":id(0x04)}));
let SharedBody::Scenario { steps, .. } = baseline.elements[&id(0x50)].shared().unwrap() else { panic!("scenario required") };
assert_eq!(steps, &vec![id(0x60),id(0x61),id(0x62),id(0x63)]);
assert_eq!(manifest["invariants"]["scenarioSteps"], json!(steps));
assert_derived(&baseline, 0x60, 0x61, 0x41, 0x20); assert_derived(&baseline, 0x62, 0x63, 0x42, 0x30);
assert_eq!(manifest["baselineMessages"][1]["derivedAllocation"], json!(id(0x41)));
assert_eq!(manifest["baselineMessages"][3]["derivedAllocation"], json!(id(0x42)));
let mut session = Session::try_new(baseline.clone()).expect("core admission");
assert!(!session.dirty() && !session.can_undo() && !session.can_redo());
assert_eq!(full(session.project()), baseline_json);
put(out, "baseline.project.json", baseline_json.as_bytes());
let edits = manifest["acceptedEditsInOrder"].as_array().unwrap();
assert_eq!(edits.iter().map(|e| e["task"].as_str().unwrap()).collect::<Vec<_>>(), ["1","3a","3b","3c","3d"]);
let mut expected = baseline.clone(); let mut records = Vec::new(); let mut rejection = Value::Null;
for edit in edits {
let task = edit["task"].as_str().unwrap(); let previous = expected.clone();
expected = expected_after(&previous, task);
let revision = session.revision();
session.execute(manifest_command(session.project(), edit)).unwrap();
assert_eq!(session.revision(), revision + 1); assert!(session.dirty());
assert_eq!(full(session.project()), full(&expected), "complete Project after {task}");
assert_eq!(session.project().elements[&id(0x62)], baseline.elements[&id(0x62)]);
assert_eq!(session.project().elements[&id(0x63)], baseline.elements[&id(0x63)]);
let changed = matches!(task, "3b" | "3c" | "3d");
assert_derived(session.project(), 0x60, 0x61, if changed {0x42} else {0x41}, if changed {0x30} else {0x20});
assert_derived(session.project(), 0x62, 0x63, 0x42, 0x30);
if task == "1" {
let rejected = &manifest["rejectedEdit"];
assert_eq!(rejected["afterTask"], "1"); assert_eq!(rejected["owner"], json!(id(0x60)));
assert_eq!(rejected["proposedAllocation"], json!(id(0x42)));
assert_eq!(rejected["retainedIncompatibleFields"], json!([
{"occurrence":id(0x60),"field":id(0x21)}, {"occurrence":id(0x61),"field":id(0x22)}
]));
let proposal = json!({"owner":rejected["owner"],"replace":{"operation":{"allocation":rejected["proposedAllocation"]}}});
let before = (full(session.project()), session.revision(), session.dirty(), session.can_undo(), session.can_redo());
let error = session.execute(manifest_command(session.project(), &proposal)).expect_err("retained incompatible values must be rejected");
assert_eq!((full(session.project()), session.revision(), session.dirty(), session.can_undo(), session.can_redo()), before);
rejection = json!({"status":"rejected_without_mutation","error":error.to_string(),"after_task":"1"});
}
// One undo must recover the exact previous Project, including after the
// failed operation change. Redo must recover exactly this accepted record.
session.undo(); assert_eq!(full(session.project()), full(&previous));
assert!(session.can_redo());
if task == "1" { assert!(!session.can_undo() && !session.dirty()); }
session.redo(); assert_eq!(full(session.project()), full(&expected)); assert!(!session.can_redo());
put(out, &format!("after-{task}.actual.project.json"), full(session.project()).as_bytes());
put(out, &format!("after-{task}.expected.project.json"), full(&expected).as_bytes());
records.push(json!({"task":task,"complete_project_equal":true,"one_undo_redo_exact":true,"reply_derivation_exact":true}));
}
// Drain actual history as an additional check that no hidden failed/no-op
// transaction inserted a second state. Exactly five accepted records exist.
let mut expected_stack = vec![baseline.clone()];
for task in ["1","3a","3b","3c","3d"] { expected_stack.push(expected_after(expected_stack.last().unwrap(), task)); }
for p in expected_stack[..5].iter().rev() { assert!(session.can_undo()); session.undo(); assert_eq!(full(session.project()), full(p)); }
assert!(!session.can_undo() && !session.dirty());
for p in expected_stack[1..].iter() { assert!(session.can_redo()); session.redo(); assert_eq!(full(session.project()), full(p)); }
assert!(!session.can_redo());
assert_eq!(full(&baseline), baseline_json);
assert_eq!(fs::read(source_path).unwrap(), SOURCE); assert_eq!(fs::read(manifest_path).unwrap(), EXPECTATIONS);
let report = json!({"schema":"service_details_core_probe_v1","status":"passed","fixture_core_admitted":true,
"source_bundle_unchanged_on_compile":true,"accepted":records,"rejected":rejection,"history_depth":5,
"scope":"Real source load/compile/core Session only. No desktop SourceBundle edits, property-form recovery, native interaction, Save or reopen evidence."});
put(out, "result.json", &serde_json::to_vec_pretty(&report).unwrap());
println!("SERVICE_DETAILS_CORE_PROBE_JSON={report}");
}
@@ -0,0 +1,67 @@
[
{
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\baseline-and-edits.json",
"bytes": 4666,
"sha256": "6670cd0a07c109dde46128bd094a12d00ea008fc65efd73ad9477efcff976063"
},
{
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\build-core-probe.ps1",
"bytes": 10633,
"sha256": "85b0a3cb25292573076a5e395dcfe08b4b179b5f44d510225247b43e20fddde3"
},
{
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\core-build-02\\build-receipt.json",
"bytes": 2661,
"sha256": "7d9b4ac133d54bb43da2db8646c75ba25419bfe3dbb3331e3eee17834f5ba8a0"
},
{
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\core-build-02\\compile.log",
"bytes": 0,
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
{
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\core-build-02\\inputs-after.json",
"bytes": 231766,
"sha256": "5618c35cf166d47caf0668d34b87af5a79ab4efd9f1db073ab9a7b06fa026ca3"
},
{
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\core-build-02\\inputs-before.json",
"bytes": 231766,
"sha256": "5618c35cf166d47caf0668d34b87af5a79ab4efd9f1db073ab9a7b06fa026ca3"
},
{
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\core-build-02\\libunwind.dll",
"bytes": 190464,
"sha256": "aa282fa47bb2c4e210cea5e470cdbdca58568f0be0bc73e404d86ab9cd95ef6a"
},
{
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\core-build-02\\service-details-core-probe.exe",
"bytes": 19905536,
"sha256": "7d80f9bca005a9aee7f985235fa520f3e25fe0192d44d00696c2da8b8cb6c439"
},
{
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\core-build-02\\toolchain.json",
"bytes": 784,
"sha256": "1f3f645058e5021f9c50e8301d21f7a07fa2b4a49eebafa386f83dedeba2730f"
},
{
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\core-probe.rs",
"bytes": 13615,
"sha256": "7a8a63557b24066243848d907763883396c89cc766e5a34227ed766bc2a56a1c"
},
{
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\run-core-probe.ps1",
"bytes": 9902,
"sha256": "935945d4d329e1cec04ae21247aae31590f2f40019969812e728d8a78fafb1ae"
},
{
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\service-details.arcadia",
"bytes": 6132,
"sha256": "0e4325222a451b9d4e503974ce86bb95a9931edd0d2d65b8cd9db8d0f99d69e5"
},
{
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-spacing-gates-attempt3-20260913\\list-receipt.json",
"bytes": 158385,
"sha256": "0b3ae67b7826d30bd9c32b1addd03b2529297baa3b91ded3398b7e4f32a27eef"
}
]
@@ -0,0 +1,67 @@
[
{
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\baseline-and-edits.json",
"bytes": 4666,
"sha256": "6670cd0a07c109dde46128bd094a12d00ea008fc65efd73ad9477efcff976063"
},
{
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\build-core-probe.ps1",
"bytes": 10633,
"sha256": "85b0a3cb25292573076a5e395dcfe08b4b179b5f44d510225247b43e20fddde3"
},
{
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\core-build-02\\build-receipt.json",
"bytes": 2661,
"sha256": "7d9b4ac133d54bb43da2db8646c75ba25419bfe3dbb3331e3eee17834f5ba8a0"
},
{
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\core-build-02\\compile.log",
"bytes": 0,
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
{
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\core-build-02\\inputs-after.json",
"bytes": 231766,
"sha256": "5618c35cf166d47caf0668d34b87af5a79ab4efd9f1db073ab9a7b06fa026ca3"
},
{
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\core-build-02\\inputs-before.json",
"bytes": 231766,
"sha256": "5618c35cf166d47caf0668d34b87af5a79ab4efd9f1db073ab9a7b06fa026ca3"
},
{
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\core-build-02\\libunwind.dll",
"bytes": 190464,
"sha256": "aa282fa47bb2c4e210cea5e470cdbdca58568f0be0bc73e404d86ab9cd95ef6a"
},
{
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\core-build-02\\service-details-core-probe.exe",
"bytes": 19905536,
"sha256": "7d80f9bca005a9aee7f985235fa520f3e25fe0192d44d00696c2da8b8cb6c439"
},
{
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\core-build-02\\toolchain.json",
"bytes": 784,
"sha256": "1f3f645058e5021f9c50e8301d21f7a07fa2b4a49eebafa386f83dedeba2730f"
},
{
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\core-probe.rs",
"bytes": 13615,
"sha256": "7a8a63557b24066243848d907763883396c89cc766e5a34227ed766bc2a56a1c"
},
{
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\run-core-probe.ps1",
"bytes": 9902,
"sha256": "935945d4d329e1cec04ae21247aae31590f2f40019969812e728d8a78fafb1ae"
},
{
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\service-details.arcadia",
"bytes": 6132,
"sha256": "0e4325222a451b9d4e503974ce86bb95a9931edd0d2d65b8cd9db8d0f99d69e5"
},
{
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-spacing-gates-attempt3-20260913\\list-receipt.json",
"bytes": 158385,
"sha256": "0b3ae67b7826d30bd9c32b1addd03b2529297baa3b91ded3398b7e4f32a27eef"
}
]
@@ -0,0 +1,68 @@
[
{
"task": "1",
"changes": [
{
"path": "/elements/80300000-0000-4000-8000-000000000060/body/Sa/Shared/Occurrence/body/Exchange/values/0/expression",
"before": "\"primary\"",
"after": "\"secondary\""
}
]
},
{
"task": "3a",
"changes": [
{
"path": "/elements/80300000-0000-4000-8000-000000000061/body/Sa/Shared/Occurrence/body/Exchange/values/0",
"before": {
"expression": "\"READY\"",
"field": "80300000-0000-4000-8000-000000000022",
"path": []
}
}
]
},
{
"task": "3b",
"changes": [
{
"path": "/elements/80300000-0000-4000-8000-000000000060/body/Sa/Shared/Occurrence/body/Exchange/operation/allocation",
"before": "80300000-0000-4000-8000-000000000041",
"after": "80300000-0000-4000-8000-000000000042"
},
{
"path": "/elements/80300000-0000-4000-8000-000000000060/body/Sa/Shared/Occurrence/body/Exchange/values/0/expression",
"before": "\"secondary\"",
"after": "18.75"
},
{
"path": "/elements/80300000-0000-4000-8000-000000000060/body/Sa/Shared/Occurrence/body/Exchange/values/0/field",
"before": "80300000-0000-4000-8000-000000000021",
"after": "80300000-0000-4000-8000-000000000031"
}
]
},
{
"task": "3c",
"changes": [
{
"path": "/elements/80300000-0000-4000-8000-000000000061/body/Sa/Shared/Occurrence/body/Exchange/values/0",
"after": {
"expression": "true",
"field": "80300000-0000-4000-8000-000000000032",
"path": []
}
}
]
},
{
"task": "3d",
"changes": [
{
"path": "/elements/80300000-0000-4000-8000-000000000060/body/Sa/Shared/Occurrence/body/Exchange/values/0/expression",
"before": "18.75",
"after": "19.25"
}
]
}
]
@@ -0,0 +1,45 @@
{
"accepted": [
{
"complete_project_equal": true,
"one_undo_redo_exact": true,
"reply_derivation_exact": true,
"task": "1"
},
{
"complete_project_equal": true,
"one_undo_redo_exact": true,
"reply_derivation_exact": true,
"task": "3a"
},
{
"complete_project_equal": true,
"one_undo_redo_exact": true,
"reply_derivation_exact": true,
"task": "3b"
},
{
"complete_project_equal": true,
"one_undo_redo_exact": true,
"reply_derivation_exact": true,
"task": "3c"
},
{
"complete_project_equal": true,
"one_undo_redo_exact": true,
"reply_derivation_exact": true,
"task": "3d"
}
],
"fixture_core_admitted": true,
"history_depth": 5,
"rejected": {
"after_task": "1",
"error": "message_value_field: The qualified field must be carried by the exchange, following Value record fields only.",
"status": "rejected_without_mutation"
},
"schema": "service_details_core_probe_v1",
"scope": "Real source load/compile/core Session only. No desktop SourceBundle edits, property-form recovery, native interaction, Save or reopen evidence.",
"source_bundle_unchanged_on_compile": true,
"status": "passed"
}
@@ -0,0 +1,137 @@
{
"command": [
"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\core-build-02\\service-details-core-probe.exe",
"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\service-details.arcadia",
"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\baseline-and-edits.json",
"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\core-run-01\\probe-output"
],
"exit_code": 0,
"process_id": 8896,
"report": {
"accepted": [
{
"complete_project_equal": true,
"one_undo_redo_exact": true,
"reply_derivation_exact": true,
"task": "1"
},
{
"complete_project_equal": true,
"one_undo_redo_exact": true,
"reply_derivation_exact": true,
"task": "3a"
},
{
"complete_project_equal": true,
"one_undo_redo_exact": true,
"reply_derivation_exact": true,
"task": "3b"
},
{
"complete_project_equal": true,
"one_undo_redo_exact": true,
"reply_derivation_exact": true,
"task": "3c"
},
{
"complete_project_equal": true,
"one_undo_redo_exact": true,
"reply_derivation_exact": true,
"task": "3d"
}
],
"fixture_core_admitted": true,
"history_depth": 5,
"rejected": {
"after_task": "1",
"error": "message_value_field: The qualified field must be carried by the exchange, following Value record fields only.",
"status": "rejected_without_mutation"
},
"schema": "service_details_core_probe_v1",
"scope": "Real source load/compile/core Session only. No desktop SourceBundle edits, property-form recovery, native interaction, Save or reopen evidence.",
"source_bundle_unchanged_on_compile": true,
"status": "passed"
},
"end_utc": "2026-09-13T11:38:31.9384161Z",
"before_manifest_sha256": "d7e3bc1dc1ce30923451e475d6490ed8630fba6623ba30f52b35acbb0fda5325",
"schema": "service_details_core_run_v1",
"failure": null,
"after_manifest_sha256": "d7e3bc1dc1ce30923451e475d6490ed8630fba6623ba30f52b35acbb0fda5325",
"source_commit": "0409a481c7571e887f8912f0a8cdb93cfdcc01a7",
"inputs_unchanged": true,
"scope": "Core admission/commands/history only; no native, Details-form, source-write, Save or reopen acceptance.",
"artifacts": [
{
"sha256": "15b0c6e16d704b0e375b301952974b84ae5655ae782bad4c974abe0b68df8e01",
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\core-run-01\\stdout.log",
"bytes": 1040
},
{
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\core-run-01\\stderr.log",
"bytes": 0
},
{
"sha256": "c03cf59f83bc1ae4db64584abf1257efc775cc47b49f2b2db4ac47159dfb90a0",
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\core-run-01\\probe-output\\after-1.actual.project.json",
"bytes": 10578
},
{
"sha256": "c03cf59f83bc1ae4db64584abf1257efc775cc47b49f2b2db4ac47159dfb90a0",
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\core-run-01\\probe-output\\after-1.expected.project.json",
"bytes": 10578
},
{
"sha256": "ce3d58385815d0a1d01320bdd711d707cb4c530f0614545eca2b83533077b6f0",
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\core-run-01\\probe-output\\after-3a.actual.project.json",
"bytes": 10495
},
{
"sha256": "ce3d58385815d0a1d01320bdd711d707cb4c530f0614545eca2b83533077b6f0",
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\core-run-01\\probe-output\\after-3a.expected.project.json",
"bytes": 10495
},
{
"sha256": "81f16c54db0e7be1960be5de6a89a6e16a56d6c62d45e15aa7f59bc9d85c8925",
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\core-run-01\\probe-output\\after-3b.actual.project.json",
"bytes": 10487
},
{
"sha256": "81f16c54db0e7be1960be5de6a89a6e16a56d6c62d45e15aa7f59bc9d85c8925",
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\core-run-01\\probe-output\\after-3b.expected.project.json",
"bytes": 10487
},
{
"sha256": "3c4521eef6cf2a6024275f8c6bf5e9a55d7f6e10cb58c9cc846be56cfa121aca",
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\core-run-01\\probe-output\\after-3c.actual.project.json",
"bytes": 10565
},
{
"sha256": "3c4521eef6cf2a6024275f8c6bf5e9a55d7f6e10cb58c9cc846be56cfa121aca",
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\core-run-01\\probe-output\\after-3c.expected.project.json",
"bytes": 10565
},
{
"sha256": "36dfe596c1e2f39a82795237f545787996e9138d9c160217611b201da14ce66a",
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\core-run-01\\probe-output\\after-3d.actual.project.json",
"bytes": 10565
},
{
"sha256": "36dfe596c1e2f39a82795237f545787996e9138d9c160217611b201da14ce66a",
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\core-run-01\\probe-output\\after-3d.expected.project.json",
"bytes": 10565
},
{
"sha256": "e59d4f08fda2bae23ca2b84bda0c8679703b1b75a0b7c1916b2f49d2762a90c6",
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\core-run-01\\probe-output\\baseline.project.json",
"bytes": 10576
},
{
"sha256": "4e4d209fd14fd5027e72336c4e1aef97632a9211a84dceff05d9b780d6df82d5",
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-details-native-preparation-20260913\\core-run-01\\probe-output\\result.json",
"bytes": 1274
}
],
"start_utc": "2026-09-13T11:38:26.3003189Z",
"report_valid": true
}
@@ -0,0 +1 @@
SERVICE_DETAILS_CORE_PROBE_JSON={"accepted":[{"complete_project_equal":true,"one_undo_redo_exact":true,"reply_derivation_exact":true,"task":"1"},{"complete_project_equal":true,"one_undo_redo_exact":true,"reply_derivation_exact":true,"task":"3a"},{"complete_project_equal":true,"one_undo_redo_exact":true,"reply_derivation_exact":true,"task":"3b"},{"complete_project_equal":true,"one_undo_redo_exact":true,"reply_derivation_exact":true,"task":"3c"},{"complete_project_equal":true,"one_undo_redo_exact":true,"reply_derivation_exact":true,"task":"3d"}],"fixture_core_admitted":true,"history_depth":5,"rejected":{"after_task":"1","error":"message_value_field: The qualified field must be carried by the exchange, following Value record fields only.","status":"rejected_without_mutation"},"schema":"service_details_core_probe_v1","scope":"Real source load/compile/core Session only. No desktop SourceBundle edits, property-form recovery, native interaction, Save or reopen evidence.","source_bundle_unchanged_on_compile":true,"status":"passed"}
@@ -0,0 +1,35 @@
{
"status": "prepared only; static identity/lexical checks are not core parsing or validation",
"sourcePin": "0409a481c7571e887f8912f0a8cdb93cfdcc01a7",
"preparedUtc": "2026-09-13T10:35:59.375Z",
"declarationCount": 28,
"referenceOccurrences": 61,
"staticChecks": {
"uniqueIds": true,
"uniqueAliases": true,
"allAliasReferencesDeclared": true,
"balancedBracesOutsideStrings": true
},
"files": [
{
"path": "service-details.arcadia",
"bytes": 6132,
"sha256": "0e4325222a451b9d4e503974ce86bb95a9931edd0d2d65b8cd9db8d0f99d69e5"
},
{
"path": "README.md",
"bytes": 7075,
"sha256": "f7b31d73cea87a57c21654ed7c8ed5d38579285f8c8f490fe173a5dcf327dbc0"
},
{
"path": "baseline-and-edits.json",
"bytes": 4666,
"sha256": "6670cd0a07c109dde46128bd094a12d00ea008fc65efd73ad9477efcff976063"
}
],
"referenceProbe": {
"path": "harness/fixtures/interface-operation-probe/output/boundary-only.json",
"sha256": "756f9710336e6734ce3592ca774c6f104bba5a37c9e165540eb39326682393d1",
"schema": 6
}
}
@@ -0,0 +1,132 @@
#Requires -Version 7.0
[CmdletBinding()]
param(
[Parameter(Mandatory=$true)][string]$BuildDirectory,
[Parameter(Mandatory=$true)][string]$Output
)
Set-StrictMode -Version Latest
$ErrorActionPreference='Stop'
function Hash([string]$Path){(Get-FileHash -LiteralPath $Path -Algorithm SHA256).Hash.ToLowerInvariant()}
function Json([string]$Path){Get-Content -Raw -LiteralPath $Path | ConvertFrom-Json}
function Save([string]$Name,$Value){
$stream=[IO.File]::Open((Join-Path $Output $Name),[IO.FileMode]::CreateNew,[IO.FileAccess]::Write,[IO.FileShare]::Read)
try{$bytes=[Text.UTF8Encoding]::new($false).GetBytes(($Value|ConvertTo-Json -Depth 30)+"`n");$stream.Write($bytes,0,$bytes.Length);$stream.Flush($true)}finally{$stream.Dispose()}
}
function Keys($Object,[string[]]$Expected){
if((@($Object.PSObject.Properties.Name|Sort-Object) -join '|') -cne (@($Expected|Sort-Object) -join '|')){throw 'Unexpected result object keys'}
}
$BuildDirectory=(Resolve-Path -LiteralPath $BuildDirectory).Path
$Output=[IO.Path]::GetFullPath($Output)
if(Test-Path -LiteralPath $Output){throw 'Run output must be new; preserve every prior attempt'}
$receiptPath=Join-Path $BuildDirectory 'build-receipt.json'
$build=Json $receiptPath
if($build.source_commit -cne '0409a481c7571e887f8912f0a8cdb93cfdcc01a7' -or $build.exit_code -ne 0 -or $build.inputs_unchanged -ne $true -or $null -ne $build.postflight_failure -or $build.tests_executed -ne $false){throw 'An unchanged successful core probe build is required'}
$exe=Join-Path $BuildDirectory 'service-details-core-probe.exe'
$runtime=Join-Path $BuildDirectory 'libunwind.dll'
if($build.binary.path -ine $exe -or (Get-Item -LiteralPath $exe).Length -ne $build.binary.bytes -or (Hash $exe) -cne $build.binary.sha256 -or (Hash $runtime) -cne $build.runtime_sha256){throw 'Built executable or runtime changed'}
$buildBefore=Join-Path $BuildDirectory 'inputs-before.json'
$buildAfter=Join-Path $BuildDirectory 'inputs-after.json'
if((Hash $buildBefore) -cne $build.before_manifest_sha256 -or (Hash $buildAfter) -cne $build.after_manifest_sha256){throw 'Build input manifests changed'}
$original=@(Json $buildBefore)
if(($original|ConvertTo-Json -Depth 10 -Compress) -cne ((Json $buildAfter)|ConvertTo-Json -Depth 10 -Compress)){throw 'Build input records differ'}
$fixture=Join-Path $PSScriptRoot 'service-details.arcadia'
$expectations=Join-Path $PSScriptRoot 'baseline-and-edits.json'
$source=Join-Path $PSScriptRoot 'core-probe.rs'
$builder=Join-Path $PSScriptRoot 'build-core-probe.ps1'
foreach($path in @($fixture,$expectations,$source,$builder)){
$bound=@($original|Where-Object {$_.path -ieq $path})
if($bound.Count -ne 1 -or (Get-Item -LiteralPath $path).Length -ne $bound[0].bytes -or (Hash $path) -cne $bound[0].sha256){throw ('Prepared source differs from the actual build: '+$path)}
}
$toolchainPath=Join-Path $BuildDirectory 'toolchain.json'
$compileLog=Join-Path $BuildDirectory 'compile.log'
if((Hash $toolchainPath) -cne $build.toolchain_sha256 -or (Hash $compileLog) -cne $build.compile_log_sha256 -or (Hash $build.reference_receipt) -cne $build.reference_receipt_sha256){throw 'Build provenance changed'}
$paths=@($PSCommandPath,$receiptPath,$buildBefore,$buildAfter,$toolchainPath,$compileLog,$build.reference_receipt,$exe,$runtime,$fixture,$expectations,$source,$builder)
function Inputs {
@($paths|ForEach-Object {(Resolve-Path -LiteralPath $_).Path}|Sort-Object -Unique|ForEach-Object {$item=Get-Item -LiteralPath $_;[ordered]@{path=$item.FullName;bytes=$item.Length;sha256=(Hash $item.FullName)}})
}
# New-Item without Force rejects an existing directory; all files below use
# CreateNew. The probe itself creates its separate, initially absent child.
[void](New-Item -ItemType Directory -Path $Output -ErrorAction Stop)
$probeOutput=Join-Path $Output 'probe-output'
$stdoutPath=Join-Path $Output 'stdout.log'
$stderrPath=Join-Path $Output 'stderr.log'
$before=@(Inputs);Save 'inputs-before.json' $before
$start=[DateTime]::UtcNow.ToString('o')
$exitCode=$null;$processId=$null;$failure=$null;$unchanged=$false;$reportValid=$false;$report=$null;$outputs=@()
$stdout=$null;$stderr=$null;$process=$null
try{
$stdout=[IO.File]::Open($stdoutPath,[IO.FileMode]::CreateNew,[IO.FileAccess]::Write,[IO.FileShare]::Read)
$stderr=[IO.File]::Open($stderrPath,[IO.FileMode]::CreateNew,[IO.FileAccess]::Write,[IO.FileShare]::Read)
$info=[Diagnostics.ProcessStartInfo]::new()
$info.FileName=$exe;$info.WorkingDirectory=$Output;$info.UseShellExecute=$false;$info.CreateNoWindow=$true
$info.RedirectStandardOutput=$true;$info.RedirectStandardError=$true
foreach($argument in @($fixture,$expectations,$probeOutput)){$info.ArgumentList.Add($argument)}
$process=[Diagnostics.Process]::new();$process.StartInfo=$info
if(-not $process.Start()){throw 'Core probe process did not start'}
$processId=$process.Id
# Drain both byte streams concurrently, preserving original output bytes.
$stdoutCopy=$process.StandardOutput.BaseStream.CopyToAsync($stdout)
$stderrCopy=$process.StandardError.BaseStream.CopyToAsync($stderr)
$process.WaitForExit()
$stdoutCopy.GetAwaiter().GetResult();$stderrCopy.GetAwaiter().GetResult()
$exitCode=$process.ExitCode
$stdout.Flush($true);$stderr.Flush($true)
$stdout.Dispose();$stdout=$null;$stderr.Dispose();$stderr=$null
if($exitCode -ne 0){throw ('Core probe failed with exit '+$exitCode)}
$reportPath=Join-Path $probeOutput 'result.json'
$report=Json $reportPath
Keys $report @('schema','status','fixture_core_admitted','source_bundle_unchanged_on_compile','accepted','rejected','history_depth','scope')
if($report.schema -cne 'service_details_core_probe_v1' -or $report.status -cne 'passed' -or $report.fixture_core_admitted -ne $true -or $report.source_bundle_unchanged_on_compile -ne $true -or $report.history_depth -ne 5){throw 'Core report did not complete all admission/history checks'}
$tasks=@('1','3a','3b','3c','3d')
if(@($report.accepted).Count -ne 5 -or (@($report.accepted|ForEach-Object task) -join '|') -cne ($tasks -join '|')){throw 'Accepted edit membership differs'}
foreach($record in $report.accepted){
Keys $record @('task','complete_project_equal','one_undo_redo_exact','reply_derivation_exact')
if($record.complete_project_equal -ne $true -or $record.one_undo_redo_exact -ne $true -or $record.reply_derivation_exact -ne $true){throw 'An accepted record did not pass'}
}
Keys $report.rejected @('status','error','after_task')
if($report.rejected.status -cne 'rejected_without_mutation' -or $report.rejected.after_task -cne '1' -or [string]::IsNullOrWhiteSpace($report.rejected.error)){throw 'Rejection check did not complete'}
if($report.scope -cne 'Real source load/compile/core Session only. No desktop SourceBundle edits, property-form recovery, native interaction, Save or reopen evidence.'){throw 'Unexpected evaluator scope'}
$lines=@(Get-Content -LiteralPath $stdoutPath|Where-Object {$_ -cmatch '^SERVICE_DETAILS_CORE_PROBE_JSON='})
if($lines.Count -ne 1){throw 'Expected exactly one completed stdout report'}
$stdoutReport=$lines[0].Substring('SERVICE_DETAILS_CORE_PROBE_JSON='.Length)|ConvertFrom-Json
if(($stdoutReport|ConvertTo-Json -Depth 30 -Compress) -cne ($report|ConvertTo-Json -Depth 30 -Compress)){throw 'Stdout report differs from result.json'}
$expectedNames=@('baseline.project.json','result.json')
foreach($task in $tasks){
$actualName='after-'+$task+'.actual.project.json';$expectedName='after-'+$task+'.expected.project.json'
$expectedNames+=@($actualName,$expectedName)
if((Hash (Join-Path $probeOutput $actualName)) -cne (Hash (Join-Path $probeOutput $expectedName))){throw ('Complete Project artifacts differ for '+$task)}
}
$actualNames=@(Get-ChildItem -LiteralPath $probeOutput|ForEach-Object Name)
if((@($actualNames|Sort-Object) -join '|') -cne (@($expectedNames|Sort-Object) -join '|')){throw 'Missing or unexpected probe artifacts'}
$reportValid=$true
}catch{$failure=$_.Exception.Message}
finally{
if($null -ne $stdout){$stdout.Dispose()};if($null -ne $stderr){$stderr.Dispose()}
if($null -ne $process){
if($null -ne $processId -and -not $process.HasExited){$process.WaitForExit()}
if($null -ne $processId -and $null -eq $exitCode){$exitCode=$process.ExitCode}
$process.Dispose()
}
}
$end=[DateTime]::UtcNow.ToString('o')
try{
$after=@(Inputs);Save 'inputs-after.json' $after
if(($before|ConvertTo-Json -Depth 10 -Compress) -cne ($after|ConvertTo-Json -Depth 10 -Compress)){throw 'A bound run input changed'}
$unchanged=$true
}catch{$failure=(@($failure,$_.Exception.Message)|Where-Object {$_}) -join '; '}
foreach($path in @($stdoutPath,$stderrPath)){
if(Test-Path -LiteralPath $path){$item=Get-Item -LiteralPath $path;$outputs+=@{path=$item.FullName;bytes=$item.Length;sha256=(Hash $path)}}
}
if(Test-Path -LiteralPath $probeOutput){
foreach($item in Get-ChildItem -LiteralPath $probeOutput -File){$outputs+=@{path=$item.FullName;bytes=$item.Length;sha256=(Hash $item.FullName)}}
}
Save 'run-receipt.json' @{
schema='service_details_core_run_v1';source_commit=$build.source_commit;command=@($exe,$fixture,$expectations,$probeOutput)
process_id=$processId;start_utc=$start;end_utc=$end;exit_code=$exitCode;inputs_unchanged=$unchanged
report_valid=$reportValid;failure=$failure;report=$report;artifacts=$outputs
before_manifest_sha256=(Hash (Join-Path $Output 'inputs-before.json'))
after_manifest_sha256=if(Test-Path (Join-Path $Output 'inputs-after.json')){Hash (Join-Path $Output 'inputs-after.json')}else{$null}
scope='Core admission/commands/history only; no native, Details-form, source-write, Save or reopen acceptance.'
}
if($exitCode -ne 0 -or -not $unchanged -or -not $reportValid -or $null -ne $failure){throw 'Core probe or evidence validation failed; preserve this complete attempt'}
Write-Output 'Core probe passed with unchanged bound inputs; native and property-form behavior remain untested.'
@@ -0,0 +1,113 @@
arcadia 7;
project service_details "Valve service Details trial" id "80300000-0000-4000-8000-000000000000" {
sa_actor console "Operator console" id "80300000-0000-4000-8000-000000000001" {}
sa_system valve "Valve service" id "80300000-0000-4000-8000-000000000002" {}
sa_port caller_port "Console service client" id "80300000-0000-4000-8000-000000000003" {
parent @console; contract { Component { kind Standard; orientation Unset; }; };
}
sa_port provider_port "Valve service endpoint" id "80300000-0000-4000-8000-000000000004" {
parent @valve; contract { Component { kind Standard; orientation Unset; }; };
}
sa_data_type text_value "Service text" id "80300000-0000-4000-8000-000000000010" {
definition { String { minimum_length 0; maximum_length 128; }; };
}
sa_data_type pressure_value "Pressure in bar" id "80300000-0000-4000-8000-000000000011" {
definition { Real { minimum 0; maximum 100; }; }; unit "bar";
}
sa_data_type accepted_value "Acceptance flag" id "80300000-0000-4000-8000-000000000012" { definition Boolean; }
sa_exchange_item read_status "ReadStatus" id "80300000-0000-4000-8000-000000000020" {
kind Information; mechanism Operation;
}
sa_data_field read_scope "Scope" id "80300000-0000-4000-8000-000000000021" {
parent @read_status; type_ref { Named @text_value; }; direction In;
minimum 0; maximum 1; storage Value;
}
sa_data_field read_result "Status" id "80300000-0000-4000-8000-000000000022" {
parent @read_status; type_ref { Named @text_value; }; direction Return;
minimum 0; maximum 1; storage Value;
}
sa_exchange_item set_limit "SetLimit" id "80300000-0000-4000-8000-000000000030" {
kind Information; mechanism Operation;
}
sa_data_field limit_value "Pressure limit" id "80300000-0000-4000-8000-000000000031" {
parent @set_limit; type_ref { Named @pressure_value; }; direction In;
minimum 0; maximum 1; storage Value;
}
sa_data_field limit_accepted "Accepted" id "80300000-0000-4000-8000-000000000032" {
parent @set_limit; type_ref { Named @accepted_value; }; direction Return;
minimum 0; maximum 1; storage Value;
}
sa_interface valve_api "Valve commands" id "80300000-0000-4000-8000-000000000040" {}
interface_item_allocation read_allocation "ReadStatus allocation" id "80300000-0000-4000-8000-000000000041" {
source @valve_api; target @read_status; order 0;
transmission Synchronous; acquisition Accept;
}
interface_item_allocation limit_allocation "SetLimit allocation" id "80300000-0000-4000-8000-000000000042" {
source @valve_api; target @set_limit; order 1;
transmission Synchronous; acquisition Accept;
}
interface_requirement requires_api "Console requires Valve commands" id "80300000-0000-4000-8000-000000000043" {
source @caller_port; target @valve_api;
}
interface_provision provides_api "Valve provides Valve commands" id "80300000-0000-4000-8000-000000000044" {
source @provider_port; target @valve_api;
}
boundary_exchange service_channel "Valve service channel" id "80300000-0000-4000-8000-000000000045" {
source @caller_port; target @provider_port; oriented false;
items [@read_status, @set_limit];
}
sa_scenario service_review "Review service calls" id "80300000-0000-4000-8000-000000000050" {
viewpoint BoundaryInterface;
steps [@first_call, @first_reply, @control_call, @control_reply];
}
sa_lifeline caller "Console caller" id "80300000-0000-4000-8000-000000000051" {
parent @service_review; represented @console;
}
sa_lifeline provider "Valve provider" id "80300000-0000-4000-8000-000000000052" {
parent @service_review; represented @valve;
}
sa_occurrence first_call "Read primary status" id "80300000-0000-4000-8000-000000000060" {
parent @service_review;
body { Exchange {
exchange @service_channel; sender @caller; receiver @provider; message_kind Call;
operation { allocation @read_allocation; };
values [{ path []; field @read_scope; expression "\"primary\""; }];
}; };
}
sa_occurrence first_reply "Primary status response" id "80300000-0000-4000-8000-000000000061" {
parent @service_review;
body { Exchange {
exchange @service_channel; sender @provider; receiver @caller;
message_kind Reply; reply_to @first_call;
values [{ path []; field @read_result; expression "\"READY\""; }];
}; };
}
sa_occurrence control_call "Set reserve limit" id "80300000-0000-4000-8000-000000000062" {
parent @service_review;
body { Exchange {
exchange @service_channel; sender @caller; receiver @provider; message_kind Call;
operation { allocation @limit_allocation; };
values [{ path []; field @limit_value; expression "12.5"; }];
}; };
}
sa_occurrence control_reply "Reserve limit accepted" id "80300000-0000-4000-8000-000000000063" {
parent @service_review;
body { Exchange {
exchange @service_channel; sender @provider; receiver @caller;
message_kind Reply; reply_to @control_call;
values [{ path []; field @limit_accepted; expression "true"; }];
}; };
}
diagram service_details_view "Service calls - Details trial" id "80300000-0000-4000-8000-000000000070" {
layer Sa; projection { Scenario { scenario @service_review; }; };
layout { Scenario {
lanes [{ lifeline @caller; x 160; }, { lifeline @provider; x 650; }];
messages [
{ address { references []; occurrence @first_call; }; send_y 160; },
{ address { references []; occurrence @first_reply; }; send_y 270; },
{ address { references []; occurrence @control_call; }; send_y 390; },
{ address { references []; occurrence @control_reply; }; send_y 500; }
];
}; };
}
}