| … | … | @@ -141,12 +141,44 @@ the products never use. |
| 141 | 141 | |
| 142 | 142 | ## 9. Order |
| 143 | 143 | |
| 144 | | 1. `libcompact` replaces `src/compact_encoding.h` — useful alone, no schema needed |
| 145 | | 2. define the schema; generate structs (`hyperschema-c`) and RPC (`hrpc-c`) |
| 146 | | 3. the daemon skeleton: threads, UDS, per-client buffering (§4) |
| 147 | | 4. control plane, then channels, then content |
| 148 | | 5. the C++ client library |
| 149 | | 6. port the Blender addon off `session-daemon`, and retire it |
| 144 | 1. ✅ `libcompact` replaces `src/compact_encoding.h` — useful alone, no schema needed |
| 145 | 2. ✅ define the schema; generate structs (`hyperschema-c`) and RPC (`hrpc-c`) |
| 146 | 3. ✅ the daemon skeleton: threads, UDS, per-client buffering (§4) |
| 147 | 4. ✅ control plane, then channels, then content |
| 148 | 5. ⏳ the C++ client library |
| 149 | 6. ⏳ port the Blender addon off `session-daemon`, and retire it |
| 150 | |
| 151 | ### 9.1 What step 6 actually is (2026-09-10) |
| 152 | |
| 153 | Reading `daemon/session_daemon.h` rather than assuming: **session-daemon is not |
| 154 | Blender-specific and holds no logic.** It exposes ONE Protomux channel on ONE |
| 155 | topic to a local socket and moves opaque length-prefixed frames both ways; grab |
| 156 | arbitration lives in `blender-bridge/session/grab.py` with its own gates. Its |
| 157 | header says so, and it is right. |
| 158 | |
| 159 | So swarmd already supersedes it at the transport level, and that is measured |
| 160 | rather than assumed: `test/test_channel_e2e.py` carries a frame between two |
| 161 | daemons over a named protocol channel on a shared topic, on the public DHT — |
| 162 | which is session-daemon's entire job, plus per-client buffering, truthful |
| 163 | backpressure, client ids and a generated wire. |
| 164 | |
| 165 | **What remains is a CLIENT change, not a daemon change.** The addon writes raw |
| 166 | frames at a socket; against swarmd it must say HELLO, SWARM_JOIN, CHANNEL_OPEN |
| 167 | and then SEND, and read `on-message` events. The frame payloads do not change — |
| 168 | they stay opaque. |
| 169 | |
| 170 | ⛔ WHICH IS WHY STEP 5 COMES FIRST, and not as bookkeeping. A Python client |
| 171 | means hand-writing the wire in Python, and this session already watched that |
| 172 | fail twice: the first channel gate hand-rolled compact-encoding and the daemon |
| 173 | answered "undecodable message" to every frame, and the fix was to drive |
| 174 | `tools/swarmd-probe`, which uses the generated encoders. Porting the addon by |
| 175 | hand-writing swarmd's wire in the addon would rebuild that mistake in the place |
| 176 | it is hardest to test. |
| 177 | |
| 178 | ⚠ And it cannot be verified here: **there is no Blender binary on tabertron** |
| 179 | (searched /storage, /opt, /usr, flatpak, snap; `blender-source` is a source tree |
| 180 | with no build). Every blender-bridge gate runs `blender --background`. An addon |
| 181 | port made here would be an unexercised path by construction. |
| 150 | 182 | |
| 151 | 183 | ⚠ Open decision: whether `swarmd` lives in hyperswarm-peer (where its includes |
| 152 | 184 | are, making it that repo's first product rather than a library) or its own repo. |