Repository navigation
fix: treat failed feature flag records as unevaluated - #1238
marandaneto wants to merge 7 commits into
Conversation
posthog-python Compliance ReportDate: 2026-11-12T13:46:20.561196+00:00
|
| Test | Status | Duration |
|---|---|---|
| Endpoint And Method.Targets V1 Endpoint | ✅ | 514ms |
| Endpoint And Method.Does Not Use Legacy Endpoints | ✅ | 509ms |
| Required Headers.Has Authorization Bearer Header | ✅ | 509ms |
| Required Headers.Has Content Type Json | ✅ | 508ms |
| Required Headers.Has Posthog Sdk Info Format | ✅ | 509ms |
| Required Headers.Has Posthog Attempt Header | ✅ | 508ms |
| Required Headers.Has Posthog Request Id | ✅ | 509ms |
| Required Headers.Has Posthog Request Timestamp | ✅ | 509ms |
| Required Headers.Has User Agent | ✅ | 509ms |
| Body Format.Body Has Created At And Batch | ✅ | 508ms |
| Body Format.No Api Key In Body | ✅ | 508ms |
| Body Format.No Sent At In Body | ✅ | 509ms |
| Event Format.Event Has Required Root Fields | ✅ | 509ms |
| Event Format.Event Uuid Is Valid | ✅ | 508ms |
| Event Format.Event Timestamp Is Rfc3339 | ✅ | 509ms |
| Event Format.Non Utc Event Timestamp Is Converted To Utc | ✅ | 523ms |
| Event Format.Distinct Id Is String | ✅ | 509ms |
| Event Format.Distinct Id At Root Not Properties | ✅ | 509ms |
| Event Format.Custom Properties Preserved | ✅ | 509ms |
| Event Format.Set Properties Preserved | ✅ | 508ms |
| Event Format.Set Once Properties Preserved | ✅ | 509ms |
| Event Format.Groups Properties Preserved | ✅ | 508ms |
| Event Format.Sdk Generates Uuid If Not Provided | ✅ | 508ms |
| Event Format.Event Has Required Root Fields Batch | ✅ | 512ms |
| Event Format.Event Uuid Is Valid Batch | ✅ | 511ms |
| Event Format.Event Timestamp Is Rfc3339 Batch | ✅ | 511ms |
| Event Format.Distinct Id Is String Batch | ✅ | 511ms |
| Event Format.Distinct Id At Root Not Properties Batch | ✅ | 511ms |
| Event Format.Custom Properties Preserved Batch | ✅ | 512ms |
| Event Format.Set Properties Preserved Batch | ✅ | 510ms |
| Event Format.Set Once Properties Preserved Batch | ✅ | 512ms |
| Event Format.Groups Properties Preserved Batch | ✅ | 511ms |
| Event Format.Sdk Generates Uuid If Not Provided Batch | ✅ | 511ms |
| Batch Behavior.Multiple Events In Single Batch | ✅ | 515ms |
| Batch Behavior.Batch Envelope Smoke | ✅ | 514ms |
| Batch Behavior.Flush With No Events Sends Nothing | ✅ | 506ms |
| Batch Behavior.Flush At Triggers Batch | ✅ | 1009ms |
| Batch Behavior.Created At Reflects Batch Creation Time | ✅ | 509ms |
| Deduplication.Generates Unique Uuids | ✅ | 514ms |
| Deduplication.Different Events Same Content Different Uuids | ✅ | 510ms |
| Deduplication.Preserves Uuid On Retry | ✅ | 6517ms |
| Deduplication.Preserves Timestamp On Retry | ✅ | 6518ms |
| Deduplication.Preserves Uuid And Timestamp On Batch Retry | ✅ | 6516ms |
| Deduplication.No Duplicate Events In Batch | ✅ | 515ms |
| Header Behavior On Retry.Attempt Header Starts At One | ✅ | 509ms |
| Header Behavior On Retry.Attempt Header Increments On Retry | ✅ | 13525ms |
| Header Behavior On Retry.Request Id Preserved On Retry | ✅ | 6517ms |
| Header Behavior On Retry.Different Requests Have Different Request Ids | ✅ | 3018ms |
| Header Behavior On Retry.Request Timestamp Changes On Retry | ✅ | 6514ms |
| Response Format Validation.Success Response Has Uuid Keyed Results | ✅ | 509ms |
| Response Format Validation.Success Response Has Ok For Each Event | ✅ | 513ms |
| Response Format Validation.Success No Retry After When All Ok | ✅ | 510ms |
| Response Format Validation.Success Retry After Present When Retry Events | ✅ | 1514ms |
| Response Format Validation.Success No Retry After When Drop Only | ✅ | 510ms |
| Response Format Validation.Response Echoes Request Id | ✅ | 509ms |
| Retry Behavior.Retries On 408 | ✅ | 6517ms |
| Retry Behavior.Retries On 500 | ✅ | 6514ms |
| Retry Behavior.Retries On 503 | ✅ | 8516ms |
| Retry Behavior.Retries On 504 | ✅ | 6518ms |
| Retry Behavior.Retries On 404 | ✅ | 6519ms |
| Retry Behavior.Retries On 429 | ✅ | 6514ms |
| Retry Behavior.Retries On 502 | ✅ | 6514ms |
| Retry Behavior.Retryable Errors Have Retry After | ✅ | 3515ms |
| Retry Behavior.Respects Retry After On Retryable Error | ✅ | 11521ms |
| Retry Behavior.Does Not Retry On 400 | ✅ | 2511ms |
| Retry Behavior.Does Not Retry On 401 | ✅ | 2512ms |
| Retry Behavior.Does Not Retry On 402 | ✅ | 2511ms |
| Retry Behavior.Does Not Retry On 413 | ✅ | 2512ms |
| Retry Behavior.Does Not Retry On 415 | ✅ | 2512ms |
| Retry Behavior.Non Retryable Errors Have No Retry After | ✅ | 2512ms |
| Retry Behavior.Implements Backoff | ✅ | 19531ms |
| Partial Batch Handling.Handles 200 Full Success | ✅ | 2511ms |
| Partial Batch Handling.Handles 200 With All Ok | ✅ | 3516ms |
| Partial Batch Handling.Does Not Retry Dropped Events | ✅ | 3514ms |
| Partial Batch Handling.Does Not Retry Warning Events | ✅ | 3514ms |
| Partial Batch Handling.Prunes Ok Events On Partial Retry | ✅ | 6514ms |
| Partial Batch Handling.Prunes Dropped Events On Partial Retry | ✅ | 6515ms |
| Partial Batch Handling.Retries Only Retry Events From Partial | ✅ | 6522ms |
| Partial Batch Handling.Partial Retry Preserves Uuids | ✅ | 6515ms |
| Partial Batch Handling.Partial Retry Attempt Header Increments | ✅ | 6519ms |
| Partial Batch Handling.Partial Retry Request Id Preserved | ✅ | 6519ms |
| Partial Batch Handling.Respects Retry After On Partial | ✅ | 8520ms |
| Partial Batch Handling.Unknown Result Treated As Terminal | ✅ | 3512ms |
| Partial Batch Handling.Mixed Ok Drop Warning No Retry | ✅ | 3514ms |
| Compression.Sends Gzip Content Encoding | ✅ | 509ms |
| Compression.No Content Encoding When Disabled | ✅ | 509ms |
| Compression.Compressed Body Is Decompressible | ✅ | 509ms |
| Error Handling.Does Not Retry On Unknown 4Xx | ✅ | 2511ms |
| Event Options.Cookieless Mode Override | ✅ | 509ms |
| Event Options.Disable Skew Correction Override | ✅ | 509ms |
| Event Options.Process Person Profile Override | ✅ | 509ms |
| Event Options.Product Tour Id Override | ✅ | 508ms |
| Event Options.Unset Options Omitted | ✅ | 509ms |
| Event Options.Options Override In Batch | ✅ | 511ms |
| Geoip And Historical Migration.Historical Migration Absent By Default | ✅ | 509ms |
Capture_Ai Tests
✅ 5/5 tests passed
View Details
| Test | Status | Duration |
|---|---|---|
| Routing.Capture Ai Posts To Ai Endpoint | ✅ | 509ms |
| Routing.Capture Does Not Reroute Ai Named Events | ✅ | 510ms |
| Identity.Capture Ai Event Has Uuid | ✅ | 509ms |
| Identity.Capture Ai Keeps Supplied Uuid | ✅ | 508ms |
| Timestamp Format.Non Utc Event Timestamp Is Converted To Utc | ✅ | 509ms |
Feature_Flags Tests
✅ 17/17 tests passed
View Details
| Test | Status | Duration |
|---|---|---|
| Request Payload.Request With Person Properties Device Id | ✅ | 10ms |
| Request Payload.Flags Request Uses V4 Query Param | ✅ | 8ms |
| Request Payload.Flags Request Hits Flags Path Not Decide | ✅ | 7ms |
| Request Payload.Flags Request Omits Authorization Header | ✅ | 8ms |
| Request Payload.Token In Flags Body Matches Init | ✅ | 8ms |
| Request Payload.Groups Round Trip | ✅ | 8ms |
| Request Payload.Groups Default To Empty Object | ✅ | 9ms |
| Request Payload.Disable Geoip False Propagates As Geoip Disable False | ✅ | 8ms |
| Request Payload.Disable Geoip Omitted Defaults To False | ✅ | 8ms |
| Request Payload.Flag Keys To Evaluate Contains Only Requested Key | ✅ | 8ms |
| Request Lifecycle.No Flags Request On Init Alone | ✅ | 3ms |
| Request Lifecycle.No Flags Request On Normal Capture | ✅ | 509ms |
| Request Lifecycle.Two Flag Calls Produce Two Remote Requests | ✅ | 11ms |
| Request Lifecycle.Mock Response Value Is Returned To Caller | ✅ | 7ms |
| Retry Behavior.Retries Flags On 502 | ✅ | 311ms |
| Retry Behavior.Retries Flags On 504 | ✅ | 312ms |
| Side Effect Events.Get Feature Flag Captures Feature Flag Called Event | ✅ | 510ms |
Feature_Flags_V4 Tests
View Details
| Test | Status | Duration |
|---|---|---|
| Legacy Getters.Legacy Getter Reads Reader Fixture[Readers.Complete Split] | ✅ | 9ms |
| Legacy Getters.Legacy Getter Reads Reader Fixture[Readers.Partial Split Missing Config Version] | ✅ | 8ms |
| Legacy Getters.Legacy Getter Reads Reader Fixture[Readers.Partial Split Missing Rule Type] | ✅ | 7ms |
| Legacy Getters.Legacy Getter Reads Reader Fixture[Readers.Partial Split Missing Rule Id] | ✅ | 8ms |
| Legacy Getters.Legacy Getter Reads Reader Fixture[Readers.Partial Split Missing Variant Key] | ✅ | 8ms |
| Legacy Getters.Legacy Getter Reads Reader Fixture[Readers.Split Wrong Type Config Version] | ✅ | 7ms |
| Legacy Getters.Legacy Getter Reads Reader Fixture[Readers.Split Wrong Type Rule Type] | ✅ | 7ms |
| Legacy Getters.Legacy Getter Reads Reader Fixture[Readers.Split Wrong Type Rule Id] | ✅ | 8ms |
| Legacy Getters.Legacy Getter Reads Reader Fixture[Readers.Split Wrong Type Experiment Id] | ✅ | 7ms |
| Legacy Getters.Legacy Getter Reads Reader Fixture[Readers.Split Extra Experiment Id] | ✅ | 8ms |
| Legacy Getters.Legacy Getter Reads Reader Fixture[Readers.Split Wrong Type Variant Key] | ✅ | 8ms |
| Legacy Getters.Legacy Getter Reads Reader Fixture[Readers.Wrong Rule Type Literal] | ✅ | 7ms |
| Legacy Getters.Legacy Getter Reads Reader Fixture[Readers.Unknown Fields] | ✅ | 8ms |
| Legacy Getters.Legacy Getter Reads Reader Fixture[Readers.Old Server Variant] | ✅ | 7ms |
| Legacy Getters.Legacy Getter Reads Reader Fixture[Readers.Old Server Boolean] | ✅ | 8ms |
| Legacy Getters.Legacy Getter Reads Reader Fixture[Readers.Old Server Null Variant] | ✅ | 7ms |
| Legacy Getters.Legacy Getter Reads Reader Fixture[Readers.Old Server False] | ✅ | 8ms |
| Legacy Getters.Legacy Getter Reads Reader Fixture[Readers.V4 Value Takes Precedence] | ✅ | 7ms |
| Legacy Getters.Legacy Getter Reads Reader Fixture[Readers.Missing Flag] | ✅ | 8ms |
| Legacy Getters.Legacy Getter Reads Reader Fixture[Readers.Targeting Match Targeted Release] | ✅ | 8ms |
| Legacy Getters.Legacy Getter Reads Reader Fixture[Readers.Targeting Match Percentage Rollout] | ✅ | 7ms |
| Legacy Getters.Legacy Getter Reads Reader Fixture[Readers.Rollout Miss Percentage Rollout] | ✅ | 8ms |
| Legacy Getters.Legacy Getter Reads Reader Fixture[Readers.Rollout Miss Experiment] | ✅ | 8ms |
| Legacy Getters.Legacy Getter Reads Reader Fixture[Readers.Experiment Paused] | ✅ | 7ms |
| Legacy Getters.Legacy Getter Reads Reader Fixture[Readers.Holdout] | ✅ | 8ms |
| Legacy Getters.Legacy Getter Reads Reader Fixture[Readers.Holdout Variant Key] | ✅ | 8ms |
| Legacy Getters.Legacy Getter Reads Reader Fixture[Readers.No Rule Match] | ✅ | 8ms |
| Legacy Getters.Legacy Getter Reads Reader Fixture[Readers.Missing Group Key] | ✅ | 7ms |
| Legacy Getters.Legacy Getter Reads Reader Fixture[Readers.Dependency Error] | ❌ | 8ms |
| Legacy Getters.Legacy Getter Reads Reader Fixture[Readers.Error] | ❌ | 8ms |
| Legacy Getters.Legacy Getter Reads Reader Fixture[Readers.Error With Value] | ❌ | 7ms |
| Legacy Getters.Legacy Getter Reads Reader Fixture[Readers.Malformed Sibling Isolation] | ✅ | 8ms |
| Legacy Getters.Legacy Getter Reads Reader Fixture[Readers.Partial Split String Value] | ✅ | 8ms |
| Legacy Getters.Legacy Getter Reads Reader Fixture[Readers.V1 At V4] | ✅ | 7ms |
| Legacy Getters.Legacy Getter Reads Reader Fixture[Readers.V1 Failed] | ❌ | 8ms |
| Legacy Getters.Legacy Getter Reads Reader Fixture[Readers.Integral Json Number Context] | ✅ | 8ms |
| Legacy Getters.Legacy Getter Reads Reader Fixture[Readers.Flag Key Seed] | ✅ | 8ms |
| Legacy Getters.Legacy Getter Reads Typed Value[V2 Value.String.Target] | ✅ | 8ms |
| Legacy Getters.Legacy Getter Reads Typed Value[V2 Value.String.Rollout Hit] | ✅ | 8ms |
| Legacy Getters.Legacy Getter Reads Typed Value[V2 Value.String.Miss Return Default] | ✅ | 7ms |
| Legacy Getters.Legacy Getter Reads Typed Value[V2 Value.String.Miss Return Default Null] | ✅ | 8ms |
| Legacy Getters.Legacy Getter Reads Typed Value[V2 Value.String.Miss Continue] | ✅ | 8ms |
| Legacy Getters.Legacy Getter Reads Typed Value[V2 Value.String.No Match Default] | ✅ | 8ms |
| Legacy Getters.Legacy Getter Reads Typed Value[V2 Value.String.No Match Null] | ✅ | 8ms |
| Legacy Getters.Legacy Getter Reads Typed Value[V2 Value.String.Order First Match] | ✅ | 8ms |
| Legacy Getters.Legacy Getter Reads Typed Value[V2 Value.String.Order Targeting Miss] | ✅ | 8ms |
| Legacy Getters.Legacy Getter Reads Typed Value[V2 Value.Number.Target] | ✅ | 9ms |
| Legacy Getters.Legacy Getter Reads Typed Value[V2 Value.Number.Rollout Hit] | ✅ | 7ms |
| Legacy Getters.Legacy Getter Reads Typed Value[V2 Value.Number.Miss Return Default] | ✅ | 8ms |
| Legacy Getters.Legacy Getter Reads Typed Value[V2 Value.Number.Miss Return Default Null] | ✅ | 8ms |
| Legacy Getters.Legacy Getter Reads Typed Value[V2 Value.Number.Miss Continue] | ✅ | 8ms |
| Legacy Getters.Legacy Getter Reads Typed Value[V2 Value.Number.No Match Default] | ✅ | 8ms |
| Legacy Getters.Legacy Getter Reads Typed Value[V2 Value.Number.No Match Null] | ✅ | 26ms |
| Legacy Getters.Legacy Getter Reads Typed Value[V2 Value.Number.Order First Match] | ✅ | 9ms |
| Legacy Getters.Legacy Getter Reads Typed Value[V2 Value.Number.Order Targeting Miss] | ✅ | 8ms |
| Legacy Getters.Legacy Getter Reads Typed Value[V2 Value.Object.Target] | ✅ | 8ms |
| Legacy Getters.Legacy Getter Reads Typed Value[V2 Value.Object.Rollout Hit] | ✅ | 9ms |
| Legacy Getters.Legacy Getter Reads Typed Value[V2 Value.Object.Miss Return Default] | ✅ | 9ms |
| Legacy Getters.Legacy Getter Reads Typed Value[V2 Value.Object.Miss Return Default Null] | ✅ | 8ms |
| Legacy Getters.Legacy Getter Reads Typed Value[V2 Value.Object.Miss Continue] | ✅ | 8ms |
| Legacy Getters.Legacy Getter Reads Typed Value[V2 Value.Object.No Match Default] | ✅ | 9ms |
| Legacy Getters.Legacy Getter Reads Typed Value[V2 Value.Object.No Match Null] | ✅ | 8ms |
| Legacy Getters.Legacy Getter Reads Typed Value[V2 Value.Object.Order First Match] | ✅ | 8ms |
| Legacy Getters.Legacy Getter Reads Typed Value[V2 Value.Object.Order Targeting Miss] | ✅ | 8ms |
| Legacy Getters.Legacy Getter Reads Typed Value[V2 Value.String.Unicode] | ✅ | 7ms |
| Legacy Getters.Legacy Getter Reads Typed Value[V2 Value.String.Looks Boolean] | ✅ | 8ms |
| Legacy Getters.Legacy Getter Reads Typed Value[V2 Value.Number.Zero] | ✅ | 8ms |
| Legacy Getters.Legacy Getter Reads Typed Value[V2 Value.Number.Negative Decimal] | ✅ | 7ms |
| Legacy Getters.Legacy Getter Reads Typed Value[V2 Value.Number.Short Decimal] | ✅ | 9ms |
| Legacy Getters.Legacy Getter Reads Typed Value[V2 Value.Number.Exponent] | ✅ | 7ms |
| Legacy Getters.Legacy Getter Reads Typed Value[V2 Value.Number.Max Safe Integer] | ✅ | 8ms |
| Legacy Getters.Legacy Getter Reads Typed Value[V2 Value.Number.Min Safe Integer] | ✅ | 8ms |
| Legacy Getters.Legacy Getter Reads Typed Value[V2 Value.Object.Empty] | ✅ | 9ms |
| Legacy Getters.Legacy Getter Reads Typed Value[V2 Value.Object.Nested] | ✅ | 9ms |
| Legacy Getters.Legacy Getter Reads Typed Value[V2 Value.Object.Max Depth] | ✅ | 9ms |
| Legacy Payloads.Legacy Payload Reads Reader Fixture[Readers.Complete Split] | ✅ | 7ms |
| Legacy Payloads.Legacy Payload Reads Reader Fixture[Readers.Partial Split Missing Config Version] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Reads Reader Fixture[Readers.Partial Split Missing Rule Type] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Reads Reader Fixture[Readers.Partial Split Missing Rule Id] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Reads Reader Fixture[Readers.Partial Split Missing Variant Key] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Reads Reader Fixture[Readers.Split Wrong Type Config Version] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Reads Reader Fixture[Readers.Split Wrong Type Rule Type] | ✅ | 7ms |
| Legacy Payloads.Legacy Payload Reads Reader Fixture[Readers.Split Wrong Type Rule Id] | ✅ | 7ms |
| Legacy Payloads.Legacy Payload Reads Reader Fixture[Readers.Split Wrong Type Experiment Id] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Reads Reader Fixture[Readers.Split Extra Experiment Id] | ✅ | 5ms |
| Legacy Payloads.Legacy Payload Reads Reader Fixture[Readers.Split Wrong Type Variant Key] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Reads Reader Fixture[Readers.Wrong Rule Type Literal] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Reads Reader Fixture[Readers.Unknown Fields] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Reads Reader Fixture[Readers.Old Server Variant] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Reads Reader Fixture[Readers.Old Server Boolean] | ✅ | 5ms |
| Legacy Payloads.Legacy Payload Reads Reader Fixture[Readers.Old Server Null Variant] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Reads Reader Fixture[Readers.Old Server False] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Reads Reader Fixture[Readers.V4 Value Takes Precedence] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Reads Reader Fixture[Readers.Missing Flag] | ✅ | 5ms |
| Legacy Payloads.Legacy Payload Reads Reader Fixture[Readers.Targeting Match Targeted Release] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Reads Reader Fixture[Readers.Targeting Match Percentage Rollout] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Reads Reader Fixture[Readers.Rollout Miss Percentage Rollout] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Reads Reader Fixture[Readers.Rollout Miss Experiment] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Reads Reader Fixture[Readers.Experiment Paused] | ✅ | 5ms |
| Legacy Payloads.Legacy Payload Reads Reader Fixture[Readers.Holdout] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Reads Reader Fixture[Readers.Holdout Variant Key] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Reads Reader Fixture[Readers.No Rule Match] | ✅ | 7ms |
| Legacy Payloads.Legacy Payload Reads Reader Fixture[Readers.Missing Group Key] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Reads Reader Fixture[Readers.Dependency Error] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Reads Reader Fixture[Readers.Error] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Reads Reader Fixture[Readers.Error With Value] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Reads Reader Fixture[Readers.Malformed Sibling Isolation] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Reads Reader Fixture[Readers.Partial Split String Value] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Reads Reader Fixture[Readers.V1 At V4] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Reads Reader Fixture[Readers.Integral Json Number Context] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Reads Reader Fixture[Readers.Flag Key Seed] | ✅ | 7ms |
| Legacy Payloads.Legacy Payload Is The Typed Value[V2 Value.String.Target] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Is The Typed Value[V2 Value.String.Rollout Hit] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Is The Typed Value[V2 Value.String.Miss Return Default] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Is The Typed Value[V2 Value.String.Miss Return Default Null] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Is The Typed Value[V2 Value.String.Miss Continue] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Is The Typed Value[V2 Value.String.No Match Default] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Is The Typed Value[V2 Value.String.No Match Null] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Is The Typed Value[V2 Value.String.Order First Match] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Is The Typed Value[V2 Value.String.Order Targeting Miss] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Is The Typed Value[V2 Value.Number.Target] | ✅ | 5ms |
| Legacy Payloads.Legacy Payload Is The Typed Value[V2 Value.Number.Rollout Hit] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Is The Typed Value[V2 Value.Number.Miss Return Default] | ✅ | 7ms |
| Legacy Payloads.Legacy Payload Is The Typed Value[V2 Value.Number.Miss Return Default Null] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Is The Typed Value[V2 Value.Number.Miss Continue] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Is The Typed Value[V2 Value.Number.No Match Default] | ✅ | 5ms |
| Legacy Payloads.Legacy Payload Is The Typed Value[V2 Value.Number.No Match Null] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Is The Typed Value[V2 Value.Number.Order First Match] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Is The Typed Value[V2 Value.Number.Order Targeting Miss] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Is The Typed Value[V2 Value.Object.Target] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Is The Typed Value[V2 Value.Object.Rollout Hit] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Is The Typed Value[V2 Value.Object.Miss Return Default] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Is The Typed Value[V2 Value.Object.Miss Return Default Null] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Is The Typed Value[V2 Value.Object.Miss Continue] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Is The Typed Value[V2 Value.Object.No Match Default] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Is The Typed Value[V2 Value.Object.No Match Null] | ✅ | 5ms |
| Legacy Payloads.Legacy Payload Is The Typed Value[V2 Value.Object.Order First Match] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Is The Typed Value[V2 Value.Object.Order Targeting Miss] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Is The Typed Value[V2 Value.String.Unicode] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Is The Typed Value[V2 Value.String.Looks Boolean] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Is The Typed Value[V2 Value.Number.Zero] | ✅ | 5ms |
| Legacy Payloads.Legacy Payload Is The Typed Value[V2 Value.Number.Negative Decimal] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Is The Typed Value[V2 Value.Number.Short Decimal] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Is The Typed Value[V2 Value.Number.Exponent] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Is The Typed Value[V2 Value.Number.Max Safe Integer] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Is The Typed Value[V2 Value.Number.Min Safe Integer] | ✅ | 5ms |
| Legacy Payloads.Legacy Payload Is The Typed Value[V2 Value.Object.Empty] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Is The Typed Value[V2 Value.Object.Nested] | ✅ | 6ms |
| Legacy Payloads.Legacy Payload Is The Typed Value[V2 Value.Object.Max Depth] | ✅ | 6ms |
Failures
legacy_getters.legacy_getter_reads_reader_fixture[readers.dependency_error]
[readers.dependency_error] legacy value: expected false, got null
legacy_getters.legacy_getter_reads_reader_fixture[readers.error]
[readers.error] legacy value: expected false, got null
legacy_getters.legacy_getter_reads_reader_fixture[readers.error_with_value]
[readers.error_with_value] legacy value: expected false, got null
legacy_getters.legacy_getter_reads_reader_fixture[readers.v1_failed]
[readers.v1_failed] legacy value: expected false, got null
Feature_Flags_Local_Evaluation Tests
✅ 4/4 tests passed
View Details
| Test | Status | Duration |
|---|---|---|
| Versioned Boolean Matching.Matching Version Missing | ✅ | 54ms |
| Versioned Boolean Matching.Matching Version 1 | ✅ | 54ms |
| Versioned Boolean Matching.Matching Version 2 | ✅ | 53ms |
| Versioned Boolean Matching.Version Only Reload 1 2 1 2 Missing | ✅ | 29ms |
SDK performance: posthog-pythonBenchmarks completed. No changes flagged for review. Flags require at least a 5% change in the median and all six pairs agreeing on direction. This is a noise filter, not proof of a performance change or a CI gate. View all results
Values are medians of paired measurements. Not flagged does not mean unchanged. Unavailable means a measurement could not be provided, not zero. Estimated allocation measurements retain their instrumentation uncertainty. RSS measures the whole process, not just SDK allocations; observed peaks are sampled checkpoints. Paired ranges in the diagnostics describe variability, not confidence intervals. Each shard uses its own runner; compare Before PR against With PR within a row, not across shards. Compared 102 metric rows; 102 rows shown in all results. Omitted or shortened data remain in |
There was a problem hiding this comment.
PostHog Review · Standard · reviewed 0f9c9cf: 1 Should fix.
See this review and its findings in PostHog Review. Comment @posthog review --deep for a Deep review. A Deep review takes longer and looks deeper than a Standard review.
💡 Motivation and Context
Detailed
/flagsrecords markedfailed: truehave no evaluated value. Implements the direct failed-record contract in PostHog/sdk-specs#211:evaluation_failed, retaining independent response errors and diagnostic attribution; failed records do not emit experiment exposures.The full branch also updates attribution, v4 and frozen-release comparison assertions to the agreed no-result behavior; frozen fixture files, schemas and digests are unchanged. Existing
pypi/posthog: patchSampo intent remains; no duplicate intent or manual version bump.Explicit scope limit: broader snapshot
evaluation_failedversuslocal_evaluation_inconclusivetelemetry remains unchanged and separate. No new snapshot-inclusion policy or full cross-SDK conformance claim.💚 How did you test it?
Current local result at
0621e4d20f9c782a2ddcc7010cef89993ecb105c, Python 3.13.13 in the existing environment; commands useduv run --frozen --no-sync:{}. Identical focused command after fix: 3 passed.pytest posthog/test/test_*flag*.py posthog/test/test_experiment_exposure.py --timeout=30): 1,987 passed.git diff --checkpassed.origin/main(7eabca81234311dfd86e516c4354c5322f73bfc5): clean, no accepted/actionable findings. Full branch test Authoring audit/deslop completed; no fixture/schema/discovery changes or relaxed healthy assertions.No dependencies installed, lockfile edits, generated mirror/package builds, supported-Python/platform matrix, strict downstream Pyright, live service, benchmarks or shared cross-SDK harness runs this round. Full root suite was not rerun; previously reported unrelated macOS metrics-fork failures remain historical evidence, not newly validated results. No current green-CI claim.
External harness follow-up: the unchanged workflow still uses harness 1.28.0, whose prior report expected false for four detailed failed cases where the approved SDK result is null. Harness PR109 has merged, but no release/pin update is authorized here. No pin, adapter behavior, frozen schema or SDK sentinel was changed to hide that mismatch; shared-harness status was not rerun.
📝 Checklist
🤖 Agent context
Autonomy: Human-driven (agent-assisted). Human DRI: @marandaneto. Pi implemented the approved fixes and ran the tests, source/test audit, and isolated autoreview listed above. Human review is required before merge. No shareable session link is available.