$ErrorActionPreference = 'Stop' . ./.local/toolchain/env.ps1 $env:CARGO_BUILD_JOBS = '1' $evidenceRoot = Join-Path (Get-Location) '.local/text-navigation-integration-20260911' $sourcePaths = @('crates/oa-core/src/language.rs','crates/oa-core/src/language_outline_tests.rs') if (Test-Path (Join-Path $evidenceRoot 'outline2-inputs.json')) { throw 'Refusing input receipt overwrite' } Get-FileHash -LiteralPath $sourcePaths | Select-Object Path,Hash | ConvertTo-Json | Set-Content -LiteralPath (Join-Path $evidenceRoot 'outline2-inputs.json') $gates = @( @{name='outline2'; args=@('test','--locked','--offline','-p','oa-core','--lib','language::outline_tests::','--','--test-threads=1')}, @{name='clippy-tests2'; args=@('clippy','--locked','--offline','-p','oa-core','--lib','--tests','--','-D','warnings')} ) foreach ($gate in $gates) { $logPath = Join-Path $evidenceRoot ($gate.name + '.log') $statusPath = Join-Path $evidenceRoot ($gate.name + '-status.json') if ((Test-Path -LiteralPath $logPath) -or (Test-Path -LiteralPath $statusPath)) { throw "Refusing to overwrite $($gate.name)" } $started = [DateTime]::UtcNow.ToString('o') $gateArgs = $gate.args & cargo @gateArgs 2>&1 | Tee-Object -FilePath $logPath $gateExit = $LASTEXITCODE [ordered]@{started=$started;finished=[DateTime]::UtcNow.ToString('o');exitCode=$gateExit;args=$gateArgs;buildJobs=1} | ConvertTo-Json -Depth 4 | Set-Content -LiteralPath $statusPath if ($gateExit -ne 0) { exit $gateExit } }