@lifeaitools/rdc-skills 0.24.42 → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (198) hide show
  1. package/.claude/settings.json +15 -15
  2. package/.claude-plugin/marketplace.json +21 -21
  3. package/.claude-plugin/plugin.json +1518 -1371
  4. package/.github/workflows/publish.yml +34 -34
  5. package/.github/workflows/self-test.yml +58 -58
  6. package/CHANGELOG.md +310 -310
  7. package/LICENSE +21 -21
  8. package/MANIFEST.md +221 -221
  9. package/README.md +375 -376
  10. package/README.sandbox.md +3 -3
  11. package/assets/watcher/viewer.html +164 -164
  12. package/bin/rdc-skills-mcp.mjs +316 -316
  13. package/commands/build.md +183 -183
  14. package/commands/collab.md +180 -180
  15. package/commands/deploy.md +152 -152
  16. package/commands/design.md +31 -31
  17. package/commands/edit.md +28 -28
  18. package/commands/fixit.md +150 -124
  19. package/commands/handoff.md +173 -173
  20. package/commands/help.md +95 -95
  21. package/commands/overnight.md +220 -220
  22. package/commands/plan.md +158 -158
  23. package/commands/preplan.md +131 -131
  24. package/commands/prototype.md +145 -145
  25. package/commands/release.md +49 -49
  26. package/commands/report.md +99 -99
  27. package/commands/review.md +120 -120
  28. package/commands/self-test.md +113 -113
  29. package/commands/status.md +86 -86
  30. package/commands/watch.md +98 -98
  31. package/commands/workitems.md +137 -137
  32. package/git-sha.json +1 -1
  33. package/guides/agent-bootstrap.md +295 -295
  34. package/guides/agents/backend.md +104 -104
  35. package/guides/agents/content.md +94 -94
  36. package/guides/agents/cs2.md +56 -56
  37. package/guides/agents/data.md +87 -87
  38. package/guides/agents/design.md +77 -77
  39. package/guides/agents/frontend.md +92 -92
  40. package/guides/agents/infrastructure.md +81 -81
  41. package/guides/agents/setup.md +281 -281
  42. package/guides/agents/verify.md +151 -151
  43. package/guides/agents/viz.md +106 -106
  44. package/guides/backend.md +146 -146
  45. package/guides/content.md +147 -147
  46. package/guides/cs2.md +190 -190
  47. package/guides/data.md +123 -123
  48. package/guides/design.md +116 -116
  49. package/guides/engineering-behavior.md +43 -43
  50. package/guides/escalation-protocol.md +125 -125
  51. package/guides/frontend.md +151 -151
  52. package/guides/history-md-spec.md +297 -297
  53. package/guides/infrastructure.md +179 -179
  54. package/guides/lessons-learned-spec.md +145 -151
  55. package/guides/output-contract.md +108 -108
  56. package/guides/publish-md-spec.md +289 -289
  57. package/guides/rdc-skills-startup.md +30 -30
  58. package/guides/verify.md +11 -11
  59. package/hooks/check-cwd.js +31 -31
  60. package/hooks/check-rdc-environment.js +164 -164
  61. package/hooks/check-services.js +6 -6
  62. package/hooks/check-stale-work-items.js +19 -19
  63. package/hooks/foreground-process-gate.js +128 -128
  64. package/hooks/gate-watchdog-selfcheck.js +257 -257
  65. package/hooks/hook-logger.js +25 -25
  66. package/hooks/lib/run-evidence-gate.mjs +241 -241
  67. package/hooks/no-stop-open-epics.js +127 -127
  68. package/hooks/post-tool-batch-gate.js +203 -203
  69. package/hooks/post-work-check.js +21 -21
  70. package/hooks/postcompact-log.js +13 -13
  71. package/hooks/precompact-log.js +13 -13
  72. package/hooks/rate-limit-retry.js +46 -46
  73. package/hooks/rdc-invocation-marker.js +157 -157
  74. package/hooks/rdc-output-contract-gate.js +94 -94
  75. package/hooks/require-work-item-on-commit.js +294 -294
  76. package/hooks/restart-brief.js +19 -19
  77. package/hooks/run-hidden-hook.ps1 +47 -47
  78. package/hooks/task-completed-gate.js +274 -274
  79. package/hooks/work-item-exit-gate.js +944 -944
  80. package/lib/catalog.mjs +236 -236
  81. package/lib/cloud-rewrite.mjs +155 -155
  82. package/package.json +57 -57
  83. package/rules/work-items-rpc.md +520 -520
  84. package/scaffold/templates/HISTORY.md.template +39 -39
  85. package/scaffold/templates/PUBLISH.md.template +21 -21
  86. package/scaffold/templates/brochure-studio-default.html +70 -70
  87. package/scripts/acceptance.mjs +502 -502
  88. package/scripts/fixtures/guides/bad-guide.md +15 -15
  89. package/scripts/fixtures/guides-clean/good-guide.md +16 -16
  90. package/scripts/install-rdc-skills.js +1289 -1289
  91. package/scripts/install.ps1 +202 -202
  92. package/scripts/install.sh +132 -132
  93. package/scripts/lib/assertions.mjs +287 -287
  94. package/scripts/lib/manifest-schema.mjs +754 -754
  95. package/scripts/lib/runner.mjs +465 -465
  96. package/scripts/lib/sandbox.mjs +435 -435
  97. package/scripts/prepack.mjs +32 -32
  98. package/scripts/rdc-brochure.mjs +482 -482
  99. package/scripts/rdc-design-cli.mjs +134 -134
  100. package/scripts/rebuild-mcp.mjs +107 -107
  101. package/scripts/self-test.mjs +1460 -1460
  102. package/scripts/stamp-git-sha.mjs +29 -29
  103. package/scripts/test-guide-validator.mjs +196 -196
  104. package/scripts/test-rdc-hooks.mjs +145 -145
  105. package/scripts/uninstall.ps1 +77 -77
  106. package/scripts/uninstall.sh +69 -69
  107. package/scripts/update.ps1 +43 -43
  108. package/scripts/update.sh +43 -43
  109. package/scripts/validate-place-histories.js +461 -461
  110. package/scripts/validate-publish-manifests.js +502 -424
  111. package/scripts/watch-init.mjs +100 -100
  112. package/skills/brochure/SKILL.md +107 -107
  113. package/skills/build/SKILL.md +563 -563
  114. package/skills/channel-formatter/SKILL.md +538 -533
  115. package/skills/co-develop/SKILL.md +196 -196
  116. package/skills/collab/SKILL.md +239 -239
  117. package/skills/convert/SKILL.md +167 -140
  118. package/skills/deploy/SKILL.md +541 -541
  119. package/skills/design/SKILL.md +211 -211
  120. package/skills/design/reference/ownership.md +16 -16
  121. package/skills/design/reference/rampa.md +92 -92
  122. package/skills/design/reference/studio-model.md +153 -153
  123. package/skills/edit/SKILL.md +98 -98
  124. package/skills/fixit/SKILL.md +203 -165
  125. package/skills/fs-mcp/SKILL.md +148 -148
  126. package/skills/handoff/SKILL.md +236 -236
  127. package/skills/help/SKILL.md +143 -143
  128. package/skills/housekeeping/SKILL.md +160 -219
  129. package/skills/lifeai-brochure-author/SKILL.md +340 -340
  130. package/skills/onramp/SKILL.md +248 -0
  131. package/skills/overnight/SKILL.md +251 -251
  132. package/skills/plan/SKILL.md +345 -345
  133. package/skills/preplan/SKILL.md +90 -90
  134. package/skills/prototype/SKILL.md +150 -150
  135. package/skills/rdc-brochurify/SKILL.md +245 -245
  136. package/skills/rdc-extract-verifier-rules/SKILL.md +191 -191
  137. package/skills/release/SKILL.md +140 -140
  138. package/skills/report/SKILL.md +100 -100
  139. package/skills/review/SKILL.md +152 -152
  140. package/skills/rpms-filemap/SKILL.cloud.md +111 -111
  141. package/skills/rpms-filemap/SKILL.md +111 -111
  142. package/skills/self-test/SKILL.md +132 -132
  143. package/skills/status/SKILL.md +99 -99
  144. package/skills/terminal-config/SKILL.md +62 -62
  145. package/skills/tests/MATRIX.md +54 -54
  146. package/skills/tests/README.md +47 -47
  147. package/skills/tests/onramp.test.json +87 -0
  148. package/skills/tests/rdc-brochure.test.json +34 -34
  149. package/skills/tests/rdc-build.test.json +36 -36
  150. package/skills/tests/rdc-channel-formatter.test.json +45 -45
  151. package/skills/tests/rdc-co-develop.test.json +29 -29
  152. package/skills/tests/rdc-collab.test.json +29 -29
  153. package/skills/tests/rdc-convert.test.json +35 -35
  154. package/skills/tests/rdc-deploy.test.json +30 -30
  155. package/skills/tests/rdc-design.test.json +27 -27
  156. package/skills/tests/rdc-edit.test.json +29 -29
  157. package/skills/tests/rdc-fixit.test.json +36 -36
  158. package/skills/tests/rdc-fs-mcp.test.json +36 -36
  159. package/skills/tests/rdc-handoff.test.json +28 -28
  160. package/skills/tests/rdc-help.test.json +29 -29
  161. package/skills/tests/rdc-housekeeping.test.json +28 -32
  162. package/skills/tests/rdc-lifeai-brochure-author.test.json +35 -35
  163. package/skills/tests/rdc-overnight.test.json +37 -37
  164. package/skills/tests/rdc-plan.test.json +27 -27
  165. package/skills/tests/rdc-preplan.test.json +31 -31
  166. package/skills/tests/rdc-prototype.test.json +28 -28
  167. package/skills/tests/rdc-rdc-brochurify.test.json +23 -23
  168. package/skills/tests/rdc-rdc-extract-verifier-rules.test.json +34 -34
  169. package/skills/tests/rdc-release.test.json +29 -29
  170. package/skills/tests/rdc-report.test.json +28 -28
  171. package/skills/tests/rdc-review.test.json +29 -29
  172. package/skills/tests/rdc-rpms-filemap.test.json +28 -28
  173. package/skills/tests/rdc-self-test.test.json +24 -24
  174. package/skills/tests/rdc-status.test.json +29 -29
  175. package/skills/tests/rdc-terminal-config.test.json +29 -29
  176. package/skills/tests/rdc-watch.test.json +24 -24
  177. package/skills/tests/rdc-workitems.test.json +27 -27
  178. package/skills/watch/SKILL.md +97 -97
  179. package/skills/workitems/SKILL.md +151 -151
  180. package/tests/acceptance.test.mjs +59 -59
  181. package/tests/channel-formatter.contract.test.mjs +251 -251
  182. package/tests/curl-surface.test.mjs +289 -289
  183. package/tests/harness-gates.test.mjs +325 -325
  184. package/tests/help-surface.test.mjs +61 -61
  185. package/tests/install-rdc-skills.test.mjs +49 -49
  186. package/tests/manifest-contract-fields.test.mjs +78 -78
  187. package/tests/mcp.test.mjs +271 -271
  188. package/tests/rdc-brochure.test.mjs +125 -125
  189. package/tests/require-work-item-on-commit.test.mjs +162 -162
  190. package/tests/run-evidence-gate.test.mjs +82 -82
  191. package/tests/skill-test-matrix.test.mjs +66 -66
  192. package/tests/validate-skills.js +27 -27
  193. package/tests/work-item-exit-gate-l2.test.mjs +368 -368
  194. package/tests/work-item-exit-gate-l3.test.mjs +197 -197
  195. package/RELEASE.md +0 -42
  196. package/tests/housekeeping-lessons-triage.test.mjs +0 -49
  197. package/tests/lessons-pipeline-contract.test.mjs +0 -27
  198. package/tests/release-contract.test.mjs +0 -16
@@ -1,239 +1,239 @@
1
- ---
2
- name: rdc:collab
3
- description: "Usage `rdc:collab --session <session_id>` — Bidirectional relay with a claude.ai session — read inbox, do work, write outbox, loop. Use when coordinating with a parallel claude.ai conversation."
4
- ---
5
-
6
- > **⚠️ OUTPUT CONTRACT (READ FIRST):** `guides/output-contract.md`
7
- > Checklist-only output. No tool-call narration. No raw MCP/JSON/log dumps.
8
- > One checklist upfront, updated in place, shown again at end with a 1-line verdict.
9
-
10
- > **Sandbox contract:** This skill honors `RDC_TEST=1` per `guides/agent-bootstrap.md` § RDC_TEST Sandbox Contract. Destructive external calls short-circuit under the flag. Chitchat relay writes (`chitchat_reply`) and git push are skipped under `RDC_TEST=1`.
11
-
12
-
13
- # /rdc:collab — Claude Code Collab Session Listener
14
- > Invoked as: `/rdc:collab --session <session_id>`
15
- > You are the build/execute half of a live collab session with claude.ai.
16
- > Transport: chitchat MCP tools (`chitchat_poll` / `chitchat_reply`) + SSE stream
17
- > Dave is watching this terminal and can interject at any time.
18
-
19
- ---
20
-
21
- ## When to Use
22
- - Project lead wants to delegate a task to a claude.ai session
23
- - You need bidirectional relay between this CLI agent and a claude.ai coworker
24
- - An async work handoff is in progress via the chitchat relay
25
-
26
- ## Arguments
27
-
28
- - `rdc:collab --session <id>` — start or resume a collab relay with the given session ID
29
-
30
- ## What This Is
31
-
32
- claude.ai writes tasks into your inbox via `chitchat_send`. The clauth daemon
33
- queues them and — if you are connected to the SSE stream — pushes the event
34
- immediately (zero-latency). You read, act, commit, reply via `chitchat_reply`,
35
- and loop. Dave can watch everything in this terminal and interject by typing —
36
- treat anything Dave types as a high-priority override.
37
-
38
- ---
39
-
40
- ## Step 1 — Parse session ID
41
-
42
- Extract `--session <uuid>` from args.
43
-
44
- If no `--session`, call `chitchat_list` and show all active sessions.
45
-
46
- ---
47
-
48
- ## Step 2 — Initialize (chitchat-native)
49
-
50
- Call `chitchat_list` to verify the session exists in the daemon.
51
-
52
- If the session is not found:
53
- ```
54
- Session <id> not found in clauth daemon.
55
- Start a session from claude.ai first:
56
- chitchat_start(name: "<session-slug>")
57
- Then pass the returned session_id here.
58
- ```
59
-
60
- Send the ready signal via MCP:
61
- ```
62
- chitchat_reply(session_id, "Claude Code connected. Ready to receive tasks.\ncwd: <rootPath>")
63
- ```
64
-
65
- Print to terminal:
66
- ```
67
- [rdc:collab] Session <id> active (chitchat transport).
68
- SSE stream: http://127.0.0.1:52437/chitchat/<id>/stream
69
- Waiting for messages from claude.ai... (Ctrl+C to end)
70
- ```
71
-
72
- Note: File relay at `.rdc/relay/sessions/` is kept for backwards compatibility
73
- but is no longer the primary transport. Chitchat MCP + SSE is the default.
74
-
75
- ---
76
-
77
- ## Step 3 — Wait for message (SSE-first, poll-fallback)
78
-
79
- ### Primary path — SSE (zero-latency)
80
-
81
- Connect to the SSE stream and wait for the daemon to push a message:
82
-
83
- ```bash
84
- curl -s -N --max-time 30 http://127.0.0.1:52437/chitchat/<session_id>/stream
85
- ```
86
-
87
- The stream emits:
88
- - `event: message` lines with `data: <JSON>` when `chitchat_send` fires from claude.ai
89
- - `: keepalive` comment lines every 15s (ignore these)
90
-
91
- **When a `data:` event arrives:** parse the JSON directly — it contains the
92
- message. The SSE stream drains the inbox as it delivers; do NOT call
93
- `chitchat_poll` after receiving via SSE. Proceed directly to Step 4 with the
94
- parsed message body.
95
-
96
- **If 30s elapses with no message event (only keepalives or silence):**
97
- Print `[rdc:collab] Still listening...` and retry SSE immediately. After 10
98
- consecutive 30s timeouts (5 min idle), print a longer heartbeat but keep
99
- looping.
100
-
101
- **⛔ curl exit 28 (`--max-time`) is SUCCESS, not failure, on an SSE read.**
102
- `curl --max-time 30` ALWAYS exits 28 at the timeout boundary — that is normal for
103
- a long-lived SSE stream and says nothing about delivery. If a `data:` event was
104
- received in the output, process it and proceed to Step 4 — do NOT treat exit 28 as
105
- a curl failure (lesson 2026-06-08-collab-sse-exit-28-is-success: exit 28 arrived
106
- together with a full `event: message` / `data: {...}` payload, and reading it as a
107
- failure misclassified a zero-latency delivery). Only **connection-refused or a
108
- non-200** is a real curl failure that triggers the polling fallback.
109
-
110
- **If curl fails (daemon restart, connection refused, non-200 — NOT a bare exit 28
111
- with a delivered `data:` event):** fall back to polling path below.
112
-
113
- ### Fallback path — polling (2s interval)
114
-
115
- Use this path only when SSE is unavailable:
116
-
117
- ```
118
- loop:
119
- result = chitchat_poll(session_id)
120
- if result.status == "ready":
121
- → proceed to Step 4 with result.message
122
- else (status == "idle"):
123
- wait 2 seconds
124
- continue loop
125
- ```
126
-
127
- **`chitchat_poll` return shapes:**
128
- - `{ status: "idle" }` — inbox empty, keep polling
129
- - `{ status: "ready", message: "..." }` — message waiting, consume it
130
-
131
- ---
132
-
133
- ## Step 4 — Process message
134
-
135
- You now have the message body (from SSE `data:` JSON or `chitchat_poll` result).
136
-
137
- Check if the message begins with `type: stop` (literal prefix) or contains a
138
- `type` field equal to `"stop"` in the JSON.
139
-
140
- **`type: stop`** → go to Step 7.
141
-
142
- **Anything else (default: task/message):**
143
-
144
- Print to terminal:
145
- ```
146
- [rdc:collab] Turn <N> from claude.ai:
147
- ──────────────────────────────────────
148
- <message body>
149
- ──────────────────────────────────────
150
- ```
151
-
152
- ---
153
-
154
- ## Step 5 — Do the work
155
-
156
- Act on the message. Full Claude Code capabilities:
157
- - File edits, git commits to `develop`
158
- - Supabase RPC queries
159
- - Type-checks: `npx tsc --noEmit` (never `pnpm build`)
160
- - Run skills: `/rdc:plan`, `/rdc:fixit`, etc.
161
- - Answer questions directly
162
-
163
- Follow `.rdc/guides/agent-bootstrap.md` rules throughout.
164
-
165
- For long tasks, stream progress updates mid-work:
166
- ```
167
- chitchat_reply(session_id, "Turn <N> in progress: <what you've done so far>...")
168
- ```
169
- This lets claude.ai see progress immediately rather than waiting for the full
170
- response.
171
-
172
- ---
173
-
174
- ## Step 6 — Send response
175
-
176
- When work is done, send the response via MCP:
177
-
178
- ```
179
- chitchat_reply(session_id, "<response body>")
180
- ```
181
-
182
- Response body format:
183
- ```
184
- Turn <N> complete.
185
- Commits: <sha1, sha2 or none>
186
-
187
- <what you did, what you found, any questions or decisions needed from claude.ai>
188
- ```
189
-
190
- Print to terminal:
191
- ```
192
- [rdc:collab] Turn <N> done. Response sent via chitchat_reply.
193
- Waiting for next message...
194
- ```
195
-
196
- Return to Step 3.
197
-
198
- ---
199
-
200
- ## Step 7 — End session
201
-
202
- Received `type: stop` message, or Dave pressed Ctrl+C.
203
-
204
- Send final summary via MCP:
205
- ```
206
- chitchat_reply(session_id, "Session complete.\nTurns: <N>\nCommits: <list or none>\nOpen items: <anything unresolved>")
207
- ```
208
-
209
- Then call:
210
- ```
211
- chitchat_stop(session_id)
212
- ```
213
-
214
- Print:
215
- ```
216
- [rdc:collab] Session ended.
217
- ```
218
-
219
- ---
220
-
221
- ## Dave Interjections
222
-
223
- If Dave types in this terminal during a turn:
224
- - Treat it as an override injected into the current task
225
- - Acknowledge it in your `chitchat_reply` response
226
- - If it changes direction mid-task, note what you stopped and why
227
- - ⛔ **When an interjection appears to CONTRADICT the task premise, restate your
228
- understanding in ONE sentence and confirm before branching into a wide
229
- `AskUserQuestion` menu.** A tight "I read this as X — correct?" reconciles faster
230
- than a multiple-choice and avoids acting on a misread premise (lesson
231
- 2026-06-08-collab-premise-contradicting-interjection: "there is no pm2 this
232
- replaces it" was read as "PM2 is abolished as the transport" and triggered a
233
- 3-option transport menu, when it meant "there was no dev *site* yet — push to
234
- the unchanged PM2 path"; the wide menu over-committed to one interpretation and
235
- cost a round).
236
-
237
- ## Capture lessons (exit step)
238
-
239
- Before the final verdict line, follow `.rdc/guides/lessons-learned-spec.md` § Capture procedure. If this run taught something non-obvious — a first root-cause theory that turned out wrong, the documented/standard path not working, a missing gate or check that cost a round, or a surprising tool/infra behavior — write one `.rdc/lessons/<YYYY-MM-DD>-collab-<short-slug>.md` per lesson using the schema in that spec. Set `scope` (`simple` | `architectural`) and `lesson_status: open`; weekly triage alone records a final lesson outcome. Commit the lesson file(s) on `develop` alongside the run's other commits, and note "N lessons captured" in your verdict/summary. A run that taught nothing writes nothing — absence is the default.
1
+ ---
2
+ name: rdc:collab
3
+ description: "Usage `rdc:collab --session <session_id>` — Bidirectional relay with a claude.ai session — read inbox, do work, write outbox, loop. Use when coordinating with a parallel claude.ai conversation."
4
+ ---
5
+
6
+ > **⚠️ OUTPUT CONTRACT (READ FIRST):** `guides/output-contract.md`
7
+ > Checklist-only output. No tool-call narration. No raw MCP/JSON/log dumps.
8
+ > One checklist upfront, updated in place, shown again at end with a 1-line verdict.
9
+
10
+ > **Sandbox contract:** This skill honors `RDC_TEST=1` per `guides/agent-bootstrap.md` § RDC_TEST Sandbox Contract. Destructive external calls short-circuit under the flag. Chitchat relay writes (`chitchat_reply`) and git push are skipped under `RDC_TEST=1`.
11
+
12
+
13
+ # /rdc:collab — Claude Code Collab Session Listener
14
+ > Invoked as: `/rdc:collab --session <session_id>`
15
+ > You are the build/execute half of a live collab session with claude.ai.
16
+ > Transport: chitchat MCP tools (`chitchat_poll` / `chitchat_reply`) + SSE stream
17
+ > Dave is watching this terminal and can interject at any time.
18
+
19
+ ---
20
+
21
+ ## When to Use
22
+ - Project lead wants to delegate a task to a claude.ai session
23
+ - You need bidirectional relay between this CLI agent and a claude.ai coworker
24
+ - An async work handoff is in progress via the chitchat relay
25
+
26
+ ## Arguments
27
+
28
+ - `rdc:collab --session <id>` — start or resume a collab relay with the given session ID
29
+
30
+ ## What This Is
31
+
32
+ claude.ai writes tasks into your inbox via `chitchat_send`. The clauth daemon
33
+ queues them and — if you are connected to the SSE stream — pushes the event
34
+ immediately (zero-latency). You read, act, commit, reply via `chitchat_reply`,
35
+ and loop. Dave can watch everything in this terminal and interject by typing —
36
+ treat anything Dave types as a high-priority override.
37
+
38
+ ---
39
+
40
+ ## Step 1 — Parse session ID
41
+
42
+ Extract `--session <uuid>` from args.
43
+
44
+ If no `--session`, call `chitchat_list` and show all active sessions.
45
+
46
+ ---
47
+
48
+ ## Step 2 — Initialize (chitchat-native)
49
+
50
+ Call `chitchat_list` to verify the session exists in the daemon.
51
+
52
+ If the session is not found:
53
+ ```
54
+ Session <id> not found in clauth daemon.
55
+ Start a session from claude.ai first:
56
+ chitchat_start(name: "<session-slug>")
57
+ Then pass the returned session_id here.
58
+ ```
59
+
60
+ Send the ready signal via MCP:
61
+ ```
62
+ chitchat_reply(session_id, "Claude Code connected. Ready to receive tasks.\ncwd: <rootPath>")
63
+ ```
64
+
65
+ Print to terminal:
66
+ ```
67
+ [rdc:collab] Session <id> active (chitchat transport).
68
+ SSE stream: http://127.0.0.1:52437/chitchat/<id>/stream
69
+ Waiting for messages from claude.ai... (Ctrl+C to end)
70
+ ```
71
+
72
+ Note: File relay at `.rdc/relay/sessions/` is kept for backwards compatibility
73
+ but is no longer the primary transport. Chitchat MCP + SSE is the default.
74
+
75
+ ---
76
+
77
+ ## Step 3 — Wait for message (SSE-first, poll-fallback)
78
+
79
+ ### Primary path — SSE (zero-latency)
80
+
81
+ Connect to the SSE stream and wait for the daemon to push a message:
82
+
83
+ ```bash
84
+ curl -s -N --max-time 30 http://127.0.0.1:52437/chitchat/<session_id>/stream
85
+ ```
86
+
87
+ The stream emits:
88
+ - `event: message` lines with `data: <JSON>` when `chitchat_send` fires from claude.ai
89
+ - `: keepalive` comment lines every 15s (ignore these)
90
+
91
+ **When a `data:` event arrives:** parse the JSON directly — it contains the
92
+ message. The SSE stream drains the inbox as it delivers; do NOT call
93
+ `chitchat_poll` after receiving via SSE. Proceed directly to Step 4 with the
94
+ parsed message body.
95
+
96
+ **If 30s elapses with no message event (only keepalives or silence):**
97
+ Print `[rdc:collab] Still listening...` and retry SSE immediately. After 10
98
+ consecutive 30s timeouts (5 min idle), print a longer heartbeat but keep
99
+ looping.
100
+
101
+ **⛔ curl exit 28 (`--max-time`) is SUCCESS, not failure, on an SSE read.**
102
+ `curl --max-time 30` ALWAYS exits 28 at the timeout boundary — that is normal for
103
+ a long-lived SSE stream and says nothing about delivery. If a `data:` event was
104
+ received in the output, process it and proceed to Step 4 — do NOT treat exit 28 as
105
+ a curl failure (lesson 2026-06-08-collab-sse-exit-28-is-success: exit 28 arrived
106
+ together with a full `event: message` / `data: {...}` payload, and reading it as a
107
+ failure misclassified a zero-latency delivery). Only **connection-refused or a
108
+ non-200** is a real curl failure that triggers the polling fallback.
109
+
110
+ **If curl fails (daemon restart, connection refused, non-200 — NOT a bare exit 28
111
+ with a delivered `data:` event):** fall back to polling path below.
112
+
113
+ ### Fallback path — polling (2s interval)
114
+
115
+ Use this path only when SSE is unavailable:
116
+
117
+ ```
118
+ loop:
119
+ result = chitchat_poll(session_id)
120
+ if result.status == "ready":
121
+ → proceed to Step 4 with result.message
122
+ else (status == "idle"):
123
+ wait 2 seconds
124
+ continue loop
125
+ ```
126
+
127
+ **`chitchat_poll` return shapes:**
128
+ - `{ status: "idle" }` — inbox empty, keep polling
129
+ - `{ status: "ready", message: "..." }` — message waiting, consume it
130
+
131
+ ---
132
+
133
+ ## Step 4 — Process message
134
+
135
+ You now have the message body (from SSE `data:` JSON or `chitchat_poll` result).
136
+
137
+ Check if the message begins with `type: stop` (literal prefix) or contains a
138
+ `type` field equal to `"stop"` in the JSON.
139
+
140
+ **`type: stop`** → go to Step 7.
141
+
142
+ **Anything else (default: task/message):**
143
+
144
+ Print to terminal:
145
+ ```
146
+ [rdc:collab] Turn <N> from claude.ai:
147
+ ──────────────────────────────────────
148
+ <message body>
149
+ ──────────────────────────────────────
150
+ ```
151
+
152
+ ---
153
+
154
+ ## Step 5 — Do the work
155
+
156
+ Act on the message. Full Claude Code capabilities:
157
+ - File edits, git commits to `develop`
158
+ - Supabase RPC queries
159
+ - Type-checks: `npx tsc --noEmit` (never `pnpm build`)
160
+ - Run skills: `/rdc:plan`, `/rdc:fixit`, etc.
161
+ - Answer questions directly
162
+
163
+ Follow `.rdc/guides/agent-bootstrap.md` rules throughout.
164
+
165
+ For long tasks, stream progress updates mid-work:
166
+ ```
167
+ chitchat_reply(session_id, "Turn <N> in progress: <what you've done so far>...")
168
+ ```
169
+ This lets claude.ai see progress immediately rather than waiting for the full
170
+ response.
171
+
172
+ ---
173
+
174
+ ## Step 6 — Send response
175
+
176
+ When work is done, send the response via MCP:
177
+
178
+ ```
179
+ chitchat_reply(session_id, "<response body>")
180
+ ```
181
+
182
+ Response body format:
183
+ ```
184
+ Turn <N> complete.
185
+ Commits: <sha1, sha2 or none>
186
+
187
+ <what you did, what you found, any questions or decisions needed from claude.ai>
188
+ ```
189
+
190
+ Print to terminal:
191
+ ```
192
+ [rdc:collab] Turn <N> done. Response sent via chitchat_reply.
193
+ Waiting for next message...
194
+ ```
195
+
196
+ Return to Step 3.
197
+
198
+ ---
199
+
200
+ ## Step 7 — End session
201
+
202
+ Received `type: stop` message, or Dave pressed Ctrl+C.
203
+
204
+ Send final summary via MCP:
205
+ ```
206
+ chitchat_reply(session_id, "Session complete.\nTurns: <N>\nCommits: <list or none>\nOpen items: <anything unresolved>")
207
+ ```
208
+
209
+ Then call:
210
+ ```
211
+ chitchat_stop(session_id)
212
+ ```
213
+
214
+ Print:
215
+ ```
216
+ [rdc:collab] Session ended.
217
+ ```
218
+
219
+ ---
220
+
221
+ ## Dave Interjections
222
+
223
+ If Dave types in this terminal during a turn:
224
+ - Treat it as an override injected into the current task
225
+ - Acknowledge it in your `chitchat_reply` response
226
+ - If it changes direction mid-task, note what you stopped and why
227
+ - ⛔ **When an interjection appears to CONTRADICT the task premise, restate your
228
+ understanding in ONE sentence and confirm before branching into a wide
229
+ `AskUserQuestion` menu.** A tight "I read this as X — correct?" reconciles faster
230
+ than a multiple-choice and avoids acting on a misread premise (lesson
231
+ 2026-06-08-collab-premise-contradicting-interjection: "there is no pm2 this
232
+ replaces it" was read as "PM2 is abolished as the transport" and triggered a
233
+ 3-option transport menu, when it meant "there was no dev *site* yet — push to
234
+ the unchanged PM2 path"; the wide menu over-committed to one interpretation and
235
+ cost a round).
236
+
237
+ ## Capture lessons (exit step)
238
+
239
+ Before the final verdict line, follow `.rdc/guides/lessons-learned-spec.md` § Capture procedure. If this run taught something non-obvious — a first root-cause theory that turned out wrong, the documented/standard path not working, a missing gate or check that cost a round, or a surprising tool/infra behavior — write one `.rdc/lessons/<YYYY-MM-DD>-collab-<short-slug>.md` per lesson using the schema in that spec. Set `scope` (`simple` | `architectural`) and `status` (`open`, or `applied` if you shipped the fix in this same run, with the commit linked). Commit the lesson file(s) on `develop` alongside the run's other commits, and note "N lessons captured" in your verdict/summary. A run that taught nothing writes nothing — absence is the default.