@lifeaitools/rdc-skills 0.29.0 → 0.30.1

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.29.0",
3
+ "version": "0.30.1",
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.29.0",
3
+ "version": "0.30.1",
4
4
  "description": "RDC typed-agent dispatch skill suite for Claude Code - plan, build, review, overnight builds",
5
5
  "keywords": [
6
6
  "claude-code",
@@ -41,6 +41,12 @@ not an evasion.
41
41
  It should not re-dispatch on top of a call you are still working.
42
42
  6. **Escalation, not blame,** when you disagree. A stated disagreement with
43
43
  evidence is a valid terminal state.
44
+ 7. **A model chosen for the work,** named in the dispatch — not whatever the
45
+ engine happened to be configured with. If you are asked to settle an
46
+ architecture question or verify a claim adversarially and you are running on
47
+ a tier below that, say so in your reply rather than answering anyway. A
48
+ confident answer from the wrong tier is the expensive failure here: it reads
49
+ exactly like a correct one and nothing downstream catches it.
44
50
 
45
51
  ---
46
52
 
@@ -253,6 +253,42 @@ file:///C:/Dev/lifeai-env/pool/codex-topology.mjs
253
253
  **Dispatch is long-running.** Run engine dispatch as a **background task**, not
254
254
  behind a `timeout` guess. A truncated call looks like a failure and is not one.
255
255
 
256
+ ### Step 1b — Pick the model for the work
257
+
258
+ **If the invocation names a model, use it. Otherwise choose one — do not silently
259
+ take the engine default.** The default is whatever that engine was last
260
+ configured with, which has no relationship to the task in front of it, and a
261
+ reasoning-heavy negotiation run on a small model produces confident agreement
262
+ that does not survive contact with the code.
263
+
264
+ Model is a **per-invocation** flag on both engines, so it applies to a resumed
265
+ conversation exactly as it does to a new one — a long-running collab lane can
266
+ change model between sittings without starting over:
267
+
268
+ | Engine | Flag |
269
+ |---|---|
270
+ | `codex` | `codex -m <model>` · with resume: `codex resume <id> -m <model>` |
271
+ | `claude` | `claude --model <model>` |
272
+ | interactive collab lane | `collab-launch.ps1 -Name <lane> -Model <model>` |
273
+
274
+ Choose by the KIND of work, not by the size of the diff:
275
+
276
+ | Work | Model tier | Why |
277
+ |---|---|---|
278
+ | Negotiating a design, architecture review, adversarial verification, root-causing a defect that resisted one fix | **most capable** (Opus-class / `gpt-5`-class) | The output is a decision that other work is built on. A wrong one is not caught by tests. |
279
+ | Implementing an agreed plan, mechanical refactor, test authoring, doc sweep | **mid tier** (Sonnet-class) | The shape is already decided; the cost of a retry is one run. |
280
+ | Formatting, lint fixes, transcription, extracting fields from output | **fast/cheap** (Haiku-class) | No judgment involved. |
281
+
282
+ Two rules that override the table:
283
+
284
+ 1. **Escalate on a repeat.** If a task has already failed once — a fix that did
285
+ not hold, a round that did not shrink the open set — the next attempt goes up
286
+ a tier, not sideways. Re-running the same tier on the same problem is how a
287
+ loop starts.
288
+ 2. **State the choice in the dispatch.** One line: *"running this on `<model>`
289
+ because it is an architecture decision."* A model choice nobody can see is a
290
+ model choice nobody can correct.
291
+
256
292
  ---
257
293
 
258
294
  ## Step 2 — Compose the response contract (mandatory)
@@ -267,11 +303,21 @@ repo mid-conversation, which is the v0.27.0 defect this version removes.
267
303
  **The contract — one block per open point:**
268
304
 
269
305
  ```
270
- POINT <n>: AGREE | AGREE-WITH-AMENDMENT | DISAGREE
306
+ POINT <n>: AGREE | AGREE-WITH-AMENDMENT | DISAGREE | UNKNOWN | DEFER
271
307
  EDIT: <the exact section and change that SHOULD be made, or NONE — describe it, do not make it>
272
- REASON: <one sentence — only if AMENDMENT or DISAGREE>
308
+ REASON: <one sentence — required for AMENDMENT, DISAGREE, UNKNOWN and DEFER>
273
309
  ```
274
310
 
311
+ `UNKNOWN` and `DEFER` are first-class answers, not failures. A three-value
312
+ contract forces a peer that lacks the evidence to invent a position, and an
313
+ invented position is indistinguishable from a settled one in the next round —
314
+ which is how a negotiation converges on something nobody actually checked. Adopted
315
+ from Codex, 2026-08-15: *"binary agreement forces invented certainty."*
316
+
317
+ **Every handshake carries `AS_OF` and `PROBE_STATE`** — when the peer last
318
+ observed the thing it is describing, and whether that observation was live,
319
+ cached, or absent. A claim with no as-of is a claim about an unknown moment.
320
+
275
321
  **When the point is a factual question rather than a proposal**, the peer answers
276
322
  with findings — still text, still no repo mutation:
277
323
 
@@ -283,13 +329,54 @@ CONFIDENCE: VERIFIED | INFERRED | UNKNOWN
283
329
 
284
330
  Rules that make the contract hold:
285
331
 
286
- 1. **State the format before the content.** Contract first, then the points.
332
+ 0. **Write like the peer, not like a memo.** An engine peer answers in dense,
333
+ structured blocks; address it the same way. Contract, numbered points, the
334
+ facts each point turns on — no preamble, no restating what was settled last
335
+ round in prose, no explaining your reasoning for a position the EDIT line
336
+ already states. Every sentence that is not a point, a constraint, or a fact
337
+ the peer needs is padding the peer must parse before it can answer. Prose
338
+ framing is for the human reading the transcript afterward, and it belongs in
339
+ the summary you write for them — not in the dispatch.
340
+ 1. **Name what to read, by path, before the points.** A peer does not go looking
341
+ on its own — it answers from what is in front of it, exactly like you do. A
342
+ dispatch that says "review the remediation plan" gets an answer about the peer's
343
+ memory of a plan; a dispatch that says `read
344
+ .rdc/areas/infra/fleet-throughput/plans/fleet-throughput-remediation.md §T1–T6
345
+ and pool/codex-topology.mjs sameOwner()` gets an answer about the code. List
346
+ the files, the sections, and the one thing to look for in each. If the peer
347
+ cannot reach a path, that is a `BLOCKED` you want stated early rather than an
348
+ answer quietly built on something else.
349
+
350
+ **A path beats a paraphrase. Never restate a document you can point at.** Both
351
+ engines share this filesystem, so pasting a plan into the dispatch buys
352
+ nothing and costs three ways: the peer answers your summary instead of the
353
+ source, your summary is stale the moment the file changes, and the context it
354
+ spends re-reading your prose is context it does not spend on the question. Link
355
+ the document, name the section, ask the question. The only text worth inlining
356
+ is what does NOT exist in a file yet — the open points themselves.
357
+ 2. **State the format before the content.** Contract first, then the points.
287
358
  2. **Say what NOT to produce** when the peer has a known default — e.g. *"do not
288
359
  write a lesson; this is a Decision and belongs in the plan."*
289
360
  3. **Number the points.** Unnumbered points get answered in aggregate.
290
361
  4. **Name the single writer before round 1** (see Step 4).
291
362
  5. **Ask for `BLOCKED` explicitly.** Without it, a peer that cannot act reports
292
363
  success or silence.
364
+ 6. **Mark a conversation-only collab as such, in the dispatch and in your own
365
+ turn.** A collab whose declared deliverable IS the reply produces no
366
+ repository artifact by design (Step 2's whole premise: the peer describes the
367
+ edit, it does not make it). An end-of-turn gate that demands a file, a commit,
368
+ or a lesson from such a turn is asking the protocol to violate itself, and the
369
+ peer's only honest answer becomes a repeated `BLOCKED` — which is exactly what
370
+ happened on 2026-08-15: a Codex peer returned a complete, contract-shaped,
371
+ four-point answer and then reported `BLOCKED: this conversation-only collab
372
+ cannot produce repository artifacts` twice more, because the gate would not
373
+ accept the reply as the deliverable.
374
+
375
+ State the deliverable explicitly — *"the deliverable of this turn is the reply
376
+ itself; no repository artifact is expected"* — so the completion gate has a
377
+ declared reason rather than an absence to interpret. The Decision that comes
378
+ OUT of the collab still lands in a governing document (Step 5); it is the
379
+ negotiation turns themselves that are conversation-only.
293
380
 
294
381
  ---
295
382
 
@@ -330,6 +417,12 @@ dispatch.
330
417
  > Two active writers on one surface is forbidden — the same rule the fleet plans
331
418
  > state as *"never run two active writers for one effect."*
332
419
 
420
+ **Scope ownership to a named effect or artifact, never to an agent in general** —
421
+ "Claude owns `fleet-throughput-remediation.md`", not "Claude is the writer".
422
+ Transfer is explicit and acknowledged; **silence never transfers ownership**. A
423
+ peer that has gone quiet is unobservable, not resigned, and treating those as the
424
+ same thing is how two writers end up on one file.
425
+
333
426
  If the named writer turns out to be **structurally blocked** (wrong lane, no
334
427
  credentials, read-only mount), ownership transfers to the other agent *for that
335
428
  artifact only*, recorded in the change itself with attribution. A blocked writer