@lifeaitools/rdc-skills 0.21.0 → 0.21.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/.claude-plugin/plugin.json +18 -2
  2. package/.github/workflows/self-test.yml +34 -34
  3. package/commands/build.md +181 -181
  4. package/commands/collab.md +180 -180
  5. package/commands/deploy.md +148 -148
  6. package/commands/fixit.md +105 -105
  7. package/commands/handoff.md +173 -173
  8. package/commands/overnight.md +218 -218
  9. package/commands/plan.md +158 -158
  10. package/commands/preplan.md +131 -131
  11. package/commands/prototype.md +145 -145
  12. package/commands/report.md +99 -99
  13. package/commands/review.md +120 -120
  14. package/commands/status.md +86 -86
  15. package/commands/workitems.md +127 -127
  16. package/git-sha.json +1 -1
  17. package/guides/agent-bootstrap.md +195 -195
  18. package/guides/agents/backend.md +102 -102
  19. package/guides/agents/content.md +94 -94
  20. package/guides/agents/cs2.md +56 -56
  21. package/guides/agents/data.md +86 -86
  22. package/guides/agents/design.md +77 -77
  23. package/guides/agents/frontend.md +91 -91
  24. package/guides/agents/infrastructure.md +81 -81
  25. package/guides/agents/setup.md +272 -272
  26. package/guides/agents/verify.md +119 -119
  27. package/guides/agents/viz.md +106 -106
  28. package/package.json +1 -1
  29. package/scripts/self-test.mjs +1458 -1458
  30. package/skills/build/SKILL.md +478 -478
  31. package/skills/channel-formatter/SKILL.md +14 -1
  32. package/skills/collab/SKILL.md +239 -239
  33. package/skills/deploy/SKILL.md +522 -522
  34. package/skills/design/SKILL.md +205 -205
  35. package/skills/fixit/SKILL.md +165 -165
  36. package/skills/handoff/SKILL.md +200 -200
  37. package/skills/overnight/SKILL.md +230 -230
  38. package/skills/plan/SKILL.md +274 -274
  39. package/skills/preplan/SKILL.md +90 -90
  40. package/skills/prototype/SKILL.md +150 -150
  41. package/skills/release/SKILL.md +140 -140
  42. package/skills/report/SKILL.md +100 -100
  43. package/skills/review/SKILL.md +152 -152
  44. package/skills/self-test/SKILL.md +123 -123
  45. package/skills/status/SKILL.md +99 -99
  46. package/skills/watch/SKILL.md +90 -90
  47. package/skills/workitems/SKILL.md +151 -151
@@ -1,230 +1,230 @@
1
- ---
2
- name: rdc:overnight
3
- description: "Usage `rdc:overnight [epic-id|label=<label>]` — Unattended end-to-end: drain the entire work queue autonomously (preplan → plan → build → review → report). Inherits mandatory per-wave code-review (pr-review-toolkit:code-reviewer) from rdc:build and rdc:review. Use when leaving Claude to run unsupervised for an extended session."
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 (fallback: `{PROJECT_ROOT}/.rdc/guides/agent-bootstrap.md`).
11
-
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
-
14
-
15
- # rdc:overnight — Overnight Build Supervisor
16
-
17
- ## When to Use
18
- - Starting an unattended multi-hour build session
19
- - Project lead says "run overnight", "build everything", "go while I sleep"
20
- - Kicking off a full epic queue after scoping is agreed
21
-
22
- ## Arguments
23
- - `/rdc:overnight` — work all urgent/high priority todo epics
24
- - `/rdc:overnight <epic-id>` — work a specific epic only
25
- - `/rdc:overnight label=<label>` — work epics matching label
26
-
27
- ## Phase 1 — Pre-flight
28
-
29
- **First action — set the overnight sentinel** so the `no-stop-open-epics` Stop hook engages (interactive sessions are not gated by it):
30
-
31
- ```bash
32
- mkdir -p {PROJECT_ROOT}/.rdc && touch {PROJECT_ROOT}/.rdc/overnight.lock
33
- ```
34
-
35
- **Last action at end of run (success OR failure) — remove the sentinel:**
36
-
37
- ```bash
38
- rm -f {PROJECT_ROOT}/.rdc/overnight.lock
39
- ```
40
-
41
- If the sentinel file does not exist, the Stop hook will NOT block — which means interactive sessions stop freely and only `rdc:overnight` is held to the "drain the queue" contract.
42
-
43
- Before touching any code, verify the environment is safe:
44
-
45
- 1. **Clauth daemon alive:**
46
- ```bash
47
- curl -s http://127.0.0.1:52437/ping
48
- ```
49
- If not responding: report `BLOCKED: credential daemon offline` and exit. Do not proceed.
50
-
51
- 2. **Git state clean:**
52
- ```bash
53
- git status --short
54
- ```
55
- Must be on the development branch with no uncommitted changes. If dirty: commit or stash first.
56
-
57
- 3. **Baseline review:**
58
- Run `rdc:review --unattended`. If `REVIEW_STATUS.verdict = "HAS_ISSUES"` and
59
- issues cannot be auto-fixed: report `BLOCKED: codebase has pre-existing issues` and exit.
60
- A dirty baseline overnight compounds into a disaster by morning.
61
-
62
- If all three pass: proceed to Phase 2.
63
-
64
- ## Phase 2 — Load Scope
65
-
66
- Determine which epics to work:
67
-
68
- - **Specific epic arg:** load that one epic via `get_work_items_by_epic()`
69
- - **Label filter:** `SELECT get_open_epics(p_label_filter := '<label>')`
70
- - **No arg (default):** `SELECT get_open_epics()` filtered to:
71
- - `priority IN ('urgent', 'high')`
72
- - `status IN ('todo', 'in_progress')`
73
- - Order: urgent first, then high, then by `created_at`
74
-
75
- Log the epic queue at the start of `.rdc/reports/overnight-<YYYY-MM-DD>.md` (fallback: `.rdc/reports/overnight-<YYYY-MM-DD>.md` if `.rdc/` does not exist).
76
-
77
- ## Phase 3 — Epic Loop
78
-
79
- ### Targeted vs. queue mode
80
-
81
- - **Targeted (`rdc:overnight <epic-id>`):** work that one epic only. When it completes, remove the sentinel and exit — do NOT poll for more epics.
82
- - **Queue mode (`rdc:overnight` no args or `label=X`):** drain all matching epics sequentially.
83
-
84
- For each epic in the queue, run this sequence:
85
-
86
- ### 3a. Research (if needed)
87
- Condition: epic has 0 child tasks AND no matching doc in `.rdc/plans/` (or `.rdc/plans/` as fallback)
88
-
89
- ```
90
- rdc:preplan <topic> --unattended
91
- ```
92
-
93
- Check `PREPLAN_STATUS.recommendation_confidence`:
94
- - `"high"` or `"medium"`: proceed
95
- - `"low"`: escalate via advisor tool (see Escalation Protocol below)
96
- - If advisor gives direction: proceed with that direction
97
- - If advisor cannot resolve: skip this epic, log reason, move to next
98
-
99
- ### 3b. Plan (if no tasks exist)
100
- Condition: epic has 0 child tasks after preplan
101
-
102
- ```
103
- rdc:plan <epic-id> --unattended
104
- ```
105
-
106
- Check `PLAN_STATUS.task_count > 0` before continuing.
107
- If 0 tasks created: escalate via advisor, then skip if still unresolved.
108
-
109
- ### 3c. Build
110
-
111
- This skill delegates to rdc:build which uses typed agent dispatch. See rdc:build for agent type classification.
112
-
113
- ```
114
- rdc:build <epic-id> --unattended
115
- ```
116
-
117
- Agents receive the relevant guide file from `.rdc/guides/` (fallback: `.rdc/guides/`) based on their work package type.
118
-
119
- After each wave: check `BUILD_STATUS`. If `escalated: true`, log the escalation
120
- in the overnight doc and continue — don't stop the loop.
121
-
122
- **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.
123
-
124
- ### 3d. Review
125
-
126
- ```
127
- rdc:review --unattended
128
- ```
129
-
130
- Check `REVIEW_STATUS.verdict`:
131
- - `"CLEAN"`: mark epic `done` in work_items, push, continue to next epic
132
- - `"HAS_ISSUES"` with `escalations > 0`: log issues, push what's clean, continue
133
- - `"HAS_ISSUES"` with `escalations = 0` (all auto-fixed): push, continue
134
-
135
- ### 3e. Commit checkpoint
136
-
137
- After each epic (pass or fail):
138
- ```bash
139
- if [ "$RDC_TEST" != "1" ]; then
140
- git push origin {development-branch}
141
- else
142
- echo "[RDC_TEST] skipping git push origin {development-branch}"
143
- fi
144
- ```
145
-
146
- This ensures every epic's work is saved regardless of what comes next.
147
-
148
- ## Phase 4 — Exit
149
-
150
- After all epics are processed:
151
-
152
- 1. Run `rdc:report --unattended`
153
-
154
- 2. Write session summary to `.rdc/reports/overnight-<YYYY-MM-DD>.md` (fallback: `.rdc/reports/overnight-<YYYY-MM-DD>.md`):
155
- ```markdown
156
- # Overnight Session — YYYY-MM-DD
157
-
158
- ## Started
159
- <timestamp>
160
-
161
- ## Epics Attempted
162
- | Epic | Status | Tasks Done | Commits |
163
-
164
- ## Epics Completed
165
- <list with epic IDs>
166
-
167
- ## Escalations
168
- N advisor calls — details:
169
- - <epic>: <what was escalated> → <advisor response>
170
-
171
- ## Blockers Remaining
172
- <any epics skipped or partially done>
173
-
174
- ## Git Summary
175
- - Total commits: N
176
- - Push status: ✅
177
-
178
- ## Completed
179
- <timestamp>
180
- ```
181
-
182
- 3. Final push:
183
- ```bash
184
- if [ "$RDC_TEST" != "1" ]; then
185
- git push origin {development-branch}
186
- else
187
- echo "[RDC_TEST] skipping final git push origin {development-branch}"
188
- fi
189
- ```
190
-
191
- ## Escalation Protocol
192
-
193
- The advisor tool pairs this executor with a high-level model for high-stakes decisions.
194
- Use it when genuinely stuck — not for every small uncertainty.
195
-
196
- **Escalation triggers:**
197
- - `PREPLAN_STATUS.recommendation_confidence = "low"` (too many unknowns)
198
- - `PLAN_STATUS.task_count = 0` after planning (nothing actionable)
199
- - Build agent fails twice on the same task
200
- - `REVIEW_STATUS` has unfixable issues requiring architectural judgment
201
- - Credential daemon goes down mid-session (escalate before exiting)
202
-
203
- **How to escalate:**
204
- Provide the advisor with:
205
- 1. What was attempted and what failed
206
- 2. The error or ambiguity in detail
207
- 3. Two most likely paths forward with tradeoffs
208
- 4. Which epic/task is blocked
209
-
210
- **After advisor responds:**
211
- - Log the guidance in the overnight doc
212
- - Resume the loop from where it stopped
213
- - If advisor cannot resolve: mark task/epic `blocked`, log reason, skip to next
214
-
215
- **Max escalations:** 3 per epic. After 3, skip the epic and log.
216
-
217
- ## Safety Rules
218
-
219
- - Branch: development branch always — NEVER touch main/production
220
- - NEVER run `pnpm build` — use `npx tsc --noEmit` for typecheck, vitest for tests only on modified packages
221
- - NEVER let agents overlap on the same files
222
- - Push after every epic, not just at the end
223
- - Update Supabase work items in real time throughout
224
- - Max 2 hours per epic — if exceeded, skip and log `TIMEOUT`
225
- - If credential daemon goes down mid-session: write current state to overnight doc, push, exit gracefully
226
- - If git push fails: log the failure, attempt rebase, retry once — do not force push
227
-
228
- ## Capture lessons (exit step)
229
-
230
- Before the final verdict line, follow `.rdc/guides/lessons-learned-spec.md` § Capture procedure. If this run taught something non-obvious — a first root-cause theory that turned out wrong, the documented/standard path not working, a missing gate or check that cost a round, or a surprising tool/infra behavior — write one `.rdc/lessons/<YYYY-MM-DD>-overnight-<short-slug>.md` per lesson using the schema in that spec. Set `scope` (`simple` | `architectural`) and `status` (`open`, or `applied` if you shipped the fix in this same run, with the commit linked). Commit the lesson file(s) on `develop` alongside the run's other commits, and note "N lessons captured" in your verdict/summary. A run that taught nothing writes nothing — absence is the default.
1
+ ---
2
+ name: rdc:overnight
3
+ description: "Usage `rdc:overnight [epic-id|label=<label>]` — Unattended end-to-end: drain the entire work queue autonomously (preplan → plan → build → review → report). Inherits mandatory per-wave code-review (pr-review-toolkit:code-reviewer) from rdc:build and rdc:review. Use when leaving Claude to run unsupervised for an extended session."
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 (fallback: `{PROJECT_ROOT}/.rdc/guides/agent-bootstrap.md`).
11
+
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
+
14
+
15
+ # rdc:overnight — Overnight Build Supervisor
16
+
17
+ ## When to Use
18
+ - Starting an unattended multi-hour build session
19
+ - Project lead says "run overnight", "build everything", "go while I sleep"
20
+ - Kicking off a full epic queue after scoping is agreed
21
+
22
+ ## Arguments
23
+ - `/rdc:overnight` — work all urgent/high priority todo epics
24
+ - `/rdc:overnight <epic-id>` — work a specific epic only
25
+ - `/rdc:overnight label=<label>` — work epics matching label
26
+
27
+ ## Phase 1 — Pre-flight
28
+
29
+ **First action — set the overnight sentinel** so the `no-stop-open-epics` Stop hook engages (interactive sessions are not gated by it):
30
+
31
+ ```bash
32
+ mkdir -p {PROJECT_ROOT}/.rdc && touch {PROJECT_ROOT}/.rdc/overnight.lock
33
+ ```
34
+
35
+ **Last action at end of run (success OR failure) — remove the sentinel:**
36
+
37
+ ```bash
38
+ rm -f {PROJECT_ROOT}/.rdc/overnight.lock
39
+ ```
40
+
41
+ If the sentinel file does not exist, the Stop hook will NOT block — which means interactive sessions stop freely and only `rdc:overnight` is held to the "drain the queue" contract.
42
+
43
+ Before touching any code, verify the environment is safe:
44
+
45
+ 1. **Clauth daemon alive:**
46
+ ```bash
47
+ curl -s http://127.0.0.1:52437/ping
48
+ ```
49
+ If not responding: report `BLOCKED: credential daemon offline` and exit. Do not proceed.
50
+
51
+ 2. **Git state clean:**
52
+ ```bash
53
+ git status --short
54
+ ```
55
+ Must be on the development branch with no uncommitted changes. If dirty: commit or stash first.
56
+
57
+ 3. **Baseline review:**
58
+ Run `rdc:review --unattended`. If `REVIEW_STATUS.verdict = "HAS_ISSUES"` and
59
+ issues cannot be auto-fixed: report `BLOCKED: codebase has pre-existing issues` and exit.
60
+ A dirty baseline overnight compounds into a disaster by morning.
61
+
62
+ If all three pass: proceed to Phase 2.
63
+
64
+ ## Phase 2 — Load Scope
65
+
66
+ Determine which epics to work:
67
+
68
+ - **Specific epic arg:** load that one epic via `get_work_items_by_epic()`
69
+ - **Label filter:** `SELECT get_open_epics(p_label_filter := '<label>')`
70
+ - **No arg (default):** `SELECT get_open_epics()` filtered to:
71
+ - `priority IN ('urgent', 'high')`
72
+ - `status IN ('todo', 'in_progress')`
73
+ - Order: urgent first, then high, then by `created_at`
74
+
75
+ Log the epic queue at the start of `.rdc/reports/overnight-<YYYY-MM-DD>.md` (fallback: `.rdc/reports/overnight-<YYYY-MM-DD>.md` if `.rdc/` does not exist).
76
+
77
+ ## Phase 3 — Epic Loop
78
+
79
+ ### Targeted vs. queue mode
80
+
81
+ - **Targeted (`rdc:overnight <epic-id>`):** work that one epic only. When it completes, remove the sentinel and exit — do NOT poll for more epics.
82
+ - **Queue mode (`rdc:overnight` no args or `label=X`):** drain all matching epics sequentially.
83
+
84
+ For each epic in the queue, run this sequence:
85
+
86
+ ### 3a. Research (if needed)
87
+ Condition: epic has 0 child tasks AND no matching doc in `.rdc/plans/` (or `.rdc/plans/` as fallback)
88
+
89
+ ```
90
+ rdc:preplan <topic> --unattended
91
+ ```
92
+
93
+ Check `PREPLAN_STATUS.recommendation_confidence`:
94
+ - `"high"` or `"medium"`: proceed
95
+ - `"low"`: escalate via advisor tool (see Escalation Protocol below)
96
+ - If advisor gives direction: proceed with that direction
97
+ - If advisor cannot resolve: skip this epic, log reason, move to next
98
+
99
+ ### 3b. Plan (if no tasks exist)
100
+ Condition: epic has 0 child tasks after preplan
101
+
102
+ ```
103
+ rdc:plan <epic-id> --unattended
104
+ ```
105
+
106
+ Check `PLAN_STATUS.task_count > 0` before continuing.
107
+ If 0 tasks created: escalate via advisor, then skip if still unresolved.
108
+
109
+ ### 3c. Build
110
+
111
+ This skill delegates to rdc:build which uses typed agent dispatch. See rdc:build for agent type classification.
112
+
113
+ ```
114
+ rdc:build <epic-id> --unattended
115
+ ```
116
+
117
+ Agents receive the relevant guide file from `.rdc/guides/` (fallback: `.rdc/guides/`) based on their work package type.
118
+
119
+ After each wave: check `BUILD_STATUS`. If `escalated: true`, log the escalation
120
+ in the overnight doc and continue — don't stop the loop.
121
+
122
+ **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.
123
+
124
+ ### 3d. Review
125
+
126
+ ```
127
+ rdc:review --unattended
128
+ ```
129
+
130
+ Check `REVIEW_STATUS.verdict`:
131
+ - `"CLEAN"`: mark epic `done` in work_items, push, continue to next epic
132
+ - `"HAS_ISSUES"` with `escalations > 0`: log issues, push what's clean, continue
133
+ - `"HAS_ISSUES"` with `escalations = 0` (all auto-fixed): push, continue
134
+
135
+ ### 3e. Commit checkpoint
136
+
137
+ After each epic (pass or fail):
138
+ ```bash
139
+ if [ "$RDC_TEST" != "1" ]; then
140
+ git push origin {development-branch}
141
+ else
142
+ echo "[RDC_TEST] skipping git push origin {development-branch}"
143
+ fi
144
+ ```
145
+
146
+ This ensures every epic's work is saved regardless of what comes next.
147
+
148
+ ## Phase 4 — Exit
149
+
150
+ After all epics are processed:
151
+
152
+ 1. Run `rdc:report --unattended`
153
+
154
+ 2. Write session summary to `.rdc/reports/overnight-<YYYY-MM-DD>.md` (fallback: `.rdc/reports/overnight-<YYYY-MM-DD>.md`):
155
+ ```markdown
156
+ # Overnight Session — YYYY-MM-DD
157
+
158
+ ## Started
159
+ <timestamp>
160
+
161
+ ## Epics Attempted
162
+ | Epic | Status | Tasks Done | Commits |
163
+
164
+ ## Epics Completed
165
+ <list with epic IDs>
166
+
167
+ ## Escalations
168
+ N advisor calls — details:
169
+ - <epic>: <what was escalated> → <advisor response>
170
+
171
+ ## Blockers Remaining
172
+ <any epics skipped or partially done>
173
+
174
+ ## Git Summary
175
+ - Total commits: N
176
+ - Push status: ✅
177
+
178
+ ## Completed
179
+ <timestamp>
180
+ ```
181
+
182
+ 3. Final push:
183
+ ```bash
184
+ if [ "$RDC_TEST" != "1" ]; then
185
+ git push origin {development-branch}
186
+ else
187
+ echo "[RDC_TEST] skipping final git push origin {development-branch}"
188
+ fi
189
+ ```
190
+
191
+ ## Escalation Protocol
192
+
193
+ The advisor tool pairs this executor with a high-level model for high-stakes decisions.
194
+ Use it when genuinely stuck — not for every small uncertainty.
195
+
196
+ **Escalation triggers:**
197
+ - `PREPLAN_STATUS.recommendation_confidence = "low"` (too many unknowns)
198
+ - `PLAN_STATUS.task_count = 0` after planning (nothing actionable)
199
+ - Build agent fails twice on the same task
200
+ - `REVIEW_STATUS` has unfixable issues requiring architectural judgment
201
+ - Credential daemon goes down mid-session (escalate before exiting)
202
+
203
+ **How to escalate:**
204
+ Provide the advisor with:
205
+ 1. What was attempted and what failed
206
+ 2. The error or ambiguity in detail
207
+ 3. Two most likely paths forward with tradeoffs
208
+ 4. Which epic/task is blocked
209
+
210
+ **After advisor responds:**
211
+ - Log the guidance in the overnight doc
212
+ - Resume the loop from where it stopped
213
+ - If advisor cannot resolve: mark task/epic `blocked`, log reason, skip to next
214
+
215
+ **Max escalations:** 3 per epic. After 3, skip the epic and log.
216
+
217
+ ## Safety Rules
218
+
219
+ - Branch: development branch always — NEVER touch main/production
220
+ - NEVER run `pnpm build` — use `npx tsc --noEmit` for typecheck, vitest for tests only on modified packages
221
+ - NEVER let agents overlap on the same files
222
+ - Push after every epic, not just at the end
223
+ - Update Supabase work items in real time throughout
224
+ - Max 2 hours per epic — if exceeded, skip and log `TIMEOUT`
225
+ - If credential daemon goes down mid-session: write current state to overnight doc, push, exit gracefully
226
+ - If git push fails: log the failure, attempt rebase, retry once — do not force push
227
+
228
+ ## Capture lessons (exit step)
229
+
230
+ Before the final verdict line, follow `.rdc/guides/lessons-learned-spec.md` § Capture procedure. If this run taught something non-obvious — a first root-cause theory that turned out wrong, the documented/standard path not working, a missing gate or check that cost a round, or a surprising tool/infra behavior — write one `.rdc/lessons/<YYYY-MM-DD>-overnight-<short-slug>.md` per lesson using the schema in that spec. Set `scope` (`simple` | `architectural`) and `status` (`open`, or `applied` if you shipped the fix in this same run, with the commit linked). Commit the lesson file(s) on `develop` alongside the run's other commits, and note "N lessons captured" in your verdict/summary. A run that taught nothing writes nothing — absence is the default.