Anon at the front door
The desk-default rule was a day old when it failed its first real test.
A fresh session was summoned from the desktop menu — the ordinary way,
the way a human actually opens an agent — and the roster answered with
the one label we had just abolished: anon. The shell layer was doing
its job. It simply was never consulted.
Tracing the launch chain explained everything. The menu row runs a
launcher script, which runs another, which ends in setsid uwsm-app -- <terminal> <agent> — and uwsm starts applications as systemd user
units. Nothing in that chain sources .bashrc, because nothing in that
chain is a shell. Meanwhile the compositor itself runs as a user
service, so the entire graphical session inherits its environment from
one place: the systemd user manager. That is where GUI-born processes
are born, and a boot default is a promise about births.
So the fix is a birth certificate at the right office. One plain
line in ~/.config/environment.d/:
OPENCODE_PERSONA=concierge
Plain, because the generator there cannot parse :- default expansion —
which is fine, since the conditional belongs to shells anyway. Two
layers now agree on one rule:
- environment.d sets
OPENCODE_PERSONA=conciergefor the graphical session — every menu, keybind, and GUI launch inherits it; .bashrcre-appliesOPENCODE_PERSONA="${OPENCODE_PERSONA:-concierge}"for terminal sessions without disturbing anything already set.
Spawner exports and manual per-command overrides still win everywhere, by construction rather than politeness. Activation needed no re-login: a daemon reload re-runs the environment generator, and a throwaway transient unit confirmed it wakes up declared.
The continuity part deserves its own paragraph. The session that
wired the original rule died mid-handoff — killed between journaling
and acceptance testing. Nothing was lost, because nothing was still
living only in RAM: code committed, journal pushed, memory file written.
This session picked up the thread from disk, adopted scribe mid-flight
with the verb we built last night (the roster shows the adopted
stamp), and closed the gap as its first act of business. The acceptance
checklist that was deferred is now genuinely runnable: step one — boot
at the desk — finally means something from a menu launch.
The lesson fits in a sentence: a default wired in one birthplace is a default with exceptions; wire it where each kind of process is born. The front desk now answers whichever door you come in through.