- 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
132 lines
6.6 KiB
Markdown
132 lines
6.6 KiB
Markdown
# 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
|
|
at `SSH_AGENTC_REQUEST_IDENTITIES` rather 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:475` consults `unlock_on_demand` in the `Identities` arm;
|
|
the `Sign` arm at `main.rs:511` deliberately does not.
|
|
- `agent/tests/lifecycle.rs:320` and `:444` both 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.
|