Skip to content

feat: entity-graph pipeline — neural rewrite, entity-oriented schema, backfill gap tracking#454

Merged
jeevanpillay merged 207 commits intomainfrom
feat/backfill-depth-entitytypes-run-tracking
Mar 16, 2026
Merged

feat: entity-graph pipeline — neural rewrite, entity-oriented schema, backfill gap tracking#454
jeevanpillay merged 207 commits intomainfrom
feat/backfill-depth-entitytypes-run-tracking

Conversation

@jeevanpillay
Copy link
Copy Markdown
Member

@jeevanpillay jeevanpillay commented Mar 2, 2026

Summary

This PR represents a complete architectural overhaul of the ingestion and neural pipeline, not just backfill enhancements.

Neural pipeline rewrite

  • Replace event-interpret/classification layer with entity embed, graph, and narrative pipeline
  • Drop actor system, cluster system, and all dead tables
  • Add interpretation table, entity-observation junction, and edge rules
  • Restructure pipeline tables: entity edges, ingest log, and renames (6 migration phases)
  • Split observation-capture into discrete store + interpret functions

Entity-oriented schema & providers

  • Remove actor field from PostTransformEvent, validation, AI tools, and UI
  • Entity-oriented consumer and DB type annotations across the full pipeline
  • Entity-type aware provider definitions and SDK
  • Prune GitHub provider to pull_request and issues only for day 1
  • Slim providerConfig JSONB and drop connectedBy column

DB schema conventions

  • Rename all schema tables to gateway-* / workspace-* naming conventions
  • Pipeline schema hardening: entity state/url, junction category, edge lastSeenAt, ingestLogId FK
  • Drop cluster table and clusterId column; clean up metric types

Backfill overhaul

  • Dissolve @repo/console-backfill package; replace with gateway proxy + provider entity handlers
  • Implement Linear and Sentry backfill with entity handlers and tests
  • Per-(resource, entityType) gap filter with providerResourceId tracking
  • Wire depth, entityTypes, and holdForReplay through full chain: notifyBackfill() → relay → backfill trigger → Inngest
  • gw_backfill_runs table + GET/POST /connections/:id/backfill-runs endpoints
  • Gap-aware orchestrator: skip entity types already covered at equal or wider depth
  • Tenant isolation, catchup validation, correlationId consolidation

Search system

  • Clean-slate search system with canonical schemas replacing legacy approach

UI

  • Generic ProviderSourceItem component replacing 4 individual provider source components
  • New events table + event detail drawer UI

API & tRPC

  • Remove deprecated tRPC routers and slim service layer
  • Extract shared token helpers for gateway proxy; eliminate extra DB query

Observability & testing

  • Structured happy-path logs across the full ingestion pipeline
  • Relay, gateway, and backfill fault injection and scenario coverage tests
  • Dev-only dedup flush and backfill run clear admin endpoints

Test plan

  • pnpm typecheck passes (150 tasks)
  • pnpm lint passes (133 tasks)
  • pnpm --filter @lightfast/backfill test — 60 tests pass (includes gap-aware filtering tests)
  • pnpm --filter @api/console test — 6 tests pass
  • pnpm --filter lightfast-gateway test — gateway backfill-runs endpoint tests pass
  • pnpm --filter lightfast-relay test — fault injection tests pass
  • Manual: trigger backfill → verify Inngest dashboard shows get-backfill-history step
  • Manual: re-trigger same depth → verify entity types skipped
  • Manual: trigger deeper depth → verify entity types included again
  • Manual: workspace creation flow → verify generic source selection UI works across all providers

@jeevanpillay

Track per-installation, per-entity-type backfill run history with a new
gw_backfill_runs table (unique on installation_id + entity_type). Extends
sourceConfig on all 4 provider variants with an optional backfill field
for depth and entityTypes configuration.
Service-auth endpoints for the backfill orchestrator and entity workers
to read and upsert backfill run records. GET supports optional status
filter, POST upserts on (installation_id, entity_type) conflict.
Add optional depth, entityTypes, and holdForReplay params to
notifyBackfill() and forward them through relay → trigger → Inngest.
…nk call sites

Forward depth and entityTypes from workspace integration's
sourceConfig.backfill to notifyBackfill() at all 4 bulkLink call sites
(GitHub, Vercel, Linear, Sentry). Uses type assertion to widen inline
sourceConfig literals to the full union type.
…-time tRPC errors

Pages under (app)/ with no dynamic URL segments were triggering static
generation during build. The void prefetch() pattern dehydrates pending
queries, causing client-side useSuspenseQuery to fall back to HTTP
fetches against a non-running server (ECONNREFUSED).
Add get-backfill-history step that fetches prior completed runs from
the gateway, then filters work units to skip entity types already
covered by prior runs at equal or wider depth. Re-triggers with the
same depth become near-instant no-ops; depth escalations still fetch
the wider range.
@vercel
Copy link
Copy Markdown

vercel bot commented Mar 2, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
lightfast-auth Ready Ready Preview, Comment Mar 16, 2026 4:21am
lightfast-backfill Ready Ready Preview, Comment Mar 16, 2026 4:21am
lightfast-console Error Error Mar 16, 2026 4:21am
lightfast-docs Ready Ready Preview, Comment Mar 16, 2026 4:21am
lightfast-gateway Ready Ready Preview, Comment Mar 16, 2026 4:21am
lightfast-relay Ready Ready Preview, Comment Mar 16, 2026 4:21am
lightfast-www Ready Ready Preview, Comment Mar 16, 2026 4:21am
1 Skipped Deployment
Project Deployment Actions Updated (UTC)
lightfast-chat Ignored Ignored Preview Mar 16, 2026 4:21am

Request Review

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Mar 2, 2026

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: bf85f3bd-bfff-494d-a0f8-aad69a3c2e0a

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

This PR implements a comprehensive refactoring of webhook processing, backfill orchestration, and event management. It introduces gateway and relay service client abstractions, replaces webhook payload storage with a workspace events model, adds CLI tools for API key management and webhook streaming, consolidates provider integrations into a provider-agnostic system, and migrates type definitions across packages.

Changes

Cohort / File(s) Summary
CLI Implementation
core/cli/src/bin.ts, core/cli/src/commands/login.ts, core/cli/src/commands/listen.ts, core/cli/src/commands/logout.ts, core/cli/src/env.ts, core/cli/src/lib/api.ts, core/cli/src/lib/auth-server.ts, core/cli/src/lib/config.ts, core/cli/src/lib/sse.ts, core/cli/tsup.config.ts, core/cli/package.json, core/cli/turbo.json
Complete CLI implementation with login/logout/listen commands, environment configuration, API helpers, auth server, SSE client, and build configuration for lightfast CLI tool.
Backfill Orchestration & Routes
apps/backfill/src/workflows/backfill-orchestrator.ts, apps/backfill/src/workflows/entity-worker.ts, apps/backfill/src/routes/trigger.ts, apps/backfill/src/routes/estimate.ts, apps/backfill/src/routes/estimate.test.ts, apps/backfill/src/inngest/client.ts, apps/backfill/src/env.ts, apps/backfill/src/lib/constants.ts, apps/backfill/src/app.ts
Refactored backfill system to use gateway and relay clients, added holdForReplay mechanism, gap-aware filtering, per-entity-type persistence, and new estimate endpoint for previewing backfill impact.
Backfill Test Infrastructure
apps/backfill/src/workflows/backfill-orchestrator.test.ts, apps/backfill/src/workflows/entity-worker.test.ts, apps/backfill/src/workflows/step-replay.test.ts, apps/backfill/src/routes/trigger.test.ts, apps/backfill/src/workflows/workflow-contracts.test.ts
Extensive test updates replacing fetch mocks with gateway/relay client mocks, introducing invoke-based step recording, and validating new holdForReplay and gap-aware filtering logic.
Gateway Service
apps/gateway/src/routes/connections.ts, apps/gateway/src/routes/connections.test.ts, apps/gateway/src/env.ts, apps/gateway/src/lib/cache.ts, apps/gateway/src/middleware/auth.ts, apps/gateway/src/lib/crypto.ts, apps/gateway/src/lib/github-jwt.ts, apps/gateway/src/providers/impl/github.ts, apps/gateway/src/providers/impl/linear.ts, apps/gateway/src/providers/impl/sentry.test.ts, apps/gateway/src/providers/impl/linear.test.ts, apps/gateway/src/providers/impl/github.test.ts
Removed provider-specific OAuth implementations, added backfill-runs endpoints for tracking run history, replaced crypto utilities with provider-based helpers, and consolidated environment configuration.
Relay Service & Webhooks
apps/relay/src/routes/webhooks.ts, apps/relay/src/routes/webhooks.test.ts, apps/relay/src/routes/backfill.ts, apps/relay/src/routes/backfill.test.ts, apps/relay/src/routes/admin.ts, apps/relay/src/routes/admin.test.ts, apps/relay/src/workflows/webhook-delivery.ts
Updated webhook routing to use /api/gateway/ingress endpoint, added holdForReplay support for webhook holds during backfill, added installationId filtering to admin catchup route, and enhanced test coverage.
Workspace Events & Database
db/console/src/schema/tables/workspace-events.ts, db/console/src/schema/tables/gw-backfill-runs.ts, db/console/src/migrations/0033_red_bug.sql, db/console/src/migrations/0034_elite_blob.sql, db/console/src/migrations/0035_worthless_deadpool.sql, db/console/src/migrations/0036_wakeful_quentin_quire.sql, db/console/src/migrations/0037_sharp_bill_hollister.sql, db/console/src/schema/tables/gw-installations.ts, db/console/src/schema/index.ts, db/console/src/schema/tables/index.ts, db/console/src/index.ts
Created workspace events table for storing transformed webhook events with delivery tracking and filtering indexes, added gw_backfill_runs table for persistence, added backfillConfig to gwInstallations, removed webhook payload storage.
Console API & Ingress
apps/console/src/app/api/gateway/ingress/route.ts, apps/console/src/app/api/gateway/ingress/_lib/notify.ts, apps/console/src/app/api/gateway/ingress/_lib/transform.ts, apps/console/src/app/api/gateway/realtime/route.ts, apps/console/src/app/api/gateway/stream/route.ts, apps/console/src/app/api/webhooks/ingress/route.ts, apps/console/src/app/api/webhooks/ingress/resolve-workspace.ts
Replaced /api/webhooks/ingress with /api/gateway/ingress, added real-time event notifications and SSE streaming, integrated workspace event storage and Inngest dispatch, removed legacy webhook payload handling.
Console CLI API
apps/console/src/app/api/cli/lib/verify-jwt.ts, apps/console/src/app/api/cli/login/route.ts, apps/console/src/app/api/cli/setup/route.ts
Added CLI authentication endpoints for JWT verification, organization fetching, and API key generation with organization scoping.
Console Debug/Inject
apps/console/src/app/api/debug/inject-event/route.ts, apps/console/src/app/api/debug/inject-event/_lib/context.ts, apps/console/src/app/api/debug/inject-event/_lib/schemas.ts, apps/console/src/components/debug-panel.tsx, apps/console/src/components/debug-panel-loader.tsx, apps/console/src/components/debug-panel-content.tsx
Added development-only debug panel for injecting test events, with context builders and schema validation for supported events.
Console Events UI
apps/console/src/app/(app)/(org)/[slug]/[workspaceName]/(manage)/events/page.tsx, apps/console/src/app/(app)/(org)/[slug]/[workspaceName]/(manage)/events/layout.tsx, apps/console/src/app/(app)/(org)/[slug]/[workspaceName]/(manage)/events/_components/event-row.tsx, apps/console/src/app/(app)/(org)/[slug]/[workspaceName]/(manage)/events/_components/event-detail.tsx, apps/console/src/app/(app)/(org)/[slug]/[workspaceName]/(manage)/events/_components/events-table.tsx, apps/console/src/app/(app)/(org)/[slug]/[workspaceName]/(manage)/events/_components/use-event-filters.ts
Complete events section implementation with real-time filtering, live updates via Realtime API, pagination, and detailed event inspection.
Console Sources Refactoring
apps/console/src/app/(app)/(org)/[slug]/[workspaceName]/(manage)/sources/page.tsx, apps/console/src/app/(app)/(org)/[slug]/[workspaceName]/(manage)/sources/new/page.tsx, apps/console/src/app/(app)/(org)/[slug]/[workspaceName]/(manage)/sources/new/_components/adapters.ts, apps/console/src/app/(app)/(org)/[slug]/[workspaceName]/(manage)/sources/new/_components/provider-source-item.tsx, apps/console/src/app/(app)/(org)/[slug]/[workspaceName]/(manage)/sources/new/_components/link-sources-button.tsx, apps/console/src/app/(app)/(org)/[slug]/[workspaceName]/(manage)/sources/new/_components/source-selection-provider.tsx, apps/console/src/app/(app)/(org)/[slug]/[workspaceName]/(manage)/sources/new/_components/sources-section.tsx, apps/console/src/app/(app)/(org)/[slug]/[workspaceName]/(manage)/sources/new/_components/sources-section-loading.tsx, apps/console/src/app/(app)/(org)/[slug]/[workspaceName]/(manage)/sources/_components/installed-sources.tsx, apps/console/src/app/(app)/(org)/[slug]/[workspaceName]/(manage)/sources/_components/source-settings-form.tsx
Consolidated provider-specific source components into provider-agnostic adapter system, added installation and resource selection workflow, replaced per-provider event settings with unified form.
Console Workspace/Connections
api/console/src/router/org/workspace.ts, api/console/src/router/org/connections.ts, api/console/src/router/user/workspace.ts
Added workspace events listing endpoint, added updateBackfillConfig mutation, replaced sourceConfig with providerConfig throughout, added notifyBackfill integration, updated connection resolution to use live API calls with fallbacks.
Removed Legacy Components
apps/console/src/components/activity-timeline.tsx, apps/console/src/components/connected-sources-overview.tsx, apps/console/src/components/dashboard-settings.tsx, apps/console/src/components/dashboard-time-range-selector.tsx, apps/console/src/components/lightfast-config-overview.tsx, apps/console/src/components/metric-card.tsx, apps/console/src/components/metrics-sidebar.tsx, apps/console/src/components/performance-metrics.tsx, apps/console/src/components/repository-config-dialog.tsx, apps/console/src/components/setup-guide-modal.tsx, apps/console/src/components/stores-overview.tsx, apps/console/src/components/system-health-overview.tsx, apps/console/src/components/workspace-dashboard.tsx, apps/console/src/components/workspace-header.tsx, apps/console/src/components/github-connect-dialog.tsx, apps/console/src/components/integrations/github-repo-selector.tsx, apps/console/src/components/integrations/vercel-project-selector.tsx, apps/console/src/app/(app)/(user)/new/_components/github-source-item.tsx, apps/console/src/app/(app)/(user)/new/_components/vercel-source-item.tsx, apps/console/src/app/(app)/(user)/new/_components/linear-source-item.tsx, apps/console/src/app/(app)/(user)/new/_components/sentry-source-item.tsx, apps/console/src/app/(app)/(user)/new/_components/sources-section.tsx, apps/console/src/app/(app)/(user)/new/_components/sources-section-loading.tsx
Removed dashboard, metrics, and workspace-related components; removed legacy provider-specific source components in favor of adapter-based system.
Removed User Workspace Setup
apps/console/src/app/(app)/(user)/new/page.tsx, apps/console/src/app/(app)/(user)/new/_components/create-workspace-button.tsx, apps/console/src/app/(app)/(user)/new/_components/workspace-form-provider.tsx, apps/console/src/app/(app)/(user)/new/_components/__tests__/github-source-item.test.tsx
Simplified workspace creation flow to defer source linking to dedicated sources/new route, removed multi-step source selection orchestration.
Console Routing & Layout
apps/console/src/app/(app)/(org)/[slug]/[workspaceName]/(manage)/layout.tsx, apps/console/src/app/(app)/(org)/[slug]/[workspaceName]/(manage)/insights/page.tsx, apps/console/src/app/(app)/(user)/account/settings/general/page.tsx, apps/console/src/app/(app)/(user)/account/teams/new/page.tsx
Added debug panel to manage layout, removed insights page, added dynamic rendering flag to account pages.
Type Migrations
api/console/src/inngest/workflow/neural/actor-resolution.ts, api/console/src/inngest/workflow/neural/classification.ts, api/console/src/inngest/workflow/neural/observation-capture.ts, api/console/src/inngest/workflow/neural/relationship-detection.ts, api/console/src/inngest/workflow/neural/scoring.ts, api/console/src/lib/actor-identity.ts, api/console/src/inngest/workflow/neural/entity-extraction-patterns.ts, api/console/src/inngest/workflow/neural/llm-entity-extraction-workflow.ts, api/console/src/inngest/workflow/processing/process-documents.ts, api/console/src/lib/activity.ts, apps/console/src/lib/neural/entity-search.ts, apps/console/src/lib/neural/four-path-search.ts, apps/console/src/lib/v1/contents.ts, apps/console/src/lib/v1/findsimilar.ts, apps/console/src/lib/v1/search.ts
Migrated types from SourceEvent/SourceActor/SourceReference to PostTransformEvent/PostTransformActor/PostTransformReference; moved validation schemas from @repo/console-types to @repo/console-validation or @repo/console-providers.
Inngest Event Schemas
api/console/src/inngest/client/client.ts, api/chat/src/inngest/client/client.ts
Refactored event schemas from nested data wrappers to direct z.object definitions, changed from fromZod to fromSchema builder, updated field types for metadata and nested structures.
Environment Configuration
apps/backfill/src/env.ts, apps/gateway/src/env.ts, apps/relay/package.json, apps/console/src/env.ts, apps/auth/src/instrumentation-client.ts, apps/auth/src/instrumentation.ts, apps/docs/src/instrumentation-client.ts, apps/docs/src/instrumentation.ts, apps/chat/src/app/(auth)/_components/sign-in-email-input.tsx, apps/chat/src/app/(auth)/_components/sign-in-password.tsx, apps/chat/src/app/(auth)/_components/sign-up-email-input.tsx, apps/chat/src/app/(auth)/_components/sign-up-password.tsx
Consolidated env modules to module-level rather than per-request, added PORT configuration, updated Sentry tracing sample rates based on environment, replaced Zod resolvers with standard-schema where applicable.
Provider Abstractions
apps/console/src/app/(app)/(org)/[slug]/(manage)/settings/sources/_components/sources-list.tsx, apps/console/src/lib/provider-icon.tsx, apps/console/src/lib/resource-label.ts, apps/console/src/hooks/use-oauth-popup.ts, apps/console/src/components/search-constants.ts, apps/console/next.config.ts
Updated to use PROVIDER_SLUGS and PROVIDER_DISPLAY for dynamic provider rendering, added resource label and icon utilities, broadened provider type from literal union to ProviderSlug.
Package Dependencies
api/console/package.json, apps/backfill/package.json, apps/console/package.json, apps/gateway/package.json, apps/relay/package.json, apps/auth/package.json, apps/chat/package.json, apps/docs/package.json, api/chat/package.json, core/ai-sdk/package.json
Updated Zod from zod3 to zod4, replaced @repo/console-types with @repo/console-providers/@repo/console-validation, added gateway-service-clients, updated TypeScript types, added ESLint caching to lint scripts.
Backfill Removal
api/console/src/lib/backfill.ts, api/console/src/lib/backfill.test.ts, apps/gateway/src/lib/urls.ts, apps/backfill/src/lib/related-projects.ts, apps/backfill/src/lib/crypto.ts
Removed legacy backfill HTTP integration code, removed direct gateway URL construction, consolidated environment-based configuration.
AI SDK Updates
core/ai-sdk/src/core/primitives/tool.ts, core/ai-sdk/src/core/v2/agent.ts, core/ai-sdk/src/core/v2/braintrust-env.ts, core/ai-sdk/src/core/v2/env.ts, core/ai-sdk/src/core/v2/workers/schemas.ts
Broadened generic type constraints, replaced describe() with meta({ description: ... }) for Zod schemas, updated URL validation approach.
Workflow Updates
apps/gateway/src/workflows/connection-teardown.ts, apps/gateway/src/workflows/connection-teardown.test.ts
Replaced direct cancelBackfillService with QStash publish to backfill cancellation endpoint.
Console Settings
apps/console/src/components/answer-prompt-input.tsx, apps/console/src/components/ask-lightfast-suggestions.tsx, apps/console/src/components/search-empty-state.tsx, apps/console/src/components/search-prompt-input.tsx, apps/console/src/components/search-result-card.tsx, apps/console/src/components/search-results-panel.tsx
Updated card styling from rounded-sm to rounded-md/rounded-xl with backdrop-blur effects, adjusted spacing and typography across UI components.
Middleware & Utilities
apps/console/src/middleware.ts, apps/gateway/src/middleware/tenant.ts, apps/gateway/src/middleware/auth.ts, apps/console/src/app/(api)/v1/lib/with-api-key-auth.ts, api/console/src/trpc.ts, api/console/src/router/org/org-api-keys.ts, apps/console/src/__tests__/__mocks__/github-env.ts
Added /api/gateway/ingress and /api/cli routes to public/v1 matchers, fixed API key hashing to await promises, refactored auth middleware to use timingSafeStringEqual.
Test Updates
apps/gateway/src/routes/connections.integration.test.ts, .github/workflows/ci.yml, .github/workflows/ci-core.yml, .github/workflows/release.yml, .github/workflows/verify-changeset.yml
Added CLI package to CI filters, extended changeset validation to CLI package, added knip dead code check, removed continue-on-error from boundary checks.
Removed Unused Code
api/console/src/router/m2m/sources.ts
Updated to use providerConfig instead of sourceConfig, removed metadata field updates, refactored GitHub-specific filtering logic.
.gitmodules
.gitmodules
Added sub/.github submodule pointing to lightfastai/.github repository.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

This PR represents a significant architectural refactoring across multiple applications with heterogeneous changes: comprehensive backfill system refactoring with new gateway/relay clients, complete CLI implementation, workspace events infrastructure, provider abstraction consolidation, and type system migrations. While individual cohorts follow consistent patterns, the breadth of interconnected systems and multiple moving parts (backfill orchestration, service clients, event streaming, provider consolidation, type migrations) requires careful understanding of how changes interact across the codebase.

Possibly related PRs

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 8

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
apps/relay/src/routes/backfill.ts (1)

11-17: ⚠️ Potential issue | 🟠 Major

Restrict depth to supported values at ingress.

depth currently accepts any positive integer, but this flow is designed for 7 | 30 | 90. Unsupported values can be accepted here and fail later downstream.

Proposed fix
 const triggerSchema = z.object({
   installationId: z.string().min(1),
   provider: z.string().min(1),
   orgId: z.string().min(1),
-  depth: z.number().int().positive().default(30),
+  depth: z.union([z.literal(7), z.literal(30), z.literal(90)]).default(30),
   entityTypes: z.array(z.string()).optional(),
   holdForReplay: z.boolean().optional(),
 });
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/relay/src/routes/backfill.ts` around lines 11 - 17, The triggerSchema
currently allows any positive integer for depth which can cause downstream
failures; update triggerSchema's depth validation (the depth field in
triggerSchema) to only accept the supported values 7, 30, or 90 (and keep the
default as 30) by replacing the current z.number().int().positive().default(30)
with a validator that restricts to the allowed enum/union of literal values
(e.g., z.union/z.enum or z.literal-based union) so invalid values are rejected
at ingress.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.gitmodules:
- Around line 1-3: The .gitmodules entry for submodule "sub/.github" (path =
sub/.github, url = git@github.com:lightfastai/.github.git) is unrelated to the
backfill depth/entityTypes work and needs clarification: either add a line to
the PR description explaining why this submodule is required for the backfill
(e.g., shared workflows/templates used by functions in the backfill pipeline and
where they are referenced), or remove the .gitmodules change from this branch
and open a separate PR that adds the submodule; update any docs or code comments
that reference sub/.github to point to the new PR or to the specific
workflow/template files if you keep it here.

In `@api/console/src/router/org/workspace.ts`:
- Around line 1263-1266: The constructed sourceConfig for the bulkLink mutations
never includes a backfill property, so the spread
...(integrations[0]?.sourceConfig.backfill && { depth: ..., entityTypes: ... })
never runs and notifyBackfill never receives backfill options; fix by ensuring
the newly built sourceConfig includes backfill (or directly pass
integrations[0]?.sourceConfig.backfill when calling notifyBackfill) so depth and
entityTypes are preserved—update the relevant bulkLink mutation code paths where
sourceConfig is created and where notifyBackfill is invoked (references:
integrations[0]?.sourceConfig.backfill, sourceConfig, and notifyBackfill) to
either copy backfill into sourceConfig or explicitly forward
integrations[0].sourceConfig.backfill to notifyBackfill.

In `@apps/gateway/src/routes/connections.ts`:
- Around line 620-637: The handler registered with
connections.post("/:id/backfill-runs", apiKeyAuth, async (c) => { ... })
currently calls const body: unknown = await c.req.json() without guarding
against malformed JSON; wrap that await in a try-catch, and on a thrown error
return c.json({ error: "invalid_json", details: error.message }, 400) (or
similar 400 payload consistent with the other endpoint) before proceeding to the
zod parse, so the route returns a 400 for client JSON parse errors rather than
an unhandled 500.

In `@apps/relay/src/routes/backfill.ts`:
- Around line 50-53: The deduplication key currently built in the
deduplicationId template (deduplicationId:
`backfill:${provider}:${installationId}:${orgId}:d=${depth}:e=${entityTypes ?
[...entityTypes].sort().join(",") : ""}`) omits holdForReplay so requests that
only differ by that flag collapse; update the template to include a normalized
representation of holdForReplay (for example add `:r=${String(holdForReplay)}`
or use JSON.stringify(holdForReplay)) so the deduplicationId includes the replay
toggle, retaining the existing entityTypes sorting logic.

In `@db/console/src/migrations/0033_red_bug.sql`:
- Around line 6-7: Add domain constraints to the migration so the "depth" and
"status" columns enforce valid values: modify the column definitions for "depth"
and "status" to include CHECK constraints (e.g., ALTER TABLE ... ADD CHECK
("depth" >= 0) to prevent negative depths) and constrain "status" either with a
CHECK ("status" IN (...allowed values...)) or a foreign-key reference to a
canonical status lookup table; update the migration's CREATE/ALTER statements
that define "depth" and "status" to include these checks so history filtering
can't be poisoned by arbitrary values.
- Line 19: The unique index gw_br_installation_entity_idx on
lightfast_gw_backfill_runs (covering installation_id, entity_type) must be
changed so it does not enforce uniqueness; replace it with a non-unique btree
index (or, if uniqueness is required for a narrower purpose, include a
discriminating column such as run_id or created_at instead of making
(installation_id, entity_type) unique). Locate the CREATE UNIQUE INDEX statement
for gw_br_installation_entity_idx and alter it to CREATE INDEX (or adjust the
indexed columns) so historical runs are preserved and not deduplicated.

In `@db/console/src/schema/tables/gw-backfill-runs.ts`:
- Around line 23-27: Add DB-level constraints for the gw-backfill-runs table:
change the depth column (integer("depth").notNull()) to include a CHECK
enforcing its valid domain (e.g. depth >= 0 or > 0 as appropriate for your
logic) and restrict the status column (varchar("status", { length: 50
}).notNull()) to the allowed lifecycle values using either a CHECK that status
IN ('idle','pending','running','completed','failed','cancelled') or convert it
to a proper enum type; update the generated migration to add these constraints
(or create the enum) so the database enforces them on write.

In `@db/console/src/schema/tables/workspace-integrations.ts`:
- Around line 110-113: Extract the repeated inline backfill shape into a single
shared type alias (e.g., Backfill) and replace each inline occurrence with that
alias to prevent drift; locate the four places where a property named backfill
is defined with the inline shape (the objects that use depth: 7 | 30 | 90 and
entityTypes: string[]) in this file (they appear around the
workspace-integrations table definitions) and refactor them to reference the new
Backfill type alias so all providers share the same definition.

---

Outside diff comments:
In `@apps/relay/src/routes/backfill.ts`:
- Around line 11-17: The triggerSchema currently allows any positive integer for
depth which can cause downstream failures; update triggerSchema's depth
validation (the depth field in triggerSchema) to only accept the supported
values 7, 30, or 90 (and keep the default as 30) by replacing the current
z.number().int().positive().default(30) with a validator that restricts to the
allowed enum/union of literal values (e.g., z.union/z.enum or z.literal-based
union) so invalid values are rejected at ingress.

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 145cf03 and 315e5f6.

📒 Files selected for processing (25)
  • .gitmodules
  • api/console/src/lib/backfill.test.ts
  • api/console/src/lib/backfill.ts
  • api/console/src/router/org/workspace.ts
  • apps/backfill/src/inngest/client.ts
  • apps/backfill/src/routes/trigger.ts
  • apps/backfill/src/workflows/backfill-orchestrator.test.ts
  • apps/backfill/src/workflows/backfill-orchestrator.ts
  • apps/backfill/src/workflows/step-replay.test.ts
  • apps/backfill/src/workflows/workflow-contracts.test.ts
  • apps/console/src/app/(app)/(user)/account/settings/general/page.tsx
  • apps/console/src/app/(app)/(user)/account/teams/new/page.tsx
  • apps/console/src/app/(app)/(user)/new/page.tsx
  • apps/gateway/src/routes/connections.test.ts
  • apps/gateway/src/routes/connections.ts
  • apps/relay/src/routes/backfill.test.ts
  • apps/relay/src/routes/backfill.ts
  • db/console/src/migrations/0033_red_bug.sql
  • db/console/src/migrations/meta/0033_snapshot.json
  • db/console/src/migrations/meta/_journal.json
  • db/console/src/schema/index.ts
  • db/console/src/schema/tables/gw-backfill-runs.ts
  • db/console/src/schema/tables/index.ts
  • db/console/src/schema/tables/workspace-integrations.ts
  • sub/.github

Comment on lines +1 to +3
[submodule "sub/.github"]
path = sub/.github
url = git@github.com:lightfastai/.github.git
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Clarify the relationship between this submodule and the PR objectives.

This PR is focused on backfill depth/entityTypes pipeline features, but this change adds a .github submodule with no explanation in the PR description. Mixing unrelated infrastructure changes with feature work can make the PR harder to review and complicate the git history.

If this submodule is required for the backfill feature (e.g., shared workflows or templates), please document that dependency in the PR description. Otherwise, consider moving this change to a separate PR.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.gitmodules around lines 1 - 3, The .gitmodules entry for submodule
"sub/.github" (path = sub/.github, url = git@github.com:lightfastai/.github.git)
is unrelated to the backfill depth/entityTypes work and needs clarification:
either add a line to the PR description explaining why this submodule is
required for the backfill (e.g., shared workflows/templates used by functions in
the backfill pipeline and where they are referenced), or remove the .gitmodules
change from this branch and open a separate PR that adds the submodule; update
any docs or code comments that reference sub/.github to point to the new PR or
to the specific workflow/template files if you keep it here.

Comment on lines +1263 to +1266
...(integrations[0]?.sourceConfig.backfill && {
depth: integrations[0].sourceConfig.backfill.depth,
entityTypes: integrations[0].sourceConfig.backfill.entityTypes,
}),
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Backfill options are never actually propagated to notifyBackfill.

In Line 1263, Line 1419, Line 1566, and Line 1714, the spread reads integrations[0].sourceConfig.backfill, but those newly constructed sourceConfig objects do not set backfill in these flows. Result: depth/entityTypes are always omitted.

✅ Fix pattern (apply to all four bulkLink mutations)
 // input schema
 .input(
   z.object({
     workspaceId: z.string(),
     gwInstallationId: z.string(),
+    backfill: z.object({
+      depth: z.union([z.literal(7), z.literal(30), z.literal(90)]),
+      entityTypes: z.array(z.string()).min(1),
+    }).optional(),
     // ... existing provider-specific array field
   }),
 )

 // integration construction
 sourceConfig: {
   // ...existing fields
+  ...(input.backfill ? { backfill: input.backfill } : {}),
 } as WorkspaceIntegration["sourceConfig"],

 // notifyBackfill
 void notifyBackfill({
   installationId: input.gwInstallationId,
   provider: "github", // provider-specific
   orgId: ctx.auth.orgId,
-  ...(integrations[0]?.sourceConfig.backfill && {
-    depth: integrations[0].sourceConfig.backfill.depth,
-    entityTypes: integrations[0].sourceConfig.backfill.entityTypes,
-  }),
+  ...(input.backfill && {
+    depth: input.backfill.depth,
+    entityTypes: input.backfill.entityTypes,
+  }),
 });

Also applies to: 1419-1422, 1566-1569, 1714-1717

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@api/console/src/router/org/workspace.ts` around lines 1263 - 1266, The
constructed sourceConfig for the bulkLink mutations never includes a backfill
property, so the spread ...(integrations[0]?.sourceConfig.backfill && { depth:
..., entityTypes: ... }) never runs and notifyBackfill never receives backfill
options; fix by ensuring the newly built sourceConfig includes backfill (or
directly pass integrations[0]?.sourceConfig.backfill when calling
notifyBackfill) so depth and entityTypes are preserved—update the relevant
bulkLink mutation code paths where sourceConfig is created and where
notifyBackfill is invoked (references: integrations[0]?.sourceConfig.backfill,
sourceConfig, and notifyBackfill) to either copy backfill into sourceConfig or
explicitly forward integrations[0].sourceConfig.backfill to notifyBackfill.

Comment on lines +6 to +7
"depth" integer NOT NULL,
"status" varchar(50) NOT NULL,
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Add DB constraints for depth and status domain integrity.

Line 6 and Line 7 currently accept arbitrary values, which can poison history filtering semantics.

🛡️ Suggested constraints
 CREATE TABLE "lightfast_gw_backfill_runs" (
   ...
   "depth" integer NOT NULL,
   "status" varchar(50) NOT NULL,
   ...
 );
 --> statement-breakpoint
+ALTER TABLE "lightfast_gw_backfill_runs"
+  ADD CONSTRAINT "gw_backfill_runs_depth_chk"
+  CHECK ("depth" IN (7, 30, 90));
+--> statement-breakpoint
+ALTER TABLE "lightfast_gw_backfill_runs"
+  ADD CONSTRAINT "gw_backfill_runs_status_chk"
+  CHECK ("status" IN ('queued','running','completed','failed'));
+--> statement-breakpoint
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@db/console/src/migrations/0033_red_bug.sql` around lines 6 - 7, Add domain
constraints to the migration so the "depth" and "status" columns enforce valid
values: modify the column definitions for "depth" and "status" to include CHECK
constraints (e.g., ALTER TABLE ... ADD CHECK ("depth" >= 0) to prevent negative
depths) and constrain "status" either with a CHECK ("status" IN (...allowed
values...)) or a foreign-key reference to a canonical status lookup table;
update the migration's CREATE/ALTER statements that define "depth" and "status"
to include these checks so history filtering can't be poisoned by arbitrary
values.

);
--> statement-breakpoint
ALTER TABLE "lightfast_gw_backfill_runs" ADD CONSTRAINT "lightfast_gw_backfill_runs_installation_id_lightfast_gw_installations_id_fk" FOREIGN KEY ("installation_id") REFERENCES "public"."lightfast_gw_installations"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
CREATE UNIQUE INDEX "gw_br_installation_entity_idx" ON "lightfast_gw_backfill_runs" USING btree ("installation_id","entity_type");--> statement-breakpoint
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Unique (installation_id, entity_type) index can destroy run history fidelity.

Line 19 enforces one row per entity type per installation, which can overwrite prior wider-depth coverage and degrade future gap-aware skipping behavior.

🛠️ Suggested schema direction
-CREATE UNIQUE INDEX "gw_br_installation_entity_idx" ON "lightfast_gw_backfill_runs" USING btree ("installation_id","entity_type");
+-- Preserve multiple runs; keep lookup index non-unique.
+CREATE INDEX "gw_br_installation_entity_idx" ON "lightfast_gw_backfill_runs" USING btree ("installation_id","entity_type");
+-- Optional: enforce idempotency per exact range instead.
+CREATE UNIQUE INDEX "gw_br_installation_entity_since_idx" ON "lightfast_gw_backfill_runs" USING btree ("installation_id","entity_type","since");
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@db/console/src/migrations/0033_red_bug.sql` at line 19, The unique index
gw_br_installation_entity_idx on lightfast_gw_backfill_runs (covering
installation_id, entity_type) must be changed so it does not enforce uniqueness;
replace it with a non-unique btree index (or, if uniqueness is required for a
narrower purpose, include a discriminating column such as run_id or created_at
instead of making (installation_id, entity_type) unique). Locate the CREATE
UNIQUE INDEX statement for gw_br_installation_entity_idx and alter it to CREATE
INDEX (or adjust the indexed columns) so historical runs are preserved and not
deduplicated.

Comment on lines +23 to +27
depth: integer("depth").notNull(),

// Run lifecycle status: idle|pending|running|completed|failed|cancelled
status: varchar("status", { length: 50 }).notNull(),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Enforce depth and status domains at the DB layer.

depth and status are currently unconstrained. Invalid values can be written and later corrupt gap-aware run decisions.

Suggested direction
-    depth: integer("depth").notNull(),
-    status: varchar("status", { length: 50 }).notNull(),
+    depth: integer("depth").notNull(), // add DB CHECK: depth IN (7, 30, 90)
+    status: varchar("status", { length: 50 }).notNull(), // add DB CHECK or enum for allowed lifecycle states

Also ensure the generated migration includes these constraints.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@db/console/src/schema/tables/gw-backfill-runs.ts` around lines 23 - 27, Add
DB-level constraints for the gw-backfill-runs table: change the depth column
(integer("depth").notNull()) to include a CHECK enforcing its valid domain (e.g.
depth >= 0 or > 0 as appropriate for your logic) and restrict the status column
(varchar("status", { length: 50 }).notNull()) to the allowed lifecycle values
using either a CHECK that status IN
('idle','pending','running','completed','failed','cancelled') or convert it to a
proper enum type; update the generated migration to add these constraints (or
create the enum) so the database enforces them on write.

Comment on lines +110 to +113
backfill?: {
depth: 7 | 30 | 90;
entityTypes: string[];
};
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick | 🔵 Trivial

Extract a shared backfill type to avoid drift across providers.

The same shape is duplicated four times. A shared alias keeps future changes consistent.

♻️ Suggested refactor
+type BackfillConfig = {
+  depth: 7 | 30 | 90;
+  entityTypes: string[];
+};

     sourceConfig: jsonb("source_config").$type<
       | {
           // ...
-          backfill?: {
-            depth: 7 | 30 | 90;
-            entityTypes: string[];
-          };
+          backfill?: BackfillConfig;
         }
       | {
           // ...
-          backfill?: {
-            depth: 7 | 30 | 90;
-            entityTypes: string[];
-          };
+          backfill?: BackfillConfig;
         }
       | {
           // ...
-          backfill?: {
-            depth: 7 | 30 | 90;
-            entityTypes: string[];
-          };
+          backfill?: BackfillConfig;
         }
       | {
           // ...
-          backfill?: {
-            depth: 7 | 30 | 90;
-            entityTypes: string[];
-          };
+          backfill?: BackfillConfig;
         }

Also applies to: 128-131, 143-146, 159-162

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@db/console/src/schema/tables/workspace-integrations.ts` around lines 110 -
113, Extract the repeated inline backfill shape into a single shared type alias
(e.g., Backfill) and replace each inline occurrence with that alias to prevent
drift; locate the four places where a property named backfill is defined with
the inline shape (the objects that use depth: 7 | 30 | 90 and entityTypes:
string[]) in this file (they appear around the workspace-integrations table
definitions) and refactor them to reference the new Backfill type alias so all
providers share the same definition.

jeevanpillay and others added 15 commits March 2, 2026 23:48
…sole

- Restrict triggerSchema depth to 7 | 30 | 90 (reject arbitrary values)
- Include holdForReplay in QStash deduplication key
- Guard POST /:id/backfill-runs against malformed JSON (400 vs 500)
- Remove dead sourceConfig.backfill spread from bulkLink notifyBackfill calls
- Extract shared BackfillConfig type alias to prevent drift
…gw-installations

Remove dead BackfillConfig type and backfill? fields from all 4
sourceConfig variants in workspace-integrations (never read or written).
Add nullable backfillConfig JSONB column to gw-installations where
backfill config logically belongs (installation-scoped).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove private flag and unused workspace dependencies (console-chunking,
console-config, console-embed, chalk, ora). Add publish metadata, tsup
config with .mjs output, and wire into CI/release workflows.
Entity worker now POSTs a run record to the gateway after pagination
completes (success) and in the onFailure handler (failure). Both are
best-effort with catch guards. This populates the data that the
orchestrator's gap-aware filtering reads to skip covered entity types.
…delivery

When holdForReplay is set, entity workers persist webhooks at the relay
without delivering to Console (X-Backfill-Hold header). After all workers
complete, the orchestrator drains held webhooks through the admin catchup
endpoint so historical events arrive in chronological order as a batch.
…-types

Extract backfillTriggerPayload, backfillRunRecord, and backfillDepthSchema
into a single source of truth. Fixes inconsistent depth defaults across
relay/backfill/gateway and tightens gateway POST /backfill-runs to enforce
7|30|90 (was any positive integer). Adds missing admin catchup replay tests.
afk-ralph.sh → scripts/afk-many.sh
ralph-once.sh → scripts/afk-once.sh
afk-review.sh → scripts/afk-review.sh
Implement browser-based auth flow (reuses existing /cli/auth page),
org API key creation, and real-time webhook event streaming via SSE.

- CLI: login (browser OAuth + org selection), logout, listen (SSE stream)
- Console: /api/cli/login and /api/cli/setup routes with JWT verification
- Relay: Redis Stream publishing on webhook receipt, SSE polling endpoint
  with API key auth, heartbeat, and auto-reconnect support

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…URL, add version injection

- Remove `id` from heartbeat SSE events to prevent invalid Last-Event-ID
  on reconnect (hb-* is not a valid Redis stream ID)
- Remove 5 unused deps: chalk, nanoid, @repo/console-chunking,
  @repo/console-config, @repo/console-embed
- Consolidate 3 duplicate getBaseUrl() reads into single export from
  config.ts
- Add LifecycleVariables to cliRouter for observability parity with
  other relay routers
- Replace hardcoded version with build-time injection via tsup define
…ypes-run-tracking

# Conflicts:
#	core/cli/package.json
#	core/cli/src/bin.ts
#	core/cli/tsup.config.ts
#	pnpm-lock.yaml
…validation

Add BACKFILL_RUN_STATUSES and BACKFILL_TERMINAL_STATUSES to gateway-types
for consistent status handling. DRY up gateway connections route using
terminal status set. Add validation to relay estimate proxy endpoint.
Extract GITHUB_RATE_LIMIT_BUDGET constant.
….invoke()

Extract typed gateway-client and relay-client with centralized auth,
timeouts, and correlation IDs. Replace sendEvent/waitForEvent fan-out
with step.invoke() for direct orchestrator→worker coordination. Hoist
run persistence from entity workers to orchestrator. Remove entity
completed event schema, onFailure handler, and ~950 lines of code.
… clients

Rewrite orchestrator tests for step.invoke() pattern with gateway/relay
client mocks. Simplify entity worker tests by removing onFailure and
persist-run assertions. Update step-replay tests with invoke support.
Delete workflow-contracts tests (CEL filter contracts no longer needed).
Update estimate tests to use gateway client mocks.
@sentry
Copy link
Copy Markdown

sentry bot commented Mar 16, 2026

🚧 Skipped: PR exceeds review size limit.

Please split into smaller PRs and re-run.
Reference ID: 11786522

@sentry
Copy link
Copy Markdown

sentry bot commented Mar 16, 2026

🚧 Skipped: PR exceeds review size limit.

Please split into smaller PRs and re-run.
Reference ID: 11786557

…ntitytypes-run-tracking

# Conflicts:
#	pnpm-lock.yaml
@sentry
Copy link
Copy Markdown

sentry bot commented Mar 16, 2026

🚧 Skipped: PR exceeds review size limit.

Please split into smaller PRs and re-run.
Reference ID: 11786586

@jeevanpillay jeevanpillay changed the title feat: backfill depth/entityTypes pipeline + gap-aware run tracking feat: entity-graph pipeline — neural rewrite, entity-oriented schema, backfill gap tracking Mar 16, 2026
- Replace `pnpm turbo lint typecheck` with `pnpm check` (biome) +
  `pnpm turbo typecheck` in both ci.yml and ci-core.yml — fixes
  "Could not find task lint in project" CI failure
- Delete orphaned apps/gateway/eslint.config.js (referenced non-existent
  @repo/eslint-config/hono package)
- Remove stale "eslintConfig" fields from console-trpc and console-clerk-m2m
  package.json files
- Remove @repo/eslint-config from .changeset/pre.json initialVersions
- Fix client.test.ts: remove includeContext/includeHighlights from default
  search body assertion — fields were removed from client.ts in 83e8af7
  but the test was not updated
@sentry
Copy link
Copy Markdown

sentry bot commented Mar 16, 2026

🚧 Skipped: PR exceeds review size limit.

Please split into smaller PRs and re-run.
Reference ID: 11788109

@sentry
Copy link
Copy Markdown

sentry bot commented Mar 16, 2026

🚧 Skipped: PR exceeds review size limit.

Please split into smaller PRs and re-run.
Reference ID: 11788211

@sentry
Copy link
Copy Markdown

sentry bot commented Mar 16, 2026

🚧 Skipped: PR exceeds review size limit.

Please split into smaller PRs and re-run.
Reference ID: 11788600

…DK type errors

- Create @repo/vitest-config package to fix ../../vitest.shared boundary violations
- Update vitest shared config for Vitest 4 (poolOptions → maxWorkers)
- Add implicit dependency for ~ path alias in turbo.json boundaries
- Fix PGlite multi-statement migration with custom migrateWithExec()
- Fix client.related() to forward all request fields (depth, types)
- Update client.test.ts to include required depth parameter
@sentry
Copy link
Copy Markdown

sentry bot commented Mar 16, 2026

🚧 Skipped: PR exceeds review size limit.

Please split into smaller PRs and re-run.
Reference ID: 11789758

@sentry
Copy link
Copy Markdown

sentry bot commented Mar 16, 2026

🚧 Skipped: PR exceeds review size limit.

Please split into smaller PRs and re-run.
Reference ID: 11789865

@sentry
Copy link
Copy Markdown

sentry bot commented Mar 16, 2026

🚧 Skipped: PR exceeds review size limit.

Please split into smaller PRs and re-run.
Reference ID: 11789885

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant