Add win-fix-transaction-logs - #150
Conversation
Clears exhausted Common Log File System transaction logs on an offline disk, so servicing that fails with ERROR_LOG_FULL (0x800719e4) can run again.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: cf64bab1-6099-4e7e-aef4-57ffea10ce6b
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: cf64bab1-6099-4e7e-aef4-57ffea10ce6b
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: cf64bab1-6099-4e7e-aef4-57ffea10ce6b
Automated review using the supplied PR Review AgentReviewed head: 80dfd983eae6b06b5398d47f6df804536f1442ac This is the supplied agent's static analysis, not a maintainer decision or a fresh repair/boot test. Findings have not been independently reproduced. No source or Azure resources were changed during review. The original report is retained locally; only leading process narration and local prompt-path provenance were normalized for posting. Finding text is unchanged. Full automated review reportPR Review: #150 — Add win-fix-transaction-logsGenerated: 2026-09-10 Scope reviewed: the two changed files pinned in the review packet ( FindingsCritical
Warning
Info
Standards checks that pass (verified against the source, not assumed): init sourcing at L117 matches the documented convention; Operational Risk Assessment
Overall Risk: Medium 🟡 ValidationDeterministic checks below were performed by the launcher and recorded in the review packet; I did not re-execute them. I did independently assess the corresponding source.
Not performed in this review: no repair, boot, disk, registry-hive or Azure testing of any kind. No script was executed, no disk mounted, no hive loaded. Findings are derived from reading the pinned snapshots. The one finding carrying environmental uncertainty (drive-safe paths) is labelled as such with a proposed validation. Recommendationrequest changes Two Critical findings should be resolved before merge. Both are localized and neither requires redesigning the repair logic:
The Warning items — The underlying repair is well-constructed: correctly separated from This is an automated review, not a human maintainer approval. Provenance
|
Addresses the PR150 review findings.
- A manifest that cannot be written now fails the run instead of being
ignored. The manifest is staged and read back before it is published, so
a partially written file can never be presented as a usable undo record.
- A malformed, empty or unreadable manifest is refused rather than being
treated as "nothing to revert".
- detectOnly and revert are strictly non-mutating.
- Manifest paths are built drive-safely, so a stale offline drive letter
cannot throw during cleanup.
- The main flow follows the helper caller contract: a top-level finally
that releases discovery-owned drive letters and flushes the buffered
helper log, with the status returned after that cleanup.
Validated with the local mocked harness (44 checks, no registry, disk or hive
access) and the log-ordering audit. The Azure create/run/restore acceptance
cycle was performed previously against the pre-review script.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Review findings implementedPublication head: d3cc62da241455db812067c9ebacc923ce9e9279 The earlier automated report remains a static review of
Testing scope, stated plainly: these changes were validated with the local mocked harness Original review provenance
|
What this adds
win-fix-transaction-logs- one scenario script and its ownmap.jsonentry.Clears exhausted Common Log File System transaction logs on an offline disk, so servicing that fails with ERROR_LOG_FULL (0x800719e4) can run again.
The catalog entry a support engineer reads when choosing it:
How it works
Runs against the broken OS disk attached to a rescue VM by "az vm repair create".
It looks for
ERROR_LOG_FULLevidence in the offline CBS logs, then builds a bounded removalplan for the selected scope. TxR is the default; Config/SMI require an explicit scope choice.
force=trueis an explicit override for cases where local evidence has rolled out of the logs.Before deletion, the helper verifies capacity and captures a backup with original hashes,
security descriptors and attributes. It checks the resulting file set and rolls back if
verification fails. The revert manifest persists those verified records, so a later restore
can reject a modified or unverifiable backup. Failed or partial restores return error and
retain the manifest for retry.
Parameters
detectOnlyscopeforcerevertwindowsDriveConventions followed
.\src\windows\common\setup\init.ps1and returns$STATUS_SUCCESSor$STATUS_ERROR.Write-Host.az vm run-commandkeeps only the last 4096 characters of the output stream, so a summary printed first is the first thing a long run loses.Testing
Historical acceptance: this scenario is included in the recorded completed
az vm repair run --previewproduct-path batch. This publication does not repeat the fullcreate/run --preview/restorecycle.September 10 removal/consumer coverage: 66/66 removal regressions and 57/57 consumer
regressions passed on both PS5.1 and PS7. Native Gen1/Gen2 volume checks exercised capacity,
backup tampering, automatic rollback and exact ACL/attribute restoration.
An additional native run executed the real manifest writers and both removal consumers'
revert entry points: 22 assertions through four processes on a disposable attached VHD.
This script returned
STATUS_ERRORfor a same-size modified backup, retained its manifest,and completed a verified retry once the original backup was restored. Those fixtures used
synthetic files/hives; they are not a fresh full Windows scenario acceptance matrix.
Series
First wave of four independent scenario PRs, and the first planned upstream consumer of
Invoke-OfflineRemovalPlan. The shared helpers in #143, #146 and #147 are already merged.This PR adds no helper files and changes no existing scenario; its only existing file change
is appending this run-id to
map.json, preserving every upstream entry.