agentleFS
ExpensifyExpensify/App/.claude/skills/ship-pr/SKILL.md

ship-pr

Skill5.1k starsChanged 4 days agoMITView on GitHub

Take finished work in Expensify/App to a PR a human can review without fighting CI or bots. Runs the checks, verifies the change in the running app, gets a fresh-context self-review for the human to triage, opens a PR from your fork (draft by default) with the App template, then babysits it. Use whenever you are asked to open, create, ship, or submit a PR, or when implementation is done and the next step is review.

  • Commits and pushes

30 other projects use a version of this.

Trending

More talk lately.about the whole repository

Dec 2025: 1 mentionJan 2026: 0 mentionsFeb 2026: 3 mentionsMar 2026: 0 mentionsApr 2026: 0 mentionsMay 2026: 1 mentionJun 2026: 3 mentionsJul 2026: 1 mentionAug 2026: 0 mentionsSep 2026: 4 mentionsOct 2026: 15 mentionsNov 2026: 5 mentions
Dec 2025Jun 2026Nov 2026
Mentions a month of the Expensify/App repository that our weekly crawl found. There is no adoption data for this file yet.

Most recently taken up by

Who's talking about Expensify/App

The biggest 5 of 56 mentions linking to the repository that our crawl found. Each line is their own headline.

See all 56

Talked about on GitHub, Bluesky, Stack Overflow and Hacker News (56 times).

On GitHub · 50

45 more on GitHub

On Hacker News · 1

Used with

Projects with it also use ideate, review-pr and 8 more.

Other files people use alongside this one.

Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
  • OpenAISkill

    ideate

    Generate image-based alternatives, remixes, or new design directions from a Product Design brief. Use when the user asks for design variants, visual exploration, remixes, or image-generated approaches from provided context.

    Also in 4 projects that use this

  • DockerSkill

    review-pr

    Review one or more incoming Docker documentation pull requests as a maintainer. Independently validate technical claims, assess editorial fit and information architecture, choose a verdict, and draft exact inline or PR-wide feedback behind a confirmation gate. Use for requests such as "review PR 123", "is this PR correct?", "does this information belong here?", "validate this PR", or "help review backlog PRs". Do not use to maintain or fix a PR you own; use maintain-pr for that.

    Also in 4 projects that use this

  • Google CloudSkill

    triage

    Gather context on a change or bug and plan the implementation.

    Also in 4 projects that use this

  • GoogleSkill

    diagnosing-bugs

    Diagnosis loop for hard bugs and performance regressions. Use when the user says "diagnose"/"debug this", or reports something broken/throwing/failing/slow.

    Also in 3 projects that use this

  • GoogleSkill

    domain-modeling

    Build and sharpen a project's domain model. Use when the user wants to pin down domain terminology or a ubiquitous language, record an architectural decision, or when another skill needs to maintain the domain model.

    Also in 3 projects that use this

  • Hugging FaceSkill

    implement

    Make tests pass. Invoke after /write-tests produces failing tests.

    Also in 3 projects that use this

  • +3 more from google

The file

We split this skill into the rules it gives an agent

8 rules. 0 are common, 3 are distinctive, and 5 are very specific to this project.

  • 0

    Common

    Most of the 30 edited versions we read keep these.

  • 3

    Distinctive

    This author's own choices. Worth a look.

  • 5

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    Run every step. If one can't run, say which one and why in the handoff.

    line 10
  2. Distinctive:

    Run what CI runs for what you touched, and fix everything:

    line 16
  3. Very specific:

    Every test has // Given, // When, // Then comments explaining why.

    line 32
  4. Very specific:

    No new useMemo, useCallback or React.memo in a file the React Compiler handles.

    line 36
  5. Distinctive:

    If you couldn't verify something, say so and name what stopped you.

    line 54
  6. Very specific:

    Don't fix anything yet. Show the human every critical and important finding with:

    line 63
  7. Distinctive:

    If you can't spawn a reviewer, re-read the whole diff cold against the same prompt yourself and say so in the handoff.

    line 71
  8. Very specific:

    After approval, push to your fork (origin below) and open it.

    line 85

“Common” is measured: kept by at least 6 in 10 of the 30 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Ship a PR

You're done when the human only has judgment calls left on the PR: the checks are green, the change is shown working in the app, a fresh reviewer has read the diff, and every bot comment is handled.

Run every step. If one can't run, say which one and why in the handoff. Nothing gets committed, pushed or posted without the human's approval: they own what goes on the PR (contributingGuides/AI_ETIQUETTE.md).

Commands below use upstream for the Expensify/App remote, which is the usual setup when you work from a fork. If you cloned Expensify/App directly, use origin instead.

1. Checks

Run what CI runs for what you touched, and fix everything:

npm run fmt                                              # oxfmt, a CI gate the CLAUDE.md post-edit checklist doesn't list
npm run lint-changed
npm run typecheck
npm run react-compiler-compliance-check check-changed
npm run spell-changed
npm test -- <test files for the code you changed>        # direct test files; CI runs the full suite
  • lint-changed and spell-changed diff against origin/main. If origin is your fork, sync its main with Expensify/App first (git fetch upstream && git push origin upstream/main:main), so they only see your changes.
  • Skip --findRelatedTests. Core libs are imported almost everywhere, so it pulls in most of the suite (over 10 minutes for MoneyRequestReportUtils). CI runs everything in about 2.5 minutes.

Then the repo rules the tooling cannot see (CLAUDE.md, tests/README.md):

  • Every test has // Given, // When, // Then comments explaining why.
  • A bug fix comes with a test that fails without the fix, or the handoff says why it can't.
  • A new Onyx.connectWithoutView has a comment justifying it. In a component it also needs @frontend-performance approval linked in the PR body.
  • New strings go in src/languages/en.ts only. The other locales are generated from it by scripts/generateTranslations.ts. On a PR from a fork that doesn't run automatically, so say in the handoff that someone from Expensify has to run it.
  • No new useMemo, useCallback or React.memo in a file the React Compiler handles.
  • The Mobile-Expensify submodule pointer didn't move by accident: git diff --ignore-submodules=none upstream/main...HEAD -- Mobile-Expensify. Stage by path, never git add -A, git add . or git commit -a.

2. Verify

Prove the change on the surface it touches. CI can't see this part, so it's the evidence the reviewer needs.

ChangeRunEvidence
Web UI/playwright-app-testing against the local dev server (:8082), never productionScreenshots or a recording for MacOS: Chrome / Safari
Native UI or platform code/agent-device on the iOS simulator or Android emulator/agent-device-evidence MP4s for the native sections
Logic with no UIJestThe test names, in ### Tests
Performance/measure-telemetry-span, before and after, on realistic dataA before/after table
  • For a bug fix, capture the bug before fixing it, with the failing test first or a recording of the broken behavior. Checking out main later costs a fresh npm install in another worktree.
  • The template asks for five platforms. Cover what you can and name the rest in the handoff. Never tick a box for a platform you didn't test.
  • Ad hoc builds (the test builds an Expensify employee triggers on a PR) are out of scope. If a change needs one, say so in the handoff.

If you couldn't verify something, say so and name what stopped you. "Inconclusive" is more useful to the reviewer than a confident claim with no evidence.

3. Self-review in a fresh context

The agent that wrote the change doesn't get to judge it. Spawn two reviewers with no memory of this conversation, in parallel:

  1. Bug hunt: give it references/review-prompt.md with <base> and <triage-file> filled in.
  2. Rules: have it check the local diff (git diff $(git merge-base upstream/main HEAD), since there is no PR for gh pr diff yet) against every rule in .claude/skills/app-coding-standards/rules/. claude-review applies the same rules once the PR is out of draft, so fixing them now saves a review round.

Don't fix anything yet. Show the human every critical and important finding with:

  • the finding as file:line, severity, and what breaks
  • your verdict: agree or disagree, with one line why (check the claim against the code first)
  • the fix you'd make, for the ones you agree with

The human decides which to fix. Fix only those, then rerun steps 1 and 2 for what the fixes touched. Keep a one-line reason for every finding left unfixed, for the handoff.

If you can't spawn a reviewer, re-read the whole diff cold against the same prompt yourself and say so in the handoff.

4. Commit and open

  • Branch off an up-to-date upstream/main. Titles and commits use <type>: <description> (fix, feat, refactor, upgrade, chore, docs, test, perf, ci), the branch name starts with the same type (fix/...), and commit messages stay on one line.
  • The body is .github/PULL_REQUEST_TEMPLATE.md as it is:
    • ### Explanation of Change: a few plain sentences on what changed and why.
    • ### Fixed Issues: the full $ https://github.com/Expensify/App/issues/<id> link and the PROPOSAL: link.
    • ### Tests, ### Offline tests, ### QA Steps: numbered steps a reviewer can repeat, built from step 2. [No QA] goes in the title when QA has nothing to test.
    • ### Screenshots/Videos: the step 2 evidence under each platform.
    • The author checklist: never change its text, and leave the boxes to the human. The human ticks them to vouch for the PR.
  • Show the human the title, body, media list and commits, and ask whether to open it as a draft or ready for review. Default to draft:
    • Draft: claude-review and Codex skip drafts, so babysit clears CI first and the bot round starts when the human marks it ready.
    • Ready for review: the bots and reviewers start right away.
  • After approval, push to your fork (origin below) and open it. Drop --draft when the human picked ready for review:
git push origin HEAD
gh pr create --repo Expensify/App --base main --head <fork-owner>:<branch> --draft --title "<type>: <description>" --body-file <file>

Media upload with gh pr create --attach needs gh 2.99+. With an older gh, the human drags the step 2 files into the PR in the browser: list their paths in the handoff.

5. Babysit

Hand the PR to the babysit skill and run it to READY. If you opened a draft, babysit again once the human marks it ready, for the claude-review and Codex round that follows.

Handoff

Reply to the human with:

  • the PR URL and the babysit verdict
  • how it was verified (surface, what you ran, what you saw, where the media is, platforms not covered)
  • which review findings the human chose to fix, and the one-line reason for each one left unfixed
  • anything left for them: checklist boxes, media upload, marking it ready, escalated threads, parts you could not verify

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.