Releases: bilbospocketses/tiny11options
v1.0.30
Fixes the Dismount-WindowsImage -Save lock that broke ISO creation — at its real root cause. v1.0.29 (now retracted) misdiagnosed the WIM-commit failure as transient host interference and bolted on a retry; the lock is actually an in-process .NET registry-provider handle held by the build's own PowerShell process, which a retry can never clear. Offline-hive value enumeration now uses reg.exe exclusively (never the HKLM:\z* provider), so no hive handle is held at dismount time — the reg.exe-only pattern of upstream tiny11builder and Microsoft's offline-servicing docs. Pester 521/0 (plus the admin-gated Synthetic harness).
Fixed
- The Standard build no longer fails at
Dismount-WindowsImage -Savewith "The process cannot access the file because it is being used by another process." Root cause:Invoke-RegistryPatternZeroActionread the loaded offlineNTUSERhive through the .NET PowerShell registry provider (Test-Path/Get-ItemonHKLM:\z…). The provider caches an in-processRegistryKeyhandle to the hive's backing file inside the mount; the kernel keeps a hive loaded while any key handle is open, andreg unloadhas no force flag — so the handle survived into the dismount and lockedinstall.wim. v1.0.29's retry could not help: the handle is held by the same long-lived process for the whole retry window, and GC (the only thing that would release it) is non-deterministic and never fires during the backoff. The latent bug has existed since v1.0.3 — the provider read predates the v1.0.28 idiom tweak and was byte-identical in the v1.0.27 "revert to v1.0.6" — surfacing intermittently with GC timing and deterministically once a build actually reached the commit step. This corrects the v1.0.26–v1.0.29 "a transient WIM dismount/save file-lock is the leading suspect" framing: it was never environmental. - Stale-hive recovery (
Clear-Tiny11StaleHives) no longer opens a provider handle either. It detected strandedHKLM\z*hives withTest-Path HKLM:\z…, which — on the exact stranded-hive path it exists to recover — opened a fresh in-process handle. It now probes viareg.exe(Test-Tiny11HiveLoaded).
Changed
- All offline-hive registry access in the build process is now
reg.exe-only. NewTiny11.Hiveshelpers:Get-Tiny11RegValueNames(value-name enumeration viareg query, replacingGet-Item … | Select-Object -ExpandProperty Property),Test-Tiny11HiveLoaded(load check viareg query), andInvoke-Tiny11RegExe(a%SystemRoot%\System32\reg.exeabsolute-path wrapper — child process, handle closed on exit).Invoke-RegistryPatternZeroActionis rewritten ontoGet-Tiny11RegValueNames. No change to a successful build's output image — the same value names are matched and the samereg add … /d 0writes are issued. - v1.0.29's WIM-integrity gate and
-Saveretry are retained as defense-in-depth (harmless, and they still guard a genuinely bad save or rare external interference), but they are no longer the mechanism — the reg.exe fix removes the in-process cause at the source. - Offline-servicing binaries now resolve from
%SystemRoot%\System32by absolute path, not via%PATH%(Local-Dependencies-Only).reg.exe(HivesInvoke-RegCommand+ Core's inline tweak writes),dism.exe(Worker cleanup/export, Core appx enumeration/removal,Actions.ProvisionedAppx, and theStart-CoreProcesswrapper that backs dism/takeown/icacls), androbocopy.exe(Worker ISO copy) are all OS-intrinsic servicing tools that can't be vendored, so they're pinned to the System32 path — blocking a PATH-hijacked stand-in. NewTiny11.HivesresolversGet-Tiny11RegExePath/Get-Tiny11DismExePath. (The post-boot cleanup script'sreg.exeruns on the target machine — a separate context — and is unchanged.)
Added
- Regression guard
tests/Tiny11.OfflineHive.NoProvider.Drift.Tests.ps1— a static scan that fails if anysrcmodule reintroduces anHK*:\zoffline-hive provider-drive reference. Plus reg.exe-only unit coverage forGet-Tiny11RegValueNames,Test-Tiny11HiveLoaded, and the rewrittenInvoke-RegistryPatternZeroAction. (The v1.0.29 synthetic-WIM harness never loaded a registry hive, so it structurally could not have caught this class.)
Notes
- Process fix: v1.0.29 shipped without a real end-to-end ISO build — only the content-agnostic synthetic-WIM test ran in CI — which is exactly why a real-build regression slipped through. v1.0.30 is gated on an actual
install.wim-loading build (load hives → pattern-zero → unload → dismount-save) before release. - v1.0.29 was retracted: its GitHub release and Velopack feed assets were deleted, so v1.0.28 remains the offered latest until v1.0.30 ships. The signed
v1.0.29tag is retained — the repo's tag-protection ruleset blocks tag deletion.
v1.0.28
Re-applies the safe image-shaping improvements on top of the proven v1.0.27 baseline, and retires the autounattend template's runtime network fetch. v1.0.27 reverted five image-shaping files wholesale to v1.0.6 to restore an installable ISO; this release re-applies the install-verified subset of those changes (the Compact OS toggle, catalog-load validation, and the registry-pattern-zero read fix) — each confirmed image-neutral — while permanently leaving out the one change that caused harm (the v1.0.8 State-throw guard). Standard-mode build and install behavior is unchanged from v1.0.27. Pester 491/0, xUnit 140/0.
Added
- Compact OS is a user-facing toggle again. Re-added
tweak-compact-installas a realoobecatalog item (default: apply, metadata-only — it drives the<Compact>autounattend element, no offline action), so Compact OS surfaces as a checkbox and is genuinely user-controllable. It stays on by default, matching v1.0.27. To change it post-install instead:compact.exe /compactos:never(or/compactos:always). - Catalog-load validation for
registry-pattern-zeroactions — the catalog loader now validates the field shape ofregistry-pattern-zeroactions at load time.
Changed
registry-pattern-zeroreads value names viaGet-Item … | Select-Object -ExpandProperty Propertyinstead ofGet-ItemProperty | Get-Member, avoidingPSObjectmetadata pollution (PSPath,PSChildName, …). Image-neutral — same value names matched, same result for the oneSubscribedContent-*Enabledaction.
Removed
- The autounattend template no longer performs a runtime network fetch.
Get-Tiny11AutounattendTemplatepreviously fell through from the bundled file to a liveInvoke-RestMethodagainst the fork's GitHubmainbranch, re-caching the result. Because the template ships bundled with the app (and is always present), that fetch tier was effectively unreachable in normal builds — and where it would have fired (a stale cache), it maderaw.githubusercontent.coma live build-time dependency and a date-/network-dependent build input. The template is now bundled + embedded only: the shipped file is used, with the in-module embedded copy as the sole fallback, and template updates ride a normal app release. A Pester regression guard asserts noInvoke-RestMethodis performed.
Notes
- This completes the v1.0.27 follow-up bisect. Each of the five files v1.0.27 reverted was re-tested individually against a real build + install; all were confirmed image-neutral — consistent with the v1.0.26 install failure having been intermittent (a WIM dismount/save file-lock is the leading suspect, tracked separately) rather than caused by any one file. The only v1.0.8–v1.0.26 change deliberately not re-applied is the autounattend
State-throw guard: a runtimethrowon a missing catalog ID was the wrong layer — it turned a self-inflicted orphan into a build crash at 18% on the user's machine.Statestays lenient (v1.0.6 behavior); orphan detection will return as a CI/load-time reference-integrity test, not a runtime throw. TheTiny11.Actions.Filesystem.psm1takeown/icacls noise filter also stays reverted (plain| Out-Null).
v1.0.27
Heads up: Compact OS is forced ON in the ISOs this build produces. Windows installs with its system files compressed on disk (reclaims ~1.5-2.5 GB, at a small CPU cost to decompress on read), and there is no in-app toggle yet. To turn it off (or back on) on the installed machine, run from an elevated Command Prompt or PowerShell:
compact /compactos:never (turn Compact OS OFF)
compact /compactos:always (turn Compact OS ON)
First release since v1.0.6 that produces an installable Standard-mode ISO. v1.0.26 was the first to complete a Standard build, but the ISO it produced failed during Windows Setup at the file-copy step ("Windows installation has failed") — a build-pipeline regression in the image-shaping code that had accumulated between v1.0.7 and v1.0.26 and only became observable once the build could finally run to completion. v1.0.27 reverts that build code to the proven v1.0.6 state while keeping the safe post-v1.0.6 work. Verified end-to-end on a Win11 25H2 build: clean ISO build → clean install → Compact OS on → first-boot cleanup task deployed and working.
Fixed
- The generated Standard-mode ISO installs again. The files that shape the offline image —
catalog/catalog.json,src/Tiny11.Autounattend.psm1,src/Tiny11.Catalog.psm1,src/Tiny11.Actions.Registry.psm1,src/Tiny11.Actions.Filesystem.psm1— were reverted to their v1.0.6 content, the last version with a confirmed clean install (a dozen-plus smoke installs over several days). The changes that accumulated across v1.0.7–v1.0.26 in those files (takeown/icacls stderr handling, the autounattendState-throw guard, the registry-pattern-zero rework, catalog-load validation, and thetweak-compact-installcatalog item) collectively produced an image that no longer installed; reverting them as one consistent v1.0.6 set restores the installable image. Compact OS stays on by default — v1.0.6's lenientStateresolves the now-uncataloguedtweak-compact-installtoapply→<Compact>true</Compact>— so the on-disk footprint is unchanged.
Changed
- Only the image-shaping build pipeline was reverted; the UI, logging, and failed-build cleanup stay current. Verified from the v1.0.6→v1.0.26 diffs to be cleanup/logging/robustness with zero effect on the output image, and therefore kept: the WebView2 UI redesign, build logging, stale-hive recovery (
Clear-Tiny11StaleHives) and locked-scratch-file reporting in the Worker pipeline, the input-ISO drive-letter mount poll (Tiny11.Iso.psm1), andtiny11-cancel-cleanup.ps1. Core-mode (Tiny11.Core.psm1) and first-boot cleanup (Tiny11.PostBoot.psm1) — neither on the Standard install path — were also left current.
Deprecated
- Releases v1.0.7 through v1.0.26 are deprecated — none produces an installable Standard-mode ISO. v1.0.7 aborts the build (takeown/icacls
2>&1becomes a terminating error under the orchestrator'sStopon the Windows PowerShell 5.1 build host); v1.0.8–v1.0.25 crash the build at 18% (thetweak-compact-installorphan reference once v1.0.8 madeStatethrow); v1.0.26 builds an ISO but it fails to install at the Windows Setup file-copy step. Each GitHub release in that range carries a defect banner pointing here. Core-mode builds were unaffected throughout, and existing installs auto-update to v1.0.27 via Velopack. v1.0.6 and earlier predate the regression.
Notes
- The single change within the reverted set responsible for the install failure was not individually isolated — the five files were reverted together as the proven v1.0.6 image pipeline. A follow-up bisect can pinpoint it and re-apply the innocent improvements (e.g. catalog-load validation, the registry-pattern-zero correctness fix) on top of this working baseline.
v1.0.26
DEPRECATED: this release is defective. Use v1.0.27 instead.
No release from v1.0.7 through v1.0.26 produces an installable Standard-mode ISO. This version builds an ISO, but the ISO fails to install during Windows Setup at the file-copy step -- the build-pipeline image regression that had accumulated since v1.0.7.
v1.0.27 reverts the image-shaping build pipeline to the proven v1.0.6 code -- verified end-to-end (clean build, clean install, Compact OS on, first-boot cleanup working) -- while keeping the post-v1.0.6 UI, logging, and failed-build cleanup. Existing installs auto-update via Velopack. Core-mode builds were unaffected.
First release that completes a Standard-mode ISO build end-to-end. v1.0.25 fixed the autounattend orphan crash at 18%, but Standard builds still failed at the catalog-apply phase — an older, separate regression the orphan crash had been masking. v1.0.26 fixes it.
Fixed
- Standard-mode builds no longer abort on benign takeown/icacls "Access is denied" noise. Since v1.0.7,
Invoke-NativeWithNoiseFilterran& tool 2>&1 | ForEach-Object; on the build host (Windows PowerShell 5.1) under the orchestrator's$ErrorActionPreference='Stop', redirecting a native command's stderr via2>&1makes that stderr a terminating error — so benign protected-folder lines (…\LogFiles\WMI\RtBackup\*: Access is denied.,…\WebThreatDefSvc\*) aborted the build at the catalog-apply step before the filter could suppress them. This regressed v1.0.3's| Out-Nullbehavior (which never aborted) and was hidden v1.0.8–v1.0.25 behind the earlier 18% orphan crash. Fix: a function-local$ErrorActionPreference='Continue'so native stderr flows through the filter instead of terminating — restoring the non-fatal contract while keeping the noise suppression. New regression guard spawns the real 5.1 host (pwsh 7 doesn't reproduce it). - A failed build no longer bricks the next one (stale offline-hive recovery). A build that exited with the offline registry hives still loaded stranded
HKLM\z{COMPONENTS,DEFAULT,NTUSER,SOFTWARE,SYSTEM}, making every subsequent build fail atreg loadwith "Access is denied". NewClear-Tiny11StaleHivesruns at the start of both the Worker and Core pipelines (before any hive load), best-effort unloading any strandedz*hive and clearing corrupt WIM mount points; never fatal. Pester 521/0 → 524/0; xUnit 140/0.
Notes
- v1.0.8 through v1.0.25 cannot complete a Standard-mode ISO build (v1.0.8–v1.0.24: the 18% orphan crash; v1.0.25: the takeown regression above). The deprecation banners on those GitHub releases point to v1.0.26, the first release that builds a Standard ISO end-to-end. Core-mode builds were unaffected throughout, and existing installs auto-update to v1.0.26 via Velopack.
v1.0.25
DEPRECATED: this release is defective. Use v1.0.27 instead.
No release from v1.0.7 through v1.0.26 produces an installable Standard-mode ISO. This version fixed the 18% orphan crash, but the Standard-mode build still aborts at catalog-apply on the v1.0.7 takeown/icacls regression.
v1.0.27 reverts the image-shaping build pipeline to the proven v1.0.6 code -- verified end-to-end (clean build, clean install, Compact OS on, first-boot cleanup working) -- while keeping the post-v1.0.6 UI, logging, and failed-build cleanup. Existing installs auto-update via Velopack. Core-mode builds were unaffected.
Deprecated
- Releases v1.0.8 through v1.0.24 are deprecated — they shipped a defective Standard-mode build. Every release in that range crashes during a Standard-mode ISO build at the autounattend-render step (18%) with
catalog item ID 'tweak-compact-install' not found in ResolvedSelections, producing no ISO. (Root cause under Fixed below: a long-latent orphaned catalog reference that v1.0.8's audit hardening turned from a silent default into a hard failure.) Core-mode builds in that range were unaffected. v1.0.25 is the fix. These releases remain published for auditability, but each one's GitHub release notes are annotated with a defect banner pointing to v1.0.25, and existing installs are offered v1.0.25 as the new latest via Velopack auto-update. v1.0.7 and earlier predate the change and were not affected.
Fixed
- Standard-mode (Worker pipeline) builds no longer crash at the 18% autounattend-render step.
Get-Tiny11AutounattendBindingsreferenced catalog itemtweak-compact-install, which was never present incatalog/catalog.json— only the binding and a hand-built test fixture existed (the Compact-OS toggle from the v0.1.0 design spec was half-implemented: consumer written, catalog producer never added). Since v1.0.8 hardened the bindings to throw on a missing ID instead of silently defaulting it toapply(audit A5), every Standard build failed withcatalog item ID 'tweak-compact-install' not found in ResolvedSelections. Fix completes the feature: addstweak-compact-installas a realoobecatalog item (default: apply, metadata-only — no offline action; it drives the<Compact>autounattend element only), so it now surfaces as a user-facing checkbox and<Compact>is genuinely user-controllable. Compact OS stays on by default, matching pre-v1.0.8 behavior. Core-mode builds were unaffected. Reported on a Win11 25H2 build. - Closed the gap that hid the bug. The autounattend bindings tests (
tests/Tiny11.Autounattend.Tests.ps1) now deriveResolvedSelectionsfrom the realcatalog.json(viaNew-/Resolve-Tiny11Selections) instead of a fixture that fabricatedtweak-compact-installas present — that fixture drift was exactly what masked the crash. Addedtests/Tiny11.Catalog.ReferenceIntegrity.Drift.Tests.ps1: a defense-in-depth scan that fails if any production-runtime file (PS modules, orchestrator scripts, C# launcher) hardcodes a catalog-ID literal absent fromcatalog.json, stopping the whole orphan-reference class from recurring. Pester 518/0 → 521/0.
Changed
-
Velopack
0.0.1298→1.0.1(GA). Bumped both pins in lockstep — thevpkCLI (release.ymlVPK_VERSION) and theVelopackNuGetPackageReference(launcher/tiny11options.Launcher.csproj). The .NET API surface used here (VelopackApp.Build().Run(),UpdateManager,GithubSource, the customIUpdateSource) is source-compatible — no code changes. Verified locally: launcher publishes against 1.0.1, xUnit 140/0, andvpk 1.0.1 packwith the existingrelease.ymlflags still emitsreleases.win.json+RELEASES+tiny11options-win-Setup.exe+*.nupkg(upload glob unchanged). 1.0.x additionally produces aPortable.zipthat the glob deliberately does not upload (preserves prior behavior). Refreshed the stalerelease.ymlasset-glob comment that referenced0.0.1298runtime behavior. -
Detached from upstream fork network. Repository is no longer a fork of
ntdevlabs/tiny11builderper GitHub's "Leave fork network" Settings action.gh api repos/bilbospocketses/tiny11options --jq '.fork'now returnsfalse;.parentand.sourceare bothnull. Formalizes what was already the project posture ("standalone fork — no upstream contributions" perproject_tiny11options_dependency_policy.md, the existing CONTRIBUTING.md note "we do not contribute back to the upstreamntdevlabs/tiny11builderrepo", and the README "Contribution / fork boundary" section). Historical attribution to ntdevlabs is preserved in README + LICENSE — credit, separate from the GitHub fork relationship. -
docs/release-signing-setup.mddrift fix — Status banner refreshed from "v1.0.0 through v1.0.7 / v1.0.8 cycle" to "v1.0.0 through v1.0.24 / v1.1.0 cycle". Naming-note + FAQ updated to reflect the v1.0.24azure/trusted-signing-action→azure/artifact-signing-action@v2.0.0rename (pinned to commitc7ab2a86). Added explanation that v2.0.0 retainstrusted-signing-account-nameas a backward-compat input alongside the newsigning-account-name, so existingTRUSTED_SIGNING_*secret names continue to work. Added v1.1.0ci B2scope mention (step-level secret scope narrowing, clears ScorecardTokenPermissionsID).
Added
LICENSE— GPL-3.0-only license text added at repo root. Matches control-menu, ws-scrcpy-web, svgedit, and oao licensing posture. Clears the OpenSSF ScorecardLicenseIDfinding. README's existing "License / credits" section already references upstream + fork additions; this PR adds the formal license file.
Changed
- Microsoft.Web.WebView2 now resolved via NuGet end-to-end, not vendored DLLs.
launcher/tiny11options.Launcher.csproj: three<Reference HintPath="...">+<Content Include="...">blocks replaced with a single<PackageReference Include="Microsoft.Web.WebView2" Version="1.0.2535.41" />. MSBuild handles native asset deployment automatically (WebView2Loader.dlllands in both the build root andruntimes/win-x64/native/per NuGet's standard layout). The publishedtiny11options.exebundles all DLLs into the self-contained single-file artifact viaIncludeAllContentForSelfExtract=true— end-user installs remain fully offline-capable.src/Tiny11.WebView2.psm1: legacy PS WPF wizard now resolves DLLs from the NuGet global packages folder (%USERPROFILE%\.nuget\packages\microsoft.web.webview2\<version>\lib\net462\for managed wrappers +\runtimes\win-x64\native\for the loader).Get-Tiny11WebView2SdkPathswapped its-RepoRootparameter for-NugetPackagesRoot(default:$env:NUGET_PACKAGESor$env:USERPROFILE/.nuget/packages). Error message points atdotnet restore launcher/tiny11options.Launcher.csprojwhen DLLs are missing.tests/Tiny11.WebView2.Tests.ps1: 6 existing tests updated to assert the NuGet cache layout; 2 new tests added (NUGET_PACKAGES env var override + dotnet restore hint in the throw message). Pester baseline 516/0 -> 518/0.CONTRIBUTING.md: documentsdotnet restoreas a one-time prereq for the legacy PS path. Production users of the released.exeare unaffected.- Deleted
dependencies/webview2/1.0.2535.41/(three checked-in DLLs: Core.dll, Wpf.dll, WebView2Loader.dll). - Future version bumps flow through Dependabot's
nugetecosystem; previously the vendored DLLs were invisible to Dependabot.
Security
- OpenSSF Scorecard
BinaryArtifactsIDfinding cleared — the three WebView2 DLLs previously vendored underdependencies/webview2/were the only binaries flagged. Going forward, binaries committed to the repo will be flagged by Scorecard so we know about them. - Microsoft.Web.WebView2 now under Dependabot visibility — Dependabot's
nugetecosystem already trackslauncher/tiny11options.Launcher.csproj, so SDK CVEs + version bumps now arrive as auto-PRs. Vendored DLLs were invisible to Dependabot, which was the practical security gap that motivated this change (CVE-fix freshness, not active exploitability — the wrappers are thin shims over the user-installed Edge WebView2 Runtime).
v1.0.24
DEPRECATED: this release is defective. Use v1.0.27 instead.
No release from v1.0.7 through v1.0.26 produces an installable Standard-mode ISO. This version crashes the Standard-mode build at 18% -- the autounattend binding references catalog item
tweak-compact-install, which was never added tocatalog.json; v1.0.8 turned that missing id from a silent default into a hard error.v1.0.27 reverts the image-shaping build pipeline to the proven v1.0.6 code -- verified end-to-end (clean build, clean install, Compact OS on, first-boot cleanup working) -- while keeping the post-v1.0.6 UI, logging, and failed-build cleanup. Existing installs auto-update via Velopack. Core-mode builds were unaffected.
Shippable result of the v1.0.23 security baseline work after two release-pipeline blockers. v1.0.23 cut the tag but the release workflow failed at action-resolution time: azure/trusted-signing-action@v0.5.1's action.yml calls actions/cache@v4 (unpinned) on lines 218 + 228, and the v1.0.23 baseline's new sha_pinning_required: true enforcement rejects transitive unpinned refs even for gate-skipped steps. The v1.0.23.1 hot-fix tag swapped the action to azure/artifact-signing-action@v2.0.0 (with SHA-pinned internals) but Velopack rejected the 4-part 1.0.23.1 version string ("must be a 3-part SemVer2 compliant version string"). v1.0.24 is the same hot-fixed code re-cut under a 3-part SemVer-compliant tag. The v1.0.23 + v1.0.23.1 tags remain on origin as zombies (no associated GitHub Release for either); the tag ruleset's deletion: true rule prevents their cleanup without a bypass.
Changed
azure/trusted-signing-action@v0.5.1→azure/artifact-signing-action@v2.0.0inrelease.yml(both occurrences). SHAc7ab2a863ab5f9a846ddb8265964877ef296ee82. The Azure team renamed the repo + cut v2.0.0 with internally-SHA-pinnedactions/cache@<sha> # v5.0.4. The rename was originally deferred to v1.1.0 per the v1.0.22 breadcrumb (ci B3); the v1.0.23 baseline'ssha_pinning_requiredenforcement forced the rename forward. v1.1.0 scope now shrinks to: secret provisioning + step-level secret scope (ci B2).- Repo-level
patterns_allowedswappedazure/trusted-signing-action@*→azure/artifact-signing-action@*.ossf/scorecard-action@*unchanged. - csproj
<Version>1.0.23→1.0.24.app.manifestassemblyIdentity version="1.0.23.0"→"1.0.24.0".ui/index.htmlstyle.css?v=1.0.23→?v=1.0.24.
Notes
- v1.0.23 + v1.0.23.1 tags are zombies. Both tags exist on
originbut have no associated GitHub Release. The tag ruleset'sdeletion: truerule blocks deletion without a bypass; leaving them as audit-trail artifacts of the two release-pipeline blockers (transitive SHA-pinning + 4-part SemVer). Consumers should ignore both; v1.0.24 is the first shippable release after the security baseline pass. - Lessons captured:
sha_pinning_required: trueextends to transitiveuses:inside composite actions. Auditing for SHA pinning means looking at our workflow files PLUS theaction.ymlof every action we call, recursively. The CM canonical baseline hasn't hit this because CM hasn't cut a release withsha_pinning_required: trueenforcement active yet (v1.1.0-beta.3 shipped pre-hardening 2026-05-13; the 2026-05-18 hardening pass is still awaiting v1.1.0 VM smoke). When CM next tags, the sameazure/trusted-signing-action@v0.5.1block will surface — CM will need an analogous hot-fix.- Velopack's vpk pack rejects 4-part SemVer.
--packVersionrequires 3-partMAJOR.MINOR.PATCH(optionally with-prerelease/+buildper SemVer2). 4-part Microsoft-style assembly versions are NOT accepted. When hot-fixing a tag mid-release-pipeline, pick a 3-part SemVer label (patch bump or prerelease form), not a 4-part one.
release: v1.0.22 -- inert trigger release for v1.0.21 dot-bg-fix smoke
DEPRECATED: this release is defective. Use v1.0.27 instead.
No release from v1.0.7 through v1.0.26 produces an installable Standard-mode ISO. This version crashes the Standard-mode build at 18% -- the autounattend binding references catalog item
tweak-compact-install, which was never added tocatalog.json; v1.0.8 turned that missing id from a silent default into a hard error.v1.0.27 reverts the image-shaping build pipeline to the proven v1.0.6 code -- verified end-to-end (clean build, clean install, Compact OS on, first-boot cleanup working) -- while keeping the post-v1.0.6 UI, logging, and failed-build cleanup. Existing installs auto-update via Velopack. Core-mode builds were unaffected.
No-op smoke-trigger release for v1.0.21 dot-bg fix. Zero behavior change vs v1.0.21. Sole purpose: be the "newer release" that a v1.0.21-installed launcher detects via the v1.0.13-added window.focus re-check, so the v1.0.21 belt-and-suspenders fix (cache-bust ?v= query string + ::before pseudo-element for the visible dot) can be smoked end-to-end. Expected on v1.0.21 badge surface: resting blue pulsing dot (both themes); hover dark = solid white dot + white wave fading outward (both unified, ring AND inner circle now actually swap color); hover light = solid #3a3a3a dot + #3a3a3a wave fading outward; tooltip "Update available, click to install..." steady (no scale inheritance).
Changed
launcher/tiny11options.Launcher.csproj—<Version>1.0.21</Version>→<Version>1.0.22</Version>.launcher/app.manifest—assemblyIdentity version="1.0.21.0"→"1.0.22.0".ui/index.html—style.css?v=1.0.21→style.css?v=1.0.22. Per the v1.0.21 lesson, the cache-bust query string must be bumped in lockstep with the launcher<Version>on every release so WebView2's HTTP cache fetches the freshstyle.cssrather than serving a stale copy from%LOCALAPPDATA%\tiny11options\webview2-userdata\cached against the samehttps://app.local/style.cssURL from a prior version.
No CSS, JS, resource, or test changes. Pester 516/0 + xUnit 140/0 both expected to match v1.0.21 ship.
Note
- v1.1.0 = Microsoft Trusted Signing (still queued, unchanged).
fix(ui): cache-bust + ::before pseudo-element for dot bg (v1.0.21)
DEPRECATED: this release is defective. Use v1.0.27 instead.
No release from v1.0.7 through v1.0.26 produces an installable Standard-mode ISO. This version crashes the Standard-mode build at 18% -- the autounattend binding references catalog item
tweak-compact-install, which was never added tocatalog.json; v1.0.8 turned that missing id from a silent default into a hard error.v1.0.27 reverts the image-shaping build pipeline to the proven v1.0.6 code -- verified end-to-end (clean build, clean install, Compact OS on, first-boot cleanup working) -- while keeping the post-v1.0.6 UI, logging, and failed-build cleanup. Existing installs auto-update via Velopack. Core-mode builds were unaffected.
Belt-and-suspenders fix for the persistent dot-bg-on-hover bug. v1.0.19 declared background-color: var(--badge-hover-color) explicitly in the :hover rule, which should have resolved the v1.0.17 var-indirection issue. User installed v1.0.19, hovered, reported the same bug: "1.0.19 has the same issue: theme color for circle on hover." Two plausible root causes were not previously addressed; v1.0.21 defends against both simultaneously, with the explicit ask "please figure out the issue, and only push one release (1.0.21)."
Changed
ui/index.html— cache-buststyle.csshref via?v=1.0.21query string. WebView2's HTTP cache serves resources fromVirtualHostNameToFolderMappingby URL. The URLhttps://app.local/style.cssis identical across every app version, even though each version's launcher.exe mapsapp.localto a different on-diskui-cachefolder. The user's WebView2 userdata directory (shared across versions at%LOCALAPPDATA%\tiny11options\webview2-userdata\) caches HTTP responses by URL — so v1.0.19's CSS update would be invisible if the URL matches a previously-cached v1.0.17/v1.0.18 response. Adding?v=1.0.21forces a fresh fetch since the cache key includes the query string. This must be bumped in lockstep withlauncher/tiny11options.Launcher.csproj <Version>for every release going forward.ui/style.css—.update-badgevisible dot is now a::beforepseudo-element on the<button>, not the button itself. The<button>becomes a transparent click target (background: transparent, border: none, outline: none, appearance: none, etc); the::beforeowns the bg-color, border-radius, and the pulse animation. The:hover/:focus-visiblestate propagates from the button to its::beforevia.update-badge:hover::before/:focus-visible::before. Both the dot's bg AND the@keyframes box-shadowring color follow a single--badge-pulse-colorcustom property scoped to the::before— restingvar(--accent)(blue), hovervar(--badge-hover-color)(white in dark /#3a3a3ain light). The::aftertooltip is unaffected (always was on the button itself; its CSS is unchanged).--badge-pulse-colorcustom property is now defined on::beforerather than on the button. Scoped to where it's actually consumed (by the::before's ownbackground-colorAND by the@keyframes box-shadowcolor that the::before's animation drives).
Note
- Why two changes for one bug. Without dev-tools access on the live app, I can't tell whether the cause is the cache or a
<button>UA quirk. The CSS restructure to::beforeremoves any possibility of a button-specific UA interaction since pseudo-elements have no button-specific UA defaults. The cache-bust handles the orthogonal possibility that v1.0.19's CSS never actually loaded due to stale WebView2 cache. Either fix alone could have been the right one; doing both eliminates the diagnostic ambiguity in one shot per user direction ("please figure out the issue, and only push one release"). - No v1.0.22 inert trigger this round. User explicitly: "only post 1.0.21. When I'm back I'll ask you to post 1.0.22 so we can see if 1.0.21 has the right fix." v1.0.21-installed clients will see no update until v1.0.22 publishes — manual smoke deferred to that follow-up push.
- v1.1.0 = Microsoft Trusted Signing (still deferred, unchanged from prior breadcrumbs).
release: v1.0.20 -- inert trigger release for v1.0.19 dot-bg-fix smoke
DEPRECATED: this release is defective. Use v1.0.27 instead.
No release from v1.0.7 through v1.0.26 produces an installable Standard-mode ISO. This version crashes the Standard-mode build at 18% -- the autounattend binding references catalog item
tweak-compact-install, which was never added tocatalog.json; v1.0.8 turned that missing id from a silent default into a hard error.v1.0.27 reverts the image-shaping build pipeline to the proven v1.0.6 code -- verified end-to-end (clean build, clean install, Compact OS on, first-boot cleanup working) -- while keeping the post-v1.0.6 UI, logging, and failed-build cleanup. Existing installs auto-update via Velopack. Core-mode builds were unaffected.
No-op smoke-trigger release. Zero behavior change vs v1.0.19. Sole purpose: be the "newer release" that a v1.0.19-installed launcher detects via its (v1.0.13-added) window.focus re-check, so the v1.0.19 dot-bg fix can be smoked end-to-end. Expected on v1.0.19 badge surface: resting blue pulsing dot (both themes); hover dark = solid white dot at center + white wave fading outward; hover light = solid #3a3a3a dot at center + #3a3a3a wave fading outward; tooltip "Update available, click to install..." renders steady. The "nav bg shows through the dot" bug from v1.0.17/v1.0.18 is gone.
Changed
launcher/tiny11options.Launcher.csproj—<Version>1.0.19</Version>→<Version>1.0.20</Version>.launcher/app.manifest—assemblyIdentity version="1.0.19.0"→"1.0.20.0".
No code, resource, or test changes. Pester 516/0 + xUnit 140/0 both expected to match v1.0.19 ship.
Note
- v1.1.0 = Microsoft Trusted Signing (unchanged from v1.0.18 breadcrumb).
v1.0.19
DEPRECATED: this release is defective. Use v1.0.27 instead.
No release from v1.0.7 through v1.0.26 produces an installable Standard-mode ISO. This version crashes the Standard-mode build at 18% -- the autounattend binding references catalog item
tweak-compact-install, which was never added tocatalog.json; v1.0.8 turned that missing id from a silent default into a hard error.v1.0.27 reverts the image-shaping build pipeline to the proven v1.0.6 code -- verified end-to-end (clean build, clean install, Compact OS on, first-boot cleanup working) -- while keeping the post-v1.0.6 UI, logging, and failed-build cleanup. Existing installs auto-update via Velopack. Core-mode builds were unaffected.
Update-badge dot now actually shows the hover color (the wave already did since v1.0.17). User smoke of v1.0.17/v1.0.18: "the 'circle' inside the pulsing wave is still the theme color, not the hover color. all else is good to go. note that the pulse color is good to go." Screenshots showed the box-shadow ring fading correctly to the hover color but the inner dot rendering as if its background were transparent — the nav bg showed through.
Changed
ui/style.css.update-badgebackground is now declared withbackground-color(longhand) instead ofbackground(shorthand), and the value is the literalvar(--accent)at rest /var(--badge-hover-color)on:hover/:focus-visible— no--badge-pulse-colorindirection on the bg. v1.0.17 hadbackground: var(--badge-pulse-color)and relied on the var change in the:hoverrule to propagate to the static background. The@keyframes box-shadow ... var(--badge-pulse-color)indirection works fine (the ring color flips reliably on hover, confirmed in user smoke); the static-background-via-var indirection does not (the bg stayed at the rest-time computed value). Suspected WebView2 Chromium quirk withbackgroundshorthand combined with hover-triggered custom-property changes. Switching tobackground-colorlonghand AND making the hover override an explicit declaration both bypass the issue.--badge-pulse-colorretained on.update-badgepurely for the@keyframes badge-pulsering-color reference. The hover rule still overrides it (so the ring keeps changing color in lockstep with the dot); the dot bg just no longer depends on that indirection.
Note
- v1.0.20 = inert smoke-trigger release. Same pattern as v1.0.14/v1.0.16/v1.0.18 — pure version bump so v1.0.19 clients detect a newer release via the v1.0.13 focus re-check + can manually smoke the corrected dot-bg behavior.
- v1.1.0 = Microsoft Trusted Signing (unchanged from previous breadcrumbs).
- Lesson worth noting.
background: var(--x)andbackground-color: var(--x)are NOT equivalent under hover-triggered custom-property changes in WebView2's Chromium. The shorthand appears to compute once at element style time and not re-resolve when the var changes via a more-specific rule. Longhandbackground-colorupdates correctly. Defensive default for future similar work: prefer longhand for dynamic-var-driven properties.