You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
docs/reference/ipc.md said in four places that the server pushes
event envelopes after events.subscribe; the op has always answered
not-implemented (ops::EVENTS_SUBSCRIBE in roost-engine/src/ipc.rs).
All four sites now document the real error reply, point callers at
polling, and carry a forward note: HS-1 delivers events as atomic
{revision, events[]} EventBatches (types landed in roost-ipc on this
branch). The event catalog stays, reframed as the shape a future
push will carry (plan 033 / HS-0, D7).
Also sweeps the profile docs for the new Session profile: paths.md
gains the reserved-profile row, the session path table (with the
-dev split), and the ROOST_BUNDLE_PROFILE note; ipc.md points at it
from the socket-path section. setup.md's profile table is
deliberately untouched — it is scoped to UI profiles and roostctl
targets, which Session is not.
Docs-only commit; self-reviewed (paths and op behavior were
code-verified earlier in this branch's commits).
Gate: make check + make docs (strict).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XdmwyhPxKnPHFFiqAMyUMC
Copy file name to clipboardExpand all lines: docs/reference/paths.md
+19-2Lines changed: 19 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,13 +2,14 @@
2
2
3
3
Roost resolves all of its filesystem state once at startup. Other components read the paths from this resolution; nothing should derive its own.
4
4
5
-
There are three bundle profiles — `Mac`, `Linux`, and `Iced` (slugs `mac`, `linux`, `iced`) — and each running UI resolves exactly one of them. There is no shared daemon; the profile a UI resolves determines the socket `roostctl` dials. The Rust definition lives in `crates/roost-ipc/src/paths.rs`; the Swift companion is `mac/Sources/Roost/BundleProfile.swift`. On macOS the two implementations are tested in lockstep.
5
+
There are three UI bundle profiles — `Mac`, `Linux`, and `Iced` (slugs `mac`, `linux`, `iced`) — and each running UI resolves exactly one of them. There is no shared daemon; the profile a UI resolves determines the socket `roostctl` dials. A fourth profile, `Session`, exists in the same enum for the future `roost-session` daemon (HS-1) but is reserved: nothing launches it yet, and it is not a legal `roostctl` target or `ROOST_BUNDLE_PROFILE` value today (see [Session profile (reserved)](#session-profile-reserved) below). The Rust definition lives in `crates/roost-ipc/src/paths.rs`; the Swift companion is `mac/Sources/Roost/BundleProfile.swift`. On macOS the two implementations are tested in lockstep.
6
6
7
7
| Profile | Who resolves it |`app_label`|`app_id`|
8
8
|---|---|---|---|
9
9
|`Mac`| the Swift `Roost.app`|`Roost`|`ai.stridelabs.Roost`|
10
10
|`Linux`| the packaged Linux UI (`/usr/bin/roost`) |`Roost-linux`|`ai.stridelabs.Roost` on Linux; `ai.stridelabs.Roost.linux` on macOS |
11
11
|`Iced`| a dev build of `roost-iced`, and the experimental macOS `Roost-Iced.app`|`Roost-iced`|`ai.stridelabs.Roost.iced`|
`app_label` is fixed per profile on every platform — it is the string `identify` and `roostctl doctor` report, and on macOS it is also the directory component of the profile's paths. `app_id` is the only field that resolves per platform: on Linux the `Linux` profile shares `ai.stridelabs.Roost` with the `Mac` profile, which can never run there and already shares that platform's path namespace; on macOS every profile stays independently resolvable (so their paths and identities can never collide), even though nothing ships or launches the `Linux` one there.
14
15
@@ -23,7 +24,7 @@ The profile defaults to:
23
24
|`roost-iced` (dev build, any platform; macOS `Roost-Iced.app`) |`Iced`|`ROOST_BUNDLE_PROFILE=mac` / `=linux` to dial another profile's namespace |
24
25
|`roostctl` (binary from the `roost-cli` crate) | auto-detect |`ROOST_BUNDLE_PROFILE` / `--socket` / `ROOST_SOCKET` / `--target {mac,linux,iced}`|
25
26
26
-
The two sides treat an **unrecognized**`ROOST_BUNDLE_PROFILE` value differently, on purpose. A UI logs a warning and falls back to its compiled-in default rather than refusing to launch; `roostctl` hard-errors with `unknown ROOST_BUNDLE_PROFILE value … (expected mac, linux, or iced)`. A stale `ROOST_BUNDLE_PROFILE=gtk` left over from an older install therefore starts the UI on its normal profile (with a warning in the log) but stops the CLI outright.
27
+
The two sides treat an **unrecognized**`ROOST_BUNDLE_PROFILE` value differently, on purpose. A UI logs a warning and falls back to its compiled-in default rather than refusing to launch; `roostctl` hard-errors with `unknown ROOST_BUNDLE_PROFILE value … (expected mac, linux, or iced)`. A stale `ROOST_BUNDLE_PROFILE=gtk` left over from an older install therefore starts the UI on its normal profile (with a warning in the log) but stops the CLI outright.`session` gets the same `roostctl` rejection today even though it names a real profile kind internally — see [Session profile (reserved)](#session-profile-reserved) — because HS-1 hasn't defined how a session gets addressed yet.
27
28
28
29
## File locations
29
30
@@ -98,6 +99,22 @@ keep launching.
98
99
99
100
The directories are created at first launch with mode `0700`.
100
101
102
+
### Session profile (reserved)
103
+
104
+
`Session` resolves paths the same way the three UI profiles do, but
105
+
nothing launches it yet — it is reserved for the future headless
106
+
`roost-session` daemon (HS-1). It is **not** a `roostctl` target and
107
+
**not** a legal `ROOST_BUNDLE_PROFILE` value today; `roostctl --target
108
+
session` and `ROOST_BUNDLE_PROFILE=session` are both rejected — see
109
+
the `ROOST_BUNDLE_PROFILE` discussion above. Debug
110
+
builds get their own `-dev`/`Dev`-suffixed directories so a dev
111
+
session can never collide with a real one.
112
+
113
+
| Platform | Socket | State | Logs |
114
+
|---|---|---|---|
115
+
| macOS |`~/Library/Caches/RoostSession/roost.sock` (`RoostSessionDev` in debug builds) |`~/Library/Application Support/RoostSession/`|`~/Library/Logs/RoostSession/`|
116
+
| Linux |`$XDG_RUNTIME_DIR/roost-session/roost.sock`, falling back to `/tmp/roost-session-<uid>/roost.sock` (`roost-session-dev` in debug builds) |`$XDG_DATA_HOME/roost-session/`|`$XDG_STATE_HOME/roost-session/`|
117
+
101
118
### Two single-instance locks
102
119
103
120
A running UI holds **two** flocks, because the two things a single
0 commit comments