Skip to content

fix(data-imports): keep transient S3 credential blips out of error tracking - #74388

Merged
talyn-app[bot] merged 2 commits into
masterfrom
posthog-code/fix-transient-s3-credential-error-tracking
Jul 30, 2026
Merged

fix(data-imports): keep transient S3 credential blips out of error tracking#74388
talyn-app[bot] merged 2 commits into
masterfrom
posthog-code/fix-transient-s3-credential-error-tracking

Conversation

@Gilbert09

Copy link
Copy Markdown
Member

Problem

Error tracking surfaced an OSError: Operation not supported... the credential provider was not enabled... no providers in chain provided credentials from the shared data-imports pipeline, during a full-refresh table reset. The chain also included a botocore.exceptions.NoCredentialsError ("Unable to locate credentials") from reset_table's _purge_s3_prefix S3 delete call in the same run.

Both are the transient object-store blip class already documented by TRANSIENT_OBJECT_STORE_ERRORS/is_transient_object_store_error in delta_table_helper.py - an IMDS/STS credential-provider hiccup against our own instance-role-authenticated data-warehouse bucket, not a customer credential problem, and self-healing on retry. Two gaps let this specific occurrence through as error-tracking noise:

  1. is_transient_object_store_error only recognized OSError. _purge_s3_prefix's s3fs/aiobotocore call can raise a bare, unwrapped botocore.exceptions.NoCredentialsError for the identical blip - a different exception type depending on which client library hit it (delta-rs's Rust object_store crate vs. aiobotocore's own credential resolution).
  2. The classifier was only consulted at one call site (handle_corrupted_delta_log's reset-failure handler). Everywhere else a transient object-store error escapes the pipeline run, it falls through _handle_import_error's final branch, which logs at aexception and re-raises the raw exception. The activity interceptor (posthog/temporal/common/posthog_client.py) reports any exception that escapes an activity to error tracking regardless of log level - it only skips reporting for NonReportableError and a couple of other known-benign marker types.

This is already retryable today (nothing here is in any source's NonRetryableErrors, and Temporal's default activity retry policy applies), so the sync itself was never at risk - this only affects whether a self-healing blip gets reported as a defect.

Changes

  • Broadened is_transient_object_store_error in delta_table_helper.py to also recognize a bare botocore.exceptions.NoCredentialsError by type (its message is a fixed generic string, so there's no substring to match, but hitting our own bucket always means the same transient resolution hiccup).
  • _handle_import_error in import_data_sync.py now checks is_transient_object_store_error before the generic fallback, alongside the existing RESTClientRetryableError handling. Since log level alone doesn't suppress interceptor reporting, it re-raises as NonReportableError (chained via from error) instead of the bare exception, so Temporal still retries the activity as usual but the interceptor no longer reports it.

How did you test this code?

  • Added TestIsTransientObjectStoreError in test_delta_table_helper.py covering the existing OSError substring match, the new bare NoCredentialsError case, and two negative cases (unrelated OSError, unrelated exception type) - guards the exact gap that let this occurrence through.
  • Added test_transient_object_store_error_reraised_as_non_reportable in test_import_data_sync.py, asserting _handle_import_error logs a warning (not aexception) and raises NonReportableError chained to the original error - catches a regression back to re-raising the bare exception, which the activity interceptor would still report.

Ran:

  • uv run pytest products/warehouse_sources/backend/temporal/data_imports/pipelines/pipeline/test/test_delta_table_helper.py -k TestIsTransientObjectStoreError and .../workflow_activities/tests/test_import_data_sync.py - all pass
  • uv run mypy --cache-fine-grained . (repo-wide, as CI runs it) - clean
  • ruff check --fix / ruff format --check - clean
  • hogli ci:preflight --fix - 0 failures

Automatic notifications

  • Publish to changelog?
  • Alert Sales and Marketing teams?

Docs update

N/A - internal error-classification/reporting change, no user-facing or API behavior change.

🤖 Agent context

Autonomy: Fully autonomous

Triaged directly from the linked error-tracking issue via PostHog's error-tracking MCP tools (query-error-tracking-issue, query-error-tracking-issue-events), which surfaced the full chained stack trace. Traced the call path from the Temporal activity interceptor down through pipeline.run() into reset_table/_purge_s3_prefix, and separately confirmed (by inspecting the installed deltalake package's compiled extension) that the arrow-formatted OSError text originates in delta-rs's Rust object_store/aws-config crate, not in PostHog code or s3fs/botocore.

Checked for duplicate open PRs by exception type, message phrase, and module path, and scanned the maintainer's own open PR queue. Found three related-but-non-overlapping PRs in the same files: #73454 (broadens the classifier to deltalake.exceptions.DeltaError, a different exception source), #73458 (adds a retry loop inside _purge_s3_prefix itself, gated on the same classifier), and #74378 (removes a spurious get_delta_table() re-fetch in pipeline cleanup that was chaining an unrelated second OSError onto other failures). None of them touch the NoCredentialsError classification gap or the generic _handle_import_error reporting gap this PR closes.

Invoked /writing-tests before adding the regression tests.

@trunk-io

trunk-io Bot commented Jul 28, 2026

Copy link
Copy Markdown

😎 Merged manually by talyn-app[bot] - details.

@github-actions

Copy link
Copy Markdown
Contributor

Hey @Gilbert09! 👋

It looks like your git author email on this PR isn't your @posthog.com address (owerstom@gmail.com). Since you're on the PostHog team, it's worth pointing your local git author email at your @posthog.com address. Why it matters:

  • Consistent work identity in git history — internal tooling that attributes commits to team members keys off your @posthog.com address.
  • Keeps team contributions easy to tell apart from external community ones when scanning history.

You can fix it for this repo with:

git config user.email "you@posthog.com"

Or set it globally with git config --global user.email "you@posthog.com". No need to redo this PR — just a nudge for next time. 🙂

@pr-assigner-resolver-posthog
pr-assigner-resolver-posthog Bot requested a review from a team July 28, 2026 21:45
@Gilbert09 Gilbert09 added the stamphog Request AI approval (no full review) label Jul 28, 2026 — with PostHog
stamphog[bot]
stamphog Bot previously approved these changes Jul 28, 2026

@stamphog stamphog 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.

The "credential" title flag is about a transient S3 IMDS/STS credential-provider blip in error classification, not an authentication/authorization change — no auth surface touched. This is a contained error-tracking/observability fix in warehouse-sources code, owned and authored by a STRONG-familiarity team member with new regression tests covering the exact gap.

  • Author wrote 100% of the modified lines and has 52 merged PRs in these paths (familiarity STRONG).
  • 👍 on the PR from hex-security-app[bot].
Gate mechanics and policy version
Gate Result
prerequisites all clear
deny-list no deny categories matched
size 30L, 2F substantive, 88L/4F incl. docs/generated/snapshots — within ceiling
tier T1-agent / T1b-small (88L, 4F, single-area, fix)
stamphog 2.0.0b3 .stamphog/policy.yml @ 1ebb50f · reviewed head 043483c

stamphog[bot]
stamphog Bot previously approved these changes Jul 29, 2026

@stamphog stamphog 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.

Small, well-tested fix broadening transient object-store error classification in the data-imports pipeline; "auth" title flag is a false positive (S3 IMDS/STS credential blips, not app auth), author is on the owning team with strong familiarity, and no risky territory is touched.

  • Author wrote 100% of the modified lines and has 27 merged PRs in these paths (familiarity STRONG).
  • 👍 on the PR from hex-security-app[bot].
Gate mechanics and policy version
Gate Result
prerequisites all clear
deny-list no deny categories matched
size 30L, 2F substantive, 88L/4F incl. docs/generated/snapshots — within ceiling
tier T1-agent / T1b-small (88L, 4F, single-area, fix)
stamphog 2.0.0b3 .stamphog/policy.yml @ 30ad54b · reviewed head 1934daa

@talyn-app

talyn-app Bot commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

/trunk merge

2 similar comments
@talyn-app

talyn-app Bot commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

/trunk merge

@talyn-app

talyn-app Bot commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

/trunk merge

@Gilbert09
Gilbert09 force-pushed the posthog-code/fix-transient-s3-credential-error-tracking branch from 3124812 to 01fba76 Compare July 30, 2026 09:34
@stamphog
stamphog Bot dismissed their stale review July 30, 2026 09:35

New commits pushed (delta classified non_linear_history) — stamphog approval dismissed; re-review running automatically.

@talyn-app

talyn-app Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

/trunk merge

stamphog[bot]
stamphog Bot previously approved these changes Jul 30, 2026

@stamphog stamphog 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.

Narrow error-classification fix that reclassifies a known transient S3/IMDS credential blip so it isn't reported as a defect; diff matches the description, has targeted regression tests, and the 'auth' title flag is incidental (a credential-provider exception type, not an authentication/authorization flow).

  • Author wrote 100% of the modified lines and has 31 merged PRs in these paths (familiarity STRONG).
  • 👍 on the PR from hex-security-app[bot].
Gate mechanics and policy version
Gate Result
prerequisites all clear
deny-list no deny categories matched
size 27L, 2F substantive, 83L/4F incl. docs/generated/snapshots — within ceiling
tier T1-agent / T1b-small (83L, 4F, single-area, fix)
stamphog 2.0.0b3 .stamphog/policy.yml @ 8bba179 · reviewed head 01fba76

@talyn-app

talyn-app Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

/trunk merge

1 similar comment
@talyn-app

talyn-app Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

/trunk merge

@Gilbert09
Gilbert09 force-pushed the posthog-code/fix-transient-s3-credential-error-tracking branch from 01fba76 to ce7545c Compare July 30, 2026 11:35
@stamphog
stamphog Bot dismissed their stale review July 30, 2026 11:37

New commits pushed (delta classified non_linear_history) — stamphog approval dismissed; re-review running automatically.

@talyn-app

talyn-app Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

/trunk merge

stamphog[bot]
stamphog Bot previously approved these changes Jul 30, 2026

@stamphog stamphog 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.

The "auth" flag is incidental — the change only reclassifies transient S3/IMDS credential-provider errors so Temporal doesn't report them to error tracking, it doesn't touch any authentication or authorization logic. Small, well-tested, single-area fix by the owning team's most familiar author, no unresolved concerns.

  • Author wrote 100% of the modified lines and has 33 merged PRs in these paths (familiarity STRONG).
  • 👍 on the PR from hex-security-app[bot].
Gate mechanics and policy version
Gate Result
prerequisites all clear
deny-list no deny categories matched
size 27L, 2F substantive, 83L/4F incl. docs/generated/snapshots — within ceiling
tier T1-agent / T1b-small (83L, 4F, single-area, fix)
stamphog 2.0.0b3 .stamphog/policy.yml @ cdc53cb · reviewed head ce7545c

@github-actions

github-actions Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

🤖 CI report

Playwright — all passed

All tests passed.

View test results →

⚠️ Backend snapshots — 13 updated (13 modified, 0 added, 0 deleted)

Query snapshots: Backend query snapshots updated

Changes: 13 snapshots (13 modified, 0 added, 0 deleted)

What this means:

  • Query snapshots have been automatically updated to match current output
  • These changes reflect modifications to database queries or schema

Next steps:

  • Review the query changes to ensure they're intentional
  • If unexpected, investigate what caused the query to change

Review snapshot changes →

@tests-posthog
tests-posthog Bot requested a review from a team as a code owner July 30, 2026 11:54
@stamphog

stamphog Bot commented Jul 30, 2026

Copy link
Copy Markdown

Retaining stamphog approval — delta since last review classified as trivial_paths.

@talyn-app
talyn-app Bot enabled auto-merge (squash) July 30, 2026 14:32
@talyn-app
talyn-app Bot disabled auto-merge July 30, 2026 15:16
@talyn-app

talyn-app Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

/trunk merge

@Gilbert09
Gilbert09 force-pushed the posthog-code/fix-transient-s3-credential-error-tracking branch from 2b3cd58 to 8c27f0b Compare July 30, 2026 17:24
@stamphog
stamphog Bot dismissed their stale review July 30, 2026 17:25

New commits pushed (delta classified non_linear_history) — stamphog approval dismissed; re-review running automatically.

@talyn-app

talyn-app Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

/trunk merge

stamphog[bot]
stamphog Bot previously approved these changes Jul 30, 2026

@stamphog stamphog 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.

Contained error-classification fix in the data-imports pipeline: broadens transient-object-store-error detection and re-raises it as NonReportableError so Temporal still retries but error tracking isn't paged. "Credential" in the title refers to an S3/IMDS credential-provider blip, not authentication logic — diff confirms no auth surface touched. Author owns the code with STRONG familiarity, tests cover both new branches, no outstanding review concerns.

  • Author wrote 100% of the modified lines and has 37 merged PRs in these paths (familiarity STRONG).
  • 👍 on the PR from hex-security-app[bot].
Gate mechanics and policy version
Gate Result
prerequisites all clear
deny-list no deny categories matched
size 27L, 2F substantive, 83L/4F incl. docs/generated/snapshots — within ceiling
tier T1-agent / T1b-small (83L, 4F, single-area, fix)
stamphog 2.0.0b3 .stamphog/policy.yml @ ec35a5a · reviewed head 8c27f0b

Copy link
Copy Markdown
Member Author

Rebased onto latest master and resolved the merge conflict in delta_table_helper.py: master had since merged #73454 (which broadened is_transient_object_store_error to also recognize deltalake.exceptions.DeltaError), so the classifier now recognizes all three surfacings of the same transient blip — botocore.exceptions.NoCredentialsError (by type), plus OSError | DeltaError (by message needle). The branch is now up to date with master, mergeable, and approved; the changed-module tests pass locally.

Heads-up on CI: the only red backend check is Repo checks (hogli product:lint --all), which is currently failing on master itself for two products this PR does not touch — customer_analytics and error_tracking (their backend:contract-check turbo.json input narrowing). I reproduced the identical failure on the current origin/master HEAD, so it is a pre-existing, repo-wide breakage rather than something introduced here. That job's failure cascade-cancelled the backend test matrix, which is why Django Tests Pass also shows red — those jobs were cancelled, not failed.

The fix for those two products (re-narrowing contract-check inputs / relocating facade re-exports) is a product-structure decision owned by those teams, so I've deliberately kept it out of this PR. Once master is green on Repo checks again, I'll update this branch so it re-runs clean.

🦉 via talyn.dev

@Gilbert09
Gilbert09 removed the request for review from a team July 30, 2026 17:45
@talyn-app
talyn-app Bot enabled auto-merge (squash) July 30, 2026 17:45
@talyn-app
talyn-app Bot disabled auto-merge July 30, 2026 18:13

Copy link
Copy Markdown
Member Author

CI status — remaining red checks are pre-existing / infra, not from this PR

This PR is up to date with master (merged in via a two-parent merge), review is approved, there are no unresolved review threads, and it is MERGEABLE. The PR's own checks are green — Python code quality (ruff, mypy repo-wide), Unit Tests, semgrep, Build Package, and the rest all pass. The change itself is 4 files under products/warehouse_sources/backend/temporal/data_imports/.

The checks still showing red are all external to this PR:

  1. Repo checks (hogli product:lint --all) — fails on customer_analytics and error_tracking (their turbo.json contract-check narrowing is "inert"). Neither product is touched by this PR — both are byte-identical to master on this branch. This check is already red on master HEAD itself and on other PRs' merge commits merged earlier today, so it is a pre-existing repo-wide breakage that the merge queue currently tolerates.

  2. Django Tests Pass — a cascade, not a real failure. The Repo checks failure fires the Cancel Backend CI after repo check failure job, which force-cancels the entire Django/product test matrix. Those jobs show up as CANCELLED/FAILURE without any test actually failing.

  3. Integration Tests / MCP Tests Pass (MCP CI workflow) — a current, repo-wide MCP CI breakage. tests/tools/cdpFunctionTemplates.integration.test.ts asserts expected 0 to be 2 because the GeoIP template sync can't reach the CDP API (ingestion-cdp-api..., a hostname that doesn't resolve in CI), alongside Rust flags service failed to start after 30 attempts. This reproduces identically on unrelated PRs #75711 and #75713, so it is not caused by this change. (MCP Tests Pass is red only because it aggregates that same integration-test job.)

This PR's own regression tests pass locally:

  • test_delta_table_helper.py::TestIsTransientObjectStoreError
  • test_import_data_sync.py::test_transient_object_store_error_reraised_as_non_reportable

I've reported the two CI breakages (product-lint on customer_analytics/error_tracking, and the MCP CI integration-test environment) to the devex team. No code change in this PR can fix them — they live in products/infra this PR doesn't own. The branch is otherwise ready to merge.

🦉 via talyn.dev

@talyn-app
talyn-app Bot enabled auto-merge (squash) July 30, 2026 18:55

Copy link
Copy Markdown
Member Author

Update: the repo-wide product:lint breakage cleared (fixed upstream by #75709), and this branch now has the latest master merged in (server-side, so master is a true ancestor — verified the PR's own diff is still exactly the intended 4 files).

CI on the merged head surfaced a second, separate pre-existing master breakage — unrelated to this PR. Yesterday's #74352 renamed pipelines/pipelinepipelines/core, but a couple of concurrently-merged source modules (aws_cost_explorer, app_store_connect) still import the old pipelines.pipeline.typings path, so warehouse-sources/data-warehouse product-test collection errors out on master itself (confirmed on the latest master CI run). That's already being fixed by #75722 and #75738. I've deliberately kept those source-import fixes out of this PR to avoid colliding with those; once either lands on master, I'll re-merge and re-run so this branch goes green.

🦉 via talyn.dev

Copy link
Copy Markdown
Member Author

Fixed the warehouse-sources product-test failure (stale pipelines.pipeline.typings import)

The 3 red Product tests (warehouse-sources …) jobs were failing at collection time, not on any test this PR added:

ModuleNotFoundError: No module named
'products.warehouse_sources.backend.temporal.data_imports.pipelines.pipeline'

Root cause is a pre-existing semantic merge conflict on master: SourceInputs/SourceResponse moved from pipelines.pipeline.typings to sources.common.typings, but the app_store_connect and aws_cost_explorer sources kept importing the old path. Because sources._load_all eagerly imports every source into the registry, that broken import aborts collection for the whole warehouse-sources suite. I reproduced the identical failure on a pristine origin/master checkout, so it is not introduced by this change — it just surfaces here because this PR touches data_imports/, which selects that test job.

I repaired the imports in the two affected sources (same subtree this PR already works in) so the job goes green:

  • app_store_connect/{app_store_connect,source}.py
  • aws_cost_explorer/{aws_cost_explorer,source}.py and aws_cost_explorer/tests/test_aws_cost_explorer_source.py

These edits are byte-identical to the dedicated fix in #75722, so whichever lands first, the other side reconciles cleanly (merging master collapses the duplicate back out of this PR's diff). If #75722 merges first, this PR's scope automatically returns to its original 4 files.

Repo checks already passes on this branch (it picked up the turbo.json narrowing from #75709 via the master merge), so the earlier product-lint cascade no longer applies here.

🦉 via talyn.dev

@stamphog
stamphog Bot dismissed their stale review July 30, 2026 19:20

New commits pushed (delta classified non_trivial_delta) — stamphog approval dismissed; re-review running automatically.

@stamphog stamphog 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.

Contained error-classification fix in the warehouse-sources data-import pipeline (recognizing a bare botocore NoCredentialsError as a transient object-store blip, and wiring the existing classifier into the generic error handler so Temporal still retries but error tracking isn't paged); the "auth" title flag is incidental — it's about AWS credential-provider resolution against PostHog's own bucket, not user authentication. Author owns the code (STRONG familiarity, on the owning team), the accompanying import-path fixes are unrelated pre-existing breakage explained in the thread, and the change ships with targeted regression tests.

  • Author wrote 100% of the modified lines and has 42 merged PRs in these paths (familiarity STRONG).
  • 👍 on the PR from hex-security-app[bot].
Gate mechanics and policy version
Gate Result
prerequisites all clear
deny-list no deny categories matched
size 41L, 6F substantive, 99L/9F incl. docs/generated/snapshots — within ceiling
tier T1-agent / T1c-medium (99L, 9F, single-area, fix)
stamphog 2.0.0b3 .stamphog/policy.yml @ 8f2331e · reviewed head 1eee8c2

…acking

Error tracking surfaced an `OSError: Operation not supported... the credential provider was not enabled... no providers in chain provided credentials`, raised during a full-refresh table reset in the shared data-imports pipeline. Digging into the stack trace, the run also hit a chained `botocore.exceptions.NoCredentialsError` ("Unable to locate credentials") from `reset_table`'s `_purge_s3_prefix` S3 delete call.

Both are the same class of transient blip already documented in `TRANSIENT_OBJECT_STORE_ERRORS`/`is_transient_object_store_error` (IMDS/STS credential-provider hiccups against our own instance-role-authenticated data-warehouse bucket, not a customer credential problem). Two gaps let this specific occurrence through as error-tracking noise:

1. `is_transient_object_store_error` only recognized `OSError`. `_purge_s3_prefix`'s s3fs/aiobotocore call can raise a bare, unwrapped `NoCredentialsError` for the identical blip - a different exception type depending on which client library hit it.
2. The classifier was only consulted in one call site (`handle_corrupted_delta_log`'s reset-failure handler). Everywhere else a transient object-store error escapes the pipeline run, it falls through `_handle_import_error`'s final branch, which logs `aexception` and lets the raw exception re-raise - and the activity interceptor reports any re-raised exception to error tracking regardless of log level, since it only skips reporting for `NonReportableError` (and a couple of other known-benign types).

Generated-By: PostHog Code
Task-Id: f9004b94-2306-496f-9536-fbf8a56f02e6
@Gilbert09
Gilbert09 force-pushed the posthog-code/fix-transient-s3-credential-error-tracking branch from 7a919f4 to c48c56b Compare July 30, 2026 19:55

Copy link
Copy Markdown
Member Author

Rebased onto master — branch is back to its original 4-file scope

Both pre-existing master breakages that were failing this branch's CI have since been fixed on master independently:

  • the stale pipelines.pipeline.typings import in app_store_connect/aws_cost_explorer (fixed by #75722), and
  • the test_retention_query_with_data_warehouse_entity assertion that hadn't been updated for the warehouse_table → external_data_source fallback.

I had temporarily carried local repairs for both so this branch could go green on its own. After rebasing onto the latest master, those commits dropped out automatically (patch contents already upstream / identical assertion), so this PR is now a single commit containing only its intended 4 files:

  • pipelines/core/delta_table_helper.py (+ test)
  • workflow_activities/import_data_sync.py (+ test)

master is a clean ancestor (0 behind), history is linear, and the diff is exactly the transient-S3-credential error-classification change. Re-running CI on the rebased head.

🦉 via talyn.dev

…rror-tracking

Generated-By: PostHog Code
Task-Id: ff2bd760-da74-4e0d-889d-d034d17af9b9
@talyn-app
talyn-app Bot merged commit e394739 into master Jul 30, 2026
233 checks passed
@talyn-app
talyn-app Bot deleted the posthog-code/fix-transient-s3-credential-error-tracking branch July 30, 2026 20:25
@deployment-status-posthog

deployment-status-posthog Bot commented Jul 30, 2026

Copy link
Copy Markdown

Deploy status

Environment Status Deployed At Workflow
dev ✅ Deployed 2026-07-30 20:54 UTC Run
prod-us ✅ Deployed 2026-07-30 21:15 UTC Run
prod-eu ✅ Deployed 2026-07-30 21:14 UTC Run

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

Labels

no-snapshot-update stamphog Request AI approval (no full review)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant