- hypr/apps.lua - hypr/autostart.lua - hypr/envs.lua - hypr/hyprland.lua - hypr/hyprsunset.conf - hypr/input.lua - hypr/looknfeel.lua - hypr/omasettings.lua - hypr/xdph.conf - omarchy/branding/about.txt - omarchy/branding/screensaver.txt - omarchy/extensions/omarchy-menu.jsonc - omarchy/hooks/battery-low.d/play-warning-sound.sample - omarchy/hooks/font-set.d/show-font-notification.sample - omarchy/hooks/post-boot.d/weather.sample - omarchy/hooks/post-update.d/install-voxtype.hook - omarchy/hooks/post-update.d/setup-agent.hook - omarchy/hooks/post-update.d/setup-fingerprint.hook - omarchy/hooks/post-update.d/show-update-notification.sample - omarchy/hooks/pre-refresh-pacman.d/add-custom-repo.sample - omarchy/hooks/theme-set.d/show-theme-notification.sample - omarchy/shell.json - omarchy/shell.toml - omarchy/theme.name - omarchy/themes/azure-glow/README.md - omarchy/themes/azure-glow/alacritty.toml - omarchy/themes/azure-glow/btop.theme - omarchy/themes/azure-glow/hyprland.conf - omarchy/themes/azure-glow/hyprlock.conf - omarchy/themes/azure-glow/icons.theme - … 269 more
6.6 KiB
Known Defects
Found outside a task's own verification, during the Task 20 manual matrix. Each entry records what was observed, what the code actually does, and how it was resolved.
1. README described sshAgentUnlockOnDemand as gating signing
Status: fixed in the same commit. Found 2026-08-31 on feature/ssh-agent.
Observed: With Unlock on demand switched off and the vault locked,
ssh-add -T against a projected public key still opened the panel's unlock
prompt. Dismissing it returned "agent refused operation" for both the Ed25519
and the RSA key.
Verdict: the code is correct and the documentation was wrong. The setting governs the identity listing on a cold cache, not signing. A locked signing request for a key the helper already holds in its public cache always raises the unlock prompt and parks the request; dismissing the prompt is what refuses it, and it refuses immediately rather than at the deadline.
Where that is settled:
docs/ideas/ssh-agent.md:178-- the state table row for "Locked, cache available" reads "List public identities; signing asks panel to unlock", with no condition attached.docs/ideas/ssh-agent.md:310-- "When it is on, unlock-on-demand must begin atSSH_AGENTC_REQUEST_IDENTITIESrather than at the sign request: with no cache there are no identities to offer, so no sign request will ever arrive."agent/src/main.rs:475consultsunlock_on_demandin theIdentitiesarm; theSignarm atmain.rs:511deliberately does not.agent/tests/lifecycle.rs:320and:444both assert the locked-sign behavior without ever setting the option, so the default already covers it.
Fixed by rewriting README "While the vault is locked" to separate the two
moments, and rewriting the sshAgentUnlockOnDemand row in the configuration
reference. No code change; the helper binary is unaffected and needs no
rebuild.
Consequence for the Task 20 matrix: the "off -> refused, no panel" row as originally written cannot pass, because it describes behavior the design does not have. Signing refusal while locked is tested by dismissing the prompt, and by asking for a key the public cache does not know.
2. A grant's remaining time never counted down
Status: fixed. Found 2026-08-31 on feature/ssh-agent, during the Task 20
manual matrix.
Observed: With one live grant, the ACTIVE APPROVALS row on the SSH agent
settings screen read "1m 59s left" for the whole two minutes and then the row
disappeared, having never counted down. sshAgentStatus reported
"grants":1 throughout.
Cause: sshAgentGrantViews computed remainingLabel from the companion's
expiresInSec at the instant of the announcement, and the companion announces
a grant once and says nothing further until the set changes. The view was a
snapshot rendered for the life of the grant; nothing re-derived it, and
nothing dropped a lapsed grant until the next announcement arrived.
Fixed by stamping each announced grant with expiresAtMs -- when it runs
out rather than how long it had left -- and adding sshAgentGrantsAt(views, nowMs), which re-derives the remaining time for a given moment and drops what
has lapsed. Panel.sshGrants became a derived property over
sshGrantsAnnounced and a sshGrantTick driven by a 1s timer that runs only
while grants exist, matching the cooldown countdown. Both fallbacks are
deliberate: an unstamped view, or any view before the first tick, is shown as
announced rather than dropped, because a grant must never disappear merely
because a timer has not run yet.
Also worth knowing: the same staleness would have hidden a grant that had
genuinely expired, since sshAgentStatus reported the announced count rather
than the live one. It now reports the live one.
3. The helper leaks its runtime files when the plugin is removed
Status: open, low severity. Found 2026-08-31 during the Task 20 manual matrix.
Observed: After omarchy plugin remove with the SSH agent still enabled,
/run/user/1000/qs-bitwarden-cli/ still held ssh-agent.sock,
ssh-agent.lock and ssh-keys.fifo, with no helper process running.
Cause: ServiceRuntime and Runtime in agent/src/runtime.rs:264 and
:320 unlink those files from Drop, which runs on a graceful shutdown --
which is why turning the agent off leaves nothing behind. Tearing the plugin
down kills the helper rather than shutting it down, so Drop never runs.
Impact: Small. The files are on a tmpfs and go with the login session, and
omarchy plugin remove has no uninstall hook, so nothing of ours can run at
that moment anyway. Until the next login, a client routed at that path finds a
socket that answers nothing rather than no socket at all.
Possible fix: A SIGTERM handler in the helper that runs the same cleanup,
if the shell terminates rather than kills the process. Drop cannot help
against SIGKILL and nothing can. Worth checking which signal the shell
actually sends before writing the handler.
Documented meanwhile in the README's Uninstall section: turn the agent off before removing the plugin, and what the three files are if you did not.
4. The uninstall instructions destroyed a stow-managed shell.json
Status: fixed. Found 2026-08-31 during the Task 20 manual matrix, on the maintainer's own machine.
Observed: Following the Uninstall section, the step "delete the
io.github.elevate08.qs-bitwarden-cli key under plugins" was carried out by
removing ~/.config/omarchy/shell.json. Every configured plugin disappeared
from the bar, not only this one, and the shell came up on its built-in
defaults.
Cause: That path was a stow symlink into ~/projects/dotfiles. Deleting
it removed the link, not the configuration; the shell then found no user
config at all. The real file was intact in the repository throughout, and
restoring the symlink restored everything.
The instruction was also redundant: omarchy plugin remove already calls
omarchy-shell shell setPluginEnabled <id> false, which removes the bar entry
and its settings before the directory goes.
Fixed by deleting the hand-edit step, naming omarchy plugin disable for
the stale-entry case, and warning plainly that shell.json is often a symlink
and must be changed through the shell rather than edited. Nothing in the
Uninstall section now tells a user to touch a file the shell owns.
Worth remembering: every other path in that section is under this plugin's own directories, where a mistake costs the user only this plugin's data. This one step reached into a file shared by every plugin on the system, and that is what made a documentation error destructive.