• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

Unleash / unleash / 32156839015
87%
master: 91%

Build:
Build:
LAST BUILD BRANCH: main
DEFAULT BRANCH: master
Ran 18 Aug 2026 03:55PM UTC
Jobs 1
Files 1210
Run time 3min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

18 Aug 2026 03:50PM UTC coverage: 87.428% (+0.004%) from 87.424%
32156839015

push

github

web-flow
perf: canonicalize strings at cache boundaries (#12541)

## Summary

- move string canonicalization from database row mappers to the caches
that retain client payloads
- give feature types, strategy names, constraint context names, and
operators independent bounded pools
- canonicalize both feature and segment constraints in global frontend
cache refreshes and delta cache hydration/updates
- stop paying canonicalization costs for transient client, frontend, and
playground reads

## Why

#12532 and #12538 demonstrated that sharing repeated low-cardinality
strings materially reduces the retained heap. The benefit comes from
long-lived cached object graphs, though, rather than from every object
produced by a read model.

Keeping one process-global pool in the row-mapping layer gives that
optimization a broader lifecycle and scope than the data it is meant to
optimize. Deleted values remain represented until restart, unrelated
field domains compete for the same 1,000 entries, and transient request
paths pay the hashing and lookup cost without retaining the resulting
objects.

This change makes canonicalization part of cache ownership instead:

- each `GlobalFrontendApiCache` refresh builds a canonical
representation for that cache generation; its lookup tables can be
collected after the generation is built
- each environment's `DeltaCache` owns its canonicalizer so incremental
feature and segment events reuse the hydration payload's representatives
- independent pools prevent high-cardinality strategy or context names
from displacing closed-set feature types and operators

This also covers constraints stored on segments, including incremental
delta segment updates, which were not canonicalized by the read-model
implementation.

Payload values and API behavior remain unchanged.

2012 of 2221 branches covered (90.59%)

55 of 55 new or added lines in 6 files covered. (100.0%)

4 existing lines in 2 files now uncovered.

15870 of 18152 relevant lines covered (87.43%)

631.42 hits per line

Coverage Regressions

Lines Coverage ∆ File
3
81.36
-1.69% src/lib/features/playground/feature-evaluator/constraint.ts
1
83.13
-1.2% src/lib/features/playground/feature-evaluator/client.ts
Jobs
ID Job ID Ran Files Coverage
1 32156839015.1 18 Aug 2026 03:55PM UTC 1210
87.43
GitHub Action Run
Source Files on build 32156839015
  • Tree
  • List 1210
  • Changed 8
  • Source Changed 6
  • Coverage Changed 8
Coverage ∆ File Lines Relevant Covered Missed Hits/Line Branch Hits Branch Misses
  • Back to Repo
  • Github Actions Build #32156839015
  • 11d92e48 on github
  • Prev Build on main (#32151132818)
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc