Skip to content

RyzenStatus 1.78.2: sleep fixes, companions on every display and alarms - #83

Merged
DrogaBox merged 47 commits into
mainfrom
feature/companions-1.78.0
Nov 5, 2026
Merged

DrogaBox merged 47 commits into
mainfrom
feature/companions-1.78.0

Conversation

@DrogaBox

@DrogaBox DrogaBox commented Nov 4, 2026 •

Copy link
Copy Markdown
Owner

RyzenStatus 1.78.2 (includes 1.78.0 and 1.78.1)

Kexts 3.40.1. The full notes are in CHANGELOG.md.

1.78.2: sleep does what we said it did

  • Presets after sleep: the saved preset, custom profile or Gaming Mode now comes back after wake.
  • Boost after sleep: the kext restores the Core Performance Boost choice, and each core changes only its own bit.
  • Adaptive Power: the limit recovers after wake and climbs back with Auto EPP off.
  • Rejected settings and fans: a change the kext refuses goes back to the real state.
  • Less work while hidden: polling and animations stop while their window is closed or covered.
  • Kexts: lifetime, locking and clean-output fixes.

1.78.0 and 1.78.1

Companions on every display, alarms, send everyone home, desktop bodies, eight companions drawn anew, and companions keeping their shape.

Checks

  • ./build.sh --test: 20202 checks OK. Concurrency gate: 0 diagnostics. Selftest OK. FPU check OK.
  • DMG built from the pinned zip: content pins and code signatures verified.
  • Measured on a Ryzen 9 5900XT across real sleep cycles: S3 drops the SMU limit to the BIOS cap, and the app restores Eco, Balance, Gaming Mode and Adaptive Power after wake. Boost stays as set with Eco and Balance.
  • The kexts in the zip differ from the ones run in those tests only in version: the plugin binary is identical, the driver differs in its UUID and version string.
  • Not exercised on hardware: Auto EPP limits after wake, and polling and animations stopping while hidden (tests only).

Droga added 30 commits November 3, 2026 18:05
Out on the desktop, companions walk on into a display beside theirs,
fly across when thrown, set off now and then to see another display,
walk over to join the others and gather on one display for the gang's
plays; guests may arrive on any display.

The companion keeps alarm clocks: times, repeat days, labels, snooze
and a sound from its tunes, the Mac's sounds or files added to the
list. They are set on a sign it holds up, from its menu or Settings,
and ring with the companion out holding a flashing sign with a
rattling clock, getting crosser the longer it rings, with Stop and
Snooze on the sign and the keys. A siren in its menu sends every
guest home at once.
The ballerina, the danseur and the contemporary dancer were a ball
head over a trapezoid on stick legs. Each is now a chibi of their own,
drawn in layers like the hologram and the android: a big head with
their own skin and hair, big eyes left clear for every mood, and a
costume the palette dyes, white and silver on pearl and dark on a dark
hand-picked colour.

- The ballerina wears her hair in a bun with a tiara, a sweetheart
  bodice and a layered platter tutu with tulle pleats, pink tights and
  satin pointe shoes with crossed ribbons, standing en pointe with her
  arms soft and low.
- The danseur has a swept blond quiff, an embroidered tunic with gold
  frogging, collar, epaulettes, cuffs and a belt, white tights and
  slippers, and holds a strong second.
- The contemporary dancer goes barefoot in wide soft trousers and a
  loose blouse off one shoulder under a sheer wrap, with loose hair
  under a messy topknot and a chiffon veil hanging from her arm.

Their arms and legs are drawn apart from the body and take fourteen
poses built with the same commands, so they morph: asleep they fold
their arms and come down off their toes; they cheer, wave and bow;
on the desktop their solo dances hold an arabesque, draw up a retiré
for turns, split in a grand jeté and cross for a tour en l'air; and
they glide with gaits of their own, the ballerina in a quick bourrée.
The veil and wrap sway while motion is welcome.

Hands, feet and floor are read off the resting pose, so held things,
shoes and skates sit where they belong; a hat or the swan crown hides
the bun, knot and tiara, and a scarf sits at the neck. Tests pin the
morphs, the anatomy and the colours.
The phoenix was a blob with spikes. It is now a round little firebird
front on, drawn in layers like the hologram, the android and the
dancers: a big round head with big eyes over a small gold beak, a warm
cream breast with a few feather scallops, broad wings tipped with three
feathers of flame, a crest of three flames licking up from its crown, a
long tail of flame plumes sweeping out and curling, gold talons, a soft
warm glow behind it and embers drifting up off it. The palette dyes its
feathers; the fire burns in its own colours on every palette and any
picked colour.

The five animals that come next share how they are drawn: each part is
a path for every pose, built with the same commands so poses morph, and
the paint it wears, the body's own fur gradient included, so a fusion
or a transformation paints it too. A shared parts class stacks them
behind the body, over it and in front, and moves them: asleep the
phoenix folds its wings and its fire sinks to embers, which go on
rising slowly; awake it flares back up. It cheers with its wings up,
waves one, bows, flares its crest when startled and hops along with
its wings bobbing. While motion is welcome its crest and tail flicker
and embers rise, in the render server with no timer in the app.

A hat puts out the crest. Face, head outline, neck and anatomy are
measured for the new shape, and its bounds are read off its parts.
Tests pin the morphs, the square, the anatomy and the colours.
The mouse was two circles with ears. It is now a tiny round mouse
sitting up, front on, drawn in parts like the phoenix: a big round head
with big eyes, two huge round ears with pink insides, a pale muzzle
with a pink nose and three whiskers either side, rosy cheeks, a pale
belly, little arms with pink paws at its sides, two pink feet and a
long thin pink tail that curls up behind it in a hook. The palette dyes
its fur; the pinks lean toward its colour and the whiskers go light on
dark fur, so a pearl mouse is a white mouse and a dark one a black one.

Asleep it lays its ears back, tucks its paws under its chin and lets
its tail lie along the floor. It throws up its paws for a cheer, waves,
bows, flicks its ears when startled and scurries on quick little feet,
one foot and then the other. While motion is welcome its whiskers
quiver and its tail sways.

Face, head outline and anatomy are measured for the new shape, so held
things sit in its paws and shoes on its feet. Tests pin its parts.
The axolotl was a rounded box with sticks for gills. It is now a little
water salamander standing up, front on, drawn in parts like the phoenix
and the mouse: a wide flat head with its eyes set far apart, the wide
content smile every axolotl wears, rosy cheeks and a few freckles, three
plump gill fronds fanning out of each side of its head with scalloped
edges and a paler rib down each, a pale belly, stubby arms with four
little round fingers, stubby legs with round toes and a thick tail with
a see-through fin along its top that curls up behind it.

The palette dyes its skin; its gills lean a third of the way round the
colour wheel toward pink, so a blue axolotl's go violet, a pink one's
deepen to rose and a grey or white one gets the classic pink. On dark
skin the smile and the gills go light.

Asleep its gills droop and its tail lies along the floor. It throws up
its arms for a cheer, waves, bows, flares its gills when startled and
waddles on its stubby legs. While motion is welcome its gills wave and
its tail sways.

Face, head outline and anatomy are measured for the new shape, so held
things sit in its hands and shoes on its feet. Tests pin its parts.
The cat was one big oval with triangles for ears. It is now a kitten
sitting up, front on, drawn in parts like the phoenix and the mouse: a
wide round head with fluffy cheeks, two pointed ears with pink insides,
tabby stripes on its brow and cheeks, a pale muzzle with a little pink
nose and long whiskers, rosy cheeks, a pale bib, front legs with white
socks, two haunches with white hind feet, and a thick striped tail that
curls up beside it like a question mark. The palette dyes its fur and
its stripes take a deep tone of it, so lemon makes a ginger cat, pearl
a silver tabby and a dark picked colour a tuxedo cat in white socks.

Asleep it relaxes its ears, tucks its paws together and wraps its tail
round on the floor. It throws up its paws for a cheer, waves, bows and
pads along softly, one foot and then the other. Its ears flick now and
then and when it reacts, and nothing else moves with them; while motion
is welcome its tail sways. Under a hat its ears lie out to the sides
and peek from under the brim.

Face, head outline, neck and anatomy are measured for the new shape, so
held things sit in its front paws and shoes on its feet. Tests pin its
parts, poses, anatomy, colours and gait.
The swan was one outline with a crown and a mask laid over it. It is now
a plump little swan standing up, front on, drawn in parts like the
phoenix, the mouse and the axolotl: a big round head on a long neck with
a gentle bend in it, round eyes either side of the black knob of an
orange bill with a pale nail at its tip, rosy cheeks, a little gold
tiara with a jewel on its crown, a soft breast of scalloped feathers,
two broad wings folded at its sides like a tutu with rounded flight
feathers at their ends, a short soft tail behind it and two little
webbed feet.

The palette dyes its feathers; a pearl swan is a white swan. On dark
feathers it becomes a black swan, with a red bill tipped white, light
scallops and grey feet.

It cheers with both wings up, spreads them wide, waves one, bows and
pads along on its webbed feet, one and then the other, and its solo
dances on the desktop now move its wings and feet. Asleep it folds its
wings in close and lets its tail droop. While motion is welcome its
tail sways.

A hat or the swan crown takes off the tiara. Face, head outline, neck
and anatomy are measured for the new shape, so held things sit at its
wing tips, a scarf round its neck and shoes on its feet. Tests pin its
parts and the black swan's bill.
The minimal companion, the robot, the chip and the fan are only a head.
In the island they stay that way; out on the desktop they now walk on a
little chibi body under a smaller head, each in its own design: the
robot a boxy metal chest with a screen and a heart light, a belt and
ball joints at shoulders, elbows and knees, round mitts and boots; the
chip a package body with side pins and a pin-one dot on bent pin legs
with tinned pads and solder-ball hands; the fan a vented frame with
slats and corner screws on splayed stand struts with rubber feet and
grommet hands; the minimal companion a small clean body in the shape of
its own head, ball, egg, squircle or pill, with soft round limbs.

The desktop asks for it by setting growsBody on its rig. The rig then
draws the head, its face, pins, blades, props and fusion marks smaller
over the body through one transform, dresses the figure on the body's
anatomy, so held things sit in its hands, shoes on its feet, wings and
jetpacks behind its back and hats on the smaller head, and stands it on
its soles. Its gradient and details come from each palette and any
hand-picked colour.

Its arms and legs keep a pose for each face: hands on its hips when
cross or smug, arms up in a fright, fists up when thrilled, limp when
bored or sad, hands on its tummy asleep. It cheers and waves in a
reaction, marches one knee up then the other as it walks with a gait of
its own, and breathes, squashes and stretches with the rest of the
figure. The robot's heart light beats while motion is welcome. Every
pose is built with the same commands so one morphs into the next.

Tests pin the poses, the fit of the head, the anatomy and the colours.
…1e87622820d557ba

# Conflicts:
#	Tests/MetricsTests.swift
Its short straight neck read more like a pigeon than a swan. The head
stays where it was, the body sits lower and a little smaller, and the
neck between them is now long and slender, curving out to one side and
back in an S. Wings, breast, tail, feet, torso and scarf follow the new
body.
Companions on every display, alarms, a way to send every visitor home,
desktop bodies for the four head-only figures and eight companions
drawn anew.
The redrawn animals and the ballerina hold things in paws that sit close
in under the face, so a staff, a sword, a sceptre or a kite rising from
the grip crossed their eyes. A held thing that would reach the eyes now
leans out from the grip, only as far as it takes to leave the face clear;
everything that already stood clear is drawn as before.
Alarms stored their dates as seconds since 1970, which rounds off the
last bit of a time taken from the clock about half the time, so a saved
alarm did not always come back equal to itself. They now keep the
encoder's own form, which comes back exact. Alarms are new in this
version, so there is no older data to read.
On the desktop a figure that is only a head grows a body and wears a
smaller head, set as a transform on the head's layers. Drawing it again,
on another screen, with another look or as another figure, set those
layers' frames while they still wore that transform, so the head was
measured through it: it came out large and off to one side with its
fill washed out, and stayed so until the companion was changed. The
transform now comes off before the layers are measured and goes back on
after.
A companion with a grown body keeps its head in shape when it is drawn again.
The wake observer listened on NotificationCenter.default, but AppKit posts NSWorkspace.didWakeNotification on the workspace center, so reapplySaved() never ran after wake and the CPU stayed on firmware limits while the UI showed the saved preset. Built; not run through a real sleep.
The load it checks before climbing only updates while Auto EPP polls, so with Auto EPP off it stayed at 0 or frozen and the limit stayed at its floor. It now reads the load itself when Auto EPP is not running. A profile written in full after wake or a kext load also restarts the limit at its PPT, so the service no longer remembers a lower value than the hardware has.
The picker offers items by the friend's level, but desktopFriend checked the pick against the main companion's, so an item valid for the friend could be stripped to none. With no item given, the friend keeps the pick it had.
Showing the window added a client without setting the visibility flag, so the occlusion observer could add a second, and closing removed one, leaving the samplers at foreground cadence with no UI open. Both now go through the flag, and closing a covered window no longer removes a client it already gave up.
Selector 57 op 2 answers with one scalar. Passing no output room should make the call return an error even though the capture ran, which aborts the PM table export when no snapshot exists yet.
configure only ended it when the assigned item changed, so a new figure kept wearing the item picked for the old one until the play ran out.
forgetSMUSettingsForSleep left the OC VID, all-core Curve Optimizer and boost limit caches, so selector 62 kept reporting pre-sleep values after the SMU had reset them.
setCPBState read HWCR on one core outside the lock and wrote that whole value to every core. Each core now changes only CpbDis in its own register. The requested state is kept and put back with the rest of the per-core setup, since firmware resets it across S3.
setPMPStateLimit(0) skipped the reset, and with a limit of 0 set_PState no longer writes, so cores idling in P1 or P2 stayed there. Only reachable where legacy P-state control is active; Zen 3 and later never write that MSR.
A failed start() gets free() without stop(), so the CPPC memory maps and the Super I/O object mapped earlier in start() were never released.
The two neighbouring helpers guard against a logical CPU with no core and this one did not. Defensive: no case with a NULL core has been observed.
Droga added 17 commits November 4, 2026 20:24
VirtualSMC keeps pointers to the plugin and to key objects whose code lives in this kext, and offers no way to take them back. An unload would leave SMC reads jumping into unmapped text. The kext now retains itself after a successful submit, in source because the kext project is not in this repository.
Selector 64 held only controlLock while the thermal path reaches the same PCC channel under only rendezvousLock, so the two could interleave on the shared memory and doorbell. The order controlLock then rendezvousLock matches selectors 24 and 25.
Selectors that leave the caller-supplied output count untouched would return whatever the reply buffer held. Clearing them closes that for every selector without changing what any of them writes.
reapplySaved returned early during Gaming Mode, which left firmware limits after wake; it now puts Extreme back. Leaving Gaming Mode or turning Auto EPP off restores the selected custom profile, as reapplySaved already does, instead of only a preset. A preset or profile refused for privileges also gives back the manual EPP and the custom selection it replaced.
EPP, CPB, PPM, LPM and C6 were saved before the kext call and stayed saved when it failed, so the rejected value came back on the next launch. The EPP picker also snapped to the value of an inactive CPPC mode; it now follows only an active one.
A refused manual write left the fan in manual mode, so the thermal guard sent it again on every poll. A write refused for privileges now returns the fan to its real state; other failures keep the choice so a passing error does not lose it. Picking a curve on a fan card also turns Dynamic Curves on, since launch setup needs both.
A retained hierarchy gets no onDisappear when its window closes or is covered, so the live sync, fan and C6 residency polls kept running. They now follow WindowVisibilityReader.
Aura, fusion art, sprite loops and the groove subscription only checked reduce motion, so static preview tiles and hidden windows kept running emitters and infinite animations. They now follow the same motion rule as the rest of the rig.
Picking the item it already has, pressing Use item or turning the option off now ends a dress-up. The stage preview follows the friend keys and the resting preview uses the full look, so both show what was chosen.
Each companion on the desktop installed its own three event monitors and read the window list itself, up to 72 monitors and many window server queries a second with a gang out. They now share one set of monitors and an 80 ms snapshot. removeMonitors also drops the screen observer, and the display link no longer holds the companion.
The 6 s play tick ran and saved RPG state with the companion disabled. Announced departure keys were kept forever; they now go once the event has started.
AppSwitcher.suspend left the keyboard layout observer and preview warming running, unlike its disabled path. Activation generations kept every PID ever activated.
Every preference sync built a new status item over the old one. The resolved artwork cache grew with every track; it now resets at 64 entries, the bound the lyrics cache uses.
AutoQuitService kept window watch retries for a quit app, which a reused PID then inherited. DiskSampler kept metadata, rates and totals for every volume ever mounted.
USB watching, pings, wallpaper previews, process lists and one-second countdowns relied on onDisappear, which a retained hierarchy does not get when its window closes or is covered. They now follow window visibility. Local event monitors are also removed when their coordinator goes away, and the time wheel only holds one while hovered.
Unreleased entry. Credits Izzy for noticing that sleep was not working as assumed.
App version 1.78.2, build 144. Kexts 3.40.1 rebuilt into the release zip with their four pins refreshed: the plugin binary matches the one tested on hardware, the driver differs only in its UUID and version string.
@DrogaBox DrogaBox changed the title RyzenStatus 1.78.1: companions on every display, alarms and desktop bodies RyzenStatus 1.78.2: sleep fixes, companions on every display and alarms Nov 5, 2026
@DrogaBox
DrogaBox merged commit 8e2791c into main Nov 5, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants