@ericrisco/rsc 1.0.9 → 1.0.11
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.
- package/README.md +15 -13
- package/manifest.json +133 -2
- package/package.json +6 -4
- package/scripts/consult.js +75 -42
- package/scripts/drift-check.js +316 -0
- package/scripts/lib/default-skill-floor.js +11 -0
- package/scripts/lib/domains.js +3 -3
- package/scripts/lib/recommend.js +1 -0
- package/scripts/lib/text-rank.js +112 -0
- package/scripts/lib/ui.js +3 -3
- package/scripts/routing-audit.js +163 -0
- package/scripts/rsc.js +11 -10
- package/skills/author-skill/references/rsc-conventions.md +1 -1
- package/skills/bro/SKILL.md +68 -0
- package/skills/bro/evals/README.md +22 -0
- package/skills/bro/evals/cases.yaml +58 -0
- package/skills/data-cleaning/references/normalization-recipes.md +1 -1
- package/skills/decision-challenge/SKILL.md +113 -0
- package/skills/decision-challenge/evals/README.md +3 -0
- package/skills/decision-challenge/evals/cases.yaml +42 -0
- package/skills/deprecation/SKILL.md +123 -0
- package/skills/deprecation/evals/README.md +3 -0
- package/skills/deprecation/evals/cases.yaml +42 -0
- package/skills/harness/references/wiki-gaps-template.md +4 -0
- package/skills/idea-refinement/SKILL.md +121 -0
- package/skills/idea-refinement/evals/README.md +3 -0
- package/skills/idea-refinement/evals/cases.yaml +42 -0
- package/skills/observability/SKILL.md +6 -0
- package/skills/observability/evals/cases.yaml +2 -0
- package/skills/performance/SKILL.md +13 -0
- package/skills/performance/evals/cases.yaml +2 -0
- package/skills/simplify-code/SKILL.md +101 -0
- package/skills/simplify-code/evals/README.md +3 -0
- package/skills/simplify-code/evals/cases.yaml +42 -0
- package/skills/solid-js/references/router-and-start.md +1 -1
- package/skills/source-grounded-development/SKILL.md +108 -0
- package/skills/source-grounded-development/evals/README.md +3 -0
- package/skills/source-grounded-development/evals/cases.yaml +42 -0
- package/skills/suggest/evals/cases.yaml +1 -1
package/scripts/rsc.js
CHANGED
|
@@ -12,6 +12,7 @@ import { audit, writeAuditReport } from './audit.js';
|
|
|
12
12
|
import { DOMAINS } from './lib/domains.js';
|
|
13
13
|
import { listBackups, restoreBackup } from './lib/backups.js';
|
|
14
14
|
import { runUpgrade } from './lib/upgrade.js';
|
|
15
|
+
import { DEFAULT_SKILL_FLOOR, withDefaultSkillFloor } from './lib/default-skill-floor.js';
|
|
15
16
|
|
|
16
17
|
const argv = process.argv.slice(2);
|
|
17
18
|
const cmd = argv[0];
|
|
@@ -97,8 +98,8 @@ function printNextSteps(targets, ids) {
|
|
|
97
98
|
say(' "sdd-init" then "I want <your idea>"');
|
|
98
99
|
say(' → walks you specify → plan → tasks → implement → verify → ship.');
|
|
99
100
|
}
|
|
100
|
-
say(` ${n++}. From there, work in your own words. orient + suggest stay always-on:`);
|
|
101
|
-
say(' they keep you oriented
|
|
101
|
+
say(` ${n++}. From there, work in your own words. orient + suggest stay always-on; bro is ready on request:`);
|
|
102
|
+
say(' they keep you oriented, propose missing skills, and rewrite in plain human language when asked.');
|
|
102
103
|
say('\n Add something by hand anytime: npx @ericrisco/rsc add <skill>');
|
|
103
104
|
say(' Browse the catalog / get picks: npx @ericrisco/rsc consult "whatever you need"');
|
|
104
105
|
say('────────────────────────────────────────────────────────');
|
|
@@ -116,7 +117,7 @@ function printAgentHandoff() {
|
|
|
116
117
|
say('AGENT, do this now:');
|
|
117
118
|
say(' 1. Reload/restart this session so the new skills + hooks load');
|
|
118
119
|
say(' (Claude Code: restart the session · Codex/AGENTS.md tools: next turn).');
|
|
119
|
-
say(' 2. After reload you are EQUIPPED — orient + suggest are always-on.');
|
|
120
|
+
say(' 2. After reload you are EQUIPPED — orient + suggest are always-on; bro is installed.');
|
|
120
121
|
say(' 3. Tell the user rsc is ready; they can start in their own words.');
|
|
121
122
|
say(' Do NOT auto-start a task — wait for the user.');
|
|
122
123
|
say('════════════════════════════════════════════════');
|
|
@@ -153,12 +154,12 @@ function printContextBudget(b) {
|
|
|
153
154
|
|
|
154
155
|
async function wizard() {
|
|
155
156
|
const m = loadManifest();
|
|
156
|
-
await banner();
|
|
157
|
+
await banner(m.counts.skills);
|
|
157
158
|
say(' the skill catalog for your assistant (Claude Code · Codex · Cursor · Gemini · Antigravity)\n');
|
|
158
159
|
// Navigable loop: esc / "← Back" / "no" all return here instead of quitting.
|
|
159
160
|
for (;;) {
|
|
160
161
|
const choice = await select('What do you want to do?', [
|
|
161
|
-
{ key: 'base', label: 'Base install — the essentials (orient + suggest + harness + init)' },
|
|
162
|
+
{ key: 'base', label: 'Base install — the essentials (orient + suggest + bro + harness + init)' },
|
|
162
163
|
{ key: 'sdd', label: 'Base + Spec-Driven Development — the specify → plan → implement → ship flow' },
|
|
163
164
|
{ key: 'manual', label: 'Pick skills by hand, by area' },
|
|
164
165
|
]);
|
|
@@ -173,9 +174,9 @@ async function wizard() {
|
|
|
173
174
|
ids = picked;
|
|
174
175
|
} else continue;
|
|
175
176
|
|
|
176
|
-
// The floor is always installed:
|
|
177
|
-
ids =
|
|
178
|
-
if (ids.length <=
|
|
177
|
+
// The floor is always installed: compass + detector + human-language pass.
|
|
178
|
+
ids = withDefaultSkillFloor(ids);
|
|
179
|
+
if (ids.length <= DEFAULT_SKILL_FLOOR.length && choice !== 'base') {
|
|
179
180
|
say('\nNothing chosen — back to the menu.');
|
|
180
181
|
continue;
|
|
181
182
|
}
|
|
@@ -216,7 +217,7 @@ async function main() {
|
|
|
216
217
|
if (argv[i].startsWith('--')) { i++; continue; }
|
|
217
218
|
requested.push(argv[i]);
|
|
218
219
|
}
|
|
219
|
-
const ids =
|
|
220
|
+
const ids = withDefaultSkillFloor(requested);
|
|
220
221
|
for (const t of targets) await applyInstall({ skillIds: ids, target: t });
|
|
221
222
|
say(`✅ Installed for ${targets.join(', ')}: ${requested.join(', ')}`);
|
|
222
223
|
return void say(' ↻ Reload/restart your assistant so the new skill activates.');
|
|
@@ -225,7 +226,7 @@ async function main() {
|
|
|
225
226
|
const profile = flag('profile') || 'minimal';
|
|
226
227
|
const without = argv.filter((a, i) => argv[i - 1] === '--without');
|
|
227
228
|
let ids = skillsForProfile(loadManifest(), profile);
|
|
228
|
-
ids =
|
|
229
|
+
ids = withDefaultSkillFloor(ids).filter((id) => !without.includes(id));
|
|
229
230
|
for (const t of targets) await applyInstall({ skillIds: ids, target: t });
|
|
230
231
|
say(`✅ Profile '${profile}' installed for ${targets.join(', ')} (${ids.length} skills)`);
|
|
231
232
|
printAgentHandoff();
|
|
@@ -43,7 +43,7 @@ profiles: [core, full] # optional: named-profile membership
|
|
|
43
43
|
- `tags` drive the FTS recommender — pick the words a user would actually type.
|
|
44
44
|
- `recommends` must reference **real skill ids**; `build-manifest.js --validate`
|
|
45
45
|
fails on a dangling id.
|
|
46
|
-
- `profiles` is optional. `minimal` = the floor (`suggest`, `harness`, `init`);
|
|
46
|
+
- `profiles` is optional. `minimal` = the floor (`orient`, `suggest`, `bro`, `harness`, `init`);
|
|
47
47
|
`core` = the SDD workflow; `full` = everything. Most stack skills set `[full]`
|
|
48
48
|
or omit it (they are installed on demand, not by profile).
|
|
49
49
|
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: bro
|
|
3
|
+
description: "Use whenever the user asks to make an answer or draft sound human, natural, plain-spoken or less AI-written — including a terse bro after the last response. Rewrites or drafts in the same language while preserving meaning, facts and channel. NOT a reusable brand voice (that is `brand-voice`), NOT translation (that is `translation-l10n`)."
|
|
4
|
+
tags: [bro, human-writing, humano, plain-language, natural-language, rewrite, no-jargon]
|
|
5
|
+
recommends: [brand-voice, technical-writing, translation-l10n]
|
|
6
|
+
profiles: [minimal, core, full]
|
|
7
|
+
origin: risco
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# bro — say it like a person
|
|
11
|
+
|
|
12
|
+
Make the words sound like someone with something real to say. Keep the substance; remove the
|
|
13
|
+
performance around it.
|
|
14
|
+
|
|
15
|
+
## The contract
|
|
16
|
+
|
|
17
|
+
1. **Find the source without ceremony.** A bare “bro”, “write like a human”, “hazlo más natural”,
|
|
18
|
+
or equivalent points to the assistant's last answer. If the user pasted text, rewrite that. If
|
|
19
|
+
they requested new copy, draft it directly. Ask for text only when no source exists.
|
|
20
|
+
2. **Preserve the payload.** Keep names, facts, numbers, links, commitments, constraints,
|
|
21
|
+
uncertainty and necessary warnings. Do not improve the prose by inventing evidence, opinions,
|
|
22
|
+
anecdotes or certainty.
|
|
23
|
+
3. **Match the room.** Keep the user's language and fit the audience, relationship and channel. A
|
|
24
|
+
natural legal notice is still precise; a natural Slack message can be loose. “Human” does not
|
|
25
|
+
automatically mean casual.
|
|
26
|
+
4. **Cut the bot-shaped scaffolding.** Remove throat-clearing, needless summaries, repeated
|
|
27
|
+
conclusions, corporate filler, fake enthusiasm, abstract nouns and headings or bullets that do
|
|
28
|
+
not help the reader navigate.
|
|
29
|
+
5. **Restore a real cadence.** Prefer concrete verbs, direct sentences and natural contractions.
|
|
30
|
+
Vary sentence length when it helps. Use the words a person in this context would actually choose,
|
|
31
|
+
without manufacturing slang, typos or choppy fragments.
|
|
32
|
+
6. **Return the writing, not a review of the writing.** By default, output the rewritten or newly
|
|
33
|
+
drafted text with no “here is a more human version” preface. Explain the changes only if asked.
|
|
34
|
+
|
|
35
|
+
When the original contains code, commands, URLs, quoted terms or regulated wording, leave those
|
|
36
|
+
pieces exact unless the user explicitly asks to change them. Explain unavoidable jargon once in
|
|
37
|
+
plain language instead of deleting precision.
|
|
38
|
+
|
|
39
|
+
## What “human” means here
|
|
40
|
+
|
|
41
|
+
| Aim | The result |
|
|
42
|
+
| --- | --- |
|
|
43
|
+
| Plain, not simplistic | Easy to follow without losing the idea |
|
|
44
|
+
| Concise, not incomplete | No padding; all load-bearing facts remain |
|
|
45
|
+
| Warm, not performative | Appropriate care without canned empathy |
|
|
46
|
+
| Conversational, not sloppy | Natural rhythm without fake mistakes |
|
|
47
|
+
| Specific, not decorated | Concrete nouns and verbs instead of hype |
|
|
48
|
+
|
|
49
|
+
## Anti-patterns
|
|
50
|
+
|
|
51
|
+
| Anti-pattern | Why it fails | Do this instead |
|
|
52
|
+
| --- | --- | --- |
|
|
53
|
+
| Add typos, slang or filler to seem human | It performs humanity and can sound less credible | Match the actual relationship and channel |
|
|
54
|
+
| Replace technical terms with vague words | Readability bought with lost meaning is a defect | Keep or define the necessary term |
|
|
55
|
+
| Invent a personal story or strong opinion | A smoother fabrication is still a fabrication | Preserve only what the source supports |
|
|
56
|
+
| Use the same “casual” voice for every audience | A client email, README and condolence need different registers | Infer the room before choosing the cadence |
|
|
57
|
+
| Promise the result is undetectable as AI | No rewrite can honestly guarantee that | Promise clarity and naturalness, not detector outcomes |
|
|
58
|
+
| Announce and justify every edit | The preamble becomes the same friction the user asked to remove | Lead with the finished words |
|
|
59
|
+
|
|
60
|
+
## Output boundary
|
|
61
|
+
|
|
62
|
+
Treat the rewritten text as an artifact: keep harness commentary outside it. If the task also
|
|
63
|
+
requires a brújula block, place that block after a clear separation so it cannot be copied into an
|
|
64
|
+
email, document or message by accident.
|
|
65
|
+
|
|
66
|
+
## Orientación (siempre)
|
|
67
|
+
|
|
68
|
+
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?".)
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Evals — bro
|
|
2
|
+
|
|
3
|
+
These cases test two different claims: that human-language requests route to `bro` without
|
|
4
|
+
stealing adjacent writing jobs, and that the loaded skill produces a more natural result without
|
|
5
|
+
changing the payload.
|
|
6
|
+
|
|
7
|
+
## Triggering
|
|
8
|
+
|
|
9
|
+
Load only `bro` and run every `should_trigger` and `should_not_trigger` prompt in 3–5 fresh
|
|
10
|
+
sessions. A positive passes when `bro` loads in a majority of trials. A negative passes when it
|
|
11
|
+
stays quiet; also check that the declared `route_to` skill is the genuine owner. Require at least
|
|
12
|
+
90% accuracy across all cases.
|
|
13
|
+
|
|
14
|
+
## Capability
|
|
15
|
+
|
|
16
|
+
Run the capability scenario in two fresh conditions: without `bro`, then with it. Use the same
|
|
17
|
+
source answer and one consistent grader. Score each `must_include` point over three trials. The
|
|
18
|
+
with-skill condition must satisfy at least 80% of the rubric and beat the baseline by at least 20
|
|
19
|
+
percentage points.
|
|
20
|
+
|
|
21
|
+
This is an LLM/human-judged A/B eval, not deterministic CI. Re-run it after changing either the
|
|
22
|
+
description or the body; routing and prose quality are both wording-sensitive.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
skill: bro
|
|
2
|
+
|
|
3
|
+
# `bro` is the final-language pass: it rewrites an existing answer/draft or
|
|
4
|
+
# drafts requested text in a natural register. It does not define a reusable
|
|
5
|
+
# brand system, translate content, or choose a documentation/copy strategy.
|
|
6
|
+
should_trigger:
|
|
7
|
+
- prompt: "Bro, escribe como un humano."
|
|
8
|
+
why: "A terse bro-style instruction after an answer is the canonical request to rewrite the last assistant message naturally."
|
|
9
|
+
|
|
10
|
+
- prompt: "Rewrite your last answer so it sounds like a person, not a consultant."
|
|
11
|
+
why: "The user wants a human-language pass over the previous answer while preserving its content."
|
|
12
|
+
|
|
13
|
+
- prompt: "Haz este correo más natural y directo, pero no cambies las fechas ni los compromisos."
|
|
14
|
+
why: "Rewriting a supplied draft while preserving facts and commitments is the skill's core contract."
|
|
15
|
+
|
|
16
|
+
- prompt: "Això sona escrit per una IA. Fes-ho més humà i sense tanta cerimònia."
|
|
17
|
+
why: "Catalan request to remove AI-shaped formality tests multilingual semantic triggering."
|
|
18
|
+
|
|
19
|
+
- prompt: "Can you say that again in plain language without all the corporate jargon?"
|
|
20
|
+
why: "The symptom is jargon and artificial formality rather than the skill name, but the needed action is the same rewrite."
|
|
21
|
+
|
|
22
|
+
- prompt: "Escríbeme una respuesta breve y humana para decirle que llegaremos un día tarde."
|
|
23
|
+
why: "The user requests new text rather than a rewrite, but explicitly wants the same natural, truthful voice."
|
|
24
|
+
|
|
25
|
+
- prompt: "Keep all the technical details, just make it sound less robotic."
|
|
26
|
+
why: "Humanizing without deleting precision exercises the distinction between plain language and simplification."
|
|
27
|
+
|
|
28
|
+
should_not_trigger:
|
|
29
|
+
- prompt: "Define a reusable voice guide so every writer and channel sounds like our brand."
|
|
30
|
+
route_to: "brand-voice"
|
|
31
|
+
why: "A standing voice system is brand-voice; bro only performs a local writing pass."
|
|
32
|
+
|
|
33
|
+
- prompt: "Translate this onboarding email from English to Spanish and adapt the date and currency formats."
|
|
34
|
+
route_to: "translation-l10n"
|
|
35
|
+
why: "Translation and locale-aware adaptation are owned by translation-l10n, even when natural prose matters."
|
|
36
|
+
|
|
37
|
+
- prompt: "Turn this mixed README into a clean tutorial and API reference with runnable examples."
|
|
38
|
+
route_to: "technical-writing"
|
|
39
|
+
why: "Choosing documentation modes and restructuring technical docs is technical-writing, not a final tone pass."
|
|
40
|
+
|
|
41
|
+
- prompt: "Write the hero, value proposition and CTA for our pricing page."
|
|
42
|
+
route_to: "landing-copy"
|
|
43
|
+
why: "Conversion architecture and finished landing-page copy belong to landing-copy; bro may only polish its language afterward."
|
|
44
|
+
|
|
45
|
+
- prompt: "Rewrite this function to be simpler and remove the unnecessary abstractions."
|
|
46
|
+
route_to: "simplify-code"
|
|
47
|
+
why: "The requested source-code simplification is owned by simplify-code; 'rewrite' does not make it a prose task."
|
|
48
|
+
|
|
49
|
+
capability:
|
|
50
|
+
- scenario: "The previous assistant answer is a long Spanish status update full of headings, repeated summaries, corporate jargon and fake enthusiasm. Rewrite it for a client while preserving a June 30 deadline, a EUR 2,400 price, one unresolved risk, two URLs and the original uncertainty."
|
|
51
|
+
must_include:
|
|
52
|
+
- "preserves June 30, EUR 2,400, both URLs, the unresolved risk and the original uncertainty exactly"
|
|
53
|
+
- "uses natural Spanish appropriate for a client rather than automatically becoming slangy or over-casual"
|
|
54
|
+
- "removes needless headings, repeated conclusions, corporate filler and canned enthusiasm"
|
|
55
|
+
- "uses concrete verbs and readable sentence rhythm without adding typos or forced fragments"
|
|
56
|
+
- "does not invent evidence, anecdotes, opinions, commitments or certainty"
|
|
57
|
+
- "returns the rewritten message without a meta preface or an explanation of the edits"
|
|
58
|
+
- "keeps any harness orientation clearly outside the client-ready artifact"
|
|
@@ -133,4 +133,4 @@ clean = clean.with_columns(
|
|
|
133
133
|
|
|
134
134
|
pandera validates Polars frames too (`import pandera.polars as pa`), so the gate from
|
|
135
135
|
[validation-patterns.md](validation-patterns.md) carries over. Hand multi-GB analytical SQL to
|
|
136
|
-
[`duckdb`](
|
|
136
|
+
[`duckdb`](../../duckdb/SKILL.md) — the engine changes, the discipline does not.
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: decision-challenge
|
|
3
|
+
description: "Use when a high-impact plan, migration or architecture claim needs a bounded adversarial challenge before commitment. Isolates claims from persuasion, attacks assumptions, reconciles doubts with evidence and emits proceed/hold/stop. NOT a finished-diff review (`review`/`code-review`), NOT SDD artifact consistency (`analyze`)."
|
|
4
|
+
tags: [adversarial-review, decision-quality, assumptions, risk, preflight]
|
|
5
|
+
recommends: [analyze, review, code-review, decision-records, security-scan]
|
|
6
|
+
profiles: [core, full]
|
|
7
|
+
origin: risco
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# decision-challenge — doubt with a stopping rule
|
|
11
|
+
|
|
12
|
+
Use this immediately before a consequential commitment: an irreversible migration, a production-auth change, a costly architecture bet, a launch exception, or a plan whose confidence is higher than its evidence. The purpose is to find the decision-changing doubt, not to perform scepticism forever.
|
|
13
|
+
|
|
14
|
+
This skill is read-only unless the user also asks to change the artifact. It emits a challenge record and a verdict. Finished code review stays with `../review/SKILL.md` or `../code-review/SKILL.md`; consistency across constitution/spec/plan/tasks stays with `../analyze/SKILL.md`.
|
|
15
|
+
|
|
16
|
+
## One bounded cycle
|
|
17
|
+
|
|
18
|
+
```text
|
|
19
|
+
MATERIALIZE → ISOLATE → ATTACK → TEST → RECONCILE → VERDICT
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### 1. MATERIALIZE the decision
|
|
23
|
+
|
|
24
|
+
Do not challenge a cloud of conversation. Write the concrete packet:
|
|
25
|
+
|
|
26
|
+
- decision or claim being made;
|
|
27
|
+
- artifact and exact revision it applies to;
|
|
28
|
+
- constraints and invariants that must hold;
|
|
29
|
+
- evidence the author relies on;
|
|
30
|
+
- known unknowns;
|
|
31
|
+
- cost of a false positive (unnecessary stop) and false negative (unsafe proceed).
|
|
32
|
+
|
|
33
|
+
If the decision cannot be stated in one sentence, split it into claims. “The migration is safe” is not atomic; lock duration, dependency completeness, rollback time and consumer compatibility are separate claims.
|
|
34
|
+
|
|
35
|
+
### 2. ISOLATE claim from persuasion
|
|
36
|
+
|
|
37
|
+
Create a compact challenge packet containing the artifact, contract, constraints and evidence — not the author’s confidence, status, prestige or preferred conclusion. This reduces anchoring.
|
|
38
|
+
|
|
39
|
+
A genuinely fresh pass is useful when the platform and user authorize one: another agent/model/context can receive only the packet. It is optional, never automatic, and never an excuse to leak data or broaden tool authority. When independent execution is unavailable, make the isolation explicit and challenge locally.
|
|
40
|
+
|
|
41
|
+
### 3. ATTACK each material claim
|
|
42
|
+
|
|
43
|
+
For each claim, ask:
|
|
44
|
+
|
|
45
|
+
- What observation would make it false?
|
|
46
|
+
- Which dependency or consumer is missing from the inventory?
|
|
47
|
+
- Is the evidence direct, current and representative, or an analogy?
|
|
48
|
+
- What timing, ordering, concurrency or partial-failure path is assumed away?
|
|
49
|
+
- What privilege, data-quality or human handoff must work perfectly?
|
|
50
|
+
- If rollback is promised, has restoration time and data reconciliation been proved?
|
|
51
|
+
- Can the decision be made reversible or staged before accepting this risk?
|
|
52
|
+
|
|
53
|
+
Prefer one sharp counterexample over ten generic cautions. Rate doubts as blocker, material, or minor by consequence and likelihood; severity is not a count of how uncomfortable the question sounds.
|
|
54
|
+
|
|
55
|
+
### 4. TEST instead of debating
|
|
56
|
+
|
|
57
|
+
Turn the strongest doubts into evidence requests: dependency query, row count, dry run, restore rehearsal, shadow traffic, contract test, load profile, permission audit, failure injection or consumer confirmation. Run safe read-only checks that are in scope. Do not mutate production or recruit external systems merely to settle the argument.
|
|
58
|
+
|
|
59
|
+
### 5. RECONCILE claim by claim
|
|
60
|
+
|
|
61
|
+
Every doubt ends in one state:
|
|
62
|
+
|
|
63
|
+
- **verified** — direct evidence supports the claim;
|
|
64
|
+
- **refuted** — evidence contradicts it;
|
|
65
|
+
- **mitigated** — the plan changed so the original doubt no longer applies;
|
|
66
|
+
- **uncertain** — evidence is missing and consequence remains;
|
|
67
|
+
- **accepted risk** — an authorized owner explicitly accepts a bounded residual risk.
|
|
68
|
+
|
|
69
|
+
Record evidence, owner and next action. “Discussed” and “probably fine” are not states.
|
|
70
|
+
|
|
71
|
+
### 6. VERDICT
|
|
72
|
+
|
|
73
|
+
- **PROCEED** — no blocker survives; material uncertainties have owners and safe bounds.
|
|
74
|
+
- **HOLD** — a decision-critical uncertainty can be resolved without abandoning the approach.
|
|
75
|
+
- **STOP / REDESIGN** — a claim is refuted or the remaining downside is outside the stated tolerance.
|
|
76
|
+
|
|
77
|
+
Name what would change a HOLD or STOP verdict. A verdict without an unlock condition teaches nothing.
|
|
78
|
+
|
|
79
|
+
## Stopping rule
|
|
80
|
+
|
|
81
|
+
Run at most two cycles. A second cycle is allowed only after new evidence or a changed artifact. Stop earlier when a full pass produces no new blocker/material doubt. Rephrased uncertainty is not new evidence. If the decision remains uncertain after two cycles, keep the uncertainty in the verdict; do not manufacture confidence through repetition.
|
|
82
|
+
|
|
83
|
+
## Challenge record
|
|
84
|
+
|
|
85
|
+
```markdown
|
|
86
|
+
# Decision challenge — <decision> — <revision/date>
|
|
87
|
+
|
|
88
|
+
## Contract and stakes
|
|
89
|
+
Decision · invariants · false-positive cost · false-negative cost.
|
|
90
|
+
|
|
91
|
+
## Claims
|
|
92
|
+
| Claim | Evidence before | Doubt | Test/evidence | State | Owner |
|
|
93
|
+
|
|
94
|
+
## Surviving risk
|
|
95
|
+
Blockers · material uncertainty · accepted residual risk.
|
|
96
|
+
|
|
97
|
+
## Verdict
|
|
98
|
+
PROCEED / HOLD / STOP — reason — unlock condition.
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Anti-patterns
|
|
102
|
+
|
|
103
|
+
| Smell | Correction |
|
|
104
|
+
|---|---|
|
|
105
|
+
| Every reversible choice receives a panel | Reserve the skill for consequence, uncertainty or irreversibility. |
|
|
106
|
+
| The author’s explanation counts as independent evidence | Isolate claims and require an observation outside the persuasion. |
|
|
107
|
+
| Another model/agent is mandatory | Use fresh context only when authority, tooling and data boundaries allow it. |
|
|
108
|
+
| Executive pressure relabels a blocker as accepted risk | Require an accountable owner with authority over the consequence. |
|
|
109
|
+
| Domain controls are recreated generically | Route security to `security-scan` and AI quality experiments to `agent-eval`. |
|
|
110
|
+
|
|
111
|
+
## Orientación (siempre)
|
|
112
|
+
|
|
113
|
+
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?”.)
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
# Evals — decision-challenge
|
|
2
|
+
|
|
3
|
+
Routing must reserve this workflow for consequential pre-commitment decisions, keeping finished code review, SDD consistency, security audits and AI experiments with their owners. The capability case checks atomic claims, isolation from persuasion, evidence-producing challenges, explicit reconciliation and a bounded verdict.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
skill: decision-challenge
|
|
2
|
+
|
|
3
|
+
should_trigger:
|
|
4
|
+
- prompt: "Before the irreversible customer-ID migration, challenge every safety claim and give me proceed, hold, or stop."
|
|
5
|
+
why: "High-impact irreversible decision with explicit adversarial preflight."
|
|
6
|
+
- prompt: "No me creo nuestra propia confianza en este cambio de auth: separa las afirmaciones y busca qué las tumba."
|
|
7
|
+
why: "Spanish request to isolate and attack high-stakes claims."
|
|
8
|
+
- prompt: "Stress-test this architecture bet, especially the facts that would reverse the recommendation."
|
|
9
|
+
why: "A consequential choice needs decision-changing counterevidence."
|
|
10
|
+
- prompt: "Abans de signar el GO, qüestiona el pla sense deixar-te arrossegar per l'explicació de l'autor."
|
|
11
|
+
why: "Catalan request for an isolated adversarial launch decision."
|
|
12
|
+
- prompt: "The executive wants an exception to failed launch gates; build a challenge packet and reconcile the surviving risks."
|
|
13
|
+
why: "Authority pressure plus failed gates calls for evidence-bound verdict."
|
|
14
|
+
- prompt: "Our rollback claim is based on a backup; verify restore time, data reconciliation, and dependencies before we proceed."
|
|
15
|
+
why: "Specific migration claims need tests, not debate."
|
|
16
|
+
|
|
17
|
+
should_not_trigger:
|
|
18
|
+
- prompt: "Review this finished diff against the approved SDD spec and report findings."
|
|
19
|
+
route_to: review
|
|
20
|
+
why: "Post-verification SDD code judgment."
|
|
21
|
+
- prompt: "Review this standalone pull request; there is no spec or plan."
|
|
22
|
+
route_to: code-review
|
|
23
|
+
why: "Spec-less concrete diff review."
|
|
24
|
+
- prompt: "Cross-read the constitution, spec, plan and tasks for contradictions before implementation."
|
|
25
|
+
route_to: analyze
|
|
26
|
+
why: "Pre-code consistency gate across SDD artifacts."
|
|
27
|
+
- prompt: "Threat-model the upload endpoint and run the repository security scanners."
|
|
28
|
+
route_to: security-scan
|
|
29
|
+
why: "Security domain audit and tooling own the task."
|
|
30
|
+
- prompt: "Compare the new system prompt to the old one on a golden set and measure lift."
|
|
31
|
+
route_to: agent-eval
|
|
32
|
+
why: "Controlled AI-system evaluation, not generic decision challenge."
|
|
33
|
+
|
|
34
|
+
capability:
|
|
35
|
+
- scenario: "A team plans to replace integer customer IDs with UUIDs in one maintenance window and assumes foreign keys, external consumers, duration and last night's backup are all sufficient."
|
|
36
|
+
must_include:
|
|
37
|
+
- "Materializes separate claims for dependency coverage, row volume/duration, consumer compatibility, restore timing, and data reconciliation."
|
|
38
|
+
- "Creates an isolated challenge packet that excludes author confidence and treats the migration artifact/revision as fixed input."
|
|
39
|
+
- "Raises concrete counterexamples and converts the strongest doubts into read-only inventory, dry-run, restore-rehearsal, and consumer-evidence requests."
|
|
40
|
+
- "Reconciles each claim as verified, refuted, mitigated, uncertain, or explicitly accepted risk with evidence and owner."
|
|
41
|
+
- "Issues PROCEED, HOLD, or STOP with a clear reason and the evidence/change that would unlock a non-proceed verdict."
|
|
42
|
+
- "Applies the two-cycle stopping rule and does not require cross-model execution or mutate production without authority."
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: deprecation
|
|
3
|
+
description: "Use when retiring a public API, feature, integration, service or legacy path without abandoning consumers. Inventories usage, classifies advisory vs compulsory migration, ships compatibility/tooling, assigns owners and gates removal on evidence. NOT live schema expand-contract (`db-migrations`), NOT replacement API design (`api-design`)."
|
|
4
|
+
tags: [deprecation, migration, compatibility, consumer-migration, removal]
|
|
5
|
+
recommends: [api-design, db-migrations, deployment, git-workflow, monitoring]
|
|
6
|
+
profiles: [core, full]
|
|
7
|
+
origin: risco
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# deprecation — removal is a consumer migration
|
|
11
|
+
|
|
12
|
+
Deprecation is not a date in a changelog. It is the controlled transfer of real consumers from an old contract to a supported replacement, followed by evidence that removal no longer breaks anyone important.
|
|
13
|
+
|
|
14
|
+
This skill owns the cross-consumer program. It delegates the replacement interface to `../api-design/SKILL.md`, live schema mechanics to `../db-migrations/SKILL.md`, release/version mechanics to `../git-workflow/SKILL.md`, and rollout/rollback execution to `../deployment/SKILL.md`.
|
|
15
|
+
|
|
16
|
+
## The retirement sequence
|
|
17
|
+
|
|
18
|
+
```text
|
|
19
|
+
INVENTORY → CLASSIFY → ENABLE → NOTIFY → MIGRATE → OBSERVE → REMOVE
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### 1. INVENTORY the contract and consumers
|
|
23
|
+
|
|
24
|
+
Identify:
|
|
25
|
+
|
|
26
|
+
- exact endpoints, events, schemas, flags, SDK methods, jobs, services and docs being retired;
|
|
27
|
+
- internal and external consumers, owners and contractual notice periods;
|
|
28
|
+
- traffic/usage by consumer, version and operation;
|
|
29
|
+
- data written only by the old path and compatibility obligations;
|
|
30
|
+
- support, reseller or offline consumers invisible to runtime telemetry;
|
|
31
|
+
- current fallback and restoration options.
|
|
32
|
+
|
|
33
|
+
“No known users” is not an inventory. Query telemetry, code search, dependency graphs, access keys, support records and account owners. Record where visibility is incomplete.
|
|
34
|
+
|
|
35
|
+
### 2. CLASSIFY the migration
|
|
36
|
+
|
|
37
|
+
- **Advisory:** the old path remains supported; migration is encouraged for benefit or future-proofing.
|
|
38
|
+
- **Compulsory:** support will end or continued use creates unacceptable security, reliability, legal or operating risk.
|
|
39
|
+
|
|
40
|
+
Only compulsory migrations justify a removal deadline. State the forcing reason and who has authority to accept exceptions. A deadline should respect contracts, effort and evidence; do not import a universal 30/60/90-day calendar.
|
|
41
|
+
|
|
42
|
+
### 3. ENABLE migration before announcing removal
|
|
43
|
+
|
|
44
|
+
The replacement must be usable first:
|
|
45
|
+
|
|
46
|
+
- compatible contract or adapter where feasible;
|
|
47
|
+
- migration guide with old → new mappings and changed semantics;
|
|
48
|
+
- tooling, codemod, SDK or dual-write/read path for repetitive work;
|
|
49
|
+
- test/sandbox path and representative examples;
|
|
50
|
+
- rollback or temporary compatibility mode;
|
|
51
|
+
- ownership for data backfill and reconciliation.
|
|
52
|
+
|
|
53
|
+
For database changes, use expand → backfill → switch reads/writes → contract through `../db-migrations/SKILL.md`. Do not promise a generic `down` migration for irreversible data transformations; prove the actual restoration/reconciliation path instead.
|
|
54
|
+
|
|
55
|
+
### 4. NOTIFY through machine and human channels
|
|
56
|
+
|
|
57
|
+
Use the channels the consumer will actually see: response headers, compiler/runtime warnings, API dashboards, release notes, direct account contact, support and status communications. A warning must name the replacement, action, consequence, evidence link and earliest removal condition.
|
|
58
|
+
|
|
59
|
+
Versioned public APIs should follow their compatibility policy and SemVer where it applies. Machine warnings without a migration guide create noise; an email without runtime identification misses the real owner. Use both when the surface permits.
|
|
60
|
+
|
|
61
|
+
### 5. MIGRATE with explicit ownership
|
|
62
|
+
|
|
63
|
+
The team introducing the deprecation owns the common migration path: inventory, docs, automation, default internal consumers and escalation. Consumer teams own domain-specific acceptance and scheduling, not rediscovering the replacement.
|
|
64
|
+
|
|
65
|
+
Track each consumer as: uncontacted, acknowledged, testing, migrated, exempted with expiry, unreachable, or blocked. Give blockers an owner and next action. Reseller-managed or unknown consumers need a separate reachability plan; do not silently exclude them from the denominator.
|
|
66
|
+
|
|
67
|
+
### 6. OBSERVE real cutover
|
|
68
|
+
|
|
69
|
+
Instrument old-path usage by consumer and operation, plus errors on the replacement. Where risk warrants it, shadow or dual-run and compare results before switching authority. Dashboards must distinguish legitimate residual traffic, retries and synthetic probes from active dependency.
|
|
70
|
+
|
|
71
|
+
Define the removal gate up front, for example:
|
|
72
|
+
|
|
73
|
+
- no non-exempt production use for a representative window;
|
|
74
|
+
- every contractually covered consumer notified and migrated or explicitly exempted;
|
|
75
|
+
- replacement error/SLO health acceptable;
|
|
76
|
+
- rollback/compatibility response tested;
|
|
77
|
+
- support, docs and on-call ready for late discoveries.
|
|
78
|
+
|
|
79
|
+
The representative window depends on consumer cadence. A monthly batch needs more than a quiet week.
|
|
80
|
+
|
|
81
|
+
### 7. REMOVE in a reversible order
|
|
82
|
+
|
|
83
|
+
Disable entry first, observe, then delete implementation, flags, compatibility code, credentials, dashboards and documentation that exist only for the old path. Preserve audit/history records. Update dependency and ownership maps so the retired system does not remain a zombie operational obligation.
|
|
84
|
+
|
|
85
|
+
If unexpected material traffic appears, re-enable the bounded compatibility path and return to migration. Do not restore an undocumented permanent fork.
|
|
86
|
+
|
|
87
|
+
## Deprecation record
|
|
88
|
+
|
|
89
|
+
```markdown
|
|
90
|
+
# Deprecation — <old> → <replacement>
|
|
91
|
+
|
|
92
|
+
## Classification and reason
|
|
93
|
+
Advisory/compulsory · forcing reason · authority · notice constraints.
|
|
94
|
+
|
|
95
|
+
## Inventory
|
|
96
|
+
Contracts · consumers · owners · baseline usage · visibility gaps.
|
|
97
|
+
|
|
98
|
+
## Migration path
|
|
99
|
+
Compatibility · guide/tooling · data plan · rollback/reconciliation.
|
|
100
|
+
|
|
101
|
+
## Consumer ledger
|
|
102
|
+
Consumer · state · owner · last old-path use · blocker/exception expiry.
|
|
103
|
+
|
|
104
|
+
## Removal gate and evidence
|
|
105
|
+
Window · zero-use evidence · replacement health · support/rollback readiness.
|
|
106
|
+
|
|
107
|
+
## Removal log
|
|
108
|
+
Disabled · observed · deleted · residual artifacts.
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## Anti-patterns
|
|
112
|
+
|
|
113
|
+
| Smell | Correction |
|
|
114
|
+
|---|---|
|
|
115
|
+
| The calendar arrives while material traffic remains | Hold removal; the gate is evidence, not date alone. |
|
|
116
|
+
| Every consumer writes the same adapter | The deprecating team owns common tooling and default migrations. |
|
|
117
|
+
| Internal code search proves external zero-use | Combine runtime identity, contracts, support and account ownership. |
|
|
118
|
+
| Temporary compatibility has no owner or expiry | Track an explicit exception with accountable owner and end condition. |
|
|
119
|
+
| Deprecation silently grants deploy authority | Keep live rollout/rollback explicit through `deployment`. |
|
|
120
|
+
|
|
121
|
+
## Orientación (siempre)
|
|
122
|
+
|
|
123
|
+
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?”.)
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
# Evals — deprecation
|
|
2
|
+
|
|
3
|
+
Routing separates the consumer-migration program from schema mechanics, replacement API design, Git versioning, deployment and ADR authoring. The capability case requires consumer completeness, contractual timing, migration enablement, multichannel notice, measured cutover and a reversible removal sequence.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
skill: deprecation
|
|
2
|
+
|
|
3
|
+
should_trigger:
|
|
4
|
+
- prompt: "We need to retire the v1 public API without stranding 200 external consumers."
|
|
5
|
+
why: "Public contract retirement with consumer migration is the core workflow."
|
|
6
|
+
- prompt: "Planifica la retirada del login legado: inventario, avisos, migración, telemetría y puerta de borrado."
|
|
7
|
+
why: "Spanish request names the complete deprecation program."
|
|
8
|
+
- prompt: "This SDK method is deprecated; ship a codemod and prove no supported clients still call it before removal."
|
|
9
|
+
why: "Migration tooling plus measured zero-use gate."
|
|
10
|
+
- prompt: "Hem de retirar una integració antiga, però alguns clients només executen un batch mensual."
|
|
11
|
+
why: "Catalan case where the observation window must match consumer cadence."
|
|
12
|
+
- prompt: "Classify this migration as advisory or compulsory and define who can grant expiring exceptions."
|
|
13
|
+
why: "The forcing model and exception authority are deprecation decisions."
|
|
14
|
+
- prompt: "Track every consumer from uncontacted to migrated and gate deletion on replacement health and tested rollback."
|
|
15
|
+
why: "Consumer ledger and evidence-based removal gate."
|
|
16
|
+
|
|
17
|
+
should_not_trigger:
|
|
18
|
+
- prompt: "Add a nullable column, backfill ten million rows in batches, then enforce NOT NULL without downtime."
|
|
19
|
+
route_to: db-migrations
|
|
20
|
+
why: "Concrete live schema expand-contract mechanics."
|
|
21
|
+
- prompt: "Design the v2 API resources, error envelope, pagination and OpenAPI contract."
|
|
22
|
+
route_to: api-design
|
|
23
|
+
why: "Replacement interface design precedes the migration program."
|
|
24
|
+
- prompt: "Choose the SemVer tag and write the Conventional Commit for this breaking release."
|
|
25
|
+
route_to: git-workflow
|
|
26
|
+
why: "Version and Git release conventions."
|
|
27
|
+
- prompt: "Deploy the compatibility adapter to production with a healthcheck and rollback command."
|
|
28
|
+
route_to: deployment
|
|
29
|
+
why: "Authorized live rollout execution."
|
|
30
|
+
- prompt: "Write an ADR explaining why the team chose v2 over extending v1."
|
|
31
|
+
route_to: decision-records
|
|
32
|
+
why: "Durable decision rationale, not consumer migration execution."
|
|
33
|
+
|
|
34
|
+
capability:
|
|
35
|
+
- scenario: "Deprecate a v1 REST API used by 200 organizations; v2 is live, current telemetry sees 173 active keys, twelve accounts are reseller-managed, and the largest contract requires 90 days' notice."
|
|
36
|
+
must_include:
|
|
37
|
+
- "Inventories exact v1 surfaces, all consumer classes, owners, contractual notice, baseline usage, data obligations, and telemetry/reachability gaps."
|
|
38
|
+
- "Classifies advisory versus compulsory with a forcing reason, authority, and expiring exception policy rather than an arbitrary universal timeline."
|
|
39
|
+
- "Makes v2 usable first through compatibility, guide, tooling/SDK, test path, data reconciliation, and a real restoration strategy."
|
|
40
|
+
- "Uses both machine-visible warnings and direct human channels, including a plan for reseller-managed and unreachable consumers."
|
|
41
|
+
- "Maintains a per-consumer migration ledger and assigns common migration work to the deprecating team rather than every consumer."
|
|
42
|
+
- "Defines a representative zero-use and replacement-health removal gate, then disables, observes, and deletes in reversible order."
|
|
@@ -5,6 +5,9 @@ Append-only log of wanted-but-missing topics. Entries are flagged
|
|
|
5
5
|
deleted. Compaction (Deep Improve only) removes `[FILLED]` entries older
|
|
6
6
|
than 90 days, with a single compaction marker entry in `wiki/log.md`.
|
|
7
7
|
|
|
8
|
+
One entry per gap, in this shape:
|
|
9
|
+
|
|
10
|
+
```markdown
|
|
8
11
|
## [YYYY-MM-DD] gap | {concept}
|
|
9
12
|
|
|
10
13
|
Source: {where this gap was detected — a query that couldn't answer, N
|
|
@@ -16,3 +19,4 @@ Mentioned in: [Article A](topic/a.md); [Article B](topic/b.md)
|
|
|
16
19
|
Suggested topic: {topic where the new article would belong}
|
|
17
20
|
|
|
18
21
|
Status: open
|
|
22
|
+
```
|