Preserve c4 spacing gate failure and full diagnostic evidence
This commit is contained in:
@@ -0,0 +1 @@
|
||||
* -text -whitespace
|
||||
@@ -0,0 +1,31 @@
|
||||
# Closed Saved Scenario spacing gate — c4a2cf6
|
||||
|
||||
This archive preserves the Windows listing and failed focused gate for [c4a2cf63f11818cf7fc766acf3a2779768a2a658](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/commit/c4a2cf63f11818cf7fc766acf3a2779768a2a658), followed by a separately classified full-inventory diagnostic of the same already-built executable. It is failure evidence, not spacing acceptance. Parent ran the stages; this archive task ran no Cargo, compiler, tests or native input.
|
||||
|
||||
| Stage | Actual result |
|
||||
| --- | --- |
|
||||
| [List](original/list-receipt.json) | Cargo 0; 1,082 unique tests listed; exact focused membership 288/288. |
|
||||
| [Focused](original/focused-receipt.json) | 286 passed, 2 failed, 0 ignored, 794 filtered; 117.64 test seconds; Cargo 101. |
|
||||
| [Full-inventory diagnostic](diagnostic/diagnostic-all-receipt.json) | 1,076 passed, the same 2 failed, 4 ignored, 0 filtered; 765.34 test seconds; executable exit 101, runner exit 1. No compiler execution. |
|
||||
| Accepted full / strict / GUI build | None. The failed focused gate was not waived; strict and GUI build were not run. |
|
||||
|
||||
List ran 2026-09-13 09:00:52–09:44:11 UTC; focused 09:44:53–09:47:03 UTC; diagnostic 09:57:24–10:10:10 UTC. The focused receipt's selectionValid=false records failed outcomes: independent archive verification confirms all selected 288 tests executed exactly once. This is not a missing-test or selection-path failure. The diagnostic was copied only after parent confirmed terminal closure and its final receipt was verified.
|
||||
|
||||
## Recorded failures and separate correction
|
||||
|
||||
Both [focused](original/focused.log) and [diagnostic](diagnostic/diagnostic-all.log) logs record:
|
||||
|
||||
- behavior::scenario::presentation_tests::complete_fallback_scene_selects_but_cannot_capture_or_finish_coordinate_gestures — presentation_tests.rs:202:5, assertion input.press.is_some().
|
||||
- behavior::scenario::workspace::spacing_tests::saved_message_same_batch_pointer_events_commit_once_and_one_undo_redo_restores_exact_source — workspace/spacing_tests.rs:195:5, full-Project assertion. In the focused log, the sole Project difference is Saved A's updated_report send_y: actual 271.99994 versus expected 272.0; replacing that one value makes the complete debug strings identical.
|
||||
|
||||
[0409a481c7571e887f8912f0a8cdb93cfdcc01a7](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/commit/0409a481c7571e887f8912f0a8cdb93cfdcc01a7) is a separate, unexecuted test-correction candidate at archive preparation. It does not change the recorded c4 source or convert these outcomes into passes. Corrected source requires its own acceptance gates.
|
||||
|
||||
## Binding and scope
|
||||
|
||||
All five gate captures and three diagnostic captures contain the same 610 path/size/SHA-256 source records and nine external-input records. Raw list membership equals the expected 1,082 names; focused membership equals the selected 288; diagnostic membership equals the complete list, with exactly the same two failures. Archive verification checks stage-bound script/input hashes, raw-log and capture hashes, the focused-to-list receipt link, and diagnostic provenance links to the original gate.
|
||||
|
||||
The same desktop test executable is bound after list, before/after focused and before/after diagnostic: 150,361,088 bytes, SHA-256 cf31c674a7ef6c19dbe72f65c660030b5af6127d6450e35117ffc201ef813249. Diagnostic runtime libunwind.dll is 190,464 bytes, SHA-256 aa282fa47bb2c4e210cea5e470cdbdca58568f0be0bc73e404d86ab9cd95ef6a, identical before/after. Binaries are not copied here. The closed diagnostic receipt SHA-256 is c63e0ae818bd11a03ce68471f5cebe7d2ecce9a97dfbe73d7f006acede56b2da.
|
||||
|
||||
[Server provenance](original/server-provenance.json) retains the verified 57 server tests from 37be410 because core/server/manifests were unchanged. This attempt did not repeat server execution or establish strict acceptance. Preparation scripts and their machine paths describe the recorded environment; this archive is not a self-contained toolchain installation.
|
||||
|
||||
All 34 original gate files and 11 completed diagnostic files are preserved byte-for-byte, including preparation language and raw failure logs. [manifest.json](manifest.json) records sizes, SHA-256 and Git blob identities, plus the independent archive checks. Only archive README, manifest and binary-preserving .gitattributes are additional. No product source, original evidence, DECISIONS or older archive is changed.
|
||||
+47
@@ -0,0 +1,47 @@
|
||||
#Requires -Version 7.0
|
||||
param([Parameter(Mandatory=$true)][ValidatePattern('^(before|after|(list|focused|all|clippy|build|diagnostic|diagnostic-all)-(before|after))$')][string]$Stage)
|
||||
Set-StrictMode -Version Latest
|
||||
$ErrorActionPreference='Stop'
|
||||
$taskWorkspace='C:\Users\User\Documents\Git\ARCADIA-Studio\.local\scenario-spacing-ytr83r-20260913'
|
||||
$taskPin='c4a2cf63f11818cf7fc766acf3a2779768a2a658'
|
||||
function Hash-Input([string]$Path){(Get-FileHash -LiteralPath $Path -Algorithm SHA256).Hash.ToLowerInvariant()}
|
||||
$taskOutput=Join-Path $PSScriptRoot ('inputs-complete-'+$Stage+'.json')
|
||||
if(Test-Path -LiteralPath $taskOutput){throw 'Preserve existing input evidence; use a new directory for retries.'}
|
||||
$pinRecord=Get-Content -Raw -LiteralPath (Join-Path $PSScriptRoot 'expected-inputs.json')|ConvertFrom-Json
|
||||
$enumeration=Get-Content -Raw -LiteralPath (Join-Path $PSScriptRoot 'enumeration.json')|ConvertFrom-Json
|
||||
$external=Get-Content -Raw -LiteralPath (Join-Path $PSScriptRoot 'external-inputs.json')|ConvertFrom-Json
|
||||
if($pinRecord.base -cne $taskPin -or $enumeration.base -cne $taskPin -or $external.base -cne $taskPin){throw 'Wrong input pin.'}
|
||||
Push-Location -LiteralPath $taskWorkspace
|
||||
try {
|
||||
$taskBase=git rev-parse HEAD
|
||||
if($LASTEXITCODE -ne 0 -or $taskBase -cne $taskPin){throw 'Wrong source commit.'}
|
||||
$status=@(git status --porcelain)
|
||||
if($LASTEXITCODE -ne 0 -or $status.Count){throw 'Frozen worktree changed.'}
|
||||
$taskRoots=@($enumeration.rootInputs);$taskScopes=@($enumeration.scopes)
|
||||
$tracked=@(git ls-files -- @taskRoots @taskScopes)
|
||||
if($LASTEXITCODE -ne 0){throw 'Git enumeration failed.'}
|
||||
$tracked=@($tracked | ForEach-Object {$_.Replace('\','/')} | Sort-Object -Unique)
|
||||
$present=@(rg --files @taskScopes)
|
||||
if($LASTEXITCODE -ne 0){throw 'Actual input enumeration failed.'}
|
||||
$taskPaths=@(($present+$taskRoots) | ForEach-Object {$_.Replace('\','/')} | Sort-Object -Unique)
|
||||
if(@(Compare-Object $tracked $taskPaths).Count -or @(Compare-Object @($enumeration.gitPaths) $tracked).Count){throw 'Frozen input membership changed.'}
|
||||
$taskEntries=@($taskPaths | ForEach-Object {$item=Get-Item -LiteralPath $_;[ordered]@{path=$_;bytes=$item.Length;sha256=(Hash-Input $_)}})
|
||||
$externalNow=@(foreach($f in $external.files){
|
||||
$present=Test-Path -LiteralPath $f.path
|
||||
if($present -ne $f.present){throw ('External config presence changed: '+$f.path)}
|
||||
if($present){$item=Get-Item -LiteralPath $f.path;$hash=Hash-Input $f.path;if($item.Length -ne $f.bytes -or $hash -cne $f.sha256){throw ('External input changed: '+$f.path)};[ordered]@{path=$f.path;present=$true;bytes=$item.Length;sha256=$hash}}
|
||||
else{[ordered]@{path=$f.path;present=$false}}
|
||||
})
|
||||
$taskRecord=[ordered]@{capturedUtc=[DateTime]::UtcNow.ToString('o');workspace=$taskWorkspace;base=$taskBase;count=$taskEntries.Count;files=$taskEntries;externalInputs=$externalNow;expectedInputsSha256=(Hash-Input (Join-Path $PSScriptRoot 'expected-inputs.json'));enumerationSha256=(Hash-Input (Join-Path $PSScriptRoot 'enumeration.json'))}
|
||||
$taskRecord|ConvertTo-Json -Depth 8|Set-Content -LiteralPath $taskOutput -Encoding utf8
|
||||
if($taskEntries.Count -ne $pinRecord.count){throw 'Pinned dynamic count changed.'}
|
||||
$expected=@{}
|
||||
foreach($f in $pinRecord.files){if($expected.ContainsKey($f.path)){throw 'Duplicate pinned input.'};$expected[$f.path]=$f}
|
||||
foreach($f in $taskEntries){if(-not $expected.ContainsKey($f.path)){throw 'Unexpected input.'};$old=$expected[$f.path];if($f.bytes -ne $old.bytes -or $f.sha256 -cne $old.sha256){throw ('Input changed: '+$f.path)};$expected.Remove($f.path)}
|
||||
if($expected.Count){throw 'Missing input.'}
|
||||
if($Stage -ne 'before'){
|
||||
$baseline=Get-Content -Raw -LiteralPath (Join-Path $PSScriptRoot 'inputs-complete-before.json')|ConvertFrom-Json
|
||||
if($baseline.base -cne $taskPin -or $baseline.count -ne $pinRecord.count -or $baseline.expectedInputsSha256 -cne $taskRecord.expectedInputsSha256 -or $baseline.enumerationSha256 -cne $taskRecord.enumerationSha256){throw 'Baseline binding changed.'}
|
||||
}
|
||||
Write-Output ('Captured and verified '+$taskEntries.Count+' inputs: '+$Stage)
|
||||
} finally {Pop-Location}
|
||||
+5479
File diff suppressed because it is too large
Load Diff
+1245
File diff suppressed because it is too large
Load Diff
+3057
File diff suppressed because it is too large
Load Diff
+44
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"base": "c4a2cf63f11818cf7fc766acf3a2779768a2a658",
|
||||
"status": "Fresh external environment/config snapshot; not version-controlled inputs",
|
||||
"files": [
|
||||
{
|
||||
"path": "C:/Users/User/Documents/Git/ARCADIA-Studio/.local/toolchain/env.ps1",
|
||||
"present": true,
|
||||
"bytes": 572,
|
||||
"sha256": "be2226f08764bb6961b4be8513ce55bab076890cddd2fef0f54a4031f94a82d4"
|
||||
},
|
||||
{
|
||||
"path": "C:/Users/User/Documents/Git/ARCADIA-Studio/.cargo/config",
|
||||
"present": false
|
||||
},
|
||||
{
|
||||
"path": "C:/Users/User/Documents/Git/ARCADIA-Studio/.local/.cargo/config",
|
||||
"present": false
|
||||
},
|
||||
{
|
||||
"path": "C:/Users/User/Documents/Git/ARCADIA-Studio/.local/scenario-spacing-ytr83r-20260913/.cargo/config",
|
||||
"present": false
|
||||
},
|
||||
{
|
||||
"path": "C:/Users/User/Documents/Git/ARCADIA-Studio/.local/toolchain/cargo/config",
|
||||
"present": false
|
||||
},
|
||||
{
|
||||
"path": "C:/Users/User/Documents/Git/ARCADIA-Studio/.cargo/config.toml",
|
||||
"present": false
|
||||
},
|
||||
{
|
||||
"path": "C:/Users/User/Documents/Git/ARCADIA-Studio/.local/.cargo/config.toml",
|
||||
"present": false
|
||||
},
|
||||
{
|
||||
"path": "C:/Users/User/Documents/Git/ARCADIA-Studio/.local/scenario-spacing-ytr83r-20260913/.cargo/config.toml",
|
||||
"present": false
|
||||
},
|
||||
{
|
||||
"path": "C:/Users/User/Documents/Git/ARCADIA-Studio/.local/toolchain/cargo/config.toml",
|
||||
"present": false
|
||||
}
|
||||
]
|
||||
}
|
||||
+3100
File diff suppressed because it is too large
Load Diff
+3100
File diff suppressed because it is too large
Load Diff
+3100
File diff suppressed because it is too large
Load Diff
+75
@@ -0,0 +1,75 @@
|
||||
{
|
||||
"source_commit": "c4a2cf63f11818cf7fc766acf3a2779768a2a658",
|
||||
"classification": "diagnostic_after_failed_focused_gate",
|
||||
"run_script_sha256": "418391801382107fa60408c834e3746b712ea116aafac0cf14a70017e42ba6c0",
|
||||
"gate": "C:/Users/User/Documents/Git/ARCADIA-Studio/.local/scenario-spacing-gates-attempt2-20260913",
|
||||
"upstream_bindings": {
|
||||
"prior-failure-provenance.json": "42e9f7a06c0f1c163d64ae39830cd4a82e11985b3cc706dda10f4a8cafdf38b7",
|
||||
"inputs-complete-list-after.json": "2a301bed6dca6f4ada2043be22f5f1f9754ba408c850bfd36a891953a7811460",
|
||||
"focused.log": "70d89a74368c20c8b7502ef8c9a32d2de4ab959a05452f6d2e11d9538b878999",
|
||||
"run.ps1": "09ed2f7be70f333b018844005b78760fb31773c5c12b84ebf4a06365f29fc790",
|
||||
"inputs-complete-list-before.json": "b90779f8c474a5ceaae505d48f90dda13d00a3cb293cca26f06523a19dfaedff",
|
||||
"finalization.json": "aebab717483cd851b4df286966ef08d15303a8f1bafcdbf3a6fbe107a3dd061c",
|
||||
"diagnostic.ps1": "508a8a437bda35689f7c4f0528622cc841cb50ede66f447e76f73a0ada5d24c8",
|
||||
"enumeration.json": "84bdc08cee5cfacfd98348879fd5734681b38a5cac90e3a2db90501d3e6646c3",
|
||||
"instruction-update-template.json": "491f2c53fbbc46602621eadf423bd76e9afd70fd4ff3ce326a7255736ede9157",
|
||||
"parser-verification.json": "2287033fb362ccc8e8c0221277c6c0020c9a8e54f6a7ae5616c8afbebb6a334c",
|
||||
"selection-provenance.json": "413bacaa52faf8e3db2ae5c0d0e63c9bca6ec034ebad8eae8a6074615602edce",
|
||||
"external_environment:C:/Users/User/Documents/Git/ARCADIA-Studio/.local/toolchain/env.ps1": "be2226f08764bb6961b4be8513ce55bab076890cddd2fef0f54a4031f94a82d4",
|
||||
"inputs-complete-focused-before.json": "641967a6f1fb4ad5b1101759099c7440ebd3163bd7b395c174280658e7b33e11",
|
||||
"validate-scripts.ps1": "7800d1ab132cb3c9ebc75f0e40f2c81f139565432db114326c0128ee66b8fe87",
|
||||
"list.log": "a7f4adfa7ff6e5e83b4d69369d370f7200a9ba7252f24d477904dfdc2ee1e45c",
|
||||
"binary-inputs.ps1": "59da671a59d75ea0aa0c4662b1e48fd189823e45b71d0df98e65430becc7da83",
|
||||
"inputs-complete-focused-after.json": "6c2353f246a32c8a3edef4c0a6a6b98b7f2931fe5ea2f4d085966083e4189186",
|
||||
"toolchain-versions.json": "56899a91d935a7bc4619619d820e34620ffdd7e5cd45fda7a205e4ddec9776f9",
|
||||
"finalize.ps1": "a9d8b5b5c124c60aed2ea918fbc06404b771b43ed1709b03645e9df7b3b1674c",
|
||||
"cache-policy.json": "f937a4fee4d14e3fa1b695494f8db90235897475e67c9b948a71b211c788c018",
|
||||
"capture.ps1": "f471e0b4a6a4555fcf0a9ad851c5428a514aef6b9eec8fef6d6b5a0820375fa1",
|
||||
"list-receipt.json": "076b1a00681ba00dc77cc1373da9e7e0f199cfb19ba90176bf2f9e80be6112e4",
|
||||
"external-inputs.json": "920f7c07b1aabb45dd54c5a49e5d5b7197a042295d722fc67633e4d0cfb08798",
|
||||
"enumerate-inputs.ps1": "aa3f4d769a626e917fc051e16b23313ca3aabe0edecf848e8e14ede76164b82d",
|
||||
"instruction-update-provenance.json": "9eb7d2331e04c5f9d49832a2acfea825c49ab8c807f3508a38714ca022e1ac8e",
|
||||
"inputs-complete-before.json": "46a51390d6d9de96117ca10f0977a3e938b0f469e21375f7a99885ee185fe7ae",
|
||||
"expected-tests.json": "92d17487dc077e46e3e708ee369c016470d3e54b52f90730aefb48db002c83ed",
|
||||
"focused-receipt.json": "4be2dccf8d20a785bf36fcb1615fe47419fd02414ed468cdade457b64a421333",
|
||||
"verify-parser.ps1": "9d59a053f49427c525086a6ea9735f171776171d7a3336143e5b00004c797999",
|
||||
"expected-inputs.json": "0224309f757dddd8e6d829717703b798d7e7e8641d50a96da61cf645284789a7",
|
||||
"server-provenance.json": "2569099eec89a5a52bc443c316a667e33cb3557e297d7765b4e65bf92d5452c0"
|
||||
},
|
||||
"external_environment": {
|
||||
"path": "C:/Users/User/Documents/Git/ARCADIA-Studio/.local/toolchain/env.ps1",
|
||||
"sha256": "be2226f08764bb6961b4be8513ce55bab076890cddd2fef0f54a4031f94a82d4"
|
||||
},
|
||||
"runtime_before": {
|
||||
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\llvm-mingw-20260908-ucrt-x86_64\\bin\\libunwind.dll",
|
||||
"bytes": 190464,
|
||||
"sha256": "aa282fa47bb2c4e210cea5e470cdbdca58568f0be0bc73e404d86ab9cd95ef6a"
|
||||
},
|
||||
"runtime_path_directory": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\llvm-mingw-20260908-ucrt-x86_64\\bin",
|
||||
"effective_path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\bin;C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\llvm-mingw-20260908-ucrt-x86_64\\bin;C:\\Users\\User\\.cache\\codex-runtimes\\codex-primary-runtime\\dependencies\\native\\powershell;C:\\Users\\User\\.codex\\tmp\\arg0\\codex-arg0mLGiPH;C:\\Users\\User\\.cache\\codex-runtimes\\codex-primary-runtime\\dependencies\\bin\\override;C:\\Windows\\system32;C:\\Windows;C:\\Windows\\System32\\Wbem;C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\;C:\\Program Files\\Git\\cmd;C:\\Users\\User\\AppData\\Local\\Programs\\OpenAI\\Codex\\bin;C:\\Users\\User\\.cache\\codex-runtimes\\codex-primary-runtime\\dependencies\\native\\powershell;C:\\Users\\User\\AppData\\Local\\Microsoft\\WindowsApps;C:\\Users\\User\\AppData\\Local\\Programs\\Zed\\bin;C:\\Users\\User\\.cache\\codex-runtimes\\codex-primary-runtime\\dependencies\\bin\\fallback;C:\\Users\\User\\.cache\\codex-runtimes\\codex-primary-runtime\\dependencies\\node\\bin;C:\\Users\\User\\.cache\\codex-runtimes\\codex-primary-runtime\\dependencies\\native\\git\\cmd;C:\\Users\\User\\AppData\\Local\\OpenAI\\Codex\\bin\\6fdec9b372c2c0fd;C:\\Users\\User\\AppData\\Local\\OpenAI\\Codex\\bin\\7ac07f4ce733f89a",
|
||||
"capture_original_sha256": "f471e0b4a6a4555fcf0a9ad851c5428a514aef6b9eec8fef6d6b5a0820375fa1",
|
||||
"capture_adapted_sha256": "8ad0a483d535d0dcd7dd58af93d660516113c7c44e36907e0f527042f0d64f29",
|
||||
"capture_change": {
|
||||
"from": "(list|focused|all|clippy|build|diagnostic)-(before|after)",
|
||||
"to": "(list|focused|all|clippy|build|diagnostic|diagnostic-all)-(before|after)"
|
||||
},
|
||||
"binary_before": {
|
||||
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\target\\debug\\deps\\arcadia_studio-27db9628b266bf39.exe",
|
||||
"bytes": 150361088,
|
||||
"sha256": "cf31c674a7ef6c19dbe72f65c660030b5af6127d6450e35117ffc201ef813249",
|
||||
"mtimeUtc": "2026-09-13T09:44:00.9731394Z"
|
||||
},
|
||||
"command": [
|
||||
"C:/Users/User/Documents/Git/ARCADIA-Studio/target/debug/deps/arcadia_studio-27db9628b266bf39.exe",
|
||||
"--test-threads=1"
|
||||
],
|
||||
"source_input_count": 610,
|
||||
"expected_tests": 1082,
|
||||
"expected_ignored": [
|
||||
"app::source_rename::timing_tests::accepted_release1_prepare_commit_sync_and_confirm_timing",
|
||||
"app::source_rename::timing_tests::layout_timing_tests::accepted_release1_constructor_vs_reuse_through_next_highlight",
|
||||
"app::source_symbols::tests::source_symbols_100_modules_1000_definitions_10000_uses",
|
||||
"behavior::scenario::spacing::controller::timing_tests::saved_spacing_capture_prepare_20_lanes_1000_messages_3_views"
|
||||
],
|
||||
"waives_failed_focused_gate": false
|
||||
}
|
||||
@@ -0,0 +1,114 @@
|
||||
#Requires -Version 7.0
|
||||
# Diagnostic only. Parent may run this once after review; no Cargo or rebuild.
|
||||
[CmdletBinding()]
|
||||
param()
|
||||
Set-StrictMode -Version Latest
|
||||
$ErrorActionPreference='Stop'
|
||||
$gate='C:/Users/User/Documents/Git/ARCADIA-Studio/.local/scenario-spacing-gates-attempt2-20260913'
|
||||
$pin='c4a2cf63f11818cf7fc766acf3a2779768a2a658'
|
||||
$binaryPath='C:/Users/User/Documents/Git/ARCADIA-Studio/target/debug/deps/arcadia_studio-27db9628b266bf39.exe'
|
||||
$binaryHash='cf31c674a7ef6c19dbe72f65c660030b5af6127d6450e35117ffc201ef813249'
|
||||
$binaryBytes=150361088
|
||||
$environmentPath='C:/Users/User/Documents/Git/ARCADIA-Studio/.local/toolchain/env.ps1'
|
||||
$environmentHash='be2226f08764bb6961b4be8513ce55bab076890cddd2fef0f54a4031f94a82d4'
|
||||
$runtimePath='C:/Users/User/Documents/Git/ARCADIA-Studio/.local/toolchain/llvm-mingw-20260908-ucrt-x86_64/bin/libunwind.dll'
|
||||
$runtimeHash='aa282fa47bb2c4e210cea5e470cdbdca58568f0be0bc73e404d86ab9cd95ef6a'
|
||||
$receiptHashes=@{list='076b1a00681ba00dc77cc1373da9e7e0f199cfb19ba90176bf2f9e80be6112e4';focused='4be2dccf8d20a785bf36fcb1615fe47419fd02414ed468cdade457b64a421333'}
|
||||
function Hash([string]$Path){(Get-FileHash -LiteralPath $Path -Algorithm SHA256).Hash.ToLowerInvariant()}
|
||||
function Read-Json([string]$Path){Get-Content -Raw -LiteralPath $Path|ConvertFrom-Json}
|
||||
function Write-NewJson([string]$Path,$Value){$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);$stream.Flush($true)}finally{$stream.Dispose()}}
|
||||
function Names-Equal($Expected,$Actual){$a=@($Expected);$b=@($Actual);return $a.Count -eq $b.Count -and @($a|Sort-Object -Unique).Count -eq $a.Count -and @($b|Sort-Object -Unique).Count -eq $b.Count -and @(Compare-Object $a $b -CaseSensitive).Count -eq 0}
|
||||
function Binary-Record {
|
||||
$file=Get-Item -LiteralPath $binaryPath
|
||||
$hash=Hash $binaryPath
|
||||
if($file.Length -ne $binaryBytes -or $hash -cne $binaryHash){throw 'Previously compiled exact c4 test executable changed.'}
|
||||
[ordered]@{path=$file.FullName;bytes=$file.Length;sha256=$hash;mtimeUtc=$file.LastWriteTimeUtc.ToString('o')}
|
||||
}
|
||||
function Runtime-Record {
|
||||
$item=Get-Item -LiteralPath $runtimePath
|
||||
$hash=Hash $runtimePath
|
||||
if($hash -cne $runtimeHash){throw 'Known toolchain libunwind runtime changed.'}
|
||||
[ordered]@{path=$item.FullName;bytes=$item.Length;sha256=$hash}
|
||||
}
|
||||
function Gate-Bindings {
|
||||
$bindings=@{}
|
||||
foreach($stage in @('list','focused')) {
|
||||
$name=$stage+'-receipt.json';$path=Join-Path $gate $name
|
||||
if((Hash $path) -cne $receiptHashes[$stage]){throw 'Closed upstream receipt changed.'}
|
||||
$bindings[$name]=Hash $path
|
||||
$r=Read-Json $path
|
||||
if([IO.Path]::GetFullPath($r.externalEnvironmentPath) -ine [IO.Path]::GetFullPath($environmentPath) -or $r.externalEnvironmentSha256 -cne $environmentHash -or (Hash $environmentPath) -cne $environmentHash){throw 'Closed gate toolchain environment binding differs.'}
|
||||
$bindings['external_environment:'+$environmentPath]=$environmentHash
|
||||
if($r.base -cne $pin -or $r.stage -cne $stage -or -not $r.inputsUnchanged -or -not $r.testBinaryBindingValid -or $null -ne $r.postflightFailure -or @($r.testExecutables).Count -ne 1){throw 'Invalid closed source/binary binding.'}
|
||||
$b=$r.testExecutables[0]
|
||||
if([IO.Path]::GetFullPath($b.path) -ine [IO.Path]::GetFullPath($binaryPath) -or $b.sha256 -cne $binaryHash -or $b.bytes -ne $binaryBytes){throw 'Wrong upstream executable.'}
|
||||
if($stage -eq 'list' -and ($r.cargoExitCode -ne 0 -or -not $r.selectionValid)){throw 'Successful closed listing required.'}
|
||||
if($stage -eq 'focused') {
|
||||
if($r.cargoExitCode -ne 101 -or $r.selectionValid -or @($r.testResultSummaries).Count -ne 1){throw 'This diagnostic requires the preserved failed focused attempt.'}
|
||||
$s=$r.testResultSummaries[0]
|
||||
if($s.passed -ne 286 -or $s.failed -ne 2 -or $s.ignored -ne 0 -or $s.filtered -ne 794 -or $r.priorStage.receiptSha256 -cne $receiptHashes.list){throw 'Wrong prior focused failure/chain.'}
|
||||
}
|
||||
foreach($entry in $r.boundScriptAndInputHashes.PSObject.Properties){if((Hash (Join-Path $gate $entry.Name)) -cne $entry.Value){throw "Changed upstream bound input: $($entry.Name)"};$bindings[$entry.Name]=$entry.Value}
|
||||
foreach($entry in @(@(($stage+'.log'),$r.rawLogSha256),@('toolchain-versions.json',$r.toolchainVersionsSha256),@(('inputs-complete-'+$stage+'-before.json'),$r.beforeCaptureSha256),@(('inputs-complete-'+$stage+'-after.json'),$r.afterCaptureSha256))){if((Hash (Join-Path $gate $entry[0])) -cne $entry[1]){throw "Changed upstream raw receipt input: $($entry[0])"};$bindings[$entry[0]]=$entry[1]}
|
||||
}
|
||||
$bindings
|
||||
}
|
||||
foreach($name in @('capture-diagnostic.ps1','expected-inputs.json','enumeration.json','external-inputs.json','inputs-complete-before.json','inputs-complete-diagnostic-all-before.json','inputs-complete-diagnostic-all-after.json','diagnostic-all.log','diagnostic-all-receipt.json','provenance-before.json')){if(Test-Path -LiteralPath (Join-Path $PSScriptRoot $name)){throw "Preserve prior diagnostic output: $name"}}
|
||||
$upstream=Gate-Bindings
|
||||
$list=Read-Json (Join-Path $gate 'list-receipt.json')
|
||||
$selection=Read-Json (Join-Path $gate 'expected-tests.json')
|
||||
$expected=Read-Json (Join-Path $gate 'expected-inputs.json')
|
||||
if($selection.source_commit -cne $pin -or @($list.listedTests).Count -ne 1082 -or @($selection.ignored_tests).Count -ne 4 -or -not (Names-Equal $selection.desktop_tests $list.listedTests) -or $expected.base -cne $pin -or $expected.count -ne 610 -or @($expected.files).Count -ne 610){throw 'Exact 1082/4/610 diagnostic contract differs.'}
|
||||
$beforeBinary=Binary-Record
|
||||
# The already-built gnullvm EXE uses the same bound toolchain runtime PATH as its gate.
|
||||
# Dot-sourcing affects this diagnostic process only; no DLL is copied.
|
||||
. $environmentPath
|
||||
$runtimeBefore=Runtime-Record
|
||||
$runtimeDirectory=[IO.Path]::GetDirectoryName($runtimePath)
|
||||
$firstPathRuntime=@($env:PATH.Split(';')|Where-Object {$_}|ForEach-Object {Join-Path $_ 'libunwind.dll'}|Where-Object {Test-Path -LiteralPath $_ -PathType Leaf}|Select-Object -First 1)
|
||||
if($firstPathRuntime.Count -ne 1 -or [IO.Path]::GetFullPath($firstPathRuntime[0]) -ine [IO.Path]::GetFullPath($runtimePath)){throw 'PATH would resolve a different libunwind runtime.'}
|
||||
foreach($directory in @([IO.Path]::GetDirectoryName($binaryPath),$expected.workspace,(Join-Path $env:SystemRoot 'System32'),$env:SystemRoot)){if(Test-Path -LiteralPath (Join-Path $directory 'libunwind.dll')){throw 'An earlier DLL-search directory contains an unbound libunwind.dll; stop for explicit provenance.'}}
|
||||
# Reuse the exact capture helper with one declared change: accept a diagnostic-all prefix.
|
||||
# Copies and generated captures belong here; the closed gate remains untouched.
|
||||
$captureSource=Join-Path $gate 'capture.ps1'
|
||||
$captureText=[IO.File]::ReadAllText($captureSource)
|
||||
$old='(list|focused|all|clippy|build|diagnostic)-(before|after)'
|
||||
$new='(list|focused|all|clippy|build|diagnostic|diagnostic-all)-(before|after)'
|
||||
if(($captureText.Split($old,[StringSplitOptions]::None)).Count -ne 2){throw 'Capture helper adaptation no longer has exactly one known seam.'}
|
||||
$adapted=$captureText.Replace($old,$new)
|
||||
$captureLocal=Join-Path $PSScriptRoot 'capture-diagnostic.ps1'
|
||||
[IO.File]::WriteAllText($captureLocal,$adapted,[Text.UTF8Encoding]::new($false))
|
||||
foreach($name in @('expected-inputs.json','enumeration.json','external-inputs.json','inputs-complete-before.json')){[IO.File]::Copy((Join-Path $gate $name),(Join-Path $PSScriptRoot $name),$false)}
|
||||
$scriptHash=Hash $PSCommandPath
|
||||
$captureHash=Hash $captureLocal
|
||||
Write-NewJson (Join-Path $PSScriptRoot 'provenance-before.json') ([ordered]@{source_commit=$pin;classification='diagnostic_after_failed_focused_gate';run_script_sha256=$scriptHash;gate=$gate;upstream_bindings=$upstream;external_environment=[ordered]@{path=$environmentPath;sha256=$environmentHash};runtime_before=$runtimeBefore;runtime_path_directory=$runtimeDirectory;effective_path=$env:PATH;capture_original_sha256=(Hash $captureSource);capture_adapted_sha256=$captureHash;capture_change=[ordered]@{from=$old;to=$new};binary_before=$beforeBinary;command=@($binaryPath,'--test-threads=1');source_input_count=610;expected_tests=1082;expected_ignored=@($selection.ignored_tests);waives_failed_focused_gate=$false})
|
||||
& $captureLocal -Stage diagnostic-all-before
|
||||
$beforeBinary=Binary-Record
|
||||
$start=[DateTime]::UtcNow.ToString('o')
|
||||
$PSNativeCommandUseErrorActionPreference=$false
|
||||
Push-Location -LiteralPath $expected.workspace
|
||||
try {& $binaryPath --test-threads=1 2>&1|Tee-Object -FilePath (Join-Path $PSScriptRoot 'diagnostic-all.log');$exit=$LASTEXITCODE}finally{Pop-Location}
|
||||
$end=[DateTime]::UtcNow.ToString('o')
|
||||
$raw=Get-Content -Raw -LiteralPath (Join-Path $PSScriptRoot 'diagnostic-all.log')
|
||||
$executed=@([regex]::Matches($raw,'(?m)^test ([^\r\n]+?) \.\.\. (ok|FAILED|ignored)[^\r\n]*\r?$')|ForEach-Object {[ordered]@{name=$_.Groups[1].Value;result=$_.Groups[2].Value}})
|
||||
$summaries=@([regex]::Matches($raw,'test result: (ok|FAILED)\. (\d+) passed; (\d+) failed; (\d+) ignored; (\d+) measured; (\d+) filtered out;')|ForEach-Object {[ordered]@{status=$_.Groups[1].Value;passed=[int]$_.Groups[2].Value;failed=[int]$_.Groups[3].Value;ignored=[int]$_.Groups[4].Value;measured=[int]$_.Groups[5].Value;filtered=[int]$_.Groups[6].Value}})
|
||||
$passed=@($executed|Where-Object {$_.result -eq 'ok'}).Count
|
||||
$failed=@($executed|Where-Object {$_.result -eq 'FAILED'}|ForEach-Object {$_.name})
|
||||
$ignored=@($executed|Where-Object {$_.result -eq 'ignored'}|ForEach-Object {$_.name})
|
||||
$valid=(Names-Equal $list.listedTests @($executed|ForEach-Object {$_.name})) -and (Names-Equal $selection.ignored_tests $ignored) -and $summaries.Count -eq 1
|
||||
if($valid){$s=$summaries[0];$valid=$s.passed -eq $passed -and $s.failed -eq $failed.Count -and $s.ignored -eq 4 -and $s.measured -eq 0 -and $s.filtered -eq 0 -and (($failed.Count -eq 0 -and $s.status -eq 'ok' -and $exit -eq 0) -or ($failed.Count -gt 0 -and $s.status -eq 'FAILED' -and $exit -ne 0))}
|
||||
$unchanged=$false;$postflightFailure=$null;$afterBinary=$null;$runtimeAfter=$null
|
||||
try {
|
||||
& $captureLocal -Stage diagnostic-all-after
|
||||
$afterBinary=Binary-Record
|
||||
$runtimeAfter=Runtime-Record
|
||||
if($runtimeAfter.bytes -ne $runtimeBefore.bytes -or $runtimeAfter.sha256 -cne $runtimeBefore.sha256){throw 'Runtime changed during diagnostic.'}
|
||||
$current=Gate-Bindings
|
||||
foreach($name in $upstream.Keys){if($current[$name] -cne $upstream[$name]){throw 'Upstream evidence changed during diagnostic.'}}
|
||||
if((Hash $PSCommandPath) -cne $scriptHash -or (Hash $captureLocal) -cne $captureHash){throw 'Diagnostic recipe changed during execution.'}
|
||||
foreach($name in @('expected-inputs.json','enumeration.json','external-inputs.json','inputs-complete-before.json')){if((Hash (Join-Path $PSScriptRoot $name)) -cne (Hash (Join-Path $gate $name))){throw 'Copied capture input changed.'}}
|
||||
$unchanged=$true
|
||||
} catch {$postflightFailure=$_.Exception.Message}
|
||||
Write-NewJson (Join-Path $PSScriptRoot 'diagnostic-all-receipt.json') ([ordered]@{source_commit=$pin;classification='diagnostic_after_failed_focused_gate';successful_full_gate=$false;waives_failed_focused_gate=$false;compiler_executed=$false;command=@($binaryPath,'--test-threads=1');start_utc=$start;end_utc=$end;test_exit_code=$exit;complete_inventory_valid=$valid;tests_passed=($valid -and $failed.Count -eq 0);inputs_unchanged=$unchanged;postflight_failure=$postflightFailure;binary_before=$beforeBinary;binary_after=$afterBinary;runtime_before=$runtimeBefore;runtime_after=$runtimeAfter;listed_tests=@($list.listedTests);executed_tests=$executed;failed_tests=$failed;ignored_tests=$ignored;test_result_summaries=$summaries;provenance_sha256=(Hash (Join-Path $PSScriptRoot 'provenance-before.json'));raw_log_sha256=(Hash (Join-Path $PSScriptRoot 'diagnostic-all.log'));before_capture_sha256=(Hash (Join-Path $PSScriptRoot 'inputs-complete-diagnostic-all-before.json'));after_capture_sha256=if(Test-Path -LiteralPath (Join-Path $PSScriptRoot 'inputs-complete-diagnostic-all-after.json')){Hash (Join-Path $PSScriptRoot 'inputs-complete-diagnostic-all-after.json')}else{$null};scope='Complete-inventory diagnostic of the unchanged already-built c4 binary. Prior failed focused gate remains failed. Any corrected source needs its own acceptance gates.'})
|
||||
if(-not $valid -or -not $unchanged){exit 2}
|
||||
exit $exit
|
||||
@@ -0,0 +1,327 @@
|
||||
{
|
||||
"sourceCommit": "c4a2cf63f11818cf7fc766acf3a2779768a2a658",
|
||||
"archiveBase": "edd6a603edb3914a1dc58c8048ba9ebcdd27c017",
|
||||
"preparedAtUtc": "2026-09-13T10:13:08.024Z",
|
||||
"classification": "failed_focused_gate_with_separate_non_acceptance_full_diagnostic",
|
||||
"correctionCandidate": {
|
||||
"commit": "0409a481c7571e887f8912f0a8cdb93cfdcc01a7",
|
||||
"status": "unexecuted at archive preparation"
|
||||
},
|
||||
"sourceDirectories": {
|
||||
"original": "C:/Users/User/Documents/Git/ARCADIA-Studio/.local/scenario-spacing-gates-attempt2-20260913/",
|
||||
"diagnostic": "C:/Users/User/Documents/Git/ARCADIA-Studio/.local/scenario-spacing-full-diagnostic-c4-20260913/"
|
||||
},
|
||||
"originalFileCount": 34,
|
||||
"diagnosticFileCount": 11,
|
||||
"sourceInputCount": 610,
|
||||
"externalInputCount": 9,
|
||||
"verification": {
|
||||
"gate": {
|
||||
"listed": 1082,
|
||||
"listedExact": true,
|
||||
"focused": 288,
|
||||
"focusedExact": true,
|
||||
"passed": 286,
|
||||
"failed": 2,
|
||||
"bindingsValid": true,
|
||||
"priorReceiptValid": true,
|
||||
"inputCapturesEqual": true,
|
||||
"binaryBindingsEqual": true
|
||||
},
|
||||
"diagnostic": {
|
||||
"receiptMatchesParent": true,
|
||||
"rawInventoryExact": true,
|
||||
"sameFailures": true,
|
||||
"hashBindings": true,
|
||||
"upstreamBindings": true,
|
||||
"sameBinary": true,
|
||||
"sameRuntime": true,
|
||||
"sameInputs": true
|
||||
},
|
||||
"byteExactCopies": true
|
||||
},
|
||||
"files": [
|
||||
{
|
||||
"path": ".gitattributes",
|
||||
"bytes": 20,
|
||||
"sha256": "e97602ab9cac70102245345c5ab0fc9830df8b17f1072b188265a662a3a547ae",
|
||||
"gitBlob": "bd2de00cda30e433943ceb23971ade38d5a3fc86"
|
||||
},
|
||||
{
|
||||
"path": "diagnostic/capture-diagnostic.ps1",
|
||||
"bytes": 4087,
|
||||
"sha256": "8ad0a483d535d0dcd7dd58af93d660516113c7c44e36907e0f527042f0d64f29",
|
||||
"gitBlob": "9355f1d8146ae8bba49cee3aafbdeb911d0fd8eb"
|
||||
},
|
||||
{
|
||||
"path": "diagnostic/diagnostic-all-receipt.json",
|
||||
"bytes": 293991,
|
||||
"sha256": "c63e0ae818bd11a03ce68471f5cebe7d2ecce9a97dfbe73d7f006acede56b2da",
|
||||
"gitBlob": "3456194689add94a34b74e3c242e73557687f77e"
|
||||
},
|
||||
{
|
||||
"path": "diagnostic/diagnostic-all.log",
|
||||
"bytes": 147762,
|
||||
"sha256": "70abe0811415d62812a206f7e9df779230f81a10e962cf44d6b862746d6afd6c",
|
||||
"gitBlob": "deebcab8d2901bf9f003c34998f124278bb9774c"
|
||||
},
|
||||
{
|
||||
"path": "diagnostic/enumeration.json",
|
||||
"bytes": 74795,
|
||||
"sha256": "84bdc08cee5cfacfd98348879fd5734681b38a5cac90e3a2db90501d3e6646c3",
|
||||
"gitBlob": "548c32e1c7fde8bf8d8908c67b25ed26df2e0e63"
|
||||
},
|
||||
{
|
||||
"path": "diagnostic/expected-inputs.json",
|
||||
"bytes": 117420,
|
||||
"sha256": "0224309f757dddd8e6d829717703b798d7e7e8641d50a96da61cf645284789a7",
|
||||
"gitBlob": "8c48537af4d7eaf3936c330d2d5b5104d9dec1a7"
|
||||
},
|
||||
{
|
||||
"path": "diagnostic/external-inputs.json",
|
||||
"bytes": 1457,
|
||||
"sha256": "920f7c07b1aabb45dd54c5a49e5d5b7197a042295d722fc67633e4d0cfb08798",
|
||||
"gitBlob": "0636cb5ffef573baf4753b508acb5197f837bbe0"
|
||||
},
|
||||
{
|
||||
"path": "diagnostic/inputs-complete-before.json",
|
||||
"bytes": 118980,
|
||||
"sha256": "46a51390d6d9de96117ca10f0977a3e938b0f469e21375f7a99885ee185fe7ae",
|
||||
"gitBlob": "9fc7f0e428f6946a3ccf7ac89eeefb291ad39a85"
|
||||
},
|
||||
{
|
||||
"path": "diagnostic/inputs-complete-diagnostic-all-after.json",
|
||||
"bytes": 118980,
|
||||
"sha256": "9f732c5d6aee03574de5a10d858227f3f22cb328d97c964815544addd51a2ee5",
|
||||
"gitBlob": "936fb98f3e01c5837daddc0d7316419ad7b53961"
|
||||
},
|
||||
{
|
||||
"path": "diagnostic/inputs-complete-diagnostic-all-before.json",
|
||||
"bytes": 118980,
|
||||
"sha256": "efc3a20c3ec68b75b1f7ffcb1af4dd815517f3f1c4ffc9fe42ef3ff99d46806e",
|
||||
"gitBlob": "b78abc37dd4a6a389d1ec6b8e712a4e89e76cabf"
|
||||
},
|
||||
{
|
||||
"path": "diagnostic/provenance-before.json",
|
||||
"bytes": 6748,
|
||||
"sha256": "fc0ed618194043a3c4e17a19079021529228ab8a6842f0c0edee8a08eb14b676",
|
||||
"gitBlob": "8d384c9a5d8ffb968de6d1f4e97fbc7ebf783430"
|
||||
},
|
||||
{
|
||||
"path": "diagnostic/run.ps1",
|
||||
"bytes": 12372,
|
||||
"sha256": "418391801382107fa60408c834e3746b712ea116aafac0cf14a70017e42ba6c0",
|
||||
"gitBlob": "803be09838d6a103358c1c50daf807f09f02e2ed"
|
||||
},
|
||||
{
|
||||
"path": "original/binary-inputs.ps1",
|
||||
"bytes": 1214,
|
||||
"sha256": "59da671a59d75ea0aa0c4662b1e48fd189823e45b71d0df98e65430becc7da83",
|
||||
"gitBlob": "e1cb7efd79da716b279e1d2f681728a7355d7ab0"
|
||||
},
|
||||
{
|
||||
"path": "original/cache-policy.json",
|
||||
"bytes": 443,
|
||||
"sha256": "f937a4fee4d14e3fa1b695494f8db90235897475e67c9b948a71b211c788c018",
|
||||
"gitBlob": "24facf6af7a3e03c2abd3e251258562101591e8f"
|
||||
},
|
||||
{
|
||||
"path": "original/capture.ps1",
|
||||
"bytes": 4072,
|
||||
"sha256": "f471e0b4a6a4555fcf0a9ad851c5428a514aef6b9eec8fef6d6b5a0820375fa1",
|
||||
"gitBlob": "7d164234c07c28da63dd7d29872f3340de97d873"
|
||||
},
|
||||
{
|
||||
"path": "original/diagnostic.ps1",
|
||||
"bytes": 6784,
|
||||
"sha256": "508a8a437bda35689f7c4f0528622cc841cb50ede66f447e76f73a0ada5d24c8",
|
||||
"gitBlob": "887d8b24f919d797d3d9aa0a3a06cc3b80fae034"
|
||||
},
|
||||
{
|
||||
"path": "original/enumerate-inputs.ps1",
|
||||
"bytes": 1816,
|
||||
"sha256": "aa3f4d769a626e917fc051e16b23313ca3aabe0edecf848e8e14ede76164b82d",
|
||||
"gitBlob": "211dbf4dd25481a9ad52d55491eda487f714f224"
|
||||
},
|
||||
{
|
||||
"path": "original/enumeration.json",
|
||||
"bytes": 74795,
|
||||
"sha256": "84bdc08cee5cfacfd98348879fd5734681b38a5cac90e3a2db90501d3e6646c3",
|
||||
"gitBlob": "548c32e1c7fde8bf8d8908c67b25ed26df2e0e63"
|
||||
},
|
||||
{
|
||||
"path": "original/expected-inputs.json",
|
||||
"bytes": 117420,
|
||||
"sha256": "0224309f757dddd8e6d829717703b798d7e7e8641d50a96da61cf645284789a7",
|
||||
"gitBlob": "8c48537af4d7eaf3936c330d2d5b5104d9dec1a7"
|
||||
},
|
||||
{
|
||||
"path": "original/expected-tests.json",
|
||||
"bytes": 155695,
|
||||
"sha256": "92d17487dc077e46e3e708ee369c016470d3e54b52f90730aefb48db002c83ed",
|
||||
"gitBlob": "a2a1c2ea1b3bfe961561ed65185ecf8531773f06"
|
||||
},
|
||||
{
|
||||
"path": "original/external-input-template.json",
|
||||
"bytes": 1413,
|
||||
"sha256": "8f0a45041bd0a5038647c62bde35df89f9b07ccdc9e37769f78154e021cf898b",
|
||||
"gitBlob": "43d124c29519305844c7e753cfa5f21e525018d7"
|
||||
},
|
||||
{
|
||||
"path": "original/external-inputs.json",
|
||||
"bytes": 1457,
|
||||
"sha256": "920f7c07b1aabb45dd54c5a49e5d5b7197a042295d722fc67633e4d0cfb08798",
|
||||
"gitBlob": "0636cb5ffef573baf4753b508acb5197f837bbe0"
|
||||
},
|
||||
{
|
||||
"path": "original/finalization.json",
|
||||
"bytes": 611,
|
||||
"sha256": "aebab717483cd851b4df286966ef08d15303a8f1bafcdbf3a6fbe107a3dd061c",
|
||||
"gitBlob": "33c70c64e83eff20ef76c9338fe6efbf8b177845"
|
||||
},
|
||||
{
|
||||
"path": "original/finalize.ps1",
|
||||
"bytes": 8307,
|
||||
"sha256": "a9d8b5b5c124c60aed2ea918fbc06404b771b43ed1709b03645e9df7b3b1674c",
|
||||
"gitBlob": "650a41cc0ccf1ef088fc2f5622b3b091c818596d"
|
||||
},
|
||||
{
|
||||
"path": "original/focused-receipt.json",
|
||||
"bytes": 152609,
|
||||
"sha256": "4be2dccf8d20a785bf36fcb1615fe47419fd02414ed468cdade457b64a421333",
|
||||
"gitBlob": "3b4287836d080cb8b1bda85bad56f6e3febdb8f2"
|
||||
},
|
||||
{
|
||||
"path": "original/focused.log",
|
||||
"bytes": 57937,
|
||||
"sha256": "70d89a74368c20c8b7502ef8c9a32d2de4ab959a05452f6d2e11d9538b878999",
|
||||
"gitBlob": "50e219843834f5f22d804707285647bc0869a293"
|
||||
},
|
||||
{
|
||||
"path": "original/inputs-complete-before.json",
|
||||
"bytes": 118980,
|
||||
"sha256": "46a51390d6d9de96117ca10f0977a3e938b0f469e21375f7a99885ee185fe7ae",
|
||||
"gitBlob": "9fc7f0e428f6946a3ccf7ac89eeefb291ad39a85"
|
||||
},
|
||||
{
|
||||
"path": "original/inputs-complete-focused-after.json",
|
||||
"bytes": 118980,
|
||||
"sha256": "6c2353f246a32c8a3edef4c0a6a6b98b7f2931fe5ea2f4d085966083e4189186",
|
||||
"gitBlob": "8d786e666c2561a161f77485d6b1a4d0c17c6dbb"
|
||||
},
|
||||
{
|
||||
"path": "original/inputs-complete-focused-before.json",
|
||||
"bytes": 118980,
|
||||
"sha256": "641967a6f1fb4ad5b1101759099c7440ebd3163bd7b395c174280658e7b33e11",
|
||||
"gitBlob": "c41d6332b9e463cde8515f924654fe5ece258a9c"
|
||||
},
|
||||
{
|
||||
"path": "original/inputs-complete-list-after.json",
|
||||
"bytes": 118980,
|
||||
"sha256": "2a301bed6dca6f4ada2043be22f5f1f9754ba408c850bfd36a891953a7811460",
|
||||
"gitBlob": "d22caa4ce8a94e689b2c63f392479a59a1058c31"
|
||||
},
|
||||
{
|
||||
"path": "original/inputs-complete-list-before.json",
|
||||
"bytes": 118980,
|
||||
"sha256": "b90779f8c474a5ceaae505d48f90dda13d00a3cb293cca26f06523a19dfaedff",
|
||||
"gitBlob": "db275ce598506d125601f30dbad24958f75610c3"
|
||||
},
|
||||
{
|
||||
"path": "original/instruction-update-provenance.json",
|
||||
"bytes": 1124,
|
||||
"sha256": "9eb7d2331e04c5f9d49832a2acfea825c49ab8c807f3508a38714ca022e1ac8e",
|
||||
"gitBlob": "0acd3fc51861c846a47fa515f480f133ab4ef2c8"
|
||||
},
|
||||
{
|
||||
"path": "original/instruction-update-template.json",
|
||||
"bytes": 1077,
|
||||
"sha256": "491f2c53fbbc46602621eadf423bd76e9afd70fd4ff3ce326a7255736ede9157",
|
||||
"gitBlob": "36d8a6f40049571541bca01d483bbbaf6c7c7e63"
|
||||
},
|
||||
{
|
||||
"path": "original/list-receipt.json",
|
||||
"bytes": 158143,
|
||||
"sha256": "076b1a00681ba00dc77cc1373da9e7e0f199cfb19ba90176bf2f9e80be6112e4",
|
||||
"gitBlob": "f8df735cbd10d79962296b21ad2c572615373538"
|
||||
},
|
||||
{
|
||||
"path": "original/list.log",
|
||||
"bytes": 119429,
|
||||
"sha256": "a7f4adfa7ff6e5e83b4d69369d370f7200a9ba7252f24d477904dfdc2ee1e45c",
|
||||
"gitBlob": "db6582b2903e97ee0c5ff657dda467b9949d2b4b"
|
||||
},
|
||||
{
|
||||
"path": "original/parser-preparation-verification.json",
|
||||
"bytes": 1109,
|
||||
"sha256": "b85e79bcf0f9ef92c99ad100c84fde2f6f3e80ba4cda1a5531fb52fbe9ba2206",
|
||||
"gitBlob": "acbf57eca7090a42d1611943cffda6466c65c808"
|
||||
},
|
||||
{
|
||||
"path": "original/parser-verification.json",
|
||||
"bytes": 1109,
|
||||
"sha256": "2287033fb362ccc8e8c0221277c6c0020c9a8e54f6a7ae5616c8afbebb6a334c",
|
||||
"gitBlob": "1eafe8c7aa682287252d3a63ac990e9a3211ac17"
|
||||
},
|
||||
{
|
||||
"path": "original/prior-failure-provenance.json",
|
||||
"bytes": 3301,
|
||||
"sha256": "42e9f7a06c0f1c163d64ae39830cd4a82e11985b3cc706dda10f4a8cafdf38b7",
|
||||
"gitBlob": "f92c38125001117b7120a99d203f087d0650c245"
|
||||
},
|
||||
{
|
||||
"path": "original/README.md",
|
||||
"bytes": 6196,
|
||||
"sha256": "855833059f70e76a5798ba820ce7624e819fbe99ad87fd032a51ae484cb348d1",
|
||||
"gitBlob": "18148755fce581439321e66a77ce693d4dfec9c3"
|
||||
},
|
||||
{
|
||||
"path": "original/run.ps1",
|
||||
"bytes": 13191,
|
||||
"sha256": "09ed2f7be70f333b018844005b78760fb31773c5c12b84ebf4a06365f29fc790",
|
||||
"gitBlob": "fd6ad90a929935f01ea6442b3d015e08e800230c"
|
||||
},
|
||||
{
|
||||
"path": "original/selection-provenance.json",
|
||||
"bytes": 10793,
|
||||
"sha256": "413bacaa52faf8e3db2ae5c0d0e63c9bca6ec034ebad8eae8a6074615602edce",
|
||||
"gitBlob": "cf9738c7e393207f7f6c6c9f0f2c16166c8c7006"
|
||||
},
|
||||
{
|
||||
"path": "original/server-provenance-template.json",
|
||||
"bytes": 1249,
|
||||
"sha256": "5d062244a01775e77dee97ec3cf2d750f631e45b522ac1c40160ac486fb425d1",
|
||||
"gitBlob": "913980f8d40e748a7f5e97bb65f5e2efce8118d6"
|
||||
},
|
||||
{
|
||||
"path": "original/server-provenance.json",
|
||||
"bytes": 1306,
|
||||
"sha256": "2569099eec89a5a52bc443c316a667e33cb3557e297d7765b4e65bf92d5452c0",
|
||||
"gitBlob": "d04a9fe7ca289bc5202c623e3decabb47c64b8ca"
|
||||
},
|
||||
{
|
||||
"path": "original/toolchain-versions.json",
|
||||
"bytes": 2268,
|
||||
"sha256": "56899a91d935a7bc4619619d820e34620ffdd7e5cd45fda7a205e4ddec9776f9",
|
||||
"gitBlob": "4f2c2ef3d7591b8d7e78e68db6ed384535f63687"
|
||||
},
|
||||
{
|
||||
"path": "original/validate-scripts.ps1",
|
||||
"bytes": 497,
|
||||
"sha256": "7800d1ab132cb3c9ebc75f0e40f2c81f139565432db114326c0128ee66b8fe87",
|
||||
"gitBlob": "1b7c27104d2528d7541f67b0b91a61d74b16ee17"
|
||||
},
|
||||
{
|
||||
"path": "original/verify-parser.ps1",
|
||||
"bytes": 3461,
|
||||
"sha256": "9d59a053f49427c525086a6ea9735f171776171d7a3336143e5b00004c797999",
|
||||
"gitBlob": "441efabcb57dc23f77097196ef247bd0310eb422"
|
||||
},
|
||||
{
|
||||
"path": "README.md",
|
||||
"bytes": 4434,
|
||||
"sha256": "fc3f702058a66e2372c28099c59391480380c3cd4d8c05dfe5555669db47c341",
|
||||
"gitBlob": "30edceeb6435a59e9a5b9a7a0e82805b60c8bdd2"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
# Combined Saved Scenario spacing gate preparation
|
||||
|
||||
Attempt2 is prepared for the fetched user instruction update. The candidate commit awaits finalization; no source enumeration, baseline capture, finalization, compiler, test execution, cleanup, or native launch has been performed here. The parent owns final source review and dispatch.
|
||||
|
||||
This recipe adapts the reviewed `scenario-workspace-gates-attempt3-20260913` runner for the separate `scenario-spacing-ytr83r-20260913` worktree. It retains the shared root `target` and dependency cache with the established jobs=1/incremental=0 environment. The scripts never clean packages. Any separately required package clearance belongs to the parent.
|
||||
|
||||
## Expected membership
|
||||
|
||||
The previous actual desktop listing has 1,045 names. Source adds 36 ordinary tests: nine primitive-hit tests, nine pure spacing tests, five controller tests, seven App adapter tests, and six mounted spacing tests. One additional ignored large-scene timing diagnostic brings the predicted full listing to **1,082**, including four normally ignored cases.
|
||||
|
||||
The exact focused set is **288**: the previous corrected 224 plus all five `app::transition_context_tests`, all 23 `behavior::contextual_source_tests`, and all 36 new ordinary tests. A successful focused run should report 288 passed, zero failed/ignored, and 794 filtered. The timing diagnostic is excluded. `selection-provenance.json` records the initial source-only derivation and hashes; it is not a final source binding or execution result. If review changes names or test membership, update this preparation before finalization. The actual executable listing must match every full and focused expected name before execution continues.
|
||||
|
||||
## Dispatch after the reviewed candidate is committed
|
||||
|
||||
1. Run `finalize.ps1 -SourceCommit <full reviewed SHA>`. It requires a clean exact checkout, independently enumerates Git and on-disk input membership, captures every input and external configuration, and creates the single baseline capture. Input count is derived afresh, not inherited from the 601-input UI gate.
|
||||
2. Parent runs `run.ps1 -Stage list`, then `focused`, `all`, `clippy`, and `build`, sequentially and only after each prior receipt passes.
|
||||
|
||||
The listing binds the actual test executable reported by Cargo. Later stages verify that exact binary before and after execution; focused/full output must name the same executable. Exact per-test results, counts, ignored cases, source hashes, script/config hashes, prior receipts, and raw logs are checked. The GUI build receives a separate path/size/hash/time binding after successful build.
|
||||
|
||||
Strict lint remains `cargo clippy -p oa-desktop -p oa-server --all-targets --locked --offline -- -D warnings`. The prior unchanged core/server evidence is reused only while the finalizer confirms those paths and manifests have not changed from the verified 37 source. Server tests do not substitute for server strict lint. No separate server test repetition is planned.
|
||||
|
||||
## Prior failure and preparation checks
|
||||
|
||||
The closed cb5 gate is preserved unchanged: listing 1,045 and focused 224 passed; the full run had 1,040 passed, two failed, and three ignored, with 601 inputs unchanged. Its failed transition-context and contextual-source evaluators are included in this focused set. Strict lint and GUI build did not run. Finalization records hashes of the original logs, receipts, and input bindings; the previous gate is not combined-source acceptance.
|
||||
|
||||
The preparation syntax check covers the original seven PowerShell scripts plus the optional diagnostic runner. The parser evaluator extracts the runner's actual parsing block and checks nine synthetic cases (valid/invalid exact focused selection and full listing). The earlier preparation receipt is retained; `parser-preparation-verification-timing.json` covers the revised recipe. These checks execute no Cargo or product tests. Finalization reruns the parser check with the finalized recipe in a separate receipt.
|
||||
|
||||
## Optional timing diagnostic
|
||||
|
||||
After the full stage succeeds, the parent may run `diagnostic.ps1`. It directly invokes the exact listed test executable with `--exact behavior::scenario::spacing::controller::timing_tests::saved_spacing_capture_prepare_20_lanes_1000_messages_3_views --ignored --nocapture --test-threads=1`. It never runs Cargo or rebuilds. Clippy does not depend on this optional receipt.
|
||||
|
||||
The runner verifies the prior successful full receipt and its transitive recipe/input hashes, source/config before and after, and exact executable before and after. It requires one named test, one passing summary (1 passed, 0 failed/ignored, 1,081 filtered), and one `SPACING_TIMING_JSON=` payload with schema `scenario_spacing_timing_v1` and `invariant_status: "passed"`. The child receives `SCENARIO_SPACING_SOURCE_PIN`; its reported pin, 20 lanes/1,000 messages/3 views, and 28 samples with the expected phase counts are checked. The caller's previous source-pin environment value is restored. Timing samples are recorded without a speed threshold. The debug-profile diagnostic measures this fixture on this host; it establishes no native responsiveness or release performance guarantee. Existing diagnostic logs and captures cannot be overwritten.
|
||||
|
||||
## Instruction-only retry
|
||||
|
||||
This gate supersedes the preparation-only finalization at `07e611fb9432b5164e43c326f3e3c7e75e1e6567`; that directory remains unchanged, and no Cargo ran there. The only admitted Git change is `AGENTS.md`, with fetched blob `767be18f086c04b7a688b107808e97ac98881356`. `instruction-update-template.json` binds the exact instruction bytes and the original610-input capture. Before making the new baseline capture, finalization requires the same610 paths, lengths and hashes and saves `instruction-update-provenance.json`. No prior generated result is copied as new evidence.
|
||||
|
||||
Independent Gitea peers run on separate machines. These local recipes and captures are available only on this host; the parent owns publication of portable evidence. This host's established local subagent target/cache sharing does not imply shared files, processes or resource constraints with Gitea peers.
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
# Pure file/log readers. No executable is started by these helpers.
|
||||
function Get-GateBinary([string]$Path,[string]$Target) {
|
||||
$resolved=[IO.Path]::GetFullPath($Path)
|
||||
$root=[IO.Path]::GetFullPath($Target).TrimEnd('\','/')+[IO.Path]::DirectorySeparatorChar
|
||||
if(-not $resolved.StartsWith($root,[StringComparison]::OrdinalIgnoreCase)){throw 'Executable path escapes the parent-owned target.'}
|
||||
$item=Get-Item -LiteralPath $resolved
|
||||
[ordered]@{path=$resolved;bytes=$item.Length;sha256=(Get-FileHash -LiteralPath $resolved -Algorithm SHA256).Hash.ToLowerInvariant();mtimeUtc=$item.LastWriteTimeUtc.ToString('o')}
|
||||
}
|
||||
function Get-GateTestBinaries([string]$Log,[string]$Target) {
|
||||
$paths=@([regex]::Matches($Log,'(?m)^\s*Running unittests .+? \(([^\r\n]+\.exe)\)\s*$')|ForEach-Object {$_.Groups[1].Value}|Sort-Object -Unique)
|
||||
foreach($path in $paths){Get-GateBinary $path $Target}
|
||||
}
|
||||
function Same-GateBinaries($Left,$Right) {
|
||||
$a=@($Left|Sort-Object path);$b=@($Right|Sort-Object path)
|
||||
if($a.Count -eq 0 -or $a.Count -ne $b.Count){return $false}
|
||||
for($i=0;$i -lt $a.Count;$i++){
|
||||
if($a[$i].path -ine $b[$i].path -or $a[$i].bytes -ne $b[$i].bytes -or $a[$i].sha256 -cne $b[$i].sha256){return $false}
|
||||
}
|
||||
return $true
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"base": "c4a2cf63f11818cf7fc766acf3a2779768a2a658",
|
||||
"retainExistingTarget": true,
|
||||
"cleanRequested": false,
|
||||
"target": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\target",
|
||||
"scope": "Combined spacing worktree rebuild. Retain shared target/cache and jobs1/incremental0; no clearance is performed by this recipe. Parent owns any separately authorized package clearance. Exact source and executable binding are required."
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
#Requires -Version 7.0
|
||||
param([Parameter(Mandatory=$true)][ValidatePattern('^(before|after|(list|focused|all|clippy|build|diagnostic)-(before|after))$')][string]$Stage)
|
||||
Set-StrictMode -Version Latest
|
||||
$ErrorActionPreference='Stop'
|
||||
$taskWorkspace='C:\Users\User\Documents\Git\ARCADIA-Studio\.local\scenario-spacing-ytr83r-20260913'
|
||||
$taskPin='c4a2cf63f11818cf7fc766acf3a2779768a2a658'
|
||||
function Hash-Input([string]$Path){(Get-FileHash -LiteralPath $Path -Algorithm SHA256).Hash.ToLowerInvariant()}
|
||||
$taskOutput=Join-Path $PSScriptRoot ('inputs-complete-'+$Stage+'.json')
|
||||
if(Test-Path -LiteralPath $taskOutput){throw 'Preserve existing input evidence; use a new directory for retries.'}
|
||||
$pinRecord=Get-Content -Raw -LiteralPath (Join-Path $PSScriptRoot 'expected-inputs.json')|ConvertFrom-Json
|
||||
$enumeration=Get-Content -Raw -LiteralPath (Join-Path $PSScriptRoot 'enumeration.json')|ConvertFrom-Json
|
||||
$external=Get-Content -Raw -LiteralPath (Join-Path $PSScriptRoot 'external-inputs.json')|ConvertFrom-Json
|
||||
if($pinRecord.base -cne $taskPin -or $enumeration.base -cne $taskPin -or $external.base -cne $taskPin){throw 'Wrong input pin.'}
|
||||
Push-Location -LiteralPath $taskWorkspace
|
||||
try {
|
||||
$taskBase=git rev-parse HEAD
|
||||
if($LASTEXITCODE -ne 0 -or $taskBase -cne $taskPin){throw 'Wrong source commit.'}
|
||||
$status=@(git status --porcelain)
|
||||
if($LASTEXITCODE -ne 0 -or $status.Count){throw 'Frozen worktree changed.'}
|
||||
$taskRoots=@($enumeration.rootInputs);$taskScopes=@($enumeration.scopes)
|
||||
$tracked=@(git ls-files -- @taskRoots @taskScopes)
|
||||
if($LASTEXITCODE -ne 0){throw 'Git enumeration failed.'}
|
||||
$tracked=@($tracked | ForEach-Object {$_.Replace('\','/')} | Sort-Object -Unique)
|
||||
$present=@(rg --files @taskScopes)
|
||||
if($LASTEXITCODE -ne 0){throw 'Actual input enumeration failed.'}
|
||||
$taskPaths=@(($present+$taskRoots) | ForEach-Object {$_.Replace('\','/')} | Sort-Object -Unique)
|
||||
if(@(Compare-Object $tracked $taskPaths).Count -or @(Compare-Object @($enumeration.gitPaths) $tracked).Count){throw 'Frozen input membership changed.'}
|
||||
$taskEntries=@($taskPaths | ForEach-Object {$item=Get-Item -LiteralPath $_;[ordered]@{path=$_;bytes=$item.Length;sha256=(Hash-Input $_)}})
|
||||
$externalNow=@(foreach($f in $external.files){
|
||||
$present=Test-Path -LiteralPath $f.path
|
||||
if($present -ne $f.present){throw ('External config presence changed: '+$f.path)}
|
||||
if($present){$item=Get-Item -LiteralPath $f.path;$hash=Hash-Input $f.path;if($item.Length -ne $f.bytes -or $hash -cne $f.sha256){throw ('External input changed: '+$f.path)};[ordered]@{path=$f.path;present=$true;bytes=$item.Length;sha256=$hash}}
|
||||
else{[ordered]@{path=$f.path;present=$false}}
|
||||
})
|
||||
$taskRecord=[ordered]@{capturedUtc=[DateTime]::UtcNow.ToString('o');workspace=$taskWorkspace;base=$taskBase;count=$taskEntries.Count;files=$taskEntries;externalInputs=$externalNow;expectedInputsSha256=(Hash-Input (Join-Path $PSScriptRoot 'expected-inputs.json'));enumerationSha256=(Hash-Input (Join-Path $PSScriptRoot 'enumeration.json'))}
|
||||
$taskRecord|ConvertTo-Json -Depth 8|Set-Content -LiteralPath $taskOutput -Encoding utf8
|
||||
if($taskEntries.Count -ne $pinRecord.count){throw 'Pinned dynamic count changed.'}
|
||||
$expected=@{}
|
||||
foreach($f in $pinRecord.files){if($expected.ContainsKey($f.path)){throw 'Duplicate pinned input.'};$expected[$f.path]=$f}
|
||||
foreach($f in $taskEntries){if(-not $expected.ContainsKey($f.path)){throw 'Unexpected input.'};$old=$expected[$f.path];if($f.bytes -ne $old.bytes -or $f.sha256 -cne $old.sha256){throw ('Input changed: '+$f.path)};$expected.Remove($f.path)}
|
||||
if($expected.Count){throw 'Missing input.'}
|
||||
if($Stage -ne 'before'){
|
||||
$baseline=Get-Content -Raw -LiteralPath (Join-Path $PSScriptRoot 'inputs-complete-before.json')|ConvertFrom-Json
|
||||
if($baseline.base -cne $taskPin -or $baseline.count -ne $pinRecord.count -or $baseline.expectedInputsSha256 -cne $taskRecord.expectedInputsSha256 -or $baseline.enumerationSha256 -cne $taskRecord.enumerationSha256){throw 'Baseline binding changed.'}
|
||||
}
|
||||
Write-Output ('Captured and verified '+$taskEntries.Count+' inputs: '+$Stage)
|
||||
} finally {Pop-Location}
|
||||
@@ -0,0 +1,69 @@
|
||||
#Requires -Version 7.0
|
||||
# Optional after full acceptance; invokes the bound test executable, never Cargo.
|
||||
Set-StrictMode -Version Latest
|
||||
$ErrorActionPreference='Stop'
|
||||
$PSNativeCommandUseErrorActionPreference=$false
|
||||
$taskPin='c4a2cf63f11818cf7fc766acf3a2779768a2a658'
|
||||
if($taskPin -notmatch '^[0-9a-f]{40}$'){throw 'Finalize the reviewed source first.'}
|
||||
$taskWorkspace='C:/Users/User/Documents/Git/ARCADIA-Studio/.local/scenario-spacing-ytr83r-20260913'
|
||||
$taskTarget='C:/Users/User/Documents/Git/ARCADIA-Studio/target'
|
||||
function Hash-Input([string]$Path){(Get-FileHash -LiteralPath $Path -Algorithm SHA256).Hash.ToLowerInvariant()}
|
||||
. (Join-Path $PSScriptRoot 'binary-inputs.ps1')
|
||||
$log=Join-Path $PSScriptRoot 'diagnostic.log'
|
||||
$receiptPath=Join-Path $PSScriptRoot 'diagnostic-receipt.json'
|
||||
if((Test-Path -LiteralPath $log)-or(Test-Path -LiteralPath $receiptPath)){throw 'Preserve existing diagnostic evidence.'}
|
||||
$priorPath=Join-Path $PSScriptRoot 'all-receipt.json'
|
||||
$prior=Get-Content -Raw -LiteralPath $priorPath|ConvertFrom-Json
|
||||
if($prior.stage -cne 'all' -or $prior.base -cne $taskPin -or $prior.workspace.Replace('\','/') -cne $taskWorkspace -or $prior.target.Replace('\','/') -cne $taskTarget -or $prior.cargoExitCode -ne 0 -or -not $prior.selectionValid -or -not $prior.inputsUnchanged -or -not $prior.testBinaryBindingValid){throw 'The exact full stage has not passed.'}
|
||||
$bound=@{}
|
||||
foreach($property in $prior.boundScriptAndInputHashes.PSObject.Properties){
|
||||
$hash=Hash-Input (Join-Path $PSScriptRoot $property.Name)
|
||||
if($hash -cne $property.Value){throw ('Prior binding changed: '+$property.Name)}
|
||||
$bound[$property.Name]=$hash
|
||||
}
|
||||
foreach($name in @('all-receipt.json','all.log','toolchain-versions.json')){$bound[$name]=Hash-Input (Join-Path $PSScriptRoot $name)}
|
||||
if($bound['all.log'] -cne $prior.rawLogSha256 -or $bound['toolchain-versions.json'] -cne $prior.toolchainVersionsSha256){throw 'Full log/toolchain receipt changed.'}
|
||||
if(-not $bound.ContainsKey('diagnostic.ps1')){throw 'Diagnostic recipe was not bound by the full gate.'}
|
||||
$selection=Get-Content -Raw -LiteralPath (Join-Path $PSScriptRoot 'expected-tests.json')|ConvertFrom-Json
|
||||
$name=$selection.diagnostic_test
|
||||
if($selection.source_commit -cne $taskPin -or $name -cnotin $selection.ignored_tests -or $name -cnotin $selection.desktop_tests -or $name -cin $selection.tests){throw 'Wrong ignored diagnostic membership.'}
|
||||
$binaries=@($prior.testExecutables|ForEach-Object {Get-GateBinary $_.path $taskTarget})
|
||||
if($binaries.Count -ne 1 -or -not (Same-GateBinaries @($prior.testExecutables) $binaries)){throw 'Previously listed test executable changed.'}
|
||||
& (Join-Path $PSScriptRoot 'capture.ps1') -Stage diagnostic-before
|
||||
$arguments=@('--exact',$name,'--ignored','--nocapture','--test-threads=1')
|
||||
$started=[DateTime]::UtcNow.ToString('o')
|
||||
$exitCode=$null;$finished=$null;$failure=$null;$valid=$false;$unchanged=$false;$after=@();$summaries=@();$payload=$null
|
||||
$hadSourcePin=Test-Path Env:SCENARIO_SPACING_SOURCE_PIN
|
||||
$previousSourcePin=$env:SCENARIO_SPACING_SOURCE_PIN
|
||||
Push-Location -LiteralPath $taskWorkspace
|
||||
try {
|
||||
. 'C:/Users/User/Documents/Git/ARCADIA-Studio/.local/toolchain/env.ps1'
|
||||
$env:SCENARIO_SPACING_SOURCE_PIN=$taskPin
|
||||
$executable=$binaries[0].path
|
||||
& $executable @arguments 2>&1|Tee-Object -FilePath $log
|
||||
$exitCode=$LASTEXITCODE
|
||||
$finished=[DateTime]::UtcNow.ToString('o')
|
||||
$raw=Get-Content -Raw -LiteralPath $log
|
||||
$startedNames=@([regex]::Matches($raw,'(?m)^test ([^\r\n]+?) \.\.\. ')|ForEach-Object {$_.Groups[1].Value})
|
||||
$summaries=@([regex]::Matches($raw,'test result: (ok|FAILED)\. (\d+) passed; (\d+) failed; (\d+) ignored; (\d+) measured; (\d+) filtered out;')|ForEach-Object {[ordered]@{status=$_.Groups[1].Value;passed=[int]$_.Groups[2].Value;failed=[int]$_.Groups[3].Value;ignored=[int]$_.Groups[4].Value;measured=[int]$_.Groups[5].Value;filtered=[int]$_.Groups[6].Value}})
|
||||
$json=@([regex]::Matches($raw,'SPACING_TIMING_JSON=(\{[^\r\n]+\})'))
|
||||
if($json.Count -eq 1){$payload=$json[0].Groups[1].Value|ConvertFrom-Json}
|
||||
$valid=$exitCode -eq 0 -and $startedNames.Count -eq 1 -and $startedNames[0] -ceq $name -and $summaries.Count -eq 1 -and $summaries[0].status -ceq 'ok' -and $summaries[0].passed -eq 1 -and $summaries[0].failed -eq 0 -and $summaries[0].ignored -eq 0 -and $summaries[0].measured -eq 0 -and $summaries[0].filtered -eq (@($selection.desktop_tests).Count-1) -and $null -ne $payload -and $payload.invariant_status -ceq 'passed'
|
||||
if($valid){
|
||||
$valid=$payload.schema -ceq 'scenario_spacing_timing_v1' -and $payload.profile_context.source_pin_from_runner -ceq $taskPin -and $payload.fixture.lanes -eq 20 -and $payload.fixture.messages -eq 1000 -and $payload.fixture.saved_views -eq 3 -and $payload.fixture.target_index -eq 500 -and $payload.fixture.distinct_message_ids -eq 1000 -and @($payload.samples).Count -eq 28
|
||||
foreach($phase in @(@('capture_message',4),@('prepare_message',20),@('capture_lane',1),@('prepare_lane',3))){$valid=$valid -and @($payload.samples|Where-Object phase -CEQ $phase[0]).Count -eq $phase[1]}
|
||||
}
|
||||
} catch {$failure=$_.Exception.Message}
|
||||
finally {
|
||||
if($hadSourcePin){$env:SCENARIO_SPACING_SOURCE_PIN=$previousSourcePin}else{Remove-Item Env:SCENARIO_SPACING_SOURCE_PIN -ErrorAction SilentlyContinue}
|
||||
Pop-Location
|
||||
try {
|
||||
& (Join-Path $PSScriptRoot 'capture.ps1') -Stage diagnostic-after
|
||||
$after=@($binaries|ForEach-Object {Get-GateBinary $_.path $taskTarget})
|
||||
if(-not (Same-GateBinaries $binaries $after)){throw 'Diagnostic executable changed during execution.'}
|
||||
foreach($file in $bound.Keys){if((Hash-Input (Join-Path $PSScriptRoot $file)) -cne $bound[$file]){throw ('Bound input changed: '+$file)}}
|
||||
$unchanged=$true
|
||||
} catch {$failure=$_.Exception.Message}
|
||||
[ordered]@{stage='diagnostic';base=$taskPin;workspace=$taskWorkspace;test=$name;arguments=$arguments;startUtc=$started;endUtc=$finished;exitCode=$exitCode;selectionValid=$valid;inputsUnchanged=$unchanged;failure=$failure;priorFullReceiptSha256=$bound['all-receipt.json'];boundHashes=$bound;binaryBefore=$binaries;binaryAfter=$after;summary=$summaries;timing=$payload;rawLogSha256=if(Test-Path -LiteralPath $log){Hash-Input $log}else{$null};beforeCaptureSha256=(Hash-Input (Join-Path $PSScriptRoot 'inputs-complete-diagnostic-before.json'));afterCaptureSha256=if(Test-Path -LiteralPath (Join-Path $PSScriptRoot 'inputs-complete-diagnostic-after.json')){Hash-Input (Join-Path $PSScriptRoot 'inputs-complete-diagnostic-after.json')}else{$null};scope='Optional debug-profile diagnostic; not a responsiveness budget or release performance claim. No Cargo, compile, native UI or persistent model edits.'}|ConvertTo-Json -Depth 16|Set-Content -LiteralPath $receiptPath -Encoding utf8
|
||||
}
|
||||
if(-not $valid -or -not $unchanged -or $failure){throw 'Diagnostic failed; inspect retained receipt and raw log.'}
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
#Requires -Version 7.0
|
||||
$ErrorActionPreference='Stop'
|
||||
if(Test-Path -LiteralPath (Join-Path $PSScriptRoot 'enumeration.json')){throw 'Preserve existing enumeration; use a new gate for retries.'}
|
||||
Set-StrictMode -Version Latest
|
||||
$workspace='C:\Users\User\Documents\Git\ARCADIA-Studio\.local\scenario-spacing-ytr83r-20260913'
|
||||
$pin='c4a2cf63f11818cf7fc766acf3a2779768a2a658'
|
||||
Push-Location -LiteralPath $workspace
|
||||
try {
|
||||
$head=git rev-parse HEAD
|
||||
if($LASTEXITCODE -ne 0 -or $head -cne $pin){throw 'Wrong frozen pin'}
|
||||
$status=@(git status --porcelain)
|
||||
if($LASTEXITCODE -ne 0 -or $status.Count){throw 'Frozen worktree is not clean'}
|
||||
$scopes=@('crates','docs','examples','build','harness/fixtures','harness/experiments/textual-authoring-20260911')
|
||||
$roots=@('Cargo.toml','Cargo.lock','rust-toolchain.toml')
|
||||
$tracked=@(git ls-files -- @roots @scopes)
|
||||
if($LASTEXITCODE -ne 0){throw 'Git enumeration failed'}
|
||||
$tracked=@($tracked | ForEach-Object { $_.Replace('\','/') } | Sort-Object -Unique)
|
||||
$present=@(rg --files @scopes)
|
||||
if($LASTEXITCODE -ne 0){throw 'Independent rg enumeration failed'}
|
||||
$present=@(($present+$roots) | ForEach-Object { $_.Replace('\','/') } | Sort-Object -Unique)
|
||||
if(@(Compare-Object $tracked $present).Count){throw 'Git and actual file memberships differ'}
|
||||
$gitTree=git rev-parse 'HEAD^{tree}'
|
||||
if($LASTEXITCODE -ne 0){throw 'Tree identity unavailable'}
|
||||
$record=[ordered]@{base=$head;tree=$gitTree;workspace=$workspace;capturedUtc=[DateTime]::UtcNow.ToString('o');scopes=$scopes;rootInputs=$roots;gitCount=$tracked.Count;rgCount=$present.Count;gitPaths=$tracked;rgPaths=$present}
|
||||
$record|ConvertTo-Json -Depth 6|Set-Content -LiteralPath (Join-Path $PSScriptRoot 'enumeration.json') -Encoding utf8
|
||||
Write-Output ('Verified Git/rg membership '+$tracked.Count+' at '+$head)
|
||||
} finally {Pop-Location}
|
||||
+1245
File diff suppressed because it is too large
Load Diff
+3057
File diff suppressed because it is too large
Load Diff
+1392
File diff suppressed because it is too large
Load Diff
+44
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"base": "PENDING_REVIEWED_SOURCE_PIN",
|
||||
"status": "External environment/config provenance; these paths are not claimed version-controlled",
|
||||
"files": [
|
||||
{
|
||||
"path": "C:/Users/User/Documents/Git/ARCADIA-Studio/.local/toolchain/env.ps1",
|
||||
"present": true,
|
||||
"bytes": 572,
|
||||
"sha256": "be2226f08764bb6961b4be8513ce55bab076890cddd2fef0f54a4031f94a82d4"
|
||||
},
|
||||
{
|
||||
"path": "C:/Users/User/Documents/Git/ARCADIA-Studio/.cargo/config",
|
||||
"present": false
|
||||
},
|
||||
{
|
||||
"path": "C:/Users/User/Documents/Git/ARCADIA-Studio/.local/.cargo/config",
|
||||
"present": false
|
||||
},
|
||||
{
|
||||
"path": "C:/Users/User/Documents/Git/ARCADIA-Studio/.local/scenario-spacing-ytr83r-20260913/.cargo/config",
|
||||
"present": false
|
||||
},
|
||||
{
|
||||
"path": "C:/Users/User/Documents/Git/ARCADIA-Studio/.local/toolchain/cargo/config",
|
||||
"present": false
|
||||
},
|
||||
{
|
||||
"path": "C:/Users/User/Documents/Git/ARCADIA-Studio/.cargo/config.toml",
|
||||
"present": false
|
||||
},
|
||||
{
|
||||
"path": "C:/Users/User/Documents/Git/ARCADIA-Studio/.local/.cargo/config.toml",
|
||||
"present": false
|
||||
},
|
||||
{
|
||||
"path": "C:/Users/User/Documents/Git/ARCADIA-Studio/.local/scenario-spacing-ytr83r-20260913/.cargo/config.toml",
|
||||
"present": false
|
||||
},
|
||||
{
|
||||
"path": "C:/Users/User/Documents/Git/ARCADIA-Studio/.local/toolchain/cargo/config.toml",
|
||||
"present": false
|
||||
}
|
||||
]
|
||||
}
|
||||
+44
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"base": "c4a2cf63f11818cf7fc766acf3a2779768a2a658",
|
||||
"status": "Fresh external environment/config snapshot; not version-controlled inputs",
|
||||
"files": [
|
||||
{
|
||||
"path": "C:/Users/User/Documents/Git/ARCADIA-Studio/.local/toolchain/env.ps1",
|
||||
"present": true,
|
||||
"bytes": 572,
|
||||
"sha256": "be2226f08764bb6961b4be8513ce55bab076890cddd2fef0f54a4031f94a82d4"
|
||||
},
|
||||
{
|
||||
"path": "C:/Users/User/Documents/Git/ARCADIA-Studio/.cargo/config",
|
||||
"present": false
|
||||
},
|
||||
{
|
||||
"path": "C:/Users/User/Documents/Git/ARCADIA-Studio/.local/.cargo/config",
|
||||
"present": false
|
||||
},
|
||||
{
|
||||
"path": "C:/Users/User/Documents/Git/ARCADIA-Studio/.local/scenario-spacing-ytr83r-20260913/.cargo/config",
|
||||
"present": false
|
||||
},
|
||||
{
|
||||
"path": "C:/Users/User/Documents/Git/ARCADIA-Studio/.local/toolchain/cargo/config",
|
||||
"present": false
|
||||
},
|
||||
{
|
||||
"path": "C:/Users/User/Documents/Git/ARCADIA-Studio/.cargo/config.toml",
|
||||
"present": false
|
||||
},
|
||||
{
|
||||
"path": "C:/Users/User/Documents/Git/ARCADIA-Studio/.local/.cargo/config.toml",
|
||||
"present": false
|
||||
},
|
||||
{
|
||||
"path": "C:/Users/User/Documents/Git/ARCADIA-Studio/.local/scenario-spacing-ytr83r-20260913/.cargo/config.toml",
|
||||
"present": false
|
||||
},
|
||||
{
|
||||
"path": "C:/Users/User/Documents/Git/ARCADIA-Studio/.local/toolchain/cargo/config.toml",
|
||||
"present": false
|
||||
}
|
||||
]
|
||||
}
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"base": "c4a2cf63f11818cf7fc766acf3a2779768a2a658",
|
||||
"capturedUtc": "2026-09-13T08:56:08.5556475Z",
|
||||
"sourceCount": 610,
|
||||
"focusedCount": 288,
|
||||
"desktopExpectedCount": 1082,
|
||||
"cleanPerformed": false,
|
||||
"cargoExecuted": false,
|
||||
"sourceBeforeSha256": "46a51390d6d9de96117ca10f0977a3e938b0f469e21375f7a99885ee185fe7ae",
|
||||
"selectionSha256": "92d17487dc077e46e3e708ee369c016470d3e54b52f90730aefb48db002c83ed",
|
||||
"parserSha256": "2287033fb362ccc8e8c0221277c6c0020c9a8e54f6a7ae5616c8afbebb6a334c",
|
||||
"status": "Prepared only; parent dispatches list, focused, all, clippy, build sequentially"
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
#Requires -Version 7.0
|
||||
param([Parameter(Mandatory=$true)][ValidatePattern('^[0-9a-f]{40}$')][string]$SourceCommit)
|
||||
Set-StrictMode -Version Latest
|
||||
$ErrorActionPreference='Stop'
|
||||
$workspace='C:/Users/User/Documents/Git/ARCADIA-Studio/.local/scenario-spacing-ytr83r-20260913'
|
||||
$root='C:/Users/User/Documents/Git/ARCADIA-Studio'
|
||||
if(Test-Path -LiteralPath (Join-Path $PSScriptRoot 'finalization.json')){throw 'Already finalized; preserve this gate.'}
|
||||
foreach($name in @('enumeration.json','expected-inputs.json','external-inputs.json','inputs-complete-before.json','toolchain-versions.json','list.log','list-receipt.json')){
|
||||
if(Test-Path -LiteralPath (Join-Path $PSScriptRoot $name)){throw ('Prior capture or run exists: '+$name)}
|
||||
}
|
||||
function Hash-Input([string]$Path){(Get-FileHash -LiteralPath $Path -Algorithm SHA256).Hash.ToLowerInvariant()}
|
||||
function Save-Record([string]$Name,$Record){$Record|ConvertTo-Json -Depth 16|Set-Content -LiteralPath (Join-Path $PSScriptRoot $Name) -Encoding utf8}
|
||||
Push-Location -LiteralPath $workspace
|
||||
try {
|
||||
$head=git rev-parse HEAD
|
||||
if($LASTEXITCODE -ne 0 -or $head -cne $SourceCommit){throw 'Source is not at the reviewed pin.'}
|
||||
$status=@(git status --porcelain)
|
||||
if($LASTEXITCODE -ne 0 -or $status.Count){throw 'Source must be committed and clean.'}
|
||||
$instruction=Get-Content -Raw -LiteralPath (Join-Path $PSScriptRoot 'instruction-update-template.json')|ConvertFrom-Json
|
||||
$changes=@(git diff --name-only $instruction.previous_source $SourceCommit)
|
||||
if($LASTEXITCODE -ne 0 -or $changes.Count -ne 1 -or $changes[0] -cne 'AGENTS.md'){throw 'Expected only the fetched user instruction update.'}
|
||||
$instructionBlob=git rev-parse 'HEAD:AGENTS.md'
|
||||
if($LASTEXITCODE -ne 0 -or $instructionBlob -cne $instruction.instruction_git_blob -or (Get-Item -LiteralPath 'AGENTS.md').Length -ne $instruction.instruction_bytes -or (Hash-Input 'AGENTS.md') -cne $instruction.instruction_sha256){throw 'Fetched user instructions do not match the reviewed bytes.'}
|
||||
$serverChanges=@(git diff --name-only 37be41092beb1c940f345072df1e017ce45fe2fc $SourceCommit -- crates/oa-core crates/oa-server Cargo.toml Cargo.lock rust-toolchain.toml)
|
||||
if($LASTEXITCODE -ne 0 -or $serverChanges.Count){throw 'Core/server provenance changed; parent must revise gate scope.'}
|
||||
} finally {Pop-Location}
|
||||
foreach($name in @('run.ps1','capture.ps1','enumerate-inputs.ps1','diagnostic.ps1')){
|
||||
$path=Join-Path $PSScriptRoot $name
|
||||
$text=[IO.File]::ReadAllText($path)
|
||||
if(-not $text.Contains('PENDING_REVIEWED_SOURCE_PIN')){throw 'Template was already modified; inspect before retry.'}
|
||||
[IO.File]::WriteAllText($path,$text.Replace('PENDING_REVIEWED_SOURCE_PIN',$SourceCommit),[Text.UTF8Encoding]::new($false))
|
||||
}
|
||||
$selection=Get-Content -Raw -LiteralPath (Join-Path $PSScriptRoot 'expected-tests.json')|ConvertFrom-Json
|
||||
if(@($selection.tests).Count -ne 288 -or @($selection.tests|Sort-Object -Unique).Count -ne 288 -or @($selection.desktop_tests).Count -ne 1082 -or @($selection.desktop_tests|Sort-Object -Unique).Count -ne 1082){throw 'Expected membership changed; parent must review selection.'}
|
||||
if(@($selection.tests|Where-Object {$_ -cnotin $selection.desktop_tests}).Count){throw 'Focused test absent from expected desktop listing.'}
|
||||
$selection.source_commit=$SourceCommit
|
||||
Save-Record 'expected-tests.json' $selection
|
||||
& (Join-Path $PSScriptRoot 'enumerate-inputs.ps1')
|
||||
$enumeration=Get-Content -Raw -LiteralPath (Join-Path $PSScriptRoot 'enumeration.json')|ConvertFrom-Json
|
||||
$inputs=@(foreach($relative in $enumeration.gitPaths){$path=Join-Path $workspace $relative;$item=Get-Item -LiteralPath $path;[ordered]@{path=$relative;bytes=$item.Length;sha256=(Hash-Input $path)}})
|
||||
$previousCapture=$instruction.previous_capture
|
||||
if((Get-Item -LiteralPath $previousCapture.path).Length -ne $previousCapture.bytes -or (Hash-Input $previousCapture.path) -cne $previousCapture.sha256){throw 'Preserve the bound previous preparation capture.'}
|
||||
$previous=Get-Content -Raw -LiteralPath $previousCapture.path|ConvertFrom-Json
|
||||
if($previous.base -cne $instruction.previous_source -or $previous.count -ne 610 -or $inputs.Count -ne 610){throw 'Instruction-only update changed input count.'}
|
||||
$remaining=@{}
|
||||
foreach($file in $previous.files){if($remaining.ContainsKey($file.path)){throw 'Duplicate previous input'};$remaining[$file.path]=$file}
|
||||
foreach($file in $inputs){if(-not $remaining.ContainsKey($file.path)){throw ('New compiled input: '+$file.path)};$old=$remaining[$file.path];if($file.bytes -ne $old.bytes -or $file.sha256 -cne $old.sha256){throw ('Instruction-only update changed compiled input: '+$file.path)};$remaining.Remove($file.path)}
|
||||
if($remaining.Count){throw 'A previously captured compiled input is missing.'}
|
||||
$instruction|Add-Member -NotePropertyName source_commit -NotePropertyValue $SourceCommit
|
||||
$instruction|Add-Member -NotePropertyName compiled_inputs_equal -NotePropertyValue $true
|
||||
$instruction.status='Verified fetched instruction-only commit and all610 compiled input bytes equal prior07e preparation. No Cargo executed.'
|
||||
Save-Record 'instruction-update-provenance.json' $instruction
|
||||
Save-Record 'expected-inputs.json' ([ordered]@{base=$SourceCommit;workspace=$workspace;count=$inputs.Count;files=$inputs})
|
||||
$external=Get-Content -Raw -LiteralPath (Join-Path $PSScriptRoot 'external-input-template.json')|ConvertFrom-Json
|
||||
$externalFiles=@(foreach($file in $external.files){$present=Test-Path -LiteralPath $file.path;if($present){$item=Get-Item -LiteralPath $file.path;[ordered]@{path=$file.path;present=$true;bytes=$item.Length;sha256=(Hash-Input $file.path)}}else{[ordered]@{path=$file.path;present=$false}}})
|
||||
Save-Record 'external-inputs.json' ([ordered]@{base=$SourceCommit;status='Fresh external environment/config snapshot; not version-controlled inputs';files=$externalFiles})
|
||||
$server=Get-Content -Raw -LiteralPath (Join-Path $PSScriptRoot 'server-provenance-template.json')|ConvertFrom-Json
|
||||
$server.source=$SourceCommit
|
||||
Save-Record 'server-provenance.json' $server
|
||||
Save-Record 'cache-policy.json' ([ordered]@{base=$SourceCommit;retainExistingTarget=$true;cleanRequested=$false;target=(Join-Path $root 'target');scope='Combined spacing worktree rebuild. Retain shared target/cache and jobs1/incremental0; no clearance is performed by this recipe. Parent owns any separately authorized package clearance. Exact source and executable binding are required.'})
|
||||
$previous=Join-Path $root '.local/scenario-workspace-gates-attempt3-20260913'
|
||||
$receipt=Get-Content -Raw -LiteralPath (Join-Path $previous 'all-receipt.json')|ConvertFrom-Json
|
||||
$files=@('list.log','list-receipt.json','focused.log','focused-receipt.json','all.log','all-receipt.json','inputs-complete-before.json','inputs-complete-all-after.json','expected-tests.json')
|
||||
$bindings=@(foreach($name in $files){$path=Join-Path $previous $name;$item=Get-Item -LiteralPath $path;[ordered]@{path=$path;bytes=$item.Length;sha256=(Hash-Input $path)}})
|
||||
Save-Record 'prior-failure-provenance.json' ([ordered]@{source=$SourceCommit;previousSource=$receipt.base;scope='Closed cb5 list1045 and focused224 passed; full1040 passed,2 failed,3 ignored. Full failed; strict/build not run. Prior gate is immutable and does not establish combined candidate acceptance.';bindings=$bindings;cargoExitCode=$receipt.cargoExitCode;inputsUnchanged=$receipt.inputsUnchanged;result=$receipt.testResultSummaries;failed=@($receipt.executedTests|Where-Object result -eq 'FAILED')})
|
||||
& (Join-Path $PSScriptRoot 'capture.ps1') -Stage before
|
||||
& (Join-Path $PSScriptRoot 'validate-scripts.ps1')
|
||||
& (Join-Path $PSScriptRoot 'verify-parser.ps1')
|
||||
Save-Record 'finalization.json' ([ordered]@{base=$SourceCommit;capturedUtc=[DateTime]::UtcNow.ToString('o');sourceCount=$inputs.Count;focusedCount=288;desktopExpectedCount=1082;cleanPerformed=$false;cargoExecuted=$false;sourceBeforeSha256=(Hash-Input (Join-Path $PSScriptRoot 'inputs-complete-before.json'));selectionSha256=(Hash-Input (Join-Path $PSScriptRoot 'expected-tests.json'));parserSha256=(Hash-Input (Join-Path $PSScriptRoot 'parser-verification.json'));status='Prepared only; parent dispatches list, focused, all, clippy, build sequentially'})
|
||||
Write-Output ('Finalized source-only gate for '+$SourceCommit+' with '+$inputs.Count+' inputs; no Cargo or clean executed.')
|
||||
+1820
File diff suppressed because one or more lines are too long
+3100
File diff suppressed because it is too large
Load Diff
+3100
File diff suppressed because it is too large
Load Diff
+3100
File diff suppressed because it is too large
Load Diff
+3100
File diff suppressed because it is too large
Load Diff
+3100
File diff suppressed because it is too large
Load Diff
+21
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"status": "Verified fetched instruction-only commit and all610 compiled input bytes equal prior07e preparation. No Cargo executed.",
|
||||
"previous_source": "07e611fb9432b5164e43c326f3e3c7e75e1e6567",
|
||||
"previous_capture": {
|
||||
"path": "C:/Users/User/Documents/Git/ARCADIA-Studio/.local/scenario-spacing-gates-20260913/inputs-complete-before.json",
|
||||
"bytes": 118980,
|
||||
"sha256": "7bdca4a4e36d84aea7cdf2e7ea565d727b89bdd0dff5348d2da3dcb5860d2580",
|
||||
"count": 610
|
||||
},
|
||||
"fetched_instruction_commit": "6ef6868",
|
||||
"instruction_path": "AGENTS.md",
|
||||
"instruction_git_blob": "767be18f086c04b7a688b107808e97ac98881356",
|
||||
"instruction_bytes": 12623,
|
||||
"instruction_sha256": "0de97dcfacc608f20f828ec529033ff9830641a9069855b85d36b54e52dbd897",
|
||||
"expected_changed_paths": [
|
||||
"AGENTS.md"
|
||||
],
|
||||
"scope": "All610 compiled inputs must remain byte-identical; AGENTS is excluded from compiled-input enumeration and is verified separately. Local-only preparation; parent handles shared Gitea publication.",
|
||||
"source_commit": "c4a2cf63f11818cf7fc766acf3a2779768a2a658",
|
||||
"compiled_inputs_equal": true
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"status": "Pending final source verification; previous gate finalized preparation only, no Cargo ever; superseded by this instruction-update gate without modifying previous evidence",
|
||||
"previous_source": "07e611fb9432b5164e43c326f3e3c7e75e1e6567",
|
||||
"previous_capture": {
|
||||
"path": "C:/Users/User/Documents/Git/ARCADIA-Studio/.local/scenario-spacing-gates-20260913/inputs-complete-before.json",
|
||||
"bytes": 118980,
|
||||
"sha256": "7bdca4a4e36d84aea7cdf2e7ea565d727b89bdd0dff5348d2da3dcb5860d2580",
|
||||
"count": 610
|
||||
},
|
||||
"fetched_instruction_commit": "6ef6868",
|
||||
"instruction_path": "AGENTS.md",
|
||||
"instruction_git_blob": "767be18f086c04b7a688b107808e97ac98881356",
|
||||
"instruction_bytes": 12623,
|
||||
"instruction_sha256": "0de97dcfacc608f20f828ec529033ff9830641a9069855b85d36b54e52dbd897",
|
||||
"expected_changed_paths": [
|
||||
"AGENTS.md"
|
||||
],
|
||||
"scope": "All610 compiled inputs must remain byte-identical; AGENTS is excluded from compiled-input enumeration and is verified separately. Local-only preparation; parent handles shared Gitea publication."
|
||||
}
|
||||
+1447
File diff suppressed because it is too large
Load Diff
+52
@@ -0,0 +1,52 @@
|
||||
{
|
||||
"status": "Synthetic actual-runner parser checks only; no Cargo or product tests",
|
||||
"focusedCount": 288,
|
||||
"runnerSha256": "b0930b139900f134da037dcf75d1df55fc1a474287180ea9b0ad24c2f6c75bee",
|
||||
"cases": [
|
||||
{
|
||||
"case": "focused-exact",
|
||||
"expected": true,
|
||||
"actual": true
|
||||
},
|
||||
{
|
||||
"case": "focused-zero",
|
||||
"expected": false,
|
||||
"actual": false
|
||||
},
|
||||
{
|
||||
"case": "focused-duplicate",
|
||||
"expected": false,
|
||||
"actual": false
|
||||
},
|
||||
{
|
||||
"case": "focused-missing",
|
||||
"expected": false,
|
||||
"actual": false
|
||||
},
|
||||
{
|
||||
"case": "focused-wrong-total",
|
||||
"expected": false,
|
||||
"actual": false
|
||||
},
|
||||
{
|
||||
"case": "focused-wrong-filtered",
|
||||
"expected": false,
|
||||
"actual": false
|
||||
},
|
||||
{
|
||||
"case": "list-complete",
|
||||
"expected": true,
|
||||
"actual": true
|
||||
},
|
||||
{
|
||||
"case": "list-missing-summary",
|
||||
"expected": false,
|
||||
"actual": false
|
||||
},
|
||||
{
|
||||
"case": "list-duplicate",
|
||||
"expected": false,
|
||||
"actual": false
|
||||
}
|
||||
]
|
||||
}
|
||||
+52
@@ -0,0 +1,52 @@
|
||||
{
|
||||
"status": "Synthetic actual-runner parser checks only; no Cargo or product tests",
|
||||
"focusedCount": 288,
|
||||
"runnerSha256": "09ed2f7be70f333b018844005b78760fb31773c5c12b84ebf4a06365f29fc790",
|
||||
"cases": [
|
||||
{
|
||||
"case": "focused-exact",
|
||||
"expected": true,
|
||||
"actual": true
|
||||
},
|
||||
{
|
||||
"case": "focused-zero",
|
||||
"expected": false,
|
||||
"actual": false
|
||||
},
|
||||
{
|
||||
"case": "focused-duplicate",
|
||||
"expected": false,
|
||||
"actual": false
|
||||
},
|
||||
{
|
||||
"case": "focused-missing",
|
||||
"expected": false,
|
||||
"actual": false
|
||||
},
|
||||
{
|
||||
"case": "focused-wrong-total",
|
||||
"expected": false,
|
||||
"actual": false
|
||||
},
|
||||
{
|
||||
"case": "focused-wrong-filtered",
|
||||
"expected": false,
|
||||
"actual": false
|
||||
},
|
||||
{
|
||||
"case": "list-complete",
|
||||
"expected": true,
|
||||
"actual": true
|
||||
},
|
||||
{
|
||||
"case": "list-missing-summary",
|
||||
"expected": false,
|
||||
"actual": false
|
||||
},
|
||||
{
|
||||
"case": "list-duplicate",
|
||||
"expected": false,
|
||||
"actual": false
|
||||
}
|
||||
]
|
||||
}
|
||||
+74
@@ -0,0 +1,74 @@
|
||||
{
|
||||
"source": "c4a2cf63f11818cf7fc766acf3a2779768a2a658",
|
||||
"previousSource": "cb5d50de03a002079da17e6f92ea44c32f7ece75",
|
||||
"scope": "Closed cb5 list1045 and focused224 passed; full1040 passed,2 failed,3 ignored. Full failed; strict/build not run. Prior gate is immutable and does not establish combined candidate acceptance.",
|
||||
"bindings": [
|
||||
{
|
||||
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-workspace-gates-attempt3-20260913\\list.log",
|
||||
"bytes": 114881,
|
||||
"sha256": "2211838e02b434b589e21f767ffa720b908080421dcfc7e824e344b1d75ce1cf"
|
||||
},
|
||||
{
|
||||
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-workspace-gates-attempt3-20260913\\list-receipt.json",
|
||||
"bytes": 145701,
|
||||
"sha256": "79601d16e4b401853ec81461db65a698233c4214f829a1f455cc98c5ccc82896"
|
||||
},
|
||||
{
|
||||
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-workspace-gates-attempt3-20260913\\focused.log",
|
||||
"bytes": 27977,
|
||||
"sha256": "10bffc9b5ab8363d7b88f1b4ce96a149e22bccd2d6dcee734e8bb644f1e65f35"
|
||||
},
|
||||
{
|
||||
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-workspace-gates-attempt3-20260913\\focused-receipt.json",
|
||||
"bytes": 119138,
|
||||
"sha256": "e508e7c11e196c1ae1b848e3cf8877bf4efb7586e58f038fb8917696674b2329"
|
||||
},
|
||||
{
|
||||
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-workspace-gates-attempt3-20260913\\all.log",
|
||||
"bytes": 122708,
|
||||
"sha256": "36da5a271feb222b5fa5d496b0173632389e670bcefe5bef0a489bf7bb8243aa"
|
||||
},
|
||||
{
|
||||
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-workspace-gates-attempt3-20260913\\all-receipt.json",
|
||||
"bytes": 195871,
|
||||
"sha256": "81f34fe004c4ff6229d1d4214569b671a755cbd349ba51d58dca13aceb9ae285"
|
||||
},
|
||||
{
|
||||
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-workspace-gates-attempt3-20260913\\inputs-complete-before.json",
|
||||
"bytes": 117198,
|
||||
"sha256": "39aa11b2eb80c8e848a70e3f09e4fcfa7fdbf34b6abf10d25e448c679d0493fb"
|
||||
},
|
||||
{
|
||||
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-workspace-gates-attempt3-20260913\\inputs-complete-all-after.json",
|
||||
"bytes": 117198,
|
||||
"sha256": "97c08eeb457178136da5253c4ff8b042ccdbc63a1023ebf0b67ab9f1fe9f85df"
|
||||
},
|
||||
{
|
||||
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\scenario-workspace-gates-attempt3-20260913\\expected-tests.json",
|
||||
"bytes": 143154,
|
||||
"sha256": "ba4f8bdae78b3e871c0bf031e86f5e5d766eb7416f851fd91b99a6e9c4aee84b"
|
||||
}
|
||||
],
|
||||
"cargoExitCode": 101,
|
||||
"inputsUnchanged": true,
|
||||
"result": [
|
||||
{
|
||||
"status": "FAILED",
|
||||
"passed": 1040,
|
||||
"failed": 2,
|
||||
"ignored": 3,
|
||||
"measured": 0,
|
||||
"filtered": 0
|
||||
}
|
||||
],
|
||||
"failed": [
|
||||
{
|
||||
"name": "app::transition_context_tests::scenario_transition_focuses_requested_counterpart_and_preserves_unrelated_views_in_both_directions",
|
||||
"result": "FAILED"
|
||||
},
|
||||
{
|
||||
"name": "behavior::contextual_source_tests::contextual_source_empty_palette_lifeline_cannot_open_a_previous_owner_or_layer",
|
||||
"result": "FAILED"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,133 @@
|
||||
#Requires -Version 7.0
|
||||
param([Parameter(Mandatory=$true)][ValidateSet('list','focused','all','clippy','build')][string]$Stage)
|
||||
Set-StrictMode -Version Latest
|
||||
$ErrorActionPreference='Stop'
|
||||
$PSNativeCommandUseErrorActionPreference=$false
|
||||
$taskWorkspace='C:\Users\User\Documents\Git\ARCADIA-Studio\.local\scenario-spacing-ytr83r-20260913'
|
||||
$taskTarget='C:\Users\User\Documents\Git\ARCADIA-Studio\target'
|
||||
$taskPin='c4a2cf63f11818cf7fc766acf3a2779768a2a658'
|
||||
if($taskPin -notmatch '^[0-9a-f]{40}$'){throw 'Final reviewed source pin and captures are not prepared; do not run this template.'}
|
||||
$toolchainEnv='C:\Users\User\Documents\Git\ARCADIA-Studio\.local\toolchain\env.ps1'
|
||||
function Hash-Input([string]$Path){(Get-FileHash -LiteralPath $Path -Algorithm SHA256).Hash.ToLowerInvariant()}
|
||||
function Same-Names($Left,$Right){$a=@($Left|Sort-Object);$b=@($Right|Sort-Object);return $a.Count -eq $b.Count -and @(Compare-Object $a $b).Count -eq 0}
|
||||
$taskLog=Join-Path $PSScriptRoot ($Stage+'.log')
|
||||
$taskReceipt=Join-Path $PSScriptRoot ($Stage+'-receipt.json')
|
||||
if((Test-Path -LiteralPath $taskLog)-or(Test-Path -LiteralPath $taskReceipt)){throw 'Do not replace evidence; prepare a new gate directory for retries.'}
|
||||
$cache=Get-Content -Raw -LiteralPath (Join-Path $PSScriptRoot 'cache-policy.json')|ConvertFrom-Json
|
||||
if($cache.base -cne $taskPin -or -not $cache.retainExistingTarget -or $cache.cleanRequested){throw 'Wrong reviewed cache policy.'}
|
||||
. (Join-Path $PSScriptRoot 'binary-inputs.ps1')
|
||||
$selection=Get-Content -Raw -LiteralPath (Join-Path $PSScriptRoot 'expected-tests.json')|ConvertFrom-Json
|
||||
$expected=@($selection.tests|Sort-Object -Unique)
|
||||
if($selection.source_commit -cne $taskPin -or $selection.expected_count -ne 288 -or $expected.Count -ne 288 -or @($selection.tests).Count -ne 288){throw 'Wrong exact focused membership.'}
|
||||
$expectedCount=288
|
||||
$commonFiles=@('run.ps1','capture.ps1','enumerate-inputs.ps1','binary-inputs.ps1','finalize.ps1','verify-parser.ps1','validate-scripts.ps1','parser-verification.json','finalization.json','expected-tests.json','expected-inputs.json','enumeration.json','external-inputs.json','inputs-complete-before.json','cache-policy.json','server-provenance.json','prior-failure-provenance.json','selection-provenance.json','diagnostic.ps1','instruction-update-template.json','instruction-update-provenance.json')
|
||||
$boundScripts=@{}
|
||||
foreach($file in $commonFiles){$boundScripts[$file]=Hash-Input (Join-Path $PSScriptRoot $file)}
|
||||
$previous=@{focused='list';all='focused';clippy='all';build='clippy'}
|
||||
$priorBinding=$null
|
||||
if($previous.ContainsKey($Stage)){
|
||||
$priorName=$previous[$Stage]
|
||||
$priorPath=Join-Path $PSScriptRoot ($priorName+'-receipt.json')
|
||||
$prior=Get-Content -Raw -LiteralPath $priorPath|ConvertFrom-Json
|
||||
if($prior.stage -cne $priorName -or $prior.base -cne $taskPin -or $prior.workspace -ine $taskWorkspace -or $prior.target -ine $taskTarget -or $prior.cargoExitCode -ne 0 -or -not $prior.selectionValid -or -not $prior.inputsUnchanged){throw 'Exact prior sequential stage did not pass.'}
|
||||
foreach($file in $commonFiles){if($prior.boundScriptAndInputHashes.$file -cne $boundScripts[$file]){throw ('Prior recipe/input binding changed: '+$file)}}
|
||||
foreach($property in $prior.boundScriptAndInputHashes.PSObject.Properties){if((Hash-Input (Join-Path $PSScriptRoot $property.Name)) -cne $property.Value){throw ('Prior transitive binding changed: '+$property.Name)};$boundScripts[$property.Name]=$property.Value}
|
||||
if((Hash-Input (Join-Path $PSScriptRoot ($priorName+'.log'))) -cne $prior.rawLogSha256){throw 'Prior raw output changed.'}
|
||||
$priorBinding=[ordered]@{stage=$priorName;receiptSha256=(Hash-Input $priorPath);rawLogSha256=$prior.rawLogSha256}
|
||||
}
|
||||
Push-Location -LiteralPath $taskWorkspace
|
||||
try {
|
||||
& (Join-Path $PSScriptRoot 'capture.ps1') -Stage ($Stage+'-before')
|
||||
. $toolchainEnv
|
||||
$env:CARGO_TARGET_DIR=$taskTarget
|
||||
$env:CARGO_TERM_COLOR='never'
|
||||
$PSNativeCommandUseErrorActionPreference=$false
|
||||
$versionPath=Join-Path $PSScriptRoot 'toolchain-versions.json'
|
||||
if($Stage -eq 'list'){
|
||||
if(Test-Path -LiteralPath $versionPath){throw 'Preserve prior toolchain version evidence.'}
|
||||
$cargoVersion=@(& cargo --version --verbose 2>&1);$cargoVersionExit=$LASTEXITCODE
|
||||
$rustcVersion=@(& rustc --version --verbose 2>&1);$rustcVersionExit=$LASTEXITCODE
|
||||
$clippyVersion=@(& cargo clippy --version 2>&1);$clippyVersionExit=$LASTEXITCODE
|
||||
$clangVersion=@(& clang --version 2>&1);$clangVersionExit=$LASTEXITCODE
|
||||
[ordered]@{base=$taskPin;capturedUtc=[DateTime]::UtcNow.ToString('o');externalEnvironmentPath=$toolchainEnv;externalEnvironmentSha256=(Hash-Input $toolchainEnv);cargo=@($cargoVersion|ForEach-Object {$_.ToString()});cargoExitCode=$cargoVersionExit;rustc=@($rustcVersion|ForEach-Object {$_.ToString()});rustcExitCode=$rustcVersionExit;clippy=@($clippyVersion|ForEach-Object {$_.ToString()});clippyExitCode=$clippyVersionExit;clang=@($clangVersion|ForEach-Object {$_.ToString()});clangExitCode=$clangVersionExit;cargoPath=(Get-Command cargo).Source;rustcPath=(Get-Command rustc).Source;clangPath=(Get-Command clang).Source;cargoHome=$env:CARGO_HOME;rustupHome=$env:RUSTUP_HOME;rustupToolchain=$env:RUSTUP_TOOLCHAIN;buildJobs=$env:CARGO_BUILD_JOBS;incremental=$env:CARGO_INCREMENTAL}|ConvertTo-Json -Depth 8|Set-Content -LiteralPath $versionPath -Encoding utf8
|
||||
if($cargoVersionExit -ne 0 -or $rustcVersionExit -ne 0 -or $clippyVersionExit -ne 0 -or $clangVersionExit -ne 0){throw 'Toolchain version query failed.'}
|
||||
}
|
||||
$versionsHash=Hash-Input $versionPath
|
||||
if($priorBinding -and $prior.toolchainVersionsSha256 -cne $versionsHash){throw 'Toolchain version receipt changed.'}
|
||||
$taskArgs=switch($Stage){
|
||||
'list' {@('test','-p','oa-desktop','--all-targets','--locked','--offline','--','--list')}
|
||||
'focused' {@('test','-p','oa-desktop','--bin','arcadia-studio','--locked','--offline','--','--exact')+$expected+@('--test-threads=1')}
|
||||
'all' {@('test','-p','oa-desktop','--all-targets','--locked','--offline','--','--test-threads=1')}
|
||||
'clippy' {@('clippy','-p','oa-desktop','-p','oa-server','--all-targets','--locked','--offline','--','-D','warnings')}
|
||||
'build' {@('build','-p','oa-desktop','--bin','arcadia-studio','--locked','--offline')}
|
||||
}
|
||||
$taskStart=[DateTime]::UtcNow.ToString('o')
|
||||
$testExecutablesBefore=@()
|
||||
if($Stage -ne 'list'){
|
||||
$testExecutablesBefore=@($prior.testExecutables|ForEach-Object {Get-GateBinary $_.path $taskTarget})
|
||||
if(-not (Same-GateBinaries @($prior.testExecutables) $testExecutablesBefore)){throw 'Previously bound test executable changed before this stage.'}
|
||||
}
|
||||
& cargo @taskArgs 2>&1|Tee-Object -FilePath $taskLog
|
||||
$taskExit=$LASTEXITCODE
|
||||
$taskEnd=[DateTime]::UtcNow.ToString('o')
|
||||
$taskText=Get-Content -Raw -LiteralPath $taskLog
|
||||
$taskValid=$true;$taskFailure=$null
|
||||
$listed=@();$executed=@();$matched=@();$ignored=@();$summaries=@();$listSummaries=@()
|
||||
if($Stage -eq 'list'){
|
||||
$listed=@([regex]::Matches($taskText,'(?m)^([^\r\n]+): test\r?$')|ForEach-Object {$_.Groups[1].Value})
|
||||
$matched=@($listed|Where-Object {$_ -cin $expected}|Sort-Object)
|
||||
$listSummaries=@([regex]::Matches($taskText,'(?m)^(\d+) tests, (\d+) benchmarks\r?$')|ForEach-Object {[ordered]@{tests=[int]$_.Groups[1].Value;benchmarks=[int]$_.Groups[2].Value}})
|
||||
$taskValid=$listed.Count -ge $expectedCount -and @($listed|Sort-Object -Unique).Count -eq $listed.Count -and (Same-Names $expected $matched) -and (Same-Names @($selection.desktop_tests) $listed) -and $listSummaries.Count -gt 0 -and ($listSummaries|ForEach-Object {$_.tests}|Measure-Object -Sum).Sum -eq $listed.Count -and ($listSummaries|ForEach-Object {$_.benchmarks}|Measure-Object -Sum).Sum -eq 0
|
||||
}
|
||||
if($Stage -in @('focused','all')){
|
||||
$executed=@([regex]::Matches($taskText,'(?m)^test ([^\r\n]+?) \.\.\. (ok|FAILED|ignored)[^\r\n]*\r?$')|ForEach-Object {[ordered]@{name=$_.Groups[1].Value;result=$_.Groups[2].Value}})
|
||||
$summaries=@([regex]::Matches($taskText,'test result: (ok|FAILED)\. (\d+) passed; (\d+) failed; (\d+) ignored; (\d+) measured; (\d+) filtered out;')|ForEach-Object {[ordered]@{status=$_.Groups[1].Value;passed=[int]$_.Groups[2].Value;failed=[int]$_.Groups[3].Value;ignored=[int]$_.Groups[4].Value;measured=[int]$_.Groups[5].Value;filtered=[int]$_.Groups[6].Value}})
|
||||
$ignored=@($executed|Where-Object {$_.result -eq 'ignored'}|ForEach-Object {$_.name})
|
||||
$passedCount=@($executed|Where-Object {$_.result -eq 'ok'}).Count
|
||||
$failedCount=@($executed|Where-Object {$_.result -eq 'FAILED'}).Count
|
||||
$taskValid=$summaries.Count -gt 0 -and $failedCount -eq 0 -and @($summaries|Where-Object {$_.status -ne 'ok' -or $_.failed -ne 0 -or $_.measured -ne 0}).Count -eq 0 -and ($summaries|ForEach-Object {$_. passed}|Measure-Object -Sum).Sum -eq $passedCount -and ($summaries|ForEach-Object {$_. ignored}|Measure-Object -Sum).Sum -eq $ignored.Count
|
||||
if($Stage -in @('focused','all')){
|
||||
$matched=@($executed|Where-Object {$_.name -cin $expected -and $_.result -eq 'ok'}|ForEach-Object {$_.name}|Sort-Object)
|
||||
$taskValid=$taskValid -and (Same-Names $expected $matched)
|
||||
}
|
||||
if($Stage -eq 'focused'){$taskValid=$taskValid -and $executed.Count -eq $expectedCount -and $passedCount -eq $expectedCount -and $ignored.Count -eq 0 -and $summaries.Count -eq 1 -and $summaries[0].filtered -eq (@($prior.listedTests).Count - $expectedCount)}
|
||||
if($Stage -eq 'all'){
|
||||
$listPath=Join-Path $PSScriptRoot 'list-receipt.json'
|
||||
$listHash=Hash-Input $listPath
|
||||
$listReceipt=Get-Content -Raw -LiteralPath $listPath|ConvertFrom-Json
|
||||
if($prior.priorStage.stage -cne 'list' -or $prior.priorStage.receiptSha256 -cne $listHash){throw 'Desktop listing changed after focused execution.'}
|
||||
$boundScripts['list-receipt.json']=$listHash
|
||||
$taskValid=$taskValid -and (Same-Names @($listReceipt.listedTests) @($executed|ForEach-Object {$_.name})) -and ($summaries|ForEach-Object {$_. filtered}|Measure-Object -Sum).Sum -eq 0 -and (Same-Names @($selection.ignored_tests) $ignored)
|
||||
}
|
||||
|
||||
}
|
||||
$inputsUnchanged=$false
|
||||
try {
|
||||
& (Join-Path $PSScriptRoot 'capture.ps1') -Stage ($Stage+'-after')
|
||||
foreach($file in $boundScripts.Keys){if((Hash-Input (Join-Path $PSScriptRoot $file)) -cne $boundScripts[$file]){throw ('Gate recipe/input changed: '+$file)}}
|
||||
if((Hash-Input $versionPath) -cne $versionsHash){throw 'Toolchain version receipt changed.'}
|
||||
if($priorBinding -and (Hash-Input (Join-Path $PSScriptRoot ($priorBinding.stage+'-receipt.json'))) -cne $priorBinding.receiptSha256){throw 'Prior receipt changed during gate.'}
|
||||
$inputsUnchanged=$true
|
||||
}catch{$taskFailure=$_.Exception.Message}
|
||||
$testExecutables=@();$testBinaryBindingValid=$false
|
||||
try {
|
||||
if($Stage -eq 'list'){
|
||||
$testExecutables=@(Get-GateTestBinaries $taskText $taskTarget)
|
||||
if($testExecutables.Count -ne 1){throw 'Expected exactly one actual desktop test executable from Cargo listing.'}
|
||||
} else {
|
||||
$testExecutables=@($testExecutablesBefore|ForEach-Object {Get-GateBinary $_.path $taskTarget})
|
||||
if(-not (Same-GateBinaries $testExecutablesBefore $testExecutables)){throw 'Bound test executable changed during this stage.'}
|
||||
if($Stage -in @('focused','all')){
|
||||
$observed=@(Get-GateTestBinaries $taskText $taskTarget)
|
||||
if(-not (Same-GateBinaries $testExecutables $observed)){throw 'Executed test path differs from the exact listed executable.'}
|
||||
}
|
||||
}
|
||||
$testBinaryBindingValid=$true
|
||||
} catch {$taskFailure=$_.Exception.Message}
|
||||
$taskValid=$taskValid -and $testBinaryBindingValid
|
||||
$binary=$null
|
||||
if($Stage -eq 'build' -and $taskExit -eq 0){$path=Join-Path $taskTarget 'debug/arcadia-studio.exe';$item=Get-Item -LiteralPath $path;$binary=[ordered]@{path=$item.FullName;bytes=$item.Length;sha256=(Hash-Input $path);mtimeUtc=$item.LastWriteTimeUtc.ToString('o')}}
|
||||
[ordered]@{stage=$Stage;command=('cargo '+($taskArgs -join ' '));arguments=$taskArgs;base=$taskPin;workspace=$taskWorkspace;target=$taskTarget;startUtc=$taskStart;endUtc=$taskEnd;cargoExitCode=$taskExit;selectionValid=$taskValid;inputsUnchanged=$inputsUnchanged;postflightFailure=$taskFailure;boundScriptAndInputHashes=$boundScripts;priorStage=$priorBinding;externalEnvironmentPath=$toolchainEnv;externalEnvironmentSha256=(Hash-Input $toolchainEnv);toolchainVersionsSha256=$versionsHash;rawLogSha256=(Hash-Input $taskLog);beforeCaptureSha256=(Hash-Input (Join-Path $PSScriptRoot ('inputs-complete-'+$Stage+'-before.json')));afterCaptureSha256=if(Test-Path -LiteralPath (Join-Path $PSScriptRoot ('inputs-complete-'+$Stage+'-after.json'))){Hash-Input (Join-Path $PSScriptRoot ('inputs-complete-'+$Stage+'-after.json'))}else{$null};listedTests=$listed;executedTests=$executed;testResultSummaries=$summaries;matchedRegressionTests=$matched;ignoredTests=$ignored;listSummaries=$listSummaries;testExecutablesBefore=$testExecutablesBefore;testExecutables=$testExecutables;testBinaryBindingValid=$testBinaryBindingValid;binary=$binary}|ConvertTo-Json -Depth 14|Set-Content -LiteralPath $taskReceipt -Encoding utf8
|
||||
if($taskExit -ne 0){exit $taskExit}
|
||||
if(-not $taskValid -or -not $inputsUnchanged){throw 'Gate membership or input binding failed; inspect receipt and raw output.'}
|
||||
} finally {Pop-Location}
|
||||
+142
@@ -0,0 +1,142 @@
|
||||
{
|
||||
"status": "Source-only initial membership, not an executed listing or final source binding",
|
||||
"base_source": "cb5d50de03a002079da17e6f92ea44c32f7ece75",
|
||||
"base_list_receipt_sha256": "79601d16e4b401853ec81461db65a698233c4214f829a1f455cc98c5ccc82896",
|
||||
"base_selection_sha256": "ba4f8bdae78b3e871c0bf031e86f5e5d766eb7416f851fd91b99a6e9c4aee84b",
|
||||
"base_count": 1045,
|
||||
"added": 36,
|
||||
"focused_count": 288,
|
||||
"modules": [
|
||||
{
|
||||
"module": "behavior::scenario_hit_tests",
|
||||
"path": "crates/oa-desktop/src/behavior/scenario_hit_tests.rs",
|
||||
"count": 9,
|
||||
"sha256": "8ff68105b37b922d82f1aa39b729a4e7a19ea2793b0fa57f649a96a903986148",
|
||||
"tests": [
|
||||
"behavior::scenario_hit_tests::exact_headers_include_unassigned_lifelines_but_guides_are_not_headers",
|
||||
"behavior::scenario_hit_tests::repeated_exchange_occurrences_keep_distinct_message_body_and_label_hits",
|
||||
"behavior::scenario_hit_tests::self_call_elbow_and_receive_endpoint_are_messages_not_execution_hits",
|
||||
"behavior::scenario_hit_tests::activation_shoulder_beats_another_calls_label_and_broad_message_tolerance",
|
||||
"behavior::scenario_hit_tests::create_delete_markers_are_distinct_from_their_own_message_body_and_label",
|
||||
"behavior::scenario_hit_tests::tiny_scale_nearest_hit_retains_the_winning_marker_or_message_role",
|
||||
"behavior::scenario_hit_tests::action_frame_and_use_boxes_do_not_advertise_message_or_header_roles",
|
||||
"behavior::scenario_hit_tests::winning_primitive_role_does_not_come_from_its_shared_uuid",
|
||||
"behavior::scenario_hit_tests::invalid_points_never_produce_a_semantic_or_spacing_hit"
|
||||
]
|
||||
},
|
||||
{
|
||||
"module": "behavior::scenario::spacing::tests",
|
||||
"path": "crates/oa-desktop/src/behavior/scenario/spacing/tests.rs",
|
||||
"count": 9,
|
||||
"sha256": "7b8c4b6defe32edb248c4b42cf7bb5e1d56c3686019a0f9d51c5fda592f738c2",
|
||||
"tests": [
|
||||
"behavior::scenario::spacing::tests::one_repeated_message_moves_in_one_view_with_exact_document_undo_redo_and_reopen",
|
||||
"behavior::scenario::spacing::tests::horizontal_lane_move_changes_actual_header_and_attached_endpoints_only_in_selected_view",
|
||||
"behavior::scenario::spacing::tests::drawn_unassigned_lifeline_can_move_without_assigning_a_semantic_participant",
|
||||
"behavior::scenario::spacing::tests::self_call_spacing_uses_send_y_and_preserves_reply_and_actual_activation_finish",
|
||||
"behavior::scenario::spacing::tests::feasible_spacing_crossing_remains_authored_with_diagnostic_and_unchanged_steps",
|
||||
"behavior::scenario::spacing::tests::unsupported_self_call_move_is_refused_and_automatic_fallback_is_not_editable_capture",
|
||||
"behavior::scenario::spacing::tests::invalid_view_foreign_identity_and_latent_message_are_not_spacing_targets",
|
||||
"behavior::scenario::spacing::tests::zero_motion_return_to_start_and_subprecision_preserve_sparse_intent_and_real_redo",
|
||||
"behavior::scenario::spacing::tests::malformed_or_out_of_range_motion_cannot_mutate_original"
|
||||
]
|
||||
},
|
||||
{
|
||||
"module": "behavior::scenario::spacing::controller::tests",
|
||||
"path": "crates/oa-desktop/src/behavior/scenario/spacing/controller/tests.rs",
|
||||
"count": 5,
|
||||
"sha256": "2db786cab5f37b06ba969a524efba97976c17b735f72b364f2be350c26c1c9d1",
|
||||
"tests": [
|
||||
"behavior::scenario::spacing::controller::tests::real_preview_moves_only_active_axis_from_original_and_never_changes_document",
|
||||
"behavior::scenario::spacing::controller::tests::click_threshold_is_active_axis_and_return_to_zero_is_not_a_click",
|
||||
"behavior::scenario::spacing::controller::tests::invalid_move_discards_prior_candidate_and_finish_rechecks_final_pointer",
|
||||
"behavior::scenario::spacing::controller::tests::forged_camera_hit_role_and_retired_visit_cannot_capture",
|
||||
"behavior::scenario::spacing::controller::tests::zoomed_out_message_tolerance_matches_actual_canvas_hit"
|
||||
]
|
||||
},
|
||||
{
|
||||
"module": "app::scenario_spacing::tests",
|
||||
"path": "crates/oa-desktop/src/app/scenario_spacing/tests.rs",
|
||||
"count": 7,
|
||||
"sha256": "0c81b280a951b19fca68d223b7e6bb326ef707a73a1afe38583b3fd70a7bce50",
|
||||
"tests": [
|
||||
"app::scenario_spacing::tests::same_batch_preview_is_immutable_and_one_commit_undo_redo_has_exact_source_parity",
|
||||
"app::scenario_spacing::tests::click_selects_but_crossed_return_and_cancel_preserve_selection_camera_and_history",
|
||||
"app::scenario_spacing::tests::stale_finish_after_new_view_and_forged_token_are_inert_before_reveal_reconciliation",
|
||||
"app::scenario_spacing::tests::source_write_failure_cannot_commit_candidate_or_materialize_camera",
|
||||
"app::scenario_spacing::tests::pending_semantic_draft_and_source_edit_cancel_and_reject_held_finish",
|
||||
"app::scenario_spacing::tests::stale_finish_cannot_remove_new_same_view_deferred_reveal",
|
||||
"app::scenario_spacing::tests::modal_open_cancels_preview_and_captured_begin_stays_retired_after_close"
|
||||
]
|
||||
},
|
||||
{
|
||||
"module": "behavior::scenario::workspace::spacing_tests",
|
||||
"path": "crates/oa-desktop/src/behavior/scenario/workspace/spacing_tests.rs",
|
||||
"count": 6,
|
||||
"sha256": "8fa0dbe725fc9fcf562f7aa14ed8a7b4347cf6bbcaa6531505227d4bd24237de",
|
||||
"tests": [
|
||||
"behavior::scenario::workspace::spacing_tests::saved_message_same_batch_pointer_events_commit_once_and_one_undo_redo_restores_exact_source",
|
||||
"behavior::scenario::workspace::spacing_tests::saved_header_preview_survives_frames_and_freezes_fit_while_actual_bounds_expand",
|
||||
"behavior::scenario::workspace::spacing_tests::saved_body_and_header_clicks_select_without_materializing_spacing",
|
||||
"behavior::scenario::workspace::spacing_tests::saved_valid_preview_then_refused_self_call_never_commits_last_valid_candidate",
|
||||
"behavior::scenario::workspace::spacing_tests::saved_escape_and_outside_pointer_cancel_actual_held_preview",
|
||||
"behavior::scenario::workspace::spacing_tests::saved_drag_return_to_origin_preserves_redo_selection_and_original_fit_camera"
|
||||
]
|
||||
},
|
||||
{
|
||||
"module": "app::transition_context_tests",
|
||||
"path": "crates/oa-desktop/src/app/transition_context_tests.rs",
|
||||
"count": 5,
|
||||
"sha256": "47002fb025f3a2f8c53871f9509bfe8611a61db6fb0e1b3125eb6e875425cb1d",
|
||||
"tests": [
|
||||
"app::transition_context_tests::scenario_transition_focuses_requested_counterpart_and_preserves_unrelated_views_in_both_directions",
|
||||
"app::transition_context_tests::explicit_behavior_internal_and_process_roots_keep_their_workspace_without_creating_a_view",
|
||||
"app::transition_context_tests::explicit_destination_is_honored_and_ordinary_work_transition_still_places_in_architecture",
|
||||
"app::transition_context_tests::machine_and_typed_action_transitions_resolve_the_owner_and_reusing_that_context_retains_camera",
|
||||
"app::transition_context_tests::rejected_source_writeback_keeps_review_and_navigation_and_invalid_draft_still_blocks_start"
|
||||
]
|
||||
},
|
||||
{
|
||||
"module": "behavior::contextual_source_tests",
|
||||
"path": "crates/oa-desktop/src/behavior/contextual_source_tests.rs",
|
||||
"count": 23,
|
||||
"sha256": "044bd412dc45ffe440b1e251993946942dc3759dcb2d5dfe71bd8d6ef61cbcc7",
|
||||
"tests": [
|
||||
"behavior::contextual_source_tests::contextual_source_lifelines_stage_exact_separate_records_and_one_history_entry",
|
||||
"behavior::contextual_source_tests::contextual_source_default_consumer_name_has_stable_alias_and_correlated_selection",
|
||||
"behavior::contextual_source_tests::contextual_source_back_retains_parent_and_rejects_late_child_event",
|
||||
"behavior::contextual_source_tests::contextual_source_recovery_keeps_inner_raw_fields_and_refuses_deleted_or_changed_owner",
|
||||
"behavior::contextual_source_tests::contextual_source_existing_choice_prunes_staged_dependency",
|
||||
"behavior::contextual_source_tests::contextual_source_machine_before_any_owner_creates_optional_view_atomically",
|
||||
"behavior::contextual_source_tests::contextual_source_second_system_and_role_machine_owner_refuse_without_fallback",
|
||||
"behavior::contextual_source_tests::contextual_source_work_uses_reserved_contribution_and_link_ids_and_one_undo",
|
||||
"behavior::contextual_source_tests::contextual_source_failed_source_budget_preserves_both_drafts_and_accepted_bytes",
|
||||
"behavior::contextual_source_tests::contextual_source_owner_first_can_return_to_an_unnamed_machine_without_losing_source",
|
||||
"behavior::contextual_source_tests::contextual_source_inserts_work_on_the_exact_guarded_link_and_refuses_exchange_identity_conflict",
|
||||
"behavior::contextual_source_tests::contextual_source_app_empty_actions_and_child_open_refuse_other_raw_editors",
|
||||
"behavior::contextual_source_tests::contextual_source_app_modal_escape_then_child_back_then_parent_cancel_preserve_accepted_source",
|
||||
"behavior::contextual_source_tests::contextual_source_app_checkpoint_restores_inner_raw_draft_without_model_adoption",
|
||||
"behavior::contextual_source_tests::contextual_source_mounted_small_editor_keeps_back_and_use_outside_field_scroll",
|
||||
"behavior::contextual_source_tests::contextual_source_back_remains_available_after_owner_deletion_and_with_dirty_editors",
|
||||
"behavior::contextual_source_tests::contextual_source_incomplete_recovered_kind_reports_error_without_panicking",
|
||||
"behavior::contextual_source_tests::contextual_source_empty_palette_lifeline_cannot_open_a_previous_owner_or_layer",
|
||||
"behavior::contextual_source_tests::contextual_source_deleted_owner_view_retains_draft_instead_of_panicking_or_using_fallback",
|
||||
"behavior::contextual_source_tests::contextual_source_nested_semantic_parent_is_explicit_and_revalidated",
|
||||
"behavior::contextual_source_tests::contextual_source_new_callee_lifeline_preserves_caller_bindings_as_an_explicit_warning",
|
||||
"behavior::contextual_source_tests::contextual_source_empty_history_reports_no_change_and_success_requires_a_real_history_step",
|
||||
"behavior::contextual_source_tests::contextual_source_original_document_remains_bound_after_back_or_choosing_existing"
|
||||
]
|
||||
}
|
||||
],
|
||||
"ignored_diagnostic": {
|
||||
"path": "crates/oa-desktop/src/behavior/scenario/spacing/controller/timing_tests.rs",
|
||||
"bytes": 12408,
|
||||
"sha256": "ad2e2fab53e712a7bf93cd951f6d95019199675e2f55223b01e02d8344ee3a2e",
|
||||
"test": "behavior::scenario::spacing::controller::timing_tests::saved_spacing_capture_prepare_20_lanes_1000_messages_3_views",
|
||||
"schema": "scenario_spacing_timing_v1",
|
||||
"expected_samples": 28,
|
||||
"ignored": true,
|
||||
"execution": "Not run",
|
||||
"status": "Frozen diagnostic source verified before candidate commit; final source capture pending"
|
||||
}
|
||||
}
|
||||
+44
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"status": "No repeated server stage: core/server/manifests unchanged from verified37 source",
|
||||
"previous_source": "37be41092beb1c940f345072df1e017ce45fe2fc",
|
||||
"source": "PENDING_REVIEWED_SOURCE_PIN",
|
||||
"changed_core_server_manifest_paths": [],
|
||||
"prior_server_receipt_sha256": "5c0cd2af2b1f3c12528ad961e5b08c60f8865751cca95c1267e1211faf7e0900",
|
||||
"prior_server_log_sha256": "7c7d847ac942b23a33081fdc3eb9ec53a2c054cd422810e30528b5930c574d71",
|
||||
"prior_server_results": [
|
||||
{
|
||||
"status": "ok",
|
||||
"passed": 4,
|
||||
"failed": 0,
|
||||
"ignored": 0,
|
||||
"measured": 0,
|
||||
"filtered": 0
|
||||
},
|
||||
{
|
||||
"status": "ok",
|
||||
"passed": 0,
|
||||
"failed": 0,
|
||||
"ignored": 0,
|
||||
"measured": 0,
|
||||
"filtered": 0
|
||||
},
|
||||
{
|
||||
"status": "ok",
|
||||
"passed": 51,
|
||||
"failed": 0,
|
||||
"ignored": 0,
|
||||
"measured": 0,
|
||||
"filtered": 0
|
||||
},
|
||||
{
|
||||
"status": "ok",
|
||||
"passed": 2,
|
||||
"failed": 0,
|
||||
"ignored": 0,
|
||||
"measured": 0,
|
||||
"filtered": 0
|
||||
}
|
||||
],
|
||||
"strict_scope": "Required here: cargo clippy -p oa-desktop -p oa-server --all-targets --locked --offline -- -D warnings",
|
||||
"prior_strict_limit": "37 stopped on desktop warnings; server57 tests are not server strict acceptance"
|
||||
}
|
||||
+44
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"status": "No repeated server stage: core/server/manifests unchanged from verified37 source",
|
||||
"previous_source": "37be41092beb1c940f345072df1e017ce45fe2fc",
|
||||
"source": "c4a2cf63f11818cf7fc766acf3a2779768a2a658",
|
||||
"changed_core_server_manifest_paths": [],
|
||||
"prior_server_receipt_sha256": "5c0cd2af2b1f3c12528ad961e5b08c60f8865751cca95c1267e1211faf7e0900",
|
||||
"prior_server_log_sha256": "7c7d847ac942b23a33081fdc3eb9ec53a2c054cd422810e30528b5930c574d71",
|
||||
"prior_server_results": [
|
||||
{
|
||||
"status": "ok",
|
||||
"passed": 4,
|
||||
"failed": 0,
|
||||
"ignored": 0,
|
||||
"measured": 0,
|
||||
"filtered": 0
|
||||
},
|
||||
{
|
||||
"status": "ok",
|
||||
"passed": 0,
|
||||
"failed": 0,
|
||||
"ignored": 0,
|
||||
"measured": 0,
|
||||
"filtered": 0
|
||||
},
|
||||
{
|
||||
"status": "ok",
|
||||
"passed": 51,
|
||||
"failed": 0,
|
||||
"ignored": 0,
|
||||
"measured": 0,
|
||||
"filtered": 0
|
||||
},
|
||||
{
|
||||
"status": "ok",
|
||||
"passed": 2,
|
||||
"failed": 0,
|
||||
"ignored": 0,
|
||||
"measured": 0,
|
||||
"filtered": 0
|
||||
}
|
||||
],
|
||||
"strict_scope": "Required here: cargo clippy -p oa-desktop -p oa-server --all-targets --locked --offline -- -D warnings",
|
||||
"prior_strict_limit": "37 stopped on desktop warnings; server57 tests are not server strict acceptance"
|
||||
}
|
||||
+47
@@ -0,0 +1,47 @@
|
||||
{
|
||||
"base": "c4a2cf63f11818cf7fc766acf3a2779768a2a658",
|
||||
"capturedUtc": "2026-09-13T09:00:52.4518851Z",
|
||||
"externalEnvironmentPath": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\env.ps1",
|
||||
"externalEnvironmentSha256": "be2226f08764bb6961b4be8513ce55bab076890cddd2fef0f54a4031f94a82d4",
|
||||
"cargo": [
|
||||
"cargo 1.98.1 (797e8a9bc 2026-08-05)",
|
||||
"release: 1.98.1",
|
||||
"commit-hash: 797e8a9bca276c1c9f9f738d2a20f484fa4eea9d",
|
||||
"commit-date: 2026-08-05",
|
||||
"host: x86_64-pc-windows-gnullvm",
|
||||
"libgit2: 1.9.4 (sys:0.21.0 vendored)",
|
||||
"libcurl: 8.21.0-DEV (sys:0.4.90+curl-8.21.0 vendored ssl:Schannel)",
|
||||
"os: Windows 10.0.26200 (Windows 11 Professional) [64-bit]"
|
||||
],
|
||||
"cargoExitCode": 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"
|
||||
],
|
||||
"rustcExitCode": 0,
|
||||
"clippy": [
|
||||
"clippy 0.1.98 (48a229ceae 2026-09-01)"
|
||||
],
|
||||
"clippyExitCode": 0,
|
||||
"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"
|
||||
],
|
||||
"clangExitCode": 0,
|
||||
"cargoPath": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\bin\\cargo.exe",
|
||||
"rustcPath": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\bin\\rustc.exe",
|
||||
"clangPath": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\llvm-mingw-20260908-ucrt-x86_64\\bin\\clang.exe",
|
||||
"cargoHome": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo",
|
||||
"rustupHome": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\rustup",
|
||||
"rustupToolchain": "stable-x86_64-pc-windows-gnullvm",
|
||||
"buildJobs": "1",
|
||||
"incremental": "0"
|
||||
}
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
#Requires -Version 7.0
|
||||
$ErrorActionPreference='Stop'
|
||||
foreach($file in @('enumerate-inputs.ps1','capture.ps1','run.ps1','binary-inputs.ps1','finalize.ps1','verify-parser.ps1','validate-scripts.ps1','diagnostic.ps1')){
|
||||
$tokens=$null;$errors=$null
|
||||
$null=[System.Management.Automation.Language.Parser]::ParseFile((Join-Path $PSScriptRoot $file),[ref]$tokens,[ref]$errors)
|
||||
if($errors.Count){$errors|ForEach-Object {Write-Output $_};throw ('Parse failure: '+$file)}
|
||||
Write-Output ('Parsed '+$file)
|
||||
}
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
#Requires -Version 7.0
|
||||
param([ValidateSet('parser-verification.json','parser-preparation-verification.json','parser-preparation-verification-timing.json')][string]$OutputName='parser-verification.json')
|
||||
Set-StrictMode -Version Latest
|
||||
$ErrorActionPreference='Stop'
|
||||
if(Test-Path -LiteralPath (Join-Path $PSScriptRoot $OutputName)){throw 'Preserve prior parser evidence; choose a fresh gate or preparation output.'}
|
||||
$script=Get-Content -Raw -LiteralPath (Join-Path $PSScriptRoot 'run.ps1')
|
||||
$begin=$script.IndexOf(' $taskValid=$true;$taskFailure=$null')
|
||||
$end=$script.IndexOf(' $inputsUnchanged=$false',$begin)
|
||||
if($begin -lt 0 -or $end -lt 0){throw 'Runner parser block not found'}
|
||||
$block=[scriptblock]::Create($script.Substring($begin,$end-$begin))
|
||||
$selection=Get-Content -Raw -LiteralPath (Join-Path $PSScriptRoot 'expected-tests.json')|ConvertFrom-Json
|
||||
$expected=@($selection.tests|Sort-Object -Unique);$expectedCount=$expected.Count
|
||||
function Same-Names($Left,$Right){$a=@($Left|Sort-Object);$b=@($Right|Sort-Object);return $a.Count -eq $b.Count -and @(Compare-Object $a $b).Count -eq 0}
|
||||
$prior=[pscustomobject]@{listedTests=@($selection.desktop_tests)}
|
||||
$filtered=@($prior.listedTests).Count-$expectedCount
|
||||
$passLines=@($expected|ForEach-Object {'test '+$_+' ... ok'})
|
||||
$summary='test result: ok. '+$expectedCount+' passed; 0 failed; 0 ignored; 0 measured; '+$filtered+' filtered out;'
|
||||
$listLines=@($selection.desktop_tests|ForEach-Object {$_+': test'})
|
||||
$listSummary=@($selection.desktop_tests).Count.ToString()+' tests, 0 benchmarks'
|
||||
$cases=@(
|
||||
[pscustomobject]@{name='focused-exact';stage='focused';valid=$true;text=(($passLines+@($summary)) -join "`n")},
|
||||
[pscustomobject]@{name='focused-zero';stage='focused';valid=$false;text='test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out;'},
|
||||
[pscustomobject]@{name='focused-duplicate';stage='focused';valid=$false;text=(($passLines+@($passLines[0],$summary)) -join "`n")},
|
||||
[pscustomobject]@{name='focused-missing';stage='focused';valid=$false;text=(($passLines[1..($passLines.Count-1)]+@($summary)) -join "`n")},
|
||||
[pscustomobject]@{name='focused-wrong-total';stage='focused';valid=$false;text=(($passLines+@('test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; '+$filtered+' filtered out;')) -join "`n")},
|
||||
[pscustomobject]@{name='focused-wrong-filtered';stage='focused';valid=$false;text=(($passLines+@($summary.Replace(($filtered.ToString()+' filtered'), '0 filtered'))) -join "`n")},
|
||||
[pscustomobject]@{name='list-complete';stage='list';valid=$true;text=(($listLines+@($listSummary)) -join "`n")},
|
||||
[pscustomobject]@{name='list-missing-summary';stage='list';valid=$false;text=($listLines -join "`n")},
|
||||
[pscustomobject]@{name='list-duplicate';stage='list';valid=$false;text=(($listLines+@($listLines[0],$listSummary)) -join "`n")}
|
||||
)
|
||||
$results=@(foreach($case in $cases){$Stage=$case.stage;$taskText=$case.text;. $block;if($taskValid -ne $case.valid){throw ('Unexpected parser decision: '+$case.name)};[ordered]@{case=$case.name;expected=$case.valid;actual=$taskValid}})
|
||||
[ordered]@{status='Synthetic actual-runner parser checks only; no Cargo or product tests';focusedCount=$expectedCount;runnerSha256=(Get-FileHash -LiteralPath (Join-Path $PSScriptRoot 'run.ps1') -Algorithm SHA256).Hash.ToLowerInvariant();cases=$results}|ConvertTo-Json -Depth 6|Set-Content -LiteralPath (Join-Path $PSScriptRoot $OutputName) -Encoding utf8
|
||||
Write-Output ('Verified '+$results.Count+' parser cases')
|
||||
Reference in New Issue
Block a user