We ran Faultmark, an AI-powered static analysis tool that uses a multi-model debate to verify bugs before reporting them, on the trigger.dev codebase. Each finding was verified against source code before being surfaced. Found 7 real bugs.
Bug 1 (High): LogsListPresenter guard condition is inverted for ClickHouse store
File: apps/webapp/app/presenters/v3/LogsListPresenter.server.ts
The guard that checks whether a run uses the ClickHouse store has its condition inverted. It throws in the common case instead of the edge case, meaning runs on ClickHouse will never return logs.
Bug 2 (High): RouteErrorDisplay crashes on null error.data
File: apps/webapp/app/components/RouteErrorDisplay.tsx
error.data.message is accessed without a null check on error.data. If the server returns a response with no body, this throws an uncaught TypeError.
Bug 3 (High): Build settings stale after form submission
File: apps/webapp/app/components/runs/BuildSettings.tsx
Local state is not reset after a successful form submission. The UI continues showing the previous values even after the save succeeds, making it look like the save failed or did not apply.
Bug 4 (Medium): Missing key prop in DebugRunDataEngineV2
File: apps/webapp/app/components/runs/DebugRunDataEngineV2.tsx
A list of elements is rendered without a key prop. This causes React reconciliation issues and console warnings, and can produce incorrect rendering during list reorders or updates.
Bug 5 (Medium): ReplayRunDialog missing dependency in useEffect
File: apps/webapp/app/components/runs/ReplayRunDialog.tsx
replayDataFetcher.data is used inside a useEffect but is not in the dependency array. If the fetcher resolves after the initial render, the effect does not re-run and the dialog shows stale data.
Bug 6 (Medium): AIFilterInput navigation fires on wrong fetcher state
File: apps/webapp/app/components/runs/AIFilterInput.tsx
The navigation effect triggers when fetcher.state === "idle", which is also true before the fetch has started. This can cause premature or incorrect navigation on initial render before the fetcher has run.
Bug 7 (Medium): AgentView refs retained across session changes
File: apps/webapp/app/components/runs/AgentView.tsx
Refs holding scroll positions and internal state are not reset when the session ID changes. Switching between sessions causes the view to use stale ref values from the previous session.
Found with [Faultmark](https://faultmark.com/) -- AI static analysis with multi-model verification. Happy to clarify any of these.
We ran Faultmark, an AI-powered static analysis tool that uses a multi-model debate to verify bugs before reporting them, on the trigger.dev codebase. Each finding was verified against source code before being surfaced. Found 7 real bugs.
Bug 1 (High): LogsListPresenter guard condition is inverted for ClickHouse store
File: apps/webapp/app/presenters/v3/LogsListPresenter.server.tsThe guard that checks whether a run uses the ClickHouse store has its condition inverted. It throws in the common case instead of the edge case, meaning runs on ClickHouse will never return logs.
Bug 2 (High): RouteErrorDisplay crashes on null error.data
File: apps/webapp/app/components/RouteErrorDisplay.tsxerror.data.message is accessed without a null check on error.data. If the server returns a response with no body, this throws an uncaught TypeError.
Bug 3 (High): Build settings stale after form submission
File: apps/webapp/app/components/runs/BuildSettings.tsxLocal state is not reset after a successful form submission. The UI continues showing the previous values even after the save succeeds, making it look like the save failed or did not apply.
Bug 4 (Medium): Missing key prop in DebugRunDataEngineV2
File: apps/webapp/app/components/runs/DebugRunDataEngineV2.tsxA list of elements is rendered without a key prop. This causes React reconciliation issues and console warnings, and can produce incorrect rendering during list reorders or updates.
Bug 5 (Medium): ReplayRunDialog missing dependency in useEffect
File: apps/webapp/app/components/runs/ReplayRunDialog.tsxreplayDataFetcher.data is used inside a useEffect but is not in the dependency array. If the fetcher resolves after the initial render, the effect does not re-run and the dialog shows stale data.
Bug 6 (Medium): AIFilterInput navigation fires on wrong fetcher state
File: apps/webapp/app/components/runs/AIFilterInput.tsxThe navigation effect triggers when fetcher.state === "idle", which is also true before the fetch has started. This can cause premature or incorrect navigation on initial render before the fetcher has run.
Bug 7 (Medium): AgentView refs retained across session changes
File: apps/webapp/app/components/runs/AgentView.tsxRefs holding scroll positions and internal state are not reset when the session ID changes. Switching between sessions causes the view to use stale ref values from the previous session.