Skip to content

fix: preserve failed flag identity and successful local fallback - #383

Merged
marandaneto merged 1 commit into
mainfrom
fix/spec211-failed-flags
Nov 13, 2026
Merged

marandaneto merged 1 commit into
mainfrom
fix/spec211-failed-flags

Conversation

@marandaneto

Copy link
Copy Markdown
Member

💡 Motivation and Context

A detailed flag record marked failed: true is not a disabled flag. Direct reads currently manufacture a disabled result and report flag_missing. Bulk remote fallback can also discard successful local values and their payloads for failed remote keys.

This implements the affected behavior from PostHog/sdk-specs#211. Failed direct reads now return null and report evaluation_failed, while preserving response-wide diagnostics and the existing false event-response sentinel. Bulk fallback preserves successful same-context local true, false, and variant values with their payloads only for failed remote keys. Healthy remote precedence and healthy false results are unchanged. No new public API or snapshot inclusion policy is introduced.

Includes an existing Changesets patch intent for PostHog only.

💚 How did you test it?

  • DOTNET_ROLL_FORWARD=Major dotnet test tests/UnitTests/UnitTests.csproj -f net8.0 --no-restore --nologo: 1,735 passed, 2 existing skips.
  • Scoped dotnet format whitespace and dotnet format style checks passed. Both reported workspace-loading warnings.
  • Regressions cover direct null results, global-error true/false/absent, local-inconclusive fallback, event diagnostics, dedupe, suppression, healthy false, and local value/payload preservation. Earlier pre-fix runs reproduced synthetic disabled results and lost local values. That early run also contained fixture problems and is not a clean baseline for every final case.
  • Signed committed branch passed the required isolated autoreview with no actionable findings. git diff --check passed.

Tests used .NET 9 major runtime roll-forward. Native .NET 8, netcoreapp3.1, the complete Release solution/integration matrix, and shared-harness conformance were not run.

📝 Checklist

  • All commits are signed (see Commit signing)
  • I reviewed the submitted code.
  • I added tests to verify the changes.
  • I updated the docs if needed.
  • No breaking change or entry added to the changelog.

If releasing new changes

  • Ran pnpm changeset to generate a changeset file

The patch changeset is already included. The generator was not rerun during publication.

🤖 Agent context

Autonomy: Human-driven (agent-assisted)

Pi agents used local shell, Git, .NET tooling, and GitHub CLI to implement, validate, independently review, and publish this scoped fix. The committed branch also passed the autoreview helper using its configured Claude Code model. No externally accessible agent session link is available.

The fix keeps existing event controls and missing-response rendering rather than adding an API. Human review is required before merge.

@marandaneto marandaneto self-assigned this Nov 12, 2026
@github-actions

Copy link
Copy Markdown
Contributor

posthog-dotnet Compliance Report

Date: 2026-11-12T10:30:33.547915+00:00
Duration: 124630ms

✅ All Tests Passed!

47/47 tests passed


Capture Tests

✅ 30/30 tests passed

View Details
Test Status Duration
Format Validation.Event Has Required Fields ✅ 203ms
Format Validation.Event Has Uuid ✅ 120ms
Format Validation.Event Has Lib Properties ✅ 109ms
Format Validation.Distinct Id Is String ✅ 112ms
Format Validation.Token Is Present ✅ 109ms
Format Validation.Custom Properties Preserved ✅ 113ms
Format Validation.Event Has Timestamp ✅ 108ms
Format Validation.Non Utc Event Timestamp Is Converted To Utc ✅ 117ms
Retry Behavior.Retries On 503 ✅ 8121ms
Retry Behavior.Does Not Retry On 400 ✅ 2114ms
Retry Behavior.Does Not Retry On 401 ✅ 2113ms
Retry Behavior.Respects Retry After Header ✅ 8116ms
Retry Behavior.Implements Backoff ✅ 22116ms
Retry Behavior.Retries On 500 ✅ 6116ms
Retry Behavior.Retries On 502 ✅ 6116ms
Retry Behavior.Retries On 504 ✅ 6115ms
Retry Behavior.Max Retries Respected ✅ 22129ms
Deduplication.Generates Unique Uuids ✅ 113ms
Deduplication.Preserves Uuid On Retry ✅ 6115ms
Deduplication.Preserves Uuid And Timestamp On Retry ✅ 13125ms
Deduplication.Preserves Uuid And Timestamp On Batch Retry ✅ 6119ms
Deduplication.No Duplicate Events In Batch ✅ 111ms
Deduplication.Different Events Have Different Uuids ✅ 109ms
Compression.Sends Gzip When Enabled ✅ 108ms
Batch Format.Uses Proper Batch Structure ✅ 107ms
Batch Format.Flush With No Events Sends Nothing ✅ 105ms
Batch Format.Multiple Events Batched Together ✅ 112ms
Error Handling.Does Not Retry On 403 ✅ 2110ms
Error Handling.Does Not Retry On 413 ✅ 2112ms
Error Handling.Retries On 408 ✅ 6114ms

Feature_Flags Tests

✅ 17/17 tests passed

View Details
Test Status Duration
Request Payload.Request With Person Properties Device Id ✅ 131ms
Request Payload.Flags Request Uses V2 Query Param ✅ 106ms
Request Payload.Flags Request Hits Flags Path Not Decide ✅ 106ms
Request Payload.Flags Request Omits Authorization Header ✅ 107ms
Request Payload.Token In Flags Body Matches Init ✅ 107ms
Request Payload.Groups Round Trip ✅ 110ms
Request Payload.Groups Default To Empty Object ✅ 107ms
Request Payload.Disable Geoip False Propagates As Geoip Disable False ✅ 107ms
Request Payload.Disable Geoip Omitted Defaults To False ✅ 107ms
Request Payload.Flag Keys To Evaluate Contains Only Requested Key ✅ 107ms
Request Lifecycle.No Flags Request On Init Alone ✅ 3ms
Request Lifecycle.No Flags Request On Normal Capture ✅ 106ms
Request Lifecycle.Two Flag Calls Produce Two Remote Requests ✅ 209ms
Request Lifecycle.Mock Response Value Is Returned To Caller ✅ 109ms
Retry Behavior.Retries Flags On 502 ✅ 1112ms
Retry Behavior.Retries Flags On 504 ✅ 1109ms
Side Effect Events.Get Feature Flag Captures Feature Flag Called Event ✅ 214ms

@github-actions

Copy link
Copy Markdown
Contributor

SDK performance: posthog-dotnet

9 changes worth reviewing: 9 observed regressions.

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.

Test Measurement Before PR With PR Change
Evaluate a flag (late match) Time per operation 5.35 µs/op 5.76 µs/op 7.8% more time
Evaluate a flag (no match) Time per operation 4.62 µs/op 4.97 µs/op 7.7% more time
Evaluate a flag (no match) Process CPU time per operation 4.63 µs/op 4.99 µs/op 7.7% more time
Evaluate a flag (late match) Process CPU time per operation 5.37 µs/op 5.78 µs/op 7.6% more time
Evaluate a flag (early match) Time per operation 3.95 µs/op 4.2 µs/op 6.2% more time
Evaluate a flag (early match) Process CPU time per operation 3.97 µs/op 4.21 µs/op 6.1% more time
Evaluate a cohort-filtered flag Process CPU time per operation 2.1 µs/op 2.22 µs/op 5.6% more time
Evaluate a cohort-filtered flag Time per operation 2.1 µs/op 2.21 µs/op 5.6% more time
Evaluate all 10 flags Process CPU time per operation 37.48 µs/op 39.36 µs/op 5% more time
View all results
Test Measurement Before PR With PR Change Assessment
Capture and deliver events (32-byte payload, burst) Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ CLR byte counters do not expose exact object allocation counts; native allocations are not included.​; head:​ CLR byte counters do not expose exact object allocation counts; native allocations are not included.​
Capture and deliver events (4,096-byte payload, burst) Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ CLR byte counters do not expose exact object allocation counts; native allocations are not included.​; head:​ CLR byte counters do not expose exact object allocation counts; native allocations are not included.​
Capture and deliver events (32-byte payload, steady) Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ CLR byte counters do not expose exact object allocation counts; native allocations are not included.​; head:​ CLR byte counters do not expose exact object allocation counts; native allocations are not included.​
Capture and deliver events (4,096-byte payload, steady) Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ CLR byte counters do not expose exact object allocation counts; native allocations are not included.​; head:​ CLR byte counters do not expose exact object allocation counts; native allocations are not included.​
Queue an event (32-byte payload) Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ CLR byte counters do not expose exact object allocation counts; native allocations are not included.​; head:​ CLR byte counters do not expose exact object allocation counts; native allocations are not included.​
Queue an event (4,096-byte payload) Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ CLR byte counters do not expose exact object allocation counts; native allocations are not included.​; head:​ CLR byte counters do not expose exact object allocation counts; native allocations are not included.​
Evaluate all 10 flags Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ CLR byte counters do not expose exact object allocation counts; native allocations are not included.​; head:​ CLR byte counters do not expose exact object allocation counts; native allocations are not included.​
Evaluate all 100 flags Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ CLR byte counters do not expose exact object allocation counts; native allocations are not included.​; head:​ CLR byte counters do not expose exact object allocation counts; native allocations are not included.​
Evaluate all 1,000 flags Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ CLR byte counters do not expose exact object allocation counts; native allocations are not included.​; head:​ CLR byte counters do not expose exact object allocation counts; native allocations are not included.​
Evaluate one boolean flag Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ CLR byte counters do not expose exact object allocation counts; native allocations are not included.​; head:​ CLR byte counters do not expose exact object allocation counts; native allocations are not included.​
Evaluate a cohort-filtered flag Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ CLR byte counters do not expose exact object allocation counts; native allocations are not included.​; head:​ CLR byte counters do not expose exact object allocation counts; native allocations are not included.​
Evaluate a flag (early match) Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ CLR byte counters do not expose exact object allocation counts; native allocations are not included.​; head:​ CLR byte counters do not expose exact object allocation counts; native allocations are not included.​
Evaluate a flag (late match) Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ CLR byte counters do not expose exact object allocation counts; native allocations are not included.​; head:​ CLR byte counters do not expose exact object allocation counts; native allocations are not included.​
Evaluate a flag (no match) Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ CLR byte counters do not expose exact object allocation counts; native allocations are not included.​; head:​ CLR byte counters do not expose exact object allocation counts; native allocations are not included.​
Evaluate a property-filtered flag Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ CLR byte counters do not expose exact object allocation counts; native allocations are not included.​; head:​ CLR byte counters do not expose exact object allocation counts; native allocations are not included.​
Evaluate a regex-filtered flag Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ CLR byte counters do not expose exact object allocation counts; native allocations are not included.​; head:​ CLR byte counters do not expose exact object allocation counts; native allocations are not included.​
Evaluate a rollout flag Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ CLR byte counters do not expose exact object allocation counts; native allocations are not included.​; head:​ CLR byte counters do not expose exact object allocation counts; native allocations are not included.​
Evaluate a multivariate flag Allocations per operation — — — unavailable; base:​ unsupported; head:​ unsupported; base:​ CLR byte counters do not expose exact object allocation counts; native allocations are not included.​; head:​ CLR byte counters do not expose exact object allocation counts; native allocations are not included.​
Capture and deliver events (32-byte payload, burst) Allocated memory per operation 5.37 KiB/op 5.37 KiB/op <0.1% more memory Not flagged
Capture and deliver events (32-byte payload, burst) Time per operation 5.82 µs/op 5.85 µs/op 0.6% more time Not flagged
Capture and deliver events (32-byte payload, burst) idle_managed_heap_bytes (estimated) 820.46 KiB 820.46 KiB No observed change Not flagged
Capture and deliver events (32-byte payload, burst) Idle process memory (RSS) 54.01 MiB 54.03 MiB <0.1% more memory Not flagged
Capture and deliver events (32-byte payload, burst) Observed peak process memory (RSS) 56.61 MiB 56.7 MiB 0.1% more memory Not flagged
Capture and deliver events (32-byte payload, burst) Managed heap after settling (estimated) 2.23 MiB 2.23 MiB No observed change Not flagged
Capture and deliver events (32-byte payload, burst) Process memory after settling (RSS) 56.71 MiB 56.79 MiB 0.1% more memory Not flagged
Capture and deliver events (32-byte payload, burst) Process CPU time per operation 5.86 µs/op 5.89 µs/op 0.5% more time Not flagged
Capture and deliver events (32-byte payload, burst) Lifetime peak process memory (RSS) 56.71 MiB 56.79 MiB 0.1% more memory Not flagged
Capture and deliver events (4,096-byte payload, burst) Allocated memory per operation 39.87 KiB/op 39.87 KiB/op <0.1% more memory Not flagged
Capture and deliver events (4,096-byte payload, burst) Time per operation 20.41 µs/op 20.52 µs/op 0.5% more time Not flagged
Capture and deliver events (4,096-byte payload, burst) idle_managed_heap_bytes (estimated) 2.13 MiB 2.13 MiB No observed change Not flagged
Capture and deliver events (4,096-byte payload, burst) Idle process memory (RSS) 55.94 MiB 55.83 MiB 0.2% less memory Not flagged
Capture and deliver events (4,096-byte payload, burst) Observed peak process memory (RSS) 81.07 MiB 80.96 MiB 0.1% less memory Not flagged
Capture and deliver events (4,096-byte payload, burst) Managed heap after settling (estimated) 25.63 MiB 25.63 MiB No observed change Not flagged
Capture and deliver events (4,096-byte payload, burst) Process memory after settling (RSS) 81.24 MiB 81.13 MiB 0.1% less memory Not flagged
Capture and deliver events (4,096-byte payload, burst) Process CPU time per operation 22.12 µs/op 22.21 µs/op 0.4% more time Not flagged
Capture and deliver events (4,096-byte payload, burst) Lifetime peak process memory (RSS) 81.24 MiB 81.13 MiB 0.1% less memory Not flagged
Capture and deliver events (32-byte payload, steady) Allocated memory per operation 18.15 KiB/op 18.15 KiB/op <0.1% less memory Not flagged
Capture and deliver events (32-byte payload, steady) Time per operation 10.23 µs/op 10.28 µs/op 0.4% more time Not flagged
Capture and deliver events (32-byte payload, steady) idle_managed_heap_bytes (estimated) 821.66 KiB 821.66 KiB No observed change Not flagged
Capture and deliver events (32-byte payload, steady) Idle process memory (RSS) 53.98 MiB 54.02 MiB <0.1% more memory Not flagged
Capture and deliver events (32-byte payload, steady) Observed peak process memory (RSS) 54.57 MiB 54.58 MiB <0.1% more memory Not flagged
Capture and deliver events (32-byte payload, steady) Managed heap after settling (estimated) 937.58 KiB 937.58 KiB No observed change Not flagged
Capture and deliver events (32-byte payload, steady) Process memory after settling (RSS) 54.55 MiB 54.57 MiB <0.1% more memory Not flagged
Capture and deliver events (32-byte payload, steady) Process CPU time per operation 10.35 µs/op 10.4 µs/op 0.5% more time Not flagged
Capture and deliver events (32-byte payload, steady) Lifetime peak process memory (RSS) 54.55 MiB 54.57 MiB <0.1% more memory Not flagged
Capture and deliver events (4,096-byte payload, steady) Allocated memory per operation 30.97 KiB/op 30.97 KiB/op <0.1% more memory Not flagged
Capture and deliver events (4,096-byte payload, steady) Time per operation 16.49 µs/op 16.29 µs/op 1.2% less time Not flagged
Capture and deliver events (4,096-byte payload, steady) idle_managed_heap_bytes (estimated) 2.13 MiB 2.13 MiB No observed change Not flagged
Capture and deliver events (4,096-byte payload, steady) Idle process memory (RSS) 55.91 MiB 55.84 MiB 0.1% less memory Not flagged
Capture and deliver events (4,096-byte payload, steady) Observed peak process memory (RSS) 63.22 MiB 63.26 MiB <0.1% more memory Not flagged
Capture and deliver events (4,096-byte payload, steady) Managed heap after settling (estimated) 3.12 MiB 3.12 MiB <0.1% less memory Not flagged
Capture and deliver events (4,096-byte payload, steady) Process memory after settling (RSS) 59.61 MiB 59.5 MiB 0.2% less memory Not flagged
Capture and deliver events (4,096-byte payload, steady) Process CPU time per operation 19.44 µs/op 19.22 µs/op 1.1% less time Not flagged
Capture and deliver events (4,096-byte payload, steady) Lifetime peak process memory (RSS) 63.14 MiB 63.14 MiB <0.1% less memory Not flagged
Queue an event (32-byte payload) Allocated memory per operation 1.67 KiB/op 1.67 KiB/op No observed change Not flagged
Queue an event (32-byte payload) Time per operation 1.89 µs/op 1.87 µs/op 0.9% less time Not flagged
Queue an event (32-byte payload) Process CPU time per operation 1.9 µs/op 1.88 µs/op 0.9% less time Not flagged
Queue an event (4,096-byte payload) Allocated memory per operation 1.67 KiB/op 1.67 KiB/op No observed change Not flagged
Queue an event (4,096-byte payload) Time per operation 1.77 µs/op 1.73 µs/op 2.5% less time Not flagged
Queue an event (4,096-byte payload) Process CPU time per operation 1.78 µs/op 1.74 µs/op 2.6% less time Not flagged
Evaluate all 10 flags Allocated memory per operation 23.91 KiB/op 23.91 KiB/op No observed change Not flagged
Evaluate all 10 flags Time per operation 37.45 µs/op 39.16 µs/op 4.6% more time Not flagged
Evaluate all 10 flags Process CPU time per operation 37.48 µs/op 39.36 µs/op 5% more time Worth reviewing: observed regression
Evaluate all 100 flags Allocated memory per operation 237.31 KiB/op 237.31 KiB/op No observed change Not flagged
Evaluate all 100 flags Time per operation 348.17 µs/op 349.97 µs/op 0.5% more time Not flagged
Evaluate all 100 flags Process CPU time per operation 349.16 µs/op 351.57 µs/op 0.7% more time Not flagged
Evaluate all 1,000 flags Allocated memory per operation 2.32 MiB/op 2.32 MiB/op No observed change Not flagged
Evaluate all 1,000 flags Time per operation 2.83 ms/op 2.89 ms/op 1.9% more time Not flagged
Evaluate all 1,000 flags Process CPU time per operation 2.83 ms/op 2.89 ms/op 1.9% more time Not flagged
Evaluate 1,000 flags under concurrent load idle_managed_heap_bytes (estimated) 4.65 MiB 4.68 MiB 0.5% more memory Not flagged
Evaluate 1,000 flags under concurrent load Idle process memory (RSS) 106.98 MiB 106.86 MiB 0.1% less memory Not flagged
Evaluate 1,000 flags under concurrent load Observed peak process memory (RSS) 112.67 MiB 112.63 MiB <0.1% less memory Not flagged
Evaluate 1,000 flags under concurrent load Managed heap after settling (estimated) 4.69 MiB 4.72 MiB 0.4% more memory Not flagged
Evaluate 1,000 flags under concurrent load Process memory after settling (RSS) 112.73 MiB 112.69 MiB <0.1% less memory Not flagged
Evaluate 1,000 flags under concurrent load Lifetime peak process memory (RSS) 112.73 MiB 112.69 MiB <0.1% less memory Not flagged
Refresh 1,000 flag definitions idle_managed_heap_bytes (estimated) 19.46 MiB 19.49 MiB 0.1% more memory Not flagged
Refresh 1,000 flag definitions Idle process memory (RSS) 135.27 MiB 134.03 MiB 0.9% less memory Not flagged
Refresh 1,000 flag definitions Observed peak process memory (RSS) 147.71 MiB 147.79 MiB <0.1% more memory Not flagged
Refresh 1,000 flag definitions Managed heap after settling (estimated) 20.45 MiB 20.48 MiB 0.1% more memory Not flagged
Refresh 1,000 flag definitions Process memory after settling (RSS) 146.56 MiB 145.29 MiB 0.9% less memory Not flagged
Refresh 1,000 flag definitions Lifetime peak process memory (RSS) 147.1 MiB 147.34 MiB 0.2% more memory Not flagged
Evaluate one boolean flag Allocated memory per operation 1.1 KiB/op 1.1 KiB/op No observed change Not flagged
Evaluate one boolean flag Time per operation 2.12 µs/op 2.18 µs/op 2.9% more time Not flagged
Evaluate one boolean flag Process CPU time per operation 2.12 µs/op 2.18 µs/op 2.9% more time Not flagged
Evaluate a cohort-filtered flag Allocated memory per operation 1.35 KiB/op 1.35 KiB/op No observed change Not flagged
Evaluate a cohort-filtered flag Time per operation 2.1 µs/op 2.21 µs/op 5.6% more time Worth reviewing: observed regression
Evaluate a cohort-filtered flag Process CPU time per operation 2.1 µs/op 2.22 µs/op 5.6% more time Worth reviewing: observed regression
Evaluate a flag (early match) Allocated memory per operation 2.95 KiB/op 2.95 KiB/op No observed change Not flagged
Evaluate a flag (early match) Time per operation 3.95 µs/op 4.2 µs/op 6.2% more time Worth reviewing: observed regression
Evaluate a flag (early match) Process CPU time per operation 3.97 µs/op 4.21 µs/op 6.1% more time Worth reviewing: observed regression
Evaluate a flag (late match) Allocated memory per operation 4.57 KiB/op 4.57 KiB/op No observed change Not flagged
Evaluate a flag (late match) Time per operation 5.35 µs/op 5.76 µs/op 7.8% more time Worth reviewing: observed regression
Evaluate a flag (late match) Process CPU time per operation 5.37 µs/op 5.78 µs/op 7.6% more time Worth reviewing: observed regression
Evaluate a flag (no match) Allocated memory per operation 4.34 KiB/op 4.34 KiB/op No observed change Not flagged
Evaluate a flag (no match) Time per operation 4.62 µs/op 4.97 µs/op 7.7% more time Worth reviewing: observed regression
Evaluate a flag (no match) Process CPU time per operation 4.63 µs/op 4.99 µs/op 7.7% more time Worth reviewing: observed regression
Evaluate a property-filtered flag Allocated memory per operation 1.32 KiB/op 1.32 KiB/op No observed change Not flagged
Evaluate a property-filtered flag Time per operation 1.98 µs/op 2.06 µs/op 4.2% more time Not flagged
Evaluate a property-filtered flag Process CPU time per operation 1.98 µs/op 2.06 µs/op 4.2% more time Not flagged
Evaluate a regex-filtered flag Allocated memory per operation 5.75 KiB/op 5.75 KiB/op No observed change Not flagged
Evaluate a regex-filtered flag Time per operation 8.43 µs/op 8.58 µs/op 1.8% more time Not flagged
Evaluate a regex-filtered flag Process CPU time per operation 8.44 µs/op 8.6 µs/op 1.8% more time Not flagged
Evaluate a rollout flag Allocated memory per operation 1.2 KiB/op 1.2 KiB/op No observed change Not flagged
Evaluate a rollout flag Time per operation 2.71 µs/op 2.75 µs/op 1.4% more time Not flagged
Evaluate a rollout flag Process CPU time per operation 2.71 µs/op 2.75 µs/op 1.3% more time Not flagged
Evaluate a multivariate flag Allocated memory per operation 1.24 KiB/op 1.24 KiB/op No observed change Not flagged
Evaluate a multivariate flag Time per operation 2.32 µs/op 2.37 µs/op 2.1% more time Not flagged
Evaluate a multivariate flag Process CPU time per operation 2.32 µs/op 2.37 µs/op 2.1% more time Not flagged

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.

Compared 6f08ed0acb3d8c80d4152f7528c4cebf876596ec → f9259d0694cb50ffd6a587755d78f1a55972ff28.

Full report and diagnostics

108 metric rows; 108 rows shown in all results. Omitted or shortened data remain in comparison.json, including per-runner environments, resource limits, measurement methods, samples and checkpoints.

@marandaneto
marandaneto marked this pull request as ready for review November 12, 2026 12:13
@marandaneto
marandaneto requested a review from a team as a code owner November 12, 2026 12:13
@veria-ai

veria-ai Bot commented Nov 12, 2026 •

Copy link
Copy Markdown

PR overview

No security issues were found in this pull request.

Reviews

@ioannisj ioannisj left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🤖 An AI agent wrote this on behalf of @ioannisj.

No findings. I checked the failed-record handling on the direct read and on the bulk local fallback against the spec, and the built-in caches keep the failed keys.

@marandaneto
marandaneto merged commit b4c58a7 into main Nov 13, 2026
22 checks passed
@marandaneto
marandaneto deleted the fix/spec211-failed-flags branch November 13, 2026 13:50
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