diff --git a/.github/release-notes/v0.1.1-beta.16.5.1.md b/.github/release-notes/v0.1.1-beta.16.5.1.md new file mode 100644 index 00000000..516beafb --- /dev/null +++ b/.github/release-notes/v0.1.1-beta.16.5.1.md @@ -0,0 +1,45 @@ +# Shibumi v0.1.1-beta.16.5.1 + +Hotfix for Omarchy's renamed Appearance menu and for Reactor quotes on Qt 6.12. + +## Fixed: Omarchy Appearance menu keys + +Omarchy commit `6bee248a3` (2026-10-20) renamed `style.theme` and `style.background` to `appearance.theme` and `appearance.background`. Beta 16.5 rejected that intact stock menu during install, update, repair or migrate (`Omarchy stock menu has no action for style.theme`) and rolled back to the previous installation. This hotfix accepts either key family, overrides the matching host items and keeps the host's native fallback actions. If neither family exists, picker routing is omitted with a warning instead of aborting the transaction. + +The regression affects Omarchy master/Edge from that commit onward and any later release that contains it. Omarchy 4.0.4–4.0.6 and 4.5.0-rc1 predate the rename and are not affected. Picker-provider behavior is unchanged. + +## Fixed: Reactor quote text on Qt 6.12 + +On Omarchy 4.0.6's Qt 6.12 stack, arrays delivered through QML signals arrive as sequences rather than JavaScript Arrays. Reactor discarded the quote choices, so quote events showed no text. This hotfix accepts those sequences without changing the renderer's timing or geometry. The settled Bar layout context is normalized once at its signal boundary so provider groups and native sections reach the existing strict validators intact, and Audio stream-label resolution accepts Quickshell's player sequences without dropping entries. + +## Install and update + +For a new source installation, use the published release tag: + +```bash +sudo pacman -S --needed python jq curl networkmanager power-profiles-daemon upower xdg-utils libnotify wl-clipboard ttf-material-symbols-variable ttf-jetbrains-mono-nerd-basic noto-fonts-cjk adwaita-fonts +git clone https://github.com/HANCORE-linux/Shibumi-Shell.git +cd Shibumi-Shell +git checkout v0.1.1-beta.16.5.1 +./scripts/shibumi-suite install --yes +``` + +Update an admitted Beta 16.4 or Beta 16.5 installation from its existing checkout: + +```bash +git fetch --tags +git checkout v0.1.1-beta.16.5.1 +./scripts/shibumi-suite update --dry-run +./scripts/shibumi-suite update --yes +./scripts/shibumi-suite status +``` + +The exact Beta 16.5 tag (`8b34d03`) and its main integration merge (`1d7a00b`) are admitted predecessors; older supported identities retain their exact revision and payload checks. Do not install or update from `main`, or delete lifecycle state to bypass admission. See the [installation and recovery guide](https://github.com/HANCORE-linux/Shibumi-Shell/blob/v0.1.1-beta.16.5.1/docs/install.md). AUR publication remains deferred. + +## Validation + +Validated on Omarchy 4.0.6 / Quickshell 0.3.2 / Qt 6.12 and against the forward compatibility reference `246f33a2`. The renamed menu was verified against the stock menu file of Omarchy `6bee248a3` in the suite's tests and an offline replay; no live host with that revision was available for this release. + +## Known points + +Unchanged from Beta 16.5. diff --git a/.github/workflows/package-release.yml b/.github/workflows/package-release.yml index 80af8f3e..483ed641 100644 --- a/.github/workflows/package-release.yml +++ b/.github/workflows/package-release.yml @@ -108,6 +108,7 @@ jobs: - name: Run the revision-bound lifecycle and host gate env: SHIBUMI_INSTALLED_SOURCE_OMARCHY_PATH: ${{ vars.SHIBUMI_INSTALLED_SOURCE_OMARCHY_PATH }} + SHIBUMI_NATIVE_CATALOG_OMARCHY_PATH: ${{ vars.SHIBUMI_NATIVE_CATALOG_OMARCHY_PATH }} SHIBUMI_AGENTS_OMARCHY_PATH: ${{ vars.SHIBUMI_AGENTS_OMARCHY_PATH }} SHIBUMI_FORWARD_COMPAT_OMARCHY_PATH: ${{ vars.SHIBUMI_FORWARD_COMPAT_OMARCHY_PATH }} run: | diff --git a/AGENTS.md b/AGENTS.md index 0cb3f639..4cc379f6 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -47,7 +47,7 @@ For host-facing changes, run all four pinned compatibility gates: ```bash ./tests/omarchy-installed-package-contract-regression.sh -SHIBUMI_INSTALLED_SOURCE_OMARCHY_PATH=/tmp/omarchy-installed-source-v4.0.4 \ +SHIBUMI_INSTALLED_SOURCE_OMARCHY_PATH=/tmp/omarchy-installed-source-v4.0.6 \ ./tests/omarchy-installed-source-parity-contract-regression.sh SHIBUMI_AGENTS_OMARCHY_PATH=/tmp/omarchy-v4.0.0 \ ./tests/omarchy-agents-contract-regression.sh @@ -57,6 +57,8 @@ SHIBUMI_FORWARD_COMPAT_OMARCHY_PATH=/tmp/omarchy-forward-compat-246f33a2 \ The forward reference is exactly `246f33a2fef66411c990860d88e0823ae83987fc`; its admission does not transfer fixture evidence to a live or differently packaged host. +Native catalog resource validation separately retains v4.0.4 (`c668141e`), supplied +through `SHIBUMI_NATIVE_CATALOG_OMARCHY_PATH`; do not substitute the stable 4.0.6 checkout. Live acceptance must record what was actually exercised and must not claim unavailable hardware, credentials, multi-monitor, nested-compositor, or clean-chroot evidence as passed. Physical hardware gates require raw setup details, relevant command output, screenshots or video, and sanitized logs; fixtures cannot replace them. diff --git a/CHANGELOG.md b/CHANGELOG.md index 55030193..c6ad4c3e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,24 @@ # Changelog +## [0.1.1-beta.16.5.1] - 2026-10-23 + +### Fixed + +- Accept Omarchy's renamed `appearance.theme` and `appearance.background` menu + keys while retaining `style.*` support and the host's native fallback actions. + Install, update, repair and migrate no longer reject an intact newer stock + menu. If neither key family exists, remove stale picker routing and warn + rather than aborting the transaction. +- Restore Reactor quote text on Qt 6.12. Arrays delivered through QML signals + arrive as sequences rather than JavaScript Arrays; retain those quote choices + instead of discarding them before rendering. Normalize settled Bar layout + context at its signal boundary, preserving strict downstream validators, and + accept Quickshell's player sequences when resolving Audio stream labels. + +### Validation + +- The validation host is re-pinned to Omarchy 4.0.6 / Quickshell 0.3.2 (Qt 6.12) with the native catalog reference kept at Omarchy 4.0.4; the collector warm-PSS ceiling is 768 KiB on that stack, and QML fixtures force stderr logging under Qt 6.12. The forward compatibility reference stays `246f33a2`. + ## [0.1.1-beta.16.5] - 2026-10-22 ### Highlights diff --git a/README.md b/README.md index 0aef7642..a5778c4b 100644 --- a/README.md +++ b/README.md @@ -16,11 +16,11 @@ process.

[Documentation](docs/README.md) · [Release status](docs/release-readiness.md) -`0.1.1-beta.16.5` is the target GitHub prerelease. See the -[release notes](.github/release-notes/v0.1.1-beta.16.5.md) for changes. Before using an older version, read the +`0.1.1-beta.16.5.1` is the target GitHub prerelease. See the +[release notes](.github/release-notes/v0.1.1-beta.16.5.1.md) for changes. Before using an older version, read the [backup and downgrade warning](docs/install.md#backup-before-downgrade). -The current pinned host contracts use Omarchy and Omarchy Settings `4.0.4-1` -(source tag `v4.0.4`, revision `c668141e`) with Quickshell `0.3.1-1`; the +The current pinned host contracts use Omarchy and Omarchy Settings `4.0.6-1` +(source tag `v4.0.6`, revision `237f1b40`) with Quickshell `0.3.2.r7.g2b4501a-1`; the 4.0.3 and 4.0.2 manifests remain optional compatibility baselines. Multi-output acceptance was not run. See the [Shibumi host compatibility record](docs/architecture/quattro-compatibility.md) @@ -68,7 +68,7 @@ for the latest validated host versions. sudo pacman -S --needed python jq curl networkmanager power-profiles-daemon upower xdg-utils libnotify wl-clipboard ttf-material-symbols-variable ttf-jetbrains-mono-nerd-basic noto-fonts-cjk adwaita-fonts git clone https://github.com/HANCORE-linux/Shibumi-Shell.git cd Shibumi-Shell -git checkout v0.1.1-beta.16.5 +git checkout v0.1.1-beta.16.5.1 ./scripts/shibumi-suite install --yes ``` @@ -76,15 +76,15 @@ Run the Pacman line yourself; it installs the runtime commands and fonts and is the only step that needs `sudo`. The Shibumi suite never calls Pacman: it runs as the desktop user and writes only user-scoped plugin state. -Update an admitted Beta.16.4 source installation to Beta.16.5. -The exact Beta.16.4 tag (`64b9369`) and its main integration merge (`aec6c0a`) -are admitted predecessors. Exact identities, not a version range, govern +Update an admitted Beta.16.4 or Beta.16.5 source installation to Beta.16.5.1. +The exact Beta.16.4 tag (`64b9369`) and merge (`aec6c0a`), and Beta.16.5 +tag (`8b34d030`) and merge (`1d7a00b2`), are admitted predecessors. Exact identities, not a version range, govern admission; see the [update guide](docs/install.md#update). ```sh cd Shibumi-Shell git fetch --tags -git checkout v0.1.1-beta.16.5 +git checkout v0.1.1-beta.16.5.1 ./scripts/shibumi-suite update --dry-run ./scripts/shibumi-suite update --yes ./scripts/shibumi-suite status diff --git a/VERSION b/VERSION index e78874ca..f8d81e74 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.1.1-beta.16.5 +0.1.1-beta.16.5.1 diff --git a/contracts/baselines/omarchy-forward-compat-246f33a2.json b/contracts/baselines/omarchy-forward-compat-246f33a2.json index e281392e..dc855c79 100644 --- a/contracts/baselines/omarchy-forward-compat-246f33a2.json +++ b/contracts/baselines/omarchy-forward-compat-246f33a2.json @@ -10,7 +10,7 @@ }, "quickshellPackage": { "name": "quickshell", - "version": "0.3.1-1" + "version": "0.3.2.r7.g2b4501a-1" }, "subtrees": [ { diff --git a/contracts/baselines/omarchy-installed-package-v4.0.6.json b/contracts/baselines/omarchy-installed-package-v4.0.6.json new file mode 100644 index 00000000..aae96df9 --- /dev/null +++ b/contracts/baselines/omarchy-installed-package-v4.0.6.json @@ -0,0 +1,56 @@ +{ + "schemaVersion": 2, + "id": "installed-package-v4.0.6", + "profile": "installed-package", + "repository": "https://github.com/basecamp/omarchy", + "sourceRevision": "237f1b4071a0bff2296c6d740ba2b9fd695ebfa0", + "provenance": { + "kind": "package", + "packages": [ + { + "name": "omarchy", + "version": "4.0.6-1" + }, + { + "name": "omarchy-settings", + "version": "4.0.6-1" + } + ], + "subtreeOwners": { + "bin": "omarchy", + "config": "omarchy-settings", + "shell": "omarchy" + } + }, + "quickshellPackage": { + "name": "quickshell", + "version": "0.3.2.r7.g2b4501a-1" + }, + "notes": "Shell/config match the official v4.0.6 source exactly. Package bin has 446 entries versus 449 in source: omarchy-debug, omarchy-debug-idle and omarchy-upload-log are source-only. The cached official 4.0.6-1 package confirms these omissions; all shared executable bytes match. No identical bin-roster claim.", + "subtrees": [ + { + "path": "shell", + "entryPolicy": "regular-files", + "entryCount": 222, + "inventorySha256": "be094886de039e6569034aebe40777521b799df2f4d4cf006e90655cadf0fb63", + "structureSha256": "beb84ff10f06fe0ae77660bf28f235fffeed89094de9e07b76cabd80b0e6dc66", + "contentSha256": "cd2f30c76300622ead687148eda7ce5bc8bfbc7816f2e2bbc75f234222ac9176" + }, + { + "path": "bin", + "entryPolicy": "absolute-symlinks", + "entryCount": 446, + "inventorySha256": "0c907e83e9e849c6ef14433350d913a774d217c14c2d7d9b3a50913e3997b816", + "structureSha256": "2f204b9c8efa86afe90fff6a1de74d3652731c219a6d644e8db78a6553579683", + "contentSha256": "3575f16366ec21da3292f11df6ca801e0cc67e582256e9cb02cd07def8fae255" + }, + { + "path": "config", + "entryPolicy": "regular-files", + "entryCount": 75, + "inventorySha256": "33995e20ae22ffef7a5710c859a5f5577429aae2ecc0976d1b7978838d4277fa", + "structureSha256": "0d2f5855e27b9bada33e17730c99a99fa6d5e4bd971cef722c0ec7d50c4e467f", + "contentSha256": "adb203e2024c62c397b77fd9b30627f41675f0fd6e1525ba3634061088cf036a" + } + ] +} diff --git a/contracts/baselines/omarchy-installed-source-parity-v4.0.6.json b/contracts/baselines/omarchy-installed-source-parity-v4.0.6.json new file mode 100644 index 00000000..ce0f9569 --- /dev/null +++ b/contracts/baselines/omarchy-installed-source-parity-v4.0.6.json @@ -0,0 +1,42 @@ +{ + "schemaVersion": 2, + "id": "installed-source-parity-v4.0.6", + "profile": "installed-source-parity", + "repository": "https://github.com/basecamp/omarchy", + "sourceRevision": "237f1b4071a0bff2296c6d740ba2b9fd695ebfa0", + "provenance": { + "kind": "git", + "revision": "237f1b4071a0bff2296c6d740ba2b9fd695ebfa0" + }, + "quickshellPackage": { + "name": "quickshell", + "version": "0.3.2.r7.g2b4501a-1" + }, + "notes": "Shell/config match the installed 4.0.6-1 packages exactly. Source bin has 449 entries versus 446 packaged: omarchy-debug, omarchy-debug-idle and omarchy-upload-log are source-only. All shared executable bytes match; bin inventories remain independently pinned.", + "subtrees": [ + { + "path": "shell", + "entryPolicy": "regular-files", + "entryCount": 222, + "inventorySha256": "be094886de039e6569034aebe40777521b799df2f4d4cf006e90655cadf0fb63", + "structureSha256": "beb84ff10f06fe0ae77660bf28f235fffeed89094de9e07b76cabd80b0e6dc66", + "contentSha256": "cd2f30c76300622ead687148eda7ce5bc8bfbc7816f2e2bbc75f234222ac9176" + }, + { + "path": "bin", + "entryPolicy": "regular-files", + "entryCount": 449, + "inventorySha256": "2ebcf2fe4f323438858510c6cbfed017aa1646d3728d2a2686f8257b55b4d730", + "structureSha256": "107b94159d2f7ceabbf72f57be22522ebf5a080145d9b1cc59bc463299bfa8b0", + "contentSha256": "093e8400903a92709137a145d8fe865ea43ef648ae17b714a0d441cf7007180e" + }, + { + "path": "config", + "entryPolicy": "regular-files", + "entryCount": 75, + "inventorySha256": "33995e20ae22ffef7a5710c859a5f5577429aae2ecc0976d1b7978838d4277fa", + "structureSha256": "0d2f5855e27b9bada33e17730c99a99fa6d5e4bd971cef722c0ec7d50c4e467f", + "contentSha256": "adb203e2024c62c397b77fd9b30627f41675f0fd6e1525ba3634061088cf036a" + } + ] +} diff --git a/contracts/lifecycle-predecessors-v1.json b/contracts/lifecycle-predecessors-v1.json index 961125ab..b82dc4ed 100644 --- a/contracts/lifecycle-predecessors-v1.json +++ b/contracts/lifecycle-predecessors-v1.json @@ -1066,9 +1066,72 @@ ], "settingsStorageVersion": 1, "sourceRevisions": [ + "8b34d030a303aa35d6033923c8f3c38c4c25b29b", + "1d7a00b2742fb4d479774a4f722c6c2ef96d0601", "package:0.1.1-beta.16.5" ], "suiteVersion": "0.1.1-beta.16.5" + }, + { + "id": "public-beta.16.5.1", + "payloadDigest": "a4a0b43a04603a9b40354df1498e74b4b42e55158c1d3f9d68c9460db30802cf", + "pluginDigests": { + "hancore.shibumi.bar": "1d1a47515cafa53176338645f8525f8e6e5021f124948eff6794b708d02aacc9", + "hancore.shibumi.state": "22328fdf2ecd627db310a76ced163ca05a49d4cfafb724c3f4881b4e4dc2b178", + "hancore.shibumi.control-center": "82cb345955cb2f0c0eb1b214bf013f730d51c09725cc46617e26d4af49d0917d", + "hancore.shibumi.reactor": "d6b8f38de80b09abeac9789ded26650f0213208923b62597acbfa58c449ea9cb", + "hancore.shibumi.telemetry": "75fc48d3ffbc3a14f4df3cd296ab93623fff10244e83d0af0cace9f096cabde5", + "hancore.shibumi.power-state": "0e4727de0b2611faa7f289d79e7090e3db0460138d5ede2409ae1b5a6a7c9fe3", + "hancore.shibumi.workspaces": "59cc5627a465f22562e3a7afa0d30f7c8567ecd83fb7c6329b809541561c7280", + "hancore.shibumi.update-center": "ad8fb3564ff3953bdb8cd86359483baa7aeb355dcfd133a2c6f12a962c0da387", + "hancore.shibumi.status": "da0f8012856223ecab3dc6ea7e6967701fe9630b5d9ecff6e3f2e954becead3d", + "hancore.shibumi.memory": "7de6243824ec33bbe793c0e2be74dc849494b258b8a56eff18c319115a734196", + "hancore.shibumi.cpu": "3f255ec4c90967ac42e9376d5bd5f99f3b9c55e60f82f4343860df78b6ff5eac", + "hancore.shibumi.audio": "7cb7693721fc4fb75e405d565a1579d8a32c5dc1fea6177dbba6c518127ac79e", + "hancore.shibumi.ai": "2482b5468ac8dcf8a5afaf0d4f50ca15be63698d53dd62b75e7def10a39dcf17", + "hancore.shibumi.center": "84d211c187643f2eaa9e2ea1bd6b12ad0290a7fd768de422d190361f065f9dd1", + "hancore.shibumi.media": "c30e513978e1cb5be1bfdc7592d851980094144dd42bb67035b3a5e840b55c49", + "hancore.shibumi.quick-access": "d36db702d2ab65ac035ad2c0ec555e8ef713eee7aed7a9dd01f5b5e88b554aa3", + "hancore.shibumi.network": "5f5cbf5963e7110eb09b10ed9e519627a2082c7a94cd928b2e4289928db67337", + "hancore.shibumi.battery": "2ac5f7e49ff237fab5301312b041547eef1cd076608985b5df4448cd44445d4a", + "hancore.shibumi.brightness": "4614cf5aa35917063b98a28d5a03d5b9d84c72190084c10b651f8ff393d9ca6d", + "hancore.shibumi.power-profile": "f0687c709da571d20eeb861ca36497bdf54c864ca0f2114dc5844bff804a56bf", + "hancore.shibumi.bluetooth": "554b5cc954e26acd07f1b7950bd9d2bb9564a061f69685f111a6a1fc998e3e26", + "hancore.shibumi.temperature": "208d750c66099d3da6f1f6fae04fa83762b4b6a4d9603ad15383c4b53f0a8632", + "hancore.shibumi.gpu": "b3cbde40eb3492d16943ba967b9f806c060066d2664f733d4a09d7a02ce6d8bd", + "hancore.shibumi.storage": "52167d83e786165b0b32594a02c1d001866dbaf05a7c3bb18be10288a5f2ebe7" + }, + "pluginIds": [ + "hancore.shibumi.bar", + "hancore.shibumi.state", + "hancore.shibumi.control-center", + "hancore.shibumi.reactor", + "hancore.shibumi.telemetry", + "hancore.shibumi.power-state", + "hancore.shibumi.workspaces", + "hancore.shibumi.update-center", + "hancore.shibumi.status", + "hancore.shibumi.memory", + "hancore.shibumi.cpu", + "hancore.shibumi.audio", + "hancore.shibumi.ai", + "hancore.shibumi.center", + "hancore.shibumi.media", + "hancore.shibumi.quick-access", + "hancore.shibumi.network", + "hancore.shibumi.battery", + "hancore.shibumi.brightness", + "hancore.shibumi.power-profile", + "hancore.shibumi.bluetooth", + "hancore.shibumi.temperature", + "hancore.shibumi.gpu", + "hancore.shibumi.storage" + ], + "settingsStorageVersion": 1, + "sourceRevisions": [ + "package:0.1.1-beta.16.5.1" + ], + "suiteVersion": "0.1.1-beta.16.5.1" } ] } diff --git a/contracts/plugin-suite-v1.json b/contracts/plugin-suite-v1.json index 3c7e00f9..2937a718 100644 --- a/contracts/plugin-suite-v1.json +++ b/contracts/plugin-suite-v1.json @@ -1,7 +1,7 @@ { "schemaVersion": 1, "suiteId": "hancore.shibumi", - "suiteVersion": "0.1.1-beta.16.5", + "suiteVersion": "0.1.1-beta.16.5.1", "settingsStorageVersion": 1, "hostContract": "contracts/host-facade-v1.json", "retiredPlugins": [ diff --git a/docs/architecture/quattro-compatibility.md b/docs/architecture/quattro-compatibility.md index 433709e5..8945c5a4 100644 --- a/docs/architecture/quattro-compatibility.md +++ b/docs/architecture/quattro-compatibility.md @@ -8,51 +8,51 @@ by this evidence. ## Current pinned host -Beta.16.3 retains Beta.16's exact official Omarchy 4.0.4 baseline. These pins are not +Beta.16.5.1 pins the exact official Omarchy 4.0.6 validation baseline. These pins are not physical release acceptance. The historical Beta.13 physical host acceptance below applies to its recorded single-output Omarchy 4.0.3 setup: | Component | Observed value | | --- | --- | -| Pinned Omarchy package reference | `omarchy 4.0.4-1`, `omarchy-settings 4.0.4-1` | -| Pinned official Omarchy source tag | `v4.0.4` (`c668141e9c42b13c80c9ca4ea108e11708c5e8a5`) | -| Pinned source-parity revision | `c668141e9c42b13c80c9ca4ea108e11708c5e8a5` | +| Pinned Omarchy package reference | `omarchy 4.0.6-1`, `omarchy-settings 4.0.6-1` | +| Pinned official Omarchy source tag | `v4.0.6` (`237f1b4071a0bff2296c6d740ba2b9fd695ebfa0`) | +| Pinned source-parity revision | `237f1b4071a0bff2296c6d740ba2b9fd695ebfa0` | +| Native catalog source-only reference | `v4.0.4` (`c668141e9c42b13c80c9ca4ea108e11708c5e8a5`, 183 shell files) | | Immutable Agents reference | `v4.0.0` (`f0020448ca87329199de7cb12f2015ebc4a3e5e7`) | | Immutable forward-compatibility revision | `246f33a2fef66411c990860d88e0823ae83987fc` | -| Quickshell package | `quickshell 0.3.1-1` | +| Quickshell package | `quickshell 0.3.2.r7.g2b4501a-1` | | Recorded Beta.13 physical validation date (4.0.3) | 2026-09-13 | The installed package is the primary host-build identity. The new complete -source-parity checkout is pinned to the official `v4.0.4` tag. The 4.0.3 and -4.0.2 package and source manifests remain immutable optional compatibility -references. The older Agents-only gate remains explicitly pinned to `v4.0.0`; +source-parity checkout is pinned to the official `v4.0.6` tag. The 4.0.4, 4.0.3 and +4.0.2 package/source manifests and 4.0.5 source manifest remain immutable history. The older Agents-only gate remains explicitly pinned to `v4.0.0`; the separate `246f33a2` snapshot supersedes `4c1b4cb3` as the bounded forward reference; all earlier manifests remain unchanged. -Manifest, panel geometry and focused Quattro/style checks pass; this is not a -complete candidate forward-gate pass and does not follow a moving branch. +Historical focused forward checks do not establish a new-stack candidate pass; +complete candidate gates must be recorded separately. No pin follows a moving branch. The package-managed baseline records these authoritative production anchors: | Contract-sensitive file | SHA-256 | | --- | --- | | `shell/services/PluginRegistry.qml` | `8466127c53037b80b582544610b0bdf78a86764e4f037a3b9ce360d107359803` | -| `shell/shell.qml` | `4a4b7694e5b9e0bd952ce0efa2d6dc2cea44cdfa98cc2f442e40fe41cbc1beab` | -| `shell/Ui/KeyboardPanel.qml` | `96245f2da8d38baa0017caa285d596c485bd19a3a4d2cd1675bee9d84ffba42d` | -| `shell/plugins/bar/Bar.qml` | `9874c0f36271840b43002890ae333c83097df7f4cff0bade81536a41ed83590b` | +| `shell/shell.qml` | `1c390bb1703a8372a7d3a614bc44513b6cc91eee21f4bd507198e8601310e617` | +| `shell/Ui/KeyboardPanel.qml` | `c8b3b0fd52d8a79469675e925ff851e1dd0588eb1eeb90bd4df004a4c7d72a0a` | +| `shell/plugins/bar/Bar.qml` | `a8f27b3d8f29f8b8c14a5e578ad0617e6035375ccab0178a28c435e80a2822f0` | | `shell/plugins/bar/BarModel.js` | `908f30edce60dcba46d2039ba3d501fd0faa35fa1f90b7dbda69439288f8a8d0` | The table is a human-readable set of important anchors, not the complete machine identity. Three separate manifests bind every file or symlink below the consumed `shell`, `bin`, and `config` subtrees without conflating their claims: -- [`omarchy-installed-package-v4.0.4.json`](../../contracts/baselines/omarchy-installed-package-v4.0.4.json) - records the package-managed `omarchy 4.0.4-1` and - `omarchy-settings 4.0.4-1` layout; -- [`omarchy-installed-source-parity-v4.0.4.json`](../../contracts/baselines/omarchy-installed-source-parity-v4.0.4.json) - records the full Git checkout of the official `v4.0.4` source tag; +- [`omarchy-installed-package-v4.0.6.json`](../../contracts/baselines/omarchy-installed-package-v4.0.6.json) + records the package-managed `omarchy 4.0.6-1` and + `omarchy-settings 4.0.6-1` layout; +- [`omarchy-installed-source-parity-v4.0.6.json`](../../contracts/baselines/omarchy-installed-source-parity-v4.0.6.json) + records the full Git checkout of the official `v4.0.6` source tag; - the immutable 4.0.3 package/source manifests retain the previous physical - acceptance baseline without claiming that acceptance for 4.0.4; + acceptance baseline without claiming that acceptance for 4.0.6; - [`omarchy-forward-compat-246f33a2.json`](../../contracts/baselines/omarchy-forward-compat-246f33a2.json) records the immutable forward-compatibility snapshot at the recorded upstream revision. It does not follow the moving remote branch. @@ -122,12 +122,13 @@ shared panel click-forwarding implementation remains unchanged. ### Quickshell provenance and evidence limits -The forward manifest records the independently verified Arch `quickshell 0.3.1-1` -validation package (package ownership and all 123 installed files checked). -The upstream install list names unversioned `quickshell`; migration `1787399318` -records the return to 0.3.1's synchronous termination. A reported edge host uses -Omarchy-repository `0.3.2-6`; no result here establishes that package's live -acceptance. Source contracts and isolated component fixtures do not establish +The active package/parity/forward manifests record Omarchy-repository +`quickshell 0.3.2.r7.g2b4501a-1`, binary revision +`2b4501a282689792b62e94f3fb30d8f512324fe6`. Historical Arch `0.3.1-1` +validation is not relabeled. The upstream install list names unversioned +`quickshell`; migration `1787399318` is historical context, not current package +provenance. A reported edge host uses `0.3.2-6`; no result here establishes +that package's live acceptance. Source contracts and isolated component fixtures do not establish real stock-bar switching, physical output behavior or desktop acceptance on it. ## What Shibumi validates @@ -154,7 +155,7 @@ Run the repository contract suite separately against all four host proof gates: ```bash ./tests/omarchy-installed-package-contract-regression.sh -SHIBUMI_INSTALLED_SOURCE_OMARCHY_PATH=/path/to/omarchy-v4.0.4 \ +SHIBUMI_INSTALLED_SOURCE_OMARCHY_PATH=/path/to/omarchy-v4.0.6 \ ./tests/omarchy-installed-source-parity-contract-regression.sh SHIBUMI_AGENTS_OMARCHY_PATH=/path/to/omarchy-v4.0.0 \ ./tests/omarchy-agents-contract-regression.sh @@ -162,7 +163,7 @@ SHIBUMI_FORWARD_COMPAT_OMARCHY_PATH=/path/to/omarchy-forward-compat-246f33a2 \ ./tests/omarchy-forward-compat-contract-regression.sh ``` -The 4.0.4 manifest records exact observed bytes and package provenance; it +The 4.0.6 manifests record exact observed bytes and package provenance; it does not by itself establish live acceptance. If any recorded host file changes, Shibumi remains on the previous accepted baseline until the affected contracts and live workflows pass again. diff --git a/docs/configuration.md b/docs/configuration.md index 21cc22d3..94b21dac 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -184,7 +184,7 @@ authoritative menu actions: - **Hearthstone** opens the Shibumi Hearthstone picker. During installation, Shibumi adds reversible overrides for Quattro's -authoritative `style.theme` and `style.background` actions to the official +authoritative `style.theme` / `style.background` (or `appearance.theme` / `appearance.background`) actions to the official user extension at `~/.config/omarchy/extensions/omarchy-menu.jsonc`. Existing user and plugin entries remain in place, updates are idempotent, and uninstall removes only the Shibumi-managed block. Shibumi does not patch Quattro, diff --git a/docs/development/packaging.md b/docs/development/packaging.md index f0a949a8..35c1b793 100644 --- a/docs/development/packaging.md +++ b/docs/development/packaging.md @@ -1,6 +1,6 @@ # Source installation and planned OPR packaging -Status: install `0.1.1-beta.16.5` from source. OPR (omarchy-pkgs) packaging +Status: install `0.1.1-beta.16.5.1` from source. OPR (omarchy-pkgs) packaging is planned; AUR publication is no longer the target. Shibumi ships one versioned suite containing 24 separately validated Omarchy diff --git a/docs/development/release.md b/docs/development/release.md index aa60f36e..5894b1cd 100644 --- a/docs/development/release.md +++ b/docs/development/release.md @@ -114,15 +114,15 @@ Run the complete contract against all four pinned Quattro proof axes. Every external baseline variable must name a clean, canonical, absolute Git checkout root at the revision pinned by its baseline manifest. In particular, `SHIBUMI_INSTALLED_SOURCE_OMARCHY_PATH` must be a clean absolute checkout at -`c668141e9c42b13c80c9ca4ea108e11708c5e8a5`; tracked, staged, untracked, or +`237f1b4071a0bff2296c6d740ba2b9fd695ebfa0`; tracked, staged, untracked, or submodule dirt fails the gate. ```bash cd /path/to/shibumi ./tests/omarchy-installed-package-contract-regression.sh -SHIBUMI_INSTALLED_SOURCE_OMARCHY_PATH=/path/to/omarchy-v4.0.4 \ +SHIBUMI_INSTALLED_SOURCE_OMARCHY_PATH=/path/to/omarchy-v4.0.6 \ ./tests/omarchy-installed-source-parity-contract-regression.sh -SHIBUMI_INSTALLED_SOURCE_OMARCHY_PATH=/path/to/omarchy-v4.0.4 \ +SHIBUMI_NATIVE_CATALOG_OMARCHY_PATH=/path/to/omarchy-v4.0.4 \ python3 tests/native-catalog-resource-regression.py SHIBUMI_AGENTS_OMARCHY_PATH=/path/to/omarchy-v4.0.0 \ ./tests/omarchy-agents-contract-regression.sh @@ -133,10 +133,11 @@ SHIBUMI_FORWARD_COMPAT_OMARCHY_PATH=/path/to/omarchy-forward-compat-246f33a2 \ The forward checkout must be exactly `246f33a2fef66411c990860d88e0823ae83987fc`. Private forward-alignment patches do not authorize runner reprovisioning, Actions-variable changes, installation, or publication. Record Quickshell -package provenance and keep `0.3.1-1` fixture results separate from edge -`0.3.2-6` live acceptance. +package provenance: active package/parity/forward gates require Omarchy-repository +`0.3.2.r7.g2b4501a-1`. Historical `0.3.1-1` fixtures and edge `0.3.2-6` +live acceptance are separate evidence. -The release-evidence runner preflights all three external checkouts before any long host gate. Every path component must be canonical and must not be a symbolic link. The runner passes the accepted canonical paths to every gate. It verifies each checkout root, pinned HEAD commit, Git tree, cleanliness, complete tracked/untracked working-tree digest, file count, file type, and mode. Malformed, relative, missing, dirty, or wrong-revision inputs fail closed. The NativeCatalog resource regression is a required gate and resolves its unchanged pinned 4.0.4 shell assertion from `SHIBUMI_INSTALLED_SOURCE_OMARCHY_PATH/shell`; its existing warmup and resource ceilings are not release-runner overrides. +The release-evidence runner preflights all four external checkouts before any long host gate. Every path component must be canonical and must not be a symbolic link. The runner passes the accepted canonical paths to every gate. It verifies each checkout root, pinned HEAD commit, Git tree, cleanliness, complete tracked/untracked working-tree digest, file count, file type, and mode. Malformed, relative, missing, dirty, or wrong-revision inputs fail closed. The NativeCatalog resource regression is a required gate and resolves its unchanged pinned 4.0.4 shell assertion from `SHIBUMI_NATIVE_CATALOG_OMARCHY_PATH/shell`; its existing warmup and resource ceilings are not release-runner overrides. The candidate and all external-baseline identities are revalidated immediately before and after every evidence gate and once more after the final gate. Candidate content, mode, staged-state, untracked-state, commit, or tree drift and baseline cleanliness, revision, tree, content, or mode drift invalidate the evidence. These checks detect drift present at a validation boundary; they do not detect an input that is changed and restored entirely while one gate is running. The validation runner therefore remains a trusted, access-controlled system, and concurrent writers must be excluded for the full run. Gate commands are repository-owned tests from the exact reviewed commit, so a malicious gate means the candidate itself is already compromised and is outside the collector's threat model. Same-UID replacement of in-progress log or archive paths and symlink manipulation of output-parent directories are accepted release-machine risks; use a clean, non-symlinked output tree with no untrusted or concurrent writers. diff --git a/docs/development/testing.md b/docs/development/testing.md index 531826bb..4db39cca 100644 --- a/docs/development/testing.md +++ b/docs/development/testing.md @@ -49,16 +49,16 @@ baseline jobs. The installed-package job defaults to the package-managed host: ``` The installed-source-parity job requires an explicit clean Git checkout of the -official `v4.0.4` source revision used by the installed package: +official `v4.0.6` source revision used by the installed package: ```bash -SHIBUMI_INSTALLED_SOURCE_OMARCHY_PATH=/path/to/omarchy-v4.0.4 \ +SHIBUMI_INSTALLED_SOURCE_OMARCHY_PATH=/path/to/omarchy-v4.0.6 \ ./tests/omarchy-installed-source-parity-contract-regression.sh ``` -For an additional 4.0.2 compatibility run, invoke the aggregate contract with -the historical selector and its exact checkout. Release jobs themselves pin -4.0.4 and never inherit this selector: +Historical 4.0.2 compatibility requires its recorded Quickshell package as well +as the exact source checkout. The following historical command is not a current +validation-host gate. Release jobs pin 4.0.6 and never inherit this selector: ```bash OMARCHY_PATH=/path/to/omarchy-v4.0.2 \ @@ -90,10 +90,16 @@ Every host-bound test both imports `tests/lib/baselines.sh` and invokes its loader. The complete-host jobs select three repository-owned manifests with non-overlapping claims; the Agents job selects its separate narrower manifest: -- `contracts/baselines/omarchy-installed-package-v4.0.4.json` binds the - package-managed `omarchy 4.0.4-1`, `omarchy-settings 4.0.4-1` layout; -- `contracts/baselines/omarchy-installed-source-parity-v4.0.4.json` binds the - official `v4.0.4` source form at `c668141e9c42b13c80c9ca4ea108e11708c5e8a5`; +- `contracts/baselines/omarchy-installed-package-v4.0.6.json` binds the + package-managed `omarchy 4.0.6-1`, `omarchy-settings 4.0.6-1` layout; +- `contracts/baselines/omarchy-installed-source-parity-v4.0.6.json` binds the + official `v4.0.6` source form at `237f1b4071a0bff2296c6d740ba2b9fd695ebfa0`; +- 4.0.4 package/source and 4.0.5 source manifests remain historical. The native + catalog resource/runtime source remains 4.0.4 (`c668141e`, 183 shell files). + Supply `SHIBUMI_NATIVE_CATALOG_OMARCHY_PATH=/path/to/omarchy-v4.0.4` for the + resource gate; explicit `--native-shell` inputs to native runtime/fallback + fixtures retain the same pin. This fourth collector input does not assert the + historical manifest's old Quickshell package on the current host; - the `contracts/baselines/omarchy-installed-package-v4.0.3.json` and `contracts/baselines/omarchy-installed-source-parity-v4.0.3.json` manifests remain immutable optional compatibility references alongside 4.0.2; choose @@ -101,8 +107,9 @@ non-overlapping claims; the Agents job selects its separate narrower manifest: `SHIBUMI_OMARCHY_BASELINE_VERSION=4.0.2`; - `contracts/baselines/omarchy-forward-compat-246f33a2.json` records `246f33a2fef66411c990860d88e0823ae83987fc` for the separate forward gate. - Its Quickshell provenance is the independently verified Arch `0.3.1-1` - validation package; edge-host `0.3.2-6` results require separate evidence. + Its active Quickshell provenance is the independently verified Omarchy-repository + `0.3.2.r7.g2b4501a-1` package, also required for 4.0.6 package/parity gates; + historical Arch `0.3.1-1` and edge-host `0.3.2-6` results remain separate. Six native layout sections must remain distinct from three presentation regions. Use the existing State/lifecycle and inline-delta fixtures; tray data is deferred, not dropped. The stable 37-step bar-switch and 140-case renderer rest checks, diff --git a/docs/development/validation-host.md b/docs/development/validation-host.md index a2b27435..78c9c9e9 100644 --- a/docs/development/validation-host.md +++ b/docs/development/validation-host.md @@ -10,7 +10,7 @@ See [release workflow](release.md) and [testing](testing.md). ## 1. Host and trust boundary -- Require Omarchy and Omarchy Settings `4.0.4-1`, Quickshell `0.3.1-1`, an active +- Require Omarchy and Omarchy Settings `4.0.6-1`, Quickshell `0.3.2.r7.g2b4501a-1`, an active unlocked Wayland session, and the tools required by the repository gates. Record `pacman -Q omarchy omarchy-settings quickshell` and package provenance. A new host version needs new contract review, not edited pins to bypass failure. @@ -22,6 +22,15 @@ See [release workflow](release.md) and [testing](testing.md). Keep source, evidence and baseline paths canonical, non-symlinked and exclusive. - Plan disk/RAM capacity and serial execution. Preserve gate timeout/log budgets; do not raise limits or run resource measurements concurrently to obtain a pass. +- Set `QT_FORCE_STDERR_LOGGING=1` for fixture processes. This Qt 6.12 build sends + non-TTY Qt diagnostics to journald otherwise, leaving captured aggregate logs + incomplete. The aggregate and shared fixture launcher enforce stderr logging; + native runtime/resource sandbox environments already set it explicitly. +- On Quickshell 0.3.2 / Qt 6.12 the bar-switch fixture reports `Unable to assign + [undefined] to QColor` from the embedded native `Ui/WidgetButton.qml` and + `Ui/Panel.qml` bindings while bars are created and torn down. The unchanged + Beta 16.5 fixture shows the same three lines on this stack; the fixture's log + guard lists exactly these lines and nothing else. ## 2. Download and register the runner (separate approvals) @@ -113,14 +122,16 @@ reviewed Shibumi checkout, match these manifest `sourceRevision` values exactly: | Profile / manifest in `contracts/baselines/` | Revision | Repository variable | | --- | --- | --- | -| `omarchy-installed-source-parity-v4.0.4.json` | `c668141e9c42b13c80c9ca4ea108e11708c5e8a5` | `SHIBUMI_INSTALLED_SOURCE_OMARCHY_PATH` | +| `omarchy-installed-source-parity-v4.0.6.json` | `237f1b4071a0bff2296c6d740ba2b9fd695ebfa0` | `SHIBUMI_INSTALLED_SOURCE_OMARCHY_PATH` | +| `omarchy-installed-source-parity-v4.0.4.json` (native catalog source only) | `c668141e9c42b13c80c9ca4ea108e11708c5e8a5` | `SHIBUMI_NATIVE_CATALOG_OMARCHY_PATH` | | `omarchy-agents-v4.0.0.json` | `f0020448ca87329199de7cb12f2015ebc4a3e5e7` | `SHIBUMI_AGENTS_OMARCHY_PATH` | | `omarchy-forward-compat-246f33a2.json` | `246f33a2fef66411c990860d88e0823ae83987fc` | `SHIBUMI_FORWARD_COMPAT_OMARCHY_PATH` | -The private Beta.16.5 alignment round uses an isolated reference checkout and -Arch Quickshell `0.3.1-1` (package ownership/integrity independently checked). -It does not reprovision the runner or change its Actions variable. Reported edge -Quickshell `0.3.2-6` is a separate validation variable, not covered by that manifest. +Beta.16.5.1 records the installed Omarchy-repository Quickshell package above, +whose binary is `Quickshell 0.3.2 (revision 2b4501a282689792b62e94f3fb30d8f512324fe6, distributed by Omarchy)`. +Historical Beta.16.5 fixtures used Arch `0.3.1-1`; their results are not relabeled. +Reported edge `0.3.2-6` remains a separate validation variable. +Repository wiring does not authorize runner provisioning or Actions-variable writes. After provisioning approval, clone `https://github.com/basecamp/omarchy` separately for each profile and `git checkout --detach `. Check `HEAD^{commit}`, @@ -129,13 +140,20 @@ A tag name or clean status alone is not a byte/inventory proof. Use the existing `tests/lib/baselines.sh` validator, not a new checksum implementation. From the Shibumi checkout, in a fresh Bash process for each profile, supply `OMARCHY_PATH` and `SHIBUMI_OMARCHY_BASELINE_PROFILE` (`installed-source-parity`, `agents-current`, -or `forward-compat`), set `SHIBUMI_OMARCHY_BASELINE_VERSION=4.0.4`, then run: +or `forward-compat`), set `SHIBUMI_OMARCHY_BASELINE_VERSION=4.0.6`, then run: ```bash source tests/lib/baselines.sh shibumi_load_omarchy_baseline ``` +For the native catalog source, set `SHIBUMI_NATIVE_CATALOG_OMARCHY_PATH` to its +separate clean 4.0.4 checkout and call `shibumi_load_native_catalog_baseline` +instead. This validates the historical source tree, not its old Quickshell +package claim. Native runtime/resource fixtures retain the c668141e 183-file +shell inventory; warm PSS growth has a reviewed 768 KiB ceiling for the new +host stack, with other bounds unchanged. These are not 4.0.6 source proofs. + Repeat for `installed-package` against the actual installed `/usr/share/omarchy`; never relocate or rewrite it to mimic package provenance. Validators check the manifest schema, exact source revision, consumed hashes/subtree inventories and @@ -146,7 +164,7 @@ baseline identities at gate boundaries. No concurrent writers are permitted. ## 5. Repository settings and controlled release window -- Set the three repository **Actions variables** above to the accepted absolute +- Set the four repository **Actions variables** above to the accepted absolute paths on the validation host, not shell expressions like `$HOME` or `~`. They are paths, not secrets. Each variable write needs its own approval. - Treat the repository as public/untrusted input: require approval for **all @@ -162,7 +180,7 @@ baseline identities at gate boundaries. No concurrent writers are permitted. - Protect release branches and enforce immutable `v*` tags (no update/deletion, no routine bypass; restrict creation to authorized maintainers). Record actual settings and repository visibility; do not claim they are configured from docs. -- After separate collector Go: clean accepted commit, `umask 022`, all three +- After separate collector Go: clean accepted commit, `umask 022`, all four baseline variables, no ambient Git overrides, serial collector **14/14**. Use the release workflow's exact-commit procedure; no `--allow-dirty` acceptance. Any red gate stops the sequence for diagnosis, not blind retry or a weaker gate. diff --git a/docs/install.md b/docs/install.md index ef2ea399..0cd172b1 100644 --- a/docs/install.md +++ b/docs/install.md @@ -6,8 +6,8 @@ Shibumi installs 24 independent plugin roots into Omarchy's normal plugin directory. The repository root is a suite source, not a single installable Omarchy plugin. -`0.1.1-beta.16.5` is the target GitHub prerelease. See the -[release notes](../.github/release-notes/v0.1.1-beta.16.5.md) for changes. +`0.1.1-beta.16.5.1` is the target GitHub prerelease. See the +[release notes](../.github/release-notes/v0.1.1-beta.16.5.1.md) for changes. Install from the release tag using the source workflow below. Do not install or update from `main`. @@ -31,7 +31,7 @@ For an intentional non-interactive installation: sudo pacman -S --needed python jq curl networkmanager power-profiles-daemon upower xdg-utils libnotify wl-clipboard ttf-material-symbols-variable ttf-jetbrains-mono-nerd-basic noto-fonts-cjk adwaita-fonts git clone https://github.com/HANCORE-linux/Shibumi-Shell.git cd Shibumi-Shell -git checkout v0.1.1-beta.16.5 +git checkout v0.1.1-beta.16.5.1 ./scripts/shibumi-suite install --yes ``` @@ -47,7 +47,7 @@ To inspect the transaction before installing: sudo pacman -S --needed python jq curl networkmanager power-profiles-daemon upower xdg-utils libnotify wl-clipboard ttf-material-symbols-variable ttf-jetbrains-mono-nerd-basic noto-fonts-cjk adwaita-fonts git clone https://github.com/HANCORE-linux/Shibumi-Shell.git cd Shibumi-Shell -git checkout v0.1.1-beta.16.5 +git checkout v0.1.1-beta.16.5.1 ./scripts/shibumi-suite install --dry-run ./scripts/shibumi-suite install ``` @@ -127,14 +127,15 @@ Pacman updating `/usr/share/shibumi-shell` does not silently change a running desktop. The explicit update validates, stages, reloads, and verifies all 24 plugins as one transaction. -Update an admitted Beta.16.4 source installation to Beta.16.5 from its -trusted checkout. The exact published Beta.16.4 tag (`64b9369`) and its main -integration merge (`aec6c0a`) are admitted predecessors: +Update an admitted Beta.16.4 or Beta.16.5 source installation to Beta.16.5.1 +from its trusted checkout. The exact Beta.16.4 tag (`64b9369`) and merge +(`aec6c0a`), and Beta.16.5 tag (`8b34d030`) and merge (`1d7a00b2`), are admitted +predecessors: ```bash cd Shibumi-Shell git fetch --tags -git checkout v0.1.1-beta.16.5 +git checkout v0.1.1-beta.16.5.1 ./scripts/shibumi-suite update --dry-run ./scripts/shibumi-suite update --yes ./scripts/shibumi-suite status @@ -387,7 +388,7 @@ then install the published tag. For example, only if the recorded revision is ```bash git checkout e92d8ee1ce9821d0b203a9d4d5dd9932d2e460fb ./scripts/shibumi-suite uninstall --keep-settings --yes -git checkout v0.1.1-beta.16.5 +git checkout v0.1.1-beta.16.5.1 ./scripts/shibumi-suite install --yes ``` diff --git a/docs/plugins/README.md b/docs/plugins/README.md index 48e86120..a063911e 100644 --- a/docs/plugins/README.md +++ b/docs/plugins/README.md @@ -2,7 +2,7 @@ Status: reference -Shibumi `0.1.1-beta.16.5` contains 24 independently registered Omarchy plugins. The +Shibumi `0.1.1-beta.16.5.1` contains 24 independently registered Omarchy plugins. The default suite profile installs all of them as one verified transaction. The authoritative inventory is diff --git a/docs/release-readiness.md b/docs/release-readiness.md index 1465b189..f566737e 100644 --- a/docs/release-readiness.md +++ b/docs/release-readiness.md @@ -1,10 +1,141 @@ -# Shibumi 0.1.1-beta.16.5 release readiness +# Shibumi 0.1.1-beta.16.5.1 release readiness > **Document status: Revision-bound validation record.** This page separates > recorded product evidence from release, package, and physical acceptance. > It cannot override [`../ARCHITECTURE.md`](../ARCHITECTURE.md). -## Accepted Beta.16.5 product series and validation boundary +## Beta 16.5.1 hotfix and validation boundary + +The approved release date is **2026-10-23**. The release branch starts from +main integration merge `1d7a00b2742fb4d479774a4f722c6c2ef96d0601`, whose tree +equals published Beta 16.5 tag `8b34d030a303aa35d6033923c8f3c38c4c25b29b`. +Both revisions are admitted with unchanged published payload pins. The rolling +predecessor fixture now records that published Beta 16.5 release. + +The hotfix accepts both `style.*` and `appearance.*` picker menu keys, preserving +the host actions and warning without a routing block when neither family is +present. The affected lifecycle paths are install, update, repair and migrate. +Release-identity maintenance changes no QML behavior. The product fix separately +restores Reactor quote text on Qt 6.12: arrays crossing a QML `var` signal arrive +as sequences, so an Array-only guard discarded every quote choice. The fix +converts the sequence without changing renderer timing or geometry. The settled +Bar layout context is JSON-cloned once at the receive boundary, preserving strict +provider-group/native-section validators. Audio stream-label resolution converts +Quickshell player sequences to local arrays while retaining QObject identity. + +The accepted candidate is tag + patches 01–05 + replacement 06-r2, snapshot +`1dc8c3be2ed076401e0fd90cdf235a9aaa17c63e`, tree +`6677721db7289df940ab76042763c0c4fe476139`. Its payload identities are: + +- Suite (24 plugins): `a4a0b43a04603a9b40354df1498e74b4b42e55158c1d3f9d68c9460db30802cf`. +- Bar: `1d1a47515cafa53176338645f8525f8e6e5021f124948eff6794b708d02aacc9`. +- Audio: `7cb7693721fc4fb75e405d565a1579d8a32c5dc1fea6177dbba6c518127ac79e`. + +Only the current candidate's Bar and Audio payload pins change in 06-r2; all +published predecessor pins remain unchanged. The release cut preserves these +product bytes. The source archive checksum is a separate finalisation step. + +**Candidate gates:** all 13 requested groups passed on that exact snapshot. + +| Gate | Candidate result | +| --- | --- | +| Suite | 180/180 in each of five forms: 4.0.6 script/module, retained 4.0.4 script/module, forward script. | +| Package / admission / baseline | 27/27, 40/40, and baseline contract PASS. | +| Lifecycle | Both complete stable/forward groups passed 9/9, including dry-run. | +| Native catalog resource (gate 11) | One run; candidate warm growth 424 KiB against 768 KiB. Exact Beta 13 control 0 KiB, below-CPU control 4 KiB, restored candidate 388 KiB; all seven mutants failed as intended. | +| Complete aggregates | Stable 4.0.6 and forward `246f33a2` completed with exit 0, including renderer PASS and the final complete-contract markers. | + +Candidate and all four external baseline identities remained unchanged before +and after every group and at the final audit. All 13 outer roots and 18 recorded +owned cgroups were absent afterward, with no reported survivors. These are +candidate results, not exact-final release or physical acceptance. + +**Menu proof:** the forward pin +`246f33a2fef66411c990860d88e0823ae83987fc` predates the rename and does not prove +appearance-family routing. Suite coverage and Hermes's offline replay use the +real stock menu from Omarchy `6bee248a3`: Beta 16.5 rejects it, the candidate +routes it, and removal restores the original bytes. No live host with that +revision was available; machine2 and .140 could not be powered on. The Maintainer +accepted this offline proof in place of the live appearance-menu check. Later +Phase D live acceptance runs on main only; it has not run for this release. + +The first exact-final run on `3ec5346e` stopped at gate 16's bar-switch log +guard on native Ui color warnings under Quickshell 0.3.2 / Qt 6.12; Hermes +reproduced the same diagnostic lines with unchanged Beta 16.5 code and attributed +the red to the host stack. The preceding test-only fix-up commit applies the +approved native-Ui warning allowance without changing product code. The second +exact-final run on `8b8fa237` passed all 26 release gates but stopped at collector +gate 9: Hermes attributed it to the installed-package regression's stale 4.0.4 +version pin on the same unchanged Omarchy 4.0.6 host. A further preceding +test-only fix-up corrects that pin to 4.0.6 without changing product code. +No exact-final pass transfers from either stopped run; results for this re-cut +remain pending against literal `FINAL_SHA`. + +**Final release boundary:** exact-final gates remain pending against `FINAL_SHA`: +26 release gates, the complete 14-gate collector, separate 37-step bar-switch, +local package rehearsal, clean-status and reproducible archive verification. +Standalone renderer-rest and audio/media results must also be bound to the +exact final commit; the candidate aggregates do not relabel them as completed +standalone gates. Independent release review and applicable live/physical +acceptance remain separate. The candidate snapshot is not the tag target. + +### Preserved attribution and earlier attempts + +On the initial fix-only tree, five suite runs passed 180/180, package 27/27 and +admission 40/40. Lifecycle stopped on Quickshell package drift. Resource gate 11 +recorded 552 KiB warm PSS growth against 512 KiB. The authorized unchanged-tag +control and candidate repeat passed at 448 KiB and 508 KiB respectively on the +updated host stack, with all controls passing; the original failure is retained. +No ceiling changed during attribution. Historical Beta 16.5 exact-final measured +400 KiB on the old stack. The fixture never executes the changed lifecycle +Python. The Maintainer subsequently authorized **768 KiB** warm-growth fixture +maintenance for the Omarchy 4.0.6 / Quickshell 0.3.2.r7 / Qt 6.12 stack. Wrapper, +probe and parser fixtures are synchronized; CPU/cadence and the separate +512 * 1024 host-PSS bound remain unchanged. None of the original observations +is erased by the accepted candidate's 424 KiB result. + +Patch 5 pins Omarchy/Settings 4.0.6-1 and Omarchy-repository Quickshell +0.3.2.r7.g2b4501a-1 from recorded pacman identity/provenance. The observed stack +also has Qt Base 6.12.0-3, Qt Declarative 6.12.0-2 and Mesa 1:26.2.5-1; these +are evidence, not additional manifest pins. The Quickshell binary reports +`Quickshell 0.3.2 (revision 2b4501a282689792b62e94f3fb30d8f512324fe6, distributed by Omarchy)`. +Collector probes match exact package and binary identities, including pkgrel. + +The 4.0.6 package/source shell and config inventories are exact. Package bin has +446 entries, source 449: `omarchy-debug`, `omarchy-debug-idle` and +`omarchy-upload-log` are source-only, confirmed against the cached official +4.0.6-1 archive. All shared executable bytes match; each bin roster stays pinned +independently. `pacman -Qkk` found no altered Omarchy/Quickshell files; its exit 1 +reflects four unreadable Settings `/etc/sudoers.d/omarchy-*` files. Full Settings +package integrity is not claimed; no permission changes were made. + +Stable gates move to 4.0.6 (`237f1b40`). Native catalog runtime/resource source +proof stays at 4.0.4 (`c668141e`, 183 shell files), independently supplied by +`SHIBUMI_NATIVE_CATALOG_OMARCHY_PATH`; the collector now binds four external +inputs. Old manifest bytes stay unchanged; warm growth uses the reviewed 768 KiB ceiling. +This source-only historical pin does not assert old Quickshell provenance on +the new host. Actions-variable changes and exact-final acceptance remain separate. + +The tag + patches 01–05 snapshot passed reduced gates, both complete lifecycle +groups and its single gate 11 run (392 KiB warm growth under 768 KiB), but both +aggregates exited 1. Their logs ended after a passing ShibumiConfig fixture +because Qt 6.12 sent later non-TTY console output to journald. Read-only tag +diagnosis attributed both reds to `reactor-renderer-regression.qml`: +`quote fit did not skip an oversized candidate`. Theme-palette and reactor-model +had passed silently in between. The existing renderer fixture is the observed-red +coverage for patch 6; no new test is added. `QT_FORCE_STDERR_LOGGING=1` is now +explicit in aggregate/shared fixture launches; native runtime/resource sandbox +environments already set it. Both complete 06-r2 aggregates passed as recorded +above; earlier passes or silent logs are not substituted for them. + +The initial patch 6 snapshot `f114ba1c` passed all five suite forms but stopped +at package tests (27 tests, one failure): the candidate payload literal in the +package fixture had not been updated. No later gate ran in that attempt. The +replacement 06-r2 corrects only that literal above `f114ba1c`; product bytes and +payload are unchanged. Its complete 13-group run is the accepted result above. +The original failed attempt and its cleanup audit remain preserved. + +## Historical Beta.16.5 product series and validation boundary The accepted local C1–C8 series is based on `aec6c0a3266d71f6a5f9cfa17562d8bec0ce9b17`, the main integration merge of @@ -89,7 +220,8 @@ commit externally. No predecessor gate result transfers to this candidate. Beta.16.3 was published on 2026-10-10 as a GitHub prerelease from `1a13d6be7d5b4bc9aa03590b77b6531aefcad497`. It was the frozen rolling predecessor for Beta.16.4; [`release-predecessor.json`](../tests/fixtures/release-predecessor.json) -now records Beta.16.4 for the private Beta.16.5 preparation. +recorded Beta.16.4 during Beta.16.5 preparation and now records Beta.16.5 +for the hotfix. That exact tag checkout and the source-installation integration merge `494fa69b9e348fa595eb4d55d2e11b4aa2fd4470` (PR #77) are admitted by [`lifecycle-predecessors-v1.json`](../contracts/lifecycle-predecessors-v1.json), @@ -126,21 +258,22 @@ permit another run. Real Polkit/root and owner-loss acceptance remain separate. ## Pinned host contracts The release's installed-package and source-parity contracts target Omarchy -4.0.4. Pinned configuration is not a physical-acceptance claim. +4.0.6. Pinned configuration is not a physical-acceptance claim. | Component | Required identity | | --- | --- | -| Omarchy | `omarchy 4.0.4-1` | -| Omarchy Settings | `omarchy-settings 4.0.4-1` | -| Quickshell | `quickshell 0.3.1-1` | -| Installed package profile | `installed-package-v4.0.4` | -| Source parity | `installed-source-parity-v4.0.4`, `c668141e9c42b13c80c9ca4ea108e11708c5e8a5` | +| Omarchy | `omarchy 4.0.6-1` | +| Omarchy Settings | `omarchy-settings 4.0.6-1` | +| Quickshell | `quickshell 0.3.2.r7.g2b4501a-1` | +| Installed package profile | `installed-package-v4.0.6` | +| Source parity | `installed-source-parity-v4.0.6`, `237f1b4071a0bff2296c6d740ba2b9fd695ebfa0` | +| Native catalog source-only reference | `v4.0.4`, `c668141e9c42b13c80c9ca4ea108e11708c5e8a5` | | Agents reference | `v4.0.0`, `f0020448ca87329199de7cb12f2015ebc4a3e5e7` | | Forward reference | `246f33a2fef66411c990860d88e0823ae83987fc` | The manifests in [`contracts/baselines/`](../contracts/baselines/) bind consumed -files and subtrees. Historical 4.0.3/4.0.2 manifests remain explicit compatibility -references, not substitutes for the release jobs' 4.0.4 pins. Provisioning is +files and subtrees. Historical 4.0.4/4.0.3/4.0.2 package/source and 4.0.5 source +manifests remain unchanged, not substitutes for the release jobs' 4.0.6 pins. Provisioning is covered by the [validation-host runbook](development/validation-host.md); [host compatibility](architecture/quattro-compatibility.md) describes the proof axes. @@ -232,4 +365,4 @@ release checklist. Beta.16's published changes and limits remain in its revision `30746f5` passed the complete contract and 32-generation runtime; those fixtures retained known teardown warnings and did not establish blanket hardware acceptance. Earlier readiness snapshots remain in Git history; none -confers acceptance on Beta.16.5. +confers acceptance on Beta 16.5.1. diff --git a/hancore.shibumi.ai/Service.qml b/hancore.shibumi.ai/Service.qml index c309cfc5..8ad19797 100644 --- a/hancore.shibumi.ai/Service.qml +++ b/hancore.shibumi.ai/Service.qml @@ -19,7 +19,7 @@ Item { SuiteRuntime.HostShell { id: suiteShell; host: root.shell } SuiteRuntime.Provider { pluginId: "hancore.shibumi.ai" - implementationVersion: "0.1.1-beta.16.5" + implementationVersion: "0.1.1-beta.16.5.1" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.ai/manifest.json b/hancore.shibumi.ai/manifest.json index 441c25a0..c59b8f02 100644 --- a/hancore.shibumi.ai/manifest.json +++ b/hancore.shibumi.ai/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.ai", "name": "Shibumi AI Usage", - "version": "0.1.1-beta.16.5", + "version": "0.1.1-beta.16.5.1", "author": "HANCORE", "license": "MIT", "description": "Shibumi Claude, Codex, and OpenCode usage presentation.", diff --git a/hancore.shibumi.audio/AudioModel.js b/hancore.shibumi.audio/AudioModel.js index 247c849d..1a16a840 100644 --- a/hancore.shibumi.audio/AudioModel.js +++ b/hancore.shibumi.audio/AudioModel.js @@ -150,7 +150,8 @@ function streamRepresentsMprisPlayer(streamLabelValue, playerLabel) { } function mprisLabelsFor(players, predicate) { - var values = Array.isArray(players) ? players : [] + var values = players && typeof players.length === "number" + ? Array.prototype.slice.call(players) : [] var playing = [] var candidates = [] var playingProxies = [] diff --git a/hancore.shibumi.audio/Service.qml b/hancore.shibumi.audio/Service.qml index 6e926ef3..6e16883d 100644 --- a/hancore.shibumi.audio/Service.qml +++ b/hancore.shibumi.audio/Service.qml @@ -14,7 +14,7 @@ Item { SuiteRuntime.Provider { id: runtimeProvider pluginId: "hancore.shibumi.audio" - implementationVersion: "0.1.1-beta.16.5" + implementationVersion: "0.1.1-beta.16.5.1" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.audio/manifest.json b/hancore.shibumi.audio/manifest.json index 4915f16a..16698e04 100644 --- a/hancore.shibumi.audio/manifest.json +++ b/hancore.shibumi.audio/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.audio", "name": "Shibumi Audio", - "version": "0.1.1-beta.16.5", + "version": "0.1.1-beta.16.5.1", "author": "HANCORE", "license": "MIT", "description": "Shibumi audio presentation over Omarchy's PipeWire owner.", diff --git a/hancore.shibumi.bar/Bar.qml b/hancore.shibumi.bar/Bar.qml index f286956b..66c44da0 100644 --- a/hancore.shibumi.bar/Bar.qml +++ b/hancore.shibumi.bar/Bar.qml @@ -28,7 +28,7 @@ Item { SuiteRuntime.Provider { id: barRuntimeProvider pluginId: "hancore.shibumi.bar" - implementationVersion: "0.1.1-beta.16.5" + implementationVersion: "0.1.1-beta.16.5.1" owner: root host: suiteHostShell.host manifest: root.manifest @@ -3413,6 +3413,9 @@ Item { admitted: root.restoreAdmitted && !providerSnapshotTransition.busy && !stateTransition.busy onSettledContext: function(serial, result, context) { + // Qt 6.12 marshals nested signal arrays as sequences; keep validators strict. + if (context !== null && context !== undefined) + context = JSON.parse(JSON.stringify(context)) root.lastProviderUndoReceipt = null const intent = context && context.intent ? context.intent : null const saved = root.lastCatalogTransitionSnapshot diff --git a/hancore.shibumi.bar/manifest.json b/hancore.shibumi.bar/manifest.json index d483728b..d09d1128 100644 --- a/hancore.shibumi.bar/manifest.json +++ b/hancore.shibumi.bar/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.bar", "name": "Shibumi Bar", - "version": "0.1.1-beta.16.5", + "version": "0.1.1-beta.16.5.1", "author": "HANCORE", "license": "MIT", "description": "The Shibumi full-bar host for Omarchy Shell.", diff --git a/hancore.shibumi.bar/styles/shibumi/ReactorEventLayer.qml b/hancore.shibumi.bar/styles/shibumi/ReactorEventLayer.qml index 112dced7..ae2f5699 100644 --- a/hancore.shibumi.bar/styles/shibumi/ReactorEventLayer.qml +++ b/hancore.shibumi.bar/styles/shibumi/ReactorEventLayer.qml @@ -52,7 +52,8 @@ Item { quote: event.profile === "quote", count: Math.max(1, Math.min(36, Number(event.count) || 1)), gain: Math.max(0.1, Math.min(1, Number(event.gain) || 1)), - choices: Array.isArray(event.choices) ? event.choices.slice(0, 64) : [], + choices: event.choices && typeof event.choices.length === "number" + ? Array.prototype.slice.call(event.choices, 0, 64) : [], grid: null } if (pulse.kind === "text") { diff --git a/hancore.shibumi.battery/manifest.json b/hancore.shibumi.battery/manifest.json index e64f847a..ab281808 100644 --- a/hancore.shibumi.battery/manifest.json +++ b/hancore.shibumi.battery/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.battery", "name": "Shibumi Battery", - "version": "0.1.1-beta.16.5", + "version": "0.1.1-beta.16.5.1", "author": "HANCORE", "license": "MIT", "description": "Shibumi battery status and detailed battery panel.", diff --git a/hancore.shibumi.bluetooth/Service.qml b/hancore.shibumi.bluetooth/Service.qml index d25d9645..d53cc2d8 100644 --- a/hancore.shibumi.bluetooth/Service.qml +++ b/hancore.shibumi.bluetooth/Service.qml @@ -15,7 +15,7 @@ Item { SuiteRuntime.HostShell { id: suiteShell; host: root.shell } SuiteRuntime.Provider { pluginId: "hancore.shibumi.bluetooth" - implementationVersion: "0.1.1-beta.16.5" + implementationVersion: "0.1.1-beta.16.5.1" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.bluetooth/manifest.json b/hancore.shibumi.bluetooth/manifest.json index 1bb818a1..e22ab85b 100644 --- a/hancore.shibumi.bluetooth/manifest.json +++ b/hancore.shibumi.bluetooth/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.bluetooth", "name": "Shibumi Bluetooth", - "version": "0.1.1-beta.16.5", + "version": "0.1.1-beta.16.5.1", "author": "HANCORE", "license": "MIT", "description": "Shibumi Bluetooth presentation with a native BlueZ and audio backend.", diff --git a/hancore.shibumi.brightness/Service.qml b/hancore.shibumi.brightness/Service.qml index ffc9781a..eab40a6b 100644 --- a/hancore.shibumi.brightness/Service.qml +++ b/hancore.shibumi.brightness/Service.qml @@ -13,7 +13,7 @@ Item { property var manifest: null SuiteRuntime.Provider { pluginId: "hancore.shibumi.brightness" - implementationVersion: "0.1.1-beta.16.5" + implementationVersion: "0.1.1-beta.16.5.1" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.brightness/manifest.json b/hancore.shibumi.brightness/manifest.json index 59167efc..aae48fc5 100644 --- a/hancore.shibumi.brightness/manifest.json +++ b/hancore.shibumi.brightness/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.brightness", "name": "Shibumi Brightness", - "version": "0.1.1-beta.16.5", + "version": "0.1.1-beta.16.5.1", "author": "HANCORE", "license": "MIT", "description": "Shibumi brightness and display presentation over Omarchy's monitor owner.", diff --git a/hancore.shibumi.center/Service.qml b/hancore.shibumi.center/Service.qml index 7830d913..5ff84295 100644 --- a/hancore.shibumi.center/Service.qml +++ b/hancore.shibumi.center/Service.qml @@ -10,7 +10,7 @@ Item { property var manifest: null SuiteRuntime.Provider { pluginId: "hancore.shibumi.center" - implementationVersion: "0.1.1-beta.16.5" + implementationVersion: "0.1.1-beta.16.5.1" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.center/manifest.json b/hancore.shibumi.center/manifest.json index 01b421a8..74f31d7c 100644 --- a/hancore.shibumi.center/manifest.json +++ b/hancore.shibumi.center/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.center", "name": "Shibumi Center", - "version": "0.1.1-beta.16.5", + "version": "0.1.1-beta.16.5.1", "author": "HANCORE", "license": "MIT", "description": "Shibumi clock, calendar, weather, status, and update center.", diff --git a/hancore.shibumi.control-center/PluginUpdateService.qml b/hancore.shibumi.control-center/PluginUpdateService.qml index 619862da..c678ccd0 100644 --- a/hancore.shibumi.control-center/PluginUpdateService.qml +++ b/hancore.shibumi.control-center/PluginUpdateService.qml @@ -20,7 +20,7 @@ Item { SuiteRuntime.Provider { id: runtimeProvider pluginId: "hancore.shibumi.control-center" - implementationVersion: "0.1.1-beta.16.5" + implementationVersion: "0.1.1-beta.16.5.1" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.control-center/manifest.json b/hancore.shibumi.control-center/manifest.json index 1264f599..9ab1c8a2 100644 --- a/hancore.shibumi.control-center/manifest.json +++ b/hancore.shibumi.control-center/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.control-center", "name": "Shibumi Control Center", - "version": "0.1.1-beta.16.5", + "version": "0.1.1-beta.16.5.1", "author": "HANCORE", "license": "MIT", "description": "Shibumi G1 presentation and bar configuration panel.", diff --git a/hancore.shibumi.cpu/Service.qml b/hancore.shibumi.cpu/Service.qml index 7a6fc260..8e27aa01 100644 --- a/hancore.shibumi.cpu/Service.qml +++ b/hancore.shibumi.cpu/Service.qml @@ -13,7 +13,7 @@ Item { SuiteRuntime.Provider { id: runtimeProvider pluginId: "hancore.shibumi.cpu" - implementationVersion: "0.1.1-beta.16.5" + implementationVersion: "0.1.1-beta.16.5.1" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.cpu/manifest.json b/hancore.shibumi.cpu/manifest.json index aeb83cd0..fa475e4a 100644 --- a/hancore.shibumi.cpu/manifest.json +++ b/hancore.shibumi.cpu/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.cpu", "name": "Shibumi CPU", - "version": "0.1.1-beta.16.5", + "version": "0.1.1-beta.16.5.1", "author": "HANCORE", "license": "MIT", "description": "Shibumi CPU widget, GPU sampler, and detailed usage panel.", diff --git a/hancore.shibumi.gpu/manifest.json b/hancore.shibumi.gpu/manifest.json index 0af2fce4..7ba02b5e 100644 --- a/hancore.shibumi.gpu/manifest.json +++ b/hancore.shibumi.gpu/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.gpu", "name": "Shibumi GPU", - "version": "0.1.1-beta.16.5", + "version": "0.1.1-beta.16.5.1", "author": "HANCORE", "license": "MIT", "description": "Lazy GPU load, hardware, driver, temperature, and VRAM widget.", diff --git a/hancore.shibumi.media/Service.qml b/hancore.shibumi.media/Service.qml index afa06a11..8efb9103 100644 --- a/hancore.shibumi.media/Service.qml +++ b/hancore.shibumi.media/Service.qml @@ -19,7 +19,7 @@ Item { SuiteRuntime.Provider { id: runtimeProvider pluginId: "hancore.shibumi.media" - implementationVersion: "0.1.1-beta.16.5" + implementationVersion: "0.1.1-beta.16.5.1" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.media/manifest.json b/hancore.shibumi.media/manifest.json index dea5770c..7a6f9981 100644 --- a/hancore.shibumi.media/manifest.json +++ b/hancore.shibumi.media/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.media", "name": "Shibumi Media", - "version": "0.1.1-beta.16.5", + "version": "0.1.1-beta.16.5.1", "author": "HANCORE", "license": "MIT", "description": "Shibumi media controls over Omarchy's MPRIS service.", diff --git a/hancore.shibumi.memory/manifest.json b/hancore.shibumi.memory/manifest.json index e60935bd..911727f2 100644 --- a/hancore.shibumi.memory/manifest.json +++ b/hancore.shibumi.memory/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.memory", "name": "Shibumi Memory", - "version": "0.1.1-beta.16.5", + "version": "0.1.1-beta.16.5.1", "author": "HANCORE", "license": "MIT", "description": "Shibumi memory widget and detailed memory panel.", diff --git a/hancore.shibumi.network/Service.qml b/hancore.shibumi.network/Service.qml index 103d417e..d24b610e 100644 --- a/hancore.shibumi.network/Service.qml +++ b/hancore.shibumi.network/Service.qml @@ -15,7 +15,7 @@ Item { property var manifest: null SuiteRuntime.Provider { pluginId: "hancore.shibumi.network" - implementationVersion: "0.1.1-beta.16.5" + implementationVersion: "0.1.1-beta.16.5.1" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.network/manifest.json b/hancore.shibumi.network/manifest.json index 0369eecf..d9f8ab84 100644 --- a/hancore.shibumi.network/manifest.json +++ b/hancore.shibumi.network/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.network", "name": "Shibumi Network", - "version": "0.1.1-beta.16.5", + "version": "0.1.1-beta.16.5.1", "author": "HANCORE", "license": "MIT", "description": "Native Shibumi NetworkManager ownership, telemetry, actions, QR, and speed testing.", diff --git a/hancore.shibumi.power-profile/manifest.json b/hancore.shibumi.power-profile/manifest.json index 919d7688..8ec77b4d 100644 --- a/hancore.shibumi.power-profile/manifest.json +++ b/hancore.shibumi.power-profile/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.power-profile", "name": "Shibumi Power Profile", - "version": "0.1.1-beta.16.5", + "version": "0.1.1-beta.16.5.1", "author": "HANCORE", "license": "MIT", "description": "Shibumi power-profile status and profile selector.", diff --git a/hancore.shibumi.power-state/Service.qml b/hancore.shibumi.power-state/Service.qml index 05d61c15..933ecb73 100644 --- a/hancore.shibumi.power-state/Service.qml +++ b/hancore.shibumi.power-state/Service.qml @@ -23,7 +23,7 @@ Item { SuiteRuntime.Provider { id: runtimeProvider pluginId: "hancore.shibumi.power-state" - implementationVersion: "0.1.1-beta.16.5" + implementationVersion: "0.1.1-beta.16.5.1" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.power-state/manifest.json b/hancore.shibumi.power-state/manifest.json index e0b885f3..c5b9efbb 100644 --- a/hancore.shibumi.power-state/manifest.json +++ b/hancore.shibumi.power-state/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.power-state", "name": "Shibumi Power State", - "version": "0.1.1-beta.16.5", + "version": "0.1.1-beta.16.5.1", "author": "HANCORE", "license": "MIT", "description": "Shared battery and power-profile state for Shibumi widgets.", diff --git a/hancore.shibumi.quick-access/Service.qml b/hancore.shibumi.quick-access/Service.qml index e6a8a728..703a2182 100644 --- a/hancore.shibumi.quick-access/Service.qml +++ b/hancore.shibumi.quick-access/Service.qml @@ -18,7 +18,7 @@ Item { SuiteRuntime.HostShell { id: suiteShell; host: root.shell } SuiteRuntime.Provider { pluginId: "hancore.shibumi.quick-access" - implementationVersion: "0.1.1-beta.16.5" + implementationVersion: "0.1.1-beta.16.5.1" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.quick-access/manifest.json b/hancore.shibumi.quick-access/manifest.json index bb5c3173..c4a898e9 100644 --- a/hancore.shibumi.quick-access/manifest.json +++ b/hancore.shibumi.quick-access/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.quick-access", "name": "Shibumi Quick Access", - "version": "0.1.1-beta.16.5", + "version": "0.1.1-beta.16.5.1", "author": "HANCORE", "license": "MIT", "description": "Shibumi idle inhibitor and theme, wallpaper, screenshot, and video pickers.", diff --git a/hancore.shibumi.reactor/Service.qml b/hancore.shibumi.reactor/Service.qml index 9c336275..e2580d2b 100644 --- a/hancore.shibumi.reactor/Service.qml +++ b/hancore.shibumi.reactor/Service.qml @@ -18,7 +18,7 @@ Item { SuiteRuntime.Provider { id: runtimeProvider pluginId: "hancore.shibumi.reactor" - implementationVersion: "0.1.1-beta.16.5" + implementationVersion: "0.1.1-beta.16.5.1" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.reactor/manifest.json b/hancore.shibumi.reactor/manifest.json index 5bab44b1..40422d01 100644 --- a/hancore.shibumi.reactor/manifest.json +++ b/hancore.shibumi.reactor/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.reactor", "name": "Shibumi Reactor", - "version": "0.1.1-beta.16.5", + "version": "0.1.1-beta.16.5.1", "author": "HANCORE", "license": "MIT", "description": "Shibumi event and quote Reactor service for compatible bar styles.", diff --git a/hancore.shibumi.state/Service.qml b/hancore.shibumi.state/Service.qml index ab869cc3..2194db32 100644 --- a/hancore.shibumi.state/Service.qml +++ b/hancore.shibumi.state/Service.qml @@ -16,7 +16,7 @@ Item { SuiteRuntime.Provider { id: runtimeProvider pluginId: "hancore.shibumi.state" - implementationVersion: "0.1.1-beta.16.5" + implementationVersion: "0.1.1-beta.16.5.1" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.state/manifest.json b/hancore.shibumi.state/manifest.json index 28ad71a3..39adabac 100644 --- a/hancore.shibumi.state/manifest.json +++ b/hancore.shibumi.state/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.state", "name": "Shibumi State", - "version": "0.1.1-beta.16.5", + "version": "0.1.1-beta.16.5.1", "author": "HANCORE", "license": "MIT", "description": "Normalized Shibumi configuration and theme palette state.", diff --git a/hancore.shibumi.state/runtime/Runtime.qml b/hancore.shibumi.state/runtime/Runtime.qml index afb003b3..f6768105 100644 --- a/hancore.shibumi.state/runtime/Runtime.qml +++ b/hancore.shibumi.state/runtime/Runtime.qml @@ -11,7 +11,7 @@ QtObject { id: runtime readonly property int contractVersion: 1 - readonly property string suiteVersion: "0.1.1-beta.16.5" + readonly property string suiteVersion: "0.1.1-beta.16.5.1" readonly property var providerIds: [ "hancore.shibumi.state", "hancore.shibumi.control-center", "hancore.shibumi.reactor", "hancore.shibumi.telemetry", diff --git a/hancore.shibumi.status/Service.qml b/hancore.shibumi.status/Service.qml index d21ecda4..152fe05b 100644 --- a/hancore.shibumi.status/Service.qml +++ b/hancore.shibumi.status/Service.qml @@ -16,7 +16,7 @@ Item { SuiteRuntime.HostShell { id: suiteShell; host: root.shell } SuiteRuntime.Provider { pluginId: "hancore.shibumi.status" - implementationVersion: "0.1.1-beta.16.5" + implementationVersion: "0.1.1-beta.16.5.1" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.status/manifest.json b/hancore.shibumi.status/manifest.json index d747fc53..92ad7445 100644 --- a/hancore.shibumi.status/manifest.json +++ b/hancore.shibumi.status/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.status", "name": "Shibumi Status", - "version": "0.1.1-beta.16.5", + "version": "0.1.1-beta.16.5.1", "author": "HANCORE", "license": "MIT", "description": "Shibumi tray and notification composition with shared desktop status state.", diff --git a/hancore.shibumi.storage/Service.qml b/hancore.shibumi.storage/Service.qml index d0d59507..62145a54 100644 --- a/hancore.shibumi.storage/Service.qml +++ b/hancore.shibumi.storage/Service.qml @@ -13,7 +13,7 @@ Item { SuiteRuntime.Provider { id: runtimeProvider pluginId: "hancore.shibumi.storage" - implementationVersion: "0.1.1-beta.16.5" + implementationVersion: "0.1.1-beta.16.5.1" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.storage/manifest.json b/hancore.shibumi.storage/manifest.json index 89d29050..701672c7 100644 --- a/hancore.shibumi.storage/manifest.json +++ b/hancore.shibumi.storage/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.storage", "name": "Shibumi Storage", - "version": "0.1.1-beta.16.5", + "version": "0.1.1-beta.16.5.1", "author": "HANCORE", "license": "MIT", "description": "Read-only root usage and physical drive inventory.", diff --git a/hancore.shibumi.telemetry/Service.qml b/hancore.shibumi.telemetry/Service.qml index ab7190ba..5c1fe85d 100644 --- a/hancore.shibumi.telemetry/Service.qml +++ b/hancore.shibumi.telemetry/Service.qml @@ -15,7 +15,7 @@ Item { SuiteRuntime.Provider { id: runtimeProvider pluginId: "hancore.shibumi.telemetry" - implementationVersion: "0.1.1-beta.16.5" + implementationVersion: "0.1.1-beta.16.5.1" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.telemetry/manifest.json b/hancore.shibumi.telemetry/manifest.json index f916b2de..23df8d73 100644 --- a/hancore.shibumi.telemetry/manifest.json +++ b/hancore.shibumi.telemetry/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.telemetry", "name": "Shibumi Telemetry", - "version": "0.1.1-beta.16.5", + "version": "0.1.1-beta.16.5.1", "author": "HANCORE", "license": "MIT", "description": "Demand-driven CPU and memory telemetry shared by Shibumi widgets.", diff --git a/hancore.shibumi.temperature/manifest.json b/hancore.shibumi.temperature/manifest.json index 7057ca99..1a7a2e0e 100644 --- a/hancore.shibumi.temperature/manifest.json +++ b/hancore.shibumi.temperature/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.temperature", "name": "Shibumi Temperature", - "version": "0.1.1-beta.16.5", + "version": "0.1.1-beta.16.5.1", "author": "HANCORE", "license": "MIT", "description": "Demand-driven hardware temperature widget and sensor panel.", diff --git a/hancore.shibumi.update-center/Service.qml b/hancore.shibumi.update-center/Service.qml index 3124ff0d..ef1cbbe9 100644 --- a/hancore.shibumi.update-center/Service.qml +++ b/hancore.shibumi.update-center/Service.qml @@ -12,7 +12,7 @@ Item { property var manifest: null SuiteRuntime.Provider { pluginId: "hancore.shibumi.update-center" - implementationVersion: "0.1.1-beta.16.5" + implementationVersion: "0.1.1-beta.16.5.1" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.update-center/manifest.json b/hancore.shibumi.update-center/manifest.json index 44a476b5..2bc4f9f3 100644 --- a/hancore.shibumi.update-center/manifest.json +++ b/hancore.shibumi.update-center/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.update-center", "name": "Shibumi Update Center", - "version": "0.1.1-beta.16.5", + "version": "0.1.1-beta.16.5.1", "author": "HANCORE", "license": "MIT", "description": "Safe repository package and user theme update status for Shibumi.", diff --git a/hancore.shibumi.workspaces/WorkspaceService.qml b/hancore.shibumi.workspaces/WorkspaceService.qml index 60c24c80..2ede2688 100644 --- a/hancore.shibumi.workspaces/WorkspaceService.qml +++ b/hancore.shibumi.workspaces/WorkspaceService.qml @@ -14,7 +14,7 @@ Item { SuiteRuntime.Provider { id: runtimeProvider pluginId: "hancore.shibumi.workspaces" - implementationVersion: "0.1.1-beta.16.5" + implementationVersion: "0.1.1-beta.16.5.1" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.workspaces/manifest.json b/hancore.shibumi.workspaces/manifest.json index f07f5784..8c229745 100644 --- a/hancore.shibumi.workspaces/manifest.json +++ b/hancore.shibumi.workspaces/manifest.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "hancore.shibumi.workspaces", "name": "Shibumi Workspaces", - "version": "0.1.1-beta.16.5", + "version": "0.1.1-beta.16.5.1", "author": "HANCORE", "license": "MIT", "description": "Shared Hyprland workspace state with the Shibumi workspace presentation.", diff --git a/packaging/aur/.SRCINFO b/packaging/aur/.SRCINFO index e2cdfbe1..2ff4e876 100644 --- a/packaging/aur/.SRCINFO +++ b/packaging/aur/.SRCINFO @@ -1,6 +1,6 @@ pkgbase = shibumi-shell pkgdesc = Transactional Shibumi desktop shell plugins for Omarchy Quattro - pkgver = 0.1.1beta.16.5 + pkgver = 0.1.1beta.16.5.1 pkgrel = 1 url = https://github.com/HANCORE-linux/Shibumi-Shell arch = any @@ -30,7 +30,7 @@ pkgbase = shibumi-shell optdepends = btop: battery panel system monitor action optdepends = nvidia-utils: NVIDIA GPU telemetry optdepends = git: source-checkout diagnostics and migration - source = shibumi-shell-0.1.1-beta.16.5.tar.gz::https://github.com/HANCORE-linux/Shibumi-Shell/releases/download/v0.1.1-beta.16.5/shibumi-shell-0.1.1-beta.16.5.tar.gz - sha256sums = 2eac5b0c462dc4a7b3c3fcfa1fd457f3e31ac62ba5113d3c09f55ac0a9f299ce + source = shibumi-shell-0.1.1-beta.16.5.1.tar.gz::https://github.com/HANCORE-linux/Shibumi-Shell/releases/download/v0.1.1-beta.16.5.1/shibumi-shell-0.1.1-beta.16.5.1.tar.gz + sha256sums = 6a058cfbc8e4e83128a4d2bd815fae89e0a488320e078c2d40fb3dfc4091ce96 pkgname = shibumi-shell diff --git a/packaging/aur/PKGBUILD b/packaging/aur/PKGBUILD index 031b9660..3888fcf6 100644 --- a/packaging/aur/PKGBUILD +++ b/packaging/aur/PKGBUILD @@ -1,7 +1,7 @@ # Maintainer: HANCORE Linux pkgname=shibumi-shell -_upstream_version=0.1.1-beta.16.5 -_source_sha256=2eac5b0c462dc4a7b3c3fcfa1fd457f3e31ac62ba5113d3c09f55ac0a9f299ce +_upstream_version=0.1.1-beta.16.5.1 +_source_sha256=6a058cfbc8e4e83128a4d2bd815fae89e0a488320e078c2d40fb3dfc4091ce96 pkgver=${_upstream_version//-/} pkgrel=1 pkgdesc="Transactional Shibumi desktop shell plugins for Omarchy Quattro" diff --git a/packaging/package-metadata.json b/packaging/package-metadata.json index 618f4330..5be623f9 100644 --- a/packaging/package-metadata.json +++ b/packaging/package-metadata.json @@ -1,5 +1,5 @@ { "schemaVersion": 1, "packageName": "shibumi-shell", - "version": "0.1.1-beta.16.5" + "version": "0.1.1-beta.16.5.1" } diff --git a/scripts/check-aur-package b/scripts/check-aur-package index 53cb682a..acc469ff 100755 --- a/scripts/check-aur-package +++ b/scripts/check-aur-package @@ -46,7 +46,7 @@ jq -e '.schemaVersion == 1 "source-beta.14", "public-beta.14.1", "public-beta.15", "public-beta.15.1", "public-beta.15.2", "public-beta.15.3", "public-beta.15.4", "public-beta.16", "public-beta.16.1", "public-beta.16.2", "public-beta.16.3", "public-beta.16.4", - "public-beta.16.5" + "public-beta.16.5", "public-beta.16.5.1" ]' \ contracts/lifecycle-predecessors-v1.json >/dev/null grep -Fq 'contracts/lifecycle-predecessors-v1.json' "$pkgbuild" || { diff --git a/scripts/collect-release-evidence b/scripts/collect-release-evidence index 3dbf2e16..aebeec68 100755 --- a/scripts/collect-release-evidence +++ b/scripts/collect-release-evidence @@ -19,19 +19,24 @@ from typing import Any, Callable ROOT = Path(__file__).resolve().parents[1] -HOST_PROBE_MANIFEST = Path("contracts/baselines/omarchy-installed-package-v4.0.4.json") +HOST_PROBE_MANIFEST = Path("contracts/baselines/omarchy-installed-package-v4.0.6.json") def host_probe_expectations() -> tuple[tuple, dict[str, str]]: raw = (ROOT / HOST_PROBE_MANIFEST).read_bytes() manifest = json.loads(raw) - versions = {p["name"]: p["version"].rsplit("-", 1)[0] + versions = {p["name"]: p["version"] for p in [*manifest["provenance"]["packages"], manifest["quickshellPackage"]]} + # Reviewed package-to-binary mapping: the VCS pkgver suffix is not part of + # the binary's semantic version. Unknown packages require a new review. + binary_version = { + "0.3.2.r7.g2b4501a-1": "Quickshell 0.3.2 (revision 2b4501a282689792b62e94f3fb30d8f512324fe6, distributed by Omarchy)", + }[versions["quickshell"]] probes = ( - ("omarchyPackage", ("pacman", "-Q", "omarchy"), f"omarchy {versions['omarchy']}-"), - ("omarchySettingsPackage", ("pacman", "-Q", "omarchy-settings"), f"omarchy-settings {versions['omarchy-settings']}-"), - ("quickshellPackage", ("pacman", "-Q", "quickshell"), f"quickshell {versions['quickshell']}-"), - ("quickshellVersion", ("quickshell", "--version"), f"Quickshell {versions['quickshell']}"), + ("omarchyPackage", ("pacman", "-Q", "omarchy"), f"omarchy {versions['omarchy']}"), + ("omarchySettingsPackage", ("pacman", "-Q", "omarchy-settings"), f"omarchy-settings {versions['omarchy-settings']}"), + ("quickshellPackage", ("pacman", "-Q", "quickshell"), f"quickshell {versions['quickshell']}"), + ("quickshellVersion", ("quickshell", "--version"), binary_version), ) return probes, {"path": str(HOST_PROBE_MANIFEST), "sha256": hashlib.sha256(raw).hexdigest()} @@ -56,6 +61,10 @@ IDENTITY_FIELDS = ( EXTERNAL_BASELINES: tuple[tuple[str, Path], ...] = ( ( "SHIBUMI_INSTALLED_SOURCE_OMARCHY_PATH", + ROOT / "contracts/baselines/omarchy-installed-source-parity-v4.0.6.json", + ), + ( + "SHIBUMI_NATIVE_CATALOG_OMARCHY_PATH", ROOT / "contracts/baselines/omarchy-installed-source-parity-v4.0.4.json", ), ( @@ -838,7 +847,7 @@ def run_guarded_evidence_gate( def probe_host_identity( - name: str, command: tuple[str, ...], expected_prefix: str + name: str, command: tuple[str, ...], expected: str, *, exact: bool = True ) -> dict[str, Any]: try: result = subprocess.run( @@ -859,7 +868,9 @@ def probe_host_identity( "error": str(error), } output = (result.stdout or result.stderr).strip() - valid = result.returncode == 0 and output.startswith(expected_prefix) + valid = result.returncode == 0 and ( + output == expected if exact else output.startswith(expected) + ) return { "name": name, "command": list(command), @@ -871,13 +882,13 @@ def probe_host_identity( def probe_omarchy_package() -> dict[str, Any]: stable = probe_host_identity( - "omarchyPackage", ("pacman", "-Q", "omarchy"), "omarchy " + "omarchyPackage", ("pacman", "-Q", "omarchy"), "omarchy ", exact=False ) if stable["valid"]: return stable development = probe_host_identity( - "omarchyDevPackage", ("pacman", "-Q", "omarchy-dev"), "omarchy-dev " + "omarchyDevPackage", ("pacman", "-Q", "omarchy-dev"), "omarchy-dev ", exact=False ) if development["valid"]: # This is useful diagnostic evidence for development hosts, but it is diff --git a/scripts/generate-forward-baseline.py b/scripts/generate-forward-baseline.py index ed1d1b7d..284a3b94 100755 --- a/scripts/generate-forward-baseline.py +++ b/scripts/generate-forward-baseline.py @@ -66,4 +66,4 @@ def digest(data): print(json.dumps(dict(schemaVersion=2, id="forward-compat-" + revision[:8], profile="forward-compat", repository="https://github.com/basecamp/omarchy", sourceRevision=revision, provenance=dict(kind="git", revision=revision), - quickshellPackage=dict(name="quickshell", version="0.3.1-1"), subtrees=subtrees), indent=2)) + quickshellPackage=dict(name="quickshell", version="0.3.2.r7.g2b4501a-1"), subtrees=subtrees), indent=2)) diff --git a/scripts/shibumi_suite/cli.py b/scripts/shibumi_suite/cli.py index c0ff08bd..696c5fb1 100644 --- a/scripts/shibumi_suite/cli.py +++ b/scripts/shibumi_suite/cli.py @@ -358,18 +358,25 @@ def install_picker_menu_extension( source_path = stock_path stock_menu = read_extension(source_path) source_path = menu_path - payload = install_picker_routing(raw, stock_menu).encode("utf-8") + warnings: list[str] = [] + payload = install_picker_routing(raw, stock_menu, warnings=warnings).encode("utf-8") except MenuExtensionError as error: if isinstance(error, StockMenuError): source_path = stock_path + if not error.unparsable: + raise CliError(f"cannot update Omarchy menu {stock_path}: {error}") from error remedy = ( "restore the Omarchy stock menu, then retry the same command" + if isinstance(error, StockMenuError) and error.unparsable else + "check that the stock menu is readable, then retry the same command" if source_path == stock_path else "fix the JSONC syntax or routing markers in this regular file, then retry the same command" ) raise CliError(f"cannot update Omarchy menu {source_path}: {error}; {remedy}") from error transaction.write_menu_extension(payload) runtime.refresh_menu() + for warning in warnings: + print(f"shibumi-suite: warning: {stock_path}: {warning}", file=sys.stderr) previous = ( previous_state.get("menuExtension") if isinstance(previous_state, dict) else None diff --git a/scripts/shibumi_suite/menu_extension.py b/scripts/shibumi_suite/menu_extension.py index 2edb4111..a6a2a53e 100644 --- a/scripts/shibumi_suite/menu_extension.py +++ b/scripts/shibumi_suite/menu_extension.py @@ -11,6 +11,10 @@ class MenuExtensionError(RuntimeError): class StockMenuError(MenuExtensionError): """The host defaults, not the user's extension, failed validation.""" + def __init__(self, message: str, *, unparsable: bool = False): + super().__init__(message) + self.unparsable = unparsable + START_MARKER = "// shibumi-picker-routing-start" END_MARKER = "// shibumi-picker-routing-end" @@ -202,28 +206,41 @@ def remove_picker_routing(raw: str) -> str: return result -def install_picker_routing(raw: str | None, stock_menu: str | None = None) -> str: +def install_picker_routing( + raw: str | None, stock_menu: str | None = None, *, warnings: list[str] | None = None +) -> str: # Default actions are the stable host contract. The lifecycle supplies the # actual host menu so forward hosts retain their native theme-picker route. + base = raw if raw and raw.strip() else EMPTY_EXTENSION + base = remove_picker_routing(base) + decoded = _decoded(base) + family = "style" stock_actions = { - "style.theme": 'theme=$(omarchy-theme-switcher); [[ -n $theme ]] && omarchy-theme-set "$theme"', - "style.background": 'background=$(omarchy-theme-bg-switcher); [[ -n $background ]] && omarchy-theme-bg-set "$background"', + "theme": 'theme=$(omarchy-theme-switcher); [[ -n $theme ]] && omarchy-theme-set "$theme"', + "background": 'background=$(omarchy-theme-bg-switcher); [[ -n $background ]] && omarchy-theme-bg-set "$background"', } if stock_menu is not None: try: stock = _decoded(stock_menu) - stock = stock.get("items", stock) - for key in stock_actions: - entry = stock.get(key) if isinstance(stock, dict) else None - action = entry.get("action") if isinstance(entry, dict) else None - if not isinstance(action, str) or not action.strip(): - raise MenuExtensionError(f"Omarchy stock menu has no action for {key}") - stock_actions[key] = action except MenuExtensionError as error: - raise StockMenuError(str(error)) from error - base = raw if raw and raw.strip() else EMPTY_EXTENSION - base = remove_picker_routing(base) - decoded = _decoded(base) + raise StockMenuError(str(error), unparsable=True) from error + stock = stock.get("items", stock) + if isinstance(stock, dict) and "style.theme" in stock: + family = "style" + elif isinstance(stock, dict) and "appearance.theme" in stock: + family = "appearance" + else: + if warnings is not None: + warnings.append("stock menu has neither style.theme nor appearance.theme; picker routing skipped") + return base + for suffix in stock_actions: + key = f"{family}.{suffix}" + entry = stock.get(key) + action = entry.get("action") if isinstance(entry, dict) else None + if not isinstance(action, str) or not action.strip(): + raise StockMenuError(f"Omarchy stock menu has no action for {key} (family {family})") + stock_actions[suffix] = action + theme_key, background_key = f"{family}.theme", f"{family}.background" root_start, root_end = _root_object(base) items = decoded.get("items") target = _items_object(base, root_start, root_end) if isinstance(items, dict) else None @@ -247,17 +264,17 @@ def install_picker_routing(raw: str | None, stock_menu: str | None = None) -> st has_trailing_comma = cursor > target_start and untrimmed[cursor] == "," separator = indent + ",\n" if target_value and not has_trailing_comma else "" entries = { - "style.theme": { + theme_key: { "icon": "󰸌", "label": "Theme", "aliases": ["theme", "themes"], - "action": f'if [[ -x {ROUTER} ]]; then {ROUTER} theme; else {stock_actions["style.theme"]}; fi', + "action": f'if [[ -x {ROUTER} ]]; then {ROUTER} theme; else {stock_actions["theme"]}; fi', }, - "style.background": { + background_key: { "icon": "", "label": "Background", "aliases": ["background", "wallpaper"], - "action": f'if [[ -x {ROUTER} ]]; then {ROUTER} wallpaper; else {stock_actions["style.background"]}; fi', + "action": f'if [[ -x {ROUTER} ]]; then {ROUTER} wallpaper; else {stock_actions["background"]}; fi', }, } block = ( @@ -267,17 +284,17 @@ def install_picker_routing(raw: str | None, stock_menu: str | None = None) -> st + "\n" + separator + indent - + json.dumps("style.theme") + + json.dumps(theme_key) + ": " + json.dumps( - entries["style.theme"], ensure_ascii=False, separators=(",", ":") + entries[theme_key], ensure_ascii=False, separators=(",", ":") ) + ",\n" + indent - + json.dumps("style.background") + + json.dumps(background_key) + ": " + json.dumps( - entries["style.background"], + entries[background_key], ensure_ascii=False, separators=(",", ":"), ) diff --git a/tests/audio-native-backend-seam-regression.qml b/tests/audio-native-backend-seam-regression.qml index 2eedc419..b3eb36f9 100644 --- a/tests/audio-native-backend-seam-regression.qml +++ b/tests/audio-native-backend-seam-regression.qml @@ -174,7 +174,7 @@ ShellRoot { Audio.Service { id: service shell: serviceHost - manifest: ({id: "hancore.shibumi.audio", version: "0.1.1-beta.16.5", kinds: ["service"]}) + manifest: ({id: "hancore.shibumi.audio", version: "0.1.1-beta.16.5.1", kinds: ["service"]}) nativeBackendEnabled: true nativeBackendOverride: fakeBackend } diff --git a/tests/audio-runtime-smoke.qml b/tests/audio-runtime-smoke.qml index 8a70b9cd..89af44ce 100644 --- a/tests/audio-runtime-smoke.qml +++ b/tests/audio-runtime-smoke.qml @@ -11,7 +11,7 @@ ShellRoot { property var savedPanel: null property real originalRadius: 0 property var audioManifest: ({id: "hancore.shibumi.audio", - version: "0.1.1-beta.16.5", kinds: ["service", "bar-widget"]}) + version: "0.1.1-beta.16.5.1", kinds: ["service", "bar-widget"]}) function check(value, message) { if (value) return console.error("audio-runtime-smoke:", message) @@ -48,9 +48,9 @@ ShellRoot { SuiteRuntime.Provider { id: stateProvider pluginId: "hancore.shibumi.state" - implementationVersion: "0.1.1-beta.16.5" + implementationVersion: "0.1.1-beta.16.5.1" owner: tokenState - manifest: ({id: "hancore.shibumi.state", version: "0.1.1-beta.16.5", kinds: ["service"]}) + manifest: ({id: "hancore.shibumi.state", version: "0.1.1-beta.16.5.1", kinds: ["service"]}) } Fixtures.AudioRuntimeBackend { id: backend } Audio.Service { id: service; nativeBackendOverride: backend } diff --git a/tests/bar-catalog-consumer-smoke.qml b/tests/bar-catalog-consumer-smoke.qml index 5ab62d6e..2b6142ef 100644 --- a/tests/bar-catalog-consumer-smoke.qml +++ b/tests/bar-catalog-consumer-smoke.qml @@ -67,10 +67,10 @@ ShellRoot { SuiteRuntime.Provider { id: stateProvider pluginId: "hancore.shibumi.state" - implementationVersion: "0.1.1-beta.16.5" + implementationVersion: "0.1.1-beta.16.5.1" owner: stateService host: stateHost - manifest: ({ id: "hancore.shibumi.state", version: "0.1.1-beta.16.5", + manifest: ({ id: "hancore.shibumi.state", version: "0.1.1-beta.16.5.1", kinds: ["service"] }) } @@ -92,7 +92,7 @@ ShellRoot { id: fakePluginRegistry property string pluginId: "hancore.shibumi.bar" property var manifest: ({ id: "hancore.shibumi.bar", - version: "0.1.1-beta.16.5", kinds: ["bar"] }) + version: "0.1.1-beta.16.5.1", kinds: ["bar"] }) property bool enabled: true property var _entryPointUrl: null readonly property var installedPlugins: { @@ -138,11 +138,11 @@ ShellRoot { property int catalogReadSerial: currentObservation ? currentObservation.serial : 0 property int catalogGeneration: currentObservation ? currentObservation.generation : 0 property var providerManifest: ({ id: "hancore.shibumi.control-center", - version: "0.1.1-beta.16.5", kinds: ["service"] }) + version: "0.1.1-beta.16.5.1", kinds: ["service"] }) QtObject { id: serviceHost; property string pluginId: "hancore.shibumi.control-center" } SuiteRuntime.Provider { pluginId: "hancore.shibumi.control-center" - implementationVersion: "0.1.1-beta.16.5" + implementationVersion: "0.1.1-beta.16.5.1" owner: service host: serviceHost manifest: service.providerManifest @@ -192,7 +192,7 @@ ShellRoot { root.bar = barFactory.createObject(root, { omarchyPath: "/fixture/omarchy", shell: scopedBarHost, - manifest: ({ id: "hancore.shibumi.bar", version: "0.1.1-beta.16.5", + manifest: ({ id: "hancore.shibumi.bar", version: "0.1.1-beta.16.5.1", kinds: ["bar"] }), pluginRegistry: fakePluginRegistry, barWidgetRegistry: fakeWidgetRegistry, @@ -339,7 +339,7 @@ ShellRoot { } else if (root.stage === 4) { if (root.firstService.acquireCalls !== 2) return root.firstService.providerManifest = ({ id: "invalid", - version: "0.1.1-beta.16.5", kinds: ["service"] }) + version: "0.1.1-beta.16.5.1", kinds: ["service"] }) root.stage = 5; root.waits = 0 } else if (root.stage === 5) { if (root.firstService.releaseCalls !== 2) return diff --git a/tests/bar-switch-regression.py b/tests/bar-switch-regression.py index 12afe042..fe3b34d9 100644 --- a/tests/bar-switch-regression.py +++ b/tests/bar-switch-regression.py @@ -87,7 +87,10 @@ def main(): print("BAR_SWITCH_CLEANUP "+json.dumps({"removed":not base.exists()}), flush=True) rows = [json.loads(line.split("BAR_SWITCH_STEP ",1)[1]) for line in text.splitlines() if "BAR_SWITCH_STEP " in line] census = [json.loads(line.split("BAR_SWITCH_CENSUS ",1)[1]) for line in text.splitlines() if "BAR_SWITCH_CENSUS " in line] - allowed = r'^\s*(?:INFO: (?:Launching config:|Shell ID:|Saving logs to|Configuration Loaded)|WARN quickshell.qmlscanner: Module path contains invalid characters for a module name:|DEBUG qml: BAR_SWITCH_)' + # Quickshell 0.3.2 / Qt 6.12 (Omarchy 4.0.6) report the embedded native Ui color bindings as + # undefined while bars are created and torn down; the unchanged Beta 16.5 fixture shows the + # same three lines on that stack (hotfix 16.5.1, round 408 gate 16). + allowed = r'^\s*(?:INFO: (?:Launching config:|Shell ID:|Saving logs to|Configuration Loaded)|WARN quickshell.qmlscanner: Module path contains invalid characters for a module name:|DEBUG qml: BAR_SWITCH_|WARN scene: @Ui/(?:WidgetButton|Panel)\.qml\[\d+:\d+\]: Unable to assign \[undefined\] to QColor$)' unexpected = [line for line in text.splitlines() if line.strip() and not re.match(allowed,line)] assert result.returncode == 0 and "BAR_SWITCH_DONE" in text, "fixture failed" assert not unexpected, unexpected diff --git a/tests/bar-visibility-ipc-smoke.qml b/tests/bar-visibility-ipc-smoke.qml index d423c0b3..a0c307e0 100644 --- a/tests/bar-visibility-ipc-smoke.qml +++ b/tests/bar-visibility-ipc-smoke.qml @@ -60,7 +60,7 @@ ShellRoot { shell: fakeShell manifest: ({ id: "hancore.shibumi.bar", - version: "0.1.1-beta.16.5", + version: "0.1.1-beta.16.5.1", kinds: ["bar"] }) pluginRegistry: fakePluginRegistry diff --git a/tests/baseline-contract-regression.sh b/tests/baseline-contract-regression.sh index aa4fdc1f..3e587323 100755 --- a/tests/baseline-contract-regression.sh +++ b/tests/baseline-contract-regression.sh @@ -4,8 +4,10 @@ set -euo pipefail repo_root=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd) helper="$repo_root/tests/lib/baselines.sh" -installed_package_baseline="$repo_root/contracts/baselines/omarchy-installed-package-v4.0.4.json" -installed_source_baseline="$repo_root/contracts/baselines/omarchy-installed-source-parity-v4.0.4.json" +installed_package_baseline="$repo_root/contracts/baselines/omarchy-installed-package-v4.0.6.json" +installed_source_baseline="$repo_root/contracts/baselines/omarchy-installed-source-parity-v4.0.6.json" +native_package_baseline="$repo_root/contracts/baselines/omarchy-installed-package-v4.0.4.json" +native_source_baseline="$repo_root/contracts/baselines/omarchy-installed-source-parity-v4.0.4.json" previous_package_baseline="$repo_root/contracts/baselines/omarchy-installed-package-v4.0.3.json" previous_source_baseline="$repo_root/contracts/baselines/omarchy-installed-source-parity-v4.0.3.json" compat_package_baseline="$repo_root/contracts/baselines/omarchy-installed-package-v4.0.2.json" @@ -68,6 +70,8 @@ source "$helper" for manifest in \ "$installed_package_baseline" \ "$installed_source_baseline" \ + "$native_package_baseline" \ + "$native_source_baseline" \ "$repo_root/contracts/baselines/omarchy-installed-source-parity-v4.0.5.json" \ "$previous_package_baseline" \ "$previous_source_baseline" \ @@ -81,20 +85,20 @@ for manifest in \ done jq -e ' - .id == "installed-package-v4.0.4" + .id == "installed-package-v4.0.6" and .profile == "installed-package" - and .sourceRevision == "c668141e9c42b13c80c9ca4ea108e11708c5e8a5" + and .sourceRevision == "237f1b4071a0bff2296c6d740ba2b9fd695ebfa0" and .provenance.kind == "package" and ([.provenance.packages[] | [.name, .version]] | sort) == ([ - ["omarchy", "4.0.4-1"], - ["omarchy-settings", "4.0.4-1"] + ["omarchy", "4.0.6-1"], + ["omarchy-settings", "4.0.6-1"] ] | sort) and .provenance.subtreeOwners == { "bin": "omarchy", "config": "omarchy-settings", "shell": "omarchy" } - and .quickshellPackage == {"name": "quickshell", "version": "0.3.1-1"} + and .quickshellPackage == {"name": "quickshell", "version": "0.3.2.r7.g2b4501a-1"} and ([.subtrees[] | select(.path == "bin" and .entryPolicy == "absolute-symlinks")] | length) == 1 and all(.subtrees[] | select(.path != "bin"); .entryPolicy == "regular-files") ' "$installed_package_baseline" >/dev/null \ @@ -133,19 +137,25 @@ jq -e ' || fail 'historical source-parity baseline identity is invalid' jq -e ' - .id == "installed-source-parity-v4.0.4" + .id == "installed-source-parity-v4.0.6" and .profile == "installed-source-parity" - and .sourceRevision == "c668141e9c42b13c80c9ca4ea108e11708c5e8a5" + and .sourceRevision == "237f1b4071a0bff2296c6d740ba2b9fd695ebfa0" and .provenance.kind == "git" and .provenance.revision == .sourceRevision - and .quickshellPackage == {"name": "quickshell", "version": "0.3.1-1"} + and .quickshellPackage == {"name": "quickshell", "version": "0.3.2.r7.g2b4501a-1"} and all(.subtrees[]; .entryPolicy == "regular-files") ' "$installed_source_baseline" >/dev/null \ || fail 'installed-source-parity baseline identity or provenance is invalid' [[ $(sha256sum "$installed_package_baseline" | awk '{print $1}') \ + == 4a62fa1b0def2e1618ddca2696b12ba7e0d50e14ab00663722e88c3c9320b258 ]] \ + || fail 'Omarchy 4.0.6 installed-package manifest bytes drifted' +[[ $(sha256sum "$installed_source_baseline" | awk '{print $1}') \ + == 13b3309b6c3b3fea25f24a7e6cd259a01979052b884b3a7540ae1880f02c1469 ]] \ + || fail 'Omarchy 4.0.6 source-parity manifest bytes drifted' +[[ $(sha256sum "$native_package_baseline" | awk '{print $1}') \ == 9dfb421f339f282d762a1d0a000dc038bbe6f13e1b5f65c1f5e428d9522152c2 ]] \ || fail 'Omarchy 4.0.4 installed-package manifest bytes drifted' -[[ $(sha256sum "$installed_source_baseline" | awk '{print $1}') \ +[[ $(sha256sum "$native_source_baseline" | awk '{print $1}') \ == 96229f17b4c18a077f484c681d1331865a3558b8c27c19b3cafaf047f91042dc ]] \ || fail 'Omarchy 4.0.4 source-parity manifest bytes drifted' [[ $(sha256sum "$previous_package_baseline" | awk '{print $1}') \ @@ -181,7 +191,7 @@ for parity_subtree in shell config; do source_row=$(jq -c --arg path "$parity_subtree" \ '.subtrees[] | select(.path == $path)' "$installed_source_baseline") [[ $package_row == "$source_row" ]] \ - || fail "Omarchy 4.0.4 package/source parity drifted: $parity_subtree" + || fail "Omarchy 4.0.6 package/source parity drifted: $parity_subtree" done jq -e ' @@ -190,7 +200,7 @@ jq -e ' and .sourceRevision == "246f33a2fef66411c990860d88e0823ae83987fc" and .provenance.kind == "git" and .provenance.revision == .sourceRevision - and .quickshellPackage == {"name": "quickshell", "version": "0.3.1-1"} + and .quickshellPackage == {"name": "quickshell", "version": "0.3.2.r7.g2b4501a-1"} and all(.subtrees[]; .entryPolicy == "regular-files") ' "$forward_compat_baseline" >/dev/null \ || fail 'forward-compat baseline identity or provenance is invalid' @@ -308,7 +318,7 @@ shibumi_validate_omarchy_baseline_schema "$agents_fixture" \ || fail 'baseline replacement probe could not capture its initial snapshot' printf '{"sourceRevision":"replaced"}\n' >"$agents_fixture" [[ $(jq -r '.sourceRevision' "$agents_fixture") \ - == c668141e9c42b13c80c9ca4ea108e11708c5e8a5 ]] \ + == 237f1b4071a0bff2296c6d740ba2b9fd695ebfa0 ]] \ || fail 'baseline replacement changed an already accepted snapshot' if shibumi_validate_omarchy_baseline_schema \ "$agents_fixture" >/dev/null 2>&1; then diff --git a/tests/catalog-service-smoke.qml b/tests/catalog-service-smoke.qml index a37224ab..241d6352 100644 --- a/tests/catalog-service-smoke.qml +++ b/tests/catalog-service-smoke.qml @@ -62,7 +62,7 @@ Scope { } } function manifest(valid) { - return {id: "hancore.shibumi.control-center", version: valid ? "0.1.1-beta.16.5" : "invalid", + return {id: "hancore.shibumi.control-center", version: valid ? "0.1.1-beta.16.5.1" : "invalid", kinds: ["service", "bar-widget"]} } function changedCatalogOutput() { diff --git a/tests/contract-regression.sh b/tests/contract-regression.sh index 5bb71693..bbb1448a 100755 --- a/tests/contract-regression.sh +++ b/tests/contract-regression.sh @@ -1,6 +1,7 @@ #!/usr/bin/env bash set -euo pipefail +export QT_FORCE_STDERR_LOGGING=1 repo_root=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd) source "$repo_root/tests/lib/baselines.sh" diff --git a/tests/core-services-smoke.qml b/tests/core-services-smoke.qml index 08611fcb..54138f3a 100644 --- a/tests/core-services-smoke.qml +++ b/tests/core-services-smoke.qml @@ -20,14 +20,14 @@ ShellRoot { id: telemetry shell: fakeShell thermalProbeEnabled: false - manifest: ({id: "hancore.shibumi.telemetry", version: "0.1.1-beta.16.5", kinds: ["service"]}) + manifest: ({id: "hancore.shibumi.telemetry", version: "0.1.1-beta.16.5.1", kinds: ["service"]}) } Cpu.Service { id: cpu shell: fakeShell gpuProbeEnabled: false - manifest: ({id: "hancore.shibumi.cpu", version: "0.1.1-beta.16.5", kinds: ["service"]}) + manifest: ({id: "hancore.shibumi.cpu", version: "0.1.1-beta.16.5.1", kinds: ["service"]}) } QtObject { @@ -40,7 +40,7 @@ ShellRoot { PowerState.Service { id: power shell: fakeShell - manifest: ({id: "hancore.shibumi.power-state", version: "0.1.1-beta.16.5", kinds: ["service"]}) + manifest: ({id: "hancore.shibumi.power-state", version: "0.1.1-beta.16.5.1", kinds: ["service"]}) batterySnapshotOverride: ({ready: false}) commandOverrides: ({}) // This pure projection smoke may never launch helpers. } diff --git a/tests/fixtures/native-runtime/catalog-resource-probe.py b/tests/fixtures/native-runtime/catalog-resource-probe.py index 6ec1cb00..00b49b6f 100644 --- a/tests/fixtures/native-runtime/catalog-resource-probe.py +++ b/tests/fixtures/native-runtime/catalog-resource-probe.py @@ -30,9 +30,9 @@ RELEASE_QUIET_SECONDS = 5.2 COLD_INITIALIZATION_CYCLES = 3 WARM_CYCLES = 3 -# The 512 KiB warm-state allowance is unchanged. Cold reconstruction is measured -# separately, and the third cold-cycle sample becomes the warm-state baseline. -PSS_GROWTH_CEILING_KIB = 512 +# The reviewed 768 KiB warm-state allowance matches the resource wrapper. +# Cold reconstruction is separate; the third cold sample is the warm baseline. +PSS_GROWTH_CEILING_KIB = 768 # Warm acquisitions include the host and every observed acquisition descendant. # The allowance leaves headroom over calibrated positives but rejects a 1s burn # in either QML or the launcher/custodian/IPC tree. diff --git a/tests/fixtures/native-runtime/probe.py b/tests/fixtures/native-runtime/probe.py index 52511183..0d0d3f19 100644 --- a/tests/fixtures/native-runtime/probe.py +++ b/tests/fixtures/native-runtime/probe.py @@ -132,7 +132,7 @@ def catalog_probe(): "actual native catalog identity DTO mismatch") control = ready["snapshot"]["byId"]["hancore.shibumi.control-center"] check(control["description"] and control["author"] == "HANCORE" - and control["version"] == "0.1.1-beta.16.5" + and control["version"] == "0.1.1-beta.16.5.1" and control["barWidget"]["defaultSection"] == "left", "package-bound catalog presentation metadata was lost") check(host_config() == original, "read-only catalog changed native config") diff --git a/tests/fixtures/release-predecessor.json b/tests/fixtures/release-predecessor.json index b7c9ab76..46325380 100644 --- a/tests/fixtures/release-predecessor.json +++ b/tests/fixtures/release-predecessor.json @@ -1,11 +1,11 @@ { "schemaVersion": 1, - "version": "0.1.1-beta.16.4", - "tag": "v0.1.1-beta.16.4", - "revision": "64b9369559b0de2ffdc1faf1c563326c8173035c", - "payloadDigest": "bc60b476803f72d5604e592647db7f50c1f00723b986ae87e7730cba79779d34", - "releaseId": 413874192, - "releaseUrl": "https://github.com/HANCORE-linux/Shibumi-Shell/releases/tag/v0.1.1-beta.16.4", - "publishedAt": "2026-10-15T13:55:25Z", + "version": "0.1.1-beta.16.5", + "tag": "v0.1.1-beta.16.5", + "revision": "8b34d030a303aa35d6033923c8f3c38c4c25b29b", + "payloadDigest": "a090b82858c554f02d44030755f779b2827ae51e55bca750b7163d5b330472dd", + "releaseId": 420819799, + "releaseUrl": "https://github.com/HANCORE-linux/Shibumi-Shell/releases/tag/v0.1.1-beta.16.5", + "publishedAt": "2026-10-22T14:24:11Z", "prerelease": true } diff --git a/tests/gpu-selection-state-smoke.qml b/tests/gpu-selection-state-smoke.qml index e2004fde..451598df 100644 --- a/tests/gpu-selection-state-smoke.qml +++ b/tests/gpu-selection-state-smoke.qml @@ -25,13 +25,13 @@ ShellRoot { id: stateService shell: fakeShell omarchyPath: Quickshell.env("OMARCHY_PATH") - manifest: ({id: "hancore.shibumi.state", version: "0.1.1-beta.16.5", kinds: ["service"]}) + manifest: ({id: "hancore.shibumi.state", version: "0.1.1-beta.16.5.1", kinds: ["service"]}) } Cpu.Service { id: cpuService shell: fakeShell - manifest: ({id: "hancore.shibumi.cpu", version: "0.1.1-beta.16.5", kinds: ["service"]}) + manifest: ({id: "hancore.shibumi.cpu", version: "0.1.1-beta.16.5.1", kinds: ["service"]}) gpuProbeEnabled: false } diff --git a/tests/host-registry-prime-smoke.qml b/tests/host-registry-prime-smoke.qml index 5163ac47..dbae3330 100644 --- a/tests/host-registry-prime-smoke.qml +++ b/tests/host-registry-prime-smoke.qml @@ -50,11 +50,11 @@ ShellRoot { Shared.Provider { id: stateProvider pluginId: "hancore.shibumi.state" - implementationVersion: "0.1.1-beta.16.5" + implementationVersion: "0.1.1-beta.16.5.1" owner: stateOwner host: stateHost manifest: ({ id: "hancore.shibumi.state", - version: "0.1.1-beta.16.5", kinds: ["service"] }) + version: "0.1.1-beta.16.5.1", kinds: ["service"] }) } QtObject { @@ -77,11 +77,11 @@ ShellRoot { } Shared.Provider { pluginId: "hancore.shibumi.bar" - implementationVersion: "0.1.1-beta.16.5" + implementationVersion: "0.1.1-beta.16.5.1" owner: owner host: owner.providerHost manifest: ({ id: "hancore.shibumi.bar", - version: "0.1.1-beta.16.5", kinds: ["bar"] }) + version: "0.1.1-beta.16.5.1", kinds: ["bar"] }) } } } diff --git a/tests/lib/baselines.sh b/tests/lib/baselines.sh index 7adc91c0..b612d97d 100644 --- a/tests/lib/baselines.sh +++ b/tests/lib/baselines.sh @@ -170,7 +170,11 @@ shibumi_validate_omarchy_baseline_schema() { || shibumi_baseline_fail \ "baseline provenance must be an object: $manifest" || return jq -e ' - if .id == "installed-package-v4.0.4" + if .id == "installed-package-v4.0.6" + or .id == "installed-source-parity-v4.0.6" + or .id == "forward-compat-246f33a2" then + .quickshellPackage == {"name": "quickshell", "version": "0.3.2.r7.g2b4501a-1"} + elif .id == "installed-package-v4.0.4" or .id == "installed-source-parity-v4.0.4" or .id == "installed-source-parity-v4.0.5" or .id == "installed-package-v4.0.3" @@ -180,8 +184,7 @@ shibumi_validate_omarchy_baseline_schema() { or .id == "forward-compat-ed7bae4a" or .id == "forward-compat-50d687a1" or .id == "forward-compat-e71a816e" - or .id == "forward-compat-4c1b4cb3" - or .id == "forward-compat-246f33a2" then + or .id == "forward-compat-4c1b4cb3" then .quickshellPackage == {"name": "quickshell", "version": "0.3.1-1"} elif .id == "installed-package-v4.0.0" or .id == "installed-source-parity-v4.0.0" then @@ -251,7 +254,8 @@ shibumi_validate_omarchy_baseline_schema() { case $profile in installed-package) jq -e ' - if .id == "installed-package-v4.0.4" + if .id == "installed-package-v4.0.6" + or .id == "installed-package-v4.0.4" or .id == "installed-package-v4.0.3" or .id == "installed-package-v4.0.2" then .provenance.kind == "package" @@ -557,7 +561,8 @@ shibumi_validate_installed_package_provenance() { shibumi_validate_omarchy_baseline_schema "$requested_manifest" || return fi [[ $(jq -r '.profile' "$requested_manifest") == installed-package \ - && ( $(jq -r '.id' "$requested_manifest") == installed-package-v4.0.4 \ + && ( $(jq -r '.id' "$requested_manifest") == installed-package-v4.0.6 \ + || $(jq -r '.id' "$requested_manifest") == installed-package-v4.0.4 \ || $(jq -r '.id' "$requested_manifest") == installed-package-v4.0.3 \ || $(jq -r '.id' "$requested_manifest") == installed-package-v4.0.2 ) ]] \ || shibumi_baseline_fail \ @@ -705,16 +710,30 @@ shibumi_validate_agents_baseline() { SHIBUMI_VALIDATED_OMARCHY_BASELINE=$canonical_manifest } +# Native catalog fixtures retain the historical source, not its old host package. +# Validate its complete source tree without asserting historical Quickshell provenance. +shibumi_load_native_catalog_baseline() { + local manifest="$shibumi_baseline_repo_root/contracts/baselines/omarchy-installed-source-parity-v4.0.4.json" + local requested_path=${SHIBUMI_NATIVE_CATALOG_OMARCHY_PATH:-} + shibumi_preflight_clean_git_checkout "$requested_path" \ + c668141e9c42b13c80c9ca4ea108e11708c5e8a5 native-catalog || return + shibumi_validate_omarchy_tree "$requested_path" "$manifest" || return + SHIBUMI_NATIVE_CATALOG_OMARCHY_PATH=$SHIBUMI_VALIDATED_OMARCHY_PATH + export SHIBUMI_NATIVE_CATALOG_OMARCHY_PATH +} + shibumi_load_omarchy_baseline() { shibumi_require_baseline_tools || return local profile=${SHIBUMI_OMARCHY_BASELINE_PROFILE:-installed-package} - local baseline_version=${SHIBUMI_OMARCHY_BASELINE_VERSION:-4.0.4} + local baseline_version=${SHIBUMI_OMARCHY_BASELINE_VERSION:-4.0.6} local requested_path manifest case $profile in installed-package) requested_path=/usr/share/omarchy case $baseline_version in + 4.0.6) + manifest="$shibumi_baseline_repo_root/contracts/baselines/omarchy-installed-package-v4.0.6.json" ;; 4.0.4) manifest="$shibumi_baseline_repo_root/contracts/baselines/omarchy-installed-package-v4.0.4.json" ;; 4.0.3) @@ -733,6 +752,8 @@ shibumi_load_omarchy_baseline() { || shibumi_baseline_fail \ 'OMARCHY_PATH is required for installed-source-parity' || return case $baseline_version in + 4.0.6) + manifest="$shibumi_baseline_repo_root/contracts/baselines/omarchy-installed-source-parity-v4.0.6.json" ;; 4.0.5) manifest="$shibumi_baseline_repo_root/contracts/baselines/omarchy-installed-source-parity-v4.0.5.json" ;; 4.0.4) diff --git a/tests/lib/qs-runner.sh b/tests/lib/qs-runner.sh index 87b82f6a..f06d7efb 100644 --- a/tests/lib/qs-runner.sh +++ b/tests/lib/qs-runner.sh @@ -24,6 +24,7 @@ env = dict(os.environ) if entries and entries[0] == '-i': env = {}; entries = entries[1:] env.update(entry.split('=', 1) for entry in entries) +env['QT_FORCE_STDERR_LOGGING'] = '1' source = fixture.parent if fixture.name == 'shell.qml' else fixture command = [sys.argv[5], '-p', str(source), *sys.argv[7 + count:]] signal.signal(signal.SIGTERM, signal.default_int_handler) diff --git a/tests/media-spectrum-service-smoke.qml b/tests/media-spectrum-service-smoke.qml index d00f345d..e5e78cb6 100644 --- a/tests/media-spectrum-service-smoke.qml +++ b/tests/media-spectrum-service-smoke.qml @@ -48,7 +48,7 @@ ShellRoot { Media.Service { id: spectrum shell: fakeShell - manifest: ({id: "hancore.shibumi.media", version: "0.1.1-beta.16.5", kinds: ["service", "bar-widget"]}) + manifest: ({id: "hancore.shibumi.media", version: "0.1.1-beta.16.5.1", kinds: ["service", "bar-widget"]}) } Timer { diff --git a/tests/native-catalog-resource-contract.py b/tests/native-catalog-resource-contract.py index d53ca2f3..c6179d0c 100644 --- a/tests/native-catalog-resource-contract.py +++ b/tests/native-catalog-resource-contract.py @@ -56,7 +56,7 @@ def measurement_output(cold=None, warm=None): "maximumPssOverBaselineKiB": 2, "pssKiB": [129, 132, 131], "requestSerials": [6, 7, 8], - "unchangedCeilingKiB": 512, + "unchangedCeilingKiB": 768, } if cold is not None: cold_record = cold @@ -90,7 +90,7 @@ def test_three_plus_three_parser_rejects_ambiguous_numbers_and_serials(self): warm["baselinePssKiB"] = 130.0 cases.append(("float warm baseline", measurement_output(warm=warm))) warm = copy.deepcopy(base_warm) - warm["unchangedCeilingKiB"] = 512.0 + warm["unchangedCeilingKiB"] = 768.0 cases.append(("float ceiling", measurement_output(warm=warm))) cold = copy.deepcopy(base_cold) cold.update({ diff --git a/tests/native-catalog-resource-regression.py b/tests/native-catalog-resource-regression.py index f8cb9aee..6f98f4b4 100644 --- a/tests/native-catalog-resource-regression.py +++ b/tests/native-catalog-resource-regression.py @@ -34,7 +34,9 @@ EXPECTED_NATIVE_FINGERPRINT = "2cd0ffb0c38f31868e28c3556f0efc530f4fcd04765856ec157bc070eac748a0" BETA13_COMMIT = "2760cdb8272255790d5e4613fed8a48cb63c3555" BETA13_VERSION = "0.1.1-beta.13" -PSS_GROWTH_CEILING_KIB = 512 +# Maintainer-reviewed host maintenance, 22/23 Oct 2026: old stack 400 KiB; +# new stack tag 448, candidate 508/552 KiB (408-evidence/gate11-* and collector-gate11). +PSS_GROWTH_CEILING_KIB = 768 MAX_GIT_ARCHIVE_BYTES = 16 * 1024 * 1024 MAX_GIT_BLOB_BYTES = 1024 * 1024 MAX_GIT_DIAGNOSTIC_BYTES = 64 * 1024 @@ -490,12 +492,16 @@ def main(): args = parser.parse_args() native_shell = args.native_shell if native_shell is None: - installed_source = os.environ.get("SHIBUMI_INSTALLED_SOURCE_OMARCHY_PATH") - if not installed_source: + native_source = os.environ.get("SHIBUMI_NATIVE_CATALOG_OMARCHY_PATH") + if not native_source: parser.error( - "--native-shell or SHIBUMI_INSTALLED_SOURCE_OMARCHY_PATH is required" + "--native-shell or SHIBUMI_NATIVE_CATALOG_OMARCHY_PATH is required" ) - native_shell = Path(installed_source) / "shell" + subprocess.run([ + "bash", "-c", 'source "$1"; shibumi_load_native_catalog_baseline', + "native-catalog-baseline", str(ROOT / "tests/lib/baselines.sh"), + ], check=True, timeout=30) + native_shell = Path(native_source) / "shell" native = load_native_runner() admitted = native.admitted_native(native_shell) diff --git a/tests/omarchy-installed-package-contract-regression.sh b/tests/omarchy-installed-package-contract-regression.sh index 25dcc990..0e71c0ec 100755 --- a/tests/omarchy-installed-package-contract-regression.sh +++ b/tests/omarchy-installed-package-contract-regression.sh @@ -4,7 +4,7 @@ set -euo pipefail repo_root=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd) export SHIBUMI_OMARCHY_BASELINE_PROFILE=installed-package -export SHIBUMI_OMARCHY_BASELINE_VERSION=4.0.4 +export SHIBUMI_OMARCHY_BASELINE_VERSION=4.0.6 export OMARCHY_PATH=/usr/share/omarchy exec "$repo_root/tests/contract-regression.sh" diff --git a/tests/omarchy-installed-source-parity-contract-regression.sh b/tests/omarchy-installed-source-parity-contract-regression.sh index 1ed78e69..bb27bd73 100755 --- a/tests/omarchy-installed-source-parity-contract-regression.sh +++ b/tests/omarchy-installed-source-parity-contract-regression.sh @@ -12,7 +12,7 @@ if [[ $source_path != /* || ! -d $source_path ]]; then fi export SHIBUMI_OMARCHY_BASELINE_PROFILE=installed-source-parity -export SHIBUMI_OMARCHY_BASELINE_VERSION=4.0.4 +export SHIBUMI_OMARCHY_BASELINE_VERSION=4.0.6 export OMARCHY_PATH=$source_path exec "$repo_root/tests/contract-regression.sh" diff --git a/tests/panel-window-geometry-regression.sh b/tests/panel-window-geometry-regression.sh index 2a05674c..758d370e 100755 --- a/tests/panel-window-geometry-regression.sh +++ b/tests/panel-window-geometry-regression.sh @@ -25,7 +25,8 @@ elif [[ $SHIBUMI_OMARCHY_SOURCE_REVISION == 4c1b4cb3a94447aff39af98e2fcc0490a9fb keyboard_panel_sha=b7243c0397608a0a2a2dc2a3202a88c1e4b4b35d8da37895a1db8993422ce36f elif [[ $SHIBUMI_OMARCHY_SOURCE_REVISION == 246f33a2fef66411c990860d88e0823ae83987fc ]]; then keyboard_panel_sha=7a5dc2284b1990b2bf53a806221458c6a64ea538cb92b4787dca846c7cc33a54 -elif [[ $SHIBUMI_OMARCHY_SOURCE_REVISION == 94a8fbc2d67eec5673c7f16b8c5e8a9c8452ffdc ]]; then +elif [[ $SHIBUMI_OMARCHY_SOURCE_REVISION == 94a8fbc2d67eec5673c7f16b8c5e8a9c8452ffdc \ + || $SHIBUMI_OMARCHY_SOURCE_REVISION == 237f1b4071a0bff2296c6d740ba2b9fd695ebfa0 ]]; then keyboard_panel_sha=c8b3b0fd52d8a79469675e925ff851e1dd0588eb1eeb90bd4df004a4c7d72a0a fi [[ $(sha256sum "$keyboard_panel" | awk '{print $1}') == "$keyboard_panel_sha" ]] \ diff --git a/tests/plugin-update-service-smoke.qml b/tests/plugin-update-service-smoke.qml index a8e8efa5..76810f6d 100644 --- a/tests/plugin-update-service-smoke.qml +++ b/tests/plugin-update-service-smoke.qml @@ -209,7 +209,7 @@ ShellRoot { if (service.available || service.check(true)) return root.fail("scoped update worker started before manifest admission") service.manifest = {id: "hancore.shibumi.control-center", - version: "0.1.1-beta.16.5", kinds: ["service", "bar-widget"]} + version: "0.1.1-beta.16.5.1", kinds: ["service", "bar-widget"]} root.phase++ root.ticks = 0 return diff --git a/tests/power-deferred-smoke.qml b/tests/power-deferred-smoke.qml index 4283cf87..42e93461 100644 --- a/tests/power-deferred-smoke.qml +++ b/tests/power-deferred-smoke.qml @@ -57,7 +57,7 @@ ShellRoot { PowerState.Service { id: power shell: host - manifest: root.allowed ? ({id: "hancore.shibumi.power-state", version: "0.1.1-beta.16.5", kinds: ["service"]}) : null + manifest: root.allowed ? ({id: "hancore.shibumi.power-state", version: "0.1.1-beta.16.5.1", kinds: ["service"]}) : null batterySnapshotOverride: battery commandOverrides: ({ profiles: ["/usr/bin/python3", "-I", root.helper, root.directory, "profiles"], diff --git a/tests/power-runtime-smoke.qml b/tests/power-runtime-smoke.qml index be4ad386..9b68442a 100644 --- a/tests/power-runtime-smoke.qml +++ b/tests/power-runtime-smoke.qml @@ -24,7 +24,7 @@ ShellRoot { readonly property var power: serviceLoader.item readonly property string fixturePath: Quickshell.env("SHIBUMI_POWER_SCOPE_DIR") readonly property string helper: decodeURIComponent(String(Qt.resolvedUrl("fixtures/power-runtime-helper.py")).substring(7)) - readonly property var validManifest: ({ id: "hancore.shibumi.power-state", version: "0.1.1-beta.16.5", kinds: ["service"], entryPoints: { service: "Service.qml" } }) + readonly property var validManifest: ({ id: "hancore.shibumi.power-state", version: "0.1.1-beta.16.5.1", kinds: ["service"], entryPoints: { service: "Service.qml" } }) readonly property var fakeCommands: ({ profiles: ["/usr/bin/python3", "-I", helper, fixturePath, "profiles"], activeProfile: ["/usr/bin/python3", "-I", helper, fixturePath, "activeProfile"], @@ -55,10 +55,10 @@ ShellRoot { } SuiteRuntime.Provider { pluginId: "hancore.shibumi.state" - implementationVersion: "0.1.1-beta.16.5" + implementationVersion: "0.1.1-beta.16.5.1" owner: state host: root.stateEnabled ? stateHost : null - manifest: ({ id: "hancore.shibumi.state", version: "0.1.1-beta.16.5", kinds: ["service"] }) + manifest: ({ id: "hancore.shibumi.state", version: "0.1.1-beta.16.5.1", kinds: ["service"] }) } QtObject { id: battery diff --git a/tests/power-service-runtime-smoke.qml b/tests/power-service-runtime-smoke.qml index 6cab4eaa..e19ed49a 100644 --- a/tests/power-service-runtime-smoke.qml +++ b/tests/power-service-runtime-smoke.qml @@ -14,7 +14,7 @@ ShellRoot { PowerState.Service { id: power shell: scopedHost - manifest: ({ id: "hancore.shibumi.power-state", version: "0.1.1-beta.16.5", + manifest: ({ id: "hancore.shibumi.power-state", version: "0.1.1-beta.16.5.1", kinds: ["service"], entryPoints: { service: "Service.qml" } }) batterySnapshotOverride: ({ ready: false }) commandOverrides: ({ diff --git a/tests/quattro-contract-regression.sh b/tests/quattro-contract-regression.sh index bbe05a0e..c6a67aa9 100755 --- a/tests/quattro-contract-regression.sh +++ b/tests/quattro-contract-regression.sh @@ -104,7 +104,7 @@ for needle in \ done case $SHIBUMI_OMARCHY_SOURCE_REVISION in - 0534987009061cbe2dacdde4ad564092ab698d12|c668141e9c42b13c80c9ca4ea108e11708c5e8a5|94a8fbc2d67eec5673c7f16b8c5e8a9c8452ffdc|50d687a1f27063513cf42e6f33c3a4fcb17c24ed|e71a816e9032f040225e086c7256f73e8080ae45|4c1b4cb3a94447aff39af98e2fcc0490a9fb32e7|246f33a2fef66411c990860d88e0823ae83987fc) + 0534987009061cbe2dacdde4ad564092ab698d12|c668141e9c42b13c80c9ca4ea108e11708c5e8a5|94a8fbc2d67eec5673c7f16b8c5e8a9c8452ffdc|237f1b4071a0bff2296c6d740ba2b9fd695ebfa0|50d687a1f27063513cf42e6f33c3a4fcb17c24ed|e71a816e9032f040225e086c7256f73e8080ae45|4c1b4cb3a94447aff39af98e2fcc0490a9fb32e7|246f33a2fef66411c990860d88e0823ae83987fc) for needle in \ 'target.shell = shell.pluginShellFor(manifest)' \ 'target.manifest = shell.publicPluginManifest(manifest)' \ diff --git a/tests/reactor-plugin-smoke.qml b/tests/reactor-plugin-smoke.qml index 02decf99..369350fa 100644 --- a/tests/reactor-plugin-smoke.qml +++ b/tests/reactor-plugin-smoke.qml @@ -76,7 +76,7 @@ ShellRoot { Audio.Service { id: fakeAudio shell: fakeShell - manifest: ({id: "hancore.shibumi.audio", version: "0.1.1-beta.16.5", kinds: ["service"]}) + manifest: ({id: "hancore.shibumi.audio", version: "0.1.1-beta.16.5.1", kinds: ["service"]}) nativeBackendEnabled: false } @@ -115,7 +115,7 @@ ShellRoot { Reactor.Service { id: reactorService - manifest: ({id: "hancore.shibumi.reactor", version: "0.1.1-beta.16.5", kinds: ["service"]}) + manifest: ({id: "hancore.shibumi.reactor", version: "0.1.1-beta.16.5.1", kinds: ["service"]}) shell: fakeShell runtimeProbesEnabled: false } diff --git a/tests/reactor-runtime-smoke.qml b/tests/reactor-runtime-smoke.qml index c7539665..84ec5dfe 100644 --- a/tests/reactor-runtime-smoke.qml +++ b/tests/reactor-runtime-smoke.qml @@ -16,7 +16,7 @@ ShellRoot { property int beforeLoss: 0 property var cachedMode: null property var cachedTest: null - readonly property var manifest: ({id: "hancore.shibumi.reactor", version: "0.1.1-beta.16.5", kinds: ["service"]}) + readonly property var manifest: ({id: "hancore.shibumi.reactor", version: "0.1.1-beta.16.5.1", kinds: ["service"]}) function check(value, message) { if (value) return console.error("reactor-runtime:", message) @@ -44,14 +44,14 @@ ShellRoot { property bool outputMuted: true } SuiteRuntime.Provider { - pluginId: "hancore.shibumi.state"; implementationVersion: "0.1.1-beta.16.5" + pluginId: "hancore.shibumi.state"; implementationVersion: "0.1.1-beta.16.5.1" owner: state; host: root.stateEnabled ? stateHost : null - manifest: ({id: "hancore.shibumi.state", version: "0.1.1-beta.16.5", kinds: ["service"]}) + manifest: ({id: "hancore.shibumi.state", version: "0.1.1-beta.16.5.1", kinds: ["service"]}) } SuiteRuntime.Provider { - pluginId: "hancore.shibumi.audio"; implementationVersion: "0.1.1-beta.16.5" + pluginId: "hancore.shibumi.audio"; implementationVersion: "0.1.1-beta.16.5.1" owner: audio; host: root.audioEnabled ? audioHost : null - manifest: ({id: "hancore.shibumi.audio", version: "0.1.1-beta.16.5", kinds: ["service"]}) + manifest: ({id: "hancore.shibumi.audio", version: "0.1.1-beta.16.5.1", kinds: ["service"]}) } Reactor.Service { id: service; runtimeProbesEnabled: false } Reactor.Service { id: duplicate; runtimeProbesEnabled: false } diff --git a/tests/scoped-state-regression.qml b/tests/scoped-state-regression.qml index 243b0d63..1372c3a5 100644 --- a/tests/scoped-state-regression.qml +++ b/tests/scoped-state-regression.qml @@ -36,7 +36,7 @@ ShellRoot { id: state shell: host omarchyPath: Quickshell.env("OMARCHY_PATH") - manifest: ({ id: "hancore.shibumi.state", version: "0.1.1-beta.16.5", + manifest: ({ id: "hancore.shibumi.state", version: "0.1.1-beta.16.5.1", kinds: ["service"], __sourceDir: Quickshell.env("DECOY_MARKER_DIR") }) } BarProbe.Marker { diff --git a/tests/shared-runtime-regression.qml b/tests/shared-runtime-regression.qml index fe366056..ae3f13a9 100644 --- a/tests/shared-runtime-regression.qml +++ b/tests/shared-runtime-regression.qml @@ -54,7 +54,7 @@ ShellRoot { id: state shell: stateApi omarchyPath: Quickshell.env("OMARCHY_PATH") - manifest: ({id: "hancore.shibumi.state", version: "0.1.1-beta.16.5", kinds: ["service"]}) + manifest: ({id: "hancore.shibumi.state", version: "0.1.1-beta.16.5.1", kinds: ["service"]}) } BarProbe.Marker { id: markerBar } Item { @@ -66,10 +66,10 @@ ShellRoot { Shared.Provider { id: barProvider pluginId: "hancore.shibumi.bar" - implementationVersion: "0.1.1-beta.16.5" + implementationVersion: "0.1.1-beta.16.5.1" owner: barOwner host: barOwner.injectedHost - manifest: ({id: "hancore.shibumi.bar", version: "0.1.1-beta.16.5", kinds: ["bar"]}) + manifest: ({id: "hancore.shibumi.bar", version: "0.1.1-beta.16.5.1", kinds: ["bar"]}) } } Shared.HostShell { id: client; host: stateApi } @@ -82,7 +82,7 @@ ShellRoot { property int value: 0 Shared.Provider { pluginId: "hancore.shibumi.audio" - implementationVersion: "0.1.1-beta.16.5" + implementationVersion: "0.1.1-beta.16.5.1" owner: peer host: peer.injectedHost manifest: peer.injectedManifest @@ -152,7 +152,7 @@ ShellRoot { check(left.state === null && right.state === null && !state.ready && !state.writePending, "version drift retained State authority or queued intent") check(!state.setGroupSetting("G4", "compact", true), "revoked State accepted intent") - state.manifest = {id: "hancore.shibumi.state", version: "0.1.1-beta.16.5", kinds: ["service"]} + state.manifest = {id: "hancore.shibumi.state", version: "0.1.1-beta.16.5.1", kinds: ["service"]} check(left.state === state && Shared.Runtime._selected("hancore.shibumi.state") !== oldLease, "State did not register a new lifetime") Shared.Runtime.unregisterProvider(oldLease) @@ -161,10 +161,10 @@ ShellRoot { check(first !== null && client.serviceFor("hancore.shibumi.audio") === null, "parentless service published before injection") first.injectedHost = audioApi - first.injectedManifest = {id: "hancore.shibumi.audio", version: "0.1.1-beta.16.5", kinds: ["service"]} + first.injectedManifest = {id: "hancore.shibumi.audio", version: "0.1.1-beta.16.5.1", kinds: ["service"]} check(client.serviceFor("hancore.shibumi.audio") === first, "provider registration failed") second = serviceFactory.createObject(null, {injectedHost: audioApi, - injectedManifest: {id: "hancore.shibumi.audio", version: "0.1.1-beta.16.5", kinds: ["service"]}}) + injectedManifest: {id: "hancore.shibumi.audio", version: "0.1.1-beta.16.5.1", kinds: ["service"]}}) check(client.serviceFor("hancore.shibumi.audio") === null, "duplicate provider was last-writer-wins: second=" + JSON.stringify({ manifest: second.injectedManifest, kindsArray: Array.isArray(second.injectedManifest.kinds), @@ -192,7 +192,7 @@ ShellRoot { first.injectedHost = audioApi check(client.serviceFor("hancore.shibumi.audio") === first, "scope recovery stayed unavailable") let getterReached = false - const malformed = {version: "0.1.1-beta.16.5", kinds: ["service"]} + const malformed = {version: "0.1.1-beta.16.5.1", kinds: ["service"]} Object.defineProperty(malformed, "id", {get: function() { getterReached = true throw new Error("controlled malformed metadata getter") diff --git a/tests/state-service-smoke.qml b/tests/state-service-smoke.qml index f5f5fb95..90abba77 100644 --- a/tests/state-service-smoke.qml +++ b/tests/state-service-smoke.qml @@ -55,7 +55,7 @@ ShellRoot { id: state omarchyPath: Quickshell.env("OMARCHY_PATH") shell: fakeShell - manifest: ({id: "hancore.shibumi.state", version: "0.1.1-beta.16.5", kinds: ["service"]}) + manifest: ({id: "hancore.shibumi.state", version: "0.1.1-beta.16.5.1", kinds: ["service"]}) } Component.onCompleted: steps = [ function() { diff --git a/tests/status-plugin-smoke.qml b/tests/status-plugin-smoke.qml index b1e71ec4..bed79280 100644 --- a/tests/status-plugin-smoke.qml +++ b/tests/status-plugin-smoke.qml @@ -204,11 +204,11 @@ ShellRoot { SuiteRuntime.Provider { id: leasedBarProvider pluginId: "hancore.shibumi.bar" - implementationVersion: "0.1.1-beta.16.5" + implementationVersion: "0.1.1-beta.16.5.1" owner: leasedBarOwner host: leasedBarOwner.providerHost manifest: ({ id: "hancore.shibumi.bar", - version: "0.1.1-beta.16.5", kinds: ["bar"] }) + version: "0.1.1-beta.16.5.1", kinds: ["bar"] }) } } @@ -226,7 +226,7 @@ ShellRoot { Status.Service { shell: rawScopedStatusShell manifest: ({ id: "hancore.shibumi.status", - version: "0.1.1-beta.16.5", kinds: ["service"] }) + version: "0.1.1-beta.16.5.1", kinds: ["service"] }) actionRunner: actionRecorder runtimeProbesEnabled: false } diff --git a/tests/telemetry-plugins-smoke.qml b/tests/telemetry-plugins-smoke.qml index f40ac4b6..2206e25e 100644 --- a/tests/telemetry-plugins-smoke.qml +++ b/tests/telemetry-plugins-smoke.qml @@ -27,7 +27,7 @@ ShellRoot { Telemetry.Service { id: telemetryService shell: fakeShell - manifest: ({id: "hancore.shibumi.telemetry", version: "0.1.1-beta.16.5", kinds: ["service"]}) + manifest: ({id: "hancore.shibumi.telemetry", version: "0.1.1-beta.16.5.1", kinds: ["service"]}) // Keep this fixture isolated from machine-specific hwmon inventory. thermalProbeEnabled: false } @@ -35,7 +35,7 @@ ShellRoot { Cpu.Service { id: cpuService shell: fakeShell - manifest: ({id: "hancore.shibumi.cpu", version: "0.1.1-beta.16.5", kinds: ["service"]}) + manifest: ({id: "hancore.shibumi.cpu", version: "0.1.1-beta.16.5.1", kinds: ["service"]}) gpuProbeEnabled: false } diff --git a/tests/telemetry-runtime-smoke.qml b/tests/telemetry-runtime-smoke.qml index 52c0cbc0..7122b784 100644 --- a/tests/telemetry-runtime-smoke.qml +++ b/tests/telemetry-runtime-smoke.qml @@ -22,7 +22,7 @@ ShellRoot { Qt.exit(1) throw new Error(message) } - function manifest(id) { return {id: id, version: "0.1.1-beta.16.5", kinds: ["service"]} } + function manifest(id) { return {id: id, version: "0.1.1-beta.16.5.1", kinds: ["service"]} } component ScopedHost: QtObject { property string pluginId: "" function serviceFor(id) { root.check(false, "raw scoped lookup: " + id); return null } @@ -43,7 +43,7 @@ ShellRoot { } SuiteRuntime.Provider { pluginId: "hancore.shibumi.state" - implementationVersion: "0.1.1-beta.16.5" + implementationVersion: "0.1.1-beta.16.5.1" host: stateHost owner: state manifest: root.manifest("hancore.shibumi.state") diff --git a/tests/test_package_release.py b/tests/test_package_release.py index 918c3904..e04e8931 100644 --- a/tests/test_package_release.py +++ b/tests/test_package_release.py @@ -263,10 +263,20 @@ def test_lifecycle_contract_pins_exact_release_identities(self) -> None: }, "public-beta.16.5": { "suiteVersion": "0.1.1-beta.16.5", - "sourceRevisions": ["package:0.1.1-beta.16.5"], + "sourceRevisions": [ + "8b34d030a303aa35d6033923c8f3c38c4c25b29b", + "1d7a00b2742fb4d479774a4f722c6c2ef96d0601", + "package:0.1.1-beta.16.5", + ], "settingsStorageVersion": 1, "payloadDigest": "a090b82858c554f02d44030755f779b2827ae51e55bca750b7163d5b330472dd", }, + "public-beta.16.5.1": { + "suiteVersion": "0.1.1-beta.16.5.1", + "sourceRevisions": ["package:0.1.1-beta.16.5.1"], + "settingsStorageVersion": 1, + "payloadDigest": "a4a0b43a04603a9b40354df1498e74b4b42e55158c1d3f9d68c9460db30802cf", + }, } self.assertEqual(set(states), set(expected)) for identity_id, pinned in expected.items(): @@ -965,9 +975,13 @@ def test_release_evidence_host_probes_fail_closed_and_logs_are_redacted(self) -> self.assertFalse( module.probe_host_identity(name, command, prefix)["valid"] ) + with self.subTest(probe=name, failure="trailing-identity"): + result = subprocess.CompletedProcess(command, 0, prefix + "-wrong\n", "") + with patch.object(module.subprocess, "run", return_value=result): + self.assertFalse(module.probe_host_identity(name, command, prefix)["valid"]) with self.subTest(probe=name, result="valid"): result = subprocess.CompletedProcess( - command, 0, prefix + "test-version\n", "" + command, 0, prefix + "\n", "" ) with patch.object(module.subprocess, "run", return_value=result): self.assertTrue( diff --git a/tests/test_shibumi_suite.py b/tests/test_shibumi_suite.py index 645fa5bd..e6525648 100755 --- a/tests/test_shibumi_suite.py +++ b/tests/test_shibumi_suite.py @@ -2157,11 +2157,12 @@ def test_picker_routes_fall_back_only_when_router_is_not_executable(self) -> Non background = 'background=$(omarchy-theme-bg-switcher); [[ -n $background ]] && omarchy-theme-bg-set "$background"' stock_menu = self.paths.omarchy_root / "default/omarchy/omarchy-menu.jsonc" stock_menu.parent.mkdir(parents=True) - for theme, theme_calls in ( - ('theme=$(omarchy-theme-switcher); [[ -n $theme ]] && omarchy-theme-set "$theme"', "theme-switcher\ntheme-set:\n"), - ('omarchy-shell shell summon omarchy.image-picker \'{"source":"themes"}\'', 'native:<{"source":"themes"}>\n'), + for family, theme, theme_calls in ( + ('style', 'theme=$(omarchy-theme-switcher); [[ -n $theme ]] && omarchy-theme-set "$theme"', "theme-switcher\ntheme-set:\n"), + ('style', 'omarchy-shell shell summon omarchy.image-picker \'{"source":"themes"}\'', 'native:<{"source":"themes"}>\n'), + ('appearance', 'omarchy-shell shell summon omarchy.image-picker \'{"source":"themes"}\'', 'native:<{"source":"themes"}>\n'), ): - stock_menu.write_text(json.dumps({"style.theme": {"action": theme}, "style.background": {"action": background}})) + stock_menu.write_text(json.dumps({f"{family}.theme": {"action": theme}, f"{family}.background": {"action": background}})) legacy_actions = {"style.theme": "theme", "style.background": "wallpaper"} legacy = "{\n" + START_MARKER + "\n" + ",\n".join(json.dumps(key) + ": " + json.dumps({"action": '\"$HOME/.config/omarchy/plugins/hancore.shibumi.quick-access/scripts/shibumi-picker-route\" ' + value}) for key, value in legacy_actions.items()) + "\n" + END_MARKER + "\n}\n" self.paths.menu_extension_file.parent.mkdir(parents=True, exist_ok=True) @@ -2170,17 +2171,19 @@ def test_picker_routes_fall_back_only_when_router_is_not_executable(self) -> Non transaction = SimpleNamespace(paths=self.paths, menu_extension_existed=True, write_menu_extension=payloads.append) install_picker_menu_extension(transaction, self.runtime) rendered = payloads[-1].decode() + self.assertEqual(set(_decoded(rendered)), {f"{family}.theme", f"{family}.background"}) + self.assertEqual([entry["action"].split("; else ", 1)[1] for entry in _decoded(rendered).values()], [theme + "; fi", background + "; fi"]) self.assertEqual((rendered.count(START_MARKER), rendered.count(END_MARKER), remove_picker_routing(rendered)), (1, 1, "{\n}\n")) for mode in ("missing", "non-executable", "present", "failing"): router.unlink(missing_ok=True) if mode != "missing": router.write_text('#!/bin/bash\nprintf "router:<%s>\\n" "$1" >>"$ROUTE_LOG"\nexit ' + ("17" if mode == "failing" else "0") + "\n") router.chmod(0o600 if mode == "non-executable" else 0o700) - for key, argument in legacy_actions.items(): + for key, argument in ((f"{family}.theme", "theme"), (f"{family}.background", "wallpaper")): with self.subTest(theme=theme, mode=mode, route=key): log.write_text("") result = subprocess.run(["/bin/bash", "--noprofile", "--norc", "-c", _decoded(rendered)[key]["action"]], env={"HOME": str(home), "PATH": str(commands), "ROUTE_LOG": str(log)}, capture_output=True, text=True, timeout=3) - expected = (theme_calls if key == "style.theme" else "background-switcher\nbackground-set:\n") if mode in ("missing", "non-executable") else "router:<" + argument + ">\n" + expected = (theme_calls if argument == "theme" else "background-switcher\nbackground-set:\n") if mode in ("missing", "non-executable") else "router:<" + argument + ">\n" self.assertEqual((result.returncode, log.read_text()), (17 if mode == "failing" else 0, expected), result.stderr) def test_menu_extension_supports_items_wrapper(self) -> None: @@ -2195,6 +2198,9 @@ def test_menu_extension_supports_items_wrapper(self) -> None: installed = install_picker_routing(original) self.assertIn('"style.background"', installed) self.assertEqual(remove_picker_routing(installed), original) + warnings = [] + skipped = install_picker_routing(installed, '{"items": {}}', warnings=warnings) + self.assertEqual((skipped, warnings), (original, ["stock menu has neither style.theme nor appearance.theme; picker routing skipped"])) def test_menu_refresh_retries_quattro_not_ready_response(self) -> None: runtime = OmarchyRuntime() diff --git a/tests/theme-palette-runtime-smoke.qml b/tests/theme-palette-runtime-smoke.qml index a772d5a3..eaaee7c5 100644 --- a/tests/theme-palette-runtime-smoke.qml +++ b/tests/theme-palette-runtime-smoke.qml @@ -26,7 +26,7 @@ ShellRoot { id: state shell: fakeShell omarchyPath: Quickshell.env("OMARCHY_PATH") - manifest: ({id: "hancore.shibumi.state", version: "0.1.1-beta.16.5", kinds: ["service"]}) + manifest: ({id: "hancore.shibumi.state", version: "0.1.1-beta.16.5.1", kinds: ["service"]}) } function colorText(value) { diff --git a/tests/third-party-integration-smoke.qml b/tests/third-party-integration-smoke.qml index e0e91dd0..8a57f513 100644 --- a/tests/third-party-integration-smoke.qml +++ b/tests/third-party-integration-smoke.qml @@ -38,14 +38,14 @@ ShellRoot { AudioOwner.Service { shell: fakeShell nativeBackendEnabled: false // Controlled peak stub; this fixture tests IPC. - manifest: ({ id: "hancore.shibumi.audio", version: "0.1.1-beta.16.5", kinds: ["service"] }) + manifest: ({ id: "hancore.shibumi.audio", version: "0.1.1-beta.16.5.1", kinds: ["service"] }) } StateOwner.Service { shell: fakeShell omarchyPath: "" manifest: ({ - id: "hancore.shibumi.state", version: "0.1.1-beta.16.5", kinds: ["service"] + id: "hancore.shibumi.state", version: "0.1.1-beta.16.5.1", kinds: ["service"] }) } diff --git a/tests/widget-pipeline-diagnostics-smoke.qml b/tests/widget-pipeline-diagnostics-smoke.qml index e5234235..d0ec1482 100644 --- a/tests/widget-pipeline-diagnostics-smoke.qml +++ b/tests/widget-pipeline-diagnostics-smoke.qml @@ -237,11 +237,11 @@ ShellRoot { Shared.Provider { id: stateProvider pluginId: "hancore.shibumi.state" - implementationVersion: "0.1.1-beta.16.5" + implementationVersion: "0.1.1-beta.16.5.1" owner: stateOwner host: stateHost manifest: ({ id: "hancore.shibumi.state", - version: "0.1.1-beta.16.5", kinds: ["service"] }) + version: "0.1.1-beta.16.5.1", kinds: ["service"] }) } QtObject { @@ -290,7 +290,7 @@ ShellRoot { barWidgetRegistry: scopedWidgetRegistry manifest: ({ id: "hancore.shibumi.bar", - version: "0.1.1-beta.16.5", + version: "0.1.1-beta.16.5.1", kinds: ["bar"] }) barConfig: ({ diff --git a/tests/workspaces-plugin-smoke.qml b/tests/workspaces-plugin-smoke.qml index fe481473..7758699b 100644 --- a/tests/workspaces-plugin-smoke.qml +++ b/tests/workspaces-plugin-smoke.qml @@ -125,7 +125,7 @@ ShellRoot { Workspaces.WorkspaceService { id: workspaceState shell: fakeShell - manifest: ({id: "hancore.shibumi.workspaces", version: "0.1.1-beta.16.5", kinds: ["service"]}) + manifest: ({id: "hancore.shibumi.workspaces", version: "0.1.1-beta.16.5.1", kinds: ["service"]}) stateService: preferenceState backendOverride: QtObject { property var focusedWorkspace: ({ id: 8 }) diff --git a/tests/workspaces-runtime-smoke.qml b/tests/workspaces-runtime-smoke.qml index 51d1669a..5ac9109c 100644 --- a/tests/workspaces-runtime-smoke.qml +++ b/tests/workspaces-runtime-smoke.qml @@ -15,7 +15,7 @@ ShellRoot { property var cachedPreference: null property int callsBeforeLoss: 0 property int writesBeforeLoss: 0 - readonly property var validManifest: ({id: "hancore.shibumi.workspaces", version: "0.1.1-beta.16.5", kinds: ["service"]}) + readonly property var validManifest: ({id: "hancore.shibumi.workspaces", version: "0.1.1-beta.16.5.1", kinds: ["service"]}) function check(value, message) { if (value) return console.error("workspaces-runtime:", message) @@ -44,10 +44,10 @@ ShellRoot { } SuiteRuntime.Provider { pluginId: "hancore.shibumi.state" - implementationVersion: "0.1.1-beta.16.5" + implementationVersion: "0.1.1-beta.16.5.1" owner: state host: root.stateEnabled ? stateHost : null - manifest: ({id: "hancore.shibumi.state", version: "0.1.1-beta.16.5", kinds: ["service"]}) + manifest: ({id: "hancore.shibumi.state", version: "0.1.1-beta.16.5.1", kinds: ["service"]}) } QtObject { id: backend