@ericrisco/rsc 2.0.20 → 2.2.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 (97) hide show
  1. package/README.md +63 -21
  2. package/manifest.json +18 -85
  3. package/package.json +5 -1
  4. package/scripts/consult.js +8 -8
  5. package/scripts/install-apply.js +48 -11
  6. package/scripts/lib/default-skill-floor.js +5 -4
  7. package/scripts/lib/divergence.js +7 -3
  8. package/scripts/lib/domains.js +2 -2
  9. package/scripts/lib/onboarding-apply.js +43 -26
  10. package/scripts/lib/onboarding.js +5 -5
  11. package/scripts/lib/recommend.js +1 -1
  12. package/scripts/lib/repair.js +4 -2
  13. package/scripts/lib/retired-skills.js +20 -0
  14. package/scripts/rsc.js +25 -19
  15. package/scripts/skill-behavior-rubric.md +1 -1
  16. package/scripts/skill-migration-brief.md +3 -3
  17. package/skills/analyze/SKILL.md +3 -8
  18. package/skills/analyze/evals/cases.yaml +1 -1
  19. package/skills/author-skill/SKILL.md +3 -3
  20. package/skills/author-skill/evals/cases.yaml +1 -1
  21. package/skills/author-skill/references/rsc-conventions.md +1 -1
  22. package/skills/clarify/SKILL.md +7 -14
  23. package/skills/clarify/evals/cases.yaml +2 -2
  24. package/skills/code-review/SKILL.md +1 -1
  25. package/skills/constitution/SKILL.md +10 -13
  26. package/skills/constitution/evals/cases.yaml +3 -3
  27. package/skills/continuous-learning/SKILL.md +1 -1
  28. package/skills/continuous-learning/evals/cases.yaml +1 -1
  29. package/skills/debug/SKILL.md +8 -12
  30. package/skills/debug/evals/cases.yaml +1 -1
  31. package/skills/decision-challenge/SKILL.md +1 -1
  32. package/skills/deprecation/SKILL.md +1 -1
  33. package/skills/ftd/SKILL.md +1 -3
  34. package/skills/ftd/evals/cases.yaml +1 -1
  35. package/skills/harness/SKILL.md +10 -9
  36. package/skills/harness/references/claude-md-template.md +1 -1
  37. package/skills/harness/references/wiki-protocol.md +5 -6
  38. package/skills/idea-refinement/SKILL.md +1 -1
  39. package/skills/implement/SKILL.md +14 -18
  40. package/skills/implement/evals/cases.yaml +1 -1
  41. package/skills/init/SKILL.md +36 -45
  42. package/skills/init/evals/README.md +3 -3
  43. package/skills/init/evals/cases.yaml +7 -7
  44. package/skills/init/references/accompaniment-and-profile.md +22 -40
  45. package/skills/init/references/discovery.md +2 -2
  46. package/skills/init/references/recommend-skills.md +5 -5
  47. package/skills/init/scripts/verify.sh +3 -7
  48. package/skills/knowledge-ops/SKILL.md +1 -1
  49. package/skills/orient/SKILL.md +52 -41
  50. package/skills/orient/evals/README.md +11 -9
  51. package/skills/orient/evals/cases.yaml +39 -29
  52. package/skills/orient/references/explain-ladder.md +93 -0
  53. package/skills/orient/references/orientation-contract.md +70 -18
  54. package/skills/parallel/SKILL.md +1 -1
  55. package/skills/parallel/evals/cases.yaml +2 -2
  56. package/skills/plan/SKILL.md +9 -13
  57. package/skills/review/SKILL.md +5 -8
  58. package/skills/roast-me/SKILL.md +1 -1
  59. package/skills/sdd/SKILL.md +10 -14
  60. package/skills/sdd/evals/README.md +2 -2
  61. package/skills/sdd/evals/cases.yaml +4 -4
  62. package/skills/sdd/references/model-routing.md +5 -12
  63. package/skills/sdd-init/SKILL.md +3 -3
  64. package/skills/ship/SKILL.md +6 -11
  65. package/skills/simplify-code/SKILL.md +1 -1
  66. package/skills/skill-scout/SKILL.md +1 -1
  67. package/skills/source-grounded-development/SKILL.md +1 -1
  68. package/skills/specify/SKILL.md +13 -14
  69. package/skills/specify/evals/cases.yaml +1 -1
  70. package/skills/specify/references/eliciting-requirements.md +5 -5
  71. package/skills/suggest/SKILL.md +3 -9
  72. package/skills/suggest/evals/cases.yaml +1 -1
  73. package/skills/tasks/SKILL.md +6 -7
  74. package/skills/tasks/evals/cases.yaml +1 -1
  75. package/skills/unslop/SKILL.md +39 -10
  76. package/skills/unslop/evals/README.md +7 -7
  77. package/skills/unslop/evals/cases.yaml +10 -9
  78. package/skills/verify/SKILL.md +5 -8
  79. package/skills/verify/evals/cases.yaml +1 -1
  80. package/skills/worktrees/SKILL.md +14 -18
  81. package/skills/worktrees/evals/cases.yaml +1 -1
  82. package/targets/_md-block.js +7 -1
  83. package/targets/auto-update.mjs +200 -0
  84. package/targets/claude.js +2 -0
  85. package/targets/clone-bootstrap.mjs +5 -2
  86. package/targets/opt-outs.js +1 -0
  87. package/targets/session-start.mjs +5 -78
  88. package/targets/update-wiring.js +153 -0
  89. package/skills/bro/SKILL.md +0 -76
  90. package/skills/bro/evals/README.md +0 -22
  91. package/skills/bro/evals/cases.yaml +0 -62
  92. package/skills/eli5/SKILL.md +0 -63
  93. package/skills/eli5/evals/README.md +0 -22
  94. package/skills/eli5/evals/cases.yaml +0 -54
  95. package/skills/show-me/SKILL.md +0 -140
  96. package/skills/show-me/evals/README.md +0 -23
  97. package/skills/show-me/evals/cases.yaml +0 -61
@@ -0,0 +1,93 @@
1
+ # The explain ladder
2
+
3
+ Text → diagram → HTML page → video. Climb one step per clear sign that the person does not follow,
4
+ or go straight to the step they ask for. Each step replaces the last one; it does not add to it.
5
+
6
+ ## Step 1 — text
7
+
8
+ The three rules of `../SKILL.md`: STE, stands alone, short. Most answers stop here.
9
+
10
+ ## Step 2 — one diagram in the chat
11
+
12
+ Pick the **smallest** form that carries the point. One form per answer. Two lines of prose beside it,
13
+ then stop.
14
+
15
+ | The question is about | Draw |
16
+ |---|---|
17
+ | Logic, an algorithm, a decision | pseudocode |
18
+ | What calls what at runtime | call tree |
19
+ | UI structure | component tree, with state and module boundaries |
20
+ | Which file does what | shallow file tree, one comment per entry |
21
+ | Flow between pieces over time | Mermaid sequence or flow diagram |
22
+ | Steps that branch | ASCII flow with boxes and arrows |
23
+ | What changes in a shape that exists | `diff`, in the shape of the topic |
24
+ | Nothing with a shape | prose — say so, no decorative diagram |
25
+
26
+ Rules:
27
+
28
+ - **Only the parts that answer the question.** Drop the rest of the system.
29
+ - **Real names.** Real paths, functions, state values. `ServiceA → ServiceB` explains nothing.
30
+ - **A diff in the shape of the topic.** A layout change is a file-tree diff; a control-flow change is
31
+ a pseudocode diff. Show the whole block instead when most of it is new.
32
+
33
+ ```text
34
+ on(save)
35
+ if content is unchanged
36
+ return cached result
37
+ write new content
38
+ return fresh result
39
+ ```
40
+
41
+ ```diff
42
+ src/
43
+ ├── commands/
44
+ ├── sessions/
45
+ -└── transport.ts
46
+ +└── transport/
47
+ + ├── client.ts
48
+ + └── stream.ts
49
+ ```
50
+
51
+ ## Step 3 — one HTML page
52
+
53
+ For layout, visual state, a dense comparison, or someone who knows **nothing** about the topic.
54
+
55
+ - One self-contained file. Big pictures first, words second. Inline SVG or plain HTML boxes; no chart
56
+ library. Readable on a phone.
57
+ - The picture carries the idea; the words label it. If the page still makes sense with the text
58
+ removed, it works. A caption per picture, not a paragraph.
59
+ - From zero: everyday objects only, no term before it is shown, and one line at the end on what the
60
+ simplification left out.
61
+ - Inside a product, borrow its colours, type and spacing. Never invent an identity.
62
+
63
+ Shape of a from-zero page:
64
+
65
+ ```text
66
+ one sentence : what this thing is, in words a stranger would use
67
+ big picture 1 : the thing, drawn
68
+ big picture 2 : the thing doing its job, step by step
69
+ one line : the part people get wrong
70
+ one line : what this left out (only if it left something out)
71
+ ```
72
+
73
+ Write it, then open it (`open path/to/explain-<topic>.html`).
74
+
75
+ ## Step 4 — video, only on request
76
+
77
+ An animated explainer (3Blue1Brown style) for something that moves: a process over time, a
78
+ transformation, an algorithm running. It costs time and often an API key (narration, e.g.
79
+ ElevenLabs) or local compute. So:
80
+
81
+ - Offer it in one line. Never build it unasked.
82
+ - On yes, use the catalog's video skill (`remotion-video`). If it is not installed, `suggest` offers it.
83
+
84
+ ## Anti-patterns
85
+
86
+ | Anti-pattern | Do this instead |
87
+ |---|---|
88
+ | Four forms because each adds a little | One form, the smallest that answers |
89
+ | The whole system when asked about one path | Draw the path, drop the rest |
90
+ | A diagram to look thorough | Answer in prose, say there is nothing to draw |
91
+ | Defining a term with two more terms | Show the thing, then name it |
92
+ | Simplifying until it is wrong | Keep it true; name what you dropped |
93
+ | Jumping to the HTML page on the first question | Climb one step per sign |
@@ -1,34 +1,86 @@
1
1
  # Orientation contract
2
2
 
3
- The single definition of how the harness keeps the user oriented. The `orient` skill owns
4
- it; other skills reference this file in a short footer instead of copying it.
3
+ The one definition of how the harness talks to the person. The `orient` skill owns it. Other skills
4
+ point here from a short footer instead of copying it.
5
5
 
6
- ## The rule
6
+ ## Voice: STE, adapted
7
7
 
8
- **No turn ends in seco (dead-end).** Every turn that finishes an action, reaches a fork, or
9
- could leave the user unsure closes with the brújula block.
8
+ STE (Simplified Technical English, ASD-STE100) is the controlled language of aircraft maintenance
9
+ manuals. Its rules are measurable. Apply them about 80%: in the user's language, without the
10
+ 900-word dictionary.
11
+
12
+ | Rule | Limit | Example |
13
+ |---|---|---|
14
+ | One idea per sentence | 1 | "Instalé la skill. Ahora reinicia la sesión." |
15
+ | Sentence length | ≤ 20 words for an instruction, ≤ 25 to describe | — |
16
+ | Paragraph length | ≤ 6 sentences, one topic | — |
17
+ | Active voice | always in instructions | "El test comprueba X", not "X es comprobado" |
18
+ | Instruction first, then the reason | — | "Haz backup. Si no, pierdes los datos." |
19
+ | One word, one meaning | — | Do not call the same thing "skill", "módulo" and "plugin" |
20
+ | Noun stacks | ≤ 3 words | "fichero de perfil", not "fichero de configuración de perfil de usuario" |
21
+ | Warnings | the order first, the risk next | "No borres `.rsc/`. Los hooks dejan de funcionar." |
22
+ | Lists | vertical, for anything with steps or more than 3 items | — |
23
+
24
+ Not STE: soften it when a rule would cost meaning. Precision beats the limit.
25
+
26
+ ## Stand-alone answers
27
+
28
+ The reader did not see your reasoning, your tool output, or your plan. They may have skipped earlier
29
+ messages. So:
30
+
31
+ - Name things. "El arreglo de las rutas con espacio", not "ese arreglo".
32
+ - No back-references the reader cannot resolve: "el segundo commit", "lo de antes", "como dije".
33
+ - A term you introduced three turns ago gets a short gloss again if it matters now.
34
+ - One sentence of context is enough. Never retell the session.
35
+
36
+ Test: could someone read only this message and act on it? If not, add the missing sentence.
37
+
38
+ ## Short
39
+
40
+ - Lead with the answer. Then what the person must do or decide.
41
+ - Cut preambles, recaps of what they said, and summaries of what you just wrote.
42
+ - A table or a list beats a paragraph when there are parallel items.
43
+ - If it does not change what the reader understands or does, delete it.
44
+
45
+ ## Register
46
+
47
+ `technical_level` in `02-DOCS/wiki/harness/user-profile.md` sets the vocabulary:
48
+
49
+ - `technical` — use the precise term directly. No 101 explanations.
50
+ - `non-technical` or `mixed` — plain words. One everyday analogy per new idea: things a person has
51
+ held (keys, boxes, a queue at a counter, a light switch). Never explain an unknown with another
52
+ unknown. When a technical word is unavoidable (a command, a file), say what it does in the same
53
+ sentence.
54
+ - No profile — analogies, and ask once: "¿Te hablo en lenguaje técnico o con analogías?".
55
+
56
+ Simple is never false. If an analogy leaves something important out, say what in one line.
57
+ Simple is never childish: adult tone, no baby talk, no exclamation marks.
58
+
59
+ `accompaniment_level:` and `accompaniment:` (the L0–L3 dial) are retired keys from older profiles. Ignore them.
10
60
 
11
61
  ## The brújula block
12
62
 
63
+ ```text
64
+ 📍 Dónde estás — the state, one sentence that stands alone
65
+ ✅ Qué has hecho — one line, only when something was done
66
+ 🧭 Por qué — one sentence, only when a decision was made
67
+ ➡️ Siguiente — 1-3 concrete options, ending in a question
13
68
  ```
14
- 📍 Dónde estás — the project phase/state (the map)
15
- ✅ Qué acabas de hacer — one line, in the user's language
16
- 🧭 Por qué — the technical why, scaled to the dial
17
- ➡️ Siguiente — 1-3 concrete options, ending in a question. Never in seco.
18
- ```
19
-
20
- ## Calibration (the dial)
21
69
 
22
- Read `02-DOCS/wiki/harness/user-profile.md`. Two fields combine: `accompaniment_level` (L0 | L1 | L2 | L3) sets how deep the block goes; `technical_level` (non-technical | mixed | technical) sets the vocabulary. A profile written by an older `onboard` may carry `accompaniment:` instead — it is the same dial; read it, and write `accompaniment_level` the next time you touch the profile.
70
+ - 📍 and ➡️ every time. ✅ and 🧭 only when they carry something.
71
+ - Each line follows the voice above: one sentence, stands alone.
72
+ - No turn ends in seco: a turn that finishes an action, reaches a fork, or could leave the person
73
+ unsure ends with the block.
74
+ - Outside any artifact. A text meant to be copied (email, post) is separated from the block.
23
75
 
24
- - **L0 — cavernícola:** only `✅` + `➡️`, one option, yes/no question.
25
- - **L1 — breve:** the four lines; one line of why.
26
- - **L2 — explica decisiones:** the four lines; justify the relevant decision; real forks.
27
- - **L3 — acompañamiento total:** the four lines, full why, many orienting questions, each option in plain language.
76
+ ## The ladder
28
77
 
29
- `technical_level` is orthogonal (plain language for `non-technical` even at L0; skip 101s for `technical` even at L3). Missing profile → assume `non-technical` + **L3** and offer to set the dial.
78
+ Text first. One step up per clear sign that the person does not follow, or when they ask for a step.
79
+ Detail → `explain-ladder.md`.
30
80
 
31
81
  ## Division of labor
32
82
 
33
83
  - `orient` guides the **person** (this contract).
34
84
  - `suggest` equips the **session** ("install the missing skill?"). Defer install prompts to it.
85
+ - `unslop` cleans **text that leaves the session** (emails, posts, READMEs): AI tells out, human
86
+ register in.
@@ -120,7 +120,7 @@ This is where parallel work is actually finished. In order:
120
120
 
121
121
  Only after the combined suite is green is the parallel batch done. Hand the merged, green result back to the phase that called you (usually `implement`, heading for `verify`).
122
122
 
123
- **How loud.** Match the accompaniment level in `02-DOCS/wiki/harness/user-profile.md`: it sets how much of the independence reasoning, the frozen contracts, the briefs and the seam check you narrate, and nothing else. At the tersest level you still run the independence test and the combined-suite gate in full — silently, but completely.
123
+ **What to say.** In chat, say only what the reader needs, in the `orient` voice: the partition, any frozen contract, and each reconcile conflict with its fix — one line each. The register (technical or with analogies) comes from `technical_level` in `02-DOCS/wiki/harness/user-profile.md`. However short the report, you still run the independence test and the combined-suite gate in full.
124
124
 
125
125
  ## Anti-patterns → STOP
126
126
 
@@ -32,7 +32,7 @@ should_not_trigger:
32
32
  why: "The red→green→refactor TDD loop lives inside implement; parallel runs several such loops at once but never replaces the discipline within a single unit."
33
33
 
34
34
  capability:
35
- - scenario: "User asks: 'I have four tasks left on the plan: (a) add the users repository, (b) add the invoices repository, (c) add a field to the orders migration, (d) add another field to the same orders migration. They feel independent — fan them out across subagents and merge when done.' (FastAPI stack noted in the plan; accompaniment level L2 in the profile.)"
35
+ - scenario: "User asks: 'I have four tasks left on the plan: (a) add the users repository, (b) add the invoices repository, (c) add a field to the orders migration, (d) add another field to the same orders migration. They feel independent — fan them out across subagents and merge when done.' (FastAPI stack noted in the plan; technical_level: technical in the profile.)"
36
36
  must_include:
37
37
  - "Runs the independence test pairwise and correctly identifies that (c) and (d) touch the SAME orders migration/file, so they are NOT independent and must be one serial unit — not two parallel units"
38
38
  - "Partitions into a valid plan: (a) and (b) as disjoint parallel units, (c)+(d) collapsed into a single serial unit, with the partition written down before dispatch"
@@ -41,4 +41,4 @@ capability:
41
41
  - "Each unit keeps its own red→green→refactor (delegated to implement + the FastAPI testing reference); parallel does not relax the TDD discipline inside a unit"
42
42
  - "Gathers ALL units, checks each against its done-check before merge, then reconciles: merges, resolves conflicts by hand, folds decision logs into 02-DOCS/wiki/sdd/decisions.md"
43
43
  - "Runs the COMBINED suite across the merged result and refuses to call it done on green-in-isolation; if the seam is red, routes to debug rather than guessing"
44
- - "Adapts orchestration verbosity to L2 (shows partition, frozen contracts, and each reconcile conflict with its fix) and hands the green result back to implement → verify"
44
+ - "Reports briefly in technical terms (the partition, frozen contracts, and each reconcile conflict with its fix, one line each) and hands the green result back to implement → verify"
@@ -48,7 +48,7 @@ Pydantic model or a Go method on a struct — it can, because the contract is un
48
48
  3. **The Knowledge map** — `02-DOCS/wiki/index.md` points at `02-DOCS/wiki/stack/*` and prior
49
49
  plans/decisions. Reusing what the project already settled is the difference between a plan and
50
50
  scope drift.
51
- 4. **The dial** — `02-DOCS/wiki/harness/user-profile.md` (see below).
51
+ 4. **The profile** — `technical_level` in `02-DOCS/wiki/harness/user-profile.md` (see below).
52
52
 
53
53
  ## What a plan contains
54
54
 
@@ -95,18 +95,14 @@ phase's default tier is **`heavy`**. Routing is off unless `models.enabled: true
95
95
  `02-DOCS/wiki/sdd/config.yaml`; the resolution order, the announce rule and the model table live in
96
96
  `../sdd/references/model-routing.md`. Routing off or no profile → session model, silently.
97
97
 
98
- ## Adapting to the dial
98
+ ## Talking about the plan
99
99
 
100
- The accompaniment level in `02-DOCS/wiki/harness/user-profile.md` (owned by `../init/SKILL.md`)
101
- changes how much you *say*, never whether a section exists. Even at L0 the plan is complete; it is
102
- just quiet.
103
-
104
- | Level | How `plan` behaves |
105
- | --- | --- |
106
- | **L0** | Terse plan, no narration in chat — write the file, point to it. |
107
- | **L1** | Same artifact, one line of *why* on the top architectural decision. |
108
- | **L2** | Justify each significant design choice in the artifact; surface the trade-offs weighed. |
109
- | **L3** | Walk a non-technical user through the architecture in plain language, define terms inline, and ask about constraints you cannot infer — one focused question at a time. |
100
+ The artifact is complete regardless of who reads it: every section, each significant design choice
101
+ justified with the trade-offs weighed. In chat, say only what the reader needs, in the `orient`
102
+ voice: point to the file and give one line of *why* on the top architectural decision. The register
103
+ comes from `technical_level` in `02-DOCS/wiki/harness/user-profile.md` (set by `../init/SKILL.md`):
104
+ for a `non-technical` reader, explain the architecture with an everyday analogy and define each term
105
+ inline. Ask only about constraints you cannot infer.
110
106
 
111
107
  ## Anti-patterns
112
108
 
@@ -124,7 +120,7 @@ just quiet.
124
120
  ## Always propose isolation before the build
125
121
 
126
122
  Once the plan is written, **always propose isolating the work in a git worktree/branch** before any
127
- code is implemented — every feature, not just the risky ones. One line, calibrated to the dial:
123
+ code is implemented — every feature, not just the risky ones. One line:
128
124
 
129
125
  > *"Antes de implementar, ¿aíslo este trabajo en un worktree/rama propia (`../worktrees/SKILL.md`)
130
126
  > para no tocar tu rama actual? (recomendado)"*
@@ -24,7 +24,7 @@ The discipline is the same in both directions: **every finding and every rebutta
24
24
 
25
25
  1. `02-DOCS/wiki/sdd/specs/<slug>.md` and `02-DOCS/wiki/sdd/plans/<slug>.md` — what the diff was *supposed* to do. A review with no spec is a review of vibes.
26
26
  2. `02-DOCS/wiki/sdd/constitution.md` — the project's non-negotiables (stack canon, quality bars, conventions). Constitution violations are findings even when the code "works".
27
- 3. `02-DOCS/wiki/harness/user-profile.md` — the accompaniment dial (see "Narration dial" below).
27
+ 3. `02-DOCS/wiki/harness/user-profile.md` — `technical_level`, the register (see "How a review reads" below).
28
28
 
29
29
  If there is no spec/plan (someone jumped straight to code), say so and review against the constitution + the diff's own stated intent. Don't pretend a spec exists.
30
30
 
@@ -247,18 +247,15 @@ When you've processed the review, summarize for the reviewer (and the decisions
247
247
  | "I'll approve it, the issues are minor" | If they're truly minor, label them nits and approve. If they block, don't approve. No mushy middle. |
248
248
  | "No spec, so I'll just eyeball it" | Say there's no spec and review against the constitution + stated intent. Don't fake a baseline. |
249
249
 
250
- ## Narration dial
250
+ ## How a review reads
251
251
 
252
- Read the level from `02-DOCS/wiki/harness/user-profile.md`. It changes what a review *shows*, never its rigor — every level runs the same passes and the same evidence bar. No profile → default L2 and proceed; don't stall a review to ask for a dial setting.
252
+ Read `technical_level` from `02-DOCS/wiki/harness/user-profile.md`. It changes the words, never the rigor — every reader gets the same passes and the same evidence bar. No profile → use analogies and proceed; don't stall a review to ask.
253
253
 
254
- - **L0** — verdict + the blocker list, terse. `CHANGES REQUESTED: 1 blocker (auth, documents.py:42), 1 nit. Fix the auth scope and re-run verify.`
255
- - **L1** — each finding gets its one-line *why*.
256
- - **L2** — full finding format (where/why/repro/fix); explain why each blocker blocks.
257
- - **L3** — the above plus teaching: name the defect class (IDOR, N+1, TOCTOU), why the boundary matters, and how to not reintroduce it. For non-technical authors, translate the impact ("any logged-in person could read everyone else's documents").
254
+ In the `orient` voice: the verdict first, then the blocker list — e.g. `CHANGES REQUESTED: 1 blocker (auth, documents.py:42), 1 nit. Fix the auth scope and re-run verify.` Each finding keeps its full format (where/why/repro/fix) and names its defect class (IDOR, N+1, TOCTOU). For a `non-technical` author, translate the impact ("any logged-in person could read everyone else's documents").
258
255
 
259
256
  ## Model tier — `heavy` (opt-in routing)
260
257
 
261
- This phase's default model tier is **`heavy`** — adversarial diff reading is where the strongest model pays off most. Routing is **off** unless `models.enabled: true` in `02-DOCS/wiki/sdd/config.yaml`. When on: resolve this phase's tier (`models.overrides` wins over `models.phases`), map it to a model via `models.tiers`, and apply per `../sdd/references/model-routing.md` — announce the switch per the narration dial when it differs from the session model, and dispatch any `Task`/`parallel` subagents on that model. Routing off or no profile → honor the session model silently. Never fake a switch a tool can't make; skip routing on a one-line change.
258
+ This phase's default model tier is **`heavy`** — adversarial diff reading is where the strongest model pays off most. Routing is **off** unless `models.enabled: true` in `02-DOCS/wiki/sdd/config.yaml`. When on: resolve this phase's tier (`models.overrides` wins over `models.phases`), map it to a model via `models.tiers`, and apply per `../sdd/references/model-routing.md` — announce the switch in one line when it differs from the session model, and dispatch any `Task`/`parallel` subagents on that model. Routing off or no profile → honor the session model silently. Never fake a switch a tool can't make; skip routing on a one-line change.
262
259
 
263
260
  ## Where this writes
264
261
 
@@ -119,4 +119,4 @@ Output the roast report as formatted markdown.
119
119
 
120
120
  ## Orientación (siempre)
121
121
 
122
- Cierra cada turno con el **bloque-brújula** (📍 dónde estás · ✅ qué hiciste · 🧭 por qué · ➡️ siguiente, terminando en pregunta), calibrado al dial de `02-DOCS/wiki/harness/user-profile.md`. **Nunca termines en seco.** Protocolo completo: skill `orient` → `skills/orient/references/orientation-contract.md`. (Defiere a `suggest` el "¿instalo la skill que falta?".)
122
+ Habla con la voz de `orient`: frases cortas, una idea por frase, y cada respuesta se entiende sola. Registro técnico o con analogías según `technical_level` en `02-DOCS/wiki/harness/user-profile.md`. Cierra cada turno con el **bloque-brújula** (📍 dónde estás · ➡️ siguiente, terminando en pregunta; ✅ y 🧭 cuando hay algo hecho o decidido). **Nunca termines en seco.** Protocolo completo: skill `orient` → `skills/orient/references/orientation-contract.md`. (Defiere a `suggest` el "¿instalo la skill que falta?".)
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: sdd
3
- description: "Use when you want a disciplined, spec-driven path from a feature idea to shipped, verified software — the SDD dispatcher and front door, in any language. States the method, reads the accompaniment dial from 02-DOCS, and routes to the right phase: constitution -> specify -> clarify -> plan -> tasks -> analyze -> implement -> verify -> review -> ship, with debug / worktrees / parallel on demand. Use it to start a feature, to govern the whole flow, or when unsure which phase you are in. NOT a single phase itself (it dispatches), NOT the workspace harness (that is `harness`), NOT a stack build skill."
3
+ description: "Use when you want a disciplined, spec-driven path from a feature idea to shipped, verified software — the SDD dispatcher and front door, in any language. States the method, reads the user's register from 02-DOCS, and routes to the right phase: constitution -> specify -> clarify -> plan -> tasks -> analyze -> implement -> verify -> review -> ship, with debug / worktrees / parallel on demand. Use it to start a feature, to govern the whole flow, or when unsure which phase you are in. NOT a single phase itself (it dispatches), NOT the workspace harness (that is `harness`), NOT a stack build skill."
4
4
  tags: [sdd, spec, workflow, plan]
5
5
  recommends: [sdd-init, constitution, specify]
6
6
  profiles: [core, full]
@@ -13,7 +13,7 @@ origin: risco
13
13
 
14
14
  `sdd` is the **engineering counterpart of the `harness`**. The harness runs the chaos → knowledge loop (inbox → `02-DOCS` wiki). `sdd` runs the **intent → shipped software** loop, and it writes the artifacts of that loop — constitution, specs, plans, decisions — into the same `02-DOCS/wiki/sdd/` so the project's knowledge grows with every feature instead of leaking into chat history.
15
15
 
16
- This skill does **not** do a phase itself. It is the dispatcher: it names the method, reads how much accompaniment you want, tells you which phase you are in, and hands off to the phase skill that owns the work. Each phase skill, when it finishes, points you at the next one — so once you enter the chain you rarely come back here.
16
+ This skill does **not** do a phase itself. It is the dispatcher: it names the method, reads which register you want (technical or with analogies), tells you which phase you are in, and hands off to the phase skill that owns the work. Each phase skill, when it finishes, points you at the next one — so once you enter the chain you rarely come back here.
17
17
 
18
18
  ## The method in one breath
19
19
 
@@ -117,20 +117,16 @@ to `02-DOCS/wiki/sdd/` as it goes, so the work stays reviewable after the fact.
117
117
  - **A hard failure** it can't resolve (a red test it can't green → `debug`; an `analyze` contradiction).
118
118
  - **Destructive / irreversible / outward-facing actions** — push, merge, delete, secrets. `ship` (PR/merge) still confirms: autopilot drives the **build**, not the **release**.
119
119
 
120
- Run the fan-out on the `developer` subagent as usual, and narrate at the accompaniment dial's volume (L0: near-silent, just show artifacts; L3: explain each phase as it passes). Autopilot changes **when you ask**, never **what gets written** — every artifact and gate-check still happens; you just don't block on a human between them.
120
+ Run the fan-out on the `developer` subagent as usual, and narrate in the `orient` voice: name each phase as it passes and show its artifact, one line each. Autopilot changes **when you ask**, never **what gets written** — every artifact and gate-check still happens; you just don't block on a human between them.
121
121
 
122
- ## Read the accompaniment dial first
122
+ ## Read the register first
123
123
 
124
- Before dispatching, read `02-DOCS/wiki/harness/user-profile.md` and adapt — exactly as every rsc skill does. The dial sets **how much you explain and how many questions you ask at each gate**, not whether the gates exist.
124
+ Before dispatching, read `technical_level` in `02-DOCS/wiki/harness/user-profile.md` — exactly as every rsc skill does. It picks the register (technical terms, or plain words with analogies); it never changes whether the gates exist. Speak in the `orient` voice:
125
125
 
126
- | Level | At each phase | At gates (clarify / analyze / decisions) |
127
- | --- | --- | --- |
128
- | **L0** "cavernícola" | Name the phase, do it, show the artifact. Minimal prose. | Ask only the questions that actually change the outcome. |
129
- | **L1** "breve" | One line of *why this phase now*. | One-line rationale per question. |
130
- | **L2** "explica decisiones" | Justify each significant choice as you go. | Walk the trade-offs before the user picks. |
131
- | **L3** "acompañamiento total" | Explain the phase, why it matters, what it produces. | Ask broadly, teach the SDD reasoning, narrate every decision. |
126
+ - **At each phase:** name the phase, give one line of *why this phase now*, do it, show the artifact.
127
+ - **At gates** (clarify / analyze / decisions): ask only the questions that actually change the outcome, each with its trade-off and a recommendation.
132
128
 
133
- If there is no profile yet, default to **non-technical + ask the two harness gauging questions** (technical level, accompaniment level) before dispatching, and persist them — that is the harness's job and `sdd` honors it.
129
+ If there is no profile yet, use analogies and ask once **"technical or with analogies?"** before dispatching, and persist the answer — that is `init`'s job and `sdd` honors it.
134
130
 
135
131
  ## Per-phase model routing (opt-in)
136
132
 
@@ -144,7 +140,7 @@ execution, light on ship/worktrees/sdd-init).
144
140
  It is **off by default** (`models.enabled: false`). When the user opts in, each phase applies it
145
141
  two ways: **programmatically** — dispatching `Task`/`parallel` subagents on the tier's model
146
142
  (real routing, e.g. Claude Code) — and **advisorily** — announcing the recommended switch at the
147
- phase boundary, gated by the accompaniment dial, for inline work and assistants that can't switch
143
+ phase boundary, in one line, for inline work and assistants that can't switch
148
144
  programmatically. Never switch unasked, never claim a switch a tool can't make, and skip routing
149
145
  on trivial one-line changes. The `sdd` dispatcher itself never routes (staying on the session
150
146
  model); `parallel` has no fixed tier (each unit inherits the tier of its work). Full protocol,
@@ -234,7 +230,7 @@ Include current phase, active artifacts, last verdict, completed tasks, next ste
234
230
  | "I get the feature, I'll just start coding." | That is the failure SDD prevents. At minimum write the spec; the artifact is the contract. |
235
231
  | "`sdd` should write the spec itself." | No. `sdd` dispatches. Invoke `specify` — it owns the spec and asks the right questions. |
236
232
  | "Clarify and analyze are bureaucracy, skip them." | Skipped gates are where drift hides. Run them; only pass through if the change is genuinely trivial and you say so. |
237
- | "Profile says L0, so I'll skip the gates to be terse." | L0 changes verbosity, not the method. Fewer words, same gates. |
233
+ | "The user wants it short, so I'll skip the gates to be terse." | Short changes the words, not the method. Fewer words, same gates. |
238
234
  | "I'll keep the plan in chat, it's faster." | Chat is not durable. Write it under `02-DOCS/wiki/sdd/` or the next session is blind. |
239
235
  | "I'll skip `sdd-init`; I remember the test command." | The runtime contract belongs in `config.yaml`, not memory. |
240
236
  | "I'll load every skill into the subagent." | That contaminates context. Use registry -> selected paths -> compact rules. |
@@ -48,8 +48,8 @@ the skill — or these rubrics — needs work.
48
48
  - This is **LLM-as-judge / human-in-the-loop**, not deterministic. Use a consistent grader
49
49
  (same model + rubric) across A/B to keep the comparison fair.
50
50
  - The headline differentiators for `sdd`: it **dispatches, it does not perform a phase**; it
51
- states the method ("the artifact is the contract"), reads the **accompaniment dial** and
52
- adapts verbosity (not the gates), presents the **chained phase map**, applies the **invoke
51
+ states the method ("the artifact is the contract"), reads the **register** (`technical_level`)
52
+ and speaks in the orient voice (never skipping gates), presents the **chained phase map**, applies the **invoke
53
53
  rule** and the **skip rules** honestly, and writes artifacts under `02-DOCS/wiki/sdd/`.
54
54
  - Key confusables to watch: "write the spec" is `specify`, not `sdd`; "set the principles" is
55
55
  `constitution`; "open the PR" is `ship`; "build 01-TOOLS/02-DOCS" is `harness`. If the agent
@@ -1,7 +1,7 @@
1
1
  skill: sdd
2
2
 
3
3
  # Cases for the rsc-sdd "sdd" dispatcher / front door.
4
- # sdd states the SDD method, reads the accompaniment dial from
4
+ # sdd states the SDD method, reads the user's register (technical_level) from
5
5
  # 02-DOCS/wiki/harness/user-profile.md, and ROUTES to the right phase skill in
6
6
  # the chain constitution -> specify -> clarify -> plan -> tasks -> analyze ->
7
7
  # implement -> verify -> review -> ship (debug/worktrees/parallel on demand).
@@ -61,10 +61,10 @@ should_not_trigger:
61
61
  why: "A concrete stack build with a named framework is the nextjs stack skill. sdd is process, not stack; it would defer build specifics to nextjs rather than fire itself."
62
62
 
63
63
  capability:
64
- - scenario: "A developer at accompaniment level L1 says: 'I've got a rough idea for a feature and I want to build it the spec-driven way, end to end. Where do I begin?' Show how the dispatcher opens the engagement."
64
+ - scenario: "A developer whose profile says technical_level: technical says: 'I've got a rough idea for a feature and I want to build it the spec-driven way, end to end. Where do I begin?' Show how the dispatcher opens the engagement."
65
65
  must_include:
66
66
  - "States the SDD method in brief: decide what & why before how, write it down, each artifact gates the next ('the artifact is the contract')"
67
- - "Reads (or notes it should read) 02-DOCS/wiki/harness/user-profile.md for the accompaniment dial and, at L1, gives a one-line why per step rather than long explanations"
67
+ - "Reads (or notes it should read) technical_level from 02-DOCS/wiki/harness/user-profile.md and, being technical, uses technical terms directly with a one-line why per step rather than long explanations or analogies"
68
68
  - "Presents the chained phase map: sdd-init -> constitution -> proposal? -> specify -> clarify -> plan -> tasks -> analyze -> implement -> verify -> review -> ship -> archive, with debug/worktrees/parallel on demand"
69
69
  - "Includes sdd-init as step zero when 02-DOCS/wiki/sdd/config.yaml is missing, and explains that it detects test commands, strict TDD and .rsc/skill-registry.json"
70
70
  - "Applies the invoke rule: a fuzzy idea with no spec on disk routes to specify (and notes constitution runs once per project if not yet present)"
@@ -85,6 +85,6 @@ capability:
85
85
  - "Names the three tiers — heavy (deep reasoning), balanced (execution), light (mechanical) — and that each phase has a default tier"
86
86
  - "States the default quality-biased mapping: heavy on constitution/plan/analyze/review/debug, balanced on specify/clarify/tasks/implement/verify, light on ship/worktrees/sdd-init"
87
87
  - "Says routing is OFF by default (models.enabled:false) and lives in the models block of 02-DOCS/wiki/sdd/config.yaml, written by sdd-init; turning it on is the user's choice"
88
- - "Explains the two application layers: programmatic (dispatching Task/parallel subagents on the tier's model, e.g. Claude Code) and advisory (announcing the recommended switch at the phase boundary, gated by the accompaniment dial)"
88
+ - "Explains the two application layers: programmatic (dispatching Task/parallel subagents on the tier's model, e.g. Claude Code) and advisory (announcing the recommended switch at the phase boundary, in one line)"
89
89
  - "Is honest about limits: never switches unasked, never claims a model switch an assistant cannot make, and skips routing on trivial one-line changes"
90
90
  - "Points to references/model-routing.md for the full protocol, per-assistant mechanism, and provider→model table rather than inventing model names inline"
@@ -92,7 +92,7 @@ The user owns this. They change a phase by adding it to `models.overrides` (e.g.
92
92
 
93
93
  ## How a phase applies the profile (the procedure)
94
94
 
95
- Run this at the start of any SDD phase, after reading the accompaniment dial:
95
+ Run this at the start of any SDD phase, after reading the user profile:
96
96
 
97
97
  1. **Read** `models` from `02-DOCS/wiki/sdd/config.yaml`. If the block is absent or
98
98
  `enabled: false` → **do nothing**: honor the session model, say nothing about models.
@@ -106,7 +106,7 @@ Run this at the start of any SDD phase, after reading the accompaniment dial:
106
106
  model and is the most reliable application — prefer it.
107
107
  - **Advisory (all assistants, inline work).** If the resolved model differs from the current
108
108
  session model and the work isn't being delegated, **announce** it at the phase boundary,
109
- gated by the accompaniment dial (below), and give the switch command for the active
109
+ in one line (below), and give the switch command for the active
110
110
  assistant (mechanism table below). Never block — the human may decline and continue.
111
111
  5. **Skip routing entirely** for a one-line / trivial change, exactly as the SDD skip rule says
112
112
  for the rest of the chain. Ceremony serves shipping, not the other way around.
@@ -114,16 +114,9 @@ Run this at the start of any SDD phase, after reading the accompaniment dial:
114
114
  Log it to `02-DOCS/wiki/sdd/decisions.md` only when the choice actually mattered (e.g. you
115
115
  overrode a tier for a hard plan) — not on every phase.
116
116
 
117
- ### Announcement volume by accompaniment dial
117
+ ### How to announce a switch
118
118
 
119
- The dial controls how loudly you announce a switch; it never changes whether routing happens.
120
-
121
- | Level | On a model switch you… |
122
- | --- | --- |
123
- | **L0** "cavernícola" | Switch/dispatch silently. One short line only if the user must act (e.g. "para esta fase conviene opus: `/model opus`"). |
124
- | **L1** "breve" | One line: which tier/model and the one-word why. |
125
- | **L2** "explica decisiones" | Name the tier, the model, and why this phase warrants it; give the switch command. |
126
- | **L3** "acompañamiento total" | Explain the tier system as it applies here, the cost/quality trade-off, and how to override in config. |
119
+ Announcing never changes whether routing happens. A programmatic dispatch is silent. When the user must act, say it in one line, in the `orient` voice: the tier, the model, the one-word why, and the switch command (e.g. "para esta fase conviene opus: `/model opus`"). Explain the tier system or how to override it in config only when the user asks.
127
120
 
128
121
  ## Per-assistant switch mechanism
129
122
 
@@ -194,7 +187,7 @@ tier you didn't use.
194
187
  | --- | --- |
195
188
  | "Routing sounds good, I'll switch models even though the user never enabled it." | It's opt-in. `enabled: false` (and a missing block) means honor the session model and say nothing. |
196
189
  | "I'll tell the user I switched to Opus." (on an assistant with no programmatic switch) | You can't switch there. Announce the tier and the command; never claim a switch you didn't make. |
197
- | "L0 means terse, so I'll skip routing." | L0 changes words, not behavior. Route the same; just announce silently (or only when the user must act). |
190
+ | "The user wants it short, so I'll skip routing." | Short changes words, not behavior. Route the same; announce only when the user must act. |
198
191
  | "It's a one-line typo fix but the phase is `review`, so → heavy." | Skip routing on trivial changes, like the rest of the chain. Don't spin up the expensive model for a copy tweak. |
199
192
  | "I'll log the model on every phase." | Log to `decisions.md` only when the model choice mattered. The envelope `model` field already records the routine case. |
200
193
  | "config has no `models` block, I'll assume the defaults are active." | A missing block means routing is **off**. Defaults describe what `sdd-init` *writes*, not an implicit on-state. |
@@ -23,14 +23,14 @@ Read-only first:
23
23
 
24
24
  - `package.json`, lockfiles, `pnpm-workspace.yaml`, `pyproject.toml`, `requirements.txt`, `go.mod`, `pubspec.yaml`, `Dockerfile`, `.github/`.
25
25
  - Existing `02-DOCS/wiki/sdd/config.yaml`, if present.
26
- - `02-DOCS/wiki/harness/user-profile.md`, if present, for accompaniment level only.
26
+ - `02-DOCS/wiki/harness/user-profile.md`, if present, for `technical_level` (the register) only.
27
27
  - `.rsc/skill-registry.json`, if present, to decide whether it is stale or missing.
28
28
 
29
29
  If `02-DOCS/` does not exist, create only the `02-DOCS/wiki/sdd/` path needed for the config. Do not run full harness scaffolding unless the user asked for `harness`.
30
30
 
31
31
  ## Preflight Choices
32
32
 
33
- Ask only when the answer changes behavior; let the accompaniment level in the profile set how much you explain each trade-off.
33
+ Ask only when the answer changes behavior; explain each trade-off in one line, in the register `technical_level` sets.
34
34
 
35
35
  | Setting | Default | Options |
36
36
  | --- | --- | --- |
@@ -77,7 +77,7 @@ Later phases use it as a cheap index — id, trigger, tags, path, installed/avai
77
77
  Calibration is the moment to make sure the relevant skills are actually present, not just indexed. Detect → propose → install:
78
78
 
79
79
  1. **Detect what this repo needs.** Use the stack you just detected, or ask the CLI: `npx @ericrisco/rsc consult "<one line: stack + what we're building>"`. Map signals to skills — e.g. `next`→`nextjs`+`design`, `go.mod`→`go`, FastAPI→`fastapi`, `*.sql`/Prisma→`postgresdb`/`prisma-orm`, Stripe→`stripe`, Dockerfile/CI→`docker`/`github-actions`, tests→`testing-*`/`e2e-testing`. The SDD phase skills (`specify`…`ship`) should already be present from `--profile core`; install any that are missing.
80
- 2. **Show the shortlist + confirm.** List the skills with a one-line *why* each, matched to the accompaniment dial, and get a one-word confirm before touching their environment.
80
+ 2. **Show the shortlist + confirm.** List the skills with a one-line *why* each, in the user's register, and get a one-word confirm before touching their environment.
81
81
  3. **Install them yourself.** You have a terminal — run it via Bash:
82
82
  ```bash
83
83
  npx @ericrisco/rsc add <skill> [<skill> ...]
@@ -35,7 +35,7 @@ git log -1 --format='%an <%ae>%n%n%b' | grep -iE 'co-authored-by.*(claude|anthro
35
35
 
36
36
  ## Read these first
37
37
 
38
- 1. `02-DOCS/wiki/harness/user-profile.md` — the accompaniment dial (L0..L3). It sets narration only, never whether you run the safety checklist.
38
+ 1. `02-DOCS/wiki/harness/user-profile.md` — `technical_level`, the register. It sets the words only, never whether you run the safety checklist.
39
39
  2. The **review verdict** for this branch — ship runs only on `APPROVE` or `APPROVE WITH NITS`. `CHANGES REQUESTED` loops back to `implement`, not forward to ship. If there is no verdict on record, say so and treat it as a red flag: do not ship a diff that skipped `../review/SKILL.md` — offer to run it first.
40
40
  3. `02-DOCS/wiki/sdd/decisions.md` and the spec/plan slug — so the commit message and PR body describe *what shipped against which spec*, not a vague "various changes".
41
41
 
@@ -85,7 +85,7 @@ was reviewed, never that the review was any good.
85
85
 
86
86
  ## The three landing options — always present exactly three
87
87
 
88
- This mirrors the harness "siempre 3 opciones" pattern. Gather the one fact that changes the answer (does this repo use PRs / require review on `main`?), then present **exactly three** with an honest recommendation matched to the workflow and the accompaniment level.
88
+ This mirrors the harness "siempre 3 opciones" pattern. Gather the one fact that changes the answer (does this repo use PRs / require review on `main`?), then present **exactly three** with an honest recommendation matched to the workflow, in the user's register.
89
89
 
90
90
  | Option | What it does | Choose it when |
91
91
  | --- | --- | --- |
@@ -201,16 +201,11 @@ The commit is the durable record. Make it describe the change and tie it to the
201
201
 
202
202
  Closing the branch (PR / merge / cleanup) is mechanical, so this phase's default tier is **`light`**. Routing is **off** unless `models.enabled: true` in `02-DOCS/wiki/sdd/config.yaml`; when it is on, follow `../sdd/references/model-routing.md` for resolving and announcing the switch rather than from memory. Routing off or no profile → honor the session model silently, and skip routing on a one-line change. The Eric-only authorship rule is independent of the model and never relaxes.
203
203
 
204
- ## Accompaniment dial (L0..L3)
204
+ ## What ship shows
205
205
 
206
- Read the level from `02-DOCS/wiki/harness/user-profile.md`. It changes what you show, **never** the safety checklist or the authorship rule. No profile → default to L2 and proceed; don't stall the ship to ask for a dial setting.
206
+ Read `technical_level` from `02-DOCS/wiki/harness/user-profile.md`. It changes the words, **never** the safety checklist or the authorship rule. No profile → use analogies and proceed; don't stall the ship to ask.
207
207
 
208
- | Level | What ship shows |
209
- | --- | --- |
210
- | **L0** | Checklist run silently, recommended option in one line, execute on a yes: `Clean, rebased, authorship Eric. Recommend PR (main is protected). Open it?` |
211
- | **L1** | The three options as one-liners, with the recommendation and its *why*. |
212
- | **L2** | The full options table, the checklist results, and why the recommended option fits this repo's workflow. |
213
- | **L3** | L2 plus teaching, framed for a non-technical owner: what fast-forward vs `--no-ff` does to history, why a protected `main` wants a PR ("asking permission before changing the shared copy"), what squashing trades away. |
208
+ In the `orient` voice: the checklist result in one line, the three options as one-liners, the recommendation and its *why*, then execute on a yes — e.g. `Clean, rebased, authorship Eric. Recommend PR (main is protected). Open it?`. For a `non-technical` owner, explain the recommended option with an analogy: a protected `main` wants a PR ("asking permission before changing the shared copy"). Explain fast-forward vs `--no-ff` or what squashing trades away only when asked.
214
209
 
215
210
  ## Anti-patterns → STOP
216
211
 
@@ -268,4 +263,4 @@ Ship is the end of the SDD loop for a feature. Two onward paths: the merged code
268
263
 
269
264
  ## Orientación (siempre)
270
265
 
271
- Cierra cada turno con el **bloque-brújula** (📍 dónde estás · ✅ qué hiciste · 🧭 por qué · ➡️ siguiente, terminando en pregunta), calibrado al dial de `02-DOCS/wiki/harness/user-profile.md`. **Nunca termines en seco.** Protocolo completo: skill `orient` → `skills/orient/references/orientation-contract.md`. (Defiere a `suggest` el "¿instalo la skill que falta?".)
266
+ Habla con la voz de `orient`: frases cortas, una idea por frase, y cada respuesta se entiende sola. Registro técnico o con analogías según `technical_level` en `02-DOCS/wiki/harness/user-profile.md`. Cierra cada turno con el **bloque-brújula** (📍 dónde estás · ➡️ siguiente, terminando en pregunta; ✅ y 🧭 cuando hay algo hecho o decidido). **Nunca termines en seco.** Protocolo completo: skill `orient` → `skills/orient/references/orientation-contract.md`. (Defiere a `suggest` el "¿instalo la skill que falta?".)
@@ -98,4 +98,4 @@ Stop when another edit would trade one defensible style for another without lowe
98
98
 
99
99
  ## Orientación (siempre)
100
100
 
101
- Cierra cada turno con el **bloque-brújula** (📍 dónde estás · ✅ qué hiciste · 🧭 por qué · ➡️ siguiente, terminando en pregunta), calibrado al dial de `02-DOCS/wiki/harness/user-profile.md`. **Nunca termines en seco.** Protocolo completo: skill `orient` → `skills/orient/references/orientation-contract.md`. (Defiere a `suggest` el “¿instalo la skill que falta?”.)
101
+ Habla con la voz de `orient`: frases cortas, una idea por frase, y cada respuesta se entiende sola. Registro técnico o con analogías según `technical_level` en `02-DOCS/wiki/harness/user-profile.md`. Cierra cada turno con el **bloque-brújula** (📍 dónde estás · ➡️ siguiente, terminando en pregunta; ✅ y 🧭 cuando hay algo hecho o decidido). **Nunca termines en seco.** Protocolo completo: skill `orient` → `skills/orient/references/orientation-contract.md`. (Defiere a `suggest` el "¿instalo la skill que falta?".)
@@ -46,7 +46,7 @@ Then, in this order and never skipping ahead:
46
46
  4. **Nothing covers it** → one sentence at the end of the work: the procedure you saw, and whether it fits as a skill or an agent. Then stop; the user decides. Their "no" ends it for this procedure for the rest of the session.
47
47
  5. **Record it either way** — `npx @ericrisco/rsc capabilities gap-log --procedure "<what YOU observed doing>" --verdict <covered-installed|covered-catalog|covered-agent|proposed-accepted|proposed-declined>`.
48
48
 
49
- **Scale the sentence to the dial**, never whether it appears. Read the accompaniment level in `02-DOCS/wiki/harness/user-profile.md`: at L0/L1 it is one dry line ("this looked like a procedure — worth a skill?"); at L2/L3 add why it qualified and what the skill-vs-agent difference means for them. A profile that asked for brevity still gets the observation, just not the essay.
49
+ **One sentence, always.** In the `orient` voice: one line ("this looked like a procedure — worth a skill?") plus why it qualified. Explain the skill-vs-agent difference only if the user asks; for a `non-technical` reader (`technical_level` in `02-DOCS/wiki/harness/user-profile.md`), use an analogy. Brevity never removes the observation.
50
50
 
51
51
  **The privacy boundary is yours to hold**, not the command's — it validates shape and nothing else, and it cannot tell your description from a paraphrase of the request. `--procedure` carries *your* account of the work you did. Never the user's words. The test: if the line could be reconstructed from what they typed, it does not belong in the log.
52
52
 
@@ -105,4 +105,4 @@ Do not use this skill as a reason to delay reversible work indefinitely. If a pr
105
105
 
106
106
  ## Orientación (siempre)
107
107
 
108
- Cierra cada turno con el **bloque-brújula** (📍 dónde estás · ✅ qué hiciste · 🧭 por qué · ➡️ siguiente, terminando en pregunta), calibrado al dial de `02-DOCS/wiki/harness/user-profile.md`. **Nunca termines en seco.** Protocolo completo: skill `orient` → `skills/orient/references/orientation-contract.md`. (Defiere a `suggest` el “¿instalo la skill que falta?”.)
108
+ Habla con la voz de `orient`: frases cortas, una idea por frase, y cada respuesta se entiende sola. Registro técnico o con analogías según `technical_level` en `02-DOCS/wiki/harness/user-profile.md`. Cierra cada turno con el **bloque-brújula** (📍 dónde estás · ➡️ siguiente, terminando en pregunta; ✅ y 🧭 cuando hay algo hecho o decidido). **Nunca termines en seco.** Protocolo completo: skill `orient` → `skills/orient/references/orientation-contract.md`. (Defiere a `suggest` el "¿instalo la skill que falta?".)