@ericrisco/rsc 2.0.19 → 2.1.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 (93) hide show
  1. package/README.md +40 -17
  2. package/manifest.json +18 -85
  3. package/package.json +9 -1
  4. package/scripts/consult.js +8 -8
  5. package/scripts/doctor.js +8 -2
  6. package/scripts/install-apply.js +40 -11
  7. package/scripts/lib/default-skill-floor.js +5 -4
  8. package/scripts/lib/divergence.js +7 -3
  9. package/scripts/lib/domains.js +2 -2
  10. package/scripts/lib/onboarding-apply.js +43 -26
  11. package/scripts/lib/onboarding.js +5 -5
  12. package/scripts/lib/recommend.js +1 -1
  13. package/scripts/lib/repair.js +4 -2
  14. package/scripts/lib/retired-skills.js +20 -0
  15. package/scripts/rsc.js +25 -19
  16. package/scripts/skill-behavior-rubric.md +1 -1
  17. package/scripts/skill-migration-brief.md +3 -3
  18. package/skills/analyze/SKILL.md +3 -8
  19. package/skills/analyze/evals/cases.yaml +1 -1
  20. package/skills/author-skill/SKILL.md +3 -3
  21. package/skills/author-skill/evals/cases.yaml +1 -1
  22. package/skills/author-skill/references/rsc-conventions.md +1 -1
  23. package/skills/clarify/SKILL.md +7 -14
  24. package/skills/clarify/evals/cases.yaml +2 -2
  25. package/skills/code-review/SKILL.md +1 -1
  26. package/skills/constitution/SKILL.md +10 -13
  27. package/skills/constitution/evals/cases.yaml +3 -3
  28. package/skills/continuous-learning/SKILL.md +1 -1
  29. package/skills/continuous-learning/evals/cases.yaml +1 -1
  30. package/skills/debug/SKILL.md +8 -12
  31. package/skills/debug/evals/cases.yaml +1 -1
  32. package/skills/decision-challenge/SKILL.md +1 -1
  33. package/skills/deprecation/SKILL.md +1 -1
  34. package/skills/ftd/SKILL.md +1 -3
  35. package/skills/ftd/evals/cases.yaml +1 -1
  36. package/skills/harness/SKILL.md +10 -9
  37. package/skills/harness/references/claude-md-template.md +1 -1
  38. package/skills/harness/references/wiki-protocol.md +5 -6
  39. package/skills/idea-refinement/SKILL.md +1 -1
  40. package/skills/implement/SKILL.md +14 -18
  41. package/skills/implement/evals/cases.yaml +1 -1
  42. package/skills/init/SKILL.md +26 -44
  43. package/skills/init/evals/README.md +3 -3
  44. package/skills/init/evals/cases.yaml +7 -7
  45. package/skills/init/references/accompaniment-and-profile.md +22 -40
  46. package/skills/init/references/discovery.md +2 -2
  47. package/skills/init/references/recommend-skills.md +5 -5
  48. package/skills/init/scripts/verify.sh +3 -7
  49. package/skills/knowledge-ops/SKILL.md +1 -1
  50. package/skills/orient/SKILL.md +52 -41
  51. package/skills/orient/evals/README.md +11 -9
  52. package/skills/orient/evals/cases.yaml +39 -29
  53. package/skills/orient/references/explain-ladder.md +93 -0
  54. package/skills/orient/references/orientation-contract.md +70 -18
  55. package/skills/parallel/SKILL.md +1 -1
  56. package/skills/parallel/evals/cases.yaml +2 -2
  57. package/skills/plan/SKILL.md +9 -13
  58. package/skills/review/SKILL.md +5 -8
  59. package/skills/roast-me/SKILL.md +1 -1
  60. package/skills/sdd/SKILL.md +10 -14
  61. package/skills/sdd/evals/README.md +2 -2
  62. package/skills/sdd/evals/cases.yaml +4 -4
  63. package/skills/sdd/references/model-routing.md +5 -12
  64. package/skills/sdd-init/SKILL.md +3 -3
  65. package/skills/ship/SKILL.md +6 -11
  66. package/skills/simplify-code/SKILL.md +1 -1
  67. package/skills/skill-scout/SKILL.md +1 -1
  68. package/skills/source-grounded-development/SKILL.md +1 -1
  69. package/skills/specify/SKILL.md +13 -14
  70. package/skills/specify/evals/cases.yaml +1 -1
  71. package/skills/specify/references/eliciting-requirements.md +5 -5
  72. package/skills/suggest/SKILL.md +3 -9
  73. package/skills/suggest/evals/cases.yaml +1 -1
  74. package/skills/tasks/SKILL.md +6 -7
  75. package/skills/tasks/evals/cases.yaml +1 -1
  76. package/skills/unslop/SKILL.md +39 -10
  77. package/skills/unslop/evals/README.md +7 -7
  78. package/skills/unslop/evals/cases.yaml +10 -9
  79. package/skills/verify/SKILL.md +5 -8
  80. package/skills/verify/evals/cases.yaml +1 -1
  81. package/skills/worktrees/SKILL.md +14 -18
  82. package/skills/worktrees/evals/cases.yaml +1 -1
  83. package/targets/clone-bootstrap.mjs +4 -1
  84. package/targets/session-start.mjs +1 -1
  85. package/skills/bro/SKILL.md +0 -76
  86. package/skills/bro/evals/README.md +0 -22
  87. package/skills/bro/evals/cases.yaml +0 -62
  88. package/skills/eli5/SKILL.md +0 -63
  89. package/skills/eli5/evals/README.md +0 -22
  90. package/skills/eli5/evals/cases.yaml +0 -54
  91. package/skills/show-me/SKILL.md +0 -140
  92. package/skills/show-me/evals/README.md +0 -23
  93. package/skills/show-me/evals/cases.yaml +0 -61
@@ -1,14 +1,14 @@
1
1
  skill: init
2
2
 
3
3
  # Cases for the rsc-skills "init" front door / bootstrapper.
4
- # init profiles the user (technical level + accompaniment dial), discovers what
4
+ # init profiles the user (one question: technical terms or analogies), discovers what
5
5
  # they want to BUILD or GOVERN (code OR a non-code harness), recommends rsc
6
6
  # skills, and hands off to the harness skill. It is NOT the scaffolder and NOT
7
7
  # a specific stack skill.
8
8
 
9
9
  should_trigger:
10
10
  - prompt: "Quiero montar un proyecto nuevo pero no sé por dónde empezar."
11
- why: "Canonical greenfield entry with explicit uncertainty ('no sé por dónde empezar') — init's job is to gauge level, discover, and recommend before anything is built."
11
+ why: "Canonical greenfield entry with explicit uncertainty ('no sé por dónde empezar') — init's job is to ask the register, discover, and recommend before anything is built."
12
12
 
13
13
  - prompt: "I have an existing repo and I want to set up the harness on it. Where do I start?"
14
14
  why: "Brownfield bootstrapping: pointing the rsc harness at an existing project is exactly init's front-door role (detect greenfield vs brownfield, profile, recommend skills)."
@@ -17,7 +17,7 @@ should_trigger:
17
17
  why: "First-contact phrasing without naming any tool — init is the literal first thing you run; it should claim 'what do I do first' onboarding moments."
18
18
 
19
19
  - prompt: "Tengo una idea para una app pero soy de negocio, no técnico. Ayúdame a arrancar esto desde cero."
20
- why: "Greenfield + explicitly non-technical user — init leads with the technical-level question and the accompaniment dial, the core reason it exists, before any stack choice."
20
+ why: "Greenfield + explicitly non-technical user — init leads with the one register question (technical or analogies), the core reason it exists, before any stack choice."
21
21
 
22
22
  - prompt: "I want to use this to run my company's operations, not to write code. Can I bootstrap that here?"
23
23
  why: "Non-code harness (company/ops) bootstrap — init is domain-agnostic and explicitly governs non-code harnesses the same way; this is a deliberately non-obvious trigger."
@@ -38,7 +38,7 @@ should_not_trigger:
38
38
  why: "init explicitly hands off scaffolding to the harness skill. The moment the user asks to actually BUILD 01-TOOLS/02-DOCS, it is harness's job, not init's (init writes only the profile + link)."
39
39
 
40
40
  - prompt: "Set up a FastAPI backend with a Postgres database for my new service."
41
- why: "User already knows the stack and wants a specific backend built — this is the fastapi/backend stack skill, not the level-gauging front door. init recommends skills; it does not implement stacks."
41
+ why: "User already knows the stack and wants a specific backend built — this is the fastapi/backend stack skill, not the profiling front door. init recommends skills; it does not implement stacks."
42
42
  route_to: "fastapi"
43
43
 
44
44
  - prompt: "Help me pick and configure a deploy target — Hetzner vs Vercel vs Fly.io — and ship it."
@@ -56,8 +56,8 @@ should_not_trigger:
56
56
  capability:
57
57
  - scenario: "A non-technical founder says: 'I want to build an app to connect dog owners but I don't know where to start.' Show how init opens the engagement."
58
58
  must_include:
59
- - "Asks the technical-level question FIRST, before any discovery or recommendation (e.g. 'are you comfortable with code or prefer plain language?'), and records technical_level"
60
- - "Presents the accompaniment dial L0–L3 and, given a silent non-technical user, defaults to L3 (full accompaniment)"
59
+ - "Asks ONE first-contact question FIRST, before any discovery or recommendation ('¿Te hablo en lenguaje técnico o con analogías?'), and records technical_level as technical or non-technical"
60
+ - "Asks no second calibration question (no accompaniment/verbosity level); given a silent or unclear answer, records non-technical and speaks with plain words and analogies"
61
61
  - "Persists the profile to 02-DOCS/wiki/harness/user-profile.md and an append-only 02-DOCS/wiki/harness/decisions.md, and links both from a ## Knowledge map section in root CLAUDE.md (creating CLAUDE.md if absent, additive only)"
62
62
  - "Detects greenfield vs brownfield rather than assuming, and runs DISCOVER (goals, audience, constraints, surfaces) before recommending"
63
63
  - "Recommends specific rsc skills matched to discovery (at minimum harness; nextjs/flutter + design if app surfaces justify it) and PRINTS the exact install commands (npx @ericrisco/rsc add <skill> ...)"
@@ -66,7 +66,7 @@ capability:
66
66
 
67
67
  - scenario: "A user with an existing multi-package repo says: 'Point the harness at my project and get me started.' Show the brownfield front-door flow."
68
68
  must_include:
69
- - "Still asks the technical-level question and sets the accompaniment dial first — profile before anything, even on brownfield"
69
+ - "Still asks the one register question first — profile before anything, even on brownfield"
70
70
  - "Detects brownfield via manifests (package.json / pyproject.toml / pubspec.yaml / go.mod / Cargo.toml), source files, legacy XX-* folders, or existing 01-TOOLS/02-DOCS, with a read-only scan that ignores node_modules/.venv/.next/.git/dist/build"
71
71
  - "Summarizes the detected stack and current state and CONFIRMS with the user instead of assuming"
72
72
  - "Writes profile + decisions log under 02-DOCS/wiki/harness/ and adds the Knowledge-map link to CLAUDE.md without deleting existing content"
@@ -1,62 +1,45 @@
1
- # Accompaniment & Profile — the non-technical-first script, the dial, and how it persists
1
+ # Register & Profile — the first-contact question and how it persists
2
2
 
3
- This file holds the runtime detail behind the SKILL.md section "Non-technical-first + the accompaniment dial". It defines: the first-contact script, the dial, the exact `02-DOCS` file formats, and the rules every downstream skill follows to adapt.
3
+ This file holds the runtime detail behind the SKILL.md section "First contact". It defines: the first-contact question, the register it sets, the exact `02-DOCS` file formats, and the rule every downstream skill follows. (The filename is historical: the accompaniment dial it once described is retired.)
4
4
 
5
5
  ## Why this matters
6
6
 
7
- The single biggest failure mode of a developer-built harness is talking like a developer to someone who is not one. This system inverts the default: it assumes non-technical, asks before assuming otherwise, and lets the user turn explanation up or down at will. The profile is the contract; every skill honors it.
7
+ The single biggest failure mode of a developer-built harness is talking like a developer to someone who is not one. This system inverts the default: it assumes analogies, asks once before assuming otherwise, and keeps one voice for everyone. The profile is the contract; every skill honors it.
8
8
 
9
- ## The first-contact script
9
+ ## The first-contact question
10
10
 
11
- Ask exactly two things, in order, before anything else. Do not bundle them with discovery questions.
12
-
13
- ### Question 1 — technical level (the literal first message)
11
+ Ask exactly one thing before anything else. Do not bundle it with discovery questions.
14
12
 
15
13
  Spanish:
16
14
 
17
- > "Antes de nada, para hablarte como te resulte más cómodo: ¿te manejas con código y términos técnicos, o prefieres que te lo explique todo en cristiano? No hay respuesta mala — solo me ayuda a no aburrirte ni perderte."
15
+ > "¿Te hablo en lenguaje técnico o con analogías?"
18
16
 
19
17
  English:
20
18
 
21
- > "First, so I talk to you the right way: are you comfortable with code and technical terms, or would you rather I explain everything in plain language? There's no wrong answer — it just helps me not bore you or lose you."
19
+ > "Should I talk to you in technical terms or with analogies?"
22
20
 
23
21
  Map the answer to one of:
24
22
 
25
- - `non-technical` — plain language, analogies, no jargon, no code shown unless asked.
26
- - `mixed` — comfortable with concepts, not necessarily syntax; define terms once.
27
- - `technical` — full jargon OK, can read code and configs.
28
-
29
- If the user does not answer clearly, assume `non-technical`. Never guess "technical" from the fact that they opened a terminal — many non-technical people are handed one.
30
-
31
- ### Question 2 — the accompaniment dial
32
-
33
- Present all four levels with their plain descriptions (do not show only labels):
23
+ - `technical` — technical terms used directly; can read code and configs.
24
+ - `non-technical` — plain words and everyday analogies; no undefined jargon; no code shown unless asked.
25
+ - `mixed` — still valid in older profiles; treat it like `non-technical`.
34
26
 
35
- - **L0 — "Modo cavernícola"**: mínimas palabras. Hago las cosas y ya, casi sin explicar.
36
- - **L1 — "Breve"**: una línea de *por qué* en cada paso.
37
- - **L2 — "Explica decisiones"**: justifico cada decisión relevante a medida que avanzo.
38
- - **L3 — "Acompañamiento total"**: te lo explico TODO, te hago muchas preguntas para entender tu contexto, y razono cada decisión. Ideal para no-técnicos.
27
+ `non-technical` and `mixed` (and no profile at all) also arm the danger guard, which blocks irreversible commands; `technical` never does. Say so when you record the answer.
39
28
 
40
- Defaults when the user gives no preference: `non-technical → L3`, `mixed → L2`, `technical → L1`. The user can change the dial any time by saying so ("ponlo en breve", "explícamelo todo"); update `user-profile.md` when they do.
29
+ If the user does not answer clearly, record `non-technical`. Never guess "technical" from the fact that they opened a terminal — many non-technical people are handed one. The user can change it any time ("háblame técnico", "con analogías"); update `user-profile.md` when they do.
41
30
 
42
31
  ## How every skill adapts
43
32
 
44
- Both values combine. `accompaniment_level` controls **how much** is said and **how many questions** are asked; `technical_level` controls **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.
33
+ There is no per-user depth setting. Every skill speaks in the one voice the `orient` skill owns (`skills/orient/references/orientation-contract.md`): short sentences, one idea per sentence, simple words, active voice, the instruction before the reason, and every answer understandable on its own. `technical_level` only picks the register:
45
34
 
46
- | Level | Output verbosity | Questions before acting | On a decision |
47
- | --- | --- | --- | --- |
48
- | L0 | Result line only | None beyond hard blockers | Pick the recommended option, log it, mention it in one line |
49
- | L1 | One *why* line per step | Only on genuine ambiguity | Present the 3 options tersely, recommend, proceed on confirm |
50
- | L2 | Justify each relevant decision | Ask before each significant decision | Full 3-option pattern with trade-offs |
51
- | L3 | Narrate reasoning throughout | Many — contextualize every choice | Full 3-option pattern + explain each option in plain language and check understanding |
35
+ - `technical` — use the term directly; skip the 101 explanations.
36
+ - `non-technical` / `mixed` — translate every term ("a database is where the app remembers things"), prefer analogies, never paste raw config without explaining it.
52
37
 
53
- Vocabulary modifier:
38
+ If the person still does not understand, `orient` climbs its explanation ladder (text → diagram → one HTML page → a video, only offered).
54
39
 
55
- - `non-technical` — translate every term ("a database is where the app remembers things"), prefer analogies, never paste raw config without explaining it.
56
- - `mixed` — use the term, define it inline the first time.
57
- - `technical` — use the term directly; skip the 101 explanations even at L3.
40
+ **Legacy keys.** A profile written by an older `init` or `onboard` may carry `accompaniment_level:` or the even older `accompaniment:`. Both are retired: ignore their value, and drop the line the next time you touch the profile.
58
41
 
59
- **Rule:** read `user-profile.md` at the start of every session. If it is missing, you are likely being run before `init` — run the first-contact script before doing the requested work, or at minimum default to `non-technical` + `L3` and note that the profile is unset.
42
+ **Rule:** read `user-profile.md` at the start of every session. If it is missing, you are likely being run before `init` — ask the first-contact question before doing the requested work, or at minimum speak with analogies and note that the profile is unset.
60
43
 
61
44
  ## Persistence format
62
45
 
@@ -64,16 +47,15 @@ Both files live under `02-DOCS/wiki/harness/`. `init` creates this directory eve
64
47
 
65
48
  ### `02-DOCS/wiki/harness/user-profile.md`
66
49
 
67
- A living document — updated whenever the user reveals new goals, context, constraints, or changes the dial. It is the single source of truth other skills read.
50
+ A living document — updated whenever the user reveals new goals, context, constraints, or changes the register. It is the single source of truth other skills read.
68
51
 
69
52
  ```markdown
70
53
  # User Profile
71
54
 
72
55
  > Source of truth for how every rsc skill talks to this user. Updated continuously.
73
56
 
74
- ## Levels
75
- - technical_level: non-technical <!-- non-technical | mixed | technical -->
76
- - accompaniment_level: L3 <!-- L0 | L1 | L2 | L3 -->
57
+ ## Register
58
+ - technical_level: non-technical <!-- technical | non-technical (mixed: legacy, reads as non-technical) -->
77
59
  - language: es <!-- the user's working language -->
78
60
  - last_updated: 2026-06-01
79
61
 
@@ -133,7 +115,7 @@ Add (or update) a `## Knowledge map` section that links BOTH files. Create `CLAU
133
115
  ```markdown
134
116
  ## Knowledge map
135
117
 
136
- - [User profile](02-DOCS/wiki/harness/user-profile.md) — technical level, accompaniment dial, goals, context, constraints. **Every skill reads this first and adapts its verbosity and questions.**
118
+ - [User profile](02-DOCS/wiki/harness/user-profile.md) — register (technical or analogies), goals, context, constraints. **Every skill reads this first and speaks in that register.**
137
119
  - [Decisions log](02-DOCS/wiki/harness/decisions.md) — append-only record of every significant decision and why.
138
120
  ```
139
121
 
@@ -1,6 +1,6 @@
1
1
  # Discovery — greenfield & brownfield questionnaires (software AND non-code harnesses)
2
2
 
3
- Phase 2 detail. Establish two things: **the state of the ground** (greenfield vs brownfield) and **what the user wants to build or govern**. Record everything to `02-DOCS/wiki/harness/user-profile.md` as you learn it. Ask in batches sized to `accompaniment_level` — never dump every question at once.
3
+ Phase 2 detail. Establish two things: **the state of the ground** (greenfield vs brownfield) and **what the user wants to build or govern**. Record everything to `02-DOCS/wiki/harness/user-profile.md` as you learn it. Ask in short batches — never dump every question at once.
4
4
 
5
5
  ## First: greenfield vs brownfield (detect, then confirm)
6
6
 
@@ -31,7 +31,7 @@ Record `domain: software | non-code-harness`. Both are first-class. A non-code h
31
31
 
32
32
  ### Greenfield software
33
33
 
34
- Ask in batches. Adapt depth to the dial.
34
+ Ask in short batches, only what changes the plan.
35
35
 
36
36
  1. **The idea in one sentence.** What does it do, for whom?
37
37
  2. **Surfaces.** Which of these does it need? (This drives the skill recommendation.)
@@ -7,7 +7,7 @@ and prints commands the user runs.
7
7
 
8
8
  ## The skill map
9
9
 
10
- | Discovery signal | Skills | One-line *why* (adapt to level) |
10
+ | Discovery signal | Skills | One-line *why* (in the user's register) |
11
11
  | --- | --- | --- |
12
12
  | Always (every project) | `harness` | The control plane — scaffolds and governs the whole workspace (`suggest` installs with it as the floor). |
13
13
  | Backend / API / database | `fastapi` or `go`, `postgresdb` | The server, the API, the database that remembers things. |
@@ -28,7 +28,7 @@ usually does NOT want `fastapi`/`nextjs` unless they're also building software.
28
28
  ## What to print
29
29
 
30
30
  One `npx @ericrisco/rsc add` line per recommendation (or batch them on one line), each with
31
- its *why* in the user's language and level.
31
+ its *why* in the user's language and register.
32
32
 
33
33
  ```text
34
34
  npx @ericrisco/rsc add <skill> [<skill> ...]
@@ -81,7 +81,7 @@ For any significant decision — deploy target, database, framework, hosting, wh
81
81
 
82
82
  ### 1. Gather the driving requirements first
83
83
 
84
- Ask the questions that actually change the answer. Match question count/depth to `accompaniment_level` (L0: only hard blockers; L3: ask all, explaining why each matters). Checklists per decision type:
84
+ Ask only the questions that actually change the answer, in one short batch. Checklists per decision type:
85
85
 
86
86
  - **Deploy target:** expected number of users; concurrent users; budget; data region / residency rules; the team's comfort operating servers; scaling needs (steady vs spiky); existing org/cloud constraints.
87
87
  - **Database:** data shape (relational vs documents vs key-value); expected size and growth; query patterns; consistency vs scale needs; managed vs self-hosted preference; budget.
@@ -92,9 +92,9 @@ Ask the questions that actually change the answer. Match question count/depth to
92
92
 
93
93
  Three, with honest trade-offs — what each is good at, what it costs, what it demands. Not two (false binary), not ten (paralysis). If a fourth is genuinely worth knowing, mention it in one line under the third — but the choice is between three.
94
94
 
95
- ### 3. Recommend one, matched to their answers AND their level
95
+ ### 3. Recommend one, matched to their answers
96
96
 
97
- State your recommendation and why, in language they understand. At L3 / non-technical, explain each option in plain terms and check they followed before they pick.
97
+ State your recommendation and why, in their register. For a `non-technical` user, explain each option with an everyday analogy and check they followed before they pick.
98
98
 
99
99
  ### 4. Log the decision
100
100
 
@@ -4,8 +4,9 @@
4
4
  #
5
5
  # WHAT IT DOES (read-only; never edits or creates a file)
6
6
  # Static checks that Phase 1 (PROFILE) actually landed in the workspace:
7
- # 1. 02-DOCS/wiki/harness/user-profile.md exists and carries technical_level
8
- # and accompaniment_level lines.
7
+ # 1. 02-DOCS/wiki/harness/user-profile.md exists and carries a technical_level
8
+ # line — the one dial (technical, or with analogies). The accompaniment dial
9
+ # is retired: an old profile that still carries it is not flagged.
9
10
  # 2. 02-DOCS/wiki/harness/decisions.md exists (append-only decisions log).
10
11
  # 3. Root CLAUDE.md exists and its "## Knowledge map" section links the profile.
11
12
  # Everything is detect-or-skip: a missing workspace piece is a WARNING, never a
@@ -79,11 +80,6 @@ else
79
80
  else
80
81
  warn "profile is missing a technical_level line"
81
82
  fi
82
- if has "$PROFILE" 'accompaniment_level'; then
83
- ok "profile records accompaniment_level"
84
- else
85
- warn "profile is missing an accompaniment_level line"
86
- fi
87
83
  fi
88
84
 
89
85
  # --- 2. decisions log -------------------------------------------------------
@@ -13,7 +13,7 @@ origin: risco
13
13
  ## Before you touch anything
14
14
 
15
15
  1. **Confirm `02-DOCS/wiki/` exists.** If there is no wiki, stop and say: "Run `harness` to build the `02-DOCS/` wiki first, then come back to garden it." Why: this skill operates an existing engine; it never creates one. See `../harness/SKILL.md`.
16
- 2. **Read `wiki/harness/user-profile.md`** to set your verbosity (the harness accompaniment dial, L0–L3). Why: a non-technical owner wants decisions narrated; an expert wants terse diffs.
16
+ 2. **Read `wiki/harness/user-profile.md`** for `technical_level`, which sets your register (technical terms, or plain words with analogies). Why: a non-technical owner needs each decision explained with an analogy; a technical one reads the term directly. Either way, speak in the `orient` voice: short, and every answer understandable on its own.
17
17
  3. **Read `wiki/index.md` and `wiki/scores.json` before any edit.** Why: you garden from the map and the score signal, never blind. `scores.json` tells you what is bloated, orphaned, or stale.
18
18
 
19
19
  If `wiki/log.md` shows a Maintenance Pass ran in the last few minutes, let it finish — do not race the automation.
@@ -1,65 +1,76 @@
1
1
  ---
2
2
  name: orient
3
- description: "Always-on. The brújula: close every turn by situating the person — where they are, what just happened, why it mattered, and the next step as a question, never a dead end. Reads the accompaniment and technical dials from 02-DOCS and calibrates how much it explains, rewriting the dial when the user asks for more or less. NOT the missing-skill installer (that is `suggest`)."
4
- tags: [orient, guide, compass, dial, meta, always-on]
3
+ description: "Always-on. How the harness talks to the person: STE-style short sentences, every answer understandable on its own, technical or with analogies by the profile, and a ladder (text → diagram → HTML page → video on request) when the person does not follow. Closes every turn with the brújula. Fires on 'no entiendo', 'explícamelo', 'enséñame', 'dibújamelo', 'explain it from zero', '¿dónde estamos?'. NOT the missing-skill installer (that is `suggest`), NOT a text the user sends to others (that is `unslop`)."
4
+ tags: [orient, voice, ste, explain, diagram, eli5, show-me, compass, always-on]
5
5
  recommends: []
6
6
  profiles: [minimal, core, full]
7
7
  origin: risco
8
8
  ---
9
9
 
10
- # orient — the brújula that never leaves the user lost
10
+ # orient — talk so the person understands, then show them where they are
11
11
 
12
- You are always loaded. Your one job: **after anything happens, keep the human oriented.** A tool
13
- executes and falls silent; a mentor walks alongside. You are what makes the harness a mentor.
12
+ You own how the harness speaks to the person. Three rules, a register, a ladder, and the brújula.
14
13
 
15
- `suggest` keeps the *session* equipped ("you're missing a skill, install it?"). You keep the *person*
16
- equipped ("you are here, you did this, for this reason, next is X — which?"). The install prompt is
17
- its job, never yours.
14
+ ## The three rules
18
15
 
19
- ## The one rule
16
+ 1. **Speak STE.** STE is the controlled writing style of aircraft manuals (ASD-STE100). Short
17
+ sentences. One idea per sentence. Simple words. Active voice. The instruction before the reason.
18
+ 2. **Every answer stands alone.** The reader has not seen your reasoning, and may not remember earlier
19
+ messages. Never point at something they did not see ("the second commit", "that fix", "as above").
20
+ Name it, in one sentence.
21
+ 3. **Short.** Say what the reader needs, then stop. No walls of paragraphs. Rules 2 and 3 meet in one
22
+ place: give the **minimum** context, never the whole story.
20
23
 
21
- **No turn ends in seco.** Any turn that finishes an action, reaches a fork, or could leave the user
22
- unsure closes with the brújula block. One block, at the end — never interrupt mid-work to orient.
24
+ Full rules and examples → `references/orientation-contract.md`.
23
25
 
24
- ## The brújula block
26
+ ## The register
25
27
 
26
- Four intents. The wording adapts to the person; the intents do not.
28
+ Read `technical_level` in `02-DOCS/wiki/harness/user-profile.md`.
27
29
 
28
- ```text
29
- 📍 Dónde estás — the project phase/state (the map)
30
- ✅ Qué acabas de hacer — one line, in the user's language
31
- 🧭 Por qué — the technical why, scaled to the dial
32
- ➡️ Siguiente — 1-3 concrete options, ending in a question
33
- ```
30
+ | technical_level | Register |
31
+ |---|---|
32
+ | `technical` | Technical terms, used directly. No 101s. |
33
+ | `non-technical`, `mixed` | Plain words. One everyday analogy for each new idea. |
34
+ | no profile | Analogies. Ask once: "¿Te hablo en lenguaje técnico o con analogías?" and save the answer. |
35
+
36
+ The person can change it by saying so ("háblame más técnico", "con analogías"). Update
37
+ `technical_level` (`technical` or `non-technical`), confirm in one line, apply it from this turn.
38
+ Old profiles may carry `accompaniment_level:` or `accompaniment:` (the retired L0–L3 dial): ignore both.
34
39
 
35
- Situate them from what is **actually** built. If you are unsure of the project state, read the
36
- Knowledge map or the repo before writing 📍 — an invented state is worse than a shorter block.
40
+ ## The ladder — when the person does not follow
37
41
 
38
- ## Calibrate to the dial
42
+ Climb **one** step per sign. Signs: they repeat the question, say "no entiendo" / "¿qué?" /
43
+ "explícamelo", answer short and annoyed, or ask about a term you just used. Weak signs are not signs:
44
+ guessing their mood reads as condescending.
39
45
 
40
- Read `02-DOCS/wiki/harness/user-profile.md` before writing the block. Two fields combine:
41
- `accompaniment_level` sets the depth, `technical_level` 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.
46
+ | Step | What | Detail |
47
+ |---|---|---|
48
+ | 1 | Text, in the three rules | always |
49
+ | 2 | One diagram in the chat | the smallest form that carries the point |
50
+ | 3 | One self-contained HTML page | big pictures, few words; open it |
51
+ | 4 | Animated video | only offered, never made unasked |
42
52
 
43
- | accompaniment_level | How the block behaves |
44
- |---------------------|-----------------------|
45
- | L0 — cavernícola | Only `✅` + `➡️`. One next option, a yes/no question. |
46
- | L1 — breve | The four lines; `🧭` is one line of why. |
47
- | L2 — explica decisiones | The four lines; `🧭` justifies the relevant decision; offer real forks. |
48
- | L3 — acompañamiento total | The four lines, full why, each option explained in plain language. |
53
+ The person can also ask for any step directly ("dibújamelo", "hazme una página", "explícamelo desde
54
+ cero"). Forms, the from-zero page and the video step → `references/explain-ladder.md`.
49
55
 
50
- `technical_level` is orthogonal: a non-technical user gets plain language and analogies even at L0;
51
- a technical user skips the 101 explanations even at L3. No profile yet → assume non-technical + L3
52
- (the non-technical-first default) and offer to set the dial.
56
+ ## The brújula — close every turn
53
57
 
54
- The dial is spoken, not configured: when the user says "explícame más / menos", "no me expliques
55
- tanto" or "enséñame", update `accompaniment_level` in the profile, confirm in one line, and apply
56
- the new depth from this turn on.
58
+ No turn ends in seco. One block, at the end, never mid-work.
59
+
60
+ ```text
61
+ 📍 Dónde estás — the state, in one sentence that stands alone
62
+ ✅ Qué has hecho — only when something was done
63
+ 🧭 Por qué — only when a decision was made; one sentence
64
+ ➡️ Siguiente — 1-3 concrete options, ending in a question
65
+ ```
57
66
 
58
- At a real fork, ask. Deciding alone is faster and wrong — the fork is the moment the person's
67
+ 📍 and ➡️ always. ✅ and 🧭 only when they carry something. Situate from what is **actually** built;
68
+ an invented state is worse than a shorter block. At a real fork, ask: the fork is where the person's
59
69
  judgment is worth more than yours.
60
70
 
61
- ## See Also
71
+ ## Where this ends
62
72
 
63
- - `references/orientation-contract.md` — the full brújula contract: block anatomy, what each of the
64
- four beats must contain, and how the dial changes their depth. Read it when a turn ends ambiguously
65
- or when calibrating a new dial level.
73
+ - "Install the missing skill?" belongs to `suggest`.
74
+ - A text the person sends to others (email, post, README) belongs to `unslop`.
75
+ - Visual identity is `design`; a deck someone presents from is `presentations`; a course with
76
+ exercises is `course-builder`.
@@ -1,16 +1,18 @@
1
1
  # Evals — orient
2
2
 
3
- The always-on brújula. These cases check that it keeps the user oriented at the end of a
4
- turn (map + what happened + why-at-level + next step as a question) and that it defers
5
- install prompts to `suggest` and never interrupts trivial mid-flow edits.
3
+ How the harness talks to the person. These cases check the voice (STE-style, short, every answer
4
+ stands alone), the register from `technical_level`, the explain ladder (text → diagram → HTML →
5
+ video on request), and the brújula at the end of a turn. Install prompts stay with `suggest`; text
6
+ for others stays with `unslop`.
6
7
 
7
8
  | Prompt | Expected |
8
9
  |---|---|
9
- | "ya está instalado, ¿y ahora qué?" | situate + next step as a question |
10
- | "no sé por dónde seguir" | render the map + 1-3 next options |
11
- | "explícame menos" | lower the dial, confirm, apply reduced depth |
10
+ | "ya está instalado, ¿y ahora qué?" | short stand-alone state + next step as a question |
11
+ | "no entiendo nada" | one step up the ladder: a small diagram |
12
+ | "explícame Docker desde cero" | from-zero explanation with analogies |
13
+ | "háblame más técnico" | set technical_level, confirm, apply |
12
14
  | "renombra esta variable" | no full brújula block (trivial mid-flow) |
13
- | "necesito una base de datos" | defer to `suggest` (no duplicate install prompt) |
15
+ | "haz que este correo suene humano" | defer to `unslop` |
14
16
 
15
- A pass = orient closes the turn without leaving the user in seco, scales the why to the
16
- dial, and never duplicates `suggest`'s install prompt.
17
+ A pass = short sentences, nothing that needs earlier context, the right register, one ladder step
18
+ per sign, and no turn ending in seco.
@@ -1,57 +1,67 @@
1
1
  skill: orient
2
2
 
3
- # The always-on brújula. It fires at the END of a turn to keep the user oriented:
4
- # map + what happened + why (scaled to the dial) + a next step phrased as a question.
5
- # It defers "install a missing skill?" to suggest and does not interrupt mid-work.
3
+ # How the harness talks to the person: STE-style short sentences, every answer stands alone,
4
+ # register (technical or with analogies) from technical_level, a ladder (text → diagram → HTML →
5
+ # video on request) when the person does not follow, and the brújula at the end of a turn.
6
+ # It defers "install a missing skill?" to suggest and text for others to unslop.
6
7
 
7
8
  should_trigger:
8
9
  - prompt: "Ya está instalado el postgresdb. ¿Y ahora qué?"
9
- why: "An action just finished and the user is explicitly unsure what to do next — orient must situate them and propose the next step."
10
-
11
- - prompt: "Vale, hemos creado la landing. ¿Qué hago con esto?"
12
- why: "A step finished and the user asks for direction — orient closes with the map + next options as a question."
10
+ why: "An action just finished and the user is unsure what to do next — orient situates them and proposes the next step."
13
11
 
14
12
  - prompt: "No sé por dónde seguir con mi proyecto."
15
13
  why: "The user is lost — the core trigger: situate on the map and propose 1-3 next steps."
16
14
 
17
- - prompt: "Explícame menos, que me agobio con tanto detalle."
18
- why: "A spoken dial request — orient lowers accompaniment_level, confirms it, and applies the new depth."
15
+ - prompt: "No entiendo nada de lo que me has dicho."
16
+ why: "A clear sign the person does not follow — orient climbs one step of the ladder (a diagram)."
19
17
 
20
- - prompt: "¿En qué punto del proyecto vamos?"
21
- why: "A 'where am I?' question — orient renders the map (what's built, what's missing, what phase)."
18
+ - prompt: "Dibújame cómo funciona el flujo de login."
19
+ why: "A direct request for step 2 of the ladder — the smallest diagram that carries the point."
22
20
 
23
- - prompt: "Acabo de terminar el spec. Listo."
24
- why: "A turn ends after finishing work — orient must not end in seco; it proposes the next phase as a question."
21
+ - prompt: "Explícame qué es Docker desde cero, que no sé nada."
22
+ why: "Zero background — a from-zero explanation with everyday analogies (the old eli5 job, now step 3 of the ladder)."
23
+
24
+ - prompt: "Háblame más técnico, que esto ya lo controlo."
25
+ why: "A spoken register change — orient sets technical_level to technical, confirms in one line, applies it."
26
+
27
+ - prompt: "¿En qué punto del proyecto vamos?"
28
+ why: "A 'where am I?' question — orient renders the state in sentences that stand alone."
25
29
 
26
30
  should_not_trigger:
27
31
  - prompt: "Renombra esta variable a `userCount`."
28
32
  route_to: "none"
29
- why: "A trivial mechanical edit mid-flow — orient does not interrupt with a full brújula block over a one-line change."
33
+ why: "A trivial mechanical edit mid-flow — no full brújula block over a one-line change."
30
34
 
31
35
  - prompt: "Necesito una base de datos para guardar pedidos."
32
36
  route_to: "suggest"
33
- why: "This is an install gap — suggest owns it. orient must not duplicate the 'install it?' prompt."
37
+ why: "An install gap — suggest owns it. orient must not duplicate the 'install it?' prompt."
34
38
 
35
- - prompt: "Optimiza esta query de Postgres que va lenta."
36
- route_to: "postgresdb"
37
- why: "A concrete task owned by another skill; orient adds the closing block but does not drive the work."
39
+ - prompt: "Haz que este correo al cliente suene más humano."
40
+ route_to: "unslop"
41
+ why: "A text the user sends to others — unslop owns the human-register rewrite."
38
42
 
39
43
  - prompt: "Arregla el test que falla."
40
44
  route_to: "debug"
41
- why: "Root-cause work owned by debug; orient does not take over the task itself."
45
+ why: "Root-cause work owned by debug; orient only closes the turn."
42
46
 
43
47
  capability:
44
- - scenario: "The user just ran `npx @ericrisco/rsc add postgresdb` and says 'ya está, ¿y ahora qué?'. The profile shows accompaniment_level L0. Show how orient closes the turn."
48
+ - scenario: "The user just ran `npx @ericrisco/rsc add postgresdb` and says 'ya está, ¿y ahora qué?'. The profile shows technical_level non-technical. Show how orient closes the turn."
45
49
  must_include:
46
- - "Situates the user on the map ('📍 dónde estás' / what is built vs missing)"
47
- - "States what just happened in one plain-language line ('✅ instalaste la base de datos')"
48
- - "Proposes a concrete next step ending in a question, never leaving the turn in seco"
49
- - "At L0, keeps it to ✅ + ➡️ with a single yes/no option and zero jargon"
50
+ - "Short sentences, one idea each; no paragraph walls"
51
+ - "Every line understandable without earlier messages (names the database, does not say 'eso' or 'lo de antes')"
52
+ - "Plain words with an everyday analogy for any new idea (non-technical register)"
53
+ - "Closes with 📍 and ➡️, the next step ending in a question"
50
54
  - "Does NOT re-prompt to install a skill (defers that to suggest)"
51
55
 
52
- - scenario: "Mid-project, the user says 'explícame menos'. The profile shows accompaniment_level L2. Show how orient responds."
56
+ - scenario: "Orient explained a caching bug in text. The user replies: '¿qué? no entiendo'. The profile shows technical_level technical. Show the next answer."
57
+ must_include:
58
+ - "Climbs exactly one step: a single small diagram (pseudocode, call tree or flow), not an HTML page or a video"
59
+ - "Uses real names from the code, not placeholders"
60
+ - "Keeps the technical register (no 101s)"
61
+ - "At most two lines of prose beside the diagram"
62
+
63
+ - scenario: "The profile carries `technical_level: mixed` and an old `accompaniment_level: L0`. The user asks what a migration is. Show how orient answers."
53
64
  must_include:
54
- - "Updates accompaniment_level in 02-DOCS/wiki/harness/user-profile.md to a lower level"
55
- - "Confirms the change in one line"
56
- - "Re-renders guidance at the reduced depth from this turn on"
57
- - "Still closes with a next-step question (no seco)"
65
+ - "Ignores accompaniment_level (retired)"
66
+ - "Uses the analogies register (mixed → analogies)"
67
+ - "Short, stand-alone answer that ends with the brújula"