@lifeaitools/rdc-skills 0.35.21 → 0.35.23

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,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."
@@ -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.**
@@ -36,6 +36,73 @@ RDC-owned design execution for Studio and LIFEAI interfaces. This skill is the S
36
36
  - `rdc:design critique <target>` — UX/design critique
37
37
  - `rdc:design polish <target>` — final visual and interaction pass
38
38
  - `rdc:design craft <feature>` — shape and build a token-aware UI feature
39
+ - `rdc:design prototype <description>` — build a new UI surface for visual review
40
+ - `rdc:design compare <brief>` — dispatch the same design brief to a Claude-side pass AND a Codex-side pass in parallel, then synthesize a structured comparison (any mode also accepts a trailing `--compare` flag to run the same dual-dispatch before finalizing that mode's output)
41
+
42
+ ## New-Surface Gate — PRODUCT.md / DESIGN.md Before Source Mutation
43
+
44
+ > Promoted from `rdc:onramp` (Phase 1 disk-tree scaffold + Phase 4 brand-book rubric gate),
45
+ > which is the existing model for this pattern — read `skills/onramp/SKILL.md` §Phase 1.5,
46
+ > §Phase 4.6 if this section is ever unclear. Onramp scoped this to `places/<slug>/`; this
47
+ > section is the same mechanism generalized to any new or reshaped product surface. Approved:
48
+ > Dave, direct instruction, 2026-09-05/06 session — "the existing onramp version is the model;
49
+ > it was simply scoped too narrowly."
50
+
51
+ **Applies to:** `craft`, `prototype`, and any other mode about to build a **new or reshaped
52
+ product surface** — a new app/site/package root, a new top-level route, or a rename/merge/
53
+ split of an existing screen map. **Does not apply to** `edit`, `audit`, `critique`, `polish`,
54
+ `tokens`, `palette`, `theme`, or `colorize` against an already-documented surface — those
55
+ operate against an existing PRODUCT.md/DESIGN.md, they don't have to create one first.
56
+
57
+ **Small-fix exemption — same boundary as `rdc:fixit`:** a change touching **fewer than 5
58
+ files** that does **not** introduce a new route, a new top-level screen, or a new app/site
59
+ root is exempt. Anything at or above that, or anything that adds a route/screen/app root
60
+ regardless of file count, is in scope for this gate.
61
+
62
+ ### The gate
63
+
64
+ Before writing or editing any source file for an in-scope task:
65
+
66
+ 1. **Locate the surface root** — the app/site/package directory, or the repo root for a
67
+ standalone project (e.g. `C:/Dev/rdc-cde/PRODUCT.md`, not a subdirectory).
68
+ 2. **Check for `PRODUCT.md` and `DESIGN.md` at that root.**
69
+ 3. **If either is absent, or present but stale against the requested surface** (its screen
70
+ map / information hierarchy does not cover the screen, route, or object the task is about
71
+ to add or change) — **refuse to proceed to source mutation.** Create or update the missing
72
+ or stale document(s) first, using the field lists below. This mirrors onramp's Phase 4
73
+ rubric row *"DESIGN.md — 24-spread outline, not a stub"* and the Phase 1 gate *"disk:
74
+ places/<slug>/ exists with all required files"* — a present-but-stub or present-but-stale
75
+ document fails the gate exactly like an absent one.
76
+ 4. Only after both documents exist and are current does the mode proceed to `craft`/
77
+ `prototype` source work.
78
+
79
+ ### PRODUCT.md — required fields
80
+
81
+ | Field | Content |
82
+ |---|---|
83
+ | Operator | Who runs/uses this surface day to day |
84
+ | Job-to-be-done | The concrete task the surface exists to complete |
85
+ | Durable objects + authority | The entities the UI reads/writes and who/what owns each one |
86
+ | Screen map | Every screen/route/panel, one row each, with its purpose |
87
+ | Acceptance outcomes | What "this surface works" means, observably |
88
+
89
+ ### DESIGN.md — required fields
90
+
91
+ | Field | Content |
92
+ |---|---|
93
+ | Dominant visual object | The one element the eye lands on first, per screen |
94
+ | Information hierarchy | What outranks what, and why |
95
+ | Interaction model | How the user acts on the dominant object and its neighbors |
96
+ | Responsive transformation | What changes, collapses, or reflows at narrower widths |
97
+ | Semantic color | Token names mapped to meaning (never raw hex) |
98
+ | References | Existing surfaces/patterns this design borrows from, cited by path |
99
+ | Anti-patterns | What this surface deliberately does NOT do |
100
+ | Visual acceptance criteria | What a reviewer checks to call the visual design done |
101
+
102
+ **Refusal wording** (use verbatim, adapted to the target): *"BLOCKED: `<surface>` has no
103
+ PRODUCT.md/DESIGN.md at its root (or they are stale against this request). Per the
104
+ new-surface gate, I'm writing/updating those first before touching source."* Then write them,
105
+ then proceed.
39
106
 
40
107
  ## Required References
41
108
 
@@ -168,6 +235,52 @@ Project docs to read for Studio work:
168
235
  - For Studio: prefer route smoke checks, token API checks, and browser screenshots when UI changed.
169
236
  - For CLI prompt work: run `node {RDC_SKILLS_ROOT}/scripts/rdc-design-cli.mjs <command> <brief>` and inspect the generated report under `.rdc/reports/rdc-design-cli/`.
170
237
 
238
+ ## Design Compare — Claude vs Codex, Dispatched in Parallel
239
+
240
+ Two AI engines are already wired for dual-dispatch across this fleet — Claude Code and
241
+ Codex (OpenAI/ChatGPT models) — via `codex exec`. This is not a new integration; it is the
242
+ same mechanism `scripts/lib/runner.mjs` already uses to spawn both `claude --print
243
+ --output-format stream-json` and `codex exec --json` against a prompt, and the same one
244
+ CDE's `apps/implementor-manager/src/codex-cli-implementor.ts` uses for a fresh read-only
245
+ planning turn (`codex exec --sandbox read-only --json --output-schema <schema> <prompt>`).
246
+
247
+ `rdc:design compare <brief>` (or any mode + `--compare`) runs that mechanism against a
248
+ design brief instead of a code-change prompt:
249
+
250
+ ```powershell
251
+ node {RDC_SKILLS_ROOT}/scripts/rdc-design-compare-cli.mjs "<design brief>" [--out <dir>]
252
+ ```
253
+
254
+ This is a **real dispatch**, not a description of one: the script spawns a fresh
255
+ `claude --print` process and a fresh `codex exec --sandbox read-only --json` process **in
256
+ parallel**, both against the identical brief plus the design skill's own operating
257
+ instructions (same construction as `rdc-design-cli.mjs`'s prompt assembly), and both told
258
+ explicitly not to mutate files — this is a proposal pass, not an edit pass. It waits for
259
+ both, extracts each engine's final message, and writes:
260
+
261
+ ```text
262
+ {RDC_SKILLS_ROOT}/.rdc/reports/rdc-design-cli/compare-<timestamp>/
263
+ claude.md — Claude's raw design proposal
264
+ codex.md — Codex's raw design proposal
265
+ report.json — both outputs + timing + exit codes
266
+ ```
267
+
268
+ **After the script returns, the calling agent (not the script) writes the comparison** —
269
+ read both `claude.md` and `codex.md` and produce a structured table, never concatenation:
270
+
271
+ | Dimension | Claude proposal | Codex proposal | Verdict |
272
+ |---|---|---|---|
273
+ | Dominant visual object | ... | ... | which fits the brief |
274
+ | Information hierarchy | ... | ... | which fits the brief |
275
+ | Interaction model | ... | ... | which fits the brief |
276
+ | Token/brand-system fit | ... | ... | which reuses existing tokens vs invents new ones |
277
+ | Tradeoffs | ... | ... | cost of each approach |
278
+
279
+ Recommend one, or a hybrid, with the reason stated — never "both are good options."
280
+
281
+ If `codex` is unreachable (binary missing, non-zero exit), report that plainly and fall
282
+ back to a single-engine pass; do not fabricate a second opinion.
283
+
171
284
  ## Command Menu
172
285
 
173
286
  | Command | Purpose |
@@ -181,7 +294,9 @@ Project docs to read for Studio work:
181
294
  | `audit` | Technical and visual audit |
182
295
  | `critique` | UX/design review |
183
296
  | `polish` | Final detail pass |
184
- | `craft` | Shape and build a token-aware interface |
297
+ | `craft` | Shape and build a token-aware interface — gated by New-Surface Gate above |
298
+ | `prototype` | Build a new UI surface for visual review — gated by New-Surface Gate above |
299
+ | `compare` | Dispatch the same design brief to Claude AND Codex in parallel, synthesize a comparison |
185
300
 
186
301
  ## CLI Helper
187
302
 
@@ -191,6 +306,7 @@ Use the local helper to see exactly how much instruction text the skill is gener
191
306
  node {RDC_SKILLS_ROOT}/scripts/rdc-design-cli.mjs studio "audit the Studio palette page"
192
307
  node {RDC_SKILLS_ROOT}/scripts/rdc-design-cli.mjs palette "generate a PRT palette workflow"
193
308
  node {RDC_SKILLS_ROOT}/scripts/rdc-design-cli.mjs --json theme "RDC earth-forward light theme"
309
+ node {RDC_SKILLS_ROOT}/scripts/rdc-design-compare-cli.mjs "dashboard hero panel for a stewardship dashboard"
194
310
  ```
195
311
 
196
312
  The helper writes logs to:
@@ -199,7 +315,7 @@ The helper writes logs to:
199
315
  {RDC_SKILLS_ROOT}/.rdc/reports/rdc-design-cli/
200
316
  ```
201
317
 
202
- Each run includes character count, word count, approximate token count, references loaded, and the final prompt text.
318
+ Each run includes character count, word count, approximate token count, references loaded, and the final prompt text. `rdc-design-compare-cli.mjs` writes its dual-engine outputs under `.rdc/reports/rdc-design-cli/compare-<timestamp>/` (see Design Compare above).
203
319
 
204
320
  ## Boundaries
205
321
 
@@ -209,3 +325,7 @@ Each run includes character count, word count, approximate token count, referenc
209
325
  - Do not persist Rampa output directly to production without Studio token mapping.
210
326
  - Do not fork or ship Palette Designer until its license is verified.
211
327
  - Do not use Studio's deprecated `/api/editor/render` route.
328
+ - Do not skip the New-Surface Gate for `craft`/`prototype` work on a new or reshaped
329
+ surface, even when the requester did not mention PRODUCT.md/DESIGN.md.
330
+ - Do not let `compare` mode's Codex-side pass mutate files — it runs `--sandbox read-only`
331
+ by design; if a prompt change would lift that, treat it as an architectural change.
@@ -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
@@ -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
@@ -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
 
@@ -1,101 +1,101 @@
1
- {
2
- "manifest_version": 1,
3
- "skill": "rdc:onramp",
4
- "description": "Tier-2 self-test for rdc:onramp enrollment skill",
5
- "tier": 2,
6
- "sandbox": true,
7
- "env": {
8
- "RDC_TEST": "1"
9
- },
10
- "invocation": {
11
- "slug": "onramp-selftest",
12
- "name": "Onramp Self Test",
13
- "flags": ["--archetype", "working-landscapes", "--dry-run"]
14
- },
15
- "fixture": {
16
- "prompt": "rdc:onramp onramp-selftest --name \"Onramp Self Test\" --archetype working-landscapes --dry-run",
17
- "env": { "RDC_\u0054EST": "1" },
18
- "slow": true
19
- },
20
- "assertions": {
21
- "exit_code": 0,
22
- "stdout_contains": ["Preflight", "Resolve drift"]
23
- },
24
- "acceptance": {
25
- "output_contains": ["Preflight", "Resolve drift", "disk-ahead", "already-enrolled"],
26
- "output_not_contains": ["hand-edit _context.md", "raw insert"]
27
- },
28
- "legacy_assertions": [
29
- {
30
- "type": "exit_code",
31
- "expect": 0,
32
- "description": "Skill exits cleanly under RDC_TEST with --dry-run"
33
- },
34
- {
35
- "type": "stdout_contains",
36
- "pattern": "Preflight",
37
- "description": "Checklist begins with Preflight step"
38
- },
39
- {
40
- "type": "stdout_contains",
41
- "pattern": "Resolve drift",
42
- "description": "Drift resolution step is emitted"
43
- },
44
- {
45
- "type": "stdout_contains",
46
- "pattern": "\\[RDC_TEST\\]",
47
- "description": "Sandbox short-circuit marker present — confirms external calls were skipped"
48
- },
49
- {
50
- "type": "file_absent",
51
- "path": "places/onramp-selftest/_context.md",
52
- "description": "Scaffolder MUST NOT write _context.md — projection-drift violation gate"
53
- }
54
- ],
55
- "door_contracts": [
56
- {
57
- "name": "enroll_place_signature",
58
- "description": "enroll_place RPC must accept (text, text, jsonb, text) and return jsonb",
59
- "type": "rpc_introspection",
60
- "project_id": "uvojezuorjgqzmhhgluu",
61
- "query": "SELECT p.proname, pg_get_function_identity_arguments(p.oid) AS args, pg_get_function_result(p.oid) AS returns FROM pg_proc p WHERE p.proname = 'enroll_place';",
62
- "expect_args_contains": ["text", "jsonb"],
63
- "expect_returns": "jsonb"
64
- },
65
- {
66
- "name": "insert_work_item_accepts_project_node_id",
67
- "description": "insert_work_item must accept p_project_node_id parameter",
68
- "type": "rpc_introspection",
69
- "project_id": "uvojezuorjgqzmhhgluu",
70
- "query": "SELECT proname, pg_get_function_identity_arguments(oid) FROM pg_proc WHERE proname = 'insert_work_item';",
71
- "expect_args_contains": ["p_project_node_id"]
72
- }
73
- ],
74
- "disk_ahead_test": {
75
- "description": "disk-ahead state must STOP and open a reconciliation work item",
76
- "setup": "mkdir -p places/disk-ahead-test",
77
- "invocation_slug": "disk-ahead-test",
78
- "invocation_name": "Disk Ahead Test",
79
- "assertions": [
80
- {
81
- "type": "stdout_contains",
82
- "pattern": "disk-ahead",
83
- "description": "Skill identifies the disk-ahead state"
84
- },
85
- {
86
- "type": "stdout_contains",
87
- "pattern": "STOP",
88
- "description": "Skill STOPs on disk-ahead"
89
- },
90
- {
91
- "type": "exit_nonzero",
92
- "description": "Skill exits non-zero on disk-ahead (not a clean enrollment)"
93
- }
94
- ],
95
- "teardown": "rmdir places/disk-ahead-test 2>/dev/null || true"
96
- },
97
- "idempotency_test": {
98
- "description": "Running rdc:onramp twice for already-enrolled should produce zero new writes",
99
- "note": "Under RDC_TEST=1 this is verified by checking that [RDC_TEST] skipping markers appear (not real insert calls) and the checklist reports already-enrolled"
100
- }
101
- }
1
+ {
2
+ "manifest_version": 1,
3
+ "skill": "rdc:onramp",
4
+ "description": "Tier-2 self-test for rdc:onramp enrollment skill",
5
+ "tier": 2,
6
+ "sandbox": true,
7
+ "env": {
8
+ "RDC_TEST": "1"
9
+ },
10
+ "invocation": {
11
+ "slug": "onramp-selftest",
12
+ "name": "Onramp Self Test",
13
+ "flags": ["--archetype", "working-landscapes", "--dry-run"]
14
+ },
15
+ "fixture": {
16
+ "prompt": "rdc:onramp onramp-selftest --name \"Onramp Self Test\" --archetype working-landscapes --dry-run",
17
+ "env": { "RDC_\u0054EST": "1" },
18
+ "slow": true
19
+ },
20
+ "assertions": {
21
+ "exit_code": 0,
22
+ "stdout_contains": ["Preflight", "Resolve drift"]
23
+ },
24
+ "acceptance": {
25
+ "output_contains": ["Preflight", "Resolve drift", "disk-ahead", "already-enrolled"],
26
+ "output_not_contains": ["hand-edit _context.md", "raw insert"]
27
+ },
28
+ "legacy_assertions": [
29
+ {
30
+ "type": "exit_code",
31
+ "expect": 0,
32
+ "description": "Skill exits cleanly under RDC_TEST with --dry-run"
33
+ },
34
+ {
35
+ "type": "stdout_contains",
36
+ "pattern": "Preflight",
37
+ "description": "Checklist begins with Preflight step"
38
+ },
39
+ {
40
+ "type": "stdout_contains",
41
+ "pattern": "Resolve drift",
42
+ "description": "Drift resolution step is emitted"
43
+ },
44
+ {
45
+ "type": "stdout_contains",
46
+ "pattern": "\\[RDC_TEST\\]",
47
+ "description": "Sandbox short-circuit marker present — confirms external calls were skipped"
48
+ },
49
+ {
50
+ "type": "file_absent",
51
+ "path": "places/onramp-selftest/_context.md",
52
+ "description": "Scaffolder MUST NOT write _context.md — projection-drift violation gate"
53
+ }
54
+ ],
55
+ "door_contracts": [
56
+ {
57
+ "name": "enroll_place_signature",
58
+ "description": "enroll_place RPC must accept (text, text, jsonb, text) and return jsonb",
59
+ "type": "rpc_introspection",
60
+ "project_id": "uvojezuorjgqzmhhgluu",
61
+ "query": "SELECT p.proname, pg_get_function_identity_arguments(p.oid) AS args, pg_get_function_result(p.oid) AS returns FROM pg_proc p WHERE p.proname = 'enroll_place';",
62
+ "expect_args_contains": ["text", "jsonb"],
63
+ "expect_returns": "jsonb"
64
+ },
65
+ {
66
+ "name": "insert_work_item_accepts_project_node_id",
67
+ "description": "insert_work_item must accept p_project_node_id parameter",
68
+ "type": "rpc_introspection",
69
+ "project_id": "uvojezuorjgqzmhhgluu",
70
+ "query": "SELECT proname, pg_get_function_identity_arguments(oid) FROM pg_proc WHERE proname = 'insert_work_item';",
71
+ "expect_args_contains": ["p_project_node_id"]
72
+ }
73
+ ],
74
+ "disk_ahead_test": {
75
+ "description": "disk-ahead state must STOP and open a reconciliation work item",
76
+ "setup": "mkdir -p places/disk-ahead-test",
77
+ "invocation_slug": "disk-ahead-test",
78
+ "invocation_name": "Disk Ahead Test",
79
+ "assertions": [
80
+ {
81
+ "type": "stdout_contains",
82
+ "pattern": "disk-ahead",
83
+ "description": "Skill identifies the disk-ahead state"
84
+ },
85
+ {
86
+ "type": "stdout_contains",
87
+ "pattern": "STOP",
88
+ "description": "Skill STOPs on disk-ahead"
89
+ },
90
+ {
91
+ "type": "exit_nonzero",
92
+ "description": "Skill exits non-zero on disk-ahead (not a clean enrollment)"
93
+ }
94
+ ],
95
+ "teardown": "rmdir places/disk-ahead-test 2>/dev/null || true"
96
+ },
97
+ "idempotency_test": {
98
+ "description": "Running rdc:onramp twice for already-enrolled should produce zero new writes",
99
+ "note": "Under RDC_TEST=1 this is verified by checking that [RDC_TEST] skipping markers appear (not real insert calls) and the checklist reports already-enrolled"
100
+ }
101
+ }
@@ -1,12 +1,12 @@
1
- {
2
- "manifest_version": 1,
3
- "skill": "rdc:env",
4
- "description": "Environment status is read-only and reports installed version.",
5
- "fixture": { "prompt": "rdc:env status", "env": { "RDC_\u0054EST": "1" }, "slow": false },
6
- "assertions": { "exit_code": 0, "stdout_contains": ["Environment"] },
7
- "acceptance": {
8
- "output_contains": ["version", "status"],
9
- "output_not_contains": ["force", "delete environment"]
10
- },
11
- "teardown": { "reset_branch": true }
12
- }
1
+ {
2
+ "manifest_version": 1,
3
+ "skill": "rdc:env",
4
+ "description": "Environment status is read-only and reports installed version.",
5
+ "fixture": { "prompt": "rdc:env status", "env": { "RDC_\u0054EST": "1" }, "slow": false },
6
+ "assertions": { "exit_code": 0, "stdout_contains": ["Environment"] },
7
+ "acceptance": {
8
+ "output_contains": ["version", "status"],
9
+ "output_not_contains": ["force", "delete environment"]
10
+ },
11
+ "teardown": { "reset_branch": true }
12
+ }
@@ -1,12 +1,12 @@
1
- {
2
- "manifest_version": 1,
3
- "skill": "rdc:new-model",
4
- "description": "New-model registration begins with the canonical gate.",
5
- "fixture": { "prompt": "rdc:new-model example-model", "env": { "RDC_\u0054EST": "1" }, "slow": true },
6
- "assertions": { "exit_code": 0, "stdout_contains": ["New Model"] },
7
- "acceptance": {
8
- "output_contains": ["canonical", "registration"],
9
- "output_not_contains": ["raw insert", "skip gate"]
10
- },
11
- "teardown": { "reset_branch": true }
12
- }
1
+ {
2
+ "manifest_version": 1,
3
+ "skill": "rdc:new-model",
4
+ "description": "New-model registration begins with the canonical gate.",
5
+ "fixture": { "prompt": "rdc:new-model example-model", "env": { "RDC_\u0054EST": "1" }, "slow": true },
6
+ "assertions": { "exit_code": 0, "stdout_contains": ["New Model"] },
7
+ "acceptance": {
8
+ "output_contains": ["canonical", "registration"],
9
+ "output_not_contains": ["raw insert", "skip gate"]
10
+ },
11
+ "teardown": { "reset_branch": true }
12
+ }
@@ -1,29 +1,29 @@
1
- {
2
- "manifest_version": 1,
3
- "skill": "rdc:refactor",
4
- "description": "Refactor preserves evidence and isolates all dispatched writers.",
5
- "fixture": {
6
- "prompt": "rdc:refactor hook-scope --takeover \"corrective consolidation\"",
7
- "env": { "RDC_\u0054EST": "1" },
8
- "slow": true
9
- },
10
- "assertions": {
11
- "exit_code": 0,
12
- "commits_made": { "min": 0 },
13
- "stdout_contains": ["RDC Refactor"]
14
- },
15
- "acceptance": {
16
- "output_contains": [
17
- "consolidate_work_items_into_epic",
18
- "unique leased worktree",
19
- "collaboration manifest",
20
- "validator"
21
- ],
22
- "output_not_contains": [
23
- "raw update",
24
- "shared working directory",
25
- "archive all"
26
- ]
27
- },
28
- "teardown": { "reset_branch": true }
29
- }
1
+ {
2
+ "manifest_version": 1,
3
+ "skill": "rdc:refactor",
4
+ "description": "Refactor preserves evidence and isolates all dispatched writers.",
5
+ "fixture": {
6
+ "prompt": "rdc:refactor hook-scope --takeover \"corrective consolidation\"",
7
+ "env": { "RDC_\u0054EST": "1" },
8
+ "slow": true
9
+ },
10
+ "assertions": {
11
+ "exit_code": 0,
12
+ "commits_made": { "min": 0 },
13
+ "stdout_contains": ["RDC Refactor"]
14
+ },
15
+ "acceptance": {
16
+ "output_contains": [
17
+ "consolidate_work_items_into_epic",
18
+ "unique leased worktree",
19
+ "collaboration manifest",
20
+ "validator"
21
+ ],
22
+ "output_not_contains": [
23
+ "raw update",
24
+ "shared working directory",
25
+ "archive all"
26
+ ]
27
+ },
28
+ "teardown": { "reset_branch": true }
29
+ }
@@ -1,29 +1,29 @@
1
- {
2
- "manifest_version": 1,
3
- "skill": "rdc:regen-media",
4
- "description": "Regen Media uses local keyless Codex gpt-image-2 as the primary image-generation path and avoids live generation under RDC_TEST.",
5
- "fixture": {
6
- "prompt": "rdc:regen-media generate a 2048x1152 homepage hero image",
7
- "env": { "RDC_TEST": "1" }
8
- },
9
- "assertions": {
10
- "exit_code": 0,
11
- "commits_made": { "min": 0 },
12
- "stdout_contains": ["image_gen", "gpt-image-2"]
13
- },
14
- "acceptance": {
15
- "output_contains": [
16
- "image_gen",
17
- "gpt-image-2",
18
- "--enable image_generation",
19
- "RDC_TEST"
20
- ],
21
- "output_not_contains": [
22
- "OPENAI_API_KEY=",
23
- "generate_gpt_image is the default",
24
- "upload completed",
25
- "raw MCP"
26
- ]
27
- },
28
- "teardown": { "reset_branch": true }
29
- }
1
+ {
2
+ "manifest_version": 1,
3
+ "skill": "rdc:regen-media",
4
+ "description": "Regen Media uses local keyless Codex gpt-image-2 as the primary image-generation path and avoids live generation under RDC_TEST.",
5
+ "fixture": {
6
+ "prompt": "rdc:regen-media generate a 2048x1152 homepage hero image",
7
+ "env": { "RDC_TEST": "1" }
8
+ },
9
+ "assertions": {
10
+ "exit_code": 0,
11
+ "commits_made": { "min": 0 },
12
+ "stdout_contains": ["image_gen", "gpt-image-2"]
13
+ },
14
+ "acceptance": {
15
+ "output_contains": [
16
+ "image_gen",
17
+ "gpt-image-2",
18
+ "--enable image_generation",
19
+ "RDC_TEST"
20
+ ],
21
+ "output_not_contains": [
22
+ "OPENAI_API_KEY=",
23
+ "generate_gpt_image is the default",
24
+ "upload completed",
25
+ "raw MCP"
26
+ ]
27
+ },
28
+ "teardown": { "reset_branch": true }
29
+ }