@lifeaitools/rdc-skills 0.35.22 → 0.35.24
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/MANIFEST.md +224 -224
- package/guides/agent-bootstrap.md +6 -2
- 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/guides/orchestration-epic.md +17 -17
- package/guides/output-contract.md +8 -0
- package/guides/work-contract.md +183 -0
- package/package.json +1 -1
- package/scripts/lib/guide-content-rules.mjs +49 -0
- package/scripts/self-test.mjs +1439 -1459
- package/scripts/test-guide-validator.mjs +25 -24
- package/skills/behavior-audit/agents/openai.yaml +4 -4
- package/skills/build/SKILL.md +81 -29
- package/skills/deploy/SKILL.md +7 -0
- package/skills/edit/SKILL.md +4 -2
- package/skills/fixit/SKILL.md +16 -0
- package/skills/open/SKILL.md +45 -12
- package/skills/overnight/SKILL.md +3 -1
- package/skills/plan/SKILL.md +21 -23
- package/skills/release/SKILL.md +7 -5
- package/skills/tests/onramp.test.json +101 -101
- package/skills/tests/rdc-env.test.json +12 -12
- package/skills/tests/rdc-new-model.test.json +12 -12
- package/skills/tests/rdc-refactor.test.json +29 -29
- package/skills/tests/rdc-regen-media.test.json +29 -29
- package/.rdc/evidence/orchestrator-rework-strikes/a9fad8b4716ee35e5f5d0047.json +0 -1
- package/.rdc/last_seen.json +0 -8
|
@@ -32,30 +32,11 @@ const REPO_ROOT = resolve(__dirname, "..");
|
|
|
32
32
|
// ─── Inline validator (mirrors self-test.mjs logic) ────────────────────────
|
|
33
33
|
import { readFileSync, existsSync, readdirSync, statSync } from "node:fs";
|
|
34
34
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
"brand-studio",
|
|
41
|
-
];
|
|
42
|
-
|
|
43
|
-
const GUIDE_NEGATION_PATTERNS = [
|
|
44
|
-
/\bdo not\b/i,
|
|
45
|
-
/\bnever\b/i,
|
|
46
|
-
/\bno such\b/i,
|
|
47
|
-
/\bdoes not exist\b/i,
|
|
48
|
-
/\bbanned\b/i,
|
|
49
|
-
/\bnot reference\b/i,
|
|
50
|
-
/\bnot use\b/i,
|
|
51
|
-
/\bavoid\b/i,
|
|
52
|
-
/\bremoved\b/i,
|
|
53
|
-
/\bdeprecated\b/i,
|
|
54
|
-
// Markdown table row showing a WRONG→CORRECT mapping (naming-corrections.md pattern)
|
|
55
|
-
/^\|[^|]*WRONG[^|]*\|/i,
|
|
56
|
-
// A table row where the term is in the WRONG column (first data column after the | WRONG | header)
|
|
57
|
-
/^\|\s*(Brand Studio|brand-studio|@regen\/brand-studio|@masonator[^ |]*|coolify-mcp)[^|]*\|\s*\*\*/,
|
|
58
|
-
];
|
|
35
|
+
// Rules imported from the single home — see scripts/lib/guide-content-rules.mjs for why.
|
|
36
|
+
import { GUIDE_BANNED_TERMS, GUIDE_NEGATION_PATTERNS } from "./lib/guide-content-rules.mjs";
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
|
|
59
40
|
|
|
60
41
|
const KNOWN_CLAUTH_KEYS = new Set([
|
|
61
42
|
"coolify-api",
|
|
@@ -184,6 +165,26 @@ const cleanFindings = scanDir(GOOD_DIR, "fixtures");
|
|
|
184
165
|
const cleanErrors = cleanFindings.filter((f) => f.level === "error");
|
|
185
166
|
assert("scanDir on clean fixture dir returns 0 errors", cleanErrors.length === 0, `got ${cleanErrors.length}`);
|
|
186
167
|
|
|
168
|
+
// ─── Test 5: a corrections-table row is a correction, under ANY scope prefix ───
|
|
169
|
+
// Regression, 2026-09-16: the exemption listed `@regen/brand-studio`; after the
|
|
170
|
+
// scope rename, `| @lifeai/brand-studio | **@lifeai/studio** |` in
|
|
171
|
+
// naming-corrections.md — a row declaring that name WRONG — failed strict runs.
|
|
172
|
+
console.log("\nTest 5: corrections-table rows are negations regardless of scope");
|
|
173
|
+
const { isNegatedBannedLine } = await import("./lib/guide-content-rules.mjs");
|
|
174
|
+
for (const row of [
|
|
175
|
+
"| brand-studio | **studio** | 2026-04-24 |",
|
|
176
|
+
"| @regen/brand-studio | **@regen/studio** | 2026-04-24 |",
|
|
177
|
+
"| @lifeai/brand-studio | **@lifeai/studio** | 2026-04-24 |",
|
|
178
|
+
"| @some-future-scope/brand-studio | **@some-future-scope/studio** | 2027-01-01 |",
|
|
179
|
+
]) {
|
|
180
|
+
assert(`negated: ${row}`, isNegatedBannedLine(row));
|
|
181
|
+
}
|
|
182
|
+
// The structural exemption must not swallow a real instruction.
|
|
183
|
+
assert("NOT negated: an instruction that merely contains the term",
|
|
184
|
+
!isNegatedBannedLine("Install @lifeai/brand-studio and import it in the app."));
|
|
185
|
+
assert("NOT negated: a table row whose correction cell is not bold",
|
|
186
|
+
!isNegatedBannedLine("| package | @lifeai/brand-studio | use it |"));
|
|
187
|
+
|
|
187
188
|
// ─── Summary ─────────────────────────────────────────────────────────────────
|
|
188
189
|
console.log(`\n${"─".repeat(60)}`);
|
|
189
190
|
console.log(`guide-validator tests: ${passed} passed, ${failed} failed`);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
interface:
|
|
2
|
-
display_name: "Behavior Audit"
|
|
3
|
-
short_description: "Audit Claude and Codex behavior against shared rules."
|
|
4
|
-
default_prompt: "Run a behavior audit for the last seven days and write the evidence bundle to a report directory."
|
|
1
|
+
interface:
|
|
2
|
+
display_name: "Behavior Audit"
|
|
3
|
+
short_description: "Audit Claude and Codex behavior against shared rules."
|
|
4
|
+
default_prompt: "Run a behavior audit for the last seven days and write the evidence bundle to a report directory."
|
package/skills/build/SKILL.md
CHANGED
|
@@ -6,6 +6,11 @@ description: rdc:build (epic-id) - [--no-review] — execute a planned epic, the
|
|
|
6
6
|
> **⚠️ OUTPUT CONTRACT (READ FIRST):** `guides/output-contract.md`
|
|
7
7
|
> Checklist-only output. No tool-call narration. No raw MCP/JSON/log dumps.
|
|
8
8
|
> One checklist upfront, updated in place, shown again at end with a 1-line verdict.
|
|
9
|
+
> A decision that changes what happens next — a skipped orchestrator, a substituted branch, a held task — gets ONE plain sentence, never hidden behind a checkbox.
|
|
10
|
+
|
|
11
|
+
> **⚠️ WORK CONTRACT (READ SECOND):** `guides/work-contract.md`
|
|
12
|
+
> Declare the build before the first change: `rdc-work start --type build --work-item <uuid> --goal … --row "<step> :: <proof>"`.
|
|
13
|
+
> **This skill is written in regen-root's terms.** `develop`, `{PROJECT_ROOT}/.rdc/guides`, `scripts/land.mjs` and `runOrchestrator()` are regen-root facts, not universal ones — for any other target apply that guide's substitution table to every occurrence below, using the target the contract resolved (`rdc-work status`).
|
|
9
14
|
|
|
10
15
|
> **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.
|
|
11
16
|
|
|
@@ -26,17 +31,19 @@ description: rdc:build (epic-id) - [--no-review] — execute a planned epic, the
|
|
|
26
31
|
|
|
27
32
|
## Agent Types & Guide Files
|
|
28
33
|
|
|
29
|
-
Every dispatched agent MUST read
|
|
30
|
-
1. `
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
34
|
+
Every dispatched agent MUST read these guides before starting — in this order:
|
|
35
|
+
1. `agent-bootstrap.md` — credentials, git rules, completion report format
|
|
36
|
+
2. `engineering-behavior.md` — assumptions, minimal changes, surgical scope, verification evidence
|
|
37
|
+
3. `<type>.md` — role-specific guide
|
|
38
|
+
|
|
39
|
+
**Resolve the guides directory from the contract, never from cwd.** `rdc-work status --json` → `contract.target.guides_dir`:
|
|
40
|
+
- present → read `<guides_dir>/<name>.md` (regen-root: `<root>/.rdc/guides`)
|
|
41
|
+
- absent → read the guides shipped with rdc-skills (`guides/<name>.md` in the installed package)
|
|
42
|
+
- **never** fall back to a cwd-relative `.rdc/guides`: when the session was started in one repository and builds another, that path silently loads the wrong repository's rules. That fallback is what imported regen-root's git and deploy assumptions into a CDE build (Codex, 2026-09-16).
|
|
36
43
|
|
|
37
|
-
Include
|
|
44
|
+
Include the resolved paths in every agent prompt:
|
|
38
45
|
```
|
|
39
|
-
"Read
|
|
46
|
+
"Read <guides>/agent-bootstrap.md first, then <guides>/engineering-behavior.md, then <guides>/<type>.md before starting. Your target is <root>; its integration branch is <integration>."
|
|
40
47
|
```
|
|
41
48
|
|
|
42
49
|
| Agent Type | Guide File | When to dispatch |
|
|
@@ -80,10 +87,23 @@ Read the task title and description, then:
|
|
|
80
87
|
- Ordinary rows (`design_review_required = false`) may be considered for dispatch regardless of a legacy state. Only an explicitly opted-in row requires `automatic_approved` or `human_approved`.
|
|
81
88
|
- For an explicitly opted-in row in `pending`, `needs_human`, or `rejected`, write an `admission_refocus` receipt, keep the child blocked, and route it to the reviewer/planner. **Do not dispatch it, retry it, or call the epic complete.**
|
|
82
89
|
|
|
83
|
-
1a. **Run the durable CodeFlow supervisor
|
|
84
|
-
|
|
90
|
+
1a. **Run the durable CodeFlow supervisor — where the target has one.**
|
|
91
|
+
|
|
92
|
+
**First, decide whether it applies.** The orchestrator needs a phase manifest, and today exactly one exists: `corpus/_shared/build/phase-manifest.json` inside **regen-root** (read by `packages/codeflow/src/orchestrator`). Check the contract's target root:
|
|
93
|
+
|
|
94
|
+
| target root contains `corpus/_shared/build/phase-manifest.json` | do this |
|
|
95
|
+
|---|---|
|
|
96
|
+
| **yes** (regen-root) | the orchestrator is REQUIRED, exactly as below |
|
|
97
|
+
| **no** (lifeai-env, rdc-cde, rdc-skills, clauth, …) | it does not apply. Resolve waves from the work items' dependencies (step 6), state it in one sentence — `orchestrator: not applicable, <root> has no phase manifest` — and continue. **This is not a BLOCKED condition.** |
|
|
98
|
+
|
|
99
|
+
This used to say "if the project lacks a real dispatcher/manifest, report BLOCKED" while naming a function and no invocation. Every non-regen-root build therefore either stopped or became an infrastructure investigation into how to start work (Codex, building CDE, 2026-09-16). An orchestrator that exists in one repository cannot be a precondition for building every repository.
|
|
100
|
+
|
|
101
|
+
When it applies:
|
|
102
|
+
- Invoke `runOrchestrator()` with the phase manifest, `SupabaseStateStore`, and the real phase dispatcher. It is the sole authority for resuming/refocusing a phase DAG; do not reconstruct waves by hand from task prose.
|
|
85
103
|
- A returned `admission_refocus` or `pipeline_blocked` is a durable hold, not a failed attempt to work around. Preserve its task state and route an explicitly requested Design Review or validator closure.
|
|
86
|
-
- Only a returned `pipeline_complete` whose phase tasks are durably `done` permits an epic completion claim. If the
|
|
104
|
+
- Only a returned `pipeline_complete` whose phase tasks are durably `done` permits an epic completion claim. If the manifest exists but the orchestrator itself cannot run, THAT is `BLOCKED: CodeFlow supervisor entrypoint unavailable` — report it rather than emulating completion.
|
|
105
|
+
|
|
106
|
+
Either way, the epic's completion claim also requires the session's work contract to pass (`rdc-work check`).
|
|
87
107
|
|
|
88
108
|
**Read the epic's `plan_ref`, `spec_ref`, `architecture_ref`, and `scoping_statement`** (columns on the epic row). `scoping_statement` bounds what this build may touch. If `architecture_ref` is set, this epic crosses an architectural boundary — read that doc now, before classifying or dispatching any task, and carry it into every agent prompt below.
|
|
89
109
|
|
|
@@ -103,6 +123,15 @@ Read the task title and description, then:
|
|
|
103
123
|
```
|
|
104
124
|
This is an atomic Supabase write. A concurrent session that loads the same epic after this point will see `in_progress` and abort. **Do this before any classification, planning, or agent dispatch.**
|
|
105
125
|
|
|
126
|
+
**Declare the build — immediately after claiming, before any change** (`guides/work-contract.md`):
|
|
127
|
+
```bash
|
|
128
|
+
node "$LIFEAI_ENV/bin/rdc-work.mjs" start --type build --work-item <epic-or-task-uuid> \
|
|
129
|
+
--goal "<what this epic delivers, in one sentence>" \
|
|
130
|
+
--row "<deliverable> :: <read-only command that exits 0 when it is true>" # one per deliverable
|
|
131
|
+
```
|
|
132
|
+
A proof observes and can fail: `rdc-work` refuses one that commits, pushes, lands, publishes, deploys or writes a file, and one that cannot fail (`true`, `echo`). Prove a landing by observing it (`git merge-base --is-ancestor HEAD origin/<integration>`). Run the gate's printed `rdc-work` lines as printed — they carry `--session`.
|
|
133
|
+
The printed `target:` line is authoritative for the rest of this skill: its **integration** branch replaces every `develop` below, its **ship** route replaces `scripts/land.mjs`. Without a contract the start gate refuses the first write and the first commit.
|
|
134
|
+
|
|
106
135
|
**Pre-flight gate — run after claiming:**
|
|
107
136
|
|
|
108
137
|
| Condition | Action |
|
|
@@ -111,7 +140,7 @@ Read the task title and description, then:
|
|
|
111
140
|
| Tasks exist but all have empty `description` fields | → Invoke `rdc:plan` on this epic. Tasks without descriptions cannot be safely dispatched. |
|
|
112
141
|
| Plan doc missing `## Checklist Decomposition Matrix` | → Invoke `rdc:plan` on this epic. Do NOT dispatch agents. |
|
|
113
142
|
| Plan doc missing `## Checklist Quality Gate` with `verdict: PASS` | → Invoke `rdc:plan` on this epic. Do NOT dispatch agents. |
|
|
114
|
-
| Any implementation task lacks `decomp-*` items,
|
|
143
|
+
| Any implementation task lacks `decomp-*` items, leaves a declared surface (screen/api/db/tool) uncovered, or has a deliverable with no row that can fail | → Invoke `rdc:plan` on this epic. Coarse/under-decomposed checklists cannot be safely dispatched. |
|
|
115
144
|
| Any `decomp-*` item lacks route/file, action, expected result, or evidence artifact | → Invoke `rdc:plan` on this epic. Do NOT dispatch agents. |
|
|
116
145
|
| Epic has `architecture_ref` set and any implementation task's checklist lacks a required `architecture-fidelity-*` row | → Invoke `rdc:plan` on this epic. That task will hard-fail the exit gate at close regardless of build quality — catch it here, not after a wasted agent run. |
|
|
117
146
|
| Tasks exist and have descriptions | → Continue with build. |
|
|
@@ -236,10 +265,11 @@ Read the task title and description, then:
|
|
|
236
265
|
- `verdict: PASS`
|
|
237
266
|
|
|
238
267
|
Required task checklist shape:
|
|
239
|
-
- Every implementation work item
|
|
240
|
-
per
|
|
241
|
-
|
|
242
|
-
|
|
268
|
+
- Every implementation work item covers EVERY surface it declares (screen / api / db / tool)
|
|
269
|
+
and every handoff, with one row per deliverable that can pass or fail on its own. Coverage
|
|
270
|
+
is the rule; **there is no minimum row count** (`guides/work-contract.md` § Rows). The
|
|
271
|
+
per-surface lists in rdc:plan are a decomposition checklist for finding deliverables, not a
|
|
272
|
+
quota to fill.
|
|
243
273
|
- Every implementation work item has at least one `decomp-*` checklist row and one `test-*` checklist row.
|
|
244
274
|
- Every `decomp-*` row names a concrete route or file path.
|
|
245
275
|
- Every `decomp-*` row names one user/agent action.
|
|
@@ -259,10 +289,15 @@ Read the task title and description, then:
|
|
|
259
289
|
- DB/migration task: at least schema object, relationship/guard, policy/permission, seed/fixture or backfill, and smoke query.
|
|
260
290
|
- Editor/sidebar/CLI workflow: at least start, attach/open, enqueue action, observe result, timeout/error, and live refresh where applicable.
|
|
261
291
|
|
|
262
|
-
HARD
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
292
|
+
HARD GATE (mirrors rdc:plan): any declared surface (screen/api/db/tool) left uncovered, any
|
|
293
|
+
deliverable with no row that can fail, or any row without its surface + one verification
|
|
294
|
+
artifact, is a REJECT — reopen to rdc:plan.
|
|
295
|
+
|
|
296
|
+
A numeric floor used to sit here ("every task carries >= 10 attested rows; a multi-surface WP
|
|
297
|
+
carries the SUM of its per-surface floors, typically 12-20"). Removed 2026-09-16: it measured
|
|
298
|
+
paperwork, not coverage. Building a small CDE increment against it produced 91 checks before a
|
|
299
|
+
runnable UI existed (Codex). A thin checklist is caught by COVERAGE — an uncovered surface — not
|
|
300
|
+
by counting; a padded one passed the count and proved nothing extra.
|
|
266
301
|
|
|
267
302
|
### ⛔ Deliverable / acceptance check-off table — show BEFORE any implementation
|
|
268
303
|
Before dispatching the first wave, render a deliverable/acceptance table and
|
|
@@ -309,7 +344,7 @@ Read the task title and description, then:
|
|
|
309
344
|
The agent must complete every item on this checklist and return it checked off in AGENT_COMPLETE.
|
|
310
345
|
A checklist with unchecked items = incomplete work. Do not proceed to next wave with unchecked items.
|
|
311
346
|
|
|
312
|
-
6. **Use the supervisor-resolved waves** — parallelize only phases returned by `runOrchestrator()` after its durable admission check:
|
|
347
|
+
6. **Use the supervisor-resolved waves** — where the orchestrator applies (§1a), parallelize only phases returned by `runOrchestrator()` after its durable admission check; where it does not, derive the same three waves from the work items' declared dependencies:
|
|
313
348
|
- Wave 1: independent tasks (different packages/files)
|
|
314
349
|
- Wave 2: tasks that depend on Wave 1 outputs
|
|
315
350
|
- Wave 3: integration tasks
|
|
@@ -326,6 +361,14 @@ Read the task title and description, then:
|
|
|
326
361
|
worktree. A non-isolated dispatched agent is read-only and may research,
|
|
327
362
|
review, or validate merged source; it may not write.
|
|
328
363
|
|
|
364
|
+
**`Agent()`, `isolation: "worktree"` and `max_turns` are Claude Code's dispatch
|
|
365
|
+
interface.** The requirement is engine-neutral — one leased worktree per writer,
|
|
366
|
+
read-only for everyone else — but those argument names are not. On an engine
|
|
367
|
+
whose native dispatch does not accept them (Codex), do not stop to ask:
|
|
368
|
+
create the writer's worktree yourself from the contract's integration branch
|
|
369
|
+
(`guides/work-contract.md` § Dispatching writers) and start the writer inside
|
|
370
|
+
it. The worktree is the requirement; the parameter was only one way to get it.
|
|
371
|
+
|
|
329
372
|
### ⛔ Dispatch mode — writers are always isolated
|
|
330
373
|
Isolation is an ownership boundary, not a concurrency optimization. The
|
|
331
374
|
supervisor may implement directly as the sole writer, but once work is
|
|
@@ -381,15 +424,24 @@ Read the task title and description, then:
|
|
|
381
424
|
Without `max_turns: 70`, agents hit the default turn cap mid-task and stop.
|
|
382
425
|
`isolation: "worktree"` gives each agent its own git worktree and branch — eliminates push race conditions and index lock contention when multiple agents commit in parallel. The supervisor merges worktree branches after each wave (Step 9).
|
|
383
426
|
|
|
384
|
-
### ✅ PREVENTION FIRST — create worktrees fresh off
|
|
427
|
+
### ✅ PREVENTION FIRST — create worktrees fresh off the INTEGRATION branch (kills stale-base by construction)
|
|
428
|
+
|
|
429
|
+
> **`develop` in this section and the HARD GATE below means the contract's
|
|
430
|
+
> integration branch** (`rdc-work status` → `integration <branch>`, from
|
|
431
|
+
> `projects.json`). It is `develop` for regen-root and rdc-harness, `main` for
|
|
432
|
+
> lifeai-env, clauth and rdc-cde, `master` for rdc-skills. Running these commands
|
|
433
|
+
> literally against a repository with no `origin/develop` fails — which is what a
|
|
434
|
+
> CDE build hit (Codex, 2026-09-16). Never infer it from `origin/HEAD`: regen-root's
|
|
435
|
+
> `origin/HEAD` is `main`, and its integration branch is `develop`.
|
|
436
|
+
|
|
385
437
|
The repeated stale-base failures below come from creating worktrees off a
|
|
386
438
|
local/old ref. Eliminate the failure mode at the source: ALWAYS create agent
|
|
387
|
-
worktrees with a fresh fetch +
|
|
388
|
-
`git fetch origin
|
|
389
|
-
— or
|
|
390
|
-
exactly that. A worktree cut from `origin
|
|
439
|
+
worktrees with a fresh fetch + integration-branch base, e.g.
|
|
440
|
+
`git fetch origin <integration> && git worktree add <dir> -b <branch> origin/<integration>`
|
|
441
|
+
— or, in regen-root, the canonical launcher `node scripts/wt.mjs add <name>`, which does
|
|
442
|
+
exactly that. A worktree cut from `origin/<integration>` HEAD **cannot** be stale.
|
|
391
443
|
The HARD GATE below remains as the blocking backstop (detection), but
|
|
392
|
-
construction-from-`origin
|
|
444
|
+
construction-from-`origin/<integration>` is the primary defense.
|
|
393
445
|
|
|
394
446
|
### ⛔ HARD GATE — Worktree base MUST equal develop HEAD (blocking, not advisory)
|
|
395
447
|
The worktree-isolation harness has shipped worktrees pinned to a STALE base
|
|
@@ -646,7 +698,7 @@ Read the task title and description, then:
|
|
|
646
698
|
state, persisted outputs, and fixture cleanup on the deploy-equivalent
|
|
647
699
|
runtime; an absent harness is a hard rejection.
|
|
648
700
|
- **Verifies checklist decomposition quality per work item before functional validation:**
|
|
649
|
-
- Every implementation work item
|
|
701
|
+
- Every implementation work item covers every surface it declares, with one row per deliverable that can fail on its own — coverage, not a row count (`guides/work-contract.md` § Rows)
|
|
650
702
|
- Every `decomp-*` item includes route/file, action, expected result, and evidence artifact
|
|
651
703
|
- Any unchecked `decomp-*` item with `required: true` = work item CANNOT be set to `done`
|
|
652
704
|
- Any coarse or non-falsifiable `decomp-*` item = reopen to `todo` with the specific failure
|
package/skills/deploy/SKILL.md
CHANGED
|
@@ -7,6 +7,13 @@ description: rdc:deploy (slug, [action]) — run one command; exit 0 means shipp
|
|
|
7
7
|
> One command, then one line: the URL on exit 0, or the `DEPLOY-FAILED` block on
|
|
8
8
|
> non-zero. No tool-call narration, no raw JSON dumps, no progress commentary.
|
|
9
9
|
|
|
10
|
+
> **Sandbox contract:** This skill honors `RDC_TEST=1` per
|
|
11
|
+
> `.rdc/guides/agent-bootstrap.md` § RDC_TEST Sandbox Contract. Under the flag
|
|
12
|
+
> the run stays read-only — registry read plus health probe — and every
|
|
13
|
+
> mutating step short-circuits: no deploy triggered, no Cloudflare cache purge,
|
|
14
|
+
> no DNS write, no promote to main. `skills/tests/rdc-deploy.test.json` asserts
|
|
15
|
+
> exactly those four absences, so this is an enforced contract, not a promise.
|
|
16
|
+
|
|
10
17
|
# rdc:deploy — run the program, read the exit code
|
|
11
18
|
|
|
12
19
|
**This skill is not a procedure. It is one command.**
|
package/skills/edit/SKILL.md
CHANGED
|
@@ -17,8 +17,10 @@ description: rdc:edit (target) — open the local website editor for a target
|
|
|
17
17
|
**This skill is the designated handler `rdc-harness` dispatches to.**
|
|
18
18
|
`packages/work/src/editors.mjs`'s `BY_CLASS` table maps `site-html`/`site-ts`
|
|
19
19
|
product classes to editor id `'rdc:edit'` — when an agent calls
|
|
20
|
-
`npx --package=@lifeai/rdc-harness rdc-harness edit <slug>` (
|
|
21
|
-
|
|
20
|
+
`npx -y --package=@lifeai/rdc-harness rdc-harness edit <slug>` (published on
|
|
21
|
+
GitHub Packages — needs `@lifeai:registry=https://npm.pkg.github.com` in
|
|
22
|
+
`.npmrc`; an `npm` 404 means that mapping is missing. Full setup:
|
|
23
|
+
`{PROJECT_ROOT}/.rdc/guides/agent-bootstrap.md`) against a website
|
|
22
24
|
target, its receipt names `editorId: 'rdc:edit'` and an `editableBoundary`.
|
|
23
25
|
This skill IS that handler: resolve the same target, launch/reuse the editor
|
|
24
26
|
host, use the harness's `editableBoundary` as the save boundary if the call
|
package/skills/fixit/SKILL.md
CHANGED
|
@@ -56,6 +56,22 @@ SELECT insert_work_item(
|
|
|
56
56
|
|
|
57
57
|
Note the returned `id`.
|
|
58
58
|
|
|
59
|
+
### 2a. Declare the fix and its proof (before touching any code)
|
|
60
|
+
|
|
61
|
+
A fixit is a todo-tier contract (`guides/work-contract.md`). Every row carries the
|
|
62
|
+
command that proves it; the start gate refuses the first edit without one.
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
node "$LIFEAI_ENV/bin/rdc-work.mjs" start --type fixit --goal "<the fix, as an outcome>" \
|
|
66
|
+
--row "<the defect is gone> :: <command that exits 0 only when it is>" \
|
|
67
|
+
--row "shipped :: git fetch -q origin && git merge-base --is-ancestor HEAD origin/<integration>"
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Use the printed `target:` line for the rest of this skill: `{development-branch}`
|
|
71
|
+
is its **integration** branch, and `scripts/land.mjs` is its **ship** route —
|
|
72
|
+
they differ per repository. A proof observes and can fail — `rdc-work` refuses one
|
|
73
|
+
that changes anything or cannot fail. Finish with `rdc-work verify --all`; Stop checks it.
|
|
74
|
+
|
|
59
75
|
### 3. Write the fixit session marker
|
|
60
76
|
|
|
61
77
|
Write to `{USER_HOME}/.claude/fixit.marker`:
|
package/skills/open/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: open
|
|
3
|
-
description: rdc:open ([slug]) — orient
|
|
3
|
+
description: rdc:open ([slug]) - [--for maintenance|fixit|edit|hotfix|build|refactor] — orient, then declare the work and how each step is proved before changing anything
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
> **⚠️ OUTPUT CONTRACT (READ FIRST):** `guides/output-contract.md`
|
|
@@ -12,12 +12,14 @@ description: rdc:open ([slug]) — orient before working; answers where you are
|
|
|
12
12
|
## Run the script. Do not re-derive this by hand.
|
|
13
13
|
|
|
14
14
|
`rdc-harness` ships as a published package — `@lifeai/rdc-harness` on GitHub
|
|
15
|
-
Packages, not npmjs
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
Packages, not npmjs. That needs `@lifeai:registry=https://npm.pkg.github.com`
|
|
16
|
+
in `.npmrc`; if `npm` 404s on the package, that mapping is what is missing
|
|
17
|
+
(auth token: the clauth `github` PAT — full setup in
|
|
18
|
+
`.rdc/guides/agent-bootstrap.md`). Invoke it through the installed `bin`,
|
|
19
|
+
never a machine-specific checkout path:
|
|
18
20
|
|
|
19
21
|
```bash
|
|
20
|
-
npx --package=@lifeai/rdc-harness rdc-harness open <slug>
|
|
22
|
+
npx -y --package=@lifeai/rdc-harness rdc-harness open <slug>
|
|
21
23
|
```
|
|
22
24
|
|
|
23
25
|
Only if you are actively developing the harness itself (working ON
|
|
@@ -143,9 +145,10 @@ Downstream verbs re-resolve from the registry by slug.
|
|
|
143
145
|
|
|
144
146
|
## Steps
|
|
145
147
|
|
|
146
|
-
0. **Call `rdc-harness open <slug>`.**
|
|
147
|
-
|
|
148
|
-
unavailable, and say so
|
|
148
|
+
0. **Call `npx -y --package=@lifeai/rdc-harness rdc-harness open <slug>`.**
|
|
149
|
+
Steps 1–2 are what it returns, not a procedure to perform. Only
|
|
150
|
+
hand-resolve if the harness is genuinely unavailable, and say so
|
|
151
|
+
explicitly when you do.
|
|
149
152
|
1. **Position.** Read `sourceBoundary` and `boundaryNote` from the result — they
|
|
150
153
|
already account for pooled repos and lanes. Relative paths from there are
|
|
151
154
|
correct by construction; a hardcoded `C:/Dev/regen-root/...` from a lane
|
|
@@ -170,8 +173,34 @@ Downstream verbs re-resolve from the registry by slug.
|
|
|
170
173
|
this contract. If the contract is absent, record it as a build requirement;
|
|
171
174
|
do not silently substitute a manual visual assertion.
|
|
172
175
|
|
|
173
|
-
5. **State the ground in one line
|
|
174
|
-
|
|
176
|
+
5. **State the ground in one line.** Do not re-derive it later in the turn.
|
|
177
|
+
|
|
178
|
+
6. **Declare the work — before the first change** (`guides/work-contract.md`).
|
|
179
|
+
`rdc:open <project> --for <type>` ends here. The type picks the tier:
|
|
180
|
+
|
|
181
|
+
| `--for` | tier | what it adds |
|
|
182
|
+
|---|---|---|
|
|
183
|
+
| `maintenance`, `hotfix`, `fixit`, `edit` | todo | rows only |
|
|
184
|
+
| `build`, `refactor`, `overnight` | work-item | `--work-item <uuid>` |
|
|
185
|
+
|
|
186
|
+
```bash
|
|
187
|
+
node "$LIFEAI_ENV/bin/rdc-work.mjs" start --type <type> --goal "<what done means>" \
|
|
188
|
+
--row "<step> :: <read-only command that exits 0 when the step is true>" # one per deliverable
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
Each row carries the command that proves it; a row passes only when that
|
|
192
|
+
command ran and exited 0. A proof observes and can fail — one that changes
|
|
193
|
+
anything, or cannot fail, is refused. On every tier, a work item this session
|
|
194
|
+
has claimed holds Stop until its database DoD closes. The printed `target:` line is the resolved ship
|
|
195
|
+
contract — integration branch and ship route — for this target, so no later
|
|
196
|
+
step assumes regen-root's `develop` or `scripts/land.mjs`. Where the type is
|
|
197
|
+
also a flow state (`maintenance`, `hotfix`, `build`, `refactor`, `overnight`)
|
|
198
|
+
the FSM flow is set in the same call.
|
|
199
|
+
|
|
200
|
+
Operator, 2026-09-14: *"rdc open website-x for maintenance and it says fsm to
|
|
201
|
+
be todo list"*. That is this step. Skip it only for a pure conversation turn —
|
|
202
|
+
the start gate refuses a tracked write or a commit without it anyway, and
|
|
203
|
+
prints this exact command.
|
|
175
204
|
|
|
176
205
|
## Checklist
|
|
177
206
|
|
|
@@ -182,12 +211,16 @@ Downstream verbs re-resolve from the registry by slug.
|
|
|
182
211
|
[ ] harness shape named for the target's class
|
|
183
212
|
[ ] UI target: project-owned Playwright command/config identified (or absence recorded)
|
|
184
213
|
[ ] blockers noted — behind upstream, dirty tree, service down
|
|
214
|
+
[ ] work declared — rdc-work start, every row with a proof command (or: conversation only)
|
|
185
215
|
```
|
|
186
216
|
|
|
187
217
|
## Related
|
|
188
218
|
|
|
189
|
-
- `
|
|
190
|
-
|
|
219
|
+
- `guides/work-contract.md` — the contract this skill opens: rows, tiers, proving,
|
|
220
|
+
staleness, and what Stop checks.
|
|
221
|
+
- `rdc:flow` — declares what KIND of work this is. `rdc-work start --type` sets it
|
|
222
|
+
for you when the type is a flow state; use `rdc:flow` directly for `plan`,
|
|
223
|
+
`design`, `collab`.
|
|
191
224
|
- `rdc:status` — open epics and queue. That is the work; this is the ground.
|
|
192
225
|
- `rdc:deploy` — consumes the source key this skill resolves.
|
|
193
226
|
- `$LIFEAI_ENV/docs/GATES-GUARDS-DENIES.md` — when a guard stops you, that names
|
|
@@ -11,6 +11,8 @@ description: rdc:overnight ([scope]) — drain the work queue unattended, end to
|
|
|
11
11
|
|
|
12
12
|
> **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.
|
|
13
13
|
|
|
14
|
+
> **⚠️ WORK CONTRACT:** `guides/work-contract.md`. Each epic this run builds is declared through `rdc:build`'s contract step, and its Stop is that contract's checklist. This skill names regen-root's `develop` and `scripts/land.mjs` throughout; for any other target, apply that guide's substitution table (integration branch, ship route, orchestrator applicability) using the target each contract resolved.
|
|
15
|
+
|
|
14
16
|
|
|
15
17
|
# rdc:overnight — Overnight Build Supervisor
|
|
16
18
|
|
|
@@ -140,7 +142,7 @@ Agents receive the relevant guide file from `.rdc/guides/` (fallback: `.rdc/guid
|
|
|
140
142
|
|
|
141
143
|
After each wave: check `BUILD_STATUS`. If `escalated: true`, log the escalation
|
|
142
144
|
in the overnight doc and continue — don't stop the loop.
|
|
143
|
-
After each wave and after every resumed epic, require the `runOrchestrator()` receipt from `rdc:build
|
|
145
|
+
After each wave and after every resumed epic, require the `runOrchestrator()` receipt from `rdc:build` **where the orchestrator applies** — the target contains `corpus/_shared/build/phase-manifest.json` (today: regen-root; see `rdc:build` §1a). Elsewhere, require the contract checklist (`rdc-work check`) instead; an absent orchestrator is not a hold. `admission_refocus` or `pipeline_blocked` means the epic is held for an explicitly requested Design Review or validator closure; log that state and do not hand-reconstruct a dispatch wave.
|
|
144
146
|
|
|
145
147
|
**Mandatory code-review gate inherited from rdc:build (Step 9b).** Every wave inside `rdc:build` runs a `pr-review-toolkit:code-reviewer` pass before the next wave dispatches. Critical/high findings reopen the affected work items to `todo` and the next wave fixes them. Overnight does not skip or weaken this gate. If a wave's code-review escalates twice, advisor decides; otherwise the loop continues.
|
|
146
148
|
|
package/skills/plan/SKILL.md
CHANGED
|
@@ -168,18 +168,19 @@ description: rdc:plan (topic) — produce architecture, decisions and an epic wi
|
|
|
168
168
|
live-refresh. Floor: >= 6 rows.
|
|
169
169
|
- Visual: one row per named screenshot/checkpoint. Cross-system: one row per handoff boundary.
|
|
170
170
|
|
|
171
|
-
HARD
|
|
172
|
-
- Every implementation task carries >= 10 attested `decomp-*`/`test-*` rows.
|
|
173
|
-
- A MULTI-SURFACE WP (two or more of screen/api/db/tool) carries the SUM of its per-surface
|
|
174
|
-
floors — typically 12-20 rows. A flat 5-6-row checklist for a real feature WP is a REJECT,
|
|
175
|
-
not a pass.
|
|
171
|
+
HARD GATES — reject the checklist (do NOT create work items) if any is violated:
|
|
176
172
|
- COVERAGE: the checklist covers EVERY surface the WP declares. A WP touching screen+api+db
|
|
177
|
-
that lists only db rows FAILS the coverage gate.
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
173
|
+
that lists only db rows FAILS the coverage gate. The per-surface lists above are how you FIND
|
|
174
|
+
the deliverables; they are not a quota.
|
|
175
|
+
- FALSIFIABLE: every deliverable has a row that can fail on its own, and every row names its
|
|
176
|
+
surface + ONE concrete verification artifact (test name, route probe, Playwright screenshot,
|
|
177
|
+
SQL query, migration proof, CLI transcript) — expressible as a proof command
|
|
178
|
+
(`guides/work-contract.md`). A row with no attestation artifact is a REJECT.
|
|
179
|
+
- There is **no minimum row count.** A small WP with three real deliverables carries three
|
|
180
|
+
rows. Removed 2026-09-16: ">= 10 attested rows per task" and "a multi-surface WP carries the
|
|
181
|
+
SUM of its per-surface floors" measured paperwork, not coverage — a small CDE increment built
|
|
182
|
+
against them produced 91 checks before a runnable UI existed (Codex). A thin checklist is
|
|
183
|
+
caught by COVERAGE; a padded one passed the count and proved nothing extra.
|
|
183
184
|
|
|
184
185
|
Reject these checklist items as too coarse:
|
|
185
186
|
- "theme management works"
|
|
@@ -194,18 +195,15 @@ description: rdc:plan (topic) — produce architecture, decisions and an epic wi
|
|
|
194
195
|
- `decomp-api-import-validation: POST /api/tools/theme-import rejects missing source URL with 400 JSON error; evidence: route probe`
|
|
195
196
|
|
|
196
197
|
Add a `## Checklist Quality Gate` section with:
|
|
197
|
-
- `verdict: PASS` only when EVERY row passes the rubric AND every WP
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
- `
|
|
201
|
-
|
|
202
|
-
- `
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
Do not create build-ready work items unless this gate is `PASS`. A `PASS` with any feature WP
|
|
208
|
-
under 10 attested rows, or any declared surface left uncovered, is invalid.
|
|
198
|
+
- `verdict: PASS` only when EVERY row passes the rubric AND every WP covers each surface it
|
|
199
|
+
declares AND every deliverable has a row that can fail AND every row carries a verification
|
|
200
|
+
artifact.
|
|
201
|
+
- `coverage:` per WP, list the surfaces it declares and the row(s) that cover each one.
|
|
202
|
+
- `failures:` list any coarse, uncovered-surface, missing, duplicate, or unattested rows.
|
|
203
|
+
- `deferred:` list any explicit out-of-scope rows, each with its reason.
|
|
204
|
+
|
|
205
|
+
Do not create build-ready work items unless this gate is `PASS`. A `PASS` with any declared
|
|
206
|
+
surface left uncovered, or any deliverable with no row that can fail, is invalid.
|
|
209
207
|
|
|
210
208
|
5. **Write a test plan for each work package (MANDATORY):**
|
|
211
209
|
|
package/skills/release/SKILL.md
CHANGED
|
@@ -94,11 +94,13 @@ monorepo subtree, not a standalone repo like this one),
|
|
|
94
94
|
"Tests/self-test passed" through "Local install/update executed" rows safely:
|
|
95
95
|
real `npm pack`, isolated-prefix install (never the real global store), real
|
|
96
96
|
verify, and `--live` explicitly gating the actual publish. Where applicable,
|
|
97
|
-
`npx --package=@lifeai/rdc-harness rdc-harness deploy <slug> [--live]`
|
|
98
|
-
published
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
97
|
+
`npx -y --package=@lifeai/rdc-harness rdc-harness deploy <slug> [--live]`
|
|
98
|
+
(published on GitHub Packages — needs
|
|
99
|
+
`@lifeai:registry=https://npm.pkg.github.com` in `.npmrc`; an `npm` 404 means
|
|
100
|
+
that mapping is missing. Full setup:
|
|
101
|
+
`{PROJECT_ROOT}/.rdc/guides/agent-bootstrap.md`) can supply that evidence
|
|
102
|
+
directly instead of hand-rolling the same pack/install/verify cycle. It does
|
|
103
|
+
**not** replace version bump, tag or push — the harness CLI does none of those.
|
|
102
104
|
|
|
103
105
|
## Resolution Order
|
|
104
106
|
|