Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
139 commits
Select commit Hold shift + click to select a range
4ef775c
perf(r235): reject irrelevant Start windows before expensive process …
Oct 15, 2026
32b3913
Merge R235 R190 Start-window process-name CPU optimization (#68)
GOD13emad Oct 15, 2026
3d67d35
release(candidate): v1.7.3 CPU fix and overlap-free Glass/Settings (R…
Oct 15, 2026
690cef8
fix(updater): include official v1.7.2 in atomic journal and rollback …
Oct 15, 2026
7d27251
docs(release): record R244 switch overlap fix and accepted A/B evidence
Oct 15, 2026
6001fce
Merge v1.7.3 CPU and overlap-free Glass update (#69)
GOD13emad Oct 15, 2026
e7904d0
release(candidate): versioned 1.7.4 repairs fresh maintenance and pin…
Oct 16, 2026
1375d71
Merge v1.7.4 fresh maintenance and guarded official v1.7.3 update (#70)
GOD13emad Oct 16, 2026
8633c60
release(candidate): v1.7.5 per-user protected sensor task guard and o…
Oct 16, 2026
2c12179
test(r265): use real SID for PawnIO-negative and correct official v1.…
Oct 16, 2026
a9415ce
test(r265): correct full helper receipt path and R265 receipt version
Oct 16, 2026
9284b12
Merge v1.7.5 cross-user sensor safety and SHA-pinned v1.7.4 update (#71)
GOD13emad Oct 16, 2026
936ad20
docs: align public project control with v1.7.5 R270
GOD13emad Oct 16, 2026
2348791
release: v1.7.6 Glass thermal warning and safe 1.7.5 update
GOD13emad Oct 16, 2026
0181c7a
docs: align public v1.7.6 R276 project continuity
GOD13emad Oct 16, 2026
590cfcc
test: retain verified R282 two-host abrupt journal recovery
GOD13emad Oct 16, 2026
dc68cf4
fix: v1.7.7 retry-safe crash recovery and pinned v1.7.6 in-place update
GOD13emad Oct 16, 2026
248745d
docs: mirror accepted v1.7.7 R285 release and owner scope
GOD13emad Oct 16, 2026
9960a06
feat: v1.7.8 opt-in thermal warning sound and preview
GOD13emad Oct 16, 2026
486abbb
fix(installer): bind validated upgrade journal paths to static target…
GOD13emad Oct 16, 2026
643e825
fix(installer): reject junctions across interrupted upgrade paths bef…
Oct 17, 2026
4666b87
test: use typed R290 guest receipt, not inherited LASTEXITCODE
Oct 17, 2026
e96b027
security: validate privileged sensor helper paths before any side eff…
Oct 17, 2026
cf87b19
test(security): reject invalid SID with deterministic prewrite error …
Oct 17, 2026
04ab49d
test: keep absent-PawnIO fail-closed gate on disposable canonical use…
Oct 17, 2026
39d06af
test: isolate R85 missing-PawnIO fixture without weakening production…
Oct 17, 2026
6ba2230
security: restrict elevated sensor payload to direct user Local Temp …
Oct 17, 2026
82144db
security(setup): execute embedded sensor helper in memory before UAC …
Oct 17, 2026
1a00481
test(security): prove hostile quoted UAC user input cannot inject com…
Oct 17, 2026
7eb190d
security: pin and exclusively snapshot Broker/Supervisor source bytes…
Oct 17, 2026
3f50d9c
security: install only SHA-pinned ZIP dependency buffers from embedde…
Oct 17, 2026
0cbfb85
security: keep protected sensor rollback bytes and task XML in memory…
Oct 17, 2026
c20e4ee
security: never elevate mutable Temp PawnIO installer (R297)
Oct 17, 2026
6b38199
security: pin UAC PowerShell host to native system path (R298)
Oct 17, 2026
45416f0
security: constrain upgrade stage cleanup to known nonrecursive entri…
Oct 17, 2026
c3d0dcc
test: preserve Reflection argument array in R299 native harness (R299…
Oct 17, 2026
2057a49
fix(setup): retire completed upgrade journal before bounded metadata …
Oct 17, 2026
61166e5
fix(setup): persist ROLLED_BACK before disposing prior backups (R301)
Oct 17, 2026
ddb734c
test: capture exact child recovery exception on R301 A/B (R301-F01)
Oct 17, 2026
6d0734d
test: use dash for missing previous files in rollback journal (R301-F02)
Oct 17, 2026
8f194fe
test(setup): kill exact candidate during stage cleanup on disposable …
Oct 17, 2026
5d742cd
security: persist protected sensor SID owner before mutating shared t…
Oct 17, 2026
24ad9a0
test: validate R303 owner-marker call precedes destructive install (R…
Oct 17, 2026
9f79aca
fix(setup): retain inline trusted helper for long user paths (R304)
Oct 17, 2026
5c7464d
security: bind elevated sensor helper token SID to requested user (R305)
Oct 17, 2026
2f2feec
test: accept PE-pinned long hostile inline helper transport (R305-F01)
Oct 17, 2026
421bdcf
test: expect fail-closed service SID resolution in R305 native probe …
Oct 17, 2026
f351780
test: prove protected sensor journal crash-safe recovery in isolated …
Oct 17, 2026
6b7f76f
test: accept path-normalized synthetic journal receipt in R306 Window…
Oct 17, 2026
13d1910
test: verify trusted journal ACL and reject hostile paths in isolated…
Oct 17, 2026
7a8f0bc
test: require trusted ownership on protected journal manifest files (…
Oct 17, 2026
a0811bd
security(experiment): stage owner-protected sensor snapshot before mu…
Oct 17, 2026
efb1b65
test: accept bounded PE-pinned transport for R294/R295 in R308 experi…
Oct 17, 2026
4f80f44
security(experiment): journal terminal markers and synthetic cold fil…
Oct 17, 2026
a6fdf69
security(experiment): bounded retired sensor journal cleanup and cras…
Oct 17, 2026
9188f42
security(experiment): complete healthy protected journal and resume t…
Oct 17, 2026
4192b5d
test: accept completed journal preflight while retaining R308 write-o…
Oct 17, 2026
75e0b24
test: require all eighteen observed R311 native hook checks (F02)
Oct 17, 2026
cce11b1
security(experiment): pin prior ScheduledTask XML before cold restora…
Oct 17, 2026
8fe64a6
test: roundtrip strictly scoped disabled ScheduledTask XML in disposa…
Oct 17, 2026
0eab670
security(experiment): cold replay prior task and files on disposable …
Oct 17, 2026
f5244ca
security(experiment): invoke verified pending journal cold recovery b…
Oct 17, 2026
0e37766
test: preserve strict R308/R311 ordering under R315 pending recovery …
Oct 17, 2026
f42a272
test: search literal mode in R315 protected entrypoint ordering (F02)
Oct 17, 2026
272d993
security(experiment): validate canonical per-user installer root and …
Oct 17, 2026
031abfd
test: compile identical net48 Setup source for comparable R316 CodeQL…
Oct 17, 2026
948aa95
test: reproduce org Default Setup CodeQL on ubuntu none for R316 comp…
Oct 17, 2026
d7b8c7f
test: include organization local threat model for exact R316 CodeQL c…
Oct 17, 2026
b3b25f7
security(experiment): replace Temp batch uninstall with bounded nonre…
Oct 17, 2026
60bc9bd
test: include closing foreach in R317 bounded synthetic deletion proo…
Oct 17, 2026
5cee6d4
test: avoid readonly PowerShell PID parameter in R317 native proof (F02)
Oct 17, 2026
ff31189
test: bind invalid cleanup paths as strings in R317 reflection proof …
Oct 17, 2026
1b9d2f4
security(experiment): create shortcuts in-process via trusted COM, no…
Oct 17, 2026
74ebcf9
test: isolated hosted private install uninstall and post-exit cleanup…
Oct 17, 2026
70888bd
test: bind original Setup watcher before suspended guest process resu…
Oct 17, 2026
8563f79
test: verify native attached Setup exit code from pinned Windows hand…
Oct 17, 2026
69084dd
security(experiment): pin verified Main executable handle during auto…
Oct 17, 2026
8890216
test: require all fourteen observed R321 Windows Main handle checks (…
Oct 17, 2026
dc3860d
fix(setup): verify embedded backend ZIP before extracting without Tem…
Oct 17, 2026
b72b88d
fix(setup): only remove verified owned Windows shortcuts (R323)
Oct 17, 2026
67d3eda
fix(setup): refuse foreign shortcut names before fresh install and Sa…
Oct 17, 2026
b50b3ee
test(r324): fix guarded hosted shortcut preflight Test-Path expressio…
Oct 17, 2026
e6a6c0c
test(r324): isolate original Setup foreign shortcut refusal on fresh …
Oct 17, 2026
7381c9e
fix(setup): combine shortcut ownership and pinned backend ZIP securit…
Oct 17, 2026
d5b9214
fix(setup): direct SHA-pinned Main CreateProcess without ShellExecute…
Oct 17, 2026
3adfce1
fix(setup): preserve prior working directory in direct Main launch (R…
Oct 17, 2026
50f9848
fix(setup): bind sensor staging to canonical user profile Temp (R327)
Oct 18, 2026
9f39af9
fix(sensor): recheck user log/result reparse boundaries at each eleva…
Oct 18, 2026
00bedad
test(setup): prove SHA-pinned Main blocks parent rename on two Window…
Oct 18, 2026
5a140d9
test(ci): isolate R329 pinned Main A/B from unrelated R302 recovery t…
Oct 18, 2026
e21168b
test(recovery): add native stage deletion observer for exact Setup ki…
Oct 18, 2026
71d3dbd
fix(setup): remove legacy hosted diagnostic file sink (R331)
Oct 18, 2026
ceb94db
fix(setup): guard optional sensor reuse against reparse and profile r…
Oct 18, 2026
83b9d9a
fix(setup): detect foreign shortcut names by exact lexical entry enum…
Oct 18, 2026
c134f5f
test(security): validate three Setup command sinks with hostile input…
Oct 18, 2026
86f327a
fix(sensor): pin privileged log/result writes via no-reparse handles …
Oct 18, 2026
bf5bdb6
fix(sensor): keep native log lease compatible with PowerShell 5.1 and 7
Oct 18, 2026
fa57ae2
test(sensor): align isolated R85 profile mock with native log lease
Oct 18, 2026
3fd0b1b
fix(sensor): prune only empty first-install rollback directories (R337)
Oct 18, 2026
997c6f3
test(r337): pin split-checkout source for native receipt (F01)
Oct 18, 2026
edf2610
fix(sensor): pin privileged Supervisor broker and output arguments (R…
Oct 19, 2026
ce91a03
test(codeql): compare exact R337 and R338 compiled Supervisor findings
Oct 19, 2026
0d8eb1d
test(security): real second SID protected ProgramFiles race witness (…
Oct 19, 2026
2b4352e
test(r339): preserve typed failure receipt before fixture setup (F01)
Oct 19, 2026
0199fb6
test(r339): distinguish build-only LocalAppData scratch from installe…
Oct 19, 2026
0cbd792
test(r339): use supported Windows local-account description (F03)
Oct 19, 2026
78f60a9
test(r339): reconcile nullable second-account exit with validated SID…
Oct 19, 2026
0239013
test(security): execute original PE-embedded RunAs helper on disposab…
Oct 19, 2026
20cf5fe
test(r340): normalize native Task Scheduler principal SID on readback…
Oct 19, 2026
f2e3f31
test(r340): unwrap native PS5.1 reflection arguments (F02)
Oct 19, 2026
b2f675f
test(r341): kill exact original Helper after BEGIN and verify pre-tas…
Oct 19, 2026
b992c4e
test(r341): use explicit 9/10 typed check count instead of SwitchPara…
Oct 19, 2026
9148acd
test(r342): witness original Helper death after actual protected task…
Oct 19, 2026
a6f742d
test(r343): witness original Helper death after protected Broker exec…
Oct 19, 2026
0da2533
fix(sensor): journal protected uninstall before mutation and authenti…
Oct 19, 2026
54d54f0
test(r344): capture original Helper warning and bound nominal guest d…
Oct 19, 2026
362d705
fix(sensor): trace R344 rollback capture origin and scope R85 install…
Oct 19, 2026
ec8b704
fix(sensor): distinguish read-only NTFS ACEs from mutations in journa…
Oct 19, 2026
8c4da94
test(r344): expand accepted ACL and nominal proof to all four origina…
Oct 19, 2026
86492c5
test(r344): diagnose protected journal capture scope on post-mutation…
Oct 19, 2026
a00ce08
fix(sensor): unify embedded Helper script state to preserve PREPARED …
Oct 19, 2026
0fb7404
test(r344): revalidate every original Helper death mode on fixed jour…
Oct 19, 2026
09315d2
test(security): prove original Helper rejects unowned Broker without …
Oct 19, 2026
ce33b95
test(r344): use official private uninstall Temp prefix in foreign-own…
Oct 19, 2026
a0fd11a
fix(sensor): pin protected ProgramFiles Broker directory identity dur…
Oct 19, 2026
55436a5
fix(sensor): request directory-list rights to enforce no-share-delete…
Oct 19, 2026
edf7e09
test(r347): unwrap only actual PS5.1 native rename-sharing denials (F02)
Oct 19, 2026
2e24613
test(r347): unwrap original .NET junction refusal from PS5.1 invocati…
Oct 19, 2026
688ae53
test(r348): witness privileged leaf overwrite despite protected direc…
Oct 19, 2026
70720ee
fix(sensor): use no-reparse per-leaf native locks during authenticate…
Oct 19, 2026
46c896f
test(r349): accept only genuine Win32 sharing violation 32 on preopen…
Oct 19, 2026
1aa2e02
fix(security): pin deferred cleanup directory identities through dele…
Oct 19, 2026
1f7acd4
ci(r355): route disposable pin and cleanup regressions to review branch
Oct 19, 2026
b19fc70
test(r355): require exact six native lease witness checks
Oct 19, 2026
8695cd7
test(r355): race original Setup cleanup with independent live directo…
Oct 19, 2026
17d09e3
test(r356): probe Win32 pinned-handle directory disposition vs separa…
Oct 19, 2026
1fc3f67
test(r356): avoid PowerShell h history alias in native proof helper
Oct 19, 2026
8451c6c
fix(security): delete exact empty cleanup directories through pinned …
Oct 19, 2026
f3a8418
test(r356): require pinned-handle disposition in CSharp command regre…
Oct 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
108 changes: 108 additions & 0 deletions .github/workflows/audit-r265-sensor-safety.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
name: R265 - Scoped cross-account sensor helper guard on disposable Windows
on:
push:
branches:
- release/r265-v175-sensor-crossuser-safety
permissions:
contents: read
jobs:
guest-sensor-guard:
name: "R265 no-driver guard-only cross-user test ${{ matrix.guest }}"
runs-on: ${{ matrix.system }}
timeout-minutes: 17
strategy:
fail-fast: false
matrix:
include:
- guest: A
system: windows-2025
- guest: B
system: windows-2022
steps:
- name: Checkout exact unmodified public v1.7.4 ancestor
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
with:
persist-credentials: false
fetch-depth: 0
- name: Ensure only helper/test/workflow changed; disposable admin host
shell: pwsh
run: |
$ErrorActionPreference='Stop'
if($env:GITHUB_ACTIONS -cne 'true' -or
$env:RUNNER_ENVIRONMENT -cne 'github-hosted' -or
$env:RUNNER_OS -cne 'Windows' -or
$env:GITHUB_REPOSITORY -cne 'GOD13emad/TaskbarMonitorEnhanced' -or
($env:GITHUB_REF -cne 'refs/heads/release/r265-v175-sensor-crossuser-safety' -and $env:GITHUB_REF -cne 'refs/heads/main') -or
$env:COMPUTERNAME -match '(?i)EMAD|ALI|LAPTOP'){
throw 'R265_REJECT_NON_DISPOSABLE_HOST'
}
$base='1375d719989aa93966bae445ac63b9a415f637ad'
git merge-base --is-ancestor $base HEAD
if($LASTEXITCODE -ne 0){throw 'R265_EXACT_RELEASE_SOURCE_NOT_BASE'}
$actual=@(git diff --name-only $base HEAD)
$allowed=@(
'.github/workflows/audit-r265-sensor-safety.yml',
'build/Test-R265-CrossUserGuard.ps1',
'installer/TBME_Setup_Elevated_Helper.ps1'
)
if($actual.Count -lt 14 -or $actual -cnotcontains 'installer/TBME_Setup_Elevated_Helper.ps1' -or $actual -cnotcontains 'installer/TaskbarMonitorEnhanced_Setup.cs'){
throw 'R265_VERSIONED_PRODUCT_SOURCE_GUARD_NOT_STAGED'
}
$files=@(
@{File='installer/TBME_Setup_Elevated_Helper.ps1';SHA='84A7DC21012A63C5959447D7234B365CF926028016A81B742F891951B191E7FB'},
@{File='build/Test-R265-CrossUserGuard.ps1';SHA='153268FBDC57F65B8AEC56ED80832F4C6EF5839A3640D0233DF2D7B4ED4606E2'}
)
foreach($item in $files){
$path=(Resolve-Path $item.File).Path
$str=[IO.File]::ReadAllText($path,[Text.Encoding]::UTF8)
$lf=$str.Replace(([string][char]13+[string][char]10),([string][char]10)).Replace(([string][char]13),([string][char]10))
$sha=[Convert]::ToHexString([Security.Cryptography.SHA256]::HashData([Text.Encoding]::UTF8.GetBytes($lf)))
if($sha -cne $item.SHA){throw 'R265_SOURCE_DIGEST_CHANGED'}
$tok=$null;$err=$null
[void][Management.Automation.Language.Parser]::ParseFile($path,[ref]$tok,[ref]$err)
if(@($err).Count){throw 'R265_WINDOWS_POWERSHELL51_SYNTAX_FAILED'}
}
$isAdmin=[Security.Principal.WindowsPrincipal]::new([Security.Principal.WindowsIdentity]::GetCurrent())
if(!$isAdmin.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)){
throw 'R265_NO_ADMIN_ON_GUEST_NO_ESCALATION'
}
if(Get-ScheduledTask -TaskName 'TaskbarMonitorEnhanced Sensor Broker' -ErrorAction SilentlyContinue){
throw 'R265_EXISTING_REAL_TASK_MUST_NOT_BE_TOUCHED'
}
if(Test-Path (Join-Path $env:ProgramFiles 'TaskbarMonitorEnhanced\SensorBroker')){
throw 'R265_EXISTING_REAL_BROKER_MUST_NOT_BE_TOUCHED'
}
'R265_FRESH_VM_TEST_ONLY_SCOPE_PIN=PASS'
- name: Test actual owner SID guard on both helper modes without executing later side effects
shell: powershell
run: |
$ErrorActionPreference='Stop'
./build/Test-R265-CrossUserGuard.ps1 -HostLabel '${{ matrix.guest }}'
$p=Join-Path $env:RUNNER_TEMP 'TBME_R265_${{ matrix.guest }}/R265_CROSSUSER.json'
if(!(Test-Path $p)){throw 'R265_TEST_RECEIPT_NOT_FOUND'}
$r=Get-Content $p -Raw|ConvertFrom-Json
if($r.Revision -cne 'R265' -or
$r.Status -cne 'PASS_OTHER_USER_SENSOR_TASK_PRESERVED_AND_SAME_OWNER_GUARD_ALLOWED' -or
$r.Guest -cne '${{ matrix.guest }}' -or
@($r.OtherUserModesRefused).Count -ne 4 -or
@($r.SameUserModesPermitted).Count -ne 4 -or
$r.VerifiedRealFullHelperEarlyRefusal -ne $true -or
$r.TestOwnedTaskDeleted -ne $true -or
$r.GuestUserAccountDeleted -ne $true -or
$r.ExactProductionHelperAfterGuardWasNotExecuted -ne $true -or
$r.NoSensorTaskTriggered -ne $true -or
$r.NoPawnIODriverOrSetupExecuted -ne $true -or
$r.OwnerPCAndPublicV174Unchanged -ne $true){
throw 'R265_GENUINE_VM_GUARD_SCOPE_NOT_ACCEPTED'
}
'R265_OTHER_USER_TASK_PRESERVED_BOTH_MODES_AND_SAME_OWNER_PERMITTED=PASS'
$global:LASTEXITCODE=0
- name: Preserve disposable bounded acceptance evidence
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: R265-guard-${{ matrix.guest }}
if-no-files-found: warn
retention-days: 21
path: |
${{ runner.temp }}/TBME_R265_${{ matrix.guest }}/R265_CROSSUSER.json
92 changes: 92 additions & 0 deletions .github/workflows/audit-r282-disposable-abrupt-recovery.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
name: R282 Pinned 1.7.5 fixture and immutable 1.7.6 cold journal recovery

on:
push:
branches: [test/r282-disposable-abrupt-update-recovery]
workflow_dispatch:

permissions:
contents: read

jobs:
original-release-cold-recovery:
name: Public v1.7.6 Setup / ${{ matrix.phase }} / pinned-file guest ${{ matrix.host }}
timeout-minutes: 20
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- host: A
phase: PREPARED
os: windows-2025
- host: B
phase: COMMITTING
os: windows-2022
steps:
- name: Checkout test-only source on exact hosted revision
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
with:
persist-credentials: false

- name: Verify PowerShell 5.1 parser and disposable execution contract
shell: powershell
run: |
$ErrorActionPreference='Stop'
if($env:GITHUB_ACTIONS -cne 'true' -or
$env:RUNNER_ENVIRONMENT -cne 'github-hosted' -or
$env:RUNNER_OS -cne 'Windows' -or
$env:COMPUTERNAME -match 'EMAD-PC'){throw 'R282_UNSAFE_NON_DISPOSABLE_HOST'}
if((git rev-parse HEAD).Trim() -cne $env:GITHUB_SHA){throw 'R282_SOURCE_CHECKOUT_MISMATCH'}
$p=(Resolve-Path build/Test-AbruptStageRecovery-R282.ps1).Path
$tokens=$null; $errors=$null
[void][Management.Automation.Language.Parser]::ParseFile($p,[ref]$tokens,[ref]$errors)
if(@($errors).Count){$errors | ForEach-Object { Write-Output $_.Message };throw 'R282_POWERSHELL_PARSER_FAILED'}
$source=[IO.File]::ReadAllText($p)
if($source.Contains('[string]$args') -or !$source.Contains('[string]$arguments') -or
!$source.Contains('$si.Arguments=$arguments')){
throw 'R282_BLOCK_RESERVED_POWERSHELL_AUTOMATIC_ARGS_PARAMETER'
}
if(!(Test-Path build/official-v175-managed.json)){throw 'R282_PREDECESSOR_PINNED_FIXTURE_MISSING'}
'R282_EXACT_HOSTED_GUARDS_AND_TEST_PARSER_PASS'

- name: Build exact resource-pinned prior fixture, kill test helper, recover with real public Setup
shell: powershell
env:
GH_TOKEN: ${{ github.token }}
run: |
$ErrorActionPreference='Stop'
./build/Test-AbruptStageRecovery-R282.ps1 -HostLabel '${{ matrix.host }}' -Phase '${{ matrix.phase }}'
$receipt=Join-Path $env:RUNNER_TEMP 'TBME_R282_${{ matrix.host }}_${{ matrix.phase }}/R282_ABRUPT_RECOVERY.json'
if(!(Test-Path $receipt)){throw 'R282_DURABLE_RECEIPT_ABSENT'}
$r=Get-Content $receipt -Raw|ConvertFrom-Json
if($r.Status -cne 'PASS_DISPOSABLE_CHILD_KILLED_THEN_OFFICIAL_INSTALLER_AUTO_RECOVERED' -or
$r.SourceBranchCommit -cne $env:GITHUB_SHA -or
$r.HostLabel -cne '${{ matrix.host }}' -or
$r.Scenario -cne '${{ matrix.phase }}' -or
$r.Official175ManagedFixtureRowsExact -ne 22 -or
$r.OriginalOfficial175InstallerFreshInstallPerformed -ne $false -or
$r.HistoricalV175FilesExtractedFromPinnedPublishedInstallerResources -ne $true -or
$r.PrivilegedSensorDriverInstallPerformedForTest -ne $false -or
$r.StagingHelperExternalProcessKilled -ne $true -or
$r.NativeSetupAutomaticJournalRecoveryAndInPlaceUpgrade -ne $true -or
$r.ExactProtectedUserDataSHA256Preserved -ne $true -or
$r.SingleCanonicalUserRoot -ne $true -or
$r.RealPhysicalMainsCut -ne $false -or
$r.ActualSetupExecutableProcessKilled -ne $false -or
$r.NoOriginalOwnerPcTouched -ne $true){throw 'R282_TYPED_DISPOSABLE_RECOVERY_NOT_ACCEPTED'}
if('${{ matrix.phase }}' -ceq 'COMMITTING' -and $r.ManagedComponentsPartiallyReplacedBeforeKill -ne 2){throw 'R282_PARTIAL_COMMIT_NOT_PROVEN'}
'R282_VERIFIED_EXACT_OFFICIAL_176_AFTER_REAL_TEST_CHILD_KILL=PASS'

- name: Preserve the bounded individual fail/pass receipt on hosted runner
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: R282-abrupt-${{ matrix.host }}-${{ matrix.phase }}
if-no-files-found: warn
retention-days: 21
path: |
${{ runner.temp }}/TBME_R282_${{ matrix.host }}_${{ matrix.phase }}/R282_ABRUPT_RECOVERY.json
${{ runner.temp }}/TBME_R282_${{ matrix.host }}_${{ matrix.phase }}/ARMED.json
${{ runner.temp }}/TBME_R282_${{ matrix.host }}_${{ matrix.phase }}/ARMED.error.txt
${{ runner.temp }}/TBME_R282_${{ matrix.host }}_${{ matrix.phase }}/R282_INSTALL_DIAGNOSTIC.json
135 changes: 135 additions & 0 deletions .github/workflows/audit-r284-candidate-restore-residue.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
name: R284 private v1.7.7 candidate and exact interrupted Setup recovery

on:
push:
branches: [fix/v1.7.7-restore-residue-r284]
workflow_dispatch:

permissions:
contents: read

jobs:
candidate:
name: Build private unsigned v1.7.7 candidate (not a public release)
runs-on: windows-2025
timeout-minutes: 25
steps:
- name: Checkout exact candidate source
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
with:
persist-credentials: false
- name: Setup .NET SDK
uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68
with:
dotnet-version: 10.0.400
- name: Build hash-bound private Setup candidate
shell: pwsh
run: |
$ErrorActionPreference='Stop'
if((git rev-parse HEAD).Trim() -cne $env:GITHUB_SHA -or
$env:GITHUB_ACTIONS -cne 'true' -or
$env:RUNNER_ENVIRONMENT -cne 'github-hosted' -or
$env:RUNNER_OS -cne 'Windows'){throw 'R284_BAD_HOSTED_SOURCE'}
./build/Build.ps1
if($LASTEXITCODE -ne 0){throw 'R284_VERSIONED_BUILD_FAILED'}
$setup='build/_out/Setup/TaskbarMonitorEnhanced_Setup_1.7.7.exe'
$main='build/_out/App/TaskbarMonitorEnhanced.exe'
if(!(Test-Path $setup) -or !(Test-Path $main)){throw 'R284_PRIVATE_BINARIES_MISSING'}
$record=[ordered]@{
Schema=1;Status='PRIVATE_NOT_A_RELEASE';Commit=$env:GITHUB_SHA
Version='1.7.7';Private=$true;NotForPublicInstallation=$true
SetupSHA256=(Get-FileHash $setup).Hash
MainSHA256=(Get-FileHash $main).Hash
}
[IO.File]::WriteAllText('build/_out/CANDIDATE.json',($record|ConvertTo-Json -Depth 4),[Text.UTF8Encoding]::new($false))
'R284_CANDIDATE_COMPILED_AND_HASH_BOUND'
- name: Upload bounded candidate for disposable tests only
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: R284-PRIVATE-NOT-PUBLIC-RELEASE
if-no-files-found: error
retention-days: 14
path: |
build/_out/CANDIDATE.json
build/_out/Setup/TaskbarMonitorEnhanced_Setup_1.7.7.exe
build/_out/App/TaskbarMonitorEnhanced.exe

cold-recovery:
name: Recovery exact Main candidate on isolated Windows ${{ matrix.host }}
needs: candidate
timeout-minutes: 18
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- host: A
os: windows-2025
- host: B
os: windows-2022
steps:
- name: Exact candidate source checkout
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
with:
persist-credentials: false
- name: Retrieve private candidate
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093
with:
name: R284-PRIVATE-NOT-PUBLIC-RELEASE
path: _r284_private_candidate
- name: Preflight script parser and strict disposable host
shell: powershell
run: |
$ErrorActionPreference='Stop'
if($env:GITHUB_ACTIONS -cne 'true' -or
$env:RUNNER_ENVIRONMENT -cne 'github-hosted' -or
$env:RUNNER_OS -cne 'Windows' -or
$env:COMPUTERNAME -match 'EMAD-PC'){throw 'R284_UNSAFE_NON_DISPOSABLE_HOST'}
if((git rev-parse HEAD).Trim() -cne $env:GITHUB_SHA){throw 'R284_BAD_SOURCE_CHECKOUT'}
$p=(Resolve-Path build/Test-R284-RestoreResidue-NativeRecovery.ps1).Path
$tokens=$null;$errors=$null
[void][Management.Automation.Language.Parser]::ParseFile($p,[ref]$tokens,[ref]$errors)
if(@($errors).Count){$errors|ForEach-Object{$_.Message};throw 'R284_PS51_SCRIPT_PARSER_INVALID'}
if(!(Test-Path build/official-v176-managed.json)){throw 'R284_PINNED_176_MISSING'}
$c=Get-Content _r284_private_candidate/CANDIDATE.json -Raw|ConvertFrom-Json
if($c.Commit -cne $env:GITHUB_SHA -or $c.Version -cne '1.7.7' -or
$c.Private -ne $true -or $c.NotForPublicInstallation -ne $true){throw 'R284_NOT_EXACT_PRIVATE_CANDIDATE'}
'R284_GUEST_PRECONDITION_PASS'
- name: Force helper crash; prove residue recovery, and real Setup kill on B
shell: powershell
env:
GH_TOKEN: ${{ github.token }}
run: |
$ErrorActionPreference='Stop'
./build/Test-R284-RestoreResidue-NativeRecovery.ps1 -HostLabel '${{ matrix.host }}' -CandidateDir (Resolve-Path _r284_private_candidate).Path
if($LASTEXITCODE -ne 0){throw 'R284_GUEST_TEST_FAILED'}
$p=Join-Path $env:RUNNER_TEMP ('R284_${{ matrix.host }}_'+$env:GITHUB_RUN_ID+'/R284_RECOVERY_RECEIPT.json')
if(!(Test-Path $p)){throw 'R284_GUEST_RECEIPT_MISSING'}
$r=Get-Content $p -Raw|ConvertFrom-Json
if($r.Schema -ne 1 -or $r.Revision -cne 'R284' -or
$r.Status -cne 'PASS_EXACT_V177_SETUP_RETRY_AFTER_STRANDED_RESTORE' -or
$r.Host -cne '${{ matrix.host }}' -or
$r.SourceCommit -cne $env:GITHUB_SHA -or
$r.PreviousManifestRowsSHAAndSizeChecked -ne 22 -or
$r.StagingHelperActuallyKilled -ne $true -or
$r.StrandedUpdaterOwnedRestoreZeroByteProven -ne $true -or
$r.RecoveredAfterSecondNativeSetupRun -ne $true -or
$r.SingleCanonicalUserRootPreserved -ne $true -or
$r.ProtectedUserDataHashPreserved -ne $true -or
$r.JournalRemoved -ne $true -or
$r.OriginalOwnerComputerTouched -ne $false -or
$r.PhysicalMainsLossTriggered -ne $false){throw 'R284_RECEIPT_TYPED_PASS_FAILED'}
if('${{ matrix.host }}' -ceq 'B' -and
($r.NativeSetupProcessActuallyKilled -ne $true -or
$r.NativeSetupManagedNoteDeletionWitnessed -ne $true)){throw 'R284_REAL_SETUP_KILL_NOT_WITNESSED'}
'R284_GUEST_TYPED_RECOVERY_PASS'
- name: Preserve bounded guest evidence
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: R284-guest-${{ matrix.host }}-${{ github.sha }}
if-no-files-found: warn
retention-days: 21
path: |
${{ runner.temp }}/R284_${{ matrix.host }}_${{ github.run_id }}/R284_RECOVERY_RECEIPT.json
${{ runner.temp }}/R284_${{ matrix.host }}_${{ github.run_id }}/ARMED.json
Loading
Loading