Part of #116 — build ticket from the spec in #123.
Question
Implement the stage-1 fallback header suffix per the spec resolved in #123.
Build checklist
- Protocol — add
is_default: bool to LayoutMessage in daemon/deckd/protocol.py; mirror in client/src/protocol.ts.
- Daemon — set the flag in
daemon/deckd/server.py (push_current/_on_focus): is_default: true only on a genuine focus-driven fallback to store.default(). Force false whenever serving a pinned layout/view (demo ?layout= pin or select_view chrome pin), even if that pinned layout is itself the default.
- Client — render the suffix in
client/src/App.tsx (~line 403). When is_default is true and focused_app is present, append (<id>) where <id> = focused_app.wm_class || focused_app.app_id. Raw string, no prettifying. Otherwise render the name as today (display_name || app).
- Verify the auto-ignore hold: confirm
_on_focus returns early for the deckd window so no push carries deckd's own identity — the suffix must freeze on the last real app, never show Home (deckd).
Tests
- Fake-backend focus of an unmatched app → push has
is_default: true, focused_app.wm_class set; header shows Home (xterm).
- Focus of an identity-matched app →
is_default: false, no suffix.
- Pinned view active →
is_default: false regardless of underlying resolution.
- Null
wm_class (X11 path) falls back to app_id.
Part of #116 — build ticket from the spec in #123.
Question
Implement the stage-1 fallback header suffix per the spec resolved in #123.
Build checklist
is_default: booltoLayoutMessageindaemon/deckd/protocol.py; mirror inclient/src/protocol.ts.daemon/deckd/server.py(push_current/_on_focus):is_default: trueonly on a genuine focus-driven fallback tostore.default(). Forcefalsewhenever serving a pinned layout/view (demo?layout=pin orselect_viewchrome pin), even if that pinned layout is itself the default.client/src/App.tsx(~line 403). Whenis_defaultis true andfocused_appis present, append(<id>)where<id>=focused_app.wm_class || focused_app.app_id. Raw string, no prettifying. Otherwise render the name as today (display_name || app)._on_focusreturns early for the deckd window so no push carries deckd's own identity — the suffix must freeze on the last real app, never showHome (deckd).Tests
is_default: true,focused_app.wm_classset; header showsHome (xterm).is_default: false, no suffix.is_default: falseregardless of underlying resolution.wm_class(X11 path) falls back toapp_id.