Best for
- Use when asked to "test a renovate PR", "triage renovate", "assess a renovate bump", or "check a dependency upgrade".
lightdash/lightdash/.claude/skills/renovate-pr/SKILL.md
Test and assess an open Renovate dependency-bump PR. Picks the first open Renovate PR, checks out the branch, starts the app, exercises code paths affected by the upgraded package, reviews the changelog and (if needed) the upstream source diff, and reports whether the bump is safe to merge. Use when asked to "test a renovate PR", "triage renovate", "assess a renovate bump", or "check a dependency upgrade".
Decision brief
Pick the first open Renovate PR, run the app against it, exercise the affected code paths, and tell the user whether the bump is safe.
Compatibility matrix
| Platform | Status | Evidence | What to check |
|---|---|---|---|
| Codex | Not declared | No explicit evidence | Portability before use |
| Claude Code | Not declared | No explicit evidence | Portability before use |
| Cursor | Not declared | No explicit evidence | Portability before use |
| Gemini CLI | Not declared | No explicit evidence | Portability before use |
Installation
The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.
npx skills add https://github.com/lightdash/lightdash --skill ".claude/skills/renovate-pr"Inspect the Agent Skill "renovate-pr" from https://github.com/lightdash/lightdash/blob/086e216d65653d5fb1898d2c4cafff4ec15e3ad4/.claude/skills/renovate-pr/SKILL.md at commit 086e216d65653d5fb1898d2c4cafff4ec15e3ad4. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.
Workflow
Find open Renovate PRs and take the first one:
Renovate PR bodies always contain a markdown table that looks like:
For each package, fetch the upstream release notes spanning oldVersion..newVersion. Try in order, stop at the first that yields useful content:
For each package, find every place we use it in this monorepo:
If Phase 2's changelog is vague, missing, or claims "no breaking changes" but a major version was bumped, drop down to the source diff:
Permission review
The documentation asks the agent to read local files, directories, or repositories.
*The recommendation MUST be evidence-backed.** "Looks fine" is not a recommendation. Each verdict must cite: changelog read, codebase usage grepped, and at least one runtime check (page loaded / endpoint hit / log inspected). If you can't gThe documentation includes network, browsing, or remote request actions.
| [pkgname](homepage) ([source](https://github.com/owner/repo)) | [`1.2.3` → `2.0.0`](renovatebot.com/diffs/...) | ... | ... |The documentation includes network, browsing, or remote request actions.
https://raw.githubusercontent.com/<owner>/<repo>/<default-branch>/CHANGELOG.mdThe documentation asks the agent to run terminal commands or scripts.
git status pnpm-lock.yamlEvidence record
| Signal | Value | Evidence type | Meaning |
|---|---|---|---|
| Quality score | 90/100 | Computed | Documentation, specificity, maintenance, and trust rules |
| Repository stars | 6,010 | Source | Repository attention, not individual Skill quality |
| Compatibility | 0 platforms | Source | Declared in the catalog source record |
| Usage guide | automated source guide | Editorial | Generated or reviewed according to the visible evidence level |
Pinned source
Pick the first open Renovate PR, run the app against it, exercise the affected code paths, and tell the user whether the bump is safe.
The recommendation MUST be evidence-backed. "Looks fine" is not a recommendation. Each verdict must cite: changelog read, codebase usage grepped, and at least one runtime check (page loaded / endpoint hit / log inspected). If you can't gather evidence for an area, say so — never paper over it.
Find open Renovate PRs and take the first one:
gh pr list --state open --json number,title,headRefName,author,createdAt --limit 100 \
| python3 -c "
import json, sys
prs = json.load(sys.stdin)
renovate = [p for p in prs if p['author']['login'] == 'app/lightdash-renovate-bot' or p['headRefName'].startswith('renovate/')]
renovate.sort(key=lambda p: p['createdAt'])
if not renovate:
print('NONE')
else:
p = renovate[0]
print(f\"{p['number']}\t{p['headRefName']}\t{p['title']}\")
"
If NONE, stop and tell the user there are no open Renovate PRs.
Otherwise, take the first one as $PR_NUMBER and report to the user:
Triaging Renovate PR #<number>: <title>
Branch: <branch>
gh pr view $PR_NUMBER --json title,body,headRefName,additions,deletions,files,labels
gh pr diff $PR_NUMBER
Renovate PR bodies always contain a markdown table that looks like:
| Package | Change | Age | Confidence |
|---|---|---|---|
| [pkgname](homepage) ([source](https://github.com/owner/repo)) | [`1.2.3` → `2.0.0`](renovatebot.com/diffs/...) | ... | ... |
Parse this to extract for each package:
nodemailer)[source] link, e.g. github.com/owner/repo) — needed for changelog & source-diff lookupsecurity on the PR, or [security] in the title)Show the user the parsed list before proceeding:
Dependencies in PR #<number>:
1. nodemailer 7.0.13 → 8.0.5 (MAJOR, security) github.com/nodemailer/nodemailer
2. ...
For each package, fetch the upstream release notes spanning oldVersion..newVersion. Try in order, stop at the first that yields useful content:
gh api "repos/<owner>/<repo>/releases?per_page=100" --jq '.[] | select(.tag_name | test("<oldVersion>|<newVersion>")) | {tag: .tag_name, name: .name, body: .body}'
Or list releases between the two tags:
gh api "repos/<owner>/<repo>/compare/v<oldVersion>...v<newVersion>" --jq '{commits: .commits | length, ahead_by: .ahead_by}'
https://raw.githubusercontent.com/<owner>/<repo>/<default-branch>/CHANGELOG.md
https://renovatebot.com/diffs/npm/<pkg>/<oldVersion>/<newVersion>
"<package-name> <oldVersion> <newVersion> breaking changes"For each package, extract:
BREAKING: entries, removed APIs, behavior changesSkip noise (typo fixes, internal refactors, doc-only changes).
For each package, find every place we use it in this monorepo:
# Direct imports / requires
grep -rEn "(from ['\"]<pkg-name>['\"]|require\(['\"]<pkg-name>['\"]\))" packages/ --include='*.ts' --include='*.tsx' --include='*.js'
# Where the package is declared
grep -rEn "\"<pkg-name>\":" packages/*/package.json
Categorise hits:
import type { ... } (compile-time only)*.test.ts / *.spec.tsHold this list — Phase 6 will exercise the user-facing flows that touch these files.
If Phase 2's changelog is vague, missing, or claims "no breaking changes" but a major version was bumped, drop down to the source diff:
gh api "repos/<owner>/<repo>/compare/<oldTag>...<newTag>" \
--jq '.files[] | select(.filename | test("^(src|lib|index)") and (test("test|spec") | not)) | {filename, status, additions, deletions}'
For files that look load-bearing for our usage in Phase 3, fetch the patch:
gh api "repos/<owner>/<repo>/compare/<oldTag>...<newTag>" --jq '.files[] | select(.filename == "<file>") | .patch'
Read the diff and check whether any API our codebase calls has changed signature, behavior, or default values.
Don't read the entire upstream diff blindly. Use the codebase-usage list from Phase 3 to target only files that match the APIs we actually call.
Check your Claude memory (and any project- or user-level instruction files you've been given) for a stated preference about worktrees for this project. The lookup is environment-agnostic — use whatever memory or instructions surface for you in this session.
If a worktree preference is found, follow whatever workflow that preference describes. The branch name to use is the PR's headRefName:
gh pr view $PR_NUMBER --json headRefName -q .headRefName
After the worktree is created/entered, cd into it before continuing with the rest of Phase 5. Renovate branches usually contain a / (e.g. renovate/npm-foo-vulnerability) — preserve the name as-is; don't sanitize it.
If no worktree preference is found, stay in the current directory and check out the branch in place:
gh pr checkout $PR_NUMBER
Report to the user which mode you picked and the source of the preference (or that none was found).
git status pnpm-lock.yaml
# If missing or stale:
sfw pnpm install
The running app is what we're testing against, not just the diff:
/docker-dev start
Wait for the State Detection to report all OK: lines and PM2 processes to be online. If the build or PM2 startup fails, that's the first signal — the bump may have broken the install or runtime resolution. Report this immediately and stop.
When using a worktree, /docker-dev start claims a fresh port slot for this instance (per the docker-dev port-allocation flow), so it won't conflict with another running Lightdash instance in the main checkout or another worktree.
Use the /debug-local skill workflow — but inverted. Instead of investigating a known symptom, we're fishing for symptoms in the code paths that touch the upgraded package.
For each package, design 1–3 focused checks based on what the package actually does. Examples:
| Package category | What to exercise |
|---|---|
Email (e.g. nodemailer) | Trigger an invite or password reset; verify the email lands in Mailpit (http://localhost:8025) |
Auth / OAuth (e.g. @node-oauth/oauth2-server) | Login flow via [email protected] / demo_password!; OAuth client flow if applicable |
HTML sanitization (e.g. sanitize-html) | Render a markdown tile / dashboard description containing rich content |
Rich text editor (e.g. @tiptap/*) | Open a page that uses the editor (dashboard tile description, comment) and type into it |
Translation / i18n (e.g. i18next-locize-backend) | Switch language; verify strings render and no console errors |
Warehouse drivers (pg, snowflake-sdk, etc.) | Run a query via curl -H "Authorization: ApiKey $LDPAT" "$LIGHTDASH_API_URL/api/v1/projects/<uuid>/explores" and against the SQL runner |
Frontend UI library (@mantine/*, react-*) | Open the dashboard view; check for console errors and visual regressions |
For each check, use these tools in parallel:
pnpm exec pm2 logs lightdash-api --lines 50 --nostream after exercising the flowmcp__spotlight__search_errors {"timeWindow": 300} for recent runtime errors; mcp__spotlight__search_traces {"timeWindow": 300} to confirm requests completed without warningsmcp__chrome-devtools__new_page, mcp__chrome-devtools__take_snapshot, mcp__chrome-devtools__list_console_messagessource .env.development.local
curl -s -H "Authorization: ApiKey $LDPAT" "$LIGHTDASH_API_URL/api/v1/health" | jq
What counts as a failure signal:
mainWhat is NOT a failure:
If a test fails: stop, capture evidence (log lines, trace ID, screenshot), and move that finding to the report. Continue testing the other packages — one failure doesn't invalidate triage of unrelated bumps.
Score each package independently using this rubric, then roll up to an overall PR verdict.
| Verdict | Criteria |
|---|---|
| 🟢 SAFE | Patch or minor bump, no breaking changes in changelog, no usage requires changes, runtime checks pass cleanly |
| 🟡 LIKELY SAFE | Minor/major bump, changelog has breaking changes but none touch APIs we use, runtime checks pass, recommend a quick human glance at the affected area |
| 🟠 NEEDS CODE CHANGES | Breaking changes affect our usage — list the call sites that must be updated before merge |
| 🔴 UNSAFE / BLOCKED | Runtime check failed, install failed, or the change clearly breaks a flow |
| ⚪ CANNOT ASSESS | Couldn't run the app, no test path for this package, or changelog missing and source diff too large to read meaningfully — escalate to user with what blocked you |
Output to the user (and only to the user — do NOT post a PR comment unless they explicitly ask):
RENOVATE PR TRIAGE — #<number>
════════════════════════════════════════
Title: <PR title>
Branch: <branch>
Bump type: <patch|minor|major> [security]
Packages
────────
1. <pkg> <old> → <new> Verdict: 🟢|🟡|🟠|🔴|⚪
Changelog: <link or summary>
Our usage: <count> direct imports across <N> files
Tested: <what flow you exercised>
Evidence: <log line, trace ID, or screenshot path>
Notes: <breaking changes that mattered, or "none">
2. ...
Overall verdict: 🟢|🟡|🟠|🔴|⚪
Recommendation: <merge / merge with quick review / fix code first / do not merge>
════════════════════════════════════════
Leave the app running unless the user asks otherwise — they may want to poke at it further.
git checkout -.If you regenerated pnpm-lock.yaml and committed it during Phase 5, note that in the final report so the user knows there's a new commit on the PR branch.
gh pr comment $PR_NUMBER --body "...".$ARGUMENTS as a PR number override:
if [ -n "$ARGUMENTS" ]; then PR_NUMBER="$ARGUMENTS"; fi
BREAKING, removed, deprecated, and security advisory entries.pnpm-lock.yaml is a common Renovate failure mode — if sfw pnpm install modifies the lockfile, commit it on the PR branch and push (git push).@types/node), grepping usage isn't meaningful — fall back to running pnpm -F backend typecheck and pnpm -F frontend typecheck and treating typecheck failures as the runtime check.packages/backend/src/clients/FileStorage/) and the warehouse adapter layer when warehouse SDKs are bumped — these are common bump-breakage sites.Alternatives
K-Dense-AI/scientific-agent-skills
Build, inspect, test, and analyze bounded process-based discrete-event simulations with SimPy, including events, resources, interrupts, monitoring, replications, warm-up, and reproducible output analysis.
daymade/claude-code-skills
Use it for deployment and testing tasks; the detail page covers purpose, installation, and practical steps.
huggingface/skills
Create a SageMaker endpoint (real-time, real-time scale-to-zero, or async) with autoscaling, CloudWatch alarms, and tagging enabled by default. Use this skill whenever about to create a SageMaker endpoint, write deployment code that calls `create_endpoint`, or finalize a deployment after the image URI and IAM role are known. Provides deploy.py for real-time endpoints, deploy_ic.py for real-time endpoints that scale to zero instances via inference components, and deploy_async.py for async endpoin
aAAaqwq/AGI-Super-Team
Build and test Polymarket prediction market trading strategies for YES/NO token trading. Provides 6 tools: get_all_prediction_events (browse markets, $0.001), get_prediction_market_data (analyze price history, $0.001), create_prediction_market_strategy (generate code, $1-$4.50), run_prediction_market_backtest (test performance, $0.001). Trade on real-world events (politics, economics, sports, crypto). Currently simulation only (live deployment coming soon).