Number of records ACTUALLY removed.
OptionalfreedBytes reclaimed — known on the IndexedDB side only.
OptionaltotalStore size before eviction (bytes on IndexedDB, entry count on Cache API).
OptionaltotalStore size after eviction, same unit as totalBefore.
OptionalstoreWhich store evicted. Absent = IndexedDB, the historical shape.
OptionalreasonWhy. pressure = the ORIGIN quota is close to saturation; quota = a write was
refused. The worker's routine trim does not emit — it runs on every pan, and one
toast per map move teaches users to stop reading them.
Detail payload for
geoleaf:cache:evicted— a cache made room for itself.🛑 THERE ARE TWO PRODUCERS, AND THAT IS DELIBERATE. The pattern recommended elsewhere — a single emission point guarded by a test, precedent
editor-events.ts— is not reachable here: the two stores evict from different contexts, and no code can be shared between them.capabilities/offline/cache/cache-manager.ts(_enforceCacheQuota)maxCacheBytesbudget exceededkernel/storage/sw-core.js→kernel/storage/sw-register.tsThe second goes through a
postMessage: a Service Worker has nodocument, and it is copied verbatim into the deploy variants — it can import neither this contract nor the bus.sw-register.tsis the only place that re-establishes the signal ondocument.⚠️
freedBytesis absent on the Cache API side, and that is not an oversight: the Cache API exposes no entry size.offline-uialready omits the size when missing — fabricating a number would be worse than staying silent.