-
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
chore: add .claude/REVIEW.md with CI drift check #3561
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
+132
−0
Merged
Changes from all commits
Commits
Show all changes
4 commits
Select commit
Hold shift + click to select a range
be84d0f
chore: add .claude/REVIEW.md with CI drift check
ericallam f1b3378
chore: switch drift check to claude-code-action
ericallam 0cbed6c
chore: drop /code-review reference from REVIEW.md preamble
ericallam 453aab5
chore: drop issues:write permission from drift audit workflow
ericallam File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,49 @@ | ||
| # REVIEW.md — Trigger.dev OSS | ||
|
|
||
| Repo-specific signal for anyone (human or agent) reviewing a PR in this codebase. Calibrates what counts as critical, what to always check, and what to skip. | ||
|
|
||
| ## What makes a 🔴 Important finding here | ||
|
|
||
| Reserve 🔴 for things that would page someone or block a rollback. In this codebase, that means: | ||
|
|
||
| - **Rolling-deploy breakage.** Old and new versions of the webapp/supervisor run side-by-side during deploys. A change is broken if: | ||
| - A Lua script's behavior changes for a given key set without versioning (rename the script with a behavior-descriptive suffix like `Tracked` rather than `V2` — both versions must coexist safely). | ||
| - A Redis data shape used by both versions changes in place. New shapes need a new key namespace. | ||
| - A migration is not backward-compatible with the prior image. | ||
| - **Schema / migration safety.** Prisma migrations must be backward-compatible with the prior deploy. Adding NOT NULL without a default, dropping a column an old image still reads, renaming a column — all 🔴. | ||
| - **Queue / concurrency correctness.** RunQueue, MarQS (V1, legacy), redis-worker — any change to enqueue / dequeue / locking semantics. Re-derive the invariant on paper before flagging or accepting. | ||
| - **Missing index on a hot table.** New Prisma queries against `TaskRun`, `TaskRunExecutionSnapshot`, `JobRun`, `Project`, etc. must use an existing index. Check `internal-packages/database/prisma/schema.prisma` for the relevant `@@index` lines — don't guess and don't propose `EXPLAIN`. | ||
| - **Recovery-path queries.** Any `TaskRun.findFirst` / `findMany` added to a schedule, run-recovery, or restart loop. Recovery fan-outs (Redis crash, restart storms) turn "rare indexed query" into a DB incident. 🔴 even if indexed. | ||
| - **Aggregations on hot tables.** No `COUNT` / `GROUP BY` on `TaskRun` or other multi-million-row tables. Use Redis or ClickHouse for counts. | ||
| - **Prod Redis blast-radius.** New code paths that `SCAN` with broad patterns (`*foo*`) on prod-shaped Redis, or `EVAL` Lua with `SCAN` loops inside. Both are 🔴. | ||
| - **`@trigger.dev/core` direct import** from anywhere outside the SDK package. Always import from `@trigger.dev/sdk`. Core direct imports are 🔴 — they break the public API contract. | ||
| - **Heavy execute-deps imported into request-handler bundles.** Specifically `chat.handover` and similar split-bundle entry points must not transitively import the agent task's execute path. Watch for new imports added at module top-level of route files. | ||
| - **V1 engine code modified in a "V2 only" PR.** The `apps/webapp/app/v3/` directory contains both. If the PR description says V2-only but it touches `triggerTaskV1`, `cancelTaskRunV1`, `MarQS`, etc. — 🔴. | ||
|
|
||
| ## Always check | ||
|
|
||
| - **Tests use testcontainers, not mocks.** Vitest with `redisTest` / `postgresTest` / `containerTest` from `@internal/testcontainers`. Any new `vi.mock(...)` on Redis, Postgres, BullMQ, or other infra is wrong here — 🔴 if added in production-path tests, 🟡 if isolated unit test. | ||
| - **Public-package changes have a changeset.** `pnpm run changeset:add` produces `.changeset/*.md`. Required for any edit under `packages/*`. Missing → 🟡; missing on a breaking change → 🔴. | ||
| - **Server-only changes have `.server-changes/*.md`.** Required for `apps/webapp/`, `apps/supervisor/` edits with no public-package change. Body should be 1-2 sentences (it has to fit as one bullet in a future changelog). Missing → 🟡. | ||
| - **Lua script naming.** Coexisting scripts use behavior-descriptive suffixes (`Tracked`), never `V2`. Old name must keep working until the next deploy clears it. | ||
| - **RunQueue payload shape.** V2 run-queue payload's `projectId` is consumed by `workerQueueResolver` for override matching. If a PR drops it from the payload, 🔴. | ||
| - **`safeSend` scope.** Defensive IPC wrappers belong on loop / interval / handler contexts, not one-shot terminal sends. If the PR adds `safeSend` to a single terminal call for consistency, 🟡 with a "remove this" suggestion. | ||
| - **Zod version.** Pinned to `3.25.76` monorepo-wide. New package adding zod with a different version or range — 🔴. | ||
|
|
||
| ## Skip (do NOT flag) | ||
|
|
||
| - Anything Prettier / ESLint catches. CI runs both. | ||
| - TypeScript style preferences (`type` vs `interface`) — already covered by repo standards. | ||
| - Test coverage exhortations as a generic suggestion. Only flag missing tests when a specific code path is genuinely untested and the path has prior incidents. | ||
| - `agentcrumbs` markers (`// @crumbs`, `// #region @crumbs`) and `agentcrumbs` imports — these are temporary debug instrumentation stripped before merge. | ||
| - `// removed comments for removed code`, renamed `_unused` vars, re-exported types as "backwards compatibility shims" — also covered by repo standards. | ||
| - Suggestions to "add error handling" without naming a specific scenario that breaks. | ||
| - Documentation prose nitpicks in `docs/*` MDX files unless factually wrong. | ||
|
|
||
| ## Things V1/legacy that should NOT block a PR | ||
|
|
||
| The `apps/webapp/app/v3/` directory name is misleading — most code there is V2. Only specific files are V1-only legacy: `MarQS` queue, `triggerTaskV1`, `cancelTaskRunV1`, and a handful of others (see `apps/webapp/CLAUDE.md` for the exact list). Don't flag "you should refactor this to use V2" on those — they're frozen. | ||
|
|
||
| ## Confidence calibration for this repo | ||
|
|
||
| The most common false-positive pattern: speculating about race conditions in code paths the agent doesn't have runtime visibility into. If the only evidence is "this *could* race", drop it. If you can point to a specific interleaving with file:line for each step, surface it. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,83 @@ | ||
| name: 🔎 REVIEW.md Drift Audit | ||
|
|
||
| on: | ||
| pull_request: | ||
| types: [opened, ready_for_review, synchronize] | ||
| paths-ignore: | ||
| - "docs/**" | ||
| - ".changeset/**" | ||
| - ".server-changes/**" | ||
| - "references/**" | ||
|
|
||
| concurrency: | ||
| group: review-md-drift-${{ github.event.pull_request.number }} | ||
| cancel-in-progress: true | ||
|
|
||
| jobs: | ||
| audit: | ||
| if: >- | ||
| github.event.pull_request.draft == false && | ||
| github.event.pull_request.head.repo.full_name == github.repository | ||
| runs-on: ubuntu-latest | ||
| permissions: | ||
| contents: read | ||
| pull-requests: write | ||
| id-token: write | ||
|
coderabbitai[bot] marked this conversation as resolved.
|
||
| steps: | ||
| - name: Checkout repository | ||
| uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 | ||
| with: | ||
| fetch-depth: 0 | ||
| persist-credentials: false | ||
|
|
||
| - name: Run Claude Code | ||
| id: claude | ||
| uses: anthropics/claude-code-action@fefa07e9c665b7320f08c3b525980457f22f58aa # v1.0.111 | ||
| with: | ||
| anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }} | ||
| use_sticky_comment: true | ||
| allowed_bots: "devin-ai-integration[bot]" | ||
|
|
||
| claude_args: | | ||
| --max-turns 15 | ||
| --allowedTools "Read,Glob,Grep,Bash(git diff:*)" | ||
|
|
||
| prompt: | | ||
| You are auditing this PR for drift against `.claude/REVIEW.md`. | ||
|
|
||
| ## Context | ||
|
|
||
| `.claude/REVIEW.md` is the repo's source of truth for what AI / agent code reviewers should treat as critical findings (rolling-deploy safety, hot-table indexes, recovery-path queries, testcontainers usage, Lua versioning, etc.). It is consumed by review agents to calibrate severity. If REVIEW.md goes stale, every future agent review degrades. | ||
|
|
||
| ## Your task | ||
|
|
||
| 1. Read `.claude/REVIEW.md` in full. | ||
| 2. Run `git diff origin/main...HEAD --name-only` to see which files changed in this PR. | ||
| 3. Sample the diff itself for any of these four signals: | ||
| - **Stale references** — does any rule cite a file, directory, function, table, Prisma model, or package name that has been removed or renamed in this PR or already gone from `main`? | ||
| - **Contradictions** — does code in this PR violate a current REVIEW.md rule? (Only flag if one side is clearly wrong — do not re-review the PR.) | ||
| - **Missing rules** — does this PR introduce a new pattern future reviewers should know about? Examples: a new hot table, a new Lua-script versioning convention, a new safety wrapper, a new "must always check" invariant. | ||
| - **Obsolete rules** — has the repo moved past a constraint REVIEW.md still asserts (e.g. a deprecated path is gone, a pattern is now linted, V1 code is deleted)? | ||
|
|
||
| ## Response format | ||
|
|
||
| If nothing needs changing: | ||
|
|
||
| ✅ REVIEW.md looks current for this PR. | ||
|
|
||
| Otherwise: | ||
|
|
||
| 📝 **REVIEW.md updates suggested:** | ||
|
|
||
| - **[stale]** `<rule excerpt>` — <what's stale and why> | ||
| - **[contradiction]** `<rule excerpt>` — <what in this PR disagrees> | ||
| - **[missing]** under `## <section>` — <one-sentence draft rule> | ||
| - **[obsolete]** `<rule excerpt>` — <why this rule no longer applies> | ||
|
|
||
| ## Rules | ||
|
|
||
| - Keep it tight. Maximum 3 suggestions per audit. Pick the highest-signal ones. | ||
| - Only flag things that would actually mislead a future reviewer. Style nits and wording preferences do not count. | ||
| - Do NOT review the PR itself. Do NOT propose rules outside REVIEW.md's existing sections. | ||
| - Do NOT propose adding rules for one-off PR specifics that don't generalize to future PRs. | ||
| - If REVIEW.md does not exist in the repo, respond with `(skip)` and stop. | ||
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.