@lifeaitools/rdc-skills 0.24.10 → 0.24.12
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.
- package/.claude-plugin/plugin.json +1 -1
- package/.github/workflows/self-test.yml +34 -34
- package/commands/build.md +181 -181
- package/commands/collab.md +180 -180
- package/commands/deploy.md +148 -148
- package/commands/fixit.md +105 -105
- package/commands/handoff.md +173 -173
- package/commands/overnight.md +218 -218
- package/commands/plan.md +158 -158
- package/commands/preplan.md +131 -131
- package/commands/prototype.md +145 -145
- package/commands/report.md +99 -99
- package/commands/review.md +120 -120
- package/commands/status.md +86 -86
- package/commands/watch.md +8 -2
- package/commands/workitems.md +127 -127
- package/git-sha.json +1 -1
- package/guides/agent-bootstrap.md +195 -195
- package/guides/agents/backend.md +102 -102
- package/guides/agents/content.md +94 -94
- package/guides/agents/cs2.md +56 -56
- package/guides/agents/data.md +86 -86
- package/guides/agents/design.md +77 -77
- package/guides/agents/frontend.md +91 -91
- package/guides/agents/infrastructure.md +81 -81
- package/guides/agents/setup.md +272 -272
- package/guides/agents/verify.md +119 -119
- package/guides/agents/viz.md +106 -106
- package/hooks/foreground-process-gate.js +22 -3
- package/package.json +3 -1
- package/scripts/acceptance.mjs +471 -0
- package/scripts/lib/assertions.mjs +25 -2
- package/scripts/lib/manifest-schema.mjs +13 -0
- package/scripts/self-test.mjs +1460 -1458
- package/scripts/test-guide-validator.mjs +2 -0
- package/skills/build/SKILL.md +554 -554
- package/skills/channel-formatter/SKILL.md +56 -6
- package/skills/collab/SKILL.md +239 -239
- package/skills/deploy/SKILL.md +541 -541
- package/skills/design/SKILL.md +205 -205
- package/skills/fixit/SKILL.md +165 -165
- package/skills/handoff/SKILL.md +200 -200
- package/skills/lifeai-brochure-author/SKILL.md +2 -0
- package/skills/overnight/SKILL.md +251 -251
- package/skills/plan/SKILL.md +314 -314
- package/skills/preplan/SKILL.md +90 -90
- package/skills/prototype/SKILL.md +150 -150
- package/skills/rdc-brochurify/SKILL.md +7 -0
- package/skills/rdc-extract-verifier-rules/SKILL.md +2 -0
- package/skills/release/SKILL.md +140 -140
- package/skills/report/SKILL.md +100 -100
- package/skills/review/SKILL.md +152 -152
- package/skills/rpms-filemap/SKILL.cloud.md +4 -0
- package/skills/rpms-filemap/SKILL.md +4 -0
- package/skills/self-test/SKILL.md +127 -123
- package/skills/status/SKILL.md +99 -99
- package/skills/tests/MATRIX.md +53 -0
- package/skills/tests/README.md +20 -3
- package/skills/tests/rdc-brochure.test.json +20 -0
- package/skills/tests/rdc-channel-formatter.test.json +45 -0
- package/skills/tests/rdc-co-develop.test.json +15 -0
- package/skills/tests/rdc-collab.test.json +15 -0
- package/skills/tests/rdc-convert.test.json +20 -0
- package/skills/tests/rdc-fs-mcp.test.json +21 -0
- package/skills/tests/rdc-help.test.json +15 -0
- package/skills/tests/rdc-housekeeping.test.json +15 -0
- package/skills/tests/rdc-lifeai-brochure-author.test.json +20 -0
- package/skills/tests/rdc-rdc-brochurify.test.json +23 -0
- package/skills/tests/rdc-rdc-extract-verifier-rules.test.json +20 -0
- package/skills/tests/rdc-rpms-filemap.test.json +15 -0
- package/skills/tests/rdc-self-test.test.json +15 -0
- package/skills/tests/rdc-status.test.json +0 -1
- package/skills/tests/rdc-terminal-config.test.json +15 -0
- package/skills/tests/rdc-watch.test.json +24 -0
- package/skills/watch/SKILL.md +96 -90
- package/skills/workitems/SKILL.md +151 -151
- package/tests/acceptance.test.mjs +42 -0
- package/tests/harness-gates.test.mjs +32 -2
- package/tests/validate-skills.js +17 -173
|
@@ -83,11 +83,33 @@ skills named in the scope boundary.
|
|
|
83
83
|
|
|
84
84
|
1. **Detect channel or pack mode** from the request using the tables above.
|
|
85
85
|
2. **Classify the source**: already-drafted copy, long article/report, transcript, notes, or brief.
|
|
86
|
-
3. **For long sources**,
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
86
|
+
3. **For thin or under-specified long sources**, enrich before writing instead
|
|
87
|
+
of inventing context:
|
|
88
|
+
- If the source names a corpus path, read it.
|
|
89
|
+
- Otherwise search/read the approved corpus first when available. Resolve
|
|
90
|
+
`CORPUS_ROOT` (usually `H:/My Drive/global-corpus`) and
|
|
91
|
+
`LOCAL_CORPUS_ROOT` (usually `C:/Dev/local-corpus`) before searching the
|
|
92
|
+
repo. If environment variables are not visible, try those default paths.
|
|
93
|
+
- The corpus search must use an explicit corpus path in the tool arguments
|
|
94
|
+
(`H:/My Drive/global-corpus` or `C:/Dev/local-corpus`). A relative repo
|
|
95
|
+
search does not count as enrichment.
|
|
96
|
+
- Use `Grep`/`Glob`/`Read` or the environment's equivalent tools so the
|
|
97
|
+
transcript records what was consulted.
|
|
98
|
+
- Use web search only when the requested output needs current/public facts,
|
|
99
|
+
the user asks for external context, or corpus context is absent and network
|
|
100
|
+
search is allowed. Cite/use only what the search actually supports.
|
|
101
|
+
- Searching only the project repo is not enough for enrichment unless the
|
|
102
|
+
source itself points to a repo-local corpus file.
|
|
103
|
+
- If neither corpus nor web context is available, keep the output sparse and
|
|
104
|
+
mark missing context in assumptions; do not fill gaps creatively.
|
|
105
|
+
4. **For long sources**, extract thesis, audience, proof points, CTA, constraints, and factual risks before writing.
|
|
106
|
+
5. **Jump to the target channel or pack section** below and apply all rules exactly — do not rely on memory.
|
|
107
|
+
6. **Never mix** markdown conventions across channels.
|
|
108
|
+
7. If the channel or pack is ambiguous, ask once: "Is this for [Channel A] or [Channel B]?"
|
|
109
|
+
8. Produce the formatted or repurposed output directly as the deliverable.
|
|
110
|
+
9. Treat extraction notes and source-fidelity guardrails as internal scratchwork.
|
|
111
|
+
Do not print a "Long-Source Extraction Checklist", factual guardrail list, or
|
|
112
|
+
absent-topic list unless the user explicitly asks for analysis.
|
|
91
113
|
|
|
92
114
|
## Hard Rules (all channels)
|
|
93
115
|
|
|
@@ -167,7 +189,7 @@ Repurpose one source for an announcement:
|
|
|
167
189
|
- 3 CTA variants
|
|
168
190
|
|
|
169
191
|
### Long-Source Extraction Checklist
|
|
170
|
-
Before writing from a long source, identify:
|
|
192
|
+
Before writing from a long source, identify internally:
|
|
171
193
|
- **Thesis:** the central argument or announcement
|
|
172
194
|
- **Audience:** who this is for
|
|
173
195
|
- **Proof:** facts, examples, data, names, dates, or quotes explicitly present
|
|
@@ -179,13 +201,39 @@ Before writing from a long source, identify:
|
|
|
179
201
|
### Source-Fidelity Rules
|
|
180
202
|
- Do not invent statistics, dates, quotes, citations, partnerships, revenue,
|
|
181
203
|
legal claims, customer names, or outcomes.
|
|
204
|
+
- Do not infer adjacent finance/reporting concepts that sound plausible but are
|
|
205
|
+
absent from the source, such as pro forma assumptions, reporting cadence,
|
|
206
|
+
offset mechanisms, governance structures, verification status, or portfolio
|
|
207
|
+
implications.
|
|
208
|
+
- If corpus or web context was consulted, use it only for facts it directly
|
|
209
|
+
supports. Do not blend generic domain knowledge into the source as if it were
|
|
210
|
+
documented.
|
|
211
|
+
- If the source provides a theme label without an explanation, keep the theme
|
|
212
|
+
label or paraphrase it conservatively. Do not add explanatory clauses that
|
|
213
|
+
define how it works, who governs it, how it is verified, how often it reports,
|
|
214
|
+
or what financial model it opposes unless those details are explicit.
|
|
215
|
+
- Do not contrast patient capital with quarters, earnings calls, fund cycles,
|
|
216
|
+
exits, venture speed, or portfolio management unless those words or concepts
|
|
217
|
+
appear in the source or consulted corpus/web material.
|
|
182
218
|
- Do not upgrade tentative language into certainty.
|
|
183
219
|
- Do not turn illustrative examples into facts.
|
|
184
220
|
- Preserve caveats when they affect meaning.
|
|
185
221
|
- If a stronger hook needs a proof point the source does not provide, write a
|
|
186
222
|
proof-neutral hook instead.
|
|
223
|
+
- If the source says a topic is absent, excluded, or not mentioned, treat that
|
|
224
|
+
as an internal guardrail. Do not repeat the absent topic in public-facing
|
|
225
|
+
channel copy, assumptions, caveats, notes, headings, or summaries unless the
|
|
226
|
+
user explicitly asks for a contrast, compliance note, or risk disclosure.
|
|
227
|
+
Strip absent-topic lists from the deliverable entirely.
|
|
187
228
|
- When assumptions are material, include a short "Assumptions:" line before the
|
|
188
229
|
deliverable rather than burying uncertainty in polished copy.
|
|
230
|
+
- Do not output your extraction checklist. The deliverable should start with the
|
|
231
|
+
requested channel/pack output, except for a brief "Assumptions:" line when a
|
|
232
|
+
material gap affects the copy.
|
|
233
|
+
- If you include an "Assumptions:" line, limit it to missing useful inputs such
|
|
234
|
+
as org name, audience, location, date, CTA, or link. Never list absent,
|
|
235
|
+
excluded, or not-mentioned topics in the assumptions line. If the only
|
|
236
|
+
uncertainty is an absent-topic guardrail, omit the assumptions line.
|
|
189
237
|
|
|
190
238
|
---
|
|
191
239
|
|
|
@@ -231,6 +279,8 @@ channel-native. A pack is not a generic summary repeated in several lengths.
|
|
|
231
279
|
email/web, concise in Slack.
|
|
232
280
|
- Use channel-specific formatting rules from the sections below.
|
|
233
281
|
- If source proof is weak, use curiosity and framing instead of inflated claims.
|
|
282
|
+
- Do not include extraction notes, guardrail notes, or absent-topic caveats in
|
|
283
|
+
the pack. Those are reasoning aids, not channel outputs.
|
|
234
284
|
|
|
235
285
|
---
|
|
236
286
|
|
package/skills/collab/SKILL.md
CHANGED
|
@@ -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 `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.
|
|
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.
|