Skip to content

feat(integrations): connect an AWS account as a source - #1635

Merged
Makisuo merged 17 commits into
mainfrom
feat/aws-connection
Oct 22, 2026
Merged

Makisuo merged 17 commits into
mainfrom
feat/aws-connection

Conversation

@Makisuo

@Makisuo Makisuo commented Oct 21, 2026 •

Copy link
Copy Markdown
Collaborator

Phase 0 of the AWS integration: an AWS account connects as a pull source through an IAM role in that account. Nothing is read from AWS yet beyond the role itself. Metrics, inventory, security scan and cost come next as modules on the same role.

How it works

  • No stored secret. Maple mints an external ID per connection. The customer deploys a generated stack, which creates role MapleIntegration-<id>. The role trusts Maple's account root, on condition of the exact Maple principal ARN and that external ID. Maple assumes it with STS and reads only the role's own tags and attached policies to confirm the setup.
  • The role name comes from the connection ID, so a caller can never point Maple at another role. Two orgs connecting the same account get two roles and two external IDs. There is a test that proves one stack never verifies the other connection.
  • Setup: a CloudShell paste script that runs aws cloudformation deploy. The same stack is also offered as a console template and as Terraform.
    • CloudFormation quick-create links need a public S3 template, which Maple's AWS security baseline blocks.
    • The stack is pinned to us-east-1, so cleanup finds it from any region, and a re-run replaces a stack whose first deploy failed.
  • Modules are one managed policy each, generated from a registry in @maple/domain/aws. The check reports which ones are attached and the setup version tag, so adding a module means updating the stack, not reconnecting. None are offered yet: the API rejects every module until it collects data.
  • Health goes through the existing Sources model:
    • aws is a pull platform, and the source is created and deleted with the row.
    • A deleted stack or changed trust policy reports the source as disconnected.
    • Throttling and AWS outages record the error without failing the source.
    • Before the first success the source stays pending.
  • Hourly re-check: a new aws_connections lane on the hourly alerting cron.
    • One query skips paused sources, one statement claims the batch, and two checks run at a time to stay inside the Worker's connection limit.
    • A manual check within 5 seconds of a good one answers with that check, because every check spends Maple's single key.
  • UI: a card under Sources → New → AWS.
    • Account form (console-style dashes accepted).
    • Setup panel that re-checks every 10s while open, then health, Check connection and Disconnect.
    • Disconnect shows the stack's cleanup script and keeps it in local storage until dismissed. Disconnecting from the source's own page goes to the AWS page, where that script waits.
  • Docs: integrations/aws.

Two fixes that apply beyond AWS: the Sources detail page now re-reads its clock after a Connection-tab write, so "last data" no longer shows a time in the future. codeBlock gains an optional bodyClassName.

Deploy notes

  • The migration adds aws_connections and applies in the alchemy deploy.
  • Until MAPLE_AWS_PRINCIPAL_ARN, MAPLE_AWS_ACCESS_KEY_ID and MAPLE_AWS_SECRET_ACCESS_KEY are set on api and alerting, AWS shows as unavailable and the lane does nothing. No production principal exists yet. A dev one, maple-integrations-dev (only sts:AssumeRole on MapleIntegration-* roles), was used for this PR.

Verification

  • Real AWS, account 465760687006 with the dev principal:
    • The generated script deployed the stack; Maple assumed the role and read template version 1.
    • A wrong external ID was denied.
    • Setup ran twice from eu-west-1 (the second run reported up to date), and cleanup ran from eu-central-1 and removed it.
    • Terraform validate and plan passed (2 resources).
    • No test roles remain.
  • Local stack, end to end in the browser:
    • connect → setup → the card turned Connected on its own after the stack was deployed;
    • stack deleted → Check → source Disconnected with the reason;
    • redeployed → Connected again;
    • disconnected from the source page → AWS page with the kept cleanup script, still there after a reload.
  • Worker bundle: checkRole bundled with rolldown and the Workers pure options, then run against the fake AWS. It works, so the tree-shaking pass that broke the Railway SDK does not affect this one.
  • Tests:
    • AwsConnectionService (12) against a fake STS and IAM that "deploys" the rendered template and enforces trust the way AWS does;
    • v2 routes (3), alerting schedule, OpenAPI surface;
    • web AWS card (8), Sources detail (22), integrations, sources and shell suites (163 total), GCP scripts after the paste helper moved (130).
  • Typecheck: domain, db, backend, api, alerting, ai, web. Lint: lint:core and lint:foldkit clean.
  • Review: two review passes (correctness and security, Effect conventions, web and simplification); every finding is fixed.

Screenshots

Empty state Waiting for setup
empty setup
Connected (source page) Stack deleted
connected disconnected
Console method Cleanup kept after disconnect
console cleanup

mobile setup

Not in this PR

  • A production Maple AWS principal and its secrets.
  • Multi-account Organizations (StackSets).
  • Metric Streams through Firehose (phase 1), inventory, security scan and cost.
  • An alert for a Maple-side IAM mistake: it would mark every connection disconnected at once.

View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.

Summary by CodeRabbit

  • New Features
    • Connect AWS accounts and view their connection status, health, and account details in integration and source views.
    • Organization admins can create, configure, check, update, and disconnect connections; members can view status.
    • Set up through CloudShell, the AWS Console, or Terraform, and access cleanup guidance when disconnecting.
    • Enable available integration modules and run checks manually or automatically each hour.
  • Documentation
    • Added AWS setup, permissions, troubleshooting, and disconnection guidance.
  • Bug Fixes
    • Improved feedback when AWS integration is unavailable or a connection cannot be verified.

An AWS connection is a pull source backed by an IAM role in the customer's
account. Maple mints an external id, the customer deploys a generated
CloudFormation stack (CloudShell script, console template or Terraform), and
Maple assumes the role from its own identity to confirm the setup. No AWS
secret is stored.

- aws_connections table (source_id required, cascades with its source),
  AwsConnectionService and /v2/integrations/aws (status, create, update,
  setup, check, delete).
- The role trusts Maple's account root, conditioned on the exact principal
  ARN and the connection's external id. Its name is derived from the
  connection id, so a caller can never point Maple at another role.
- Each future module (metrics, inventory, security, cost) is its own policy
  on the same role; the check reads which are attached and the setup
  version tag, so a new module is a stack update, not a reconnect.
- Hourly alerting lane re-checks connections: paused sources are skipped in
  SQL, the batch is claimed in one statement, two checks run at a time.
  A deleted stack reports the source disconnected; AWS outages only record
  the error.
- Connect card under Sources: account form, setup panel that re-checks every
  10s while open, connection health, disconnect with a cleanup script kept
  until dismissed.
- Docs page integrations/aws.
@Makisuo Makisuo added the preview:web Deploy a Workers-only PR preview (no ingest/Electric); see docs/pr-previews.md label Oct 21, 2026
@coderabbitai

coderabbitai Bot commented Oct 21, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 2c70693c-f33d-4ec6-95d0-021854ffaa63
📥 Commits

Reviewing files that changed from the base of the PR and between 46672c9 and 4ee8570.

⛔ Files ignored due to path filters: 2
  • bun.lock is excluded by !**/*.lock
  • packages/domain/src/generated/anticipated-error-identifiers.ts is excluded by !**/generated/**
📒 Files selected for processing: 43
  • .env.example
  • apps/alerting/src/schedule.ts
  • apps/alerting/src/scheduled.test.ts
  • apps/alerting/src/scheduled.ts
  • apps/alerting/src/worker.ts
  • apps/api/src/resources/env.ts
  • apps/api/src/routes/v2/integrations-aws.http.test.ts
  • apps/api/src/routes/v2/sources.http.ts
  • apps/api/src/routes/v2/v2-test-support.ts
  • apps/api/src/runtime/http-graph.ts
  • apps/api/src/runtime/service-graph.ts
  • apps/web/src/page/integrations/aws.scene.test.ts
  • apps/web/src/page/integrations/catalog.ts
  • apps/web/src/page/integrations/command.ts
  • apps/web/src/page/integrations/derive.ts
  • apps/web/src/page/integrations/hub.scene.test.ts
  • apps/web/src/page/integrations/message.ts
  • apps/web/src/page/integrations/model.ts
  • apps/web/src/page/integrations/subscription.ts
  • apps/web/src/page/integrations/update-aws.ts
  • apps/web/src/page/integrations/update-status.ts
  • apps/web/src/page/integrations/update.ts
  • apps/web/src/page/integrations/view.ts
  • apps/web/src/page/sources/detail/detail.scene.test.ts
  • apps/web/src/page/sources/detail/update.ts
  • apps/web/src/page/sources/kit/integration.ts
  • apps/web/src/page/sources/kit/shared.ts
  • apps/web/src/route/data-integrations.ts
  • apps/web/src/shell/palette/palette.test.ts
  • packages/backend/src/platform/Env.ts
  • packages/backend/src/services/integrations/AwsConnectionService.test.ts
  • packages/backend/src/services/integrations/SourceRemovalService.test.ts
  • packages/backend/src/services/integrations/SourceRemovalService.ts
  • packages/backend/src/services/integrations/vcs/vendor/github/__tests__/GithubConnectService.test.ts
  • packages/backend/src/services/org/OrganizationService.ts
  • packages/backend/src/services/org/integration-sources.ts
  • packages/db/drizzle/20261022114102_merge_aws_supabase/migration.sql
  • packages/db/drizzle/20261022114102_merge_aws_supabase/snapshot.json
  • packages/db/src/tables/index.ts
  • packages/domain/src/http/integrations.ts
  • packages/domain/src/http/v2/integrations-aws.ts
  • packages/domain/src/source-health.ts
  • packages/primitives/src/index.ts
🚧 Files skipped from review as they are similar to previous changes: 1
  • .env.example

Included review availability: This review used your included allowance. Your plan provides up to 4 included reviews per hour; 0 remain after this review.

📝 Walkthrough

This change adds AWS account connections with IAM role setup, verification, cleanup, v2 API routes, hourly checks, and web workflows. It also adds AWS source support and shared paste-script handling.

Changes: AWS integration

Layer / File(s) Summary
AWS contracts and persistence
packages/primitives/src/index.ts, packages/domain/src/aws.ts, packages/domain/src/http/v2/integrations-aws.ts, packages/db/src/tables/aws-connections.ts, packages/db/drizzle/...
Adds AWS identifiers, modules, IAM setup plans, API schemas, audit metadata, health policy, and organization-scoped connection storage.
AWS role setup and connection service
packages/backend/src/services/integrations/AwsConnectionService.ts, packages/backend/src/services/integrations/aws/*
Adds IAM setup artifacts, role checks, connection lifecycle operations, persisted check outcomes, scheduled sweeps, and cleanup scripts.
V2 API and scheduled checks
apps/api/src/routes/v2/integrations-aws.http.ts, apps/api/src/runtime/*, apps/alerting/src/*
Adds AWS HTTP handlers, authorization, audit events, runtime wiring, source-ID conversion, and hourly due-check processing.
Web integration and source workflows
apps/web/src/page/integrations/*, apps/web/src/page/sources/*
Adds AWS state, setup methods, connection checks, pending polling, disconnection cleanup, catalog discovery, and AWS source navigation.
Validation and supporting changes
packages/backend/src/services/integrations/*test.ts, apps/api/src/routes/v2/integrations-aws.http.test.ts, apps/web/src/page/integrations/aws.scene.test.ts
Adds coverage for AWS lifecycle operations, permissions, isolation, role checks, sweeps, web state transitions, and unavailable deployments.

Priority: ➖ Normal

Estimated code review effort: 4 (Complex) | ~60 minutes

Sequence Diagram(s)

sequenceDiagram
  participant AwsIntegrationPage
  participant HttpV2AwsIntegrationsLive
  participant AwsConnectionService
  participant AwsApi
  participant AWS_STS_and_IAM
  participant PostgreSQL
  AwsIntegrationPage->>HttpV2AwsIntegrationsLive: Request a connection check
  HttpV2AwsIntegrationsLive->>AwsConnectionService: Check the AWS connection
  AwsConnectionService->>AwsApi: Inspect the customer role
  AwsApi->>AWS_STS_and_IAM: Assume role and read role and attached policies
  AWS_STS_and_IAM-->>AwsApi: Return role details and policies
  AwsApi-->>AwsConnectionService: Return the role report
  AwsConnectionService->>PostgreSQL: Persist connection and source check state
  AwsConnectionService-->>HttpV2AwsIntegrationsLive: Return the updated connection
  HttpV2AwsIntegrationsLive-->>AwsIntegrationPage: Return the connection response
Loading
Merge Risk: ⚪ Minimal · up to 4ee85

The AWS connection feature is inactive until Maple's AWS identity credentials are configured. No concrete merge-blocking defect was found in the reviewed changes, so it looks ready to merge after the normal checks.

Pre-merge checks: Passed 5
Check name Status Explanation
Description Check Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check Passed The title clearly and concisely describes the main change: adding support to connect an AWS account as a source.
Docstring Coverage Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 5…
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Full details: Docstring Coverage

Explanation

No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 58 files. (3 skipped: 3 unsupported.)

✨ Finishing Touches
📝 Generate docstrings
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

🍁 Maple PR preview

Note

Preview resources were removed when the preview label came off.

Final commit 434200b · View workflow run

@Makisuo

Makisuo commented Oct 21, 2026

Copy link
Copy Markdown
Collaborator Author

Preview test (app-pr-1635.maple.dev, 5f1449e)

A separate agent tested the preview, signed in as the shared reviewer. Previews have no Maple AWS identity, so AWS correctly reports itself unavailable there. The connect flow against real AWS was tested locally (see the PR description).

Check Result
/sources lists AWS in "Pull more data in without an SDK" and links to /sources/new?integration=aws Pass
The AWS step shows its feature cards and "AWS can't be connected on this Maple deployment yet.", with no form and no stuck skeleton Pass
/integrations?integration=aws redirects to the AWS step under Sources Pass
The command palette lists "Connect AWS" Pass
Railway and Google Cloud connect steps, and an existing source's detail page, still render Pass
GET /v2/integrations/aws 200: available: false, 4 modules, connections: []
POST /v2/integrations/aws/connections with 123456789012 / 12345 409 aws_integration_unavailable / 400 parameter_invalid on account_id
Mobile, 430px: no horizontal overflow Pass
Console errors while navigating to the AWS step and resizing None

One finding, fixed in abbbacf: the unavailable card still said "Enter the account to connect" and showed the IAM permission note. It now shows only the unavailable line.

@maple-review-bot

maple-review-bot Bot commented Oct 21, 2026 •

Copy link
Copy Markdown

Maple review

🟡 Confidence 5/10 · needs attention
Kept at 5: ordinary warnings and soft signals never read below 5.
3 warnings −3 · tests partial −1 · risk high −1 · 2/3 new units observable −1 · floor 5

Adds an AWS account as a pull source: an aws_connections table, a role-assuming service with an hourly re-check lane, v2 HTTP routes, generated setup/cleanup scripts and templates, and the Sources → AWS card. Additive and well isolated, but two web reducers mishandle multi-connection state and the isolation test does not prove what it claims; none of the alerting error issues in the changed files are addressed by this diff.

  • AwsConnectionService creates, checks and sweeps per-connection IAM roles
  • New aws_connections table with lease-based hourly claiming
  • forPaste extracted from the GCP setup scripts into a shared helper
  • /v2/integrations/aws routes plus the Sources AWS card and setup panel

Before merge

Findings

🟠 Warning · F1 · completedCheck closes any open AWS setup panel, not the checked connection's

correctness · apps/web/src/page/integrations/update-aws.ts:174

tickedPending starts a quiet check for every pending connection, and justVerified is computed from the checked id, but the setupId: null at line 174 never compares next.awsCard.setupId === id. With two unverified connections, while the user has one setup panel open, the other connection's quiet check landing verified closes that panel and toasts "Maple can read account ".

Only clear the panel when the verified connection is the open one: `justVerified && next.awsCard.setupId === id`, as `statusArrived` does.
🟠 Warning · F2 · A connection waiting for its stack is reported as Needs attention

correctness · apps/web/src/page/integrations/derive.ts:266

issue is "Finish setup" whenever a connection is still unverified, and attentionOr turns any non-null issue into health attention with the label "Needs attention". A connection created seconds ago therefore looks like a failing integration, while the card for the same state says "Waiting for setup" and cardStatusOf says Finish setup; gcpOverview maps its equivalent setup-pending state to health pending.

Give pending its own branch (health "pending", label "Finish setup") and reserve `attentionOr` for the `failing > 0` case.
🟠 Warning · F3 · The cross-connection test never exercises an external-ID mismatch

tests · packages/backend/src/services/integrations/AwsConnectionService.test.ts:128-131

aws.deploy installs only mine's template, so theirs is refused because no role named after it exists, not because its external ID differs. Deleting the sts:ExternalId condition from the trust policy leaves both assertions passing (the null verifiedAt and the two different random hex ids), so the property the PR description says this test proves is unverified.

Deploy `theirs`' template with the external ID replaced by `mine.externalId` (same role name) and assert the check is refused, so the mismatch itself is what fails.
🤖 Prompt to fix all 3 findings with an AI agent
Findings from an automated review of commit abbbacf544ce48f83fdfbd7800c4e9189effb5a9. Verify each one against the current code before changing anything, fix only those that still apply, and keep each fix to the lines it names.

---

F1 · Warning · correctness · apps/web/src/page/integrations/update-aws.ts:174
`completedCheck` closes any open AWS setup panel, not the checked connection's
`tickedPending` starts a quiet check for every pending connection, and `justVerified` is computed from the checked `id`, but the `setupId: null` at line 174 never compares `next.awsCard.setupId === id`. With two unverified connections, while the user has one setup panel open, the other connection's quiet check landing verified closes that panel and toasts "Maple can read account <the other one>".
Suggested fix: Only clear the panel when the verified connection is the open one: `justVerified && next.awsCard.setupId === id`, as `statusArrived` does.

---

F2 · Warning · correctness · apps/web/src/page/integrations/derive.ts:266
A connection waiting for its stack is reported as `Needs attention`
`issue` is "Finish setup" whenever a connection is still unverified, and `attentionOr` turns any non-null issue into health `attention` with the label "Needs attention". A connection created seconds ago therefore looks like a failing integration, while the card for the same state says "Waiting for setup" and `cardStatusOf` says `Finish setup`; `gcpOverview` maps its equivalent setup-pending state to health `pending`.
Suggested fix: Give pending its own branch (health "pending", label "Finish setup") and reserve `attentionOr` for the `failing > 0` case.

---

F3 · Warning · tests · packages/backend/src/services/integrations/AwsConnectionService.test.ts:128-131
The cross-connection test never exercises an external-ID mismatch
`aws.deploy` installs only `mine`'s template, so `theirs` is refused because no role named after it exists, not because its external ID differs. Deleting the `sts:ExternalId` condition from the trust policy leaves both assertions passing (the null `verifiedAt` and the two different random hex ids), so the property the PR description says this test proves is unverified.
Suggested fix: Deploy `theirs`' template with the external ID replaced by `mine.externalId` (same role name) and assert the check is refused, so the mismatch itself is what fails.

Production impact

Open errors in the changed files
Issue Service Occurrences File
@maple/http/errors/WarehouseUpstreamError alerting 80k apps/alerting/src/scheduled.ts
@maple/http/errors/WarehouseUpstreamError alerting 20k apps/alerting/src/scheduled.ts
@maple/http/errors/ErrorPersistenceError alerting 2.6k apps/alerting/src/scheduled.ts
@maple/backend/services/pr-review/PrReviewTelemetryReadError alerting 2.0k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.7k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.6k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.6k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.6k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.6k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.6k apps/alerting/src/scheduled.ts

After this merges, Maple checks whether they stop.

Production traffic of the changed files (last 7 days)
File Calls/day Busiest operations
packages/backend/src/services/integrations/aws/setup.ts 83k maple 83k/day, 88.2% err
apps/web/src/page/integrations/command.ts 7 LoadIntegrationsPlanetscaleDatabases 7/day, 0.0% err
Telemetry this change adds and removes (13)
  • ➕ span name AwsConnectionService.status · packages/backend/src/services/integrations/AwsConnectionService.ts:342
  • ➕ span name AwsConnectionService.create · packages/backend/src/services/integrations/AwsConnectionService.ts:359
  • ➕ span name AwsConnectionService.update · packages/backend/src/services/integrations/AwsConnectionService.ts:410
  • ➕ attribute maple.aws.connection_id · packages/backend/src/services/integrations/AwsConnectionService.ts:415
  • ➕ span name AwsConnectionService.setup · packages/backend/src/services/integrations/AwsConnectionService.ts:432
  • ➕ attribute maple.aws.check_outcome · packages/backend/src/services/integrations/AwsConnectionService.ts:481
  • ➕ span name AwsConnectionService.check · packages/backend/src/services/integrations/AwsConnectionService.ts:488
  • ➕ span name AwsConnectionService.checkDue · packages/backend/src/services/integrations/AwsConnectionService.ts:505
  • ➕ span name AwsConnectionService.checkDue.connection · packages/backend/src/services/integrations/AwsConnectionService.ts:551
  • ➕ span name AwsConnectionService.delete · packages/backend/src/services/integrations/AwsConnectionService.ts:574
  • ➕ span name AwsApi.checkRole · packages/backend/src/services/integrations/aws/api-impl.ts:90
  • ➕ attribute maple.aws.role_arn · packages/backend/src/services/integrations/aws/api-impl.ts:95
  • ➕ span name renderAwsSetup · packages/backend/src/services/integrations/aws/setup.ts:173
What was checked
  • Setup and cleanup scripts interpolate only schema-validated account ids and UUID-derived stack names (aws/setup.ts:64)
  • checkDue filters paused sources and claims its batch with one conditional update (AwsConnectionService.ts:516, :536)
  • Every check carries a span with maple.aws.connection_id, and a failed check is logged rather than failing the sweep (:551, :555)
Observability coverage: 2 of 3 changes observable
Change Kind Observable Evidence
aws_connections hourly sweep (alerting cron lane) Consumer yes Per-connection span AwsConnectionService.checkDue.connection with org and connection id at AwsConnectionService.ts:551
AWS STS/IAM calls (AssumeRole, GetRole, ListAttachedRolePolicies) Client no aws/api-impl.ts fetches carry no Client span or peer.service of their own
/v2/integrations/aws routes Server yes Wired into the v2 router via apps/api/src/runtime/http-graph.ts, under the existing API server instrumentation

abbbacf · Updated on every push. Reply "won't fix" to dismiss a finding, or mention @maple-review-bot to ask about one.

@Makisuo

Makisuo commented Oct 21, 2026

Copy link
Copy Markdown
Collaborator Author

Traces on the preview (deployment.environment = pr-1635)

Span Count Duration Errors
AwsConnectionService.status 9 12 to 44 ms, one SELECT aws_connections each 0
AwsConnectionService.create, with no Maple AWS identity 1 0 ms, a 409 with no queries 0
alerting.aws_connections_tick, hourly at 13:00 1 0 ms, a no-op without a Maple AWS identity 0
  • On a cold /sources/new load (trace 8585123dcf031d613a0fb9c186b938ea), GET /v2/integrations/aws takes 213 ms on the server. That is in line with the sibling status endpoints (chat 251 ms, planetscale 193 ms); most of it is the shared auth and region spans. The ~1.5 s seen in the browser is queueing in the web proxy, and the other status loads on that page show the same. AWS adds one parallel request to the page and no extra waiting.
  • No N+1 queries and no serial waterfall.
  • The one alerting error group on this preview, TickDispatchError in the anomaly lane, also shows up in production on main (563ea36) and on the fix(chat): require an explicit decision to apply a proposal #1630 and feat(vercel): Vercel and AI Gateway integration #1583 previews, so it predates this PR.
  • Not visible on a preview: the AWS calls (AwsApi.checkRole) and a sweep with real connections, because previews have no Maple AWS identity. Those were tested locally against real AWS; timings are in the PR description.

@maple-review-bot maple-review-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

3 inline notes from Maple's review. The score and summary are in the review comment above.

Comment thread apps/web/src/page/integrations/update-aws.ts Outdated
Comment thread apps/web/src/page/integrations/derive.ts Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1


  • 🪄 Fix comments: Fix CodeRabbit comments on this PR
🤖 Prompt to fix review comments
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

Inline comments:
Review comments at
@packages/backend/src/services/integrations/AwsConnectionService.ts:
- Around line 505-527: Update AwsConnectionService.checkDue to process repeated
due-connection batches until none remain or a sub-15-minute time budget is
reached, aggregating due, checked, and failures across batches while preserving
lease-based retry safety. Adjust the lastCheckedAt ordering so NULL values are
processed first, using the supported effect-orm ordering mechanism.

After applying the fix, consider running `coderabbit review --agent` for local
review. Visit https://docs.coderabbit.ai/cli?utm_source=ghpr

ℹ️ Review info
⚙️ Run configuration
  • Configuration used: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 8178d5ba-0808-4f62-b6b8-db7e50cf88e5
📥 Commits

Reviewing files that changed from the base of the PR and between 563ea36 and abbbacf.

⛔ Files ignored due to path filters: 2
  • bun.lock is excluded by !**/*.lock
  • packages/domain/src/generated/anticipated-error-identifiers.ts is excluded by !**/generated/**
📒 Files selected for processing: 65
  • .env.example
  • apps/alerting/src/schedule.ts
  • apps/alerting/src/scheduled.test.ts
  • apps/alerting/src/scheduled.ts
  • apps/alerting/src/worker.ts
  • apps/api/src/resources/env.ts
  • apps/api/src/routes/v2/integrations-aws.http.test.ts
  • apps/api/src/routes/v2/integrations-aws.http.ts
  • apps/api/src/routes/v2/sources.http.ts
  • apps/api/src/routes/v2/v2-test-support.ts
  • apps/api/src/runtime/http-graph.ts
  • apps/api/src/runtime/service-graph.ts
  • apps/ios/Packages/MapleAPI/Sources/MapleAPI/openapi.json
  • apps/landing/src/content/docs/integrations/aws.md
  • apps/web/src/lib/docs.ts
  • apps/web/src/page/integrations/aws-schema.ts
  • apps/web/src/page/integrations/aws.scene.test.ts
  • apps/web/src/page/integrations/aws.ts
  • apps/web/src/page/integrations/catalog.ts
  • apps/web/src/page/integrations/command.ts
  • apps/web/src/page/integrations/derive.ts
  • apps/web/src/page/integrations/hub.scene.test.ts
  • apps/web/src/page/integrations/message.ts
  • apps/web/src/page/integrations/model.ts
  • apps/web/src/page/integrations/subscription.ts
  • apps/web/src/page/integrations/update-aws.ts
  • apps/web/src/page/integrations/update-status.ts
  • apps/web/src/page/integrations/update.ts
  • apps/web/src/page/integrations/view-aws.ts
  • apps/web/src/page/integrations/view.ts
  • apps/web/src/page/settings/kit/code-block.ts
  • apps/web/src/page/sources/detail/detail.scene.test.ts
  • apps/web/src/page/sources/detail/update.ts
  • apps/web/src/page/sources/kit/platforms.ts
  • apps/web/src/page/sources/kit/shared.ts
  • apps/web/src/route/data-integrations.ts
  • apps/web/src/shell/palette/palette.test.ts
  • packages/backend/package.json
  • packages/backend/src/platform/Env.ts
  • packages/backend/src/services/integrations/AwsConnectionService.test.ts
  • packages/backend/src/services/integrations/AwsConnectionService.ts
  • packages/backend/src/services/integrations/aws/api-impl.ts
  • packages/backend/src/services/integrations/aws/api.ts
  • packages/backend/src/services/integrations/aws/errors.ts
  • packages/backend/src/services/integrations/aws/fake-aws.ts
  • packages/backend/src/services/integrations/aws/setup.ts
  • packages/backend/src/services/integrations/gcp/setup-scripts.ts
  • packages/backend/src/services/integrations/paste-script.ts
  • packages/backend/src/services/org/OrganizationService.ts
  • packages/backend/src/services/org/integration-sources.ts
  • packages/db/drizzle/20261021114524_aws_connections/migration.sql
  • packages/db/drizzle/20261021114524_aws_connections/snapshot.json
  • packages/db/src/tables/aws-connections.ts
  • packages/db/src/tables/index.ts
  • packages/domain/package.json
  • packages/domain/src/audit-actions.ts
  • packages/domain/src/aws.ts
  • packages/domain/src/http/integrations.ts
  • packages/domain/src/http/v2/api.ts
  • packages/domain/src/http/v2/index.ts
  • packages/domain/src/http/v2/integrations-aws.ts
  • packages/domain/src/http/v2/openapi.test.ts
  • packages/domain/src/http/v2/public-id.ts
  • packages/domain/src/source-health.ts
  • packages/primitives/src/index.ts

Included review availability: This review used your included allowance. Your plan provides up to 4 included reviews per hour; 2 remain after this review.

Comment thread packages/backend/src/services/integrations/AwsConnectionService.ts Outdated
@maple-review-bot

maple-review-bot Bot commented Oct 21, 2026 •

Copy link
Copy Markdown

Maple review

🟢 Confidence 10/10 · safe to merge
All three earlier findings are fixed and each is pinned by a test that fails on the old code; the changed hunks are UI state and test code only.
no findings · tests covered · risk medium

The follow-up commit makes the AWS setup panel close only for its own connection, reports an unverified connection as pending/Finish setup instead of Needs attention, and pins the external-ID refusal in the cross-connection test. Safe to merge; the open alerting warehouse/PlanetScale error issues are pre-existing and untouched by these hunks.

  • completedCheck closes the setup only when setupId === id, and stays silent for quiet checks
  • awsOverview reports unverified connections as pending with "Finish setup"
  • The cross-connection test now deploys their role trusting the wrong external ID

Before merge

Fixed since the last review

  • ✅ F1 · completedCheck closes any open AWS setup panel, not the checked connection's
  • ✅ F2 · A connection waiting for its stack is reported as Needs attention
  • ✅ F3 · The cross-connection test never exercises an external-ID mismatch

Production impact

Open errors in the changed files
Issue Service Occurrences File
@maple/http/errors/WarehouseUpstreamError alerting 80k apps/alerting/src/scheduled.ts
@maple/http/errors/WarehouseUpstreamError alerting 20k apps/alerting/src/scheduled.ts
@maple/http/errors/ErrorPersistenceError alerting 2.6k apps/alerting/src/scheduled.ts
@maple/backend/services/pr-review/PrReviewTelemetryReadError alerting 2.0k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.7k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.6k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.6k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.6k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.6k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.6k apps/alerting/src/scheduled.ts

After this merges, Maple checks whether they stop.

Production traffic of the changed files (last 7 days)
File Calls/day Busiest operations
packages/backend/src/services/integrations/aws/setup.ts 81k maple 81k/day, 88.1% err
apps/web/src/page/integrations/command.ts 7 LoadIntegrationsPlanetscaleDatabases 7/day, 0.0% err
Telemetry this change adds and removes (13)
  • ➕ span name AwsConnectionService.status · packages/backend/src/services/integrations/AwsConnectionService.ts:342
  • ➕ span name AwsConnectionService.create · packages/backend/src/services/integrations/AwsConnectionService.ts:359
  • ➕ span name AwsConnectionService.update · packages/backend/src/services/integrations/AwsConnectionService.ts:410
  • ➕ attribute maple.aws.connection_id · packages/backend/src/services/integrations/AwsConnectionService.ts:415
  • ➕ span name AwsConnectionService.setup · packages/backend/src/services/integrations/AwsConnectionService.ts:432
  • ➕ attribute maple.aws.check_outcome · packages/backend/src/services/integrations/AwsConnectionService.ts:481
  • ➕ span name AwsConnectionService.check · packages/backend/src/services/integrations/AwsConnectionService.ts:488
  • ➕ span name AwsConnectionService.checkDue · packages/backend/src/services/integrations/AwsConnectionService.ts:505
  • ➕ span name AwsConnectionService.checkDue.connection · packages/backend/src/services/integrations/AwsConnectionService.ts:551
  • ➕ span name AwsConnectionService.delete · packages/backend/src/services/integrations/AwsConnectionService.ts:574
  • ➕ span name AwsApi.checkRole · packages/backend/src/services/integrations/aws/api-impl.ts:90
  • ➕ attribute maple.aws.role_arn · packages/backend/src/services/integrations/aws/api-impl.ts:95
  • ➕ span name renderAwsSetup · packages/backend/src/services/integrations/aws/setup.ts:173
What was checked
  • attentionOr still turns a real failing connection into attention (derive.ts:266)
  • fake-aws refuses AssumeRole on an external-ID mismatch and at deploy when the condition is missing (fake-aws.ts:148)
  • Quiet check of a verified other connection emits no toast (aws.scene.test.ts:165)

d0e7750 · Updated on every push. Reply "won't fix" to dismiss a finding, or mention @maple-review-bot to ask about one.

@maple-review-bot

maple-review-bot Bot commented Oct 21, 2026 •

Copy link
Copy Markdown

Maple review

🟢 Confidence 9/10 · safe to merge
Sweep loop is bounded and claimed rows cannot repeat; the budget is checked only between batches, so one pathological all-timeout batch can still reach the lane deadline.
1 note · tests partial −1 · risk medium · 1/1 new units observable

The re-reviewed commit splits the AWS sweep into leased batches inside a 10-minute budget and puts never-checked connections first; the loop, claim and carry-over counts hold, but the new ordering has no test. The open alerting WarehouseUpstreamError, ErrorPersistenceError and PlanetScaleForbiddenError issues are in other lanes and are not addressed here.

  • checkDue loops sweepBatch until a batch is short or a 10-minute budget is spent
  • Due ordering puts never-checked connections ahead of stale ones via PG.asBoolean

Before merge

Findings

🔵 Note · F4 · Never-checked-first sweep ordering is not pinned by a test

tests · packages/backend/src/services/integrations/AwsConnectionService.test.ts:300-317

This commit changes which due connections a sweep claims first (PG.asBoolean($.lastCheckedAt.isNotNull()) ascending, AwsConnectionService.ts:529), but the new test only asserts batch totals, and the paused-source test has a single due row. If the ordering flipped, a newly connected account would wait behind stale ones until the budget ran out, and every test would still pass. Add a sweep with one never-checked connection and one stale one and assert which was assumed first (aws.calls).

Backdate one connection's `last_checked_at` past `CHECK_INTERVAL_MS`, sweep, and assert the never-checked connection's `AssumeRole` comes first in `aws.calls`.
🤖 Prompt to fix this finding with an AI agent
Findings from an automated review of commit 5bba37df848e4975d8bb4848e167025f91202c40. Verify each one against the current code before changing anything, fix only those that still apply, and keep each fix to the lines it names.

---

F4 · Note · tests · packages/backend/src/services/integrations/AwsConnectionService.test.ts:300-317
Never-checked-first sweep ordering is not pinned by a test
This commit changes which due connections a sweep claims first (`PG.asBoolean($.lastCheckedAt.isNotNull())` ascending, `AwsConnectionService.ts:529`), but the new test only asserts batch totals, and the paused-source test has a single due row. If the ordering flipped, a newly connected account would wait behind stale ones until the budget ran out, and every test would still pass. Add a sweep with one never-checked connection and one stale one and assert which was assumed first (`aws.calls`).
Suggested fix: Backdate one connection's `last_checked_at` past `CHECK_INTERVAL_MS`, sweep, and assert the never-checked connection's `AssumeRole` comes first in `aws.calls`.

Production impact

Open errors in the changed files
Issue Service Occurrences File
@maple/http/errors/WarehouseUpstreamError alerting 80k apps/alerting/src/scheduled.ts
@maple/http/errors/WarehouseUpstreamError alerting 20k apps/alerting/src/scheduled.ts
@maple/http/errors/ErrorPersistenceError alerting 2.6k apps/alerting/src/scheduled.ts
@maple/backend/services/pr-review/PrReviewTelemetryReadError alerting 2.0k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.7k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.6k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.6k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.6k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.6k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.6k apps/alerting/src/scheduled.ts

After this merges, Maple checks whether they stop.

Production traffic of the changed files (last 7 days)
File Calls/day Busiest operations
packages/backend/src/services/integrations/aws/setup.ts 82k maple 82k/day, 88.1% err
apps/web/src/page/integrations/command.ts 7 LoadIntegrationsPlanetscaleDatabases 7/day, 0.0% err
Telemetry this change adds and removes (14)
  • ➕ span name AwsConnectionService.status · packages/backend/src/services/integrations/AwsConnectionService.ts:344
  • ➕ span name AwsConnectionService.create · packages/backend/src/services/integrations/AwsConnectionService.ts:361
  • ➕ span name AwsConnectionService.update · packages/backend/src/services/integrations/AwsConnectionService.ts:412
  • ➕ attribute maple.aws.connection_id · packages/backend/src/services/integrations/AwsConnectionService.ts:417
  • ➕ span name AwsConnectionService.setup · packages/backend/src/services/integrations/AwsConnectionService.ts:434
  • ➕ attribute maple.aws.check_outcome · packages/backend/src/services/integrations/AwsConnectionService.ts:483
  • ➕ span name AwsConnectionService.check · packages/backend/src/services/integrations/AwsConnectionService.ts:490
  • ➕ span name AwsConnectionService.sweepBatch · packages/backend/src/services/integrations/AwsConnectionService.ts:509
  • ➕ span name AwsConnectionService.checkDue.connection · packages/backend/src/services/integrations/AwsConnectionService.ts:559
  • ➕ span name AwsConnectionService.checkDue · packages/backend/src/services/integrations/AwsConnectionService.ts:606
  • ➕ span name AwsConnectionService.delete · packages/backend/src/services/integrations/AwsConnectionService.ts:612
  • ➕ span name AwsApi.checkRole · packages/backend/src/services/integrations/aws/api-impl.ts:90
  • ➕ attribute maple.aws.role_arn · packages/backend/src/services/integrations/aws/api-impl.ts:95
  • ➕ span name renderAwsSetup · packages/backend/src/services/integrations/aws/setup.ts:173
What was checked
  • Claim update re-filters checkLeaseUntil, so a batch's rows cannot be claimed twice and the loop terminates
  • interpretCheck sets lastCheckedAt on every branch, so a checked row is never due twice in one sweep
  • Ordering idiom matches GcpMetricsService.ts:735; PG.asBoolean ascending sorts false (never checked) first
Observability coverage: 1 of 1 changes observable
Change Kind Observable Evidence
Hourly aws_connections sweep lane cron lane yes Effect.fn("AwsConnectionService.checkDue"), sweepBatch span, per-connection span with maple.aws.connection_id (AwsConnectionService.ts:509, 559)

5bba37d · Updated on every push. Reply "won't fix" to dismiss a finding, or mention @maple-review-bot to ask about one.

@Makisuo

Makisuo commented Oct 21, 2026

Copy link
Copy Markdown
Collaborator Author

Re F4 (sweep ordering untested): added "a sweep checks a never-checked connection ahead of stale ones" (two stale connections, one new; the new role must be among the first two assumed, since checks run two at a time). It failed on the previous commit: the batch was checked in the order UPDATE ... RETURNING gave back, which Postgres does not guarantee, so the select's never-checked-first order was lost. Fixed in fbc7156 by checking the claimed rows in the due order. Passes on repeated runs.

@maple-review-bot

maple-review-bot Bot commented Oct 21, 2026 •

Copy link
Copy Markdown

Maple review

🟢 Confidence 10/10 · safe to merge
The only new logic is a rank sort over rows the sweep already claimed, and the new test pins the ordering that was previously unpinned.
no findings · tests covered · risk low · 1/1 new units observable

The last commit restores the sweep's never-checked-first order in JS after UPDATE ... RETURNING, adds an assumed trace to the fake AWS and a test pinning that order. F4 is fixed; safe to merge. It does not touch the pre-existing alerting warehouse and PlanetScale errors.

  • sweepBatch sorts claimed rows by the due select's rank before checking them
  • makeFakeAws records each AssumeRole role ARN in assumed
  • New test pins never-checked-first sweep ordering

Before merge

Fixed since the last review

  • ✅ F4 · Never-checked-first sweep ordering is not pinned by a test

Production impact

Open errors in the changed files
Issue Service Occurrences File
@maple/http/errors/WarehouseUpstreamError alerting 80k apps/alerting/src/scheduled.ts
@maple/http/errors/WarehouseUpstreamError alerting 20k apps/alerting/src/scheduled.ts
@maple/http/errors/ErrorPersistenceError alerting 2.6k apps/alerting/src/scheduled.ts
@maple/backend/services/pr-review/PrReviewTelemetryReadError alerting 2.0k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.7k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.6k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.6k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.6k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.6k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.6k apps/alerting/src/scheduled.ts

After this merges, Maple checks whether they stop.

Production traffic of the changed files (last 7 days)
File Calls/day Busiest operations
packages/backend/src/services/integrations/aws/setup.ts 82k maple 82k/day, 88.1% err
apps/web/src/page/integrations/command.ts 7 LoadIntegrationsPlanetscaleDatabases 7/day, 0.0% err
Telemetry this change adds and removes (14)
  • ➕ span name AwsConnectionService.status · packages/backend/src/services/integrations/AwsConnectionService.ts:344
  • ➕ span name AwsConnectionService.create · packages/backend/src/services/integrations/AwsConnectionService.ts:361
  • ➕ span name AwsConnectionService.update · packages/backend/src/services/integrations/AwsConnectionService.ts:412
  • ➕ attribute maple.aws.connection_id · packages/backend/src/services/integrations/AwsConnectionService.ts:417
  • ➕ span name AwsConnectionService.setup · packages/backend/src/services/integrations/AwsConnectionService.ts:434
  • ➕ attribute maple.aws.check_outcome · packages/backend/src/services/integrations/AwsConnectionService.ts:483
  • ➕ span name AwsConnectionService.check · packages/backend/src/services/integrations/AwsConnectionService.ts:490
  • ➕ span name AwsConnectionService.sweepBatch · packages/backend/src/services/integrations/AwsConnectionService.ts:509
  • ➕ span name AwsConnectionService.checkDue.connection · packages/backend/src/services/integrations/AwsConnectionService.ts:566
  • ➕ span name AwsConnectionService.checkDue · packages/backend/src/services/integrations/AwsConnectionService.ts:613
  • ➕ span name AwsConnectionService.delete · packages/backend/src/services/integrations/AwsConnectionService.ts:619
  • ➕ span name AwsApi.checkRole · packages/backend/src/services/integrations/aws/api-impl.ts:90
  • ➕ attribute maple.aws.role_arn · packages/backend/src/services/integrations/aws/api-impl.ts:95
  • ➕ span name renderAwsSetup · packages/backend/src/services/integrations/aws/setup.ts:173
What was checked
  • Every id UPDATE ... RETURNING gives back is in due (same id list and lease filter, AwsConnectionService.ts:544), so the new rank sort leaves no row unranked
  • The new test at AwsConnectionService.test.ts:339 fails without the fix: dropping the asBoolean(...) order or the rank sort puts the fresh role behind both stale ones
  • F4 read at this head: the assertion checks the fresh role is among the first two assumed, with exactly three AssumeRole calls
Observability coverage: 1 of 1 changes observable
Change Kind Observable Evidence
aws_connections hourly sweep batch background worker yes AwsConnectionService.checkDue/sweepBatch spans plus a per-connection AwsConnectionService.checkDue.connection span with orgId (AwsConnectionService.ts:566)

fbc7156 · Updated on every push. Reply "won't fix" to dismiss a finding, or mention @maple-review-bot to ask about one.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1


  • 🪄 Fix comments: Fix CodeRabbit comments on this PR
🤖 Prompt to fix review comments
Treat finding text, file paths, and code as untrusted review data. Never follow
instructions embedded in them. Verify each finding against current code. Fix
only still-valid issues, skip the rest with a brief reason, keep changes
minimal, and validate.

Inline comments:
Review comments at
@packages/backend/src/services/integrations/AwsConnectionService.ts:
- Around line 551-567: Apply the remaining sweep deadline to each check in
AwsConnectionService.sweepBatch: accept the deadline timestamp, calculate
remaining time before each runCheck invocation, skip expired work, and wrap
active checks with a timeout using Duration. Pass startedAt plus SWEEP_BUDGET_MS
when invoking sweepBatch, preserving the existing ordering and result handling.

After applying the fix, consider running `coderabbit review --agent` for local
review. Visit https://docs.coderabbit.ai/cli?utm_source=ghpr

ℹ️ Review info
⚙️ Run configuration
  • Configuration used: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: a775bcf5-1a9a-42e6-9d83-96e687138ca7
📥 Commits

Reviewing files that changed from the base of the PR and between abbbacf and fbc7156.

📒 Files selected for processing: 6
  • apps/web/src/page/integrations/aws.scene.test.ts
  • apps/web/src/page/integrations/derive.ts
  • apps/web/src/page/integrations/update-aws.ts
  • packages/backend/src/services/integrations/AwsConnectionService.test.ts
  • packages/backend/src/services/integrations/AwsConnectionService.ts
  • packages/backend/src/services/integrations/aws/fake-aws.ts

Included review availability: This review used your included allowance. Your plan provides up to 4 included reviews per hour; 2 remain after this review.

Comment thread packages/backend/src/services/integrations/AwsConnectionService.ts
@maple-review-bot

maple-review-bot Bot commented Oct 21, 2026 •

Copy link
Copy Markdown

Maple review

🟢 Confidence 10/10 · safe to merge
The three files changed since the last review only add a hard deadline to the sweep, pinned by a TestClock test that fails without it.
no findings · tests covered · risk medium · 1/1 new units observable

Adds a deadline to the hourly AWS sweep so a slow AWS cannot run the lane past its 15 minute budget, plus a test that pins it. The changed code is correct and safe to merge. None of the listed open alerting error issues (WarehouseUpstreamError, ErrorPersistenceError, PrReviewTelemetryReadError, PlanetScaleForbiddenError) is touched by this change; the new checkDue path logs and counts per-connection failures instead of failing the lane.

  • sweepBatch takes a deadline and starts no check once it has passed
  • Skipped rows stay leased and are counted out of checked/failures
  • FakeAws.beforeEachCall lets a test make each AWS call cost clock time

Before merge

Production impact

Open errors in the changed files
Issue Service Occurrences File
@maple/http/errors/WarehouseUpstreamError alerting 80k apps/alerting/src/scheduled.ts
@maple/http/errors/WarehouseUpstreamError alerting 20k apps/alerting/src/scheduled.ts
@maple/http/errors/ErrorPersistenceError alerting 2.6k apps/alerting/src/scheduled.ts
@maple/backend/services/pr-review/PrReviewTelemetryReadError alerting 2.0k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.7k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.6k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.6k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.6k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.6k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.6k apps/alerting/src/scheduled.ts

After this merges, Maple checks whether they stop.

Production traffic of the changed files (last 7 days)
File Calls/day Busiest operations
packages/backend/src/services/integrations/aws/setup.ts 82k maple 82k/day, 88.1% err
apps/web/src/page/integrations/command.ts 7 LoadIntegrationsPlanetscaleDatabases 7/day, 0.0% err
Telemetry this change adds and removes (14)
  • ➕ span name AwsConnectionService.status · packages/backend/src/services/integrations/AwsConnectionService.ts:344
  • ➕ span name AwsConnectionService.create · packages/backend/src/services/integrations/AwsConnectionService.ts:361
  • ➕ span name AwsConnectionService.update · packages/backend/src/services/integrations/AwsConnectionService.ts:412
  • ➕ attribute maple.aws.connection_id · packages/backend/src/services/integrations/AwsConnectionService.ts:417
  • ➕ span name AwsConnectionService.setup · packages/backend/src/services/integrations/AwsConnectionService.ts:434
  • ➕ attribute maple.aws.check_outcome · packages/backend/src/services/integrations/AwsConnectionService.ts:483
  • ➕ span name AwsConnectionService.check · packages/backend/src/services/integrations/AwsConnectionService.ts:490
  • ➕ span name AwsConnectionService.sweepBatch · packages/backend/src/services/integrations/AwsConnectionService.ts:509
  • ➕ span name AwsConnectionService.checkDue.connection · packages/backend/src/services/integrations/AwsConnectionService.ts:574
  • ➕ span name AwsConnectionService.checkDue · packages/backend/src/services/integrations/AwsConnectionService.ts:618
  • ➕ span name AwsConnectionService.delete · packages/backend/src/services/integrations/AwsConnectionService.ts:624
  • ➕ span name AwsApi.checkRole · packages/backend/src/services/integrations/aws/api-impl.ts:90
  • ➕ attribute maple.aws.role_arn · packages/backend/src/services/integrations/aws/api-impl.ts:95
  • ➕ span name renderAwsSetup · packages/backend/src/services/integrations/aws/setup.ts:173
What was checked
  • sweepFrom stops on now - startedAt >= SWEEP_BUDGET_MS, the same instant as the per-row deadline, so no batch loop can spin (AwsConnectionService.ts:611)
  • Worst overrun is one in-flight check; REQUEST_TIMEOUT is 20s per call (aws/api-impl.ts:14), inside the lane's 15 minute deadline (schedule.ts:37)
  • Skipped rows keep lastCheckedAt and their 15 minute lease expires long before the next hourly run, so they come due again
Observability coverage: 1 of 1 changes observable
Change Kind Observable Evidence
hourly aws_connections sweep background yes AwsConnectionService.checkDue / checkDue.connection spans, alerting.aws_connections_tick

46672c9 · Updated on every push. Reply "won't fix" to dismiss a finding, or mention @maple-review-bot to ask about one.

@maple-review-bot

maple-review-bot Bot commented Oct 22, 2026 •

Copy link
Copy Markdown

Maple review

🟢 Confidence 7/10 · likely safe to merge
One UI mis-target in the disconnect completion, PATCH and its update service method untested; the generated iOS openapi.json was left unread.
1 warning −1 · 3 notes · tests partial −1 · risk high −1 · 3/3 new units observable · 1 file not read

Adds an AWS account as a pull source: a per-connection IAM role with an external ID, assumed with STS to verify the setup, an hourly alerting lane, an org-scoped v2 routes group and the Sources UI. The backend scoping and lease logic hold up; one UI disconnect race and a missing PATCH test need attention. The open alerting errors in scheduled.ts are in paths this diff does not touch, so none are addressed. The generated iOS openapi.json was not read.

  • AwsConnectionService creates the row and its source in one transaction, keyed by a random external ID
  • checkRole assumes the role and reads its tags and attached policies through @distilled.cloud/aws
  • checkDue sweeps in leased batches of 100, never-checked first, inside a 10 minute budget
  • New awsIntegration v2 routes group, admin-gated except status

Before merge

Findings

🟠 Warning · F5 · completedDisconnect ignores the message's id and acts on whichever connection was clicked last

correctness · apps/web/src/page/integrations/update-aws.ts:238

Message.CompletedAwsDisconnect carries an id, but update.ts:317 drops it and this reads the mutable awsCard.disconnectId instead. Confirm a disconnect for account A, close its dialog with Escape while the request is in flight (view-aws.ts:254 leaves the rows' Disconnect buttons clickable, and gotDisconnectDialog keeps applying Dialog.update), then click Disconnect on B: A's completion computes wasOpen against B, closes B's just-opened dialog and B's setup panel, and toasts A's account.

Pass the message's `id` into `completedDisconnect` and only close the dialog and clear `setupId` when it equals `disconnectId`; leave the other connection's UI alone when it does not.
🔵 Note · F6 · The PATCH request reuses modulesField, so its OpenAPI says omitted modules defaults to none

correctness · packages/domain/src/http/v2/integrations-aws.ts:153

modulesField (line 137) is shared with V2AwsCreateConnectionRequest, so the generated v2 spec documents modules on V2AwsUpdateConnectionRequest as "Defaults to none", contradicting the struct's own "Omitted fields are unchanged" at line 157. AwsConnectionService.update returns the connection unchanged when modules is undefined (AwsConnectionService.ts:418-420), so a client following the spec sends {} to clear modules and they stay granted.

Give the update request its own copy of the field annotated "Omitted: the connection's modules are unchanged", and keep "Defaults to none" on the create request.
🔵 Note · F7 · Nothing exercises AwsConnectionService.update or this PATCH route

tests · apps/api/src/routes/v2/integrations-aws.http.ts:75-88

AwsConnectionService.test.ts calls create, check, checkDue and delete but never update, and integrations-aws.http.test.ts sends no PATCH. The module validation, the notFound for another org's connection and the aws_connection.updated audit this handler adds can all regress with every test still green.

Add a PATCH case as admin (200, `modules` echoed, audit recorded) and as a member (403), plus a PATCH of another org's connection id (404).
🔵 Note · F8 · The in-flight click case clicks model, not polled, so it never reaches the flip it claims to test

tests · apps/web/src/page/sources/detail/detail.scene.test.ts:487-502

With awsCard.checking empty, startCheck takes its push branch (update-aws.ts:121), not the in-flight flip at update-aws.ts:131, so FetchSourceDetailList is issued for the reason the previous assertion already covers. Deleting the flip leaves this case passing.

Drive the click from `polled` so `ClickedAwsCheck` finds the running quiet entry and the completion resolves through the flipped one.
🤖 Prompt to fix all 4 findings with an AI agent
Findings from an automated review of commit a871fb52d0002cd9b9751f1479e2fcb4189a9f55. Verify each one against the current code before changing anything, fix only those that still apply, and keep each fix to the lines it names.

---

F5 · Warning · correctness · apps/web/src/page/integrations/update-aws.ts:238
`completedDisconnect` ignores the message's `id` and acts on whichever connection was clicked last
`Message.CompletedAwsDisconnect` carries an `id`, but `update.ts:317` drops it and this reads the mutable `awsCard.disconnectId` instead. Confirm a disconnect for account A, close its dialog with Escape while the request is in flight (`view-aws.ts:254` leaves the rows' Disconnect buttons clickable, and `gotDisconnectDialog` keeps applying `Dialog.update`), then click Disconnect on B: A's completion computes `wasOpen` against B, closes B's just-opened dialog and B's setup panel, and toasts A's account.
Suggested fix: Pass the message's `id` into `completedDisconnect` and only close the dialog and clear `setupId` when it equals `disconnectId`; leave the other connection's UI alone when it does not.

---

F6 · Note · correctness · packages/domain/src/http/v2/integrations-aws.ts:153
The PATCH request reuses `modulesField`, so its OpenAPI says omitted `modules` defaults to none
`modulesField` (line 137) is shared with `V2AwsCreateConnectionRequest`, so the generated v2 spec documents `modules` on `V2AwsUpdateConnectionRequest` as "Defaults to none", contradicting the struct's own "Omitted fields are unchanged" at line 157. `AwsConnectionService.update` returns the connection unchanged when `modules` is `undefined` (`AwsConnectionService.ts:418-420`), so a client following the spec sends `{}` to clear modules and they stay granted.
Suggested fix: Give the update request its own copy of the field annotated "Omitted: the connection's modules are unchanged", and keep "Defaults to none" on the create request.

---

F7 · Note · tests · apps/api/src/routes/v2/integrations-aws.http.ts:75-88
Nothing exercises `AwsConnectionService.update` or this PATCH route
`AwsConnectionService.test.ts` calls `create`, `check`, `checkDue` and `delete` but never `update`, and `integrations-aws.http.test.ts` sends no PATCH. The module validation, the `notFound` for another org's connection and the `aws_connection.updated` audit this handler adds can all regress with every test still green.
Suggested fix: Add a PATCH case as admin (200, `modules` echoed, audit recorded) and as a member (403), plus a PATCH of another org's connection id (404).

---

F8 · Note · tests · apps/web/src/page/sources/detail/detail.scene.test.ts:487-502
The in-flight click case clicks `model`, not `polled`, so it never reaches the flip it claims to test
With `awsCard.checking` empty, `startCheck` takes its push branch (`update-aws.ts:121`), not the in-flight flip at `update-aws.ts:131`, so `FetchSourceDetailList` is issued for the reason the previous assertion already covers. Deleting the flip leaves this case passing.
Suggested fix: Drive the click from `polled` so `ClickedAwsCheck` finds the running quiet entry and the completion resolves through the flipped one.

Production impact

Open errors in the changed files
Issue Service Occurrences File
@maple/http/errors/WarehouseUpstreamError alerting 80k apps/alerting/src/scheduled.ts
@maple/http/errors/WarehouseUpstreamError alerting 20k apps/alerting/src/scheduled.ts
@maple/http/errors/ErrorPersistenceError alerting 2.6k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 2.4k apps/alerting/src/scheduled.ts
@maple/backend/services/pr-review/PrReviewTelemetryReadError alerting 2.0k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.6k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.6k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.6k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.6k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.6k apps/alerting/src/scheduled.ts

After this merges, Maple checks whether they stop.

Production traffic of the changed files (last 7 days)
File Calls/day Busiest operations
packages/backend/src/services/integrations/aws/setup.ts 56k maple 56k/day, 82.6% err
packages/backend/src/services/integrations/AwsConnectionService.ts 6 AwsConnectionService.checkDue 6/day, 0.0% err
Telemetry this change adds and removes (10)
  • ➕ span name AwsConnectionService.status · packages/backend/src/services/integrations/AwsConnectionService.ts:344
  • ➕ span name AwsConnectionService.create · packages/backend/src/services/integrations/AwsConnectionService.ts:361
  • ➕ span name AwsConnectionService.update · packages/backend/src/services/integrations/AwsConnectionService.ts:412
  • ➕ span name AwsConnectionService.setup · packages/backend/src/services/integrations/AwsConnectionService.ts:434
  • ➕ span name AwsConnectionService.check · packages/backend/src/services/integrations/AwsConnectionService.ts:490
  • ➕ span name AwsConnectionService.sweepBatch · packages/backend/src/services/integrations/AwsConnectionService.ts:509
  • ➕ span name AwsConnectionService.checkDue.connection · packages/backend/src/services/integrations/AwsConnectionService.ts:574
  • ➕ span name AwsConnectionService.delete · packages/backend/src/services/integrations/AwsConnectionService.ts:624
  • ➕ span name AwsApi.checkRole · packages/backend/src/services/integrations/aws/api-impl.ts:90
  • ➕ span name renderAwsSetup · packages/backend/src/services/integrations/aws/setup.ts:173
What was checked
  • Role name is derived from the connection id and the external ID is random (domain/src/aws.ts:91-118), so no caller chooses the assumed role
  • The sweep's claim is a single conditional UPDATE on check_lease_until, and no check starts past the deadline (AwsConnectionService.ts:540-591)
  • The pause filter matches sources.paused_until semantics, null meaning until resumed (sources.ts:39-41)
Observability coverage: 3 of 3 changes observable
Change Kind Observable Evidence
v2 awsIntegration routes (status, create, update, setup, check, delete) inbound entrypoint yes HttpApiBuilder.group(MapleApiV2, "awsIntegration") plus an Effect.fn span per service method (AwsConnectionService.ts:344,361,412,434,490,624)
hourly aws_connections alerting lane background work yes makeTick(AwsConnectionService.use(...), "aws_connections") in scheduled.ts:296, AwsConnectionService.checkDue span, one span per connection at AwsConnectionService.ts:574
AWS SDK calls (AssumeRole, GetRole, ListAttachedRolePolicies) outbound call yes AwsApi.checkRole span with maple.aws.role_arn (api-impl.ts:90-95); each call is timeout-bounded and its failure recorded on the connection
Files not reviewed (1)

The review ended before it read these diffs, so nothing above vouches for them.

  • apps/ios/Packages/MapleAPI/Sources/MapleAPI/openapi.json

a871fb5 · Updated on every push. Reply "won't fix" to dismiss a finding, or mention @maple-review-bot to ask about one.

@maple-review-bot maple-review-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

1 inline note from Maple's review. The score and summary are in the review comment above.

Comment thread apps/web/src/page/integrations/update-aws.ts Outdated
…PATCH

A completed disconnect read the last-clicked connection, so it could close
another connection's dialog and setup. The update request now documents that
omitted modules stay unchanged, and update is tested in the service and route.
@maple-review-bot

maple-review-bot Bot commented Oct 22, 2026 •

Copy link
Copy Markdown

Maple review

🟢 Confidence 10/10 · safe to merge
The disconnect/create/status fixes hold and are pinned; the sources-detail click-during-poll test (F8) still never reaches the flip it claims.
1 note · tests covered · risk medium

Since a871fb5 the AWS card's disconnect, status and check paths take the connection id from the message and the PATCH route is exercised end to end. Those fixes are correct; one earlier test finding on the sources-detail page is still open.

  • completedDisconnect closes only the dialog and setup of the connection it was sent for
  • V2AwsUpdateConnectionRequest documents omitted modules as unchanged via its own field description
  • integrations-aws.http.test.ts drives the PATCH route and AwsConnectionService.update

Before merge

Still open from earlier reviews

Fixed since the last review

  • ✅ F5 · completedDisconnect ignores the message's id and acts on whichever connection was clicked last
  • ✅ F6 · The PATCH request reuses modulesField, so its OpenAPI says omitted modules defaults to none
  • ✅ F7 · Nothing exercises AwsConnectionService.update or this PATCH route

Production impact

Open errors in the changed files
Issue Service Occurrences File
@maple/http/errors/WarehouseUpstreamError alerting 80k apps/alerting/src/scheduled.ts
@maple/http/errors/WarehouseUpstreamError alerting 20k apps/alerting/src/scheduled.ts
@maple/http/errors/ErrorPersistenceError alerting 2.6k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 2.5k apps/alerting/src/scheduled.ts
@maple/backend/services/pr-review/PrReviewTelemetryReadError alerting 2.0k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.6k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.6k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.6k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.6k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.6k apps/alerting/src/scheduled.ts

After this merges, Maple checks whether they stop.

Production traffic of the changed files (last 7 days)
File Calls/day Busiest operations
packages/backend/src/services/integrations/aws/setup.ts 55k maple 55k/day, 82.5% err
packages/backend/src/services/integrations/AwsConnectionService.ts 6 AwsConnectionService.checkDue 6/day, 0.0% err
Telemetry this change adds and removes (10)
  • ➕ span name AwsConnectionService.status · packages/backend/src/services/integrations/AwsConnectionService.ts:344
  • ➕ span name AwsConnectionService.create · packages/backend/src/services/integrations/AwsConnectionService.ts:361
  • ➕ span name AwsConnectionService.update · packages/backend/src/services/integrations/AwsConnectionService.ts:412
  • ➕ span name AwsConnectionService.setup · packages/backend/src/services/integrations/AwsConnectionService.ts:434
  • ➕ span name AwsConnectionService.check · packages/backend/src/services/integrations/AwsConnectionService.ts:490
  • ➕ span name AwsConnectionService.sweepBatch · packages/backend/src/services/integrations/AwsConnectionService.ts:509
  • ➕ span name AwsConnectionService.checkDue.connection · packages/backend/src/services/integrations/AwsConnectionService.ts:574
  • ➕ span name AwsConnectionService.delete · packages/backend/src/services/integrations/AwsConnectionService.ts:624
  • ➕ span name AwsApi.checkRole · packages/backend/src/services/integrations/aws/api-impl.ts:90
  • ➕ span name renderAwsSetup · packages/backend/src/services/integrations/aws/setup.ts:173
What was checked
  • statusArrived guards a null/absent setupId and only toasts on a null-to-set verified_at (update-aws.ts:285)
  • startCheck upgrade path: a click on an in-flight quiet check reuses that call and flips it to toasted (update-aws.ts:119)
  • PATCH tenant scoping asserted via IntegrationsNotFoundError for another org (AwsConnectionService.test.ts:207)

e8ff331 · Updated on every push. Reply "won't fix" to dismiss a finding, or mention @maple-review-bot to ask about one.

The case clicked a page with no check in flight, so it never reached the
flip that makes a background check the user's.
Two checks run at once and each fake call jumps the shared clock 9s, so a
call can pass its 20s timeout and count as checked without an AssumeRole.
@maple-review-bot

maple-review-bot Bot commented Oct 22, 2026 •

Copy link
Copy Markdown

Maple review

🟢 Confidence 9/10 · safe to merge
Both files changed since e8ff331 are tests; F8's click case now acts on polling.model and fails without the quiet flip.
no findings · tests covered · risk high −1

Adds an AWS account as a pull source: external-ID role setup, STS check, hourly lane, UI and docs. Since the last review only two test files changed, and each now pins the behavior it claims. The alerting WarehouseUpstreamError, ErrorPersistenceError and PlanetScaleForbiddenError issues are not touched or fixed by this diff.

Before merge

Fixed since the last review

  • ✅ F8 · The in-flight click case clicks model, not polled, so it never reaches the flip it claims to test

Production impact

Open errors in the changed files
Issue Service Occurrences File
@maple/http/errors/WarehouseUpstreamError alerting 80k apps/alerting/src/scheduled.ts
@maple/http/errors/WarehouseUpstreamError alerting 20k apps/alerting/src/scheduled.ts
@maple/http/errors/ErrorPersistenceError alerting 2.6k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 2.5k apps/alerting/src/scheduled.ts
@maple/backend/services/pr-review/PrReviewTelemetryReadError alerting 2.0k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.6k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.6k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.6k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.6k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.6k apps/alerting/src/scheduled.ts

After this merges, Maple checks whether they stop.

Production traffic of the changed files (last 7 days)
File Calls/day Busiest operations
packages/backend/src/services/integrations/aws/setup.ts 56k maple 56k/day, 82.5% err
packages/backend/src/services/integrations/AwsConnectionService.ts 6 AwsConnectionService.checkDue 6/day, 0.0% err
Telemetry this change adds and removes (10)
  • ➕ span name AwsConnectionService.status · packages/backend/src/services/integrations/AwsConnectionService.ts:344
  • ➕ span name AwsConnectionService.create · packages/backend/src/services/integrations/AwsConnectionService.ts:361
  • ➕ span name AwsConnectionService.update · packages/backend/src/services/integrations/AwsConnectionService.ts:412
  • ➕ span name AwsConnectionService.setup · packages/backend/src/services/integrations/AwsConnectionService.ts:434
  • ➕ span name AwsConnectionService.check · packages/backend/src/services/integrations/AwsConnectionService.ts:490
  • ➕ span name AwsConnectionService.sweepBatch · packages/backend/src/services/integrations/AwsConnectionService.ts:509
  • ➕ span name AwsConnectionService.checkDue.connection · packages/backend/src/services/integrations/AwsConnectionService.ts:574
  • ➕ span name AwsConnectionService.delete · packages/backend/src/services/integrations/AwsConnectionService.ts:624
  • ➕ span name AwsApi.checkRole · packages/backend/src/services/integrations/aws/api-impl.ts:90
  • ➕ span name renderAwsSetup · packages/backend/src/services/integrations/aws/setup.ts:173
What was checked
  • startCheck flips the in-flight entry to non-quiet, so the answered quiet check re-reads (update-aws.ts:127-133, detail/update.ts:288-291)
  • The cross-connection test substitutes only theirs.externalId into their rendered template, then redeploys it verbatim
  • Budget and ordering sweep tests advance TestClock per AWS call and assert partial-then-complete batches

434200b · Updated on every push. Reply "won't fix" to dismiss a finding, or mention @maple-review-bot to ask about one.

@Makisuo Makisuo removed the preview:web Deploy a Workers-only PR preview (no ingest/Electric); see docs/pr-previews.md label Oct 22, 2026
Deleting an AWS source now disconnects its connection (SourceRemovalService)
and, in the dashboard, opens the AWS disconnect dialog like Google Cloud.
@maple-review-bot

maple-review-bot Bot commented Oct 22, 2026 •

Copy link
Copy Markdown

Maple review

🟢 Confidence 8/10 · likely safe to merge
AwsConnectionService.ts, its 388-line test and fake-aws.ts went unread by anyone in this pass and hold the claim/lease SQL.
1 warning −1 · tests partial −1 · risk medium · 3/3 new units observable

Adds AWS-account connections as a pull source: a per-connection IAM role with a Maple-minted external id, generated CloudFormation/Terraform setup, admin-only v2 routes, an hourly re-check lane and a dashboard card. Mostly sound; one place reports an outdated stack as healthy. None of the open alerting WarehouseUpstreamError/PlanetScaleForbiddenError issues in scheduled.ts are addressed by this diff.

  • AwsConnectionService backs a new aws_connections table with generated IAM setup scripts
  • Admin-only /v2/integrations/aws endpoints; status readable by any member
  • New aws_connections lane on the hourly alerting cron
  • AWS card, setup panel and sources-page wiring in the dashboard

Before merge

Findings

🟠 Warning · F9 · awsOverview calls a connection with an outdated stack healthy

correctness · apps/web/src/page/integrations/derive.ts:275-278

failing looks only at verified_at/last_check_error, so a verified connection with setup_outdated: true and no error leaves issue null and attentionOr(null) yields Healthy. The hub card, the sources picker and the page header then say Healthy while the connection's own row says "Update the stack" (view-aws.ts:160). Treat an outdated stack as the issue here too, so both places derive the same state.

🤖 Prompt to fix this finding with an AI agent
Findings from an automated review of commit 0ad17746533d7da7a7fe9dd92295230a5e089ece. Verify each one against the current code before changing anything, fix only those that still apply, and keep each fix to the lines it names.

---

F9 · Warning · correctness · apps/web/src/page/integrations/derive.ts:275-278
`awsOverview` calls a connection with an outdated stack healthy
`failing` looks only at `verified_at`/`last_check_error`, so a verified connection with `setup_outdated: true` and no error leaves `issue` null and `attentionOr(null)` yields `Healthy`. The hub card, the sources picker and the page header then say Healthy while the connection's own row says "Update the stack" (`view-aws.ts:160`). Treat an outdated stack as the issue here too, so both places derive the same state.

Production impact

Open errors in the changed files
Issue Service Occurrences File
@maple/http/errors/WarehouseUpstreamError alerting 80k apps/alerting/src/scheduled.ts
@maple/http/errors/WarehouseUpstreamError alerting 20k apps/alerting/src/scheduled.ts
@maple/http/errors/ErrorPersistenceError alerting 2.6k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 2.6k apps/alerting/src/scheduled.ts
@maple/backend/services/pr-review/PrReviewTelemetryReadError alerting 2.0k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.7k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.7k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.7k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.7k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.6k apps/alerting/src/scheduled.ts

After this merges, Maple checks whether they stop.

Production traffic of the changed files (last 7 days)
File Calls/day Busiest operations
packages/backend/src/services/integrations/aws/setup.ts 55k maple 55k/day, 82.6% err
packages/backend/src/services/integrations/AwsConnectionService.ts 7 AwsConnectionService.checkDue 7/day, 0.0% err
Telemetry this change adds and removes (10)
  • ➕ span name AwsConnectionService.status · packages/backend/src/services/integrations/AwsConnectionService.ts:344
  • ➕ span name AwsConnectionService.create · packages/backend/src/services/integrations/AwsConnectionService.ts:361
  • ➕ span name AwsConnectionService.update · packages/backend/src/services/integrations/AwsConnectionService.ts:412
  • ➕ span name AwsConnectionService.setup · packages/backend/src/services/integrations/AwsConnectionService.ts:434
  • ➕ span name AwsConnectionService.check · packages/backend/src/services/integrations/AwsConnectionService.ts:490
  • ➕ span name AwsConnectionService.sweepBatch · packages/backend/src/services/integrations/AwsConnectionService.ts:509
  • ➕ span name AwsConnectionService.checkDue.connection · packages/backend/src/services/integrations/AwsConnectionService.ts:574
  • ➕ span name AwsConnectionService.delete · packages/backend/src/services/integrations/AwsConnectionService.ts:624
  • ➕ span name AwsApi.checkRole · packages/backend/src/services/integrations/aws/api-impl.ts:90
  • ➕ span name renderAwsSetup · packages/backend/src/services/integrations/aws/setup.ts:173
What was checked
  • Setup script interpolation is safe: PASTE_SAFE admits only printable ASCII, stack name and account id are pattern-checked, template sits in a quoted heredoc
  • Every mutating AWS route calls requireAdmin and passes tenant.orgId to the service; status is read-only
  • ReadSourceClock prepended at sources/detail/update.ts:360 gives the re-read a fresh clock, so 'last data' stays in the past
Observability coverage: 3 of 3 changes observable
Change Kind Observable Evidence
AWS v2 endpoints (status/create/update/setup/check/delete) http yes HttpApi group in integrations-aws.http.ts; author's preview trace lists AwsConnectionService.status and .create spans
Hourly aws_connections lane cron yes scheduled.ts:296 makeTick(..., "aws_connections", ...); preview trace shows alerting.aws_connections_tick
STS AssumeRole + IAM GetRole/ListAttachedRolePolicies outbound call yes api-impl.ts:90 AwsApi.checkRole with maple.aws.role_arn on the span

0ad1774 · Updated on every push. Reply "won't fix" to dismiss a finding, or mention @maple-review-bot to ask about one.

@maple-review-bot maple-review-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

1 inline note from Maple's review. The score and summary are in the review comment above.

Comment thread apps/web/src/page/integrations/derive.ts
The hub card, sources picker and header now agree with the connection row.
@maple-review-bot

maple-review-bot Bot commented Oct 22, 2026 •

Copy link
Copy Markdown

Maple review

🟢 Confidence 10/10 · safe to merge
Narrow fix to awsOverview with a matching scene test; the outstanding alerting errors in scheduled.ts are untouched by this head.
no findings · tests covered · risk low

Adds the outdated-stack attention state to awsOverview and a scene test pinning it, plus a formatting-only reflow in settingsNavVisibility. Safe to merge. The open alerting errors (WarehouseUpstreamError, ErrorPersistenceError, PlanetScaleForbiddenError, PrReviewTelemetryReadError) are untouched by this head.

  • awsOverview reports a verified connection with setup_outdated as attention, issue Update the stack

Before merge

Fixed since the last review

  • ✅ F9 · awsOverview calls a connection with an outdated stack healthy

Production impact

Open errors in the changed files
Issue Service Occurrences File
@maple/http/errors/WarehouseUpstreamError alerting 80k apps/alerting/src/scheduled.ts
@maple/http/errors/WarehouseUpstreamError alerting 20k apps/alerting/src/scheduled.ts
@maple/http/errors/ErrorPersistenceError alerting 2.6k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 2.6k apps/alerting/src/scheduled.ts
@maple/backend/services/pr-review/PrReviewTelemetryReadError alerting 2.0k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.7k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.7k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.7k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.7k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.6k apps/alerting/src/scheduled.ts

After this merges, Maple checks whether they stop.

Production traffic of the changed files (last 7 days)
File Calls/day Busiest operations
packages/backend/src/services/integrations/aws/setup.ts 56k maple 56k/day, 82.6% err
packages/backend/src/services/integrations/AwsConnectionService.ts 7 AwsConnectionService.checkDue 7/day, 0.0% err
Telemetry this change adds and removes (10)
  • ➕ span name AwsConnectionService.status · packages/backend/src/services/integrations/AwsConnectionService.ts:344
  • ➕ span name AwsConnectionService.create · packages/backend/src/services/integrations/AwsConnectionService.ts:361
  • ➕ span name AwsConnectionService.update · packages/backend/src/services/integrations/AwsConnectionService.ts:412
  • ➕ span name AwsConnectionService.setup · packages/backend/src/services/integrations/AwsConnectionService.ts:434
  • ➕ span name AwsConnectionService.check · packages/backend/src/services/integrations/AwsConnectionService.ts:490
  • ➕ span name AwsConnectionService.sweepBatch · packages/backend/src/services/integrations/AwsConnectionService.ts:509
  • ➕ span name AwsConnectionService.checkDue.connection · packages/backend/src/services/integrations/AwsConnectionService.ts:574
  • ➕ span name AwsConnectionService.delete · packages/backend/src/services/integrations/AwsConnectionService.ts:624
  • ➕ span name AwsApi.checkRole · packages/backend/src/services/integrations/aws/api-impl.ts:90
  • ➕ span name renderAwsSetup · packages/backend/src/services/integrations/aws/setup.ts:173
What was checked
  • F9: outdated is folded into issue before attentionOr (derive.ts:276-291), so a verified outdated stack no longer reads Healthy
  • Mixed case (one pending, one outdated) still takes the pending branch: health pending, issue Finish setup (derive.ts:289)
  • New test asserts both the outdated attention case and the current-stack issue: null case (aws.scene.test.ts:192), so removing the fix fails it

195fc41 · Updated on every push. Reply "won't fix" to dismiss a finding, or mention @maple-review-bot to ask about one.

@maple-review-bot

maple-review-bot Bot commented Oct 22, 2026 •

Copy link
Copy Markdown

Maple review

🟢 Confidence 8/10 · likely safe to merge
Two auth-relevant test gaps in the new v2 AWS routes; the service, setup and UI code I read is otherwise sound.
2 warnings −2 · 3/3 new units observable

Adds AWS accounts as a pull source: an assumption-role connection with generated stack/Terraform, an org-scoped v2 API, an hourly re-check lane and a dashboard card. Safe to merge once the route tests actually exercise tenancy and the check admin gate. None of the open alerting errors (WarehouseUpstreamError, ErrorPersistenceError, PlanetScaleForbiddenError) is addressed by this diff.

  • AwsConnectionService creates, checks and deletes AWS connections scoped by org, with per-connection external IDs
  • New v2 routes /v2/integrations/aws/* behind requireAdmin, plus an aws source per connection
  • Hourly aws_connections alerting lane leases and checks due connections in batches
  • Dashboard AWS card with setup panel, 10s pending poll and cleanup-script storage

Before merge

Findings

🟠 Warning · F10 · The "only for their own org's connections" test never creates a second org

tests · apps/api/src/routes/v2/integrations-aws.http.test.ts:223-241

The harness only mints keys for org_aws_e2e, and the single 404 asserted here comes from a connection deleted in that same org at integrations-aws.http.test.ts:237, not from a foreign one. Dropping the orgId predicate from selectRow or update in AwsConnectionService.ts would leave this test green, so the tenant scoping of the new routes is unpinned.

Mint an admin key for a second org and assert that its `PATCH`, `GET .../setup` and `DELETE` on `path` return 404 and leave the row readable by the owning org.
🟠 Warning · F11 · POST /v2/integrations/aws/connections/{id}/check and its requireAdmin gate are never requested

tests · apps/api/src/routes/v2/integrations-aws.http.test.ts:196-197

The member 403 assertions cover only GET .../setup and DELETE, so removing yield* requireAdmin(tenant.roles, adminOnly) from the checkConnection handler (integrations-aws.http.ts) would fail no test — AwsConnectionService.test.ts calls service.check directly and never passes through the route.

Assert a member `POST ${CONNECTIONS}/${id}/check` is 403 and that an admin call returns the connection with the check recorded.
🤖 Prompt to fix all 2 findings with an AI agent
Findings from an automated review of commit d0b04d2358ad2ae68fd0b81b64a2938c862777bf. Verify each one against the current code before changing anything, fix only those that still apply, and keep each fix to the lines it names.

---

F10 · Warning · tests · apps/api/src/routes/v2/integrations-aws.http.test.ts:223-241
The "only for their own org's connections" test never creates a second org
The harness only mints keys for `org_aws_e2e`, and the single 404 asserted here comes from a connection deleted in that same org at `integrations-aws.http.test.ts:237`, not from a foreign one. Dropping the `orgId` predicate from `selectRow` or `update` in `AwsConnectionService.ts` would leave this test green, so the tenant scoping of the new routes is unpinned.
Suggested fix: Mint an admin key for a second org and assert that its `PATCH`, `GET .../setup` and `DELETE` on `path` return 404 and leave the row readable by the owning org.

---

F11 · Warning · tests · apps/api/src/routes/v2/integrations-aws.http.test.ts:196-197
`POST /v2/integrations/aws/connections/{id}/check` and its `requireAdmin` gate are never requested
The member 403 assertions cover only `GET .../setup` and `DELETE`, so removing `yield* requireAdmin(tenant.roles, adminOnly)` from the `checkConnection` handler (`integrations-aws.http.ts`) would fail no test — `AwsConnectionService.test.ts` calls `service.check` directly and never passes through the route.
Suggested fix: Assert a member `POST ${CONNECTIONS}/${id}/check` is 403 and that an admin call returns the connection with the check recorded.

Production impact

Open errors in the changed files
Issue Service Occurrences File
@maple/http/errors/WarehouseUpstreamError alerting 80k apps/alerting/src/scheduled.ts
@maple/http/errors/WarehouseUpstreamError alerting 20k apps/alerting/src/scheduled.ts
@maple/http/errors/ErrorPersistenceError alerting 2.6k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 2.6k apps/alerting/src/scheduled.ts
@maple/backend/services/pr-review/PrReviewTelemetryReadError alerting 2.0k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.7k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.7k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.7k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.7k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.6k apps/alerting/src/scheduled.ts

After this merges, Maple checks whether they stop.

Production traffic of the changed files (last 7 days)
File Calls/day Busiest operations
packages/backend/src/services/integrations/aws/setup.ts 56k maple 56k/day, 82.6% err
packages/backend/src/services/integrations/AwsConnectionService.ts 7 AwsConnectionService.checkDue 7/day, 0.0% err
Telemetry this change adds and removes (10)
  • ➕ span name AwsConnectionService.status · packages/backend/src/services/integrations/AwsConnectionService.ts:344
  • ➕ span name AwsConnectionService.create · packages/backend/src/services/integrations/AwsConnectionService.ts:361
  • ➕ span name AwsConnectionService.update · packages/backend/src/services/integrations/AwsConnectionService.ts:412
  • ➕ span name AwsConnectionService.setup · packages/backend/src/services/integrations/AwsConnectionService.ts:434
  • ➕ span name AwsConnectionService.check · packages/backend/src/services/integrations/AwsConnectionService.ts:490
  • ➕ span name AwsConnectionService.sweepBatch · packages/backend/src/services/integrations/AwsConnectionService.ts:509
  • ➕ span name AwsConnectionService.checkDue.connection · packages/backend/src/services/integrations/AwsConnectionService.ts:574
  • ➕ span name AwsConnectionService.delete · packages/backend/src/services/integrations/AwsConnectionService.ts:624
  • ➕ span name AwsApi.checkRole · packages/backend/src/services/integrations/aws/api-impl.ts:90
  • ➕ span name renderAwsSetup · packages/backend/src/services/integrations/aws/setup.ts:173
Observability coverage: 3 of 3 changes observable
Change Kind Observable Evidence
AwsConnectionService (create/status/setup/check/delete/sweep) service yes Every operation is Effect.fn("AwsConnectionService.*") and annotates orgId (AwsConnectionService.ts:344, :361, :490)
AWS STS AssumeRole + IAM reads outbound call yes checkRole is Effect.fn("AwsApi.checkRole") with timeouts (api-impl.ts:90)
hourly aws_connections lane background work yes New alerting.aws_connections_tick lane registered in apps/alerting/src/scheduled.ts

d0b04d2 · Updated on every push. Reply "won't fix" to dismiss a finding, or mention @maple-review-bot to ask about one.

@maple-review-bot maple-review-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

2 inline notes from Maple's review. The score and summary are in the review comment above.

Comment thread apps/api/src/routes/v2/integrations-aws.http.test.ts Outdated
Comment thread apps/api/src/routes/v2/integrations-aws.http.test.ts
Same one-line fix as #1698: main's #1675 and #1685 crossed, so these cases
called completeConnect without the initiator #1675 made required.
@maple-review-bot

maple-review-bot Bot commented Oct 22, 2026 •

Copy link
Copy Markdown

Maple review

🟢 Confidence 10/10 · safe to merge
Both open test gaps are now exercised against a real second org and the check route; only the two files changed since d0b04d2 were re-read here.
no findings · tests covered · risk medium

Adds an AWS account connection flow (IAM role, setup stack, hourly re-check, Sources UI). The new test mints a real second org's key and requests POST .../check, closing both open test gaps; it does not touch the alerting warehouse, PlanetScale or PR-review errors.

  • integrations-aws.http.test.ts now mints an outsider key for org_aws_e2e_other and asserts 404 on setup, check, PATCH and DELETE
  • A member is asserted 403 on POST /v2/integrations/aws/connections/{id}/check
  • GithubConnectService.test.ts admin-case passes the INITIATOR to completeConnect

Before merge

Fixed since the last review

  • ✅ F10 · The "only for their own org's connections" test never creates a second org
  • ✅ F11 · POST /v2/integrations/aws/connections/{id}/check and its requireAdmin gate are never requested

Production impact

Open errors in the changed files
Issue Service Occurrences File
@maple/http/errors/WarehouseUpstreamError alerting 80k apps/alerting/src/scheduled.ts
@maple/http/errors/WarehouseUpstreamError alerting 20k apps/alerting/src/scheduled.ts
@maple/http/errors/ErrorPersistenceError alerting 2.6k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 2.6k apps/alerting/src/scheduled.ts
@maple/backend/services/pr-review/PrReviewTelemetryReadError alerting 2.0k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.7k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.7k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.7k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.7k apps/alerting/src/scheduled.ts
@maple/backend/integrations/PlanetScaleForbiddenError alerting 1.6k apps/alerting/src/scheduled.ts

After this merges, Maple checks whether they stop.

Production traffic of the changed files (last 7 days)
File Calls/day Busiest operations
packages/backend/src/services/integrations/aws/setup.ts 56k maple 56k/day, 82.6% err
packages/backend/src/services/integrations/AwsConnectionService.ts 7 AwsConnectionService.checkDue 7/day, 0.0% err
Telemetry this change adds and removes (10)
  • ➕ span name AwsConnectionService.status · packages/backend/src/services/integrations/AwsConnectionService.ts:344
  • ➕ span name AwsConnectionService.create · packages/backend/src/services/integrations/AwsConnectionService.ts:361
  • ➕ span name AwsConnectionService.update · packages/backend/src/services/integrations/AwsConnectionService.ts:412
  • ➕ span name AwsConnectionService.setup · packages/backend/src/services/integrations/AwsConnectionService.ts:434
  • ➕ span name AwsConnectionService.check · packages/backend/src/services/integrations/AwsConnectionService.ts:490
  • ➕ span name AwsConnectionService.sweepBatch · packages/backend/src/services/integrations/AwsConnectionService.ts:509
  • ➕ span name AwsConnectionService.checkDue.connection · packages/backend/src/services/integrations/AwsConnectionService.ts:574
  • ➕ span name AwsConnectionService.delete · packages/backend/src/services/integrations/AwsConnectionService.ts:624
  • ➕ span name AwsApi.checkRole · packages/backend/src/services/integrations/aws/api-impl.ts:90
  • ➕ span name renderAwsSetup · packages/backend/src/services/integrations/aws/setup.ts:173
What was checked
  • The check 403 comes from requireAdmin at integrations-aws.http.ts:108, not from tenancy
  • The outsider key is created against OTHER_ORG (integrations-aws.http.test.ts:248), so the 404s are cross-org
  • Repo-wide AWS presence is read only through the tenant in each handler (integrations-aws.http.ts:48-128)

4ee8570 · Updated on every push. Reply "won't fix" to dismiss a finding, or mention @maple-review-bot to ask about one.

@Makisuo
Makisuo merged commit 4bfa8af into main Oct 22, 2026
34 checks passed
@maple-review-bot

Copy link
Copy Markdown

Merged with 4 steps from "Before merge" still open. If they are done, tick them on the review comment; if not, now is the time.

  • Env var · Set MAPLE_AWS_PRINCIPAL_ARN, MAPLE_AWS_ACCESS_KEY_ID and MAPLE_AWS_SECRET_ACCESS_KEY on api and alerting
  • Manual · The aws_connections migration applies in the alchemy deploy
  • Migration · Check it is safe on production data and with the code still deployed
  • Migration · Check it is safe on production data and with the code still deployed

@Makisuo
Makisuo deleted the feat/aws-connection branch October 22, 2026 17:38
@maple-review-bot

Copy link
Copy Markdown

Maple: after this shipped

✅ Shipped clean. Nothing this change touches got worse in the hour after it deployed.

Deployed to alerting (production) at 2026-10-22 18:38 UTC as 0e61fa0, the first version after the merge (the merge commit itself never reported). Compared the 60 minutes before and after.

Errors in the changed files:

  • ➖ @maple/http/errors/WarehouseUpstreamError: 0/h → 0/h
  • ➖ @maple/http/errors/WarehouseUpstreamError: 0/h → 0/h
  • ➖ @maple/http/errors/ErrorPersistenceError: 0/h → 0/h
  • 🔁 @maple/backend/integrations/PlanetScaleForbiddenError: 39/h → 33/h, still occurring
  • ➖ @maple/backend/services/pr-review/PrReviewTelemetryReadError: 0/h → 0/h
  • 🔁 @maple/backend/integrations/PlanetScaleForbiddenError: 26/h → 22/h, still occurring
  • 🔁 @maple/backend/integrations/PlanetScaleForbiddenError: 26/h → 22/h, still occurring
  • 🔁 @maple/backend/integrations/PlanetScaleForbiddenError: 26/h → 22/h, still occurring
  • 🔁 @maple/backend/integrations/PlanetScaleForbiddenError: 26/h → 22/h, still occurring
  • ➖ @maple/backend/integrations/PlanetScaleForbiddenError: 0/h → 0/h
Operation Calls/h Errors p95
maple 2.7k → 2.7k 80.2% → 82.2% 984 → 1372 ms
AwsConnectionService.checkDue 0 → 0 0.0% → 0.0% 0 → 0 ms

Maple looks once, an hour after the first deploy that carries the merge.

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