Skip to content

feat(flags): hypercache flag provider#50737

Merged
matheus-vb merged 23 commits intomasterfrom
matheus-vb/hypercache-flag-provider
Mar 17, 2026
Merged

feat(flags): hypercache flag provider#50737
matheus-vb merged 23 commits intomasterfrom
matheus-vb/hypercache-flag-provider

Conversation

@matheus-vb
Copy link
Member

@matheus-vb matheus-vb commented Mar 11, 2026

Problem

Every Django process (web workers, Celery workers, Temporal workers) independently polls the /api/feature_flag/local_evaluation/ endpoint every 90 seconds to fetch feature flag definitions. Multiplied across all workers, this creates significant unnecessary load on team 2 (PostHog's own project). The monolith already has a HyperCache infrastructure that maintains flag definitions in Redis (updated via Django signals on flag changes + periodic refresh tasks), but the SDK's module-level API doesn't use it.

Solution

Create a read-only HyperCacheFlagProvider that implements the SDK's FlagDefinitionCacheProvider protocol, reading flag definitions directly from the existing HyperCache instead of polling the API. The provider:

  • Returns False from should_fetch_flag_definitions() so the SDK never polls the API
  • Reads from flag_definitions_hypercache.get_from_cache(team_id) on each evaluation cycle
  • Falls back gracefully — if the cache is empty and no flags are loaded yet, the SDK's emergency fallback logic fetches from the API using personal_api_key

Changes

posthog/feature_flags/sdk_cache_provider.py (new)

  • HyperCacheFlagProvider class implementing FlagDefinitionCacheProvider
  • Lazy-imports flag_definitions_hypercache to avoid circular imports
  • All errors caught and logged — returns None to let the SDK handle fallback

posthog/apps.py

  • Configures posthoganalytics.flag_definition_cache_provider with HyperCacheFlagProvider before load_feature_flags()
  • Team ID defaults to 2, configurable via POSTHOG_SELF_TEAM_ID env var
  • Only set when posthoganalytics is not disabled (skipped in tests, local dev, OPT_OUT_CAPTURE)

posthog/feature_flags/test_sdk_cache_provider.py (new)

  • 8 unit tests covering cache hit, cache miss, exception handling, missing keys, protocol compliance, and no-op methods

SDK dependency (separate PR, merge first)

posthog/__init__.py in posthog-python

  • Added flag_definition_cache_provider module-level variable
  • Passed through setup() to the Client constructor

How did you test this code?

  • All 8 HyperCacheFlagProvider unit tests pass
  • ruff check and ruff format clean
  • Verified FlagDefinitionCacheProvider protocol compliance at runtime

Note

PostHog/posthog-python#462 should be merged before this one.

Publish to changelog?

No

Copy link
Contributor

@haacked haacked left a comment

Choose a reason for hiding this comment

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

Excited for this. Curious why this is a separate PR from PostHog/posthog-python#462 which is effectively a two-line change. Why not combine them?

Update: Dumb question. Different repos

@haacked
Copy link
Contributor

haacked commented Mar 11, 2026

After we merge PostHog/posthog-python#462, we'll need to edit pyproject.toml to bump posthoganalytics==7.9.0 to the new version.

@haacked
Copy link
Contributor

haacked commented Mar 11, 2026

One more question:

Every Django process (web workers, Celery workers, Temporal workers) independently polls

Do we need every single one of those to do that? Perhaps that's an audit for a follow-up.

@matheus-vb matheus-vb marked this pull request as ready for review March 12, 2026 00:07
@greptile-apps
Copy link
Contributor

greptile-apps bot commented Mar 12, 2026

Prompt To Fix All With AI
This is a comment left during a code review.
Path: posthog/feature_flags/sdk_cache_provider.py
Line: 51

Comment:
**Module-level `assert` is unreliable and redundant**

`assert` statements are silently stripped when Python runs with the `-O` (optimize) flag, so this protocol compliance check provides no guarantee in production. Additionally, it duplicates the `test_implements_protocol` test case, violating the OnceAndOnlyOnce principle and "no superfluous parts" rule.

Remove this and rely solely on the test — or if a hard import-time guard is wanted, use an explicit `raise` instead:

```suggestion
# Protocol compliance is verified in tests (TestHyperCacheFlagProvider.test_implements_protocol)
```

Or, if a runtime guard is genuinely needed:
```python
if not isinstance(HyperCacheFlagProvider(team_id=0), FlagDefinitionCacheProvider):
    raise TypeError("HyperCacheFlagProvider does not implement FlagDefinitionCacheProvider protocol")
```

How can I resolve this? If you propose a fix, please make it concise.

---

This is a comment left during a code review.
Path: posthog/feature_flags/test_sdk_cache_provider.py
Line: 22-63

Comment:
**Tests not parameterised (repo guidelines)**

The four `get_flag_definitions` test variants (`cache_hit`, `cache_miss`, `exception_returns_none`, `handles_missing_keys`) all share the same structure: patch the hypercache, call `get_flag_definitions()`, assert the result. The repository guidelines say "we always prefer parameterised tests."

These can be consolidated into a single `@pytest.mark.parametrize` test:

```python
import pytest

@pytest.mark.parametrize(
    "cache_return, side_effect, expected_flags, expected_group_mapping, expected_cohorts",
    [
        (
            {"flags": [{"key": "test-flag", "active": True}], "group_type_mapping": {"0": "company"}, "cohorts": {"1": {"properties": []}}},
            None,
            [{"key": "test-flag", "active": True}],
            {"0": "company"},
            {"1": {"properties": []}},
        ),
        (None, None, None, None, None),  # cache miss
        ({"flags": [{"key": "flag-1"}]}, None, [{"key": "flag-1"}], {}, {}),  # missing keys default
        (None, Exception("Redis connection failed"), None, None, None),  # exception
    ],
)
@patch("posthog.models.feature_flag.local_evaluation.flag_definitions_hypercache")
def test_get_flag_definitions(self, mock_hypercache, cache_return, side_effect, expected_flags, ...):
    ...
```

How can I resolve this? If you propose a fix, please make it concise.

---

This is a comment left during a code review.
Path: posthog/apps.py
Line: 72-78

Comment:
**Missing comment on `personal_api_key` fallback behaviour**

This code path changes how `personal_api_key` is used: it is no longer polled at startup but is now only the emergency fallback if `HyperCacheFlagProvider.get_flag_definitions()` returns `None`. In the E2E testing branch, `personal_api_key` is explicitly set to `None`, meaning both the HyperCache read _and_ the emergency fallback will silently produce no flags. An inline comment explaining this relationship (and what happens when `personal_api_key` is `None` and the cache is cold) would help future readers.

```suggestion
        # Use HyperCache to provide flag definitions instead of per-process API polling.
        # Falls back to the SDK's emergency API fetch (via personal_api_key) only when
        # the cache is cold. Note: in E2E testing personal_api_key is None, so a cold
        # cache will result in no flag definitions being loaded — which is acceptable there.
        from posthog.feature_flags.sdk_cache_provider import HyperCacheFlagProvider

        posthoganalytics.flag_definition_cache_provider = HyperCacheFlagProvider(
            team_id=int(os.environ.get("POSTHOG_SELF_TEAM_ID", "2"))
        )
```

**Rule Used:** Add inline comments to clarify the purpose of sign... ([source](https://app.greptile.com/review/custom-context?memory=4d5b48c5-045d-4693-9cd9-4081bb19508b))

**Learnt From**
[PostHog/posthog#32083](https://github.com/PostHog/posthog/pull/32083)

How can I resolve this? If you propose a fix, please make it concise.

Last reviewed commit: 702909d

@matheus-vb
Copy link
Member Author

@haacked With this PR the polling is already eliminated, every process reads from Redis instead. But I guess auditing whether all process types actually need flag definitions is a good follow-up, agreed

@github-actions
Copy link
Contributor

github-actions bot commented Mar 12, 2026

❌ Hobby deploy smoke test: FAILED

Failing fast because: Timed out after 45 minutes

Connection errors: 144
HTTP 502 count: 28
Last error: ConnectionError


Run 23200565619 | Consecutive failures: 1

Copy link
Contributor

@haacked haacked left a comment

Choose a reason for hiding this comment

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

Excited to see us stop slamming ourselves!

@tests-posthog
Copy link
Contributor

tests-posthog bot commented Mar 16, 2026

Visual regression: Playwright E2E E2E screenshots updated

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

What this means:

  • Snapshots have been automatically updated to match current rendering
  • Next CI run will switch to CHECK mode to verify stability
  • If snapshots change again, CHECK mode will fail (indicates flapping)

Next steps:

  • Review the changes to ensure they're intentional
  • Approve if changes match your expectations
  • If unexpected, investigate component rendering

Review snapshot changes →

@matheus-vb matheus-vb force-pushed the matheus-vb/hypercache-flag-provider branch from 9b17583 to eb4578f Compare March 16, 2026 20:14
@github-actions
Copy link
Contributor

github-actions bot commented Mar 17, 2026

Size Change: 0 B

Total Size: 109 MB

ℹ️ View Unchanged
Filename Size
frontend/dist/368Hedgehogs 5.27 kB
frontend/dist/abap 14.2 kB
frontend/dist/Action 20.5 kB
frontend/dist/Actions 1.03 kB
frontend/dist/AdvancedActivityLogsScene 33.9 kB
frontend/dist/apex 3.96 kB
frontend/dist/ApprovalDetail 16.2 kB
frontend/dist/array.full.es5.js 330 kB
frontend/dist/array.full.js 428 kB
frontend/dist/array.js 183 kB
frontend/dist/AsyncMigrations 13.2 kB
frontend/dist/AuthorizationStatus 717 B
frontend/dist/azcli 852 B
frontend/dist/bat 1.85 kB
frontend/dist/BatchExportScene 50.1 kB
frontend/dist/bicep 2.56 kB
frontend/dist/Billing 493 B
frontend/dist/BillingSection 20.7 kB
frontend/dist/BoxPlot 5.01 kB
frontend/dist/browserAll-0QZMN1W2 37.4 kB
frontend/dist/ButtonPrimitives 562 B
frontend/dist/CalendarHeatMap 4.82 kB
frontend/dist/cameligo 2.2 kB
frontend/dist/changeRequestsLogic 544 B
frontend/dist/CLIAuthorize 11.3 kB
frontend/dist/CLILive 3.99 kB
frontend/dist/clojure 9.65 kB
frontend/dist/coffee 3.6 kB
frontend/dist/Cohort 23.3 kB
frontend/dist/CohortCalculationHistory 6.24 kB
frontend/dist/Cohorts 9.41 kB
frontend/dist/ConfirmOrganization 4.5 kB
frontend/dist/conversations.js 64.5 kB
frontend/dist/Coupons 731 B
frontend/dist/cpp 5.31 kB
frontend/dist/Create 666 B
frontend/dist/crisp-chat-integration.js 2.11 kB
frontend/dist/csharp 4.53 kB
frontend/dist/csp 1.43 kB
frontend/dist/css 4.51 kB
frontend/dist/cssMode 4.18 kB
frontend/dist/CustomCssScene 3.56 kB
frontend/dist/CustomerAnalyticsConfigurationScene 2 kB
frontend/dist/CustomerAnalyticsScene 26.2 kB
frontend/dist/CustomerJourneyBuilderScene 1.56 kB
frontend/dist/customizations.full.js 18.7 kB
frontend/dist/CyclotronJobInputAssignee 1.33 kB
frontend/dist/CyclotronJobInputTicketTags 717 B
frontend/dist/cypher 3.4 kB
frontend/dist/dart 4.26 kB
frontend/dist/Dashboard 970 B
frontend/dist/Dashboards 14.7 kB
frontend/dist/DataManagementScene 646 B
frontend/dist/DataPipelinesNewScene 2.29 kB
frontend/dist/DataWarehouseScene 1.07 kB
frontend/dist/DataWarehouseSourceScene 634 B
frontend/dist/Deactivated 1.14 kB
frontend/dist/dead-clicks-autocapture.js 13.1 kB
frontend/dist/DeadLetterQueue 5.41 kB
frontend/dist/DebugScene 18.5 kB
frontend/dist/decompressionWorker 2.85 kB
frontend/dist/decompressionWorker.js 2.85 kB
frontend/dist/DefinitionEdit 7.13 kB
frontend/dist/DefinitionView 22.3 kB
frontend/dist/DestinationsScene 2.69 kB
frontend/dist/dist 575 B
frontend/dist/dockerfile 1.88 kB
frontend/dist/EarlyAccessFeature 685 B
frontend/dist/EarlyAccessFeatures 2.85 kB
frontend/dist/ecl 5.35 kB
frontend/dist/EditorScene 805 B
frontend/dist/elixir 10.3 kB
frontend/dist/EmailMFAVerify 2.99 kB
frontend/dist/EndpointScene 30.1 kB
frontend/dist/EndpointsScene 21 kB
frontend/dist/ErrorTrackingConfigurationScene 2.2 kB
frontend/dist/ErrorTrackingIssueFingerprintsScene 6.99 kB
frontend/dist/ErrorTrackingIssueScene 85.9 kB
frontend/dist/ErrorTrackingScene 13 kB
frontend/dist/EvaluationTemplates 575 B
frontend/dist/EventsScene 2.45 kB
frontend/dist/exception-autocapture.js 11.9 kB
frontend/dist/Experiment 258 kB
frontend/dist/Experiments 17 kB
frontend/dist/exporter 20.9 MB
frontend/dist/exporter.js 20.9 MB
frontend/dist/ExportsScene 3.88 kB
frontend/dist/FeatureFlag 101 kB
frontend/dist/FeatureFlags 572 B
frontend/dist/FeatureFlagTemplatesScene 7.05 kB
frontend/dist/FlappyHog 5.8 kB
frontend/dist/flow9 1.81 kB
frontend/dist/freemarker2 16.7 kB
frontend/dist/fsharp 2.99 kB
frontend/dist/GAPromotionDialogContent 867 B
frontend/dist/go 2.66 kB
frontend/dist/graphql 2.27 kB
frontend/dist/Group 14.4 kB
frontend/dist/Groups 3.94 kB
frontend/dist/GroupsNew 7.36 kB
frontend/dist/handlebars 7.37 kB
frontend/dist/hcl 3.6 kB
frontend/dist/HealthScene 11 kB
frontend/dist/HeatmapNewScene 4.18 kB
frontend/dist/HeatmapRecordingScene 3.94 kB
frontend/dist/HeatmapScene 6.05 kB
frontend/dist/HeatmapsScene 3.89 kB
frontend/dist/HogFunctionScene 58.8 kB
frontend/dist/HogRepl 7.38 kB
frontend/dist/html 5.6 kB
frontend/dist/htmlMode 4.64 kB
frontend/dist/image-blob-reduce.esm 49.4 kB
frontend/dist/InboxScene 54.6 kB
frontend/dist/index 257 kB
frontend/dist/index.js 257 kB
frontend/dist/ini 1.11 kB
frontend/dist/InsightOptions 4.81 kB
frontend/dist/InsightScene 27.1 kB
frontend/dist/IntegrationsRedirect 744 B
frontend/dist/intercom-integration.js 2.16 kB
frontend/dist/InviteSignup 13.3 kB
frontend/dist/java 3.23 kB
frontend/dist/javascript 996 B
frontend/dist/jsonMode 13.9 kB
frontend/dist/julia 7.24 kB
frontend/dist/kotlin 3.41 kB
frontend/dist/lazy 153 kB
frontend/dist/LegacyPluginScene 21.1 kB
frontend/dist/LemonDialog 482 B
frontend/dist/less 3.9 kB
frontend/dist/lexon 2.45 kB
frontend/dist/lib 2.23 kB
frontend/dist/Link 468 B
frontend/dist/LinkScene 24.9 kB
frontend/dist/LinksScene 4.21 kB
frontend/dist/liquid 4.54 kB
frontend/dist/LiveDebugger 19 kB
frontend/dist/LiveEventsTable 4.46 kB
frontend/dist/LLMAnalyticsClusterScene 15.7 kB
frontend/dist/LLMAnalyticsClustersScene 42.5 kB
frontend/dist/LLMAnalyticsDatasetScene 19.7 kB
frontend/dist/LLMAnalyticsDatasetsScene 3.29 kB
frontend/dist/LLMAnalyticsEvaluation 40.5 kB
frontend/dist/LLMAnalyticsEvaluationsScene 29.3 kB
frontend/dist/LLMAnalyticsPlaygroundScene 36.4 kB
frontend/dist/LLMAnalyticsScene 71.6 kB
frontend/dist/LLMAnalyticsSessionScene 13.4 kB
frontend/dist/LLMAnalyticsTraceScene 97.9 kB
frontend/dist/LLMAnalyticsUsers 526 B
frontend/dist/LLMASessionFeedbackDisplay 4.85 kB
frontend/dist/LLMPromptScene 16.9 kB
frontend/dist/LLMPromptsScene 3.54 kB
frontend/dist/Login 8.37 kB
frontend/dist/Login2FA 4.22 kB
frontend/dist/logs.js 39 kB
frontend/dist/LogsScene 13.4 kB
frontend/dist/lua 2.13 kB
frontend/dist/m3 2.82 kB
frontend/dist/ManagedMigration 14 kB
frontend/dist/markdown 3.79 kB
frontend/dist/MarketingAnalyticsScene 23.5 kB
frontend/dist/MaterializedColumns 10.2 kB
frontend/dist/Max 767 B
frontend/dist/mdx 5.38 kB
frontend/dist/MessageTemplate 16.2 kB
frontend/dist/MetricsScene 844 B
frontend/dist/mips 2.59 kB
frontend/dist/ModelsScene 13.7 kB
frontend/dist/MonacoDiffEditor 403 B
frontend/dist/MoveToPostHogCloud 4.46 kB
frontend/dist/msdax 4.92 kB
frontend/dist/mysql 11.3 kB
frontend/dist/NavTabChat 4.43 kB
frontend/dist/NewSourceWizard 724 B
frontend/dist/NewTabScene 647 B
frontend/dist/NodeDetailScene 15.5 kB
frontend/dist/NotebookCanvasScene 2.9 kB
frontend/dist/NotebookPanel 4.93 kB
frontend/dist/NotebookScene 7.92 kB
frontend/dist/NotebooksScene 7.57 kB
frontend/dist/OAuthAuthorize 9.68 kB
frontend/dist/objective-c 2.42 kB
frontend/dist/Onboarding 655 kB
frontend/dist/OnboardingCouponRedemption 1.2 kB
frontend/dist/pascal 3 kB
frontend/dist/pascaligo 2.01 kB
frontend/dist/passkeyLogic 484 B
frontend/dist/PasswordReset 4.33 kB
frontend/dist/PasswordResetComplete 2.95 kB
frontend/dist/perl 8.26 kB
frontend/dist/PersonScene 15.8 kB
frontend/dist/PersonsScene 4.75 kB
frontend/dist/pgsql 13.5 kB
frontend/dist/php 8.03 kB
frontend/dist/PipelineStatusScene 6.24 kB
frontend/dist/pla 1.69 kB
frontend/dist/posthog 253 kB
frontend/dist/postiats 7.86 kB
frontend/dist/powerquery 17 kB
frontend/dist/powershell 3.28 kB
frontend/dist/PreflightCheck 5.54 kB
frontend/dist/product-tours.js 118 kB
frontend/dist/ProductTour 274 kB
frontend/dist/ProductTours 4.72 kB
frontend/dist/ProjectHomepage 19.1 kB
frontend/dist/protobuf 9.05 kB
frontend/dist/pug 4.83 kB
frontend/dist/python 4.79 kB
frontend/dist/qsharp 3.2 kB
frontend/dist/r 3.14 kB
frontend/dist/razor 9.36 kB
frontend/dist/react 146 B
frontend/dist/recorder-v2.js 113 kB
frontend/dist/recorder.js 113 kB
frontend/dist/redis 3.56 kB
frontend/dist/redshift 11.8 kB
frontend/dist/RegionMap 134 kB
frontend/dist/render-query 20.7 MB
frontend/dist/render-query.js 20.7 MB
frontend/dist/ResourceTransfer 9.16 kB
frontend/dist/restructuredtext 3.91 kB
frontend/dist/RevenueAnalyticsScene 25.6 kB
frontend/dist/ruby 8.51 kB
frontend/dist/rust 4.17 kB
frontend/dist/SavedInsights 664 B
frontend/dist/sb 1.83 kB
frontend/dist/scala 7.33 kB
frontend/dist/scheme 1.77 kB
frontend/dist/scss 6.41 kB
frontend/dist/SdkDoctorScene 4.61 kB
frontend/dist/SessionAttributionExplorerScene 6.62 kB
frontend/dist/SessionGroupSummariesTable 4.64 kB
frontend/dist/SessionGroupSummaryScene 17.1 kB
frontend/dist/SessionProfileScene 15.9 kB
frontend/dist/SessionRecordingDetail 1.74 kB
frontend/dist/SessionRecordingFilePlaybackScene 4.48 kB
frontend/dist/SessionRecordings 742 B
frontend/dist/SessionRecordingsKiosk 8.87 kB
frontend/dist/SessionRecordingsPlaylistScene 4.08 kB
frontend/dist/SessionRecordingsSettingsScene 1.91 kB
frontend/dist/SessionsScene 3.88 kB
frontend/dist/SettingsScene 3 kB
frontend/dist/SharedMetric 15.6 kB
frontend/dist/SharedMetrics 515 B
frontend/dist/shell 3.08 kB
frontend/dist/SignupContainer 22.8 kB
frontend/dist/Site 1.2 kB
frontend/dist/solidity 18.6 kB
frontend/dist/sophia 2.77 kB
frontend/dist/SourcesScene 5.98 kB
frontend/dist/sourceWizardLogic 662 B
frontend/dist/sparql 2.56 kB
frontend/dist/sql 10.3 kB
frontend/dist/SqlVariableEditScene 7.26 kB
frontend/dist/st 7.41 kB
frontend/dist/StartupProgram 21.2 kB
frontend/dist/SupportSettingsScene 28.3 kB
frontend/dist/SupportTicketScene 22.2 kB
frontend/dist/SupportTicketsScene 8.29 kB
frontend/dist/Survey 746 B
frontend/dist/SurveyFormBuilder 1.55 kB
frontend/dist/Surveys 18.2 kB
frontend/dist/surveys.js 90.2 kB
frontend/dist/SurveyWizard 56.2 kB
frontend/dist/swift 5.28 kB
frontend/dist/SystemStatus 16.9 kB
frontend/dist/systemverilog 7.62 kB
frontend/dist/TaskDetailScene 19 kB
frontend/dist/TaskTracker 16.4 kB
frontend/dist/tcl 3.57 kB
frontend/dist/toolbar 9.6 MB
frontend/dist/toolbar.js 9.6 MB
frontend/dist/ToolbarLaunch 2.53 kB
frontend/dist/tracing-headers.js 1.93 kB
frontend/dist/TracingScene 14.4 kB
frontend/dist/TransformationsScene 1.93 kB
frontend/dist/tsMode 24 kB
frontend/dist/twig 5.98 kB
frontend/dist/TwoFactorReset 4 kB
frontend/dist/typescript 240 B
frontend/dist/typespec 2.83 kB
frontend/dist/Unsubscribe 1.63 kB
frontend/dist/UserInterview 4.55 kB
frontend/dist/UserInterviews 2.03 kB
frontend/dist/vb 5.8 kB
frontend/dist/VercelConnect 4.03 kB
frontend/dist/VercelLinkError 1.92 kB
frontend/dist/VerifyEmail 4.49 kB
frontend/dist/vimMode 211 kB
frontend/dist/VisualReviewRunScene 18.5 kB
frontend/dist/VisualReviewRunsScene 6.01 kB
frontend/dist/VisualReviewSettingsScene 9.12 kB
frontend/dist/web-vitals.js 6.6 kB
frontend/dist/WebAnalyticsScene 5.72 kB
frontend/dist/WebGLRenderer-DYjOwNoG 60.3 kB
frontend/dist/WebGPURenderer-B_wkl_Ja 36.3 kB
frontend/dist/WebScriptsScene 2.55 kB
frontend/dist/webworkerAll-puPV1rBA 330 B
frontend/dist/wgsl 7.35 kB
frontend/dist/Wizard 4.47 kB
frontend/dist/WorkflowScene 101 kB
frontend/dist/WorkflowsScene 47.1 kB
frontend/dist/WorldMap 4.75 kB
frontend/dist/xml 2.98 kB
frontend/dist/yaml 4.61 kB

compressed-size-action

@tests-posthog
Copy link
Contributor

tests-posthog bot commented Mar 17, 2026

Visual regression: Playwright E2E E2E screenshots updated

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

What this means:

  • Snapshots have been automatically updated to match current rendering
  • Next CI run will switch to CHECK mode to verify stability
  • If snapshots change again, CHECK mode will fail (indicates flapping)

Next steps:

  • Review the changes to ensure they're intentional
  • Approve if changes match your expectations
  • If unexpected, investigate component rendering

Review snapshot changes →

@matheus-vb matheus-vb merged commit 89fdec4 into master Mar 17, 2026
190 of 191 checks passed
@matheus-vb matheus-vb deleted the matheus-vb/hypercache-flag-provider branch March 17, 2026 15:31
MattBro pushed a commit that referenced this pull request Mar 17, 2026
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
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.

2 participants