agentleFS
ParadevAIParadevAI/Paradev/.agents/skills/trpc-compat/SKILL.md

trpc-compat

Skill16k starsChanged 11 days agoMITView on GitHub

Check that a tRPC change is safe for released desktop, mobile, CLI, and SDK builds, pick the compatible pattern, and decide when a deprecated procedure can be removed. Use when changing, renaming, or removing an existing procedure, input field, or output field in packages/trpc or packages/host-service, when reviewing such a PR, or when a deploy broke released clients.

1 other project uses a version of this; 1 new project in the last 4 weeks, against 0 the 4 before.

Adopted by

Surging: 1 new project took it in the last 4 weeks, none the 4 weeks before.thin data

Week of Sep 13: 0 new projectsWeek of Sep 20: 0 new projectsWeek of Sep 27: 0 new projectsWeek of Oct 4: 0 new projectsWeek of Oct 11: 0 new projectsWeek of Oct 18: 0 new projectsWeek of Oct 25: 0 new projectsWeek of Nov 1: 1 new project
Sep 2026Oct 2026Nov 2026
New projects taking a version of this file each week, over the 8 weeks our latest run read: only 1 in all, so this is a hint, not a trend.

Most recently taken up by

Who's talking about ParadevAI/Paradev

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

See all 64

Talked about on GitHub, the web, Bluesky and YouTube (64 times).

On GitHub · 50

45 more on GitHub

On the web · 11

6 more on the web

The file

We split this skill into the rules it gives an agent

7 rules. About 0 are common, 4 are distinctive, and 3 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈4

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 3

    Very specific

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

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Search the release tags, not main.

    line 16
  2. Very specific:

    Desktop: every desktop-v* tag at or above the floor is live.

    line 27
  3. Very specific:

    Mobile: no tags, and MINIMUM_MOBILE_VERSION is 1.0.0.

    line 30
  4. Distinctive:

    Keep the schema migration in its own PR.

    line 78
  5. Distinctive:

    Only when both are true:

    line 83
  6. Very specific:

    If a live desktop build still calls it, the only path is to raise MINIMUM_DESKTOP_VERSION.

    line 88
  7. Distinctive:

    Yes: write a forward fix that restores the old contract and moves the new shape to a new procedure, as #7756 did.

    line 97

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “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

tRPC compatibility

On 2026-09-23, #7726 changed page.list from a bare array to { items, nextCursor }. It updated every caller on main, so typecheck and tests passed. Desktop 1.30.0–1.30.2 still called .map on the result, and every workspace view crashed (SEV1, 337 Sentry events, postmortem "page.list response change crashed released desktop apps"). CI only sees main. This skill is how you check the builds CI cannot see.

1. Find released callers

Search the release tags, not main. Run git fetch --tags first in a fresh clone.

PROC='page\.list(?!Paginated)'   # the procedure path; exclude longer names that share the prefix
FLOOR=1.29.0                     # MINIMUM_DESKTOP_VERSION in apps/api/src/app/api/desktop/version/route.ts
for v in $({ echo "$FLOOR"; git tag -l 'desktop-v*' | sed 's/^desktop-v//'; } | awk '!/-/' | sort -uV | sed -n "/^$FLOOR\$/,\$p"); do
  git rev-parse -q --verify "refs/tags/desktop-v$v" >/dev/null || continue
  git grep -q -P "$PROC" "desktop-v$v" -- apps/desktop && echo "desktop-v$v calls it"
done
  • Desktop: every desktop-v* tag at or above the floor is live.
  • CLI: same loop with cli-v* tags and -- packages/cli. The CLI has no floor, so check every tag you can; old installs stay in use.
  • Mobile: no tags, and MINIMUM_MOBILE_VERSION is 1.0.0. If apps/mobile on main calls it, or git log -S shows it ever did, treat it as called by a live build.
  • SDK: packages/sdk calls procedures by string (/api/trpc/<procedure>). Search main and git log -S the same way.
  • host-service procedures: callers are desktop, CLI, and mobile, and the host can be older or newer than the client. See packages/host-service/AGENTS.md.

Any hit means the procedure is live. Its input and output are frozen.

2. Check usage data

The API samples 1% of calls into the PostHog event api_procedure_called. Run this in the PostHog SQL editor or through the PostHog MCP:

SELECT properties.client_product AS product, properties.client_version AS version,
       count() * 100 AS est_calls, max(timestamp) AS last_seen
FROM events
WHERE event = 'api_procedure_called' AND properties.procedure = 'page.list'
  AND timestamp > now() - INTERVAL 30 DAY
GROUP BY product, version ORDER BY product, version

Zero rows is weak evidence for a rarely called procedure: 1% of a small number rounds to zero. Calls from web and from builds older than the x-superset-client header are not recorded.

3. Pick the pattern

You want toDo thisExample
Change an output shapeNew procedure; old one keeps its shapepage.list + page.listPaginated (#7756)
Add an inputNew optional field, default in the handler (safe: old clients do not send it)
Accept a new input shapeAccept both, convert server-siderrule + triggers in automation/schema.ts
Rename a procedureNew name; old name stays as a @deprecated aliastask.all → task.list in task/task.ts
Drop an inputKeep accepting it and ignore itbranch in task/schema.ts
Drop an output fieldKeep sending it until removal is allowedthe plugins catalog field that #7317 removed crashed old desktops
Drop or rename a DB columnPick the procedure's output columns first, keep the old fielddb.query.*.find* without columns returns every column
Make an input stricterOnly on a new input or procedurepublishPageSchema is .strict() from the start, so a newer CLI fails loudly on an older server
Change an error code, default, or sort orderNew procedure, or a new optional input that opts in (absent keeps the old behavior)desktop branches on NOT_FOUND and CONFLICT
Call a new procedure from a clientMerge the API first, then the client after the API is live#7317's API deploy stalled two days behind migration 0119

To check the API is live, the latest Deploy Production run after your API merge must have passed: gh run list --workflow deploy-production.yml --branch main --limit 5.

In client code, expect the unknown: guard new optional fields, handle enum values the client has not seen, and keep a failing widget from taking its parent view down with it. #7726 crashed the whole workspace view from one menu.

Keep the schema migration in its own PR. #7726 had a migration inside it, so the bad API change could not be reverted.

4. Remove a deprecated procedure or field

Only when both are true:

  • Step 1 finds no call in a live desktop tag and no call from mobile, CLI, or SDK.
  • Step 2 shows no calls from a live version over the last 30 days.

If a live desktop build still calls it, the only path is to raise MINIMUM_DESKTOP_VERSION. That is a product decision; ask, do not do it in a cleanup PR. Put the evidence in the PR description, as d1aee0922f did for device.heartbeat.

5. If released clients are already broken

  1. Confirm with Sentry: a new desktop issue that starts at the API deploy time.
  2. Does the PR that broke it include a migration that production already applied?
    • No: revert the PR. The API redeploys on merge.
    • Yes: write a forward fix that restores the old contract and moves the new shape to a new procedure, as #7756 did. Do not roll back the migration.
  3. Tell affected users to reload (Cmd+R). Some needed to restart the app or the terminal daemon.

Checklist

  • Step 1 run for every procedure whose input or output changed, with the result in the PR
  • No existing input field is new-required, renamed, retyped, or more strictly validated
  • No existing output field is removed, renamed, retyped, wrapped, or newly nullable, including through a DB column change on a find* without columns
  • No change to an existing error code, default limit, sort order, or meaning of null
  • No change to a procedure's type (query, mutation, subscription), the link, or the transformer
  • No new required header or stricter auth on an existing procedure
  • Client code that needs a new procedure merges after the API is live in production
  • Every new input field is optional with a server-side default
  • A replaced procedure is kept as a @deprecated alias
  • No schema migration in the same PR as the contract change
  • Removals: step 1 and step 2 evidence is in the PR

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.