Official agent skill

Review And Test

by Shopify in Shopify/flash-list

Review a FlashList PR or branch, run unit tests, test on iOS simulator, and verify RTL/LTR behavior.

OfficialMITAuto-check passedTesting & QA

Install Review And Test

skills CLI
$ npx skills add Shopify/flash-list --skill review-and-test -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install Shopify/flash-list review-and-test --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/Shopify/flash-list.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/review-and-test .claude/skills/review-and-test && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
review-and-test
GitHub stars
7.2k
Token cost
~3.6k tokens
SKILL.md length
1,517 words
Files
1
Skills in repo
7
Repo updated
First seen
Licence
MIT

At a glance

Review a FlashList PR or branch, run unit tests, test on iOS simulator, and verify RTL/LTR behavior.

  • Works in 7 steps: Understand the Change → Run Automated Checks → Build → …
  • Tasks that involve Unit testing
  • SKILL.md covers Prerequisites, Step 1 — Understand the Change, Step 2 — Run Automated Checks and Step 3 — Build, plus 6 more sections
  • Calls yarn, git and xcrun

What it does

Review And Test is an agent skill from Shopify/flash-list, published by the product's own GitHub organization. Review a FlashList PR or branch, run unit tests, test on iOS simulator, and verify RTL/LTR behavior. Shared context with fix-github-issue skill.

Its SKILL.md is about 3.6k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Testing & QA, covering Unit testing and End-to-end testing. It works with iOS, GitHub and React Native. The repository describes itself as: A better list for React Native. The licence is MIT.

When your agent uses it

  • Tasks that involve Unit testing
  • Tasks that involve End-to-end testing

Example prompts

  • “/review-and-test”

Workflow steps

7 steps, taken from the step headings in SKILL.md.

  1. Understand the Change
  2. Run Automated Checks
  3. Build
  4. Test on Device (LTR)
  5. Test RTL
  6. Verify firstItemOffset Values (for layout/measurement changes)
  7. Write Review Summary

What it can do on your machine

Read from SKILL.md and the folder at commit 527d767. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • yarn
    • git
    • xcrun
    • gh
    • curl
    • node

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use yarn, git, gh and curl, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Review And Test loads about 3.6k tokens when it runs. Until then it costs about 40 tokens; SKILL.md has 1,517 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~40
When it runs · the whole SKILL.md, loaded when a task matches
~3.6k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from Shopify/flash-list at commit 527d767, republished under its MIT licence (© Shopify). 1,517 words, ~3,627 tokens.

Download SKILL.mdSave it as .claude/skills/review-and-test/SKILL.md (or your agent's skills folder).
name
review-and-test
description
Review a FlashList PR or branch, run unit tests, test on iOS simulator, and verify RTL/LTR behavior. Shared context with fix-github-issue skill.

Review & Test a FlashList PR or Branch

Prerequisites

bash
which agent-device && which gh && yarn test --version

Ensure Metro is running from fixture/react-native/:

bash
curl -s http://localhost:8081/status

Step 1 — Understand the Change

From a PR
bash
gh pr view <pr-number> --repo Shopify/flash-list
gh pr diff <pr-number> --repo Shopify/flash-list
gh pr view <pr-number> --repo Shopify/flash-list --comments
From a local branch
bash
git log main..HEAD --oneline
git diff main...HEAD

Identify:

  • What changed: which files, which functions
  • Why: what bug is fixed or feature added
  • Risk areas: layout, measurement, RTL, scroll, recycling

Step 2 — Run Automated Checks

All three must pass:

bash
yarn test
yarn type-check
yarn lint
Fixture type-check (if fixture files changed)

Root yarn type-check only covers src/ — the fixture has a separate tsconfig.json. Root yarn lint does cover fixture files.

If any files in fixture/react-native/ were modified, also run:

bash
git diff main...HEAD --name-only | grep 'fixture/react-native/'

# If matches found:
cd fixture/react-native && yarn build   # tsc -b — catches type errors in fixture code
E2E Tests

Run E2E tests if any of these changed in the PR/branch:

  • E2E test files (*.e2e.*)
  • Example/sample screens in fixture/react-native/src/
  • New example screens added
bash
# Check if e2e-relevant files were changed
git diff main...HEAD --name-only | grep -E '\.e2e\.|fixture/react-native/src/'

# If yes, run e2e tests on iOS
yarn e2e:ios

E2E tests use Detox. The yarn e2e:ios script handles both build and test.

Warning: E2E builds a release app that replaces the debug app on the simulator. After running E2E, rebuild debug to continue interactive testing:

bash
cd fixture/react-native && yarn react-native run-ios

If tests fail, investigate before proceeding to device testing.


Step 3 — Build

CRITICAL: The fixture app uses compiled output from dist/. Source changes in src/ have NO effect until built.

bash
yarn build   # runs tsc -b
Install the fixture app only if needed

Before building the native app, check if it's already installed on the simulator. Only build if it's not installed:

bash
xcrun simctl get_app_container booted org.reactjs.native.example.FlatListPro 2>/dev/null
  • If the command succeeds (returns a path): the app is installed. Skip run-ios — just relaunch it.
  • If the command fails: the app is not installed. Build and install it:
bash
cd fixture/react-native && yarn react-native run-ios
Relaunch the app

After yarn build, relaunch the app (kill + reopen) so Metro serves the new bundle:

bash
agent-device close --platform ios
xcrun simctl launch --terminate-running-process <UDID> org.reactjs.native.example.FlatListPro
agent-device open "FlatListPro" --platform ios

Find the simulator UDID with:

bash
xcrun simctl list devices | grep Booted

Step 4 — Test on Device (LTR)

Navigate to affected screens

Use the agent-device skill to navigate and take screenshots. Screens are listed on the Examples page. Common ones:

ScreenWhat to check
Sticky Header ExampleHeaders pin correctly, no duplicate overlays
Horizontal ListItems scroll, header reachable, initialScrollIndex works
GridMulti-column layout correct
MasonryVariable heights, columns balanced
ChatBottom-rendering, prepend behavior
ContactsSection headers, fast scrolling
Grid with SeparatorLast row items same height, separators between rows only
Smoke test

Navigate to each affected screen, scroll through content, verify no visual regressions.


Step 4b — Test on Android (if available)

If an Android emulator is available (e.g., on the android-agent CI runner), test there too. Android uses a native RecyclerView bridge so behavior can differ from iOS.

Build and install
bash
yarn build
cd fixture/react-native && yarn react-native run-android
Navigate and verify

Use agent-device with --platform android --session droid:

bash
agent-device snapshot -i -c --json --session droid
agent-device press <x> <y> --session droid
agent-device screenshot /tmp/android-screen.png --session droid
Android-specific things to check
  • RecyclerView scroll behavior matches iOS
  • Items render correctly (no blank/recycled artifacts)
  • Sticky headers work with native scroll
  • onEndReached / onStartReached fire at the same thresholds as iOS

Step 5 — Test RTL

How to enable RTL properly

The ONLY reliable method: change fixture/react-native/index.js:

js
// Change this:
I18nManager.forceRTL(false);
// To this:
I18nManager.forceRTL(true);

Then kill and relaunch the app (a JS reload is NOT sufficient):

bash
agent-device close --platform ios
xcrun simctl launch --terminate-running-process <UDID> org.reactjs.native.example.FlatListPro
agent-device open "FlatListPro" --platform ios

Do NOT use:

  • DevSettings.reload() — does not properly apply RTL
  • The Debug screen toggle — unreliable, layout may not fully flip
RTL verification checklist
  • Text is right-aligned on the Examples screen
  • Navigation back chevron is on the RIGHT side
  • HorizontalList: items ordered right-to-left (Item 0 on right, higher items on left)
  • HorizontalList: header is reachable by swiping right-to-left (toward the logical start)
  • Grid: columns mirrored
  • StickyHeaders: headers pin correctly
  • Chat: messages align correctly
  • Masonry: layout mirrors properly
RTL scrolling on horizontal lists

In RTL, the scroll direction is reversed:

  • Swipe right-to-left (finger moves left): reveals content toward the logical START (header, Item 0)
  • Swipe left-to-right (finger moves right): reveals content toward the logical END (higher items)

Use agent-device swipe with coordinates at the list center:

bash
# Swipe right-to-left at y=30% (list center on HorizontalList screen)
agent-device swipe 350 256 50 256 --platform ios
Always revert RTL when done
js
I18nManager.forceRTL(false);

Step 6 — Verify firstItemOffset Values (for layout/measurement changes)

If the PR touches measureLayout, measureParentSize, firstItemOffset, or RecyclerView.tsx layout logic, verify the actual runtime values match expected values.

Expected values (verified on RN 0.84 Fabric)
ScenariofirstItemOffset (adjusted)
Vertical, no header0
Vertical, with ListHeaderComponentheaderHeight
Vertical, content above FlashList0 (NOT the parent's y position)
Horizontal LTR, with headerheaderWidth
Horizontal RTL, with header (1st render)headerWidth
Horizontal RTL, with header (stable)headerWidth
How to capture runtime values

console.log does NOT work on Fabric/Hermes (output goes to CDP debugger, not Metro).

Use a local HTTP server instead:

bash
# Terminal 1: start server
node -e "
const http=require('http'),fs=require('fs');
http.createServer((q,r)=>{
  if(q.method==='POST'){let b='';q.on('data',c=>b+=c);q.on('end',()=>{
    fs.appendFileSync('/tmp/rv-debug.log',b+'\n');console.log(b);r.end('ok');})}
  else r.end('ok');
}).listen(9876,()=>console.log('on :9876'));
"

Add to source (remember to remove after):

ts
try {
  fetch("http://localhost:9876", {
    method: "POST",
    body: JSON.stringify({ tag: "myDebug", ...values }),
  }).catch(() => {});
} catch (e) {}

Then rebuild (yarn build), relaunch, navigate, and read /tmp/rv-debug.log.

measureParentSize x/y behavior

On RN 0.84 Fabric, view.measureLayout(view) returns x=0, y=0 (the Fabric self-measurement bug from #2017 does NOT reproduce on this version). The defensive fix that strips x/y is a no-op here but protects other RN versions.


Step 7 — Write Review Summary

After testing, provide:

  1. Automated checks: pass/fail for test, type-check, lint
  2. LTR behavior: which screens tested, any issues
  3. RTL behavior: which screens tested, any issues
  4. firstItemOffset verification (if applicable): actual vs expected values
  5. Regression risk: low/medium/high with reasoning
  6. Recommendation: approve, request changes, or needs more testing

Edge Cases to Test

Run through relevant entries after any fix or review. This is the single source of truth for edge case checklists — the fix-github-issue skill references this.

Layout & Measurement
  • Content above FlashList (another component in the same parent View)
  • ListHeaderComponent with variable height
  • stickyHeaderOffset > 0 combined with content above FlashList
  • Horizontal FlashList (x-axis equivalent of any vertical measurement bug)
  • Horizontal list with wide ListHeaderComponent — header must be reachable by scrolling
  • measureParentSize x/y values — on RN 0.84 Fabric these are (0,0), but on other RN versions they may be non-zero
  • numColumns > 1 with ItemSeparatorComponent — last row items must have same height (no separator height mismatch)
  • numColumns > 1 with ItemSeparatorComponent and overrideItemLayout (variable spans) — separator suppression must use layout y-coordinates, not index arithmetic
Show full SKILL.md (603 more words)Show less
RTL (Right-to-Left)
  • HorizontalList in RTL — items right-to-left, header reachable by swiping right-to-left
  • Grid in RTL — column ordering reversed
  • StickyHeaderExample in RTL — header must pin to correct edge
  • Chat in RTL — messages align correctly
  • Masonry in RTL
Sticky Headers
  • Multiple sticky indices with content above FlashList (issue #2017 scenario)
  • Sticky headers with stickyHeaderOffset > 0
  • Sticky header transition at exact item boundary (scroll = item.y)
  • Sticky header when next sticky is beyond engaged indices
  • Sticky header + maintainVisibleContentPosition / startRenderingFromBottom
  • hideRelatedCell: true — overlay hides original cell without jumping
New Architecture (Fabric)
  • Any measureLayout/measureParentSize call — verify behaviour matches Paper
  • firstItemOffset after fix — confirm it equals ListHeaderComponent height/width
  • measureParentSize(view) returns x=0, y=0 on RN 0.84 Fabric — the #2017 bug may only manifest on other RN versions
Performance
  • Benchmark screen shows no FPS regression (use ManualBenchmarkExample)

Common Issues

  • Tests pass but device shows bug — did you yarn build and relaunch? The dist/ folder may be stale
  • Switched branches but behavior didn't change — dist/ is NOT rebuilt on branch switch. You MUST run yarn build after every git checkout. Verify with grep in dist/ that the expected code is present before testing.
  • RTL looks wrong but LTR is fine — did you set forceRTL(true) in index.js and do a full kill+relaunch?
  • agent-device swipe gives "drag" error — delete ~/.agent-device/ios-runner/derived/ and re-run agent-device open to rebuild the iOS runner
  • No console output in Metro — use the HTTP server approach (see Step 6)
  • Metro log location — lsof -p $(lsof -ti :8081) | grep "1w" to find where Metro stdout goes (often /private/tmp/metro_fixture.log)
  • RTL horizontal scroll direction is reversed — to scroll toward the logical START (header/Item 0), swipe right-to-left: agent-device swipe 350 256 50 256. To scroll toward higher items, swipe left-to-right.
  • Fixture app bundle ID — org.reactjs.native.example.FlatListPro. Use with xcrun simctl launch.
  • estimatedItemSize does not exist — this FlashList does NOT have this prop. Do not use it.
  • App can't connect to Metro — if the app shows a red/yellow error about connecting to the bundler, configure the port: iOS simulator Cmd+D → "Configure Bundler" → set host localhost and the correct port. Then reload.
  • agent-device navigation — use snapshot -i -c --json as the primary method for finding elements (returns exact coordinates). Fall back to screenshot + percentage-based press when elements aren't in the accessibility tree. See the agent-device skill for details.

Review Methodology

Always reproduce BEFORE verifying the fix
  1. Checkout main, build (yarn build), relaunch, and reproduce the bug
  2. Checkout the PR branch, build (yarn build), relaunch, and verify the fix
  3. Verify dist after each branch switch: grep "expected_code" dist/path/to/file.js — if the old code is still there, the build didn't run or didn't pick up the change

Without step 1, you can't confirm the fix actually changed anything. Without verifying dist, you might test stale code on both branches and conclude "no difference" incorrectly.

Making behavior observable

When testing callback-based behavior (e.g., onStartReached, onEndReached, onViewableItemsChanged), add a visible counter to the fixture screen:

tsx
const [count, setCount] = useState(0);
// In the callback:
onStartReached={() => setCount(c => c + 1)}
// In the UI:
<View style={{ backgroundColor: count > 0 ? '#ff4444' : '#cccccc', ... }}>
  <Text>Start: {count}</Text>
</View>

This gives immediate visual feedback in screenshots without needing console.log or debug servers.

Masonry PRs — watch for sorting

Any masonry layout PR that adds Array.sort() or sorted copies is a red flag for performance. getVisibleLayouts runs on every scroll frame (60fps). O(N log N) sorting per layout change is expensive. Items within each column are naturally sorted — per-column binary search is O(log N) without sorting.


Self-Evolving Instructions

This skill is the single source of truth for testing knowledge, edge cases, and debug techniques. The fix-github-issue skill delegates here for Steps 6-7.

After each session, update this file with:

  1. New screens or scenarios that need testing
  2. New debug techniques discovered
  3. Updated expected values if the codebase changes
  4. New edge cases discovered during fixes

© Shopify, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .claude/skills/review-and-test of Shopify/flash-list.

Open the folder on GitHubat commit 527d767

Compare with similar skills

Review And Test next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Review And Test compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Review And Test this skillShopify/flash-list7.2k—~3.6kAutomated safety check: PassMIT
E2Ecallstack/react-native-pager-view3.4k1 repos~2.1kAutomated safety check: PassMIT
Engine E2Ewix/react-native-navigation13k—~1.1kAutomated safety check: PassMIT
E2Egronxb/hot-updater1.8k—~1.6kAutomated safety check: PassCustom licence
E2E Current PRgronxb/hot-updater1.8k—~1kAutomated safety check: PassCustom licence
Kane CLI Browser TestingLambdaTest/kane-cli248—~8.4kAutomated safety check: PassApache-2.0

Similar skills

  • E2E

    callstack/react-native-pager-view

    Agentic end-to-end tests with e2e, the e2e runner. An agent skill from callstack/react-native-pager-view.

    3.4k GitHub starsUsed in 1 repo~2.1k tokens
    Testing & QAAuto-check passed
  • Engine E2E

    wix/react-native-navigation

    Official

    Run Wix Engine (mobile-apps-engine) iOS E2E tests locally to validate RNN changes.

    13k GitHub stars~1.1k tokensUpdated 3 days ago
    Testing & QAAuto-check passed
  • E2E

    gronxb/hot-updater

    Run end-to-end OTA verification for examples/v0.85.0 with agent-device.

    1.8k GitHub stars~1.6k tokensUpdated today
    Testing & QAAuto-check passed
  • E2E Current PR

    gronxb/hot-updater

    Generate and execute PR-aware OTA E2E scenarios for examples/v0.85.0 by diffing the checked-out branch against its PR base branch or default branch, inferring the affected runtime, rollout, and…

    1.8k GitHub stars~1k tokensUpdated today
    Testing & QAAuto-check passed
  • Kane CLI Browser Testing

    LambdaTest/kane-cli

    Drives a real browser through the kane-cli tool and designs requirement-linked test suites from a PRD or a plain description, with mobile and cloud-grid runs.

    248 GitHub stars~8.4k tokensUpdated today
    Testing & QAAuto-check passed
  • E2E Default

    gronxb/hot-updater

    Run a fixed OTA regression flow for examples/v0.85.0 with agent-device.

    1.8k GitHub stars~3.1k tokensUpdated today
    Testing & QAAuto-check passed

More from Shopify/flash-list

  • Agent Device

    Shopify/flash-list

    Official

    Interact with iOS simulator or Android emulator/device using snapshot-based coordinates.

    7.2k GitHub stars~5k tokensUpdated 8 days ago
    Auto-check passed
  • Analyze Feedback

    Shopify/flash-list

    Official

    Analyze agent feedback artifacts from GitHub Actions workflow runs, extract actionable learnings, and incorporate them into skill files and CLAUDE.md.

    7.2k GitHub stars~1.6k tokensUpdated 8 days ago
    Auto-check passed
  • Fix GitHub Issue

    Shopify/flash-list

    Official

    Full workflow for fixing a GitHub issue - understand the problem, reproduce, diagnose root cause, fix, test on iOS/Android simulators, review, and raise a PR

    7.2k GitHub stars~1.6k tokensUpdated 8 days ago
    Auto-check passed
  • Raise PR

    Shopify/flash-list

    Official

    Create a GitHub PR for FlashList. An agent skill from Shopify/flash-list.

    7.2k GitHub stars~1.2k tokensUpdated 8 days ago
    Auto-check passed
  • Triage Issue

    Shopify/flash-list

    Official

    Triage a GitHub issue — classify priority (P0/P1/P2), search for duplicates, and apply labels.

    7.2k GitHub stars~667 tokensUpdated 8 days ago
    Auto-check passed
  • Upgrade React Native

    Shopify/flash-list

    Official

    Upgrade the React Native fixture app to a new version. An agent skill from Shopify/flash-list.

    7.2k GitHub stars~1.9k tokensUpdated 8 days ago
    Auto-check passed

Categories

Questions about Review And Test

What does Review And Test do?

Review a FlashList PR or branch, run unit tests, test on iOS simulator, and verify RTL/LTR behavior. Review And Test is an agent skill from Shopify/flash-list, published by the product's own GitHub organization. Review a FlashList PR or branch, run unit tests, test on iOS simulator, and verify RTL/LTR behavior.

When should I use Review And Test?

Review And Test fits situations like: tasks that involve Unit testing; tasks that involve End-to-end testing.

How do I install Review And Test in Claude Code?

Run `npx skills add Shopify/flash-list --skill review-and-test -a claude-code`. Or copy the skill folder (.claude/skills/review-and-test in Shopify/flash-list) into .claude/skills/review-and-test in your project. Claude Code loads it when a task matches its description.

How do I install Review And Test in Codex?

Run `npx skills add Shopify/flash-list --skill review-and-test -a codex`. Or copy the skill folder (.claude/skills/review-and-test in Shopify/flash-list) into .agents/skills/review-and-test in your project. Codex loads it when a task matches its description.

Can I use Review And Test in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Shopify/flash-list --skill review-and-test -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/review-and-test, .gemini/skills/review-and-test, .github/skills/review-and-test and .opencode/skills/review-and-test in your project.

What does Review And Test need to run?

Going by SKILL.md and its folder, Review And Test needs the command-line tools its instructions call (yarn, git, xcrun, gh, curl and node).

Does Review And Test access the network?

SKILL.md contains no URLs. Its commands use git, gh and curl, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Review And Test safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Review And Test use?

Review And Test is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Review And Test use?

About 3.6k tokens (SKILL.md is roughly 15k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Review And Test?

Skills that share tags, products or a category with Review And Test: E2E (callstack/react-native-pager-view, 3.4k stars), Engine E2E (wix/react-native-navigation, 13k stars), E2E (gronxb/hot-updater, 1.8k stars) and E2E Current PR (gronxb/hot-updater, 1.8k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Review And Test?

Shopify (a GitHub organization, an official publisher) maintains it in Shopify/flash-list, which has 7,245 GitHub stars. The repository holds 7 skills in this directory. The repository was last updated on October 1, 2026.

Source: Shopify/flash-list on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.