@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.
Files changed (37) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/.github/workflows/self-test.yml +34 -34
  3. package/MANIFEST.md +224 -224
  4. package/guides/agent-bootstrap.md +6 -2
  5. package/guides/agents/backend.md +102 -102
  6. package/guides/agents/content.md +94 -94
  7. package/guides/agents/cs2.md +56 -56
  8. package/guides/agents/data.md +86 -86
  9. package/guides/agents/design.md +77 -77
  10. package/guides/agents/frontend.md +91 -91
  11. package/guides/agents/infrastructure.md +81 -81
  12. package/guides/agents/setup.md +272 -272
  13. package/guides/agents/verify.md +119 -119
  14. package/guides/agents/viz.md +106 -106
  15. package/guides/orchestration-epic.md +17 -17
  16. package/guides/output-contract.md +8 -0
  17. package/guides/work-contract.md +183 -0
  18. package/package.json +1 -1
  19. package/scripts/lib/guide-content-rules.mjs +49 -0
  20. package/scripts/self-test.mjs +1439 -1459
  21. package/scripts/test-guide-validator.mjs +25 -24
  22. package/skills/behavior-audit/agents/openai.yaml +4 -4
  23. package/skills/build/SKILL.md +81 -29
  24. package/skills/deploy/SKILL.md +7 -0
  25. package/skills/edit/SKILL.md +4 -2
  26. package/skills/fixit/SKILL.md +16 -0
  27. package/skills/open/SKILL.md +45 -12
  28. package/skills/overnight/SKILL.md +3 -1
  29. package/skills/plan/SKILL.md +21 -23
  30. package/skills/release/SKILL.md +7 -5
  31. package/skills/tests/onramp.test.json +101 -101
  32. package/skills/tests/rdc-env.test.json +12 -12
  33. package/skills/tests/rdc-new-model.test.json +12 -12
  34. package/skills/tests/rdc-refactor.test.json +29 -29
  35. package/skills/tests/rdc-regen-media.test.json +29 -29
  36. package/.rdc/evidence/orchestrator-rework-strikes/a9fad8b4716ee35e5f5d0047.json +0 -1
  37. 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
- const GUIDE_BANNED_TERMS = [
36
- "@masonator/coolify-mcp",
37
- "@masonator",
38
- "coolify-mcp",
39
- "@regen/brand-studio",
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."
@@ -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 two files before starting — in this order:
30
- 1. `{PROJECT_ROOT}/.rdc/guides/agent-bootstrap.md` — credentials, git rules, completion report format
31
- (fallback: `.rdc/guides/agent-bootstrap.md` relative to cwd if `{PROJECT_ROOT}` is not substituted)
32
- 2. `{PROJECT_ROOT}/.rdc/guides/engineering-behavior.md` — assumptions, minimal changes, surgical scope, verification evidence
33
- (fallback: `.rdc/guides/engineering-behavior.md` relative to cwd if `{PROJECT_ROOT}` is not substituted)
34
- 3. `{PROJECT_ROOT}/.rdc/guides/<type>.md` role-specific guide
35
- (fallback: `.rdc/guides/<type>.md` relative to cwd if `{PROJECT_ROOT}` is not substituted)
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 both lines in every agent prompt:
44
+ Include the resolved paths in every agent prompt:
38
45
  ```
39
- "Read {PROJECT_ROOT}/.rdc/guides/agent-bootstrap.md first (fallback: .rdc/guides/agent-bootstrap.md), then {PROJECT_ROOT}/.rdc/guides/engineering-behavior.md (fallback: .rdc/guides/engineering-behavior.md), then {PROJECT_ROOT}/.rdc/guides/<type>.md (fallback: .rdc/guides/<type>.md) before starting."
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 before each wave and after every gate-changing action.**
84
- - Invoke `runOrchestrator()` with the project 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.
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 project lacks a real dispatcher/manifest, report `BLOCKED: CodeFlow supervisor entrypoint unavailable` rather than emulating completion.
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, has < 10 attested rows, or leaves a declared surface (screen/api/db/tool) uncovered | → Invoke `rdc:plan` on this epic. Coarse/under-decomposed checklists cannot be safely dispatched. |
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 has >= 10 attested `decomp-*`/`test-*` rows and meets the
240
- per-surface completeness floors from rdc:plan (each declared surface covered; a multi-surface
241
- WP carries the SUM of its surface floors, typically 12-20). A flat 5-6-row checklist for a
242
- feature WP is REJECTED reopen the epic to rdc:plan for full surface-area decomposition.
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 FLOOR (mirrors rdc:plan): every implementation task carries >= 10 attested rows; a
263
- multi-surface WP carries the SUM of its per-surface floors (typically 12-20). A flat 5-6-row
264
- feature checklist, or any declared surface (screen/api/db/tool) left uncovered, is a REJECT —
265
- reopen to rdc:plan. Every row must name its surface + one verification artifact (attested).
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 origin/develop (kills stale-base by construction)
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 + `origin/develop` base, e.g.
388
- `git fetch origin develop && git worktree add <dir> -b <branch> origin/develop`
389
- — or use the canonical launcher `node scripts/wt.mjs add <name>`, which does
390
- exactly that. A worktree cut from `origin/develop` HEAD **cannot** be stale.
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/develop` is the primary defense.
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 has >= 10 attested `decomp-*`/`test-*` items, meets the per-surface completeness floors (each declared surface covered), and no feature WP ships a 5-6-row checklist
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
@@ -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.**
@@ -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>` (the published
21
- package; see `guides/agent-bootstrap.md` for registry setup) against a website
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
@@ -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`:
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: open
3
- description: rdc:open ([slug]) — orient before working; answers where you are and what the target is from the registry, then names the harness shape
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 (see `guides/agent-bootstrap.md` for the registry
16
- precondition). Invoke it through the installed `bin`, never a
17
- machine-specific checkout path:
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>`.** Steps 1–2 are what it returns, not a
147
- procedure to perform. Only hand-resolve if the harness is genuinely
148
- unavailable, and say so explicitly when you do.
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** and start. Do not re-derive it later in the
174
- turn.
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
- - `rdc:flow` — declares what KIND of work this is. `rdc:open` says where you are;
190
- `rdc:flow` says what you are doing. Both, in that order.
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`. `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.
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
 
@@ -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 FLOORS — reject the checklist (do NOT create work items) if any is violated:
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
- - ATTESTATION: every row names its surface + ONE concrete verification artifact (test name,
179
- route probe, Playwright screenshot, SQL query, migration proof, CLI transcript). A row with
180
- no attestation artifact is a REJECT.
181
- - If a WP genuinely has < 10 observable behaviors, SPLIT it or justify the low count explicitly
182
- in the Quality Gate `deferred:` note never silently ship a thin checklist.
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 meets the per-surface
198
- completeness floors above (each declared surface covered; >= 10 attested rows; multi-surface =
199
- sum of surface floors) AND every row carries a verification artifact.
200
- - `per_wp_row_counts:` list each WP and its attested row count so a reviewer sees at a glance
201
- that no feature WP is under-decomposed (no 5-6-row feature WP).
202
- - `coverage:` per WP, list the surfaces it declares and confirm each is covered by >= its floor.
203
- - `failures:` list any coarse, under-decomposed, uncovered-surface, missing, duplicate, or
204
- unattested rows.
205
- - `deferred:` list any explicit out-of-scope rows (with the reason a low count is justified).
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
 
@@ -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]` (the
98
- published package; see `guides/agent-bootstrap.md` for registry setup) can
99
- supply that evidence directly instead of hand-rolling the same
100
- pack/install/verify cycle. It does **not** replace version bump, tag or push
101
- the harness CLI does none of those.
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