Oliver Kieselbach
83e15e49de
fix(core,backend): every payload-derived string stored into DecisionState is bounded (FactStringBounds, 256) and the reducer-verification replay streams signals — RealmJoinFacts.WithPackageStarted/Completed left PackageId/Version/Scope unbounded and deduped via a linear ordinal compare over up to 200 rows, so a forged 5000-signal stream with ~400 KB near-identical package ids cost minutes of CPU per GET sessions/{id}/reducer-verification while ReducerVerifier held all decoded payloads (~GBs) live; keys are now bounded BEFORE the dedupe scan (forged near-duplicates collapse to one row), Scope normalised to machine/user, and the same bound applied to failed app ids, HelloOutcome, ImeMatchedPatternId, EspAdvisoryFailureCategory and RJ product version/channel incl. WithVersionOverride — never truncating real telemetry (registry key names ≤ 255, GUIDs, enum-like strings); the agent adapter bounds packageId/version at the source; ReducerVerifier replays decode-fold-discard (head-signal check before the journal so stubbed streams stay silent, mid-stream truncation and count-imbalance semantics unchanged, pinned by tests); ISignalRepository.QueryBySessionAsync carries a cumulative PayloadJson budget (SignalQueryLimits, 32 M chars) reflected in the truncated flag of sessions/{id}/signals and reducer-verification; no ingest cap — stored signals stay verbatim
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-30 20:06:51 +02:00
..
2026-08-12 16:13:34 +02:00
2026-07-22 17:41:03 +02:00
2026-08-30 00:48:29 +02:00
2026-08-08 12:28:45 +02:00
fix(core,backend): every payload-derived string stored into DecisionState is bounded (FactStringBounds, 256) and the reducer-verification replay streams signals — RealmJoinFacts.WithPackageStarted/Completed left PackageId/Version/Scope unbounded and deduped via a linear ordinal compare over up to 200 rows, so a forged 5000-signal stream with ~400 KB near-identical package ids cost minutes of CPU per GET sessions/{id}/reducer-verification while ReducerVerifier held all decoded payloads (~GBs) live; keys are now bounded BEFORE the dedupe scan (forged near-duplicates collapse to one row), Scope normalised to machine/user, and the same bound applied to failed app ids, HelloOutcome, ImeMatchedPatternId, EspAdvisoryFailureCategory and RJ product version/channel incl. WithVersionOverride — never truncating real telemetry (registry key names ≤ 255, GUIDs, enum-like strings); the agent adapter bounds packageId/version at the source; ReducerVerifier replays decode-fold-discard (head-signal check before the journal so stubbed streams stay silent, mid-stream truncation and count-imbalance semantics unchanged, pinned by tests); ISignalRepository.QueryBySessionAsync carries a cumulative PayloadJson budget (SignalQueryLimits, 32 M chars) reflected in the truncated flag of sessions/{id}/signals and reducer-verification; no ingest cap — stored signals stay verbatim
2026-08-30 20:06:51 +02:00
2026-08-30 00:06:50 +02:00
2026-08-21 20:09:45 +02:00
2026-07-18 17:48:48 +02:00
2026-07-24 16:48:50 +02:00
2026-08-18 02:55:06 +02:00
2026-07-13 10:16:10 +02:00
2026-08-30 16:00:28 +02:00
2026-08-30 17:07:18 +02:00
2026-08-25 12:27:42 +02:00
2026-08-30 01:42:51 +02:00
2026-08-18 02:55:06 +02:00
2026-07-20 18:41:47 +02:00
2026-08-29 22:11:25 +02:00
2026-08-20 00:40:23 +02:00
2026-08-21 15:49:03 +02:00
2026-08-18 01:25:54 +02:00
2026-07-25 12:48:27 +02:00
2026-08-21 19:41:56 +02:00
2026-08-18 13:12:09 +02:00
2026-08-26 14:06:49 +02:00
2026-08-25 12:27:42 +02:00