@lifeaitools/rdc-skills 0.27.0 → 0.28.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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rdc",
3
- "version": "0.27.0",
3
+ "version": "0.28.0",
4
4
  "description": "RDC typed-agent dispatch skill suite for Claude Code — plan, build, review, overnight unattended builds with work-item tracking and TDD enforcement.",
5
5
  "author": {
6
6
  "name": "LIFEAI",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lifeaitools/rdc-skills",
3
- "version": "0.27.0",
3
+ "version": "0.28.0",
4
4
  "description": "RDC typed-agent dispatch skill suite for Claude Code - plan, build, review, overnight builds",
5
5
  "keywords": [
6
6
  "claude-code",
@@ -44,6 +44,25 @@ not an evasion.
44
44
 
45
45
  ---
46
46
 
47
+ ## The boundary — you are in a CONVERSATION, not a build
48
+
49
+ **Do not write to the repository during a collab. Not one file.**
50
+
51
+ This is not a restriction on you; it is what a collab *is*. Your deliverable is
52
+ the **reply**. If settling the point requires code, config, or a document change,
53
+ say what should change — the change itself happens afterward, in a session built
54
+ for it (`rdc:build`, an isolated worktree agent, or you working your own lane
55
+ against a work item).
56
+
57
+ **Why it matters to you specifically:** a peer that tries to write mid-conversation
58
+ can end up holding finished, correct work it cannot deliver — refused by a write
59
+ guard, then refused permission to stop by a gate demanding the delivery evidence
60
+ that guard just made impossible. That happened on 2026-08-14 and cost a complete
61
+ negotiation result. **Your reasoning in the reply is always deliverable. A file
62
+ write may not be.**
63
+
64
+ ---
65
+
47
66
  ## What you owe BACK — your responsibilities
48
67
 
49
68
  ### 1. Answer in the required format. Nothing outside it.
@@ -51,27 +70,26 @@ not an evasion.
51
70
  If the dispatch gives you a contract, use it verbatim. Prose around the blocks
52
71
  is not helpful — it is what the format exists to remove.
53
72
 
54
- **Negotiate — one block per point:**
73
+ **One block per point:**
55
74
 
56
75
  ```
57
76
  POINT <n>: AGREE | AGREE-WITH-AMENDMENT | DISAGREE
58
- EDIT: <the exact section and change you will make, or NONE>
77
+ EDIT: <the exact section and change that SHOULD be made, or NONE — describe it, do not make it>
59
78
  REASON: <one sentence — only if AMENDMENT or DISAGREE>
60
79
  ```
61
80
 
62
- **Delegate:**
81
+ **For a factual question rather than a proposal:**
63
82
 
64
83
  ```
65
- STATUS: DONE | PARTIAL | BLOCKED
66
- CHANGED: <file paths, or NONE>
84
+ FINDING <n>: <the answer, one sentence>
67
85
  EVIDENCE: <command run + literal result — exit code, row count, probe status>
68
- BLOCKED: <what stopped you, or NONE>
86
+ CONFIDENCE: VERIFIED | INFERRED | UNKNOWN
69
87
  ```
70
88
 
71
89
  **Always close with:**
72
90
 
73
91
  ```
74
- OWNER: <who writes the change — exactly one agent>
92
+ OWNER: <who lands the resulting Decision or work item — exactly one agent>
75
93
  BLOCKED: <what you cannot do from where you are, or NONE>
76
94
  ```
77
95
 
@@ -87,11 +105,11 @@ answer in the reply body. Do not let it die inside a failed tool call.
87
105
 
88
106
  ### 3. Do not write outside your own lane or scope.
89
107
 
90
- - **Codex:** you must be running in a Codex-owned lane (`x-codex-N`, `x-codex-sv`).
91
- If the initiator invoked you with its own cwd, every write will be refused with
108
+ - **Codex:** if you were started by `codex exec` (headless), you CANNOT write in any lane — your managed identity was never minted and `-C` does not create it. Report `BLOCKED: headless codex exec has no lane claim` and put your answer in the reply. If you were started by the launcher in a Codex-owned lane (`x-codex-N`, `x-codex-sv`), you can write, but not during a collab.
109
+ A session created in the wrong cwd is poisoned for its whole life `resume` replays the recorded identity. Writes are refused with
92
110
  `CODEX MANAGED LANE: App Local must use an owned managed Codex lane`. That is a
93
- **dispatch defect, not your failure** — report it as `BLOCKED: wrong lane
94
- attachment, re-dispatch with -C <my-lane>` and do not attempt a workaround.
111
+ **dispatch defect, not your failure** — report it as `BLOCKED: poisoned session identity, start a NEW session in
112
+ my lane` `-C` will NOT repair it. Do not attempt a workaround.
95
113
  - **Claude agents:** if you will commit, you must have been given
96
114
  `isolation: "worktree"` as a real tool parameter. A sentence in your prompt
97
115
  claiming isolation is inert.
@@ -155,6 +173,7 @@ cannot act on a guess it has to verify.
155
173
  | Filing a settled agreement as a lesson | Buries a queryable Decision |
156
174
  | Going silent when blocked | Indistinguishable from being dead |
157
175
  | Editing a document you do not own | Lost work, no error, no trace |
176
+ | Writing ANY file during a collab | Not your job here — the reply is the deliverable |
158
177
  | Committing to whatever branch you happen to be on | The change strands where nobody looks for it |
159
178
  | Answering an easier adjacent question | The real point stays open and looks settled |
160
179
  | Attempting a workaround for a guard block | The guard is usually right; the dispatch is usually wrong |
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rdc:collab
3
- description: "Usage `rdc:collab <collaborator> [mode] <topic>` — Structured collaboration with another agent: Codex, a local LLM, a Claude agent, or a claude.ai session. Modes: negotiate (converge on a decision), delegate (hand off work), listen (claude.ai relay). Every dispatch carries a response contract."
3
+ description: "Usage `rdc:collab <collaborator> [inbound] <topic>` — Structured agent-to-agent CONVERSATION with Codex, a local LLM, a Claude agent, or a claude.ai session. Converges on a decision and never writes to the repo — work that needs writing becomes a work item for rdc:build. Every dispatch carries a response contract."
4
4
  ---
5
5
 
6
6
  > **⚠️ OUTPUT CONTRACT (READ FIRST):** `guides/output-contract.md`
@@ -11,9 +11,50 @@ description: "Usage `rdc:collab <collaborator> [mode] <topic>` — Structured co
11
11
 
12
12
  # /rdc:collab — Structured Agent-to-Agent Collaboration
13
13
 
14
- > `rdc:collab <collaborator> [mode] <topic>`
14
+ > `rdc:collab <collaborator> [inbound] <topic>`
15
15
  > Collaborators: `codex` · `local-llm` · `claude-agent` · `claude-ai`
16
- > Modes: `negotiate` (default for a decision) · `delegate` · `listen`
16
+ > Direction: outbound (default, you dispatch) · `inbound` (claude.ai relay, peer initiates)
17
+
18
+ ---
19
+
20
+ ## Collab is CONVERSATION. It never writes to the repo.
21
+
22
+ **There is one mode, because there was only ever one.** v0.27.0 shipped a
23
+ `delegate` mode whose contract asked the peer for `CHANGED: <file paths>` — an
24
+ instruction to go mutate the repo and report back. Handing work off is a real
25
+ need; routing it through a *conversation channel* is a category error. Work goes
26
+ to `rdc:build`, to an `Agent` with `isolation: "worktree"` as a real parameter, or
27
+ to a launcher-started session working its own lane against a work item. Those have
28
+ isolation, a work item, review, and landing. A chat channel has none of them.
29
+
30
+ **This is a design boundary, not a workaround for a broken door.** A separate,
31
+ real constraint exists — a headless `codex exec` peer currently cannot write at
32
+ all (see the note under Step 1) — but that constraint is a **bug being fixed**,
33
+ not the reason for this rule. Even once headless Codex can write, work handoff
34
+ still goes through the build path. Do not read the boundary as "collab can't
35
+ write"; read it as "collab isn't where writing belongs."
36
+
37
+ **The boundary:**
38
+
39
+ | Collab does | Collab never does |
40
+ |---|---|
41
+ | Ask, answer, converge, disagree | Edit a file |
42
+ | Produce a **Decision** for the governing document | Commit or push |
43
+ | Produce a **work item** when writing is required | Build, deploy, or land |
44
+ | Return findings, verdicts, evidence *as text* | Claim to have changed anything |
45
+
46
+ **When code must be written, collab is over.** Its output is a work item, and the
47
+ writing happens where writing belongs — `rdc:build`, an `Agent` with
48
+ `isolation: "worktree"` as a real parameter, or the peer working its own lane
49
+ against that item. A conversation channel is not a build channel.
50
+
51
+ **Why this is structural, not a style rule.** Because collab never mutates, a
52
+ collab session is non-mutating *by definition* — there is no mode to select
53
+ wrongly and no flag to leave on. Delivery gates (truth-gate, completion gate,
54
+ CodeFlow preflight) have nothing to gate, and safety guards (credential exposure,
55
+ cross-tree write, push-main, lane identity) remain fully live because nothing
56
+ here goes near them. The peer that tries to write is not blocked by policy; it is
57
+ simply doing something this skill never asks for.
17
58
 
18
59
  ---
19
60
 
@@ -98,8 +139,10 @@ rdc:collab --session <id> ← legacy form, implies `claude-ai listen`
98
139
  ```
99
140
 
100
141
  - No collaborator → list active chitchat sessions and available engines, then stop.
101
- - No mode → `negotiate` if the topic names a document, decision, plan, or review;
102
- `delegate` if it names work to perform; `listen` for `claude-ai` with `--session`.
142
+ - `inbound` (or the legacy `--session <id>` form) the peer initiates; see the
143
+ claude.ai relay section. Same conversation, opposite direction.
144
+ - **If the topic names work to be performed rather than a question to settle, this
145
+ is the wrong skill.** Create the work item and use `rdc:build` / `rdc:fixit`.
103
146
 
104
147
  ---
105
148
 
@@ -110,7 +153,28 @@ most common failure and it fails at the guard layer, not the prompt layer.
110
153
 
111
154
  | Collaborator | Invocation | Isolation requirement | Known failure mode |
112
155
  |---|---|---|---|
113
- | **`codex`** | `codex exec -C <its-lane> "<msg>"` · resume: `codex exec -C <its-lane> resume <session-id> "<msg>"` | **MUST run with `-C` pointing at a Codex-owned lane** (`x-codex-N` or `x-codex-sv`) | Inheriting your cwd attaches Codex to *your* lane; `managedAppAttachmentDecision()` refuses every write with `CODEX MANAGED LANE: App Local must use an owned managed Codex lane`. The guard is correct fix the `-C`, never the guard. |
156
+ | **`codex`** | `codex exec [-C <dir>] "<msg>"` · resume: `codex exec resume <session-id> "<msg>"` | **A headless `codex exec` peer is READ-ONLY. It cannot write to any lane see below.** Never dispatch it from your own lane. | Its managed identity is fixed at session creation and `-C` does **not** change it. Dispatch from your lane and every write is refused with `CODEX MANAGED LANE: App Local must use an owned managed Codex lane`permanently, for that session's whole life. |
157
+
158
+ > **`-C` does not establish lane identity — verified 2026-08-14, and an earlier
159
+ > version of this table said the opposite.** Managed identity is an 8-field record
160
+ > (`lane, role, repoIdentity, ownerPid, ownerStartFingerprint, sessionId,
161
+ > leaseEpoch, ownerToken`) built by `buildStartupIdentity()` in
162
+ > [`pool/codex-topology.mjs`](file:///C:/Dev/lifeai-env/pool/codex-topology.mjs)
163
+ > and minted **only by the interactive launcher**, which also claims the lease.
164
+ > `codex exec` has no lane-claim path, so it cannot produce that record — which
165
+ > means **a headless Codex peer cannot write in any lane, including its own**.
166
+ >
167
+ > Two consequences: (1) `resume` replays the session's *recorded* identity, so a
168
+ > session created in the wrong cwd is poisoned for life and `-C` will not repair
169
+ > it — start a new session instead; (2) treat a `codex exec` peer as a
170
+ > conversational participant only. Writing work belongs to a launcher-started
171
+ > Codex session, `rdc:build`, or an isolated-worktree agent.
172
+ >
173
+ > Beware the error text: `App Local denied: <lane> has a foreign live lease` also
174
+ > fires when there is **no lease at all** (`ownerMatchesLease` returns false for a
175
+ > null lease), so it will send you hunting a conflicting owner that does not exist.
176
+
177
+ file:///C:/Dev/lifeai-env/pool/codex-topology.mjs
114
178
  | **`local-llm`** | local endpoint per `.claude/context/clauth.md`; credential via `curl -s http://127.0.0.1:52437/v/<service>` | none (no repo attachment) | Small context windows: send the contract and the open points, never the whole document. Link paths instead of pasting files. |
115
179
  | **`claude-agent`** | `Agent` tool, or `claude -p --bare` / `claude --bg` | **`isolation: "worktree"` as an actual tool parameter** if it will commit — a prose claim of isolation is inert | Parallel agents on a shared checkout race on `git stash` and `.git/index`. See `.claude/rules/subagent-credentials.md`. |
116
180
  | **`claude-ai`** | chitchat MCP (`chitchat_send` / `chitchat_poll` / `chitchat_reply`) + SSE | session-scoped | Messages evaporate when the session stops — export durable decisions to TinTin. |
@@ -122,31 +186,28 @@ behind a `timeout` guess. A truncated call looks like a failure and is not one.
122
186
 
123
187
  ## Step 2 — Compose the response contract (mandatory)
124
188
 
125
- Every dispatch in `negotiate` or `delegate` mode carries an explicit answer
126
- format. The contract is not politeness — it is what makes the reply *checkable*.
189
+ Every dispatch carries an explicit answer format. The contract is not politeness —
190
+ it is what makes the reply *checkable*.
191
+
192
+ **Every field returns information. No field asks the peer what it changed** — if a
193
+ contract invites `CHANGED: <file paths>`, it has invited the peer to mutate the
194
+ repo mid-conversation, which is the v0.27.0 defect this version removes.
127
195
 
128
- **Negotiate contract — one block per open point:**
196
+ **The contract — one block per open point:**
129
197
 
130
198
  ```
131
199
  POINT <n>: AGREE | AGREE-WITH-AMENDMENT | DISAGREE
132
- EDIT: <the exact section and change you will make, or NONE>
200
+ EDIT: <the exact section and change that SHOULD be made, or NONE — describe it, do not make it>
133
201
  REASON: <one sentence — only if AMENDMENT or DISAGREE>
134
202
  ```
135
203
 
136
- Plus one closing block, always:
137
-
138
- ```
139
- OWNER: <who writes the change — exactly one agent>
140
- BLOCKED: <what you cannot do from where you are, or NONE>
141
- ```
142
-
143
- **Delegate contract:**
204
+ **When the point is a factual question rather than a proposal**, the peer answers
205
+ with findings — still text, still no repo mutation:
144
206
 
145
207
  ```
146
- STATUS: DONE | PARTIAL | BLOCKED
147
- CHANGED: <file paths, or NONE>
208
+ FINDING <n>: <the answer, one sentence>
148
209
  EVIDENCE: <command run + literal result — exit code, row count, probe status>
149
- BLOCKED: <what stopped you, or NONE>
210
+ CONFIDENCE: VERIFIED | INFERRED | UNKNOWN
150
211
  ```
151
212
 
152
213
  Rules that make the contract hold:
@@ -161,7 +222,7 @@ Rules that make the contract hold:
161
222
 
162
223
  ---
163
224
 
164
- ## Step 3 — Converge (negotiate mode)
225
+ ## Step 3 — Converge
165
226
 
166
227
  ```
167
228
  open_points = [all points]
@@ -189,18 +250,20 @@ negotiation becomes a loop that never terminates.
189
250
 
190
251
  ---
191
252
 
192
- ## Step 4 — Single-writer rule
253
+ ## Step 4 — Single-writer rule (for the OUTCOME, not the conversation)
193
254
 
194
- Before round 1, name **one** agent as the writer of the document or code under
195
- discussion, and say so in the dispatch.
255
+ Nobody writes during a collab. The single-writer rule governs **who lands the
256
+ settled Decision afterward** — name that agent before round 1 and say so in the
257
+ dispatch.
196
258
 
197
259
  > Two active writers on one surface is forbidden — the same rule the fleet plans
198
260
  > state as *"never run two active writers for one effect."*
199
261
 
200
262
  If the named writer turns out to be **structurally blocked** (wrong lane, no
201
263
  credentials, read-only mount), ownership transfers to the other agent *for that
202
- artifact only*, and the transfer is recorded in the change itself with
203
- attribution. A blocked writer does not mean the agreed work is abandoned.
264
+ artifact only*, recorded in the change itself with attribution. A blocked writer
265
+ never means the agreed work is abandoned the reasoning already exists in the
266
+ reply, which is exactly why the reply, not a file, is the deliverable.
204
267
 
205
268
  ---
206
269
 
@@ -283,6 +346,8 @@ and avoids acting on a misread premise (lesson
283
346
  | Wrapping dispatch in a `timeout` guess | A still-running call reads as a failure |
284
347
  | Escalating a transcript | The human has to find the question themselves |
285
348
  | Two agents editing one document | Lost work, no error |
349
+ | Writing to the repo during a collab | Your answer may be guard-blocked and stranded; the reply is always deliverable, a write may not be |
350
+ | Using collab to hand off WORK | Wrong skill. Create a work item and use rdc:build or an isolated-worktree agent |
286
351
 
287
352
  ---
288
353