Elevate
Explore the current project deeply, then answer:
What are the highest-leverage architectural, framework, tooling, or DX improvements you could make to this project right now?
Produce a ranked list of 5–10 opportunities with a scoring matrix. The technical twin of innovate (which asks for product moves).
Focus argument
The skill accepts an optional free-form focus string (e.g., feedback-loop, developer experience, build speed, testing, observability, CI pipeline).
- No focus: survey all four dimensions (architecture, libraries, tooling, DX/infra).
- With focus: interpret the string, map it to relevant dimensions, and return only opportunities that match. Do not include off-focus candidates, even if they look higher-leverage.
Process
Read the project. CLAUDE.md, README, key config (package.json, tsconfig, build configs, lockfiles, CI workflows).
Discover ADRs and architectural rules. Check in order:
docs/adr/, docs/adrs/, docs/architecture/decisions/, adr/, adrs/
.claude/rules/ (architectural guidelines stored as rules)
- If none found, grep for
ADR- or # Architecture Decision to catch non-standard layouts.
Parse each ADR/rule to extract what it prescribes or forbids.
Skim for friction. Recent git history, hot-path code, repeated workarounds, slow builds, awkward patterns, stale deps, TODOs.
Generate candidates across four dimensions:
- Architecture — layering, module boundaries, data flow, state shape
- Libraries & frameworks — outdated/deprecated deps, better alternatives, version bumps
- Build & tooling — bundler, compiler, package manager, monorepo structure, CI/CD, type system
- DX & infrastructure — testing strategy, observability, logging, error tracking, feature flags, local dev
Apply focus filter if a focus argument was given. Drop non-matching candidates.
Check each candidate against ADRs/rules. If a candidate contradicts an ADR, keep it in the matrix but flag it as ADR-blocked and de-rank it (it is not actionable without revisiting the ADR first).
6.5. Check prior attempts via devsql. For each candidate, search this project's Claude/Codex history and git commits for prior work on the same topic. Derive 2+ keywords from the candidate, scope to the current project (history.project = '<cwd>'), and read the matching prompts/commits before classifying — a keyword hit is not proof. See the devsql-querying skill for table shapes and the standard datetime(timestamp/1000,'unixepoch') conversion.
Take the date into account. A candidate that failed 6+ months ago due to missing prerequisites, tool gaps, or excessive effort may be viable today. Do not let a stale failure kill a currently-viable candidate.
Classify each candidate's prior-attempt state and tag it:
shipped — matching commits present and not reverted → drop the candidate (already done)
reverted-recent (<3 months) — Confidence=Low, Notes cite revert SHA + likely reason
reverted-stale (≥6 months) — Keep original Confidence, Notes call out the prior attempt and ask the user whether the blocker still applies before committing to the score
struggled — many prompts on the topic with zero commits → Confidence=Low, Notes cite the prompt-day
deferred — prompts discussing it but no attempt → Notes surface prior rationale, no scoring change
none — normal scoring
If devsql is unavailable or the project has no history rows, print Prior-attempt history: unavailable above the matrix and skip this step.
Score each surviving candidate on four axes (see below).
Surface load-bearing assumptions. For each candidate, list the 1–3 assumptions the Impact and Effort scores depend on. Classify each:
[verified] — the assumption is self-evident from code/config already read (cite file:line or a specific snippet). Treat as verified.
[probe:feasibility] — confirms the change is technically viable on this codebase (tool parity, plugin compat, known edge cases, semantic gaps between alternatives). Failure of a feasibility probe kills the candidate, regardless of impact.
[probe:impact] — confirms the magnitude of the gain (wallclock, bundle size, error rate, contributor time saved).
[unverifiable] — needs infra or prod data the skill can't touch (prod error rate, CI minutes). Keep, but mark.
For each [probe:*], specify a concrete, cheap command or measurement the user can run in under ~10 min to confirm. Examples: minimal repro file compiled with both tools to diff output, turbo run <task> --dry=json | jq '...' to tell real work from no-ops, hyperfine for wallclock, du -sh node_modules/.cache for cache plausibility, rg -c <pattern> for call-site counts, reading one file the skill hasn't yet read.
Feasibility-first rule: if a [probe:feasibility] exists and runs in <10 min, surface it as the first probe to run for that candidate. Its result can kill the candidate before any impact measurement is worth doing.
Do not auto-run probes. The skill suggests; the user decides whether to execute. Any candidate with an unverified [probe:*] or [unverifiable] assumption driving an L/XL Impact or S Effort score must be scored Confidence = Low, regardless of how strong the structural signal looks. Keep it in the matrix; don't cap its Impact — let Confidence do the demotion.
Rank by composite ROI signal. Trim to the 5–10 strongest. Fewer is fine for small/pristine codebases; more is fine for messy ones — let signal decide.
Output the matrix and per-opportunity details. For the top 3 candidates, include a Cheapest kill-switch line: the single fastest test that invalidates the candidate if it fails. This is usually the [probe:feasibility] already listed, restated as the literal first thing to run.
Ask which row(s) the user wants expanded into implementation steps. Do not auto-expand.
Scoring scale
Use T-shirt sizes — honest about the estimation involved, no false precision.
| Axis |
Scale |
Meaning |
| Impact |
S / M / L / XL |
Pain removed or velocity unlocked, measured as user-observable outcome (wallclock, error rate, contributor time saved). Structural proxies alone — DAG edges removed, files touched, lines deleted, tasks in a graph — are not Impact; if only a proxy is available, Confidence caps at Low. |
| Effort |
S / M / L / XL |
Rough engineering cost (hours → weeks). Includes both implementation AND validation cost. A 10-line config change that touches a surface of 300+ files (call sites, decorators, schemas) cannot be S — the validation tail dominates. Estimate the real "until I trust it shipped" cost, not just the diff size. |
| Risk |
Low / Med / High |
Blast radius + reversibility |
| Confidence |
Low / Med / High |
How sure the skill is about Impact and Effort given codebase signals. Any unverified [probe:*] or [unverifiable] assumption behind an L/XL Impact or S Effort forces this to Low. |
Ranking heuristic: favor high Impact + low Effort + low Risk + high Confidence. ADR-blocked candidates sink to the bottom. Candidates with unverified load-bearing assumptions sink via Confidence=Low, even if their structural signal looks XL — this is intentional, and prevents proxy-driven overestimates from topping the list.
Scope — explicitly refuse to propose
- Pure code cleanup — dead code, renames, file splits belong to
simplify / code-slop / quality-gate
- Single-bug fixes — if it's scoped to one bug, it isn't an architectural leap
- Feature additions — product capabilities are
innovate's turf
- Speculative rewrites — no "rewrite in Rust" or "migrate to microservices" unless the codebase genuinely demands it; bias toward proven, reversible changes
Output shape
# Elevate — <focus area or "full audit">
ADRs consulted: <list of ADR files / rules found, or "none found">
## Ranking matrix
| # | Opportunity | Impact | Effort | Risk | Confidence | Prior | Probes | Notes |
|---|---|---|---|---|---|---|---|---|
| 1 | <name> | L | S | Low | High | none | ok | |
| 2 | <name> | XL | M | Med | Low | reverted-stale | 2 pending (1 feasibility) | prior attempt 2024-08 (sha1234) — check if blocker still applies; unverified `[probe:feasibility]` gates XL |
| … |
| N | <name> | M | S | Low | Low | none | ok | ⚠️ ADR-blocked (ADR-0012) |
`Prior` column values: `none / reverted-recent / reverted-stale / struggled / deferred`. `shipped` candidates are dropped, not listed. When the column is omitted entirely, `Prior-attempt history: unavailable` must be printed above the matrix.
`Probes` column: `ok` when every load-bearing assumption is `[verified]`; otherwise `<N> pending` where N counts outstanding `[probe:*]` / `[unverifiable]` entries. If any pending probe is `feasibility`, call it out: `<N> pending (<M> feasibility)`.
## Opportunities
### 1. <Opportunity name>
**Problem:** <real friction visible in the code/stack>
**Change:** <what to do, concretely>
**Impact:** <what this unlocks, in user-observable terms>
**Risk:** <what could go wrong; reversibility>
**Migration path:** <incremental steps, not big-bang>
**Evidence:** <file paths, git signals, hot-paths that motivated this>
**Assumptions & probes:**
- `[verified]` <assumption> — <file:line or reasoning already in context>
- `[probe:feasibility]` <assumption> — run: `<command>` → expect `<signal>` to confirm; failure kills the candidate
- `[probe:impact]` <assumption> — run: `<command>` → expect `<signal>` to confirm magnitude
- `[unverifiable]` <assumption> — <why it can't be checked now>
**Cheapest kill-switch:** <single command/test, <10 min, that invalidates the candidate if it fails> *(top 3 only)*
### 2. …
### N. <ADR-blocked opportunity>
**Problem:** <…>
**Change:** <…>
**ADR conflict:** Contradicts `<ADR path / title>` which states "<quoted directive>". Not actionable without revisiting that decision.
**Evidence:** <…>
After the matrix and details, ask:
Which opportunities would you like expanded into implementation steps?
Do not auto-generate implementation steps. Wait for the user to pick.
1---2name: elevate3description: This skill should be used when the user wants a ranked list of the highest-leverage technical or architectural improvements to make to their project, presented as a ranking matrix. The technical counterpart to `innovate`. Triggers on requests like "elevate", "biggest tech wins", "best architectural moves", "what should I upgrade", "improvement opportunities", or "tech audit". Accepts an optional focus argument (e.g., "feedback-loop", "dx", "build speed", "testing", "observability") to constrain the search.4---56# Elevate78Explore the current project deeply, then answer:910**What are the highest-leverage architectural, framework, tooling, or DX improvements you could make to this project right now?**1112Produce a **ranked list of 5–10 opportunities** with a scoring matrix. The technical twin of `innovate` (which asks for product moves).1314## Focus argument1516The skill accepts an optional free-form focus string (e.g., `feedback-loop`, `developer experience`, `build speed`, `testing`, `observability`, `CI pipeline`).1718- **No focus:** survey all four dimensions (architecture, libraries, tooling, DX/infra).19- **With focus:** interpret the string, map it to relevant dimensions, and return **only** opportunities that match. Do not include off-focus candidates, even if they look higher-leverage.2021## Process22231. **Read the project.** CLAUDE.md, README, key config (package.json, tsconfig, build configs, lockfiles, CI workflows).242. **Discover ADRs and architectural rules.** Check in order:25 - `docs/adr/`, `docs/adrs/`, `docs/architecture/decisions/`, `adr/`, `adrs/`26 - `.claude/rules/` (architectural guidelines stored as rules)27 - If none found, grep for `ADR-` or `# Architecture Decision` to catch non-standard layouts.28 Parse each ADR/rule to extract what it prescribes or forbids.293. **Skim for friction.** Recent git history, hot-path code, repeated workarounds, slow builds, awkward patterns, stale deps, TODOs.304. **Generate candidates** across four dimensions:31 - **Architecture** — layering, module boundaries, data flow, state shape32 - **Libraries & frameworks** — outdated/deprecated deps, better alternatives, version bumps33 - **Build & tooling** — bundler, compiler, package manager, monorepo structure, CI/CD, type system34 - **DX & infrastructure** — testing strategy, observability, logging, error tracking, feature flags, local dev355. **Apply focus filter** if a focus argument was given. Drop non-matching candidates.366. **Check each candidate against ADRs/rules.** If a candidate contradicts an ADR, keep it in the matrix but flag it as **ADR-blocked** and de-rank it (it is not actionable without revisiting the ADR first).376.5. **Check prior attempts via `devsql`.** For each candidate, search this project's Claude/Codex history and git commits for prior work on the same topic. Derive 2+ keywords from the candidate, scope to the current project (`history.project = '<cwd>'`), and **read the matching prompts/commits before classifying** — a keyword hit is not proof. See the `devsql-querying` skill for table shapes and the standard `datetime(timestamp/1000,'unixepoch')` conversion.3839 **Take the date into account.** A candidate that failed 6+ months ago due to missing prerequisites, tool gaps, or excessive effort may be viable today. Do not let a stale failure kill a currently-viable candidate.4041 Classify each candidate's prior-attempt state and tag it:42 - **`shipped`** — matching commits present and not reverted → **drop the candidate** (already done)43 - **`reverted-recent`** (<3 months) — Confidence=Low, Notes cite revert SHA + likely reason44 - **`reverted-stale`** (≥6 months) — Keep original Confidence, Notes call out the prior attempt and ask the user whether the blocker still applies before committing to the score45 - **`struggled`** — many prompts on the topic with zero commits → Confidence=Low, Notes cite the prompt-day46 - **`deferred`** — prompts discussing it but no attempt → Notes surface prior rationale, no scoring change47 - **`none`** — normal scoring4849 If `devsql` is unavailable or the project has no history rows, print `Prior-attempt history: unavailable` above the matrix and skip this step.507. **Score** each surviving candidate on four axes (see below).518. **Surface load-bearing assumptions.** For each candidate, list the 1–3 assumptions the Impact and Effort scores depend on. Classify each:52 - **`[verified]`** — the assumption is self-evident from code/config already read (cite `file:line` or a specific snippet). Treat as verified.53 - **`[probe:feasibility]`** — confirms the change is technically viable on **this** codebase (tool parity, plugin compat, known edge cases, semantic gaps between alternatives). Failure of a feasibility probe **kills the candidate**, regardless of impact.54 - **`[probe:impact]`** — confirms the magnitude of the gain (wallclock, bundle size, error rate, contributor time saved).55 - **`[unverifiable]`** — needs infra or prod data the skill can't touch (prod error rate, CI minutes). Keep, but mark.5657 For each `[probe:*]`, specify a concrete, cheap command or measurement the user can run in **under ~10 min** to confirm. Examples: minimal repro file compiled with both tools to diff output, `turbo run <task> --dry=json | jq '...'` to tell real work from no-ops, `hyperfine` for wallclock, `du -sh node_modules/.cache` for cache plausibility, `rg -c <pattern>` for call-site counts, reading one file the skill hasn't yet read.5859 **Feasibility-first rule:** if a `[probe:feasibility]` exists and runs in <10 min, surface it as the **first probe to run** for that candidate. Its result can kill the candidate before any impact measurement is worth doing.6061 **Do not auto-run probes.** The skill suggests; the user decides whether to execute. Any candidate with an unverified `[probe:*]` or `[unverifiable]` assumption driving an L/XL Impact or S Effort score must be scored **Confidence = Low**, regardless of how strong the structural signal looks. Keep it in the matrix; don't cap its Impact — let Confidence do the demotion.629. **Rank** by composite ROI signal. Trim to the 5–10 strongest. Fewer is fine for small/pristine codebases; more is fine for messy ones — let signal decide.6310. **Output** the matrix and per-opportunity details. For the **top 3 candidates**, include a `Cheapest kill-switch` line: the single fastest test that invalidates the candidate if it fails. This is usually the `[probe:feasibility]` already listed, restated as the literal first thing to run.6411. **Ask** which row(s) the user wants expanded into implementation steps. Do not auto-expand.6566## Scoring scale6768Use T-shirt sizes — honest about the estimation involved, no false precision.6970| Axis | Scale | Meaning |71|---|---|---|72| **Impact** | S / M / L / XL | Pain removed or velocity unlocked, measured as **user-observable outcome** (wallclock, error rate, contributor time saved). Structural proxies alone — DAG edges removed, files touched, lines deleted, tasks in a graph — are not Impact; if only a proxy is available, Confidence caps at Low. |73| **Effort** | S / M / L / XL | Rough engineering cost (hours → weeks). Includes **both implementation AND validation cost**. A 10-line config change that touches a surface of 300+ files (call sites, decorators, schemas) cannot be S — the validation tail dominates. Estimate the real "until I trust it shipped" cost, not just the diff size. |74| **Risk** | Low / Med / High | Blast radius + reversibility |75| **Confidence** | Low / Med / High | How sure the skill is about Impact and Effort given codebase signals. Any unverified `[probe:*]` or `[unverifiable]` assumption behind an L/XL Impact or S Effort forces this to Low. |7677Ranking heuristic: favor **high Impact + low Effort + low Risk + high Confidence**. ADR-blocked candidates sink to the bottom. **Candidates with unverified load-bearing assumptions sink via Confidence=Low**, even if their structural signal looks XL — this is intentional, and prevents proxy-driven overestimates from topping the list.7879## Scope — explicitly refuse to propose8081- **Pure code cleanup** — dead code, renames, file splits belong to `simplify` / `code-slop` / `quality-gate`82- **Single-bug fixes** — if it's scoped to one bug, it isn't an architectural leap83- **Feature additions** — product capabilities are `innovate`'s turf84- **Speculative rewrites** — no "rewrite in Rust" or "migrate to microservices" unless the codebase genuinely demands it; bias toward proven, reversible changes8586## Output shape8788```89# Elevate — <focus area or "full audit">9091ADRs consulted: <list of ADR files / rules found, or "none found">9293## Ranking matrix9495| # | Opportunity | Impact | Effort | Risk | Confidence | Prior | Probes | Notes |96|---|---|---|---|---|---|---|---|---|97| 1 | <name> | L | S | Low | High | none | ok | |98| 2 | <name> | XL | M | Med | Low | reverted-stale | 2 pending (1 feasibility) | prior attempt 2024-08 (sha1234) — check if blocker still applies; unverified `[probe:feasibility]` gates XL |99| … |100| N | <name> | M | S | Low | Low | none | ok | ⚠️ ADR-blocked (ADR-0012) |101102`Prior` column values: `none / reverted-recent / reverted-stale / struggled / deferred`. `shipped` candidates are dropped, not listed. When the column is omitted entirely, `Prior-attempt history: unavailable` must be printed above the matrix.103104`Probes` column: `ok` when every load-bearing assumption is `[verified]`; otherwise `<N> pending` where N counts outstanding `[probe:*]` / `[unverifiable]` entries. If any pending probe is `feasibility`, call it out: `<N> pending (<M> feasibility)`.105106## Opportunities107108### 1. <Opportunity name>109**Problem:** <real friction visible in the code/stack>110**Change:** <what to do, concretely>111**Impact:** <what this unlocks, in user-observable terms>112**Risk:** <what could go wrong; reversibility>113**Migration path:** <incremental steps, not big-bang>114**Evidence:** <file paths, git signals, hot-paths that motivated this>115**Assumptions & probes:**116- `[verified]` <assumption> — <file:line or reasoning already in context>117- `[probe:feasibility]` <assumption> — run: `<command>` → expect `<signal>` to confirm; failure kills the candidate118- `[probe:impact]` <assumption> — run: `<command>` → expect `<signal>` to confirm magnitude119- `[unverifiable]` <assumption> — <why it can't be checked now>120**Cheapest kill-switch:** <single command/test, <10 min, that invalidates the candidate if it fails> *(top 3 only)*121122### 2. …123124### N. <ADR-blocked opportunity>125**Problem:** <…>126**Change:** <…>127**ADR conflict:** Contradicts `<ADR path / title>` which states "<quoted directive>". Not actionable without revisiting that decision.128**Evidence:** <…>129```130131After the matrix and details, ask:132133> Which opportunities would you like expanded into implementation steps?134135Do not auto-generate implementation steps. Wait for the user to pick.