From f188aea8d8376bc81c5bf80054039b0bf5b06357 Mon Sep 17 00:00:00 2001 From: HANCORE-linux <230438592+HANCORE-linux@users.noreply.github.com> Date: Thu, 8 Oct 2026 17:26:06 +0200 Subject: [PATCH 1/8] workspaces: create paint subtrees only for the active style --- hancore.shibumi.workspaces/BarWidget.qml | 178 +++++++++++++++++------ tests/workspace-lazy-paint.qml | 20 +++ 2 files changed, 150 insertions(+), 48 deletions(-) create mode 100644 tests/workspace-lazy-paint.qml diff --git a/hancore.shibumi.workspaces/BarWidget.qml b/hancore.shibumi.workspaces/BarWidget.qml index 63e9f3c..e3b9224 100644 --- a/hancore.shibumi.workspaces/BarWidget.qml +++ b/hancore.shibumi.workspaces/BarWidget.qml @@ -14,6 +14,10 @@ Ui.Panel { manageIpc: false Presentation.HostTokens { id: hostTokens; bar: root.bar; serviceShell: suiteShell } SuiteRuntime.HostShell { id: suiteShell; host: root.bar ? root.bar.shell : null } + // Preserve the eager renderer's initial logical width while WidgetSlot + // injects its host. Paint creation must not choose another width history. + property string initialRenderStyle: renderStyle + property bool paintReady: false property url panelSource: Qt.resolvedUrl("WorkspacePanel.qml") property var workspaceService: suiteShell.serviceFor("hancore.shibumi.workspaces") readonly property var stateService: suiteShell.serviceFor("hancore.shibumi.state") @@ -258,7 +262,11 @@ Ui.Panel { onOpenedChanged: syncPanelLoader() onFocusedWorkspaceIdChanged: observePacmanFocus() onRenderStyleChanged: resetPacmanTravel() - Component.onCompleted: pacmanLastFocusedWorkspaceId = focusedWorkspaceId + Component.onCompleted: { + initialRenderStyle = renderStyle + pacmanLastFocusedWorkspaceId = focusedWorkspaceId + Qt.callLater(function() { root.paintReady = true }) + } Item { id: workspaceSurface @@ -294,8 +302,10 @@ Ui.Panel { id: frameMotion z: 0 visible: root.renderStyle === "rings" && root.frameTarget !== null + // Use resident animated cell geometry and the logical frame size. x: workspaceRow.x + (root.frameTarget ? root.frameTarget.x : 0) - + (root.frameTarget ? (root.frameTarget.width - width) / 2 : 0) + + (root.frameTarget ? (root.frameTarget.implicitWidth + - Commons.Style.space(18)) / 2 : 0) anchors.verticalCenter: parent.verticalCenter width: Commons.Style.space(18) height: width @@ -304,7 +314,10 @@ Ui.Panel { NumberAnimation { duration: 190; easing.type: Easing.OutCubic } } - Shape { + Loader { + anchors.fill: parent + active: root.renderStyle === "rings" + sourceComponent: Component { Shape { id: frameShape anchors.fill: parent antialiasing: true @@ -357,6 +370,8 @@ Ui.Panel { controlY: 0.5 } } + } + } } } @@ -380,14 +395,45 @@ Ui.Panel { readonly property bool empty: !focused && !occupied readonly property int numberWidth: Commons.Style.space(20) - implicitWidth: root.renderStyle === "numbers" ? Commons.Style.space(22) - : root.renderStyle === "kanji" ? Commons.Style.space(22) - : root.renderStyle === "magic" + // Paint is disposable; focus/hover animation history belongs to the cell. + property real defaultHaloWidth: Commons.Style.space(focused ? 34 : 16) + property real defaultMarkerWidth: Commons.Style.space(focused ? 26 : 8) + property alias magicColor: colorState.magicColor + property alias kanjiColor: colorState.kanjiColor + property real ringOpacity: cellPointer.containsMouse ? 1 + : focused ? 1 : occupied ? 0.64 : 0.24 + property real auroraWidth: Commons.Style.space(focused ? 32 : 10) + property real auroraMarkerWidth: Commons.Style.space(focused ? 28 : occupied ? 6 : 4) + property real auroraMarkerHeight: Commons.Style.space(focused ? 3 : occupied ? 6 : 4) + property real auroraOpacity: cellPointer.containsMouse ? 1 + : focused ? 0.92 : occupied ? 0.62 : 0.18 + Behavior on defaultHaloWidth { NumberAnimation { duration: 200; easing.type: Easing.OutCubic } } + Behavior on defaultMarkerWidth { NumberAnimation { duration: 200; easing.type: Easing.OutCubic } } + Item { + id: colorState + property color magicColor: Qt.rgba(root.widgetInk.r, root.widgetInk.g, + root.widgetInk.b, cell.focused ? 1 : cell.occupied ? 0.7 : 0.3) + property color kanjiColor: Qt.rgba(root.widgetInk.r, root.widgetInk.g, + root.widgetInk.b, cell.focused ? 1 : cell.occupied ? 0.7 : 0.3) + Behavior on magicColor { ColorAnimation { duration: 200 } } + Behavior on kanjiColor { ColorAnimation { duration: 200 } } + } + Behavior on ringOpacity { NumberAnimation { duration: 160; easing.type: Easing.OutCubic } } + Behavior on auroraWidth { NumberAnimation { duration: 200; easing.type: Easing.OutCubic } } + Behavior on auroraMarkerWidth { NumberAnimation { duration: 200; easing.type: Easing.OutCubic } } + Behavior on auroraMarkerHeight { NumberAnimation { duration: 200; easing.type: Easing.OutCubic } } + Behavior on auroraOpacity { NumberAnimation { duration: 160; easing.type: Easing.OutCubic } } + + readonly property string geometryStyle: root.paintReady + ? root.renderStyle : root.initialRenderStyle + implicitWidth: geometryStyle === "numbers" ? Commons.Style.space(22) + : geometryStyle === "kanji" ? Commons.Style.space(22) + : geometryStyle === "magic" ? Commons.Style.space(focused ? 20 : 18) - : root.renderStyle === "rings" ? Commons.Style.space(20) - : root.renderStyle === "aurora" + : geometryStyle === "rings" ? Commons.Style.space(20) + : geometryStyle === "aurora" ? Commons.Style.space(focused ? 34 : 12) - : root.renderStyle === "pacman" + : geometryStyle === "pacman" ? Commons.Style.space(22) : Commons.Style.space(focused ? 32 : 16) implicitHeight: workspaceSurface.height @@ -397,6 +443,12 @@ Ui.Panel { } Behavior on scale { NumberAnimation { duration: 120 } } + // Keep the cell and pointer resident; load only the selected paint. + Loader { + anchors.fill: parent + active: root.renderStyle === "default" + sourceComponent: Component { Item { + anchors.fill: parent Rectangle { id: defaultHalo Presentation.BarInk { id: haloInk; target: defaultHalo } @@ -406,13 +458,12 @@ Ui.Panel { } visible: root.renderStyle === "default" anchors.centerIn: parent - width: Commons.Style.space(cell.focused ? 34 : 16) + width: cell.defaultHaloWidth height: Commons.Style.space(16) radius: height / 2 color: Qt.rgba(root.widgetInk.r, root.widgetInk.g, root.widgetInk.b, cell.focused ? 0.20 : cell.occupied ? 0.18 : 0.06) - Behavior on width { NumberAnimation { duration: 200; easing.type: Easing.OutCubic } } } Rectangle { @@ -424,21 +475,32 @@ Ui.Panel { } visible: root.renderStyle === "default" anchors.centerIn: parent - width: Commons.Style.space(cell.focused ? 26 : 8) + width: cell.defaultMarkerWidth height: Commons.Style.space(8) radius: height / 2 color: cell.focused || cell.occupied ? root.widgetInk : Qt.rgba(root.widgetInk.r, root.widgetInk.g, root.widgetInk.b, 0.25) - Behavior on width { NumberAnimation { duration: 200; easing.type: Easing.OutCubic } } } + } } + } + + Loader { + anchors.fill: parent + active: root.renderStyle === "numbers" + sourceComponent: Component { Item { + anchors.fill: parent Rectangle { id: numberMarker Presentation.BarInk { id: numberInk; target: numberMarker } - readonly property real inkOffsetX: numberInk.enabled ? numberInk.snapX(0) : 0 + property alias inkOffsetX: numberTranslation.x readonly property real inkOffsetY: numberInk.enabled ? numberInk.rectangleY(height) : 0 - transform: Translate { x: numberMarker.inkOffsetX; y: numberMarker.inkOffsetY } + transform: Translate { + id: numberTranslation + x: numberInk.enabled ? numberInk.snapX(0) : 0 + y: numberMarker.inkOffsetY + } visible: root.renderStyle === "numbers" anchors.centerIn: parent width: cell.numberWidth @@ -464,6 +526,14 @@ Ui.Panel { } } + } } + } + + Loader { + anchors.fill: parent + active: root.renderStyle === "magic" + sourceComponent: Component { Item { + anchors.fill: parent Presentation.IconText { barText: true wholeInk: true @@ -471,15 +541,20 @@ Ui.Panel { anchors.centerIn: parent anchors.verticalCenterOffset: cell.focused ? 0 : 1 text: cell.focused ? "✦" : cell.occupied ? "✧" : "·" - color: Qt.rgba(root.widgetInk.r, root.widgetInk.g, - root.widgetInk.b, cell.focused ? 1 : cell.occupied ? 0.7 : 0.3) + color: cell.magicColor font.family: "Adwaita Mono" font.pixelSize: Commons.Style.space(cell.focused ? 22 : 18) renderType: Text.NativeRendering + } - Behavior on color { ColorAnimation { duration: 200 } } + } } } + Loader { + anchors.fill: parent + active: root.renderStyle === "kanji" + sourceComponent: Component { Item { + anchors.fill: parent Presentation.IconText { barText: true wholeInk: true @@ -490,45 +565,49 @@ Ui.Panel { ? ["一", "二", "三", "四", "五", "六", "七", "八", "九", "十"][cell.modelData - 1] : String(cell.modelData) - color: Qt.rgba(root.widgetInk.r, root.widgetInk.g, - root.widgetInk.b, cell.focused ? 1 : cell.occupied ? 0.7 : 0.3) + color: cell.kanjiColor font.family: "Noto Sans CJK JP" font.pixelSize: Commons.Style.space(cell.focused ? 15 : 13) font.weight: Font.Normal renderType: Text.NativeRendering + } - Behavior on color { ColorAnimation { duration: 200 } } + } } } + Loader { + anchors.fill: parent + active: root.renderStyle === "rings" + sourceComponent: Component { Item { + anchors.fill: parent Presentation.IconText { barText: true visible: root.renderStyle === "rings" anchors.centerIn: parent text: cell.modelData color: root.widgetInk - opacity: cellPointer.containsMouse ? 1 - : cell.focused ? 1 : cell.occupied ? 0.64 : 0.24 + opacity: cell.ringOpacity font.family: root.bar ? root.bar.fontFamily : Commons.Style.font.family font.pixelSize: Commons.Style.space(12) font.weight: Font.Normal font.hintingPreference: Font.PreferNoHinting renderType: Text.QtRendering + } - Behavior on opacity { - NumberAnimation { duration: 160; easing.type: Easing.OutCubic } - } + } } } + Loader { + anchors.fill: parent + active: root.renderStyle === "aurora" + sourceComponent: Component { Item { + anchors.fill: parent Item { visible: root.renderStyle === "aurora" anchors.centerIn: parent - width: Commons.Style.space(cell.focused ? 32 : 10) + width: cell.auroraWidth height: Commons.Style.space(16) - Behavior on width { - NumberAnimation { duration: 200; easing.type: Easing.OutCubic } - } - Rectangle { id: auroraMarker Presentation.BarInk { id: auroraInk; target: auroraMarker } @@ -537,28 +616,23 @@ Ui.Panel { y: auroraInk.enabled ? auroraInk.rectangleY(auroraMarker.height) : 0 } anchors.centerIn: parent - width: Commons.Style.space( - cell.focused ? 28 : cell.occupied ? 6 : 4) - height: Commons.Style.space( - cell.focused ? 3 : cell.occupied ? 6 : 4) + width: cell.auroraMarkerWidth + height: cell.auroraMarkerHeight radius: height / 2 color: root.widgetInk - opacity: cellPointer.containsMouse ? 1 - : cell.focused ? 0.92 : cell.occupied ? 0.62 : 0.18 + opacity: cell.auroraOpacity antialiasing: true - - Behavior on width { - NumberAnimation { duration: 200; easing.type: Easing.OutCubic } - } - Behavior on height { - NumberAnimation { duration: 200; easing.type: Easing.OutCubic } - } - Behavior on opacity { - NumberAnimation { duration: 160; easing.type: Easing.OutCubic } - } } } + } } + } + + Loader { + anchors.fill: parent + active: root.renderStyle === "pacman" && root.paintReady + sourceComponent: Component { Item { + anchors.fill: parent Presentation.PacmanWorkspaceMarker { visible: root.renderStyle === "pacman" anchors.centerIn: parent @@ -576,6 +650,9 @@ Ui.Panel { hoverColor: root.pacmanHoverColor } + } } + } + MouseArea { id: cellPointer anchors.fill: parent @@ -612,7 +689,10 @@ Ui.Panel { width: Commons.Style.space(22) height: Commons.Style.space(18) - Item { + Loader { + anchors.fill: parent + active: root.renderStyle === "pacman" + sourceComponent: Component { Item { id: pacmanRunnerVisual anchors.fill: parent transform: Scale { @@ -661,6 +741,8 @@ Ui.Panel { context.fill() } } + } + } } } } diff --git a/tests/workspace-lazy-paint.qml b/tests/workspace-lazy-paint.qml new file mode 100644 index 0000000..766f772 --- /dev/null +++ b/tests/workspace-lazy-paint.qml @@ -0,0 +1,20 @@ +import QtQuick +QtObject { + required property var workspace + function check() { + const pending = [workspace], seen = [] + let inks = 0 + while (pending.length) { + const object = pending.pop() + if (!object || seen.indexOf(object) >= 0) continue + seen.push(object) + if (object.target && typeof object.snapX === "function") inks++ + for (const child of Array.from(object.children || [])) pending.push(child) + for (const child of Array.from(object.data || [])) pending.push(child) + } + const expected = ({default:2,numbers:2,magic:1,kanji:1,rings:1,aurora:1,pacman:0})[workspace.renderStyle] * workspace.renderedWorkspaceCount + const passed = workspace.renderedWorkspaceCount > 0 && inks === expected + console[passed ? "log" : "error"]("#73 lazy paint regression " + (passed ? "passed" : "failed"), inks, expected) + return passed + } +} From 1f59343a57cfd5038726ab04b1345efd814b420b Mon Sep 17 00:00:00 2001 From: HANCORE-linux <230438592+HANCORE-linux@users.noreply.github.com> Date: Thu, 8 Oct 2026 17:26:06 +0200 Subject: [PATCH 2/8] centre: defer the stage decision while the host budget is stale or savings are pending --- hancore.shibumi.bar/core/GroupSlot.qml | 14 +++++++++ hancore.shibumi.bar/core/WidgetSlot.qml | 27 +++++++++++++++++ .../styles/shibumi/BarSurface.qml | 11 +++++++ .../styles/shibumi/GroupSection.qml | 30 ++++++++++++++++--- hancore.shibumi.center/BarWidget.qml | 10 +++++++ hancore.shibumi.status/BarWidget.qml | 13 ++++++-- tests/center-reveal-budget.qml | 19 ++++++++++++ 7 files changed, 117 insertions(+), 7 deletions(-) create mode 100644 tests/center-reveal-budget.qml diff --git a/hancore.shibumi.bar/core/GroupSlot.qml b/hancore.shibumi.bar/core/GroupSlot.qml index c901133..a98e3c4 100644 --- a/hancore.shibumi.bar/core/GroupSlot.qml +++ b/hancore.shibumi.bar/core/GroupSlot.qml @@ -11,6 +11,7 @@ Item { required property string groupId property string screenName: "" property real availableWidth: 0 + property bool layoutBusy: false readonly property var stateService: bar && bar.shell && typeof bar.shell.serviceFor === "function" ? bar.shell.serviceFor("hancore.shibumi.state") : null @@ -108,6 +109,8 @@ Item { // that same selection and can oscillate for width-reactive providers. readonly property bool hasLoadedWidgets: contentItem ? contentItem.hasLoadedWidgets === true : false + readonly property bool savingsPending: contentItem && "savingsPending" in contentItem + ? contentItem.savingsPending : false readonly property real spacingRecovery: contentItem && "spacingRecovery" in contentItem ? contentItem.spacingRecovery : 0 readonly property bool hasContent: implicitWidth > 0.5 && implicitHeight > 0.5 @@ -228,6 +231,15 @@ Item { readonly property bool hasLoadedWidgets: root ? root.anyLoadedWidget(moduleRepeater) : false + readonly property bool savingsPending: { + void(moduleRow.children) + for (let i = 0; i < moduleRepeater.count; i++) { + const slot = moduleRepeater.itemAt(i) + const item = slot && slot.activeItemVisible ? slot.activeItem : null + if (item && "savingsPending" in item && item.savingsPending) return true + } + return false + } readonly property real spacingRecovery: { void(moduleRow.implicitWidth) let total = 0 @@ -286,6 +298,7 @@ Item { availableWidth: root.availableWidth > 0 ? Math.max(1, root.availableWidth - horizontalRoot.siblingWidth(index)) : 0 horizontalHostHeight: root.v2Shell ? 0 : root.v1SlotHeight + layoutBusy: root.layoutBusy } } } @@ -319,6 +332,7 @@ Item { region: root.groupId screenName: root.screenName availableWidth: root.availableWidth + layoutBusy: root.layoutBusy } } } diff --git a/hancore.shibumi.bar/core/WidgetSlot.qml b/hancore.shibumi.bar/core/WidgetSlot.qml index 16920c3..3b977e8 100644 --- a/hancore.shibumi.bar/core/WidgetSlot.qml +++ b/hancore.shibumi.bar/core/WidgetSlot.qml @@ -12,6 +12,7 @@ Item { property string region: "" property string screenName: "" property real availableWidth: 0 + property bool layoutBusy: false // The original V1 composes 28px widget roots inside a 32px slot row. // Keep this opt-in so direct/V2/vertical hosts retain provider geometry. property real horizontalHostHeight: 0 @@ -223,6 +224,7 @@ Item { } onSlotCompleteChanged: requestLoaderSourceSync() onAvailableWidthChanged: injectProperties() + onLayoutBusyChanged: injectLayoutBusy() onActiveItemChanged: { // A binding notification for the resident item can arrive after onLoaded. // Replacement/teardown revokes it, but a successor submission completed by @@ -613,6 +615,8 @@ Item { if (_barConnectionRevoked) return _barConnectionRevoked = true const target = activeItem + if (target && "responsiveWidthProvider" in target) target.responsiveWidthProvider = null + if (target && "layoutBusy" in target) target.layoutBusy = false if (target && "bar" in target) target.bar = null } @@ -621,6 +625,26 @@ Item { injectProperties() } + function currentResponsiveWidth() { + if (_barConnectionRevoked) return availableWidth + let siblings = 0 + for (let owner = parent; owner; owner = owner.parent) { + if (typeof owner.siblingWidth === "function" && "index" in root) + siblings = owner.siblingWidth(root.index) + if (typeof owner.currentAvailableWidthForGroup === "function") { + const budget = owner.currentAvailableWidthForGroup(region) + return budget > 0 ? Math.max(1, budget - siblings) : 0 + } + } + return availableWidth + } + + function injectLayoutBusy() { + const target = activeItem + if (target && !_barConnectionRevoked && "layoutBusy" in target) + target.layoutBusy = layoutBusy + } + function injectProperties() { const target = activeItem if (!target || _barConnectionRevoked) return @@ -629,6 +653,9 @@ Item { if ("hostGroupId" in target) target.hostGroupId = region if ("settings" in target) target.settings = moduleSettings if ("availableWidth" in target) target.availableWidth = availableWidth + if ("responsiveWidthProvider" in target) + target.responsiveWidthProvider = currentResponsiveWidth + injectLayoutBusy() } TransformWatcher { diff --git a/hancore.shibumi.bar/styles/shibumi/BarSurface.qml b/hancore.shibumi.bar/styles/shibumi/BarSurface.qml index 3c3c5fd..271cbea 100644 --- a/hancore.shibumi.bar/styles/shibumi/BarSurface.qml +++ b/hancore.shibumi.bar/styles/shibumi/BarSurface.qml @@ -127,6 +127,14 @@ Item { ResponsiveLayout.centerAvailableWidth(compactShell, width, frameInset, shellContentInset, leftRegion.width, rightRegion.width, centerGap, measuredCenterSpan, centerExtras.width) + // Read by responsive decisions without advancing positioned geometry + // or the legacy budget's notification/animation path. + readonly property real currentCenterAvailableWidth: compactShell + ? centerAvailableWidth : Math.max(0, + responsiveCapacity - 2 * shellContentInset + - leftGroups.width - leftExtras.width + - rightExtras.width - rightGroups.width - 2 * centerGap + - centerExtras.width) property int narrowStage: 0 readonly property real sideMargin: shellX + shellContentInset readonly property real responsiveSideInset: shellContentInset @@ -429,6 +437,9 @@ Item { visibilityStage: horizontalSurface.narrowStage // The widget API uses zero for an unconstrained width. availableWidth: Math.max(1, horizontalSurface.centerAvailableWidth) + restageAvailableWidth: Math.max(1, horizontalSurface.currentCenterAvailableWidth) + layoutBusy: leftGroups.savingsPending || centerGroups.savingsPending + || rightGroups.savingsPending } Core.BarSection { diff --git a/hancore.shibumi.bar/styles/shibumi/GroupSection.qml b/hancore.shibumi.bar/styles/shibumi/GroupSection.qml index bd77f63..19c473e 100644 --- a/hancore.shibumi.bar/styles/shibumi/GroupSection.qml +++ b/hancore.shibumi.bar/styles/shibumi/GroupSection.qml @@ -13,6 +13,8 @@ Item { property string screenName: "" property var layoutSession: null property real availableWidth: 0 + property bool layoutBusy: false + property real restageAvailableWidth: availableWidth property int visibilityStage: 0 readonly property bool editing: layoutSession && layoutSession.editing readonly property bool v2Mode: bar.layoutController @@ -62,6 +64,8 @@ Item { readonly property var stateConfig: stateService && stateService.config ? stateService.config : ({}) readonly property var contentItem: content.item + readonly property bool savingsPending: contentItem && "savingsPending" in contentItem + ? contentItem.savingsPending : false readonly property real spacingRecovery: contentItem && "spacingRecovery" in contentItem ? contentItem.spacingRecovery : 0 readonly property var groupGeometry: contentItem && contentItem.groupGeometry @@ -227,6 +231,12 @@ Item { return ResponsiveLayout.groupVisibleAtStage(groupId, stage) } + function currentAvailableWidthForGroup(groupId) { + return contentItem && typeof contentItem.groupAvailableWidth === "function" + ? contentItem.groupAvailableWidth(groups.indexOf(groupId), restageAvailableWidth) + : availableWidth + } + function budgetWidthForStage(stage) { var index = Math.max(0, Math.min(3, Number(stage) || 0)) return Math.max(0, Number(stageBudgetWidths[index]) || 0) @@ -367,10 +377,11 @@ Item { } return widths } - function groupAvailableWidth(index) { + function groupAvailableWidth(index, budget) { if (!root) return 0 - if (root.v2Mode || root.region !== "center" || root.availableWidth <= 0) - return root.availableWidth + const available = budget === undefined ? root.availableWidth : budget + if (root.v2Mode || root.region !== "center" || available <= 0) + return available // Prefer G8 only while its enabled, stage-shown widgets are loaded. // Otherwise the first loaded center occupant owns the remainder. // Readiness, not hasContent/width, chooses the owner: its own budget @@ -392,9 +403,17 @@ Item { if (cell.separated) siblings += root.splitGrow } // Zero is the host widget API's unconstrained sentinel. - return Math.max(1, root.availableWidth - siblings) + return Math.max(1, available - siblings) } + readonly property bool savingsPending: { + void(horizontalRow.children) + for (let i = 0; i < horizontalRepeater.count; i++) { + const cell = horizontalRepeater.itemAt(i) + if (cell && cell.contentShown && cell.savingsPending) return true + } + return false + } readonly property real spacingRecovery: { if (!root) return 0 void(root.groups) @@ -547,6 +566,7 @@ Item { ? emptySlotTarget.width : groupHasContent ? groupSlot.minimumResponsiveWidth : measuredMinimumGroupWidth readonly property real spacingRecovery: groupSlot.spacingRecovery + readonly property bool savingsPending: groupSlot.savingsPending readonly property real contentLeft: targetVisual.x readonly property real contentRight: targetVisual.x + targetVisual.width readonly property real visualRightEdge: groupSlot.x + groupSlot.width @@ -717,6 +737,7 @@ Item { bar: horizontalCell.lifecycleBar groupId: horizontalCell.modelData screenName: root ? root.screenName : "" + layoutBusy: root ? root.layoutBusy : false availableWidth: horizontalRow ? horizontalRow.groupAvailableWidth(horizontalCell.index) : 0 enabled: root ? !root.slotEditing : false @@ -1037,6 +1058,7 @@ Item { groupId: verticalCell.modelData screenName: root ? root.screenName : "" availableWidth: root ? root.availableWidth : 0 + layoutBusy: root ? root.layoutBusy : false y: verticalCell.leadingGap } } diff --git a/hancore.shibumi.center/BarWidget.qml b/hancore.shibumi.center/BarWidget.qml index 2e53d59..23efd2a 100644 --- a/hancore.shibumi.center/BarWidget.qml +++ b/hancore.shibumi.center/BarWidget.qml @@ -15,6 +15,8 @@ Ui.Panel { Presentation.HostTokens { id: hostTokens; bar: root.bar } property url calendarSource: Qt.resolvedUrl("CalendarPanel.qml") property real availableWidth: 0 + property var responsiveWidthProvider: null + property bool layoutBusy: false // Start conservatively when the widget is recreated after a provider // switch. Starting at the widest stage can make the outer bar hide G9/G10 // before this widget receives its real center budget, creating a coupled @@ -157,6 +159,14 @@ Ui.Panel { } function updateStage() { + // Defer while reservations or pending savings make layout provisional; + // never replace the legacy decision value or its animation history. + if ((typeof responsiveWidthProvider === "function" + && responsiveWidthProvider() < availableWidth - 0.000001) + || layoutBusy) { + restageTimer.restart() + return + } stage = CenterLayout.nextStage(stage, availableWidth, needNormal, needCompact, centered) } diff --git a/hancore.shibumi.status/BarWidget.qml b/hancore.shibumi.status/BarWidget.qml index 88ad46e..8745941 100644 --- a/hancore.shibumi.status/BarWidget.qml +++ b/hancore.shibumi.status/BarWidget.qml @@ -119,6 +119,7 @@ Item { : Math.round(Commons.Style.space(3) * statusPlacement.dpr) : Math.floor(directContraction / 2)) / statusPlacement.dpr property real spacingSavings: 0 + property bool savingsPending: false property bool spacingActive: false // Settle after layout: binding width directly to snapped ink feeds the // parent's new position back into its own reservation. @@ -126,9 +127,14 @@ Item { if (!root || !spacingActive) return const saved = Math.max(0, updateShift - bellShift) if (Math.abs(spacingSavings - saved) > 1e-7) spacingSavings = saved + savingsPending = false } - onUpdateShiftChanged: Qt.callLater(syncSpacingSavings) - onBellShiftChanged: Qt.callLater(syncSpacingSavings) + function scheduleSpacingSavings() { + savingsPending = true + Qt.callLater(syncSpacingSavings) + } + onUpdateShiftChanged: scheduleSpacingSavings() + onBellShiftChanged: scheduleSpacingSavings() readonly property int presentedCount: fullMode ? (updatePresented ? 1 : 0) + (trayPresented ? 1 : 0) + (notificationPresented ? 1 : 0) @@ -497,12 +503,13 @@ Item { Component.onCompleted: { spacingActive = true - Qt.callLater(syncSpacingSavings) + scheduleSpacingSavings() lifecycleBar = bar scheduleChildSync() } Component.onDestruction: { spacingActive = false + savingsPending = false close() const dyingBar = bar || lifecycleBar if (dyingBar && "tearingDown" in dyingBar diff --git a/tests/center-reveal-budget.qml b/tests/center-reveal-budget.qml new file mode 100644 index 0000000..170db0a --- /dev/null +++ b/tests/center-reveal-budget.qml @@ -0,0 +1,19 @@ +import QtQuick +QtObject { + required property var workspace + required property var center + property var shown: ({}) + function hide() { + shown = ({budget: center.availableWidth, stage: center.stage}) + workspace.visible = false + } + function checkReveal() { + const hiddenBudget = center.availableWidth + workspace.visible = true + center.updateStage() + const budget = typeof center.responsiveWidthProvider === "function" ? center.responsiveWidthProvider() : center.availableWidth + const passed = hiddenBudget > shown.budget && budget === shown.budget && center.stage === shown.stage + console[passed ? "log" : "error"]("center reveal budget " + (passed ? "passed" : "failed"), hiddenBudget, shown.budget, budget, center.stage) + return passed + } +} From d054b28bbada65b87422fb12cb564c810774f5f4 Mon Sep 17 00:00:00 2001 From: HANCORE-linux <230438592+HANCORE-linux@users.noreply.github.com> Date: Thu, 8 Oct 2026 17:26:06 +0200 Subject: [PATCH 3/8] tests: guard the notification smoke timer --- tests/notification-adapter-smoke.qml | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/tests/notification-adapter-smoke.qml b/tests/notification-adapter-smoke.qml index c63a7b9..ed8bb27 100644 --- a/tests/notification-adapter-smoke.qml +++ b/tests/notification-adapter-smoke.qml @@ -6,6 +6,14 @@ import "status" as Status ShellRoot { id: root + property bool finished: false + function finish(code) { + if (finished) return + finished = true + poller.stop() + Qt.exit(code) + } + property int ticks: 0 readonly property int expectedHistoryCount: Number( Quickshell.env("SHIBUMI_EXPECTED_HISTORY_COUNT") || 0) @@ -21,8 +29,9 @@ ShellRoot { function clickLive(token) { return typeof adapter.invokeLive === "function" ? adapter.invokeLive(token) : adapter.focusApp(adapter.pendingModel.get(0)) } function fail(message) { + if (finished) return console.error("notification-adapter-smoke:", message) - Qt.exit(1) + finish(1) } ListModel { @@ -124,10 +133,12 @@ ShellRoot { } Timer { + id: poller interval: 20 repeat: true running: true onTriggered: { + if (root.finished) return root.ticks++ if (root.proxyCase) { if (root.ticks > 100) return root.fail("proxy badge/focus deadline") @@ -155,7 +166,7 @@ ShellRoot { proxyReceipt.reload() if (!proxyReceipt.text().length) return console.log("notification proxy badge/focus passed") - Qt.exit(0) + root.finish(0) return } if (root.ticks === 2) { @@ -211,20 +222,20 @@ ShellRoot { return root.fail("stale history crossed " + root.historyRace) console.log("notification history " + root.historyRace + " race passed") - Qt.exit(0) + root.finish(0) return } if (root.mutationPhase === 1) { if (dndOnlyAdapter.pastModel.count !== root.expectedHistoryCount || dndOnlyAdapter.pastModel.get(0).summary !== "History 11") return console.log("notification history dismiss passed") - Qt.exit(0) + root.finish(0) return } if (root.mutationPhase === 2) { if (dndOnlyAdapter.recentCount !== 0 || dndOnlyAdapter.historyState !== "ready") return console.log("notification history clear passed") - Qt.exit(0) + root.finish(0) return } if (root.mutationPhase === 3) { @@ -234,7 +245,7 @@ ShellRoot { || dndOnlyAdapter.pendingCount !== 1) return root.fail("stale mutation callback crossed host replacement") console.log("notification history mutation replace race passed") - Qt.exit(0) + root.finish(0) return } if (dndOnlyAdapter.pastModel.count !== root.expectedHistoryCount @@ -318,7 +329,7 @@ ShellRoot { || adapter.recentCount !== 0) return root.fail("host replacement did not clear primitive rows") console.log("notification adapter smoke passed") - Qt.exit(0) + root.finish(0) } } } From 919d2be02a93615b38dac2d30dd97252ab67b6f7 Mon Sep 17 00:00:00 2001 From: HANCORE-linux <230438592+HANCORE-linux@users.noreply.github.com> Date: Thu, 8 Oct 2026 17:26:06 +0200 Subject: [PATCH 4/8] health: ignore python cache files in the plugin payload digest --- hancore.shibumi.control-center/manager/shibumi-health | 4 +++- tests/test_shibumi_suite.py | 6 ++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/hancore.shibumi.control-center/manager/shibumi-health b/hancore.shibumi.control-center/manager/shibumi-health index ab285c0..677b757 100755 --- a/hancore.shibumi.control-center/manager/shibumi-health +++ b/hancore.shibumi.control-center/manager/shibumi-health @@ -212,7 +212,9 @@ def payload_digest(directory: Path) -> str: directory.rglob("*"), key=lambda item: item.relative_to(directory).as_posix() ): relative = path.relative_to(directory).as_posix() - if relative == MANAGED_MARKER: + if (relative == MANAGED_MARKER + or "__pycache__" in Path(relative).parts + or path.suffix in {".pyc", ".pyo"}): continue metadata = path.lstat() if path.is_symlink(): diff --git a/tests/test_shibumi_suite.py b/tests/test_shibumi_suite.py index f36e2af..3e5affb 100755 --- a/tests/test_shibumi_suite.py +++ b/tests/test_shibumi_suite.py @@ -1144,6 +1144,10 @@ def test_payload_identity_uses_owner_execute_bit(self) -> None: ))["payload_digest"] for mode in (0o755, 0o700): for plugin_id, spec in published.plugins.items(): + for relative in ("nested/__pycache__/cache", "loose.pyc", "nested/loose.pyo"): + cache = spec.source / relative + cache.parent.mkdir(parents=True, exist_ok=True) + cache.write_bytes(b"cache") for path in spec.source.rglob("*"): if path.is_file() and path.stat().st_mode & 0o100: path.chmod(mode) @@ -1163,6 +1167,8 @@ def test_payload_identity_uses_owner_execute_bit(self) -> None: self.assertEqual( preflight_lifecycle_state(self.paths, self.suite), "public-beta.15.2" ) + (spec.source / "manifest.json").write_bytes((spec.source / "manifest.json").read_bytes() + b"\n") + self.assertNotEqual(health_digest(spec.source), digests[-1]) def test_exact_beta141_package_identity_is_admitted(self) -> None: packaged_suite = self.packaged_suite( From 740705216abb839bb172253b5fcf99daecee12c5 Mon Sep 17 00:00:00 2001 From: HANCORE-linux <230438592+HANCORE-linux@users.noreply.github.com> Date: Thu, 8 Oct 2026 17:26:06 +0200 Subject: [PATCH 5/8] ai: allow the agents usage updater 300 s --- hancore.shibumi.ai/scripts/agents-update | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hancore.shibumi.ai/scripts/agents-update b/hancore.shibumi.ai/scripts/agents-update index 401fd89..4b59964 100755 --- a/hancore.shibumi.ai/scripts/agents-update +++ b/hancore.shibumi.ai/scripts/agents-update @@ -4,7 +4,7 @@ set -euo pipefail omarchy_path=${1:-} shift || true -timeout_seconds=${SHIBUMI_AI_UPDATE_TIMEOUT:-120} +timeout_seconds=${SHIBUMI_AI_UPDATE_TIMEOUT:-300} script_dir=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd) compat_bin="$script_dir/compat-bin" child_pid="" From 1034dd5b08cddfde01db79426972152aa3cf60d1 Mon Sep 17 00:00:00 2001 From: HANCORE-linux <230438592+HANCORE-linux@users.noreply.github.com> Date: Thu, 8 Oct 2026 17:26:06 +0200 Subject: [PATCH 6/8] bar: qualify the palette singleton for Qt 6.12 --- hancore.shibumi.bar/Bar.qml | 9 +++++---- tests/layout-transition-smoke.qml | 1 + 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/hancore.shibumi.bar/Bar.qml b/hancore.shibumi.bar/Bar.qml index 971639e..cf09d0d 100644 --- a/hancore.shibumi.bar/Bar.qml +++ b/hancore.shibumi.bar/Bar.qml @@ -5,6 +5,7 @@ import Quickshell import Quickshell.Hyprland import Quickshell.Io import qs.Commons +import qs.Commons as Commons import "core" as Core import "core/GroupRegistry.js" as GroupRegistry import "core/PanelRouting.js" as PanelRouting @@ -178,10 +179,10 @@ Item { } readonly property string styleId: styleRegistry.resolvedId readonly property var availableStyleIds: styleRegistry.availableIds - property color foreground: styleReady ? activeStyle.foreground : Color.bar.text - property color barForeground: styleReady ? activeStyle.barForeground : Color.bar.text - property color background: styleReady ? activeStyle.background : Color.bar.background - property color urgent: styleReady ? activeStyle.urgent : Color.bar.active + property color foreground: styleReady ? activeStyle.foreground : Commons.Color.bar.text + property color barForeground: styleReady ? activeStyle.barForeground : Commons.Color.bar.text + property color background: styleReady ? activeStyle.background : Commons.Color.bar.background + property color urgent: styleReady ? activeStyle.urgent : Commons.Color.bar.active property string fontFamily: styleReady ? activeStyle.fontFamily : Style.font.family readonly property bool injectionComplete: omarchyPath !== "" && shell !== null diff --git a/tests/layout-transition-smoke.qml b/tests/layout-transition-smoke.qml index 1e0dfef..c206002 100644 --- a/tests/layout-transition-smoke.qml +++ b/tests/layout-transition-smoke.qml @@ -1,6 +1,7 @@ import QtQuick import Quickshell import qs.Commons +import qs.Commons as Commons import "core" as Core import "core/V2LayoutModel.js" as Layout import "core/GroupRegistry.js" as GroupRegistry From e6243bec40b5486607a9cdf8e8ef92726cca2b32 Mon Sep 17 00:00:00 2001 From: HANCORE-linux <230438592+HANCORE-linux@users.noreply.github.com> Date: Thu, 8 Oct 2026 17:26:06 +0200 Subject: [PATCH 7/8] bar: accept the bar-hidden toggle marker next to bar-off --- ARCHITECTURE.md | 2 +- hancore.shibumi.bar/Bar.qml | 2 +- tests/bar-host-registry-regression.sh | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index accdfe9..0e09c06 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -432,7 +432,7 @@ checks pass. - The shared runtime owns one process-singleton `omarchy.bar` visibility-nudge handler, enabled only for the one fully admitted active Shibumi bar. It exposes only `syncHidden`, which asks that owner to re-read - Omarchy's host-owned `bar-off` marker after `omarchy-toggle-bar` changes it; + Omarchy's host-owned `bar-off` or `bar-hidden` marker after `omarchy-toggle-bar` changes it; the directory watcher remains the ordinary update path. Incoming ownership arms only after the bounded host-handler handoff window; changing the host-injected bar identity revokes outgoing ownership synchronously. diff --git a/hancore.shibumi.bar/Bar.qml b/hancore.shibumi.bar/Bar.qml index cf09d0d..411af9b 100644 --- a/hancore.shibumi.bar/Bar.qml +++ b/hancore.shibumi.bar/Bar.qml @@ -3617,7 +3617,7 @@ Item { Process { id: barHiddenProbe running: root.hostReady - command: ["bash", "-lc", "[[ -f $HOME/.local/state/omarchy/toggles/bar-off ]] && echo yes || echo no"] + command: ["bash", "-lc", "[[ -f $HOME/.local/state/omarchy/toggles/bar-off || -f $HOME/.local/state/omarchy/toggles/bar-hidden ]] && echo yes || echo no"] stdout: SplitParser { onRead: line => { root.barToggledOff = String(line).trim() === "yes" diff --git a/tests/bar-host-registry-regression.sh b/tests/bar-host-registry-regression.sh index 4411bf2..a4c7fce 100755 --- a/tests/bar-host-registry-regression.sh +++ b/tests/bar-host-registry-regression.sh @@ -409,9 +409,9 @@ watch = ''' FileView { onFileChanged: root.requestBarHiddenProbe() }''' quiet_watch = " Item {} // fixture: ordinary bar-off directory watcher disabled" -command = ' command: ["bash", "-lc", "[[ -f $HOME/.local/state/omarchy/toggles/bar-off ]] && echo yes || echo no"]' +command = ' command: ["bash", "-lc", "[[ -f $HOME/.local/state/omarchy/toggles/bar-off || -f $HOME/.local/state/omarchy/toggles/bar-hidden ]] && echo yes || echo no"]' delayed = (' command: ["bash", "-lc", "rm -f \\\"$HOME/probe-sampled\\\"; ' - 'if [[ -f $HOME/.local/state/omarchy/toggles/bar-off ]]; then result=yes; ' + 'if [[ -f $HOME/.local/state/omarchy/toggles/bar-off || -f $HOME/.local/state/omarchy/toggles/bar-hidden ]]; then result=yes; ' 'else result=no; fi; : > \\\"$HOME/probe-sampled\\\"; sleep 0.15; echo \\\"$result\\\""]') if source.count(watch) != 1 or source.count(command) != 1: raise SystemExit("visibility fixture calibration anchor drifted") @@ -444,7 +444,7 @@ wait_visibility_state() { } wait_visibility_state handoff-gap 'the bounded incoming-handler gap' -touch "$toggle_dir/bar-off" +touch "$toggle_dir/bar-hidden" handoff_gap_response=$(env XDG_RUNTIME_DIR="$tmpdir/runtime" WAYLAND_DISPLAY= \ /usr/bin/quickshell ipc --pid "$ipc_pid" call \ omarchy.bar syncHidden 2>/dev/null || true) @@ -453,7 +453,7 @@ handoff_gap_response=$(env XDG_RUNTIME_DIR="$tmpdir/runtime" WAYLAND_DISPLAY= \ wait_visibility_state idle-hidden \ 'the arm-time resample of a marker changed during handoff' -rm -f "$toggle_dir/bar-off" +rm -f "$toggle_dir/bar-hidden" env XDG_RUNTIME_DIR="$tmpdir/runtime" WAYLAND_DISPLAY= \ /usr/bin/quickshell ipc --pid "$ipc_pid" call \ omarchy.bar syncHidden >/dev/null \ From bd1224ba92fbf279666abe362ff5cf7a165da096 Mon Sep 17 00:00:00 2001 From: HANCORE-linux <230438592+HANCORE-linux@users.noreply.github.com> Date: Thu, 8 Oct 2026 17:41:41 +0200 Subject: [PATCH 8/8] release: 0.1.1-beta.16.2 --- .github/release-notes/v0.1.1-beta.16.2.md | 62 ++++++++++++++++ CHANGELOG.md | 18 +++++ README.md | 10 +-- VERSION | 2 +- contracts/lifecycle-predecessors-v1.json | 63 ++++++++++++++++ contracts/plugin-suite-v1.json | 2 +- docs/architecture/quattro-compatibility.md | 2 +- docs/development/packaging.md | 4 +- docs/install.md | 16 ++-- docs/plugins/README.md | 2 +- docs/release-readiness.md | 74 +++++++++---------- hancore.shibumi.ai/Service.qml | 2 +- hancore.shibumi.ai/manifest.json | 2 +- hancore.shibumi.audio/Service.qml | 2 +- hancore.shibumi.audio/manifest.json | 2 +- hancore.shibumi.bar/Bar.qml | 2 +- hancore.shibumi.bar/manifest.json | 2 +- hancore.shibumi.battery/manifest.json | 2 +- hancore.shibumi.bluetooth/Service.qml | 2 +- hancore.shibumi.bluetooth/manifest.json | 2 +- hancore.shibumi.brightness/Service.qml | 2 +- hancore.shibumi.brightness/manifest.json | 2 +- hancore.shibumi.center/Service.qml | 2 +- hancore.shibumi.center/manifest.json | 2 +- .../PluginUpdateService.qml | 2 +- hancore.shibumi.control-center/manifest.json | 2 +- hancore.shibumi.cpu/Service.qml | 2 +- hancore.shibumi.cpu/manifest.json | 2 +- hancore.shibumi.gpu/manifest.json | 2 +- hancore.shibumi.media/Service.qml | 2 +- hancore.shibumi.media/manifest.json | 2 +- hancore.shibumi.memory/manifest.json | 2 +- hancore.shibumi.network/Service.qml | 2 +- hancore.shibumi.network/manifest.json | 2 +- hancore.shibumi.power-profile/manifest.json | 2 +- hancore.shibumi.power-state/Service.qml | 2 +- hancore.shibumi.power-state/manifest.json | 2 +- hancore.shibumi.quick-access/Service.qml | 2 +- hancore.shibumi.quick-access/manifest.json | 2 +- hancore.shibumi.reactor/Service.qml | 2 +- hancore.shibumi.reactor/manifest.json | 2 +- hancore.shibumi.state/Service.qml | 2 +- hancore.shibumi.state/manifest.json | 2 +- hancore.shibumi.state/runtime/Runtime.qml | 2 +- hancore.shibumi.status/Service.qml | 2 +- hancore.shibumi.status/manifest.json | 2 +- hancore.shibumi.storage/Service.qml | 2 +- hancore.shibumi.storage/manifest.json | 2 +- hancore.shibumi.telemetry/Service.qml | 2 +- hancore.shibumi.telemetry/manifest.json | 2 +- hancore.shibumi.temperature/manifest.json | 2 +- hancore.shibumi.update-center/Service.qml | 2 +- hancore.shibumi.update-center/manifest.json | 2 +- .../WorkspaceService.qml | 2 +- hancore.shibumi.workspaces/manifest.json | 2 +- packaging/aur/.SRCINFO | 6 +- packaging/aur/PKGBUILD | 4 +- packaging/package-metadata.json | 2 +- scripts/check-aur-package | 2 +- .../audio-native-backend-seam-regression.qml | 2 +- tests/audio-runtime-smoke.qml | 6 +- tests/bar-catalog-consumer-smoke.qml | 14 ++-- tests/bar-visibility-ipc-smoke.qml | 2 +- tests/catalog-service-smoke.qml | 2 +- tests/core-services-smoke.qml | 6 +- tests/fixtures/native-runtime/probe.py | 2 +- tests/fixtures/release-predecessor.json | 14 ++-- tests/gpu-selection-state-smoke.qml | 4 +- tests/host-registry-prime-smoke.qml | 8 +- tests/media-spectrum-service-smoke.qml | 2 +- tests/plugin-update-service-smoke.qml | 2 +- tests/power-deferred-smoke.qml | 2 +- tests/power-runtime-smoke.qml | 6 +- tests/power-service-runtime-smoke.qml | 2 +- tests/reactor-plugin-smoke.qml | 4 +- tests/reactor-runtime-smoke.qml | 10 +-- tests/scoped-state-regression.qml | 2 +- tests/shared-runtime-regression.qml | 16 ++-- tests/state-service-smoke.qml | 2 +- tests/status-plugin-smoke.qml | 6 +- tests/telemetry-plugins-smoke.qml | 4 +- tests/telemetry-runtime-smoke.qml | 4 +- tests/test_package_release.py | 12 ++- tests/theme-palette-runtime-smoke.qml | 2 +- tests/third-party-integration-smoke.qml | 4 +- tests/widget-pipeline-diagnostics-smoke.qml | 6 +- tests/workspaces-plugin-smoke.qml | 2 +- tests/workspaces-runtime-smoke.qml | 6 +- 88 files changed, 332 insertions(+), 179 deletions(-) create mode 100644 .github/release-notes/v0.1.1-beta.16.2.md diff --git a/.github/release-notes/v0.1.1-beta.16.2.md b/.github/release-notes/v0.1.1-beta.16.2.md new file mode 100644 index 0000000..944b9e9 --- /dev/null +++ b/.github/release-notes/v0.1.1-beta.16.2.md @@ -0,0 +1,62 @@ +# 0.1.1-beta.16.2 + +Beta.16.2 fixes workspace animation stutter, defers premature centre-layout +changes after reveal/rebuild, and fixes Health and AI collector handling. + +## Fixes + +- Workspaces: the workspace animation stutters since Beta 16 (#73). Paint subtrees are now created only for the active workspace style; the focus animation renders 11–13 real frames per switch again (4–6 in 16.1), style switch cycles are 29–41 % faster and bar switch cycles 11–14 % faster on our fixture. The rest images of all styles stay identical to 16.1 at DPR 1; at DPR 1.6 only glyph rasterisation differs by at most 4/255 on text pixels, and the numbers style now sits at its geometrically correct position (up to 1 physical pixel). +- Centre group: the responsive stage (clock / clock+weather / clock+date+weather) could be decided with a stale host budget right after a bar reveal or a rebuild, briefly showing the date or hiding the weather. The decision is now deferred while the status group's spacing savings are still pending or the host budget is stale. +- Status group: the 1–2-frame undershoot of the status icons right after a bar rebuild (spacing savings applied one frame late) no longer triggers a wrong centre stage. +- Health: `shibumi-health` no longer reports plugins as "modified" because of `__pycache__`/`.pyc` files in the plugin directory (#74). The payload digest now ignores them, like the installer does. +- AI: the agents usage updater waits up to 300 s instead of 120 s for the Omarchy collectors. Large Codex session histories (tens of GB) made the Codex collector exceed 120 s, so the Codex card vanished from the AI panel after 24 h. +- Tests: the notification adapter smoke test no longer races its timer (the test that made one release job red in 16.1). +- Bar: the bar's fallback colours now reference the palette as `Commons.Color`, as Omarchy requires for Qt 6.12, where an unqualified `Color` resolves to the new QtQuick type (basecamp/omarchy #14553). +- Bar: the hidden-bar probe accepts Omarchy's upcoming `bar-hidden` toggle marker next to the current `bar-off` (basecamp/omarchy #14395). + +## Known issues + +- Rings style: right after a bar rebuild (reload, V1/V2 switch, workspace count change) the focus ring can be drawn about 6 px off for a single frame (16 ms); on our fixture this happened in up to every second rebuild in the standard layout and in 1 of 10 in the full layout. It is a build-time animation ordering effect and will be fixed with the host layout redesign in 0.2.0. +- Notch bar at DPR 1.6 with the numbers or kanji style: the centre group can oscillate between two layouts for a while after a layout change. This exists since 16.1 (status spacing feedback) and is also addressed by the 0.2.0 redesign. + +## Compatibility + +The 24-plugin suite and transactional installation model are unchanged, retaining the Omarchy and Omarchy Settings `4.0.4-1`, Omarchy `v4.0.4` source, and Quickshell `0.3.1-1` pins. +Runtime validation used Qt 6.11.2; Qt 6.12 is not yet validated. + +## 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.2 +./scripts/shibumi-suite install --yes +``` + +Update an admitted Beta.16.1 installation from its existing checkout: + +```bash +git fetch --tags +git checkout v0.1.1-beta.16.2 +./scripts/shibumi-suite update --dry-run +./scripts/shibumi-suite update --yes +./scripts/shibumi-suite status +``` + +The exact Beta.16.1 tag (`3b35049`) and release merge (`65c8d8bf`) are admitted +predecessors. Older supported identities retain their exact revision and +payload checks; an arbitrary checkout with the same version is not admitted. +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.2/docs/install.md). +AUR publication remains deferred. + +## Downgrade warning + +**Downgrade:** Beta.15.4 and older cannot read V1 layouts with parked widgets +(`order.parked`). They reset V1 order, roles and splits to defaults; other +settings and V2 stay. `uninstall --keep-settings` does not prevent this. +Back up `~/.config/omarchy/shell.json` and `~/.local/state/shibumi/` before a +downgrade. Details: [Backup before downgrade](https://github.com/HANCORE-linux/Shibumi-Shell/blob/v0.1.1-beta.16.2/docs/install.md#backup-before-downgrade). diff --git a/CHANGELOG.md b/CHANGELOG.md index 5aca984..84c6ed0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,23 @@ # Changelog +## [0.1.1-beta.16.2] - 2026-10-08 + +### Fixed + +- Workspaces: the workspace animation stutters since Beta 16 (#73). Paint subtrees are now created only for the active workspace style; the focus animation renders 11–13 real frames per switch again (4–6 in 16.1), style switch cycles are 29–41 % faster and bar switch cycles 11–14 % faster on our fixture. The rest images of all styles stay identical to 16.1 at DPR 1; at DPR 1.6 only glyph rasterisation differs by at most 4/255 on text pixels, and the numbers style now sits at its geometrically correct position (up to 1 physical pixel). +- Centre group: the responsive stage (clock / clock+weather / clock+date+weather) could be decided with a stale host budget right after a bar reveal or a rebuild, briefly showing the date or hiding the weather. The decision is now deferred while the status group's spacing savings are still pending or the host budget is stale. +- Status group: the 1–2-frame undershoot of the status icons right after a bar rebuild (spacing savings applied one frame late) no longer triggers a wrong centre stage. +- Health: `shibumi-health` no longer reports plugins as "modified" because of `__pycache__`/`.pyc` files in the plugin directory (#74). The payload digest now ignores them, like the installer does. +- AI: the agents usage updater waits up to 300 s instead of 120 s for the Omarchy collectors. Large Codex session histories (tens of GB) made the Codex collector exceed 120 s, so the Codex card vanished from the AI panel after 24 h. +- Tests: the notification adapter smoke test no longer races its timer (the test that made one release job red in 16.1). +- Bar: the bar's fallback colours now reference the palette as `Commons.Color`, as Omarchy requires for Qt 6.12, where an unqualified `Color` resolves to the new QtQuick type (basecamp/omarchy #14553). +- Bar: the hidden-bar probe accepts Omarchy's upcoming `bar-hidden` toggle marker next to the current `bar-off` (basecamp/omarchy #14395). + +### Known issues + +- Rings style: right after a bar rebuild (reload, V1/V2 switch, workspace count change) the focus ring can be drawn about 6 px off for a single frame (16 ms); on our fixture this happened in up to every second rebuild in the standard layout and in 1 of 10 in the full layout. It is a build-time animation ordering effect and will be fixed with the host layout redesign in 0.2.0. +- Notch bar at DPR 1.6 with the numbers or kanji style: the centre group can oscillate between two layouts for a while after a layout change. This exists since 16.1 (status spacing feedback) and is also addressed by the 0.2.0 redesign. + ## [0.1.1-beta.16.1] - 2026-10-04 ### Fixed diff --git a/README.md b/README.md index 4cc50ac..4dfbd44 100644 --- a/README.md +++ b/README.md @@ -16,9 +16,9 @@ process.

[Documentation](docs/README.md) · [Release status](docs/release-readiness.md) -`0.1.1-beta.16.1` is published as a GitHub prerelease. AUR publication is +`0.1.1-beta.16.2` is the target GitHub prerelease. AUR publication is deferred; use the source installation below. See the -[release notes](.github/release-notes/v0.1.1-beta.16.1.md) for changes and the +[release notes](.github/release-notes/v0.1.1-beta.16.2.md) for changes and the downgrade warning. 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 @@ -82,18 +82,18 @@ Install from source using the release tag: 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.1 +git checkout v0.1.1-beta.16.2 ./scripts/shibumi-suite install --yes ``` -Update an admitted Beta.16 source installation to Beta.16.1. +Update an admitted Beta.16.1 source installation to Beta.16.2. Exact predecessor 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.1 +git checkout v0.1.1-beta.16.2 ./scripts/shibumi-suite update --dry-run ./scripts/shibumi-suite update --yes ./scripts/shibumi-suite status diff --git a/VERSION b/VERSION index a607da6..b21063e 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.1.1-beta.16.1 +0.1.1-beta.16.2 diff --git a/contracts/lifecycle-predecessors-v1.json b/contracts/lifecycle-predecessors-v1.json index d5942ff..6d2c3ea 100644 --- a/contracts/lifecycle-predecessors-v1.json +++ b/contracts/lifecycle-predecessors-v1.json @@ -814,9 +814,72 @@ ], "settingsStorageVersion": 1, "sourceRevisions": [ + "3b35049af69aba57784376e916f50146d61eb411", + "65c8d8bf72a674a35c5bb8ae85d0fff21b4e5cb6", "package:0.1.1-beta.16.1" ], "suiteVersion": "0.1.1-beta.16.1" + }, + { + "id": "public-beta.16.2", + "payloadDigest": "79c61d5e048c669c9eb27ebaad21987327892089daea501d0cf4185150a26f9e", + "pluginDigests": { + "hancore.shibumi.bar": "b8f574eed104997b7904bd034baf302f1a93eefc8b3332cca06e206c6fcc41bb", + "hancore.shibumi.state": "69bb17985086c68054be81f74b8abbcd02d324fca247260ce5ed6322fcccf144", + "hancore.shibumi.control-center": "29111a0b3ebbdc18d289e5b97bf6ad97b6617c78cebf71b33ca01eedfa1bdf87", + "hancore.shibumi.reactor": "38aef7bbc3bf8bd8ff4f7b0110061a04e306afa688fd18726812f6d6200207eb", + "hancore.shibumi.telemetry": "6d29ab5ba1335fb0614c58a0fbf4f2717e6bc6aa99caa98ff7c52e384a0a5615", + "hancore.shibumi.power-state": "dba8c6aaba15308a6c7284297219e075fa53410533bb22fadeb799ee75fd3662", + "hancore.shibumi.workspaces": "ca5b3169cef7622656b0390535f3250642bc7eb9997b4613c137a52f022eec14", + "hancore.shibumi.update-center": "19b4a41ada73950f2c063ad908cb9b9e96ef7308ea4d60b9797585bc0ad817fc", + "hancore.shibumi.status": "8c92ba343f9dc755e1c2ea1a8197063990f7804307688568c1e0b52710deeb07", + "hancore.shibumi.memory": "ee174f02be5fbfdd33b810b696096b29974faa16219af661233998cd90df3225", + "hancore.shibumi.cpu": "b16048781c3c119a8ccac925973c5773fc365c8a474e9f09d043812c6a34b4dc", + "hancore.shibumi.audio": "45630dcf21c2f8a73ac047d89ffe4c306ad2a4ab0903bc532d356db9329634f5", + "hancore.shibumi.ai": "edfe2dc4cc1ecddebdce53db9d9fa5438d8ea013c04b4cd3f75c2e89c18bfb3d", + "hancore.shibumi.center": "d5c276fca3c70753e9dbdac0d9fef02d2985096b8dcbe8347ba95032cc401df8", + "hancore.shibumi.media": "a2593a4744decb5a8dae434947ec9c6db06d5e1db69ad29e53ec356281acbcfe", + "hancore.shibumi.quick-access": "8c84f4b9649335bf4821b7bae646df03af0d0e502e66247d8817c0ffa8267dae", + "hancore.shibumi.network": "9a9b6a03fa0355b455f59bdfc33dfcb71ca252a85466bbce6dd9870af894be1d", + "hancore.shibumi.battery": "0ef080d64443b1c66dcbec3aebdbbc95232de7fd67de3025bf6523b8128c7d8c", + "hancore.shibumi.brightness": "6241f9276fccbae2562399d6ee86b2381760ad8a1a083965a0f8dac3c55b3073", + "hancore.shibumi.power-profile": "be7693c164a25e08f24e4e0d09c84227435bf4d27d9b3213b8c8ad6d7940f371", + "hancore.shibumi.bluetooth": "438a2e0fda3f38958fd8fb584520f6087376bef3a5cc21a26b699514b5791a4a", + "hancore.shibumi.temperature": "61eb68316687e2af5b54157aca7d74b87644384eb820d634969b418fb104cd45", + "hancore.shibumi.gpu": "0b7f29a43e0b9f101b51a028c51867af3dd319323b7e4dba475955af671913ee", + "hancore.shibumi.storage": "3998ef80d5ecf25dd57ebcc3693b49c8f29048b409842d798a1d30bcb567e386" + }, + "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.2" + ], + "suiteVersion": "0.1.1-beta.16.2" } ] } diff --git a/contracts/plugin-suite-v1.json b/contracts/plugin-suite-v1.json index 5c6d7b6..ae187a8 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.1", + "suiteVersion": "0.1.1-beta.16.2", "settingsStorageVersion": 1, "hostContract": "contracts/host-facade-v1.json", "retiredPlugins": [ diff --git a/docs/architecture/quattro-compatibility.md b/docs/architecture/quattro-compatibility.md index 257f559..d20a2d9 100644 --- a/docs/architecture/quattro-compatibility.md +++ b/docs/architecture/quattro-compatibility.md @@ -8,7 +8,7 @@ by this evidence. ## Current pinned host -Beta.16.1 retains Beta.16's exact official Omarchy 4.0.4 baseline. These pins are not +Beta.16.2 retains Beta.16's exact official Omarchy 4.0.4 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: diff --git a/docs/development/packaging.md b/docs/development/packaging.md index 2fcd71b..701a0d0 100644 --- a/docs/development/packaging.md +++ b/docs/development/packaging.md @@ -1,6 +1,6 @@ # Arch packaging and AUR publication -Status: `0.1.1-beta.16.1` is published as a GitHub prerelease; AUR publication +Status: `0.1.1-beta.16.2` is the target GitHub prerelease; AUR publication is deferred. Shibumi ships one versioned suite containing 24 separately validated Omarchy @@ -74,7 +74,7 @@ and lifecycle code before the user-level update runs, so Beta.12's storage guard cannot reject that package afterward. There is no reverse migration to legacy storage. -The additional [Beta.16.1 downgrade warning and backup requirements](../install.md#backup-before-downgrade) +The additional [Beta.16.2 downgrade warning and backup requirements](../install.md#backup-before-downgrade) apply even to readers using canonical State storage: Beta.15.4 and older cannot preserve a V1 layout containing `order.parked`. `--keep-settings` does not prevent this. Restore the settings with a matching payload. diff --git a/docs/install.md b/docs/install.md index 64f4fc0..42cc209 100644 --- a/docs/install.md +++ b/docs/install.md @@ -6,7 +6,7 @@ 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.1` is published as a GitHub prerelease. AUR publication is +`0.1.1-beta.16.2` is the target GitHub prerelease. AUR publication is deferred; install from the release tag using the source workflow below. Do not install or update from `main`. @@ -51,7 +51,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.1 +git checkout v0.1.1-beta.16.2 ./scripts/shibumi-suite install --yes ``` @@ -66,7 +66,7 @@ To inspect the transaction before installing: ```bash git clone https://github.com/HANCORE-linux/Shibumi-Shell.git cd Shibumi-Shell -git checkout v0.1.1-beta.16.1 +git checkout v0.1.1-beta.16.2 ./scripts/shibumi-suite install --dry-run ./scripts/shibumi-suite install ``` @@ -146,14 +146,14 @@ 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. -To update an admitted Beta.16 source installation to Beta.16.1, use its -trusted checkout. The exact published Beta.16 tag and release merge are +To update an admitted Beta.16.1 source installation to Beta.16.2, use its +trusted checkout. The exact published Beta.16.1 tag and release merge are admitted predecessors: ```bash cd Shibumi-Shell git fetch --tags -git checkout v0.1.1-beta.16.1 +git checkout v0.1.1-beta.16.2 ./scripts/shibumi-suite update --dry-run ./scripts/shibumi-suite update --yes ./scripts/shibumi-suite status @@ -206,7 +206,7 @@ authoritative origin. The old checkout is not deleted or modified. ### Roll back a package version > [!WARNING] -> **Beta.16.1 downgrade warning.** +> **Beta.16.2 downgrade warning.** > Beta.15.4 and older cannot read V1 layouts containing > `order.parked`. They reset V1 order, roles, and splits to defaults; other > settings and V2 remain. `uninstall --keep-settings` does not prevent this. @@ -406,7 +406,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.1 +git checkout v0.1.1-beta.16.2 ./scripts/shibumi-suite install --yes ``` diff --git a/docs/plugins/README.md b/docs/plugins/README.md index 173fd50..dced8e4 100644 --- a/docs/plugins/README.md +++ b/docs/plugins/README.md @@ -2,7 +2,7 @@ Status: reference -Shibumi `0.1.1-beta.16.1` contains 24 independently registered Omarchy plugins. The +Shibumi `0.1.1-beta.16.2` 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 c8ece07..34e3285 100644 --- a/docs/release-readiness.md +++ b/docs/release-readiness.md @@ -1,4 +1,4 @@ -# Shibumi 0.1.1-beta.16.1 release readiness +# Shibumi 0.1.1-beta.16.2 release readiness > **Document status: Revision-bound validation record.** This page separates > recorded product evidence from release, package, and physical acceptance. @@ -6,49 +6,49 @@ ## Candidate and published predecessor -The Beta.16.1 product, expectation, and payload-pin revision is -`9f1fc90c4f9414286969cb039445bb91301701b6` (tree -`0660d7e2cb97c2f8286423d356550c880ef7c6f9`), with 24 plugins and suite payload -digest `46f72fd02b00dbe34326dbbdf6e95556e7e35641a4d597c5281bc2beed94a974`. -The complete source contract and isolated Quattro gate below bind exactly that -revision. This is a pre-checksum readiness snapshot, not final release evidence. -Subsequent readiness, changelog-date, and AUR checksum commits do not change the -plugin-only suite payload, but shipped documentation changes the release archive. -Source review, the complete 14-gate collector, and a byte-identical clean-commit -rebuild must bind the final combined release revision before publication. - -Beta.16 was published on 2026-10-02 as a GitHub prerelease from -`4840482ec0e06a2ebd478120833d4fae1f30889e`. It is the frozen rolling +The Beta.16.2 candidate contains the accepted Core18c delivery, Health cache +exclusion, AI timeout, and separate minimal palette and bar-marker patches. +Its 24-plugin suite payload digest is +`79c61d5e048c669c9eb27ebaad21987327892089daea501d0cf4185150a26f9e`. +This is the preparation snapshot included in the release-identity commit, not +final clean-commit evidence. Source review, the complete contract, isolated +Quattro lifecycle, package rehearsal, full 14-gate collector, and reproducible +archive verification must record their exact final commit externally; no +predecessor gate result transfers to this candidate. + +Beta.16.1 was published on 2026-10-04 as a GitHub prerelease from +`3b35049af69aba57784376e916f50146d61eb411`. It is the frozen rolling predecessor in [`release-predecessor.json`](../tests/fixtures/release-predecessor.json). That exact tag checkout and release merge -`05548c8d9ffdf0d37962d6e423e2a0dc21b8cd91` are admitted by +`65c8d8bf72a674a35c5bb8ae85d0fff21b4e5cb6` are admitted by [`lifecycle-predecessors-v1.json`](../contracts/lifecycle-predecessors-v1.json), -with the unchanged Beta.16 payload digest -`f08b4ec613f248fda62d7dec9865ea46a846fa2e91b2723a186adc0ab0bffc41`. -Older exact identities remain admitted; a version string alone never authorizes -recovery or replacement. AUR publication remains deferred. +with the unchanged Beta.16.1 payload digest +`46f72fd02b00dbe34326dbbdf6e95556e7e35641a4d597c5281bc2beed94a974`. +The downloaded published archive matches all 24 pinned plugin digests; merge +and tag have the same Git tree. Older exact identities remain admitted; a +version string alone never authorizes recovery or replacement. AUR publication +remains deferred. ## Recorded evidence and outstanding gates | Gate | Evidence and boundary | | --- | --- | -| Complete source contract | Passed on `9f1fc90`, exit 0 in 637.634 seconds, complete marker, no retry or timeout. Fresh exact-HEAD source; private staged validation passed separately. | -| Isolated Quattro lifecycle | Passed on the same exact HEAD, exit 0, 32/32 generations in 108.747 seconds; no retry or timeout. | -| Retained runtime paths | Historical Beta.13 → Beta.14.1 package arm (5), fresh checkout (6), Beta.15 (7), Beta.15.2 (7), and rolling frozen Beta.16 → candidate (7). Payload, layout, keep-settings, reinstall, and delayed readbacks passed; owned fixtures were cleaned. | -| Status spacing | Private same-render V1/V2 fit × DPR 1/1.6 × update 13/0 × drawer absent/present: all 16 outer-gap cases match `69ea4da`; inner gaps and count spacing retain `deeca9b`. Neighbors move by whole physical pixels. Bell glyph and point RGBA are exactly translated in all 42 main and supplementary comparisons, including G3 in the V1 center at DPR 1.6. | -| Bluetooth and Update input | `deeca9b`'s any-controller power/display/completion fix and whole-widget Update button are byte-identical. Their controlled QML checks are not physical multi-controller, rfkill, or desktop input acceptance. | -| Diagnostics | Retained fixture diagnostics match the accepted reference, including the known VisualTokens color-assignment warning and six PillSurface teardown TypeErrors; not warning-free. No new diagnostic class or native type/reference/binding error was accepted. | -| Live installation and hardware | Separate reviewer live status-spacing measurement remains outside these private fixtures. Multi-controller/rfkill, persistence, real focus/menu/input, physical multi-output and 1366px acceptance are not supplied here. | -| Release/package verification | At this pre-checksum snapshot, dated changelog, two reproducible archive builds, AUR metadata/checksum commit, clean-HEAD source review and rehearsal, final 14-gate collector, matching rebuild, and publication verification remain pending. Final external evidence must identify their exact combined commit. | - -The historical package arm is not a Beta.16.1 installed-package upgrade proof. +| Complete source contract | Pending exact release-commit evidence at this preparation snapshot. | +| Isolated Quattro lifecycle | Pending exact release-commit evidence, retaining all 32 generations. | +| Retained runtime paths | Historical Beta.13 → Beta.14.1 package arm (5), fresh checkout (6), Beta.15 (7), Beta.15.2 (7), and rolling frozen Beta.16.1 → candidate (7). No arm may be dropped. | +| Core18c image acceptance | Completed in relay round 373: 10,308 first-activation points, plus matrix, edge, raster-phase and named N10 programs; 13 individual first-activation exceptions were expressly accepted. Qualified text-raster differences reach 4/255; this is not a global tolerance or blanket pixel equality. | +| Core18c performance | 440 sessions, 1,200 events, cold/warm N5. All 56 style-switch medians and eight bar-cycle medians improve. Six higher individual bar medians (0.33–7.13 ms, overlapping sample ranges) were accepted. Focus has 11–15 changed buffers over the full event, but 9–13 within 200 ms; the accepted target is the full event. No scanout claim. | +| Separate compatibility patches | Minimal palette and marker patches passed private smokes with Qt 6.11.2. They were not part of the unchanged Core18c image/performance inputs; no Qt 6.12 runtime acceptance. | +| Live installation and hardware | Keep-settings installation and reviewer live acceptance must be recorded separately. Fixtures do not establish physical multi-output, hardware, credential or real desktop input acceptance. | +| Release/package verification | Reproducible archive, checksum agreement, clean-commit gates and rehearsal, independent review, full collector and remote verification remain separate publication requirements. | + +The historical package arm is not a Beta.16.2 installed-package upgrade proof. Private Wayland/Mesa captures are not live GPU, layer-shell, hotplug, or physical -multi-output acceptance. The private V2/DPR1 separator reference is 24/19 free -columns, not the reviewer's 24/20 live reference; equality is claimed only within -the same controlled render, including the notification point and halo in the -last painted pixel. V1 island backgrounds change as their outer margins -are restored: exact bell paint does not mean exact complete slot backgrounds or -whole-bar RGBA. Earlier release passes do not transfer to this candidate. +multi-output acceptance. Earlier release passes do not transfer to this candidate. +The release notes document the accepted Rings early step (raw DPR-1 reload N10: +full 1/10, standard 5/10 sessions, not natural-frequency estimates) and the +existing DPR-1.6 Notch/Numbers/Kanji centre oscillation. Both remain on the +0.2.0 redesign list; the Rings animation-ordering cause is unproved. ## Pinned host contracts @@ -122,7 +122,7 @@ was performed. Each operation needs its own maintainer Go. physical acceptance are not claimed. - **Downgrade:** Beta.15.4 and older cannot read V1 `order.parked`; they reset V1 order, roles, and splits while retaining other settings and V2. - `--keep-settings` does not prevent this. The [release notes](../.github/release-notes/v0.1.1-beta.16.1.md) + `--keep-settings` does not prevent this. The [release notes](../.github/release-notes/v0.1.1-beta.16.2.md) and [backup guide](install.md#backup-before-downgrade) identify the complete settings and recovery evidence to preserve. Restore the settings with a matching payload. @@ -149,4 +149,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.1. +confers acceptance on Beta.16.2. diff --git a/hancore.shibumi.ai/Service.qml b/hancore.shibumi.ai/Service.qml index fcf145b..5eefc70 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.1" + implementationVersion: "0.1.1-beta.16.2" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.ai/manifest.json b/hancore.shibumi.ai/manifest.json index 1ae0281..20baf83 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.1", + "version": "0.1.1-beta.16.2", "author": "HANCORE", "license": "MIT", "description": "Shibumi Claude, Codex, and OpenCode usage presentation.", diff --git a/hancore.shibumi.audio/Service.qml b/hancore.shibumi.audio/Service.qml index a9f559a..96ffd64 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.1" + implementationVersion: "0.1.1-beta.16.2" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.audio/manifest.json b/hancore.shibumi.audio/manifest.json index 9f1ae9d..0ed85aa 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.1", + "version": "0.1.1-beta.16.2", "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 411af9b..eb26a1f 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.1" + implementationVersion: "0.1.1-beta.16.2" owner: root host: suiteHostShell.host manifest: root.manifest diff --git a/hancore.shibumi.bar/manifest.json b/hancore.shibumi.bar/manifest.json index 88247d4..5594ae0 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.1", + "version": "0.1.1-beta.16.2", "author": "HANCORE", "license": "MIT", "description": "The Shibumi full-bar host for Omarchy Shell.", diff --git a/hancore.shibumi.battery/manifest.json b/hancore.shibumi.battery/manifest.json index 553c9c6..8be442c 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.1", + "version": "0.1.1-beta.16.2", "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 bd206c3..ed0f2eb 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.1" + implementationVersion: "0.1.1-beta.16.2" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.bluetooth/manifest.json b/hancore.shibumi.bluetooth/manifest.json index e6f52f0..5320694 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.1", + "version": "0.1.1-beta.16.2", "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 667b781..3f384a7 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.1" + implementationVersion: "0.1.1-beta.16.2" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.brightness/manifest.json b/hancore.shibumi.brightness/manifest.json index 52f801c..2318fb1 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.1", + "version": "0.1.1-beta.16.2", "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 b010832..599434b 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.1" + implementationVersion: "0.1.1-beta.16.2" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.center/manifest.json b/hancore.shibumi.center/manifest.json index eb287cc..f6d060f 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.1", + "version": "0.1.1-beta.16.2", "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 abf88d2..4fa2dbc 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.1" + implementationVersion: "0.1.1-beta.16.2" 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 d3f97a3..41b8f6b 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.1", + "version": "0.1.1-beta.16.2", "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 9afd6df..9fa31ba 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.1" + implementationVersion: "0.1.1-beta.16.2" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.cpu/manifest.json b/hancore.shibumi.cpu/manifest.json index ed5d387..a5161b2 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.1", + "version": "0.1.1-beta.16.2", "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 6ae26bb..3fd6043 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.1", + "version": "0.1.1-beta.16.2", "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 525c8b5..7f87597 100644 --- a/hancore.shibumi.media/Service.qml +++ b/hancore.shibumi.media/Service.qml @@ -18,7 +18,7 @@ Item { SuiteRuntime.Provider { id: runtimeProvider pluginId: "hancore.shibumi.media" - implementationVersion: "0.1.1-beta.16.1" + implementationVersion: "0.1.1-beta.16.2" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.media/manifest.json b/hancore.shibumi.media/manifest.json index dc45ff1..ab08101 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.1", + "version": "0.1.1-beta.16.2", "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 bb02043..dbf3c35 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.1", + "version": "0.1.1-beta.16.2", "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 5d7af9b..02ec198 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.1" + implementationVersion: "0.1.1-beta.16.2" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.network/manifest.json b/hancore.shibumi.network/manifest.json index 5635a96..7681f19 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.1", + "version": "0.1.1-beta.16.2", "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 d53796e..9302b0e 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.1", + "version": "0.1.1-beta.16.2", "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 a787714..f1982ec 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.1" + implementationVersion: "0.1.1-beta.16.2" 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 8ab5b05..0f7314d 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.1", + "version": "0.1.1-beta.16.2", "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 9c7e3f5..7456506 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.1" + implementationVersion: "0.1.1-beta.16.2" 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 4f554c4..82bd680 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.1", + "version": "0.1.1-beta.16.2", "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 26cfd6a..26f4554 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.1" + implementationVersion: "0.1.1-beta.16.2" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.reactor/manifest.json b/hancore.shibumi.reactor/manifest.json index 6d5fa81..2ca159c 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.1", + "version": "0.1.1-beta.16.2", "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 bb16892..936fdf1 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.1" + implementationVersion: "0.1.1-beta.16.2" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.state/manifest.json b/hancore.shibumi.state/manifest.json index 4429365..ceb07a5 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.1", + "version": "0.1.1-beta.16.2", "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 02af8e6..452b37f 100644 --- a/hancore.shibumi.state/runtime/Runtime.qml +++ b/hancore.shibumi.state/runtime/Runtime.qml @@ -10,7 +10,7 @@ QtObject { id: runtime readonly property int contractVersion: 1 - readonly property string suiteVersion: "0.1.1-beta.16.1" + readonly property string suiteVersion: "0.1.1-beta.16.2" 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 1188a1f..5d9e712 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.1" + implementationVersion: "0.1.1-beta.16.2" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.status/manifest.json b/hancore.shibumi.status/manifest.json index 56ec825..e43f4fa 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.1", + "version": "0.1.1-beta.16.2", "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 bcc8e49..23ead1a 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.1" + implementationVersion: "0.1.1-beta.16.2" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.storage/manifest.json b/hancore.shibumi.storage/manifest.json index a8da307..7131374 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.1", + "version": "0.1.1-beta.16.2", "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 807a6e7..80b0bed 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.1" + implementationVersion: "0.1.1-beta.16.2" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.telemetry/manifest.json b/hancore.shibumi.telemetry/manifest.json index 4ab3418..fae30ed 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.1", + "version": "0.1.1-beta.16.2", "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 e4ead09..dfdad1c 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.1", + "version": "0.1.1-beta.16.2", "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 2a106d9..0eaac8f 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.1" + implementationVersion: "0.1.1-beta.16.2" 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 320f8d5..7a6a85c 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.1", + "version": "0.1.1-beta.16.2", "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 4ec8f38..0bca213 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.1" + implementationVersion: "0.1.1-beta.16.2" owner: root host: root.shell manifest: root.manifest diff --git a/hancore.shibumi.workspaces/manifest.json b/hancore.shibumi.workspaces/manifest.json index 7f40b6f..8f3ae14 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.1", + "version": "0.1.1-beta.16.2", "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 5c97fc3..6a89906 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.1 + pkgver = 0.1.1beta.16.2 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.1.tar.gz::https://github.com/HANCORE-linux/Shibumi-Shell/releases/download/v0.1.1-beta.16.1/shibumi-shell-0.1.1-beta.16.1.tar.gz - sha256sums = 8209b53464b5deeb4025c9ab45038946d2e5a794ae7f368da8bee679fed2f30d + source = shibumi-shell-0.1.1-beta.16.2.tar.gz::https://github.com/HANCORE-linux/Shibumi-Shell/releases/download/v0.1.1-beta.16.2/shibumi-shell-0.1.1-beta.16.2.tar.gz + sha256sums = b98012b096aaee52f036a14d547fb54a5ffd4b7720acb8b5a3b1fd45c3409d62 pkgname = shibumi-shell diff --git a/packaging/aur/PKGBUILD b/packaging/aur/PKGBUILD index e5640b7..6daade5 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.1 -_source_sha256=8209b53464b5deeb4025c9ab45038946d2e5a794ae7f368da8bee679fed2f30d +_upstream_version=0.1.1-beta.16.2 +_source_sha256=b98012b096aaee52f036a14d547fb54a5ffd4b7720acb8b5a3b1fd45c3409d62 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 c369f9e..163d5f2 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.1" + "version": "0.1.1-beta.16.2" } diff --git a/scripts/check-aur-package b/scripts/check-aur-package index 0107b58..9c4dbdd 100755 --- a/scripts/check-aur-package +++ b/scripts/check-aur-package @@ -45,7 +45,7 @@ jq -e '.schemaVersion == 1 "public-beta.11", "step-5-tip", "public-beta.12", "public-beta.13", "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.1", "public-beta.16.2" ]' \ contracts/lifecycle-predecessors-v1.json >/dev/null grep -Fq 'contracts/lifecycle-predecessors-v1.json' "$pkgbuild" || { diff --git a/tests/audio-native-backend-seam-regression.qml b/tests/audio-native-backend-seam-regression.qml index 178c4fb..622530a 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.1", kinds: ["service"]}) + manifest: ({id: "hancore.shibumi.audio", version: "0.1.1-beta.16.2", kinds: ["service"]}) nativeBackendEnabled: true nativeBackendOverride: fakeBackend } diff --git a/tests/audio-runtime-smoke.qml b/tests/audio-runtime-smoke.qml index 8b7880a..404c8b0 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.1", kinds: ["service", "bar-widget"]}) + version: "0.1.1-beta.16.2", 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.1" + implementationVersion: "0.1.1-beta.16.2" owner: tokenState - manifest: ({id: "hancore.shibumi.state", version: "0.1.1-beta.16.1", kinds: ["service"]}) + manifest: ({id: "hancore.shibumi.state", version: "0.1.1-beta.16.2", 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 aa8cfc8..e455e57 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.1" + implementationVersion: "0.1.1-beta.16.2" owner: stateService host: stateHost - manifest: ({ id: "hancore.shibumi.state", version: "0.1.1-beta.16.1", + manifest: ({ id: "hancore.shibumi.state", version: "0.1.1-beta.16.2", 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.1", kinds: ["bar"] }) + version: "0.1.1-beta.16.2", 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.1", kinds: ["service"] }) + version: "0.1.1-beta.16.2", 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.1" + implementationVersion: "0.1.1-beta.16.2" 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.1", + manifest: ({ id: "hancore.shibumi.bar", version: "0.1.1-beta.16.2", 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.1", kinds: ["service"] }) + version: "0.1.1-beta.16.2", kinds: ["service"] }) root.stage = 5; root.waits = 0 } else if (root.stage === 5) { if (root.firstService.releaseCalls !== 2) return diff --git a/tests/bar-visibility-ipc-smoke.qml b/tests/bar-visibility-ipc-smoke.qml index 49ec570..59284ad 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.1", + version: "0.1.1-beta.16.2", kinds: ["bar"] }) pluginRegistry: fakePluginRegistry diff --git a/tests/catalog-service-smoke.qml b/tests/catalog-service-smoke.qml index 3e5dce0..b140fba 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.1" : "invalid", + return {id: "hancore.shibumi.control-center", version: valid ? "0.1.1-beta.16.2" : "invalid", kinds: ["service", "bar-widget"]} } function changedCatalogOutput() { diff --git a/tests/core-services-smoke.qml b/tests/core-services-smoke.qml index 790fd85..226591e 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.1", kinds: ["service"]}) + manifest: ({id: "hancore.shibumi.telemetry", version: "0.1.1-beta.16.2", kinds: ["service"]}) } Cpu.Service { id: cpu shell: fakeShell gpuProbeEnabled: false - manifest: ({id: "hancore.shibumi.cpu", version: "0.1.1-beta.16.1", kinds: ["service"]}) + manifest: ({id: "hancore.shibumi.cpu", version: "0.1.1-beta.16.2", 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.1", kinds: ["service"]}) + manifest: ({id: "hancore.shibumi.power-state", version: "0.1.1-beta.16.2", kinds: ["service"]}) batterySnapshotOverride: ({ready: false}) commandOverrides: ({}) // This pure projection smoke may never launch helpers. } diff --git a/tests/fixtures/native-runtime/probe.py b/tests/fixtures/native-runtime/probe.py index c4b0ccc..538c69c 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.1" + and control["version"] == "0.1.1-beta.16.2" 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 7366614..9f20de0 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", - "tag": "v0.1.1-beta.16", - "revision": "4840482ec0e06a2ebd478120833d4fae1f30889e", - "payloadDigest": "f08b4ec613f248fda62d7dec9865ea46a846fa2e91b2723a186adc0ab0bffc41", - "releaseId": 402148882, - "releaseUrl": "https://github.com/HANCORE-linux/Shibumi-Shell/releases/tag/v0.1.1-beta.16", - "publishedAt": "2026-10-02T20:54:44Z", + "version": "0.1.1-beta.16.1", + "tag": "v0.1.1-beta.16.1", + "revision": "3b35049af69aba57784376e916f50146d61eb411", + "payloadDigest": "46f72fd02b00dbe34326dbbdf6e95556e7e35641a4d597c5281bc2beed94a974", + "releaseId": 402839526, + "releaseUrl": "https://github.com/HANCORE-linux/Shibumi-Shell/releases/tag/v0.1.1-beta.16.1", + "publishedAt": "2026-10-04T04:26:09Z", "prerelease": true } diff --git a/tests/gpu-selection-state-smoke.qml b/tests/gpu-selection-state-smoke.qml index cc06530..8932f87 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.1", kinds: ["service"]}) + manifest: ({id: "hancore.shibumi.state", version: "0.1.1-beta.16.2", kinds: ["service"]}) } Cpu.Service { id: cpuService shell: fakeShell - manifest: ({id: "hancore.shibumi.cpu", version: "0.1.1-beta.16.1", kinds: ["service"]}) + manifest: ({id: "hancore.shibumi.cpu", version: "0.1.1-beta.16.2", kinds: ["service"]}) gpuProbeEnabled: false } diff --git a/tests/host-registry-prime-smoke.qml b/tests/host-registry-prime-smoke.qml index a8710d7..2045514 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.1" + implementationVersion: "0.1.1-beta.16.2" owner: stateOwner host: stateHost manifest: ({ id: "hancore.shibumi.state", - version: "0.1.1-beta.16.1", kinds: ["service"] }) + version: "0.1.1-beta.16.2", kinds: ["service"] }) } QtObject { @@ -77,11 +77,11 @@ ShellRoot { } Shared.Provider { pluginId: "hancore.shibumi.bar" - implementationVersion: "0.1.1-beta.16.1" + implementationVersion: "0.1.1-beta.16.2" owner: owner host: owner.providerHost manifest: ({ id: "hancore.shibumi.bar", - version: "0.1.1-beta.16.1", kinds: ["bar"] }) + version: "0.1.1-beta.16.2", kinds: ["bar"] }) } } } diff --git a/tests/media-spectrum-service-smoke.qml b/tests/media-spectrum-service-smoke.qml index 27b3ab6..5066b2f 100644 --- a/tests/media-spectrum-service-smoke.qml +++ b/tests/media-spectrum-service-smoke.qml @@ -42,7 +42,7 @@ ShellRoot { Media.Service { id: spectrum shell: fakeShell - manifest: ({id: "hancore.shibumi.media", version: "0.1.1-beta.16.1", kinds: ["service", "bar-widget"]}) + manifest: ({id: "hancore.shibumi.media", version: "0.1.1-beta.16.2", kinds: ["service", "bar-widget"]}) } Timer { diff --git a/tests/plugin-update-service-smoke.qml b/tests/plugin-update-service-smoke.qml index 6a5fbf9..f1d15af 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.1", kinds: ["service", "bar-widget"]} + version: "0.1.1-beta.16.2", 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 15c4adf..10b33ab 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.1", kinds: ["service"]}) : null + manifest: root.allowed ? ({id: "hancore.shibumi.power-state", version: "0.1.1-beta.16.2", 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 9fbee18..4593634 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.1", kinds: ["service"], entryPoints: { service: "Service.qml" } }) + readonly property var validManifest: ({ id: "hancore.shibumi.power-state", version: "0.1.1-beta.16.2", 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.1" + implementationVersion: "0.1.1-beta.16.2" owner: state host: root.stateEnabled ? stateHost : null - manifest: ({ id: "hancore.shibumi.state", version: "0.1.1-beta.16.1", kinds: ["service"] }) + manifest: ({ id: "hancore.shibumi.state", version: "0.1.1-beta.16.2", kinds: ["service"] }) } QtObject { id: battery diff --git a/tests/power-service-runtime-smoke.qml b/tests/power-service-runtime-smoke.qml index c8d6f26..a6cfd14 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.1", + manifest: ({ id: "hancore.shibumi.power-state", version: "0.1.1-beta.16.2", kinds: ["service"], entryPoints: { service: "Service.qml" } }) batterySnapshotOverride: ({ ready: false }) commandOverrides: ({ diff --git a/tests/reactor-plugin-smoke.qml b/tests/reactor-plugin-smoke.qml index 6e2ef21..c4de7c4 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.1", kinds: ["service"]}) + manifest: ({id: "hancore.shibumi.audio", version: "0.1.1-beta.16.2", kinds: ["service"]}) nativeBackendEnabled: false } @@ -115,7 +115,7 @@ ShellRoot { Reactor.Service { id: reactorService - manifest: ({id: "hancore.shibumi.reactor", version: "0.1.1-beta.16.1", kinds: ["service"]}) + manifest: ({id: "hancore.shibumi.reactor", version: "0.1.1-beta.16.2", kinds: ["service"]}) shell: fakeShell runtimeProbesEnabled: false } diff --git a/tests/reactor-runtime-smoke.qml b/tests/reactor-runtime-smoke.qml index e98a02a..2605842 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.1", kinds: ["service"]}) + readonly property var manifest: ({id: "hancore.shibumi.reactor", version: "0.1.1-beta.16.2", 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.1" + pluginId: "hancore.shibumi.state"; implementationVersion: "0.1.1-beta.16.2" owner: state; host: root.stateEnabled ? stateHost : null - manifest: ({id: "hancore.shibumi.state", version: "0.1.1-beta.16.1", kinds: ["service"]}) + manifest: ({id: "hancore.shibumi.state", version: "0.1.1-beta.16.2", kinds: ["service"]}) } SuiteRuntime.Provider { - pluginId: "hancore.shibumi.audio"; implementationVersion: "0.1.1-beta.16.1" + pluginId: "hancore.shibumi.audio"; implementationVersion: "0.1.1-beta.16.2" owner: audio; host: root.audioEnabled ? audioHost : null - manifest: ({id: "hancore.shibumi.audio", version: "0.1.1-beta.16.1", kinds: ["service"]}) + manifest: ({id: "hancore.shibumi.audio", version: "0.1.1-beta.16.2", 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 1d7302c..885bd86 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.1", + manifest: ({ id: "hancore.shibumi.state", version: "0.1.1-beta.16.2", 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 ef4bbb5..07b3fec 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.1", kinds: ["service"]}) + manifest: ({id: "hancore.shibumi.state", version: "0.1.1-beta.16.2", 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.1" + implementationVersion: "0.1.1-beta.16.2" owner: barOwner host: barOwner.injectedHost - manifest: ({id: "hancore.shibumi.bar", version: "0.1.1-beta.16.1", kinds: ["bar"]}) + manifest: ({id: "hancore.shibumi.bar", version: "0.1.1-beta.16.2", 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.1" + implementationVersion: "0.1.1-beta.16.2" 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.1", kinds: ["service"]} + state.manifest = {id: "hancore.shibumi.state", version: "0.1.1-beta.16.2", 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.1", kinds: ["service"]} + first.injectedManifest = {id: "hancore.shibumi.audio", version: "0.1.1-beta.16.2", 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.1", kinds: ["service"]}}) + injectedManifest: {id: "hancore.shibumi.audio", version: "0.1.1-beta.16.2", 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.1", kinds: ["service"]} + const malformed = {version: "0.1.1-beta.16.2", 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 ca06499..8bb9ca6 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.1", kinds: ["service"]}) + manifest: ({id: "hancore.shibumi.state", version: "0.1.1-beta.16.2", kinds: ["service"]}) } Component.onCompleted: steps = [ function() { diff --git a/tests/status-plugin-smoke.qml b/tests/status-plugin-smoke.qml index 84f3272..1aab6bf 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.1" + implementationVersion: "0.1.1-beta.16.2" owner: leasedBarOwner host: leasedBarOwner.providerHost manifest: ({ id: "hancore.shibumi.bar", - version: "0.1.1-beta.16.1", kinds: ["bar"] }) + version: "0.1.1-beta.16.2", kinds: ["bar"] }) } } @@ -226,7 +226,7 @@ ShellRoot { Status.Service { shell: rawScopedStatusShell manifest: ({ id: "hancore.shibumi.status", - version: "0.1.1-beta.16.1", kinds: ["service"] }) + version: "0.1.1-beta.16.2", kinds: ["service"] }) actionRunner: actionRecorder runtimeProbesEnabled: false } diff --git a/tests/telemetry-plugins-smoke.qml b/tests/telemetry-plugins-smoke.qml index fe23fd0..e549034 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.1", kinds: ["service"]}) + manifest: ({id: "hancore.shibumi.telemetry", version: "0.1.1-beta.16.2", 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.1", kinds: ["service"]}) + manifest: ({id: "hancore.shibumi.cpu", version: "0.1.1-beta.16.2", kinds: ["service"]}) gpuProbeEnabled: false } diff --git a/tests/telemetry-runtime-smoke.qml b/tests/telemetry-runtime-smoke.qml index 1010b60..7e1ce7f 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.1", kinds: ["service"]} } + function manifest(id) { return {id: id, version: "0.1.1-beta.16.2", 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.1" + implementationVersion: "0.1.1-beta.16.2" 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 bf1b445..9ee5197 100644 --- a/tests/test_package_release.py +++ b/tests/test_package_release.py @@ -223,10 +223,20 @@ def test_lifecycle_contract_pins_exact_release_identities(self) -> None: }, "public-beta.16.1": { "suiteVersion": "0.1.1-beta.16.1", - "sourceRevisions": ["package:0.1.1-beta.16.1"], + "sourceRevisions": [ + "3b35049af69aba57784376e916f50146d61eb411", + "65c8d8bf72a674a35c5bb8ae85d0fff21b4e5cb6", + "package:0.1.1-beta.16.1", + ], "settingsStorageVersion": 1, "payloadDigest": "46f72fd02b00dbe34326dbbdf6e95556e7e35641a4d597c5281bc2beed94a974", }, + "public-beta.16.2": { + "suiteVersion": "0.1.1-beta.16.2", + "sourceRevisions": ["package:0.1.1-beta.16.2"], + "settingsStorageVersion": 1, + "payloadDigest": "79c61d5e048c669c9eb27ebaad21987327892089daea501d0cf4185150a26f9e", + }, } self.assertEqual(set(states), set(expected)) for identity_id, pinned in expected.items(): diff --git a/tests/theme-palette-runtime-smoke.qml b/tests/theme-palette-runtime-smoke.qml index 07c2a21..659a66b 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.1", kinds: ["service"]}) + manifest: ({id: "hancore.shibumi.state", version: "0.1.1-beta.16.2", kinds: ["service"]}) } function colorText(value) { diff --git a/tests/third-party-integration-smoke.qml b/tests/third-party-integration-smoke.qml index 917e372..510b37b 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.1", kinds: ["service"] }) + manifest: ({ id: "hancore.shibumi.audio", version: "0.1.1-beta.16.2", kinds: ["service"] }) } StateOwner.Service { shell: fakeShell omarchyPath: "" manifest: ({ - id: "hancore.shibumi.state", version: "0.1.1-beta.16.1", kinds: ["service"] + id: "hancore.shibumi.state", version: "0.1.1-beta.16.2", kinds: ["service"] }) } diff --git a/tests/widget-pipeline-diagnostics-smoke.qml b/tests/widget-pipeline-diagnostics-smoke.qml index 4c55eab..83b2f62 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.1" + implementationVersion: "0.1.1-beta.16.2" owner: stateOwner host: stateHost manifest: ({ id: "hancore.shibumi.state", - version: "0.1.1-beta.16.1", kinds: ["service"] }) + version: "0.1.1-beta.16.2", kinds: ["service"] }) } QtObject { @@ -290,7 +290,7 @@ ShellRoot { barWidgetRegistry: scopedWidgetRegistry manifest: ({ id: "hancore.shibumi.bar", - version: "0.1.1-beta.16.1", + version: "0.1.1-beta.16.2", kinds: ["bar"] }) barConfig: ({ diff --git a/tests/workspaces-plugin-smoke.qml b/tests/workspaces-plugin-smoke.qml index 5db9ee3..a000fa6 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.1", kinds: ["service"]}) + manifest: ({id: "hancore.shibumi.workspaces", version: "0.1.1-beta.16.2", 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 8e0f67d..0b2aada 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.1", kinds: ["service"]}) + readonly property var validManifest: ({id: "hancore.shibumi.workspaces", version: "0.1.1-beta.16.2", 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.1" + implementationVersion: "0.1.1-beta.16.2" owner: state host: root.stateEnabled ? stateHost : null - manifest: ({id: "hancore.shibumi.state", version: "0.1.1-beta.16.1", kinds: ["service"]}) + manifest: ({id: "hancore.shibumi.state", version: "0.1.1-beta.16.2", kinds: ["service"]}) } QtObject { id: backend