@lifeaitools/rdc-skills 0.24.42 → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (198) hide show
  1. package/.claude/settings.json +15 -15
  2. package/.claude-plugin/marketplace.json +21 -21
  3. package/.claude-plugin/plugin.json +1518 -1371
  4. package/.github/workflows/publish.yml +34 -34
  5. package/.github/workflows/self-test.yml +58 -58
  6. package/CHANGELOG.md +310 -310
  7. package/LICENSE +21 -21
  8. package/MANIFEST.md +221 -221
  9. package/README.md +375 -376
  10. package/README.sandbox.md +3 -3
  11. package/assets/watcher/viewer.html +164 -164
  12. package/bin/rdc-skills-mcp.mjs +316 -316
  13. package/commands/build.md +183 -183
  14. package/commands/collab.md +180 -180
  15. package/commands/deploy.md +152 -152
  16. package/commands/design.md +31 -31
  17. package/commands/edit.md +28 -28
  18. package/commands/fixit.md +150 -124
  19. package/commands/handoff.md +173 -173
  20. package/commands/help.md +95 -95
  21. package/commands/overnight.md +220 -220
  22. package/commands/plan.md +158 -158
  23. package/commands/preplan.md +131 -131
  24. package/commands/prototype.md +145 -145
  25. package/commands/release.md +49 -49
  26. package/commands/report.md +99 -99
  27. package/commands/review.md +120 -120
  28. package/commands/self-test.md +113 -113
  29. package/commands/status.md +86 -86
  30. package/commands/watch.md +98 -98
  31. package/commands/workitems.md +137 -137
  32. package/git-sha.json +1 -1
  33. package/guides/agent-bootstrap.md +295 -295
  34. package/guides/agents/backend.md +104 -104
  35. package/guides/agents/content.md +94 -94
  36. package/guides/agents/cs2.md +56 -56
  37. package/guides/agents/data.md +87 -87
  38. package/guides/agents/design.md +77 -77
  39. package/guides/agents/frontend.md +92 -92
  40. package/guides/agents/infrastructure.md +81 -81
  41. package/guides/agents/setup.md +281 -281
  42. package/guides/agents/verify.md +151 -151
  43. package/guides/agents/viz.md +106 -106
  44. package/guides/backend.md +146 -146
  45. package/guides/content.md +147 -147
  46. package/guides/cs2.md +190 -190
  47. package/guides/data.md +123 -123
  48. package/guides/design.md +116 -116
  49. package/guides/engineering-behavior.md +43 -43
  50. package/guides/escalation-protocol.md +125 -125
  51. package/guides/frontend.md +151 -151
  52. package/guides/history-md-spec.md +297 -297
  53. package/guides/infrastructure.md +179 -179
  54. package/guides/lessons-learned-spec.md +145 -151
  55. package/guides/output-contract.md +108 -108
  56. package/guides/publish-md-spec.md +289 -289
  57. package/guides/rdc-skills-startup.md +30 -30
  58. package/guides/verify.md +11 -11
  59. package/hooks/check-cwd.js +31 -31
  60. package/hooks/check-rdc-environment.js +164 -164
  61. package/hooks/check-services.js +6 -6
  62. package/hooks/check-stale-work-items.js +19 -19
  63. package/hooks/foreground-process-gate.js +128 -128
  64. package/hooks/gate-watchdog-selfcheck.js +257 -257
  65. package/hooks/hook-logger.js +25 -25
  66. package/hooks/lib/run-evidence-gate.mjs +241 -241
  67. package/hooks/no-stop-open-epics.js +127 -127
  68. package/hooks/post-tool-batch-gate.js +203 -203
  69. package/hooks/post-work-check.js +21 -21
  70. package/hooks/postcompact-log.js +13 -13
  71. package/hooks/precompact-log.js +13 -13
  72. package/hooks/rate-limit-retry.js +46 -46
  73. package/hooks/rdc-invocation-marker.js +157 -157
  74. package/hooks/rdc-output-contract-gate.js +94 -94
  75. package/hooks/require-work-item-on-commit.js +294 -294
  76. package/hooks/restart-brief.js +19 -19
  77. package/hooks/run-hidden-hook.ps1 +47 -47
  78. package/hooks/task-completed-gate.js +274 -274
  79. package/hooks/work-item-exit-gate.js +944 -944
  80. package/lib/catalog.mjs +236 -236
  81. package/lib/cloud-rewrite.mjs +155 -155
  82. package/package.json +57 -57
  83. package/rules/work-items-rpc.md +520 -520
  84. package/scaffold/templates/HISTORY.md.template +39 -39
  85. package/scaffold/templates/PUBLISH.md.template +21 -21
  86. package/scaffold/templates/brochure-studio-default.html +70 -70
  87. package/scripts/acceptance.mjs +502 -502
  88. package/scripts/fixtures/guides/bad-guide.md +15 -15
  89. package/scripts/fixtures/guides-clean/good-guide.md +16 -16
  90. package/scripts/install-rdc-skills.js +1289 -1289
  91. package/scripts/install.ps1 +202 -202
  92. package/scripts/install.sh +132 -132
  93. package/scripts/lib/assertions.mjs +287 -287
  94. package/scripts/lib/manifest-schema.mjs +754 -754
  95. package/scripts/lib/runner.mjs +465 -465
  96. package/scripts/lib/sandbox.mjs +435 -435
  97. package/scripts/prepack.mjs +32 -32
  98. package/scripts/rdc-brochure.mjs +482 -482
  99. package/scripts/rdc-design-cli.mjs +134 -134
  100. package/scripts/rebuild-mcp.mjs +107 -107
  101. package/scripts/self-test.mjs +1460 -1460
  102. package/scripts/stamp-git-sha.mjs +29 -29
  103. package/scripts/test-guide-validator.mjs +196 -196
  104. package/scripts/test-rdc-hooks.mjs +145 -145
  105. package/scripts/uninstall.ps1 +77 -77
  106. package/scripts/uninstall.sh +69 -69
  107. package/scripts/update.ps1 +43 -43
  108. package/scripts/update.sh +43 -43
  109. package/scripts/validate-place-histories.js +461 -461
  110. package/scripts/validate-publish-manifests.js +502 -424
  111. package/scripts/watch-init.mjs +100 -100
  112. package/skills/brochure/SKILL.md +107 -107
  113. package/skills/build/SKILL.md +563 -563
  114. package/skills/channel-formatter/SKILL.md +538 -533
  115. package/skills/co-develop/SKILL.md +196 -196
  116. package/skills/collab/SKILL.md +239 -239
  117. package/skills/convert/SKILL.md +167 -140
  118. package/skills/deploy/SKILL.md +541 -541
  119. package/skills/design/SKILL.md +211 -211
  120. package/skills/design/reference/ownership.md +16 -16
  121. package/skills/design/reference/rampa.md +92 -92
  122. package/skills/design/reference/studio-model.md +153 -153
  123. package/skills/edit/SKILL.md +98 -98
  124. package/skills/fixit/SKILL.md +203 -165
  125. package/skills/fs-mcp/SKILL.md +148 -148
  126. package/skills/handoff/SKILL.md +236 -236
  127. package/skills/help/SKILL.md +143 -143
  128. package/skills/housekeeping/SKILL.md +160 -219
  129. package/skills/lifeai-brochure-author/SKILL.md +340 -340
  130. package/skills/onramp/SKILL.md +248 -0
  131. package/skills/overnight/SKILL.md +251 -251
  132. package/skills/plan/SKILL.md +345 -345
  133. package/skills/preplan/SKILL.md +90 -90
  134. package/skills/prototype/SKILL.md +150 -150
  135. package/skills/rdc-brochurify/SKILL.md +245 -245
  136. package/skills/rdc-extract-verifier-rules/SKILL.md +191 -191
  137. package/skills/release/SKILL.md +140 -140
  138. package/skills/report/SKILL.md +100 -100
  139. package/skills/review/SKILL.md +152 -152
  140. package/skills/rpms-filemap/SKILL.cloud.md +111 -111
  141. package/skills/rpms-filemap/SKILL.md +111 -111
  142. package/skills/self-test/SKILL.md +132 -132
  143. package/skills/status/SKILL.md +99 -99
  144. package/skills/terminal-config/SKILL.md +62 -62
  145. package/skills/tests/MATRIX.md +54 -54
  146. package/skills/tests/README.md +47 -47
  147. package/skills/tests/onramp.test.json +87 -0
  148. package/skills/tests/rdc-brochure.test.json +34 -34
  149. package/skills/tests/rdc-build.test.json +36 -36
  150. package/skills/tests/rdc-channel-formatter.test.json +45 -45
  151. package/skills/tests/rdc-co-develop.test.json +29 -29
  152. package/skills/tests/rdc-collab.test.json +29 -29
  153. package/skills/tests/rdc-convert.test.json +35 -35
  154. package/skills/tests/rdc-deploy.test.json +30 -30
  155. package/skills/tests/rdc-design.test.json +27 -27
  156. package/skills/tests/rdc-edit.test.json +29 -29
  157. package/skills/tests/rdc-fixit.test.json +36 -36
  158. package/skills/tests/rdc-fs-mcp.test.json +36 -36
  159. package/skills/tests/rdc-handoff.test.json +28 -28
  160. package/skills/tests/rdc-help.test.json +29 -29
  161. package/skills/tests/rdc-housekeeping.test.json +28 -32
  162. package/skills/tests/rdc-lifeai-brochure-author.test.json +35 -35
  163. package/skills/tests/rdc-overnight.test.json +37 -37
  164. package/skills/tests/rdc-plan.test.json +27 -27
  165. package/skills/tests/rdc-preplan.test.json +31 -31
  166. package/skills/tests/rdc-prototype.test.json +28 -28
  167. package/skills/tests/rdc-rdc-brochurify.test.json +23 -23
  168. package/skills/tests/rdc-rdc-extract-verifier-rules.test.json +34 -34
  169. package/skills/tests/rdc-release.test.json +29 -29
  170. package/skills/tests/rdc-report.test.json +28 -28
  171. package/skills/tests/rdc-review.test.json +29 -29
  172. package/skills/tests/rdc-rpms-filemap.test.json +28 -28
  173. package/skills/tests/rdc-self-test.test.json +24 -24
  174. package/skills/tests/rdc-status.test.json +29 -29
  175. package/skills/tests/rdc-terminal-config.test.json +29 -29
  176. package/skills/tests/rdc-watch.test.json +24 -24
  177. package/skills/tests/rdc-workitems.test.json +27 -27
  178. package/skills/watch/SKILL.md +97 -97
  179. package/skills/workitems/SKILL.md +151 -151
  180. package/tests/acceptance.test.mjs +59 -59
  181. package/tests/channel-formatter.contract.test.mjs +251 -251
  182. package/tests/curl-surface.test.mjs +289 -289
  183. package/tests/harness-gates.test.mjs +325 -325
  184. package/tests/help-surface.test.mjs +61 -61
  185. package/tests/install-rdc-skills.test.mjs +49 -49
  186. package/tests/manifest-contract-fields.test.mjs +78 -78
  187. package/tests/mcp.test.mjs +271 -271
  188. package/tests/rdc-brochure.test.mjs +125 -125
  189. package/tests/require-work-item-on-commit.test.mjs +162 -162
  190. package/tests/run-evidence-gate.test.mjs +82 -82
  191. package/tests/skill-test-matrix.test.mjs +66 -66
  192. package/tests/validate-skills.js +27 -27
  193. package/tests/work-item-exit-gate-l2.test.mjs +368 -368
  194. package/tests/work-item-exit-gate-l3.test.mjs +197 -197
  195. package/RELEASE.md +0 -42
  196. package/tests/housekeeping-lessons-triage.test.mjs +0 -49
  197. package/tests/lessons-pipeline-contract.test.mjs +0 -27
  198. package/tests/release-contract.test.mjs +0 -16
@@ -0,0 +1,248 @@
1
+ ---
2
+ name: rdc:onramp
3
+ description: "Usage `rdc:onramp <slug> --name \"<Display Name>\"` — Idempotent Phase-1 enrollment orchestrator for a new Place Fund project. Resolves drift state, then runs three ordered steps in strict sequence: (1) `enroll_place` Supabase RPC → creates DB spine (places + project_nodes + project_places); (2) `insert_work_item` → opens enrollment epic bound to the project_node_id; (3) `scripts/onramp-scaffold-place.mjs` → writes `places/<slug>/` disk tree. Never reimplements any door. Four drift states: fresh | already-enrolled | spine-ahead | disk-ahead (disk-ahead STOPs and opens a reconciliation work item)."
4
+ ---
5
+
6
+ > **⚠️ OUTPUT CONTRACT (READ FIRST):** `guides/output-contract.md`
7
+ > Checklist-only output. No tool-call narration. No raw MCP/JSON/log dumps.
8
+ > One checklist upfront, updated in place, shown again at end with a 1-line verdict.
9
+
10
+ > If dispatching subagents or running as a subagent: read `{PROJECT_ROOT}/.rdc/guides/agent-bootstrap.md` first, then `{PROJECT_ROOT}/.rdc/guides/engineering-behavior.md`.
11
+
12
+ > **Sandbox contract:** This skill honors `RDC_TEST=1` per `guides/agent-bootstrap.md` § RDC_TEST Sandbox Contract. All three external steps (enroll_place RPC, insert_work_item RPC, scaffolder) short-circuit under the flag. Drift resolution and arg validation run normally.
13
+
14
+ > **RPMS compliance:** Encodes the Four Laws (One Home Per Fact · One Direction · One Door · One Spine). Each fact is written to its one home. **⛔ NEVER write `places/<slug>/_context.md`** — it is a generated projection owned by `apps/studio/src/lib/context-export-writer.ts`. A post-scaffold gate asserts its absence; the skill halts if found.
15
+
16
+ > **Purely additive — no architectural-approval interview required** per plan D5 in `.rdc/plans/rdc-onramp-skill.md`: adds one new skill dir and one `skills_meta` key; changes no existing skill, schema, MCP tool, routing, or build/deploy config.
17
+
18
+ # rdc:onramp — Phase-1 Enrollment Orchestrator
19
+
20
+ ## When to Use
21
+
22
+ - Enrolling a new Place Fund project for the first time (fresh state)
23
+ - Healing a spine-ahead state (DB row exists, disk tree missing)
24
+ - Checking current enrollment state without writing (`--dry-run`)
25
+ - Re-running enrollment to converge to a consistent state (idempotent)
26
+
27
+ ## When NOT to Use — escalate to the right tool
28
+
29
+ - Research phase → paste [`corpus/_shared/onramp/STARTUP.md`](file:///C:/Dev/regen-root/corpus/_shared/onramp/STARTUP.md) into a claude.ai studio project
30
+ - Brand/design → `rdc:design`
31
+ - Site build → `rdc:build` (after research is complete)
32
+ - Any architectural change → `rdc:plan` + approval interview
33
+
34
+ ## Argument Contract
35
+
36
+ ```
37
+ rdc:onramp <slug> --name "<Display Name>" [--location <json>] [--archetype <archetype>]
38
+ [--owner <place-fund|rdc|jv|client>] [--history] [--dry-run]
39
+ ```
40
+
41
+ | Arg / Flag | Required | Default | Description |
42
+ |------------|----------|---------|-------------|
43
+ | `slug` | **yes** | — | kebab-case, place-anchored (e.g. `spirit-bear-village`). Validated against `^[a-z0-9]+(-[a-z0-9]+)*$`. |
44
+ | `--name` | **yes** | — | Human display name. Passed verbatim to `enroll_place` and the scaffolder. |
45
+ | `--location` | no | `{}` | JSON object for `enroll_place p_location` (e.g. `{"state":"BC","country":"Canada"}`). Never guessed — omit entirely if unknown. |
46
+ | `--archetype` | no | `TBD` | Base-arc archetype. See [`corpus/_shared/onramp/ARCHETYPES.md`](file:///C:/Dev/regen-root/corpus/_shared/onramp/ARCHETYPES.md). |
47
+ | `--owner` | no | `place-fund` | `place-fund` \| `rdc` \| `jv` \| `client` |
48
+ | `--history` | no | off | Opt-in: also scaffold `places/<slug>/HISTORY.md`. See D4 in the plan for when to use. |
49
+ | `--dry-run` | no | off | Resolve drift + print plan; perform NO writes (no RPC, no scaffold, no work item). |
50
+
51
+ `--status` is not exposed — always `enrolling` (Phase-1 invariant; the Studio promotes to `active` later).
52
+
53
+ ## Procedure
54
+
55
+ ### 0. Preflight
56
+
57
+ Emit the full checklist below before any further action:
58
+
59
+ ```
60
+ - [ ] Preflight — validate slug + --name; parse flags
61
+ - [ ] Resolve drift — classify: fresh | already-enrolled | spine-ahead | disk-ahead
62
+ - [ ] Spine — enroll_place RPC (Step 1)
63
+ - [ ] Epic — dup-guard + insert_work_item (Step 2)
64
+ - [ ] Disk tree — onramp-scaffold-place.mjs (Step 3)
65
+ - [ ] HISTORY advisory
66
+ - [ ] Report — structural facts + ONE next action
67
+ ```
68
+
69
+ Validate before any external call:
70
+ - `slug` matches `^[a-z0-9]+(-[a-z0-9]+)*$` — reject if not
71
+ - `--name` is present and non-empty — reject if not
72
+ - `--dry-run` set → print plan and exit after drift resolution, no writes
73
+
74
+ ### 1. Resolve Drift State
75
+
76
+ Read-only DB probe (analytics SELECT is allowed per `.claude/rules/work-items-rpc.md`):
77
+ ```sql
78
+ SELECT id, slug, name, status FROM places WHERE slug = '<slug>';
79
+ ```
80
+
81
+ Check disk:
82
+ ```bash
83
+ test -d "places/<slug>/" && echo "disk:present" || echo "disk:absent"
84
+ ```
85
+
86
+ | State | Detection | Action |
87
+ |-------|-----------|--------|
88
+ | **fresh** | No DB row AND no disk dir | Run all three steps in order |
89
+ | **already-enrolled** | DB row exists AND disk dir exists | `enroll_place` (idempotent, returns existing node); scaffolder skips existing files; epic dup-guarded. Report "already enrolled — no new writes." |
90
+ | **spine-ahead** | DB row exists, disk dir ABSENT | Re-call `enroll_place` (returns existing `project_node_id`); run scaffolder to create missing disk tree |
91
+ | **disk-ahead** | Disk dir exists, NO DB row | **⛔ STOP — colliding identity.** Open reconciliation work item; report; exit. Never proceed. |
92
+
93
+ **disk-ahead STOP protocol — run this, then exit:**
94
+ ```sql
95
+ SELECT insert_work_item(
96
+ p_title := 'reconcile: disk-ahead conflict for <slug>',
97
+ p_item_type := 'bug',
98
+ p_priority := 'urgent',
99
+ p_source := 'onramp',
100
+ p_description := 'places/<slug>/ exists on disk but has no places DB row. A disk tree with no spine row is an unreconciled state. Manual reconciliation needed before enrollment can proceed — this may describe a different place. Do not auto-enroll.'
101
+ );
102
+ ```
103
+
104
+ Report the work-item id and the disk-ahead explanation, then exit. Never proceed to Step 1.
105
+
106
+ ### 2. Step 1 — DB Spine (`enroll_place`)
107
+
108
+ This RPC is idempotent: calling it for an already-enrolled place returns the existing `project_node_id` without creating duplicate rows.
109
+
110
+ **Supabase MCP (preferred):**
111
+ ```sql
112
+ SELECT enroll_place('<slug>', '<Display Name>', '<location_json>'::jsonb, 'enrolling');
113
+ ```
114
+
115
+ `project_id = uvojezuorjgqzmhhgluu` is REQUIRED on every MCP call. An `InputValidationError` means it was omitted — pass it and retry; do not fall back to raw credentials.
116
+
117
+ **Subagent fallback** (if Supabase MCP is unavailable in this context):
118
+ ```
119
+ Agent({
120
+ prompt: "Call Supabase RPC with Supabase MCP tool (mcp__claude_ai_Supabase__execute_sql).
121
+ project_id: uvojezuorjgqzmhhgluu
122
+ query: SELECT enroll_place('<slug>', '<name>', '{}'::jsonb, 'enrolling');
123
+ Return the project_node_id from the result JSON.
124
+ Never raw curl to *.supabase.co — hookify-blocked."
125
+ })
126
+ ```
127
+
128
+ **GATE:** Capture `project_node_id` from the returned JSONB. If absent → emit the `BLOCKED:` template from `.claude/rules/infrastructure-contract.md`, stop. Never proceed without a `project_node_id`.
129
+
130
+ Under `RDC_TEST=1`:
131
+ ```
132
+ [RDC_TEST] skipping enroll_place RPC — using placeholder project_node_id
133
+ ```
134
+
135
+ ### 3. Step 2 — Enrollment Epic (`insert_work_item`)
136
+
137
+ **Dup-guard first** (raw SELECT allowed for analytics):
138
+ ```sql
139
+ SELECT id, title FROM work_items
140
+ WHERE title = 'epic: enroll <slug>'
141
+ AND project_node_id = '<project_node_id>'::uuid
142
+ AND item_type = 'epic'
143
+ AND status NOT IN ('done', 'archived')
144
+ LIMIT 1;
145
+ ```
146
+
147
+ If a row is returned: reuse the existing id — do NOT insert a duplicate.
148
+
149
+ If no row: create the epic:
150
+ ```sql
151
+ SELECT insert_work_item(
152
+ p_title := 'epic: enroll <slug>',
153
+ p_item_type := 'epic',
154
+ p_priority := 'high',
155
+ p_source := 'onramp',
156
+ p_project_node_id := '<project_node_id>'::uuid
157
+ );
158
+ ```
159
+
160
+ **GATE:** The epic id (new or reused) must be captured before proceeding to Step 3.
161
+
162
+ Under `RDC_TEST=1`:
163
+ ```
164
+ [RDC_TEST] skipping insert_work_item — using placeholder epic id
165
+ ```
166
+
167
+ ### 4. Step 3 — Disk Tree (`onramp-scaffold-place.mjs`)
168
+
169
+ ```bash
170
+ node scripts/onramp-scaffold-place.mjs --slug <slug> --name "<Display Name>" \
171
+ [--archetype <archetype>] [--owner <owner>] [--history (if --history flag was passed)]
172
+ ```
173
+
174
+ The script is DB-free, idempotent (skips existing files), and writes NO `_context.md`. It produces:
175
+ `places/<slug>/PLACE.md · corpus/INDEX.md · arc/01–06/ · PRODUCT.md · DESIGN.md · HANDOFF.md · tracker/*`
176
+
177
+ **Post-run invariant gate (HARD — halt if violated):**
178
+ ```bash
179
+ test ! -f "places/<slug>/_context.md" \
180
+ && echo "_context.md absent: ✓" \
181
+ || echo "FAIL: _context.md present — projection-drift violation"
182
+ ```
183
+
184
+ If `_context.md` is found: **STOP immediately** and report a FAIL. The projection is owned by `context-export-writer.ts` — any hand-authored copy is a Law 3 violation. Do not proceed.
185
+
186
+ Under `RDC_TEST=1`:
187
+ ```
188
+ [RDC_TEST] skipping onramp-scaffold-place.mjs
189
+ [RDC_TEST] skipping _context.md gate (no scaffold ran)
190
+ ```
191
+
192
+ ### 5. HISTORY Advisory
193
+
194
+ Always print:
195
+
196
+ ```
197
+ ℹ️ HISTORY.md advisory
198
+ places/<slug>/HISTORY.md may be required once prt_projects.project_type is known.
199
+ Qualifying types: ranch · eco-hospitality · mixed · conservation · regenerative-agriculture · real-estate · development
200
+ Excluded types: credit · water · tech · regenerative-model
201
+ To scaffold now: pass --history on this run or re-run with it.
202
+ ```
203
+
204
+ If `--history` was passed: the scaffolder above already included the flag. Confirm in output.
205
+
206
+ ### 6. Report
207
+
208
+ Print the completed checklist (all rows checked), then a single verdict line:
209
+
210
+ ```
211
+ ✅ rdc:onramp — <slug> [<drift-state>]
212
+
213
+ DB spine: places.slug=<slug>
214
+ project_nodes.slug=prtnode-<slug>
215
+ project_node_id=<uuid>
216
+ Epic: <work-item-id> (<new|reused>)
217
+ Disk tree: places/<slug>/ (created=N skipped=M)
218
+ _context.md: absent ✓
219
+
220
+ ─────────────────────────────────────────────
221
+ NEXT ACTION — RESEARCH PHASE:
222
+ Paste corpus/_shared/onramp/STARTUP.md
223
+ into a new claude.ai studio project
224
+ (PROJECT NAME = <slug>) to begin research.
225
+ ─────────────────────────────────────────────
226
+ ```
227
+
228
+ Every file path and URL must be a clickable markdown hyperlink per [`.claude/rules/clickable-output.md`](file:///C:/Dev/regen-root/.claude/rules/clickable-output.md).
229
+
230
+ ## Convergence Guarantee
231
+
232
+ Every step is idempotent. Re-running `rdc:onramp <slug>` for an already-enrolled place performs zero new writes and reports "already enrolled." It never duplicates a spine row, an epic, or a disk file.
233
+
234
+ ## Rules
235
+
236
+ - Validate `slug` and `--name` before any external call — reject invalid slugs immediately
237
+ - `enroll_place` is the ONLY door for spine rows — never raw INSERT into `places`, `project_nodes`, or `project_places`
238
+ - `insert_work_item` is the ONLY door for work items — never raw INSERT into `work_items`
239
+ - `onramp-scaffold-place.mjs` is the ONLY door for the disk tree — never hand-write `places/<slug>/` files outside the script
240
+ - Dup-guard the epic before inserting — one analytics SELECT, never two insert calls
241
+ - Assert `_context.md` ABSENT after scaffolding — hard stop if present
242
+ - disk-ahead → STOP, open reconciliation work item, never call `enroll_place` over an unknown disk tree
243
+ - `--status` is always `enrolling` — never exposed as a flag
244
+ - Under `RDC_TEST=1`: arg validation + drift resolution run; all three external steps short-circuit
245
+
246
+ ## Capture Lessons
247
+
248
+ Before the final verdict, follow `.rdc/guides/lessons-learned-spec.md` § Capture procedure. If this run exposed a non-obvious gap — unexpected DB state, scaffolder behavior, drift edge case, RPC shape change — write one `.rdc/lessons/<YYYY-MM-DD>-onramp-<slug>.md`. Commit alongside the run's other commits. A run that taught nothing writes nothing.