git.lucas.co / cce-compositor
Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git

commitec8377ad9415ce80ce57d4356c559480f3fab643
parent0a5dfb44aa
authorLucas Galante <[email protected]>
date2026-08-31 12:46
Drop the retired keyring-unlock residue from ccebuild and docs

cce-display-manager retired the KeePassXC unlock chain (TPM-unlocked
gnome-keyring since 2026-08-29) and, in its own repo today, deleted the
three inert cce-keyring-unlock* binaries. Follow-ups here:

- ccebuild install-system: drop the two /usr/local/sbin pairs for the
  deleted binaries — with them gone from cargo metadata the guard
  'not built — run: ccebuild build' would fail every run.
- scripts/cce-keyring-selftest: remove this stray duplicate. The
  canonical copy lives in cce-display-manager (as crate_scripts()'s own
  comment says), and was rewritten today for the gnome-keyring design;
  the CCE_LOG runtime-dir improvement this copy carried moved with it.
  A leftover here would clobber the real one on any cce-compositor
  install, resurrecting the retired checks.
- WORKSPACE.md / comments: stop citing the keyring helpers in the
  present tense; the org.freedesktop.secrets dbus shadow now redirects
  to the TPM-unlocking unit, not KeePassXC.

Co-Authored-By: Claude Fable 5 <[email protected]>

 WORKSPACE.md                 |   4 +-
 scripts/cce-keyring-selftest | 113 -------------------------------------------
 scripts/ccebuild             |  11 ++---
 3 files changed, 7 insertions(+), 121 deletions(-)

diff --git a/WORKSPACE.md b/WORKSPACE.md
index 3ccc384..b591b6b 100644
--- a/WORKSPACE.md
+++ b/WORKSPACE.md
@@ -208,8 +208,8 @@ crates (~11s). Pick one shape and stay with it.
 
 Binary names do not reliably match the crate: `cce-fx` lives in `cce-compositor/`,
 `cce-system-interface` and `cce-files` declare explicit `[[bin]]` names, and several
-crates ship extra bins (`cce-ui` → `cce-ramp`/`cce-relief`, `cce-compositor` → `ccectl`,
-`cce-display-manager` → three keyring helpers). Ask cargo rather than guessing:
+crates ship extra bins (`cce-ui` → `cce-ramp`/`cce-relief`, `cce-compositor` →
+`ccectl`). Ask cargo rather than guessing:
 `cargo metadata --no-deps --format-version 1 | jq -r '.packages[].targets[] | select(.kind|index("bin")) | .name'`.
 
 ## The `cce-ui` toolkit (start here for any client work)
diff --git a/scripts/cce-keyring-selftest b/scripts/cce-keyring-selftest
deleted file mode 100755
index e1c749e..0000000
--- a/scripts/cce-keyring-selftest
+++ /dev/null
@@ -1,113 +0,0 @@
-#!/usr/bin/env bash
-# cce-keyring-selftest — did this login's keyring chain work?
-#
-# Written 2026-08-16 alongside the login-race fix (cce@9d454c4,
-# cce-display-manager@d7cc6ec/17bfb9d). Run it after logging in.
-#
-# Everything read here is scoped to the CURRENT session: the journal is durable
-# but queried from the compositor's start time, and the compositor log now
-# lives in the per-user runtime dir (moved out of /tmp in cce@522ce13), which
-# is cleared at logout. So run this before logging out — afterwards the log
-# half of the answer is simply gone. The /tmp fallback covers a session started
-# by a pre-move startcce.
-CCE_LOG="${XDG_RUNTIME_DIR:-/run/user/$(id -u)}/cce/cce.log"
-[ -f "$CCE_LOG" ] || CCE_LOG=/tmp/cce.log
-
-pass=0 fail=0
-ok()   { printf '  \033[32mPASS\033[0m  %s\n' "$1"; pass=$((pass+1)); }
-bad()  { printf '  \033[31mFAIL\033[0m  %s\n' "$1"; fail=$((fail+1)); }
-info() { printf '        %s\n' "$1"; }
-
-# Everything must be scoped to THIS login, not `journalctl -b`: one boot spans
-# many sessions here (the machine stays up for days), and boot-wide counts made
-# a healthy login look like 32 failed claude-desktop launches.
-#
-# Find the compositor by /proc/<pid>/exe basename, never comm or a pgrep
-# pattern: it is launched through the `cce` symlink, so its comm is "cce", but
-# a `make run` leftover has comm "cce-fx".
-compositor_pid() {
-    local p exe
-    for p in /proc/[0-9]*; do
-        exe=$(readlink "$p/exe" 2>/dev/null) || continue
-        exe=${exe% (deleted)}
-        [ "${exe##*/}" = cce-fx ] && { printf '%s\n' "${p#/proc/}"; return 0; }
-    done
-    return 1
-}
-
-if cce_pid=$(compositor_pid); then
-    SINCE=$(date -d "$(ps -o lstart= -p "$cce_pid")" '+%Y-%m-%d %H:%M:%S')
-else
-    SINCE=$(date -d '-10 minutes' '+%Y-%m-%d %H:%M:%S')
-fi
-jl() { journalctl --since "$SINCE" --no-pager "$@" 2>/dev/null; }
-
-echo "cce keyring self-test — session (compositor) started $SINCE"
-echo
-
-# 1. Is the Secret Service actually open right now?
-locked=$(busctl --user get-property org.freedesktop.secrets \
-    /org/freedesktop/secrets/aliases/default \
-    org.freedesktop.Secret.Collection Locked 2>/dev/null)
-[ "$locked" = "b false" ] && ok "keyring is unlocked" || bad "keyring is ${locked:-unreachable}"
-
-# 2. Did KeePassXC come up from its own unit rather than session restore?
-if systemctl --user is-active --quiet cce-keepassxc.service; then
-    ok "cce-keepassxc.service active"
-else
-    bad "cce-keepassxc.service not active"
-fi
-
-# 3. Unlock latency: KeePassXC start -> daemon confirmed. Was 46s pre-fix.
-uline=$(jl -u cce-keyring-unlockd.service | grep 'unlocked and verified' | tail -1)
-if [ -n "$uline" ]; then
-    # InactiveExit, not ActiveEnter: ExecStartPost does the unlocking, so the
-    # unit only reaches "active" AFTER the unlock — measuring from ActiveEnter
-    # reports a negative latency.
-    kstart=$(systemctl --user show cce-keepassxc.service -p InactiveExitTimestamp --value)
-    utime=$(printf '%s\n' "$uline" | awk '{print $1, $2, $3}')
-    if [ -n "$kstart" ]; then
-        secs=$(( $(date -d "$utime" +%s) - $(date -d "$(printf '%s' "$kstart" | cut -d' ' -f2-3)" +%s) ))
-        info "unlocked ${secs}s after KeePassXC started (was 46s before the fix)"
-    fi
-    ok "keyring unlock confirmed this session"
-else
-    bad "no successful unlock recorded this session"
-fi
-
-# 4. Did the compositor barrier engage, and for how long?
-bline=$(grep -h -E 'Keyring (unlocked after|still locked)|No Secret Service' "$CCE_LOG" 2>/dev/null | tail -1)
-case "$bline" in
-    *"Keyring unlocked after"*) ok "barrier released: ${bline##*] }" ;;
-    *"still locked"*)           bad "barrier hit its timeout: ${bline##*] }" ;;
-    *"No Secret Service"*)      bad "no Secret Service seen: ${bline##*] }" ;;
-    *) info "no barrier line in $CCE_LOG (no gated app restored?)" ;;
-esac
-
-# 5. The actual question: is claude-desktop alive and loaded? The failing one
-#    died at 73MB; a working one is hundreds of MB.
-mainpid=$(pgrep -f 'claude-desktop --password-store' | head -1)
-if [ -n "$mainpid" ]; then
-    rss=$(awk '/VmRSS/{print $2}' "/proc/$mainpid/status" 2>/dev/null)
-    rssmb=$(( ${rss:-0} / 1024 ))
-    if [ "$rssmb" -gt 300 ]; then
-        ok "claude-desktop running and loaded (${rssmb}MB, pid $mainpid)"
-    else
-        bad "claude-desktop running but only ${rssmb}MB — may be stalled on the keyring"
-    fi
-else
-    bad "claude-desktop not running"
-fi
-
-# 6. Did it need a relaunch? More than one launch this session = the restored
-#    one died and had to be started again by hand — the original symptom.
-scopes=$(jl --user | grep -c 'Started app-claude-desktop-.*\.scope')
-if [ "$scopes" -le 1 ]; then
-    ok "claude-desktop started once this session ($scopes launch)"
-else
-    bad "claude-desktop launched $scopes times this session — first attempt(s) died"
-fi
-
-echo
-printf '%d passed, %d failed\n' "$pass" "$fail"
-[ "$fail" -eq 0 ]
diff --git a/scripts/ccebuild b/scripts/ccebuild
index a993e8f..b0edc4f 100755
--- a/scripts/ccebuild
+++ b/scripts/ccebuild
@@ -18,9 +18,9 @@ EXCLUDE=(vk-smoke)
 # installed here.
 #
 # Classified per FILE, from the unit's own [Install] WantedBy, because a crate
-# can legitimately ship both: cce-display-manager has the root unlock daemon
-# (multi-user.target) next to the per-session unlock client and KeePassXC units
-# (graphical-session.target). The old per-crate exclusion list swallowed the
+# can legitimately ship both: cce-display-manager once had the root unlock
+# daemon (multi-user.target) next to the per-session unlock client and KeePassXC
+# units (graphical-session.target). The old per-crate exclusion list swallowed the
 # whole crate, so its user units silently never installed — the same
 # hand-maintained-list failure this script exists to avoid. Matching is exact:
 # graphical.target and graphical-session.target are different targets.
@@ -189,7 +189,8 @@ crate_scripts() {
 # D-Bus activation files a crate ships in its dbus/ dir, installed to
 # ~/.local/share/dbus-1/services where they shadow /usr/share ones by basename
 # (that shadowing is the mechanism: org.freedesktop.secrets.service overrides
-# gnome-keyring's with KeePassXC's unit). Same .service extension as systemd
+# the stock gnome-keyring activation with the TPM-unlocking unit's). Same
+# .service extension as systemd
 # units, but user_units() cannot mistake one for a unit: it keys on [Install]
 # WantedBy, which D-Bus files don't have.
 dbus_services() {
@@ -629,8 +630,6 @@ cmd_install_system() {
     fi
     local pairs=(
         "cce-display-manager:/usr/bin/cce-display-manager"
-        "cce-keyring-unlockd:/usr/local/sbin/cce-keyring-unlockd"
-        "cce-keyring-unlock-setup:/usr/local/sbin/cce-keyring-unlock-setup"
     )
     local entry bin dest
     for entry in "${pairs[@]}"; do