Your next engineering hire

Farfield knows your codebase, your incidents, and your team. Lives in Slack. Ships the fixes you ask for.

signal in from
SentrySentry
DatadogDatadog
GitHubGitHub
Slack
LinearLinear
PagerDutyPagerDuty
Logs
JiraJira
OpenTelemetryOpenTelemetry
SentrySentry
DatadogDatadog
GitHubGitHub
Slack
LinearLinear
PagerDutyPagerDuty
Logs
JiraJira
OpenTelemetryOpenTelemetry
six threads worth of work

Drop it in any thread

Find bugs, investigate alerts, review PRs, ship fixes, hunt regressions, brief the on-call. Same brain, same Slack, six threads worth of work.

01·find bugs

Bugs surface where code meets your signals

Farfield reads your code, your Sentry events, your Datadog logs, and your team's incident history all at once. Bugs your repo-only scanners can't correlate end up in your channel, with file paths and a Fix button.

# oncallFarfield and you
Thread
FarfieldAPP12:33 PM
🔍 Scan complete: New scan
2 critical · 11 high · 13 open issues · 1h 11m
View more issuesOpen all issuesOpen scan
apps/api/src/features/cloud_sessions/service.py:316
Fix
apps/api/src/features/github/webhook_router.py:240
Fix
02·investigate prod alerts

RCAs that read code, logs, and prior incidents together

Production fires. @Farfield find the root cause. Farfield walks your code, your logs, and every prior incident in the same file. It replies with the actual cause, the FK constraint, and the timestamps it cross-checked.

# alertsproduction · severity error
Thread
🚨
Farfield Ops Alerts2:54 PM
Production alert: Automation run failed
[automation] run=562 step 2 FAILED to create cloud session: PendingRollbackError('This Session's transaction has been rolled back…')
EnvironmentproductionSourcesrc.features.automations.engineLocationengine.py:3374
2 replies
Sushil Kumar4:38 PM
@Farfield find the root cause
FarfieldAPP4:42 PM
Root cause: run 562 step 2 tried to reuse pod production-agent-194120de65f6 after the corresponding agent_pods row was already gone. The pre-fix create_cloud_session() path inserted that stale value into cloud_sessions.pod_name, FK-backed to agent_pods.pod_name — that’s the real failure.
  • Prod logged the same failure for run 562 at 08:41, 08:54, 09:24 UTC — all cloud_sessions_pod_name_fkey
  • engine.py:1728 pins the pod onto the run for later reuse
Open a fix PR
03·review my PR

Review with memory of past incidents

@Farfield review this. Risk assessment, missing edge cases, and the differentiator: this file was the root cause of #4188 last week, so three more eyes recommended.

# pull-requestsacme/payments
Thread
Devon Robinson11:14 AM
New PR up — refactor: move stripe_webhook_handler to async #4203. @Farfield review this before I merge.
FarfieldAPP11:14 AM
Reviewed #4203 · risk: medium-high
What I remember about this file
Last incident here was #4188 (past_due double-billing, 4d ago). Before that, the cross-tenant export leak #4119 on Apr 12 — same handler chain. Both took 4h+ to root-cause. Three more eyes recommended.
What I’d flag:
  • service.py:144 — handler is async but called from a sync context in stripe_router.py:88. Will block the event loop.
  • Tests cover the happy path. Missing: signature-verification failure, idempotency on duplicate evt_* IDs.
04·fix it for me

Reuses the patterns your team already shipped

Mention Farfield in any thread. It writes the fix using what's already in your repo: your existing middleware, your usual test setup, your team's import style. No fashionable library imports. No drive-by refactors. Lists every command it ran, and the ones it couldn't.

# engineeringacme/payments
Thread
Priya Shah3:02 PM
@Farfield add rate limiting to /api/v1/exports. 10 req/min per workspace, return 429 with Retry-After.
FarfieldAPP3:14 PM
✅ Shipped in PR #4234. Reused the RateLimiter middleware from lib/rate_limit.py (same one applied to /api/v1/scans last month), keyed on workspace_id.
Files changed:
  • features/exports/router.py — applied the limiter decorator
  • tests/integration/test_exports_rate_limit.py — runs 11 concurrent requests, asserts the 11th gets 429
Checks I ran:
uv run pytest tests/integration/test_exports_rate_limit.py -q
uv run ruff check src tests
05·why did this regress

Find what broke today, with timeline

@Farfield why is checkout slow today? Pinpoints the regressing commit, surfaces past similar regressions in the same file, suggests a fix path. Pure shared-brain.

# performanceacme/payments
Thread
Mira Chen4:48 PM
@Farfield checkout p95 went from 180ms to 720ms today. why?
FarfieldAPP4:49 PM
Confirmed regression. p95 was 180ms last week, 720ms in the last 4h.
Likely culprit:
PR #4203 · merged 3h ago · refactor: move stripe_webhook_handler to async. Added a synchronous db.flush() at service.py:144.
What I remember:
This file regressed similarly on Mar 14 — commit 1d6701b, same pattern. Fixed by moving DB writes to a queue in PR #3987.
Open revert PR
06·morning on-call brief

Walk into your on-call week already briefed

Proactive DM when your on-call rotation starts: deploys overnight, warm alerts, PRs to watch, and what regressed last time you were on. The brain working for you, not waiting for a mention.

# DM with Devon Robinson
9:01 AM
FarfieldAPP9:01 AM
☀️ Good morning. You’re on-call this week.
Here’s what changed overnight while you were off.
Deploys
billing-apiv2.81 → v2.82 · 02:14autopilot-workerv1.44 → v1.45 · 06:31 (hotfix)
Warm alerts
Sentry/api/v1/cases error rate ↑ 3.2× over 6hDatadogautopilot-worker memory at 78% (was 52%)
Watch today
PR #4231first prod use of the new ledger code path
Last time you were on-call
Apr 22 — autopilot-worker had a similar memory pattern, fixed by PR #4109. I’ll page if memory crosses 88% today.
listen · remember · act

One brain.
Every signal. One thread

Farfield is a shared brain for your engineering team. It remembers every alert, every owner, every fix it’s shipped, and every place in the code it’s seen before. So the next bug never starts from zero.

01·listen

Listen to everything.

Connect once, read-only. Every alert, log line, PR diff, Linear ticket, and #oncall thread becomes a signal.

Sentrysentry
Datadogdatadog
logs
GitHubgithub
Linearlinear
slack
02·remember

Remember what your team forgets.

Who owns this file. What broke last time it changed. Which fix actually held. Context other tools throw away.

apps/api/src/features/billing/service.py
owner@drobinson · 18 changes
last touched4d ago · PR #4188
prior incidents2 (resolved)
last fix held9 weeks
03·act

@-mention. It does the work.

@Farfield find the root cause. Fix this and open a PR. It replies in-thread with file paths and line numbers, and tells you which checks it couldn’t run.

@Farfield find the root cause and open a PR
Done
Fixed in PR #4188 — guard now blocks PAST_DUE and UNPAID alongside ACTIVE/TRIALING.
checks ran: pytest · ruff · mypy (1 baseline gap noted)
read-only by default

Onboard Farfield in
two minutes

Reads every PR. Investigates every alert. Ships every fix you ask for.

· read-only by default· PRs require your click