@iann29/rastro 0.1.0-alpha.2 → 0.1.0-alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/README.md +325 -63
  2. package/agent/integration.md +651 -0
  3. package/agent/manifest.json +183 -0
  4. package/agent/manifest.schema.json +405 -0
  5. package/dist/client/federation.d.ts +205 -0
  6. package/dist/client/federation.d.ts.map +1 -0
  7. package/dist/client/federation.js +179 -0
  8. package/dist/client/federation.js.map +1 -0
  9. package/dist/client/index.d.ts +1600 -8
  10. package/dist/client/index.d.ts.map +1 -1
  11. package/dist/client/index.js +210 -2
  12. package/dist/client/index.js.map +1 -1
  13. package/dist/component/_generated/api.d.ts +9 -5
  14. package/dist/component/_generated/api.d.ts.map +1 -1
  15. package/dist/component/_generated/api.js.map +1 -1
  16. package/dist/component/_generated/component.d.ts +161 -1
  17. package/dist/component/_generated/component.d.ts.map +1 -1
  18. package/dist/component/_generated/server.d.ts +4 -0
  19. package/dist/component/_generated/server.d.ts.map +1 -1
  20. package/dist/component/_generated/server.js.map +1 -1
  21. package/dist/component/cardinality.d.ts +12 -0
  22. package/dist/component/cardinality.d.ts.map +1 -0
  23. package/dist/component/cardinality.js +94 -0
  24. package/dist/component/cardinality.js.map +1 -0
  25. package/dist/component/constants.d.ts +10 -0
  26. package/dist/component/constants.d.ts.map +1 -1
  27. package/dist/component/constants.js +10 -0
  28. package/dist/component/constants.js.map +1 -1
  29. package/dist/component/convex.config.d.ts +7 -2
  30. package/dist/component/convex.config.d.ts.map +1 -1
  31. package/dist/component/convex.config.js +9 -4
  32. package/dist/component/convex.config.js.map +1 -1
  33. package/dist/component/coverage.d.ts +18 -0
  34. package/dist/component/coverage.d.ts.map +1 -0
  35. package/dist/component/coverage.js +19 -0
  36. package/dist/component/coverage.js.map +1 -0
  37. package/dist/component/diagnostics.d.ts +9 -0
  38. package/dist/component/diagnostics.d.ts.map +1 -0
  39. package/dist/component/diagnostics.js +47 -0
  40. package/dist/component/diagnostics.js.map +1 -0
  41. package/dist/component/errors.d.ts +1 -1
  42. package/dist/component/errors.d.ts.map +1 -1
  43. package/dist/component/errors.js.map +1 -1
  44. package/dist/component/eventStore.d.ts +11 -9
  45. package/dist/component/eventStore.d.ts.map +1 -1
  46. package/dist/component/eventStore.js +55 -227
  47. package/dist/component/eventStore.js.map +1 -1
  48. package/dist/component/geo.d.ts +71 -0
  49. package/dist/component/geo.d.ts.map +1 -0
  50. package/dist/component/geo.js +610 -0
  51. package/dist/component/geo.js.map +1 -0
  52. package/dist/component/http.d.ts.map +1 -1
  53. package/dist/component/http.js +168 -17
  54. package/dist/component/http.js.map +1 -1
  55. package/dist/component/ingest.d.ts.map +1 -1
  56. package/dist/component/ingest.js +272 -32
  57. package/dist/component/ingest.js.map +1 -1
  58. package/dist/component/live.d.ts.map +1 -1
  59. package/dist/component/live.js +6 -3
  60. package/dist/component/live.js.map +1 -1
  61. package/dist/component/reports.d.ts +117 -8
  62. package/dist/component/reports.d.ts.map +1 -1
  63. package/dist/component/reports.js +641 -79
  64. package/dist/component/reports.js.map +1 -1
  65. package/dist/component/retention.d.ts +75 -1
  66. package/dist/component/retention.d.ts.map +1 -1
  67. package/dist/component/retention.js +517 -54
  68. package/dist/component/retention.js.map +1 -1
  69. package/dist/component/sanitize.d.ts +4 -1
  70. package/dist/component/sanitize.d.ts.map +1 -1
  71. package/dist/component/sanitize.js +9 -4
  72. package/dist/component/sanitize.js.map +1 -1
  73. package/dist/component/schema.d.ts +202 -53
  74. package/dist/component/schema.js +113 -16
  75. package/dist/component/schema.js.map +1 -1
  76. package/dist/component/sites.d.ts.map +1 -1
  77. package/dist/component/sites.js +5 -1
  78. package/dist/component/sites.js.map +1 -1
  79. package/dist/component/validators.d.ts +29 -51
  80. package/dist/component/validators.d.ts.map +1 -1
  81. package/dist/component/validators.js +11 -12
  82. package/dist/component/validators.js.map +1 -1
  83. package/dist/tracker/generated.d.ts +4 -4
  84. package/dist/tracker/generated.d.ts.map +1 -1
  85. package/dist/tracker/generated.js +4 -4
  86. package/dist/tracker/generated.js.map +1 -1
  87. package/dist/tracker/tracker.js +7 -6
  88. package/dist/tracker/tracker.js.map +1 -1
  89. package/dist/tracker.min.js +1 -1
  90. package/docs/benchmarks/2026-08-20-realistic.md +5 -5
  91. package/docs/benchmarks/2026-08-21-formal-certification.md +333 -0
  92. package/docs/federation-setup.md +395 -0
  93. package/docs/federation.md +258 -0
  94. package/docs/upgrading.md +130 -0
  95. package/llms.txt +65 -0
  96. package/package.json +29 -7
  97. package/scripts/benchmark-ingest.mjs +81 -32
  98. package/scripts/generate-federation-keys.mjs +20 -0
  99. package/src/component/_generated/api.ts +9 -5
  100. package/src/component/_generated/component.ts +224 -1
  101. package/src/component/_generated/server.ts +4 -0
  102. package/src/component/cardinality.ts +116 -0
  103. package/src/component/constants.ts +10 -0
  104. package/src/component/convex.config.ts +11 -5
  105. package/src/component/coverage.ts +25 -0
  106. package/src/component/diagnostics.ts +64 -0
  107. package/src/component/errors.ts +2 -1
  108. package/src/component/eventStore.ts +78 -280
  109. package/src/component/geo.ts +779 -0
  110. package/src/component/http.ts +259 -22
  111. package/src/component/ingest.ts +436 -27
  112. package/src/component/live.ts +8 -3
  113. package/src/component/reports.ts +895 -87
  114. package/src/component/retention.ts +624 -88
  115. package/src/component/sanitize.ts +15 -4
  116. package/src/component/schema.ts +125 -16
  117. package/src/component/sites.ts +5 -1
  118. package/src/component/validators.ts +12 -13
  119. package/src/test.ts +0 -2
  120. package/dist/component/migrations.d.ts +0 -17
  121. package/dist/component/migrations.d.ts.map +0 -1
  122. package/dist/component/migrations.js +0 -44
  123. package/dist/component/migrations.js.map +0 -1
  124. package/src/component/migrations.ts +0 -52
@@ -2,7 +2,8 @@
2
2
  (() => {
3
3
  const script = document.currentScript;
4
4
  const siteId = script?.dataset.site;
5
- const endpoint = script?.dataset.endpoint || script?.src.replace(/tracker\.js.*$/, "events");
5
+ const endpoint = script?.dataset.endpoint ||
6
+ (script?.src && new URL("events", script.src).href);
6
7
  if (!siteId || !endpoint)
7
8
  return;
8
9
  const createId = () => crypto.randomUUID?.() || Math.random() + "";
@@ -50,7 +51,7 @@
50
51
  const emit = (type, name, extra) => {
51
52
  const timestamp = Date.now();
52
53
  queue.push({
53
- eventId: `${sessionId}.${timestamp.toString(36)}.${sequence.toString(36)}`,
54
+ eventId: `${sessionId}.${timestamp.toString(36)}.${sequence}`,
54
55
  sessionId,
55
56
  visitorId,
56
57
  type,
@@ -88,8 +89,8 @@
88
89
  return;
89
90
  const name = element.dataset.rastroEvent;
90
91
  const href = element.href;
91
- const url = href ? new URL(href) : undefined;
92
- const web = url?.protocol === "http:" || url?.protocol === "https:";
92
+ const url = (href && new URL(href));
93
+ const web = /^https?:$/.test(url?.protocol);
93
94
  emit(name
94
95
  ? "custom"
95
96
  : web && url.origin !== location.origin
@@ -101,8 +102,8 @@
101
102
  }, true);
102
103
  const wrapHistory = (method) => {
103
104
  const native = history[method];
104
- history[method] = function (data, unused, url) {
105
- native.call(history, data, unused, url);
105
+ history[method] = function (...args) {
106
+ native.apply(history, args);
106
107
  pageview();
107
108
  };
108
109
  };
@@ -1 +1 @@
1
- {"version":3,"file":"tracker.js","sourceRoot":"","sources":["../../src/tracker/tracker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tracker.js","sourceRoot":"","sources":["../../src/tracker/tracker.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- "use strict";(()=>{const t=document.currentScript,e=t?.dataset.site,o=t?.dataset.endpoint||t?.src.replace(/tracker\.js.*$/,"events");if(!e||!o)return;const s=()=>crypto.randomUUID?.()||Math.random()+"",n=new URLSearchParams(location.search).get("ref")?.slice(0,64);let r,a;try{r=sessionStorage._r||s(),sessionStorage._r=r,a=n||sessionStorage._a,a&&(sessionStorage._a=a)}catch{r=s(),a=n}const i=t.dataset.visitor||r;let c,d=0;const l=[],h=document.referrer?new URL(document.referrer).origin:void 0,p=t=>{const s=l.splice(0,50);if(!s.length)return;const n=()=>new Blob([JSON.stringify({siteId:e,events:s})]);let r=n();for(;r.size>64e3&&s.length>1;)l.unshift(s.pop()),r=n();t&&navigator.sendBeacon(o,r)||fetch(o,{method:"POST",body:r,keepalive:1}).catch(()=>{}),l.length&&p(t)},g=(t,e,o)=>{const s=Date.now();l.push({eventId:`${r}.${s.toString(36)}.${d.toString(36)}`,sessionId:r,visitorId:i,type:t,name:e,path:location.pathname.slice(0,256),referrer:h,timestamp:s,sequence:d++,affiliateSlug:a,...o}),clearTimeout(c),c=setTimeout(p,1200)};let u;const v=()=>{const t=location.pathname;t!==u&&(u=t,g("pageview"))};window.rastro=(t,e,o)=>{if("context"===t)return{sessionId:r,visitorId:i};"event"===t&&g("custom",`${e||"event"}`.slice(0,80),o&&JSON.stringify(o).length>2e4?void 0:{properties:o})},document.addEventListener("click",t=>{const e=t.target?.closest("a,button,[data-rastro-event]");if(!e)return;const o=e.dataset.rastroEvent,s=e.href,n=s?new URL(s):void 0,r="http:"===n?.protocol||"https:"===n?.protocol;g(o?"custom":r&&n.origin!==location.origin?"outbound":"click",o,{target:(e.dataset.rastroLabel||e.tagName).slice(0,80),href:r?n.pathname.slice(0,256):void 0})},1);const m=t=>{const e=history[t];history[t]=function(t,o,s){e.call(history,t,o,s),v()}};m("pushState"),m("replaceState"),addEventListener("popstate",v),addEventListener("pagehide",()=>p(1)),setInterval(()=>{g("heartbeat"),p()},2e4),v()})();
1
+ (()=>{const e=document.currentScript,t=e?.dataset.site,s=e?.dataset.endpoint||e?.src&&new URL("events",e.src).href;if(!t||!s)return;const n=()=>crypto.randomUUID?.()||Math.random()+"",o=new URLSearchParams(location.search).get("ref")?.slice(0,64);let r,a;try{r=sessionStorage._r||n(),sessionStorage._r=r,a=o||sessionStorage._a,a&&(sessionStorage._a=a)}catch{r=n(),a=o}const i=e.dataset.visitor||r;let c,d=0;const l=[],h=document.referrer?new URL(document.referrer).origin:void 0,p=e=>{const n=l.splice(0,50);if(!n.length)return;const o=()=>new Blob([JSON.stringify({siteId:t,events:n})]);let r=o();for(;r.size>64e3&&n.length>1;)l.unshift(n.pop()),r=o();e&&navigator.sendBeacon(s,r)||fetch(s,{method:"POST",body:r,keepalive:1}).catch(()=>{}),l.length&&p(e)},g=(e,t,s)=>{const n=Date.now();l.push({eventId:`${r}.${n.toString(36)}.${d}`,sessionId:r,visitorId:i,type:e,name:t,path:location.pathname.slice(0,256),referrer:h,timestamp:n,sequence:d++,affiliateSlug:a,...s}),clearTimeout(c),c=setTimeout(p,1200)};let u;const v=()=>{const e=location.pathname;e!==u&&(u=e,g("pageview"))};window.rastro=(e,t,s)=>{if("context"===e)return{sessionId:r,visitorId:i};"event"===e&&g("custom",`${t||"event"}`.slice(0,80),s&&JSON.stringify(s).length>2e4?void 0:{properties:s})},document.addEventListener("click",e=>{const t=e.target?.closest("a,button,[data-rastro-event]");if(!t)return;const s=t.dataset.rastroEvent,n=t.href,o=n&&new URL(n),r=/^https?:$/.test(o?.protocol);g(s?"custom":r&&o.origin!==location.origin?"outbound":"click",s,{target:(t.dataset.rastroLabel||t.tagName).slice(0,80),href:r?o.pathname.slice(0,256):void 0})},1);const m=e=>{const t=history[e];history[e]=(...e)=>{t.apply(history,e),v()}};m("pushState"),m("replaceState"),addEventListener("popstate",v),addEventListener("pagehide",()=>p(1)),setInterval(()=>{g("heartbeat"),p()},2e4),v()})();
@@ -12,10 +12,10 @@ It is a historical engineering record, not a production SLA.
12
12
  preserve a run-scoped JSON artifact with aggregate reconciliation.
13
13
  - A later smoke against the final PR code reconciled every expected stored
14
14
  event, but lasted only 30 seconds.
15
- - Formal certification of the merged commit is therefore **pending** a new
16
- 600-second run using `--certify` on a dedicated idle site.
17
- - Heavy-payload, browser-feature, and trusted-conversion workloads have not
18
- received equivalent sustained certification.
15
+ - This historical gap was closed by the four-profile runs recorded in
16
+ [`2026-08-21-formal-certification.md`](2026-08-21-formal-certification.md).
17
+ Lean and realistic exceeded 100 million stored events/day; heavy and feature
18
+ completed cleanly below that target. Trusted conversions remain pending.
19
19
 
20
20
  Do not collapse these statements into a generic claim that every workload is
21
21
  certified for 100 million stored events/day.
@@ -150,7 +150,7 @@ A passing harness certification must include:
150
150
  - `certification.requested: true` and `certification.passed: true`;
151
151
  - zero request failures, duplicate events, rejected events, and failed events;
152
152
  - completed request accounting;
153
- - reliable and exact aggregate reconciliation;
153
+ - reliable and exact run-session reconciliation;
154
154
  - separate accepted and stored throughput/capacity fields.
155
155
 
156
156
  Release evidence should additionally record deployment health and successful
@@ -0,0 +1,333 @@
1
+ # Formal ingest certification, 2026-08-21
2
+
3
+ This report preserves four isolated ten-minute benchmark runs against the
4
+ non-production Synapse canary. It is engineering evidence for the tested commit
5
+ and deployment, not a production SLA.
6
+
7
+ ## Environment
8
+
9
+ | Item | Value |
10
+ | --- | --- |
11
+ | Git commit | `e6ae92658c86c1931e697fa2a38c80fd902f7afa` |
12
+ | Package version | `0.1.0-alpha.3` |
13
+ | Deployment | DEV `fast-finch-7454` |
14
+ | Benchmark site | `kx75pnr9wap522n0zmh4nnb4jh8cv110` |
15
+ | Driver | One local Node.js process |
16
+ | Reconciliation | Exact run-scoped session IDs, indexed pages of 100 |
17
+ | Health before/after | `ok: true` |
18
+ | GeoIP provider | Disabled |
19
+
20
+ All runs used `--duration 600 --certify`. Runs were sequential so the profiles
21
+ did not compete with each other. A harness certification means the run lasted
22
+ the required duration, had clean request accounting, and reconciled every
23
+ expected stored event. Meeting the separate 100 million stored-events/day target
24
+ requires at least 1,157.41 stored events/second.
25
+
26
+ ## Results
27
+
28
+ | Profile | Concurrency | Batch | Accepted | Stored | Stored/s | Certified stored/day | p95 | Exact reconciliation | 100M/day target |
29
+ | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- | --- |
30
+ | Lean | 100 | 50 | 952,600 | 952,600 | 1,582 | 136,654,617 | 4,543 ms | 952,600 / 952,600 | Pass |
31
+ | Realistic | 75 | 50 | 885,700 | 842,080 | 1,398 | 120,808,947 | 4,247 ms | 842,080 / 842,080 | Pass |
32
+ | Heavy | 100 | 20 | 353,980 | 353,980 | 588 | 50,769,480 | 5,787 ms | 353,980 / 353,980 | **Below target** |
33
+ | Feature | 100 | 15 | 232,170 | 232,170 | 384 | 33,218,356 | 6,226 ms | 232,170 / 232,170 | **Below target** |
34
+
35
+ The realistic run accepted 43,620 heartbeats, which intentionally update live
36
+ presence without increasing persistent event counts. Its accepted-versus-stored
37
+ difference is therefore exact. The heavy request measured 62,054 bytes and
38
+ sustained 1,828,443 request bytes/second below the 64 KiB HTTP body limit.
39
+
40
+ ## Heavy recertification after byte-accounting optimization
41
+
42
+ Commit `4460ad34314a6e15c24a0c78aab6e6ce85db5c60` reused each event's
43
+ exact UTF-8 byte measurement for both batch validation and rate limits, removing
44
+ one full-payload serialization from the ingestion transaction. A new isolated
45
+ ten-minute run on 2026-08-22 used the same deployment, site, concurrency, batch
46
+ size, and heavy payload.
47
+
48
+ | Result | Original | Recertified | Change |
49
+ | --- | ---: | ---: | ---: |
50
+ | Stored events/s | 588 | 887 | +50.9% |
51
+ | Certified stored/day | 50,769,480 | 76,623,702 | +50.9% |
52
+ | Request bytes/s | 1,828,443 | 2,759,875 | +50.9% |
53
+ | p95 latency | 5,787 ms | 3,670 ms | -36.6% |
54
+
55
+ The recertification remained below the separate 100 million events/day target,
56
+ but raised the measured heavy-payload ceiling without changing payload shape or
57
+ weakening validation, rate limits, or reconciliation.
58
+
59
+ ```json
60
+ {
61
+ "label": "heavy-2026-08-22T04:03:22.517Z",
62
+ "runId": "f3943151-bc71-4806-b609-69faf8bdfb0c",
63
+ "profile": "heavy",
64
+ "targetDurationSeconds": 600,
65
+ "elapsedMs": 601726,
66
+ "terminationReason": "duration",
67
+ "durationCompleted": true,
68
+ "certification": { "requested": true, "passed": true, "minimumDurationSeconds": 600 },
69
+ "concurrency": 100,
70
+ "batchSize": 20,
71
+ "sessionPool": 2048,
72
+ "maximumRequests": null,
73
+ "requests": { "started": 26682, "completed": 26682, "failures": 0 },
74
+ "events": {
75
+ "sent": 533640,
76
+ "heartbeats": 0,
77
+ "accepted": 533640,
78
+ "stored": 533640,
79
+ "duplicates": 0,
80
+ "rejected": 0,
81
+ "failed": 0
82
+ },
83
+ "errors": {},
84
+ "throughput": {
85
+ "eventsPerSecond": 887,
86
+ "storedEventsPerSecond": 887,
87
+ "estimatedEventsPerDay": 76623702,
88
+ "estimatedStoredEventsPerDay": 76623702,
89
+ "certifiedEventsPerDay": 76623702,
90
+ "certifiedStoredEventsPerDay": 76623702,
91
+ "requestBytesPerSecond": 2759875
92
+ },
93
+ "latencyMs": { "p50": 2035, "p95": 3670, "p99": 4755, "max": 8139 },
94
+ "reconciliation": {
95
+ "scope": "run-session-ids",
96
+ "reliable": true,
97
+ "expectedSessions": 2048,
98
+ "requestedSessions": 2048,
99
+ "foundSessions": 2048,
100
+ "acceptedEvents": 533640,
101
+ "acceptedHeartbeats": 0,
102
+ "expectedStoredEvents": 533640,
103
+ "storedEvents": 533640,
104
+ "matches": true
105
+ }
106
+ }
107
+ ```
108
+
109
+ ## Run artifacts
110
+
111
+ ### Lean
112
+
113
+ ```json
114
+ {
115
+ "label": "lean-2026-08-21T13:31:27.434Z",
116
+ "runId": "41788de1-964e-4315-8b00-f295e202f2e0",
117
+ "profile": "lean",
118
+ "targetDurationSeconds": 600,
119
+ "elapsedMs": 602282,
120
+ "terminationReason": "duration",
121
+ "durationCompleted": true,
122
+ "certification": { "requested": true, "passed": true, "minimumDurationSeconds": 600 },
123
+ "concurrency": 100,
124
+ "batchSize": 50,
125
+ "sessionPool": "unique-per-request",
126
+ "maximumRequests": null,
127
+ "requests": { "started": 19052, "completed": 19052, "failures": 0 },
128
+ "events": {
129
+ "sent": 952600,
130
+ "heartbeats": 0,
131
+ "accepted": 952600,
132
+ "stored": 952600,
133
+ "duplicates": 0,
134
+ "rejected": 0,
135
+ "failed": 0
136
+ },
137
+ "errors": {},
138
+ "throughput": {
139
+ "eventsPerSecond": 1582,
140
+ "storedEventsPerSecond": 1582,
141
+ "estimatedEventsPerDay": 136654617,
142
+ "estimatedStoredEventsPerDay": 136654617,
143
+ "certifiedEventsPerDay": 136654617,
144
+ "certifiedStoredEventsPerDay": 136654617,
145
+ "requestBytesPerSecond": 438830
146
+ },
147
+ "latencyMs": { "p50": 2979, "p95": 4543, "p99": 5217, "max": 5628 },
148
+ "reconciliation": {
149
+ "scope": "run-session-ids",
150
+ "reliable": true,
151
+ "expectedSessions": 19052,
152
+ "requestedSessions": 19052,
153
+ "foundSessions": 19052,
154
+ "acceptedEvents": 952600,
155
+ "acceptedHeartbeats": 0,
156
+ "expectedStoredEvents": 952600,
157
+ "storedEvents": 952600,
158
+ "matches": true
159
+ }
160
+ }
161
+ ```
162
+
163
+ ### Realistic
164
+
165
+ ```json
166
+ {
167
+ "label": "realistic-2026-08-21T13:42:07.118Z",
168
+ "runId": "8a883d9a-537a-4ce5-b300-be77995ba5da",
169
+ "profile": "realistic",
170
+ "targetDurationSeconds": 600,
171
+ "elapsedMs": 602238,
172
+ "terminationReason": "duration",
173
+ "durationCompleted": true,
174
+ "certification": { "requested": true, "passed": true, "minimumDurationSeconds": 600 },
175
+ "concurrency": 75,
176
+ "batchSize": 50,
177
+ "sessionPool": 2048,
178
+ "maximumRequests": null,
179
+ "requests": { "started": 17714, "completed": 17714, "failures": 0 },
180
+ "events": {
181
+ "sent": 885700,
182
+ "heartbeats": 43620,
183
+ "accepted": 885700,
184
+ "stored": 842080,
185
+ "duplicates": 0,
186
+ "rejected": 0,
187
+ "failed": 0
188
+ },
189
+ "errors": {},
190
+ "throughput": {
191
+ "eventsPerSecond": 1471,
192
+ "storedEventsPerSecond": 1398,
193
+ "estimatedEventsPerDay": 127066887,
194
+ "estimatedStoredEventsPerDay": 120808947,
195
+ "certifiedEventsPerDay": 127066887,
196
+ "certifiedStoredEventsPerDay": 120808947,
197
+ "requestBytesPerSecond": 445267
198
+ },
199
+ "latencyMs": { "p50": 2257, "p95": 4247, "p99": 5122, "max": 6133 },
200
+ "reconciliation": {
201
+ "scope": "run-session-ids",
202
+ "reliable": true,
203
+ "expectedSessions": 2048,
204
+ "requestedSessions": 2048,
205
+ "foundSessions": 2048,
206
+ "acceptedEvents": 885700,
207
+ "acceptedHeartbeats": 43620,
208
+ "expectedStoredEvents": 842080,
209
+ "storedEvents": 842080,
210
+ "matches": true
211
+ }
212
+ }
213
+ ```
214
+
215
+ ### Heavy
216
+
217
+ ```json
218
+ {
219
+ "label": "heavy-2026-08-21T13:52:43.382Z",
220
+ "runId": "8cd7221e-2e33-4e94-9f9d-13bb4a84c60e",
221
+ "profile": "heavy",
222
+ "targetDurationSeconds": 600,
223
+ "elapsedMs": 602407,
224
+ "terminationReason": "duration",
225
+ "durationCompleted": true,
226
+ "certification": { "requested": true, "passed": true, "minimumDurationSeconds": 600 },
227
+ "concurrency": 100,
228
+ "batchSize": 20,
229
+ "sessionPool": 2048,
230
+ "maximumRequests": null,
231
+ "requests": { "started": 17699, "completed": 17699, "failures": 0 },
232
+ "events": {
233
+ "sent": 353980,
234
+ "heartbeats": 0,
235
+ "accepted": 353980,
236
+ "stored": 353980,
237
+ "duplicates": 0,
238
+ "rejected": 0,
239
+ "failed": 0
240
+ },
241
+ "errors": {},
242
+ "throughput": {
243
+ "eventsPerSecond": 588,
244
+ "storedEventsPerSecond": 588,
245
+ "estimatedEventsPerDay": 50769480,
246
+ "estimatedStoredEventsPerDay": 50769480,
247
+ "certifiedEventsPerDay": 50769480,
248
+ "certifiedStoredEventsPerDay": 50769480,
249
+ "requestBytesPerSecond": 1828443
250
+ },
251
+ "latencyMs": { "p50": 2968, "p95": 5787, "p99": 6942, "max": 7839 },
252
+ "reconciliation": {
253
+ "scope": "run-session-ids",
254
+ "reliable": true,
255
+ "expectedSessions": 2048,
256
+ "requestedSessions": 2048,
257
+ "foundSessions": 2048,
258
+ "acceptedEvents": 353980,
259
+ "acceptedHeartbeats": 0,
260
+ "expectedStoredEvents": 353980,
261
+ "storedEvents": 353980,
262
+ "matches": true
263
+ }
264
+ }
265
+ ```
266
+
267
+ ### Feature
268
+
269
+ ```json
270
+ {
271
+ "label": "feature-2026-08-21T14:03:20.654Z",
272
+ "runId": "8e60bc5f-6fff-4791-b02c-0e7340767b55",
273
+ "profile": "feature",
274
+ "targetDurationSeconds": 600,
275
+ "elapsedMs": 603868,
276
+ "terminationReason": "duration",
277
+ "durationCompleted": true,
278
+ "certification": { "requested": true, "passed": true, "minimumDurationSeconds": 600 },
279
+ "concurrency": 100,
280
+ "batchSize": 15,
281
+ "sessionPool": 2048,
282
+ "maximumRequests": null,
283
+ "requests": { "started": 15478, "completed": 15478, "failures": 0 },
284
+ "events": {
285
+ "sent": 232170,
286
+ "heartbeats": 0,
287
+ "accepted": 232170,
288
+ "stored": 232170,
289
+ "duplicates": 0,
290
+ "rejected": 0,
291
+ "failed": 0
292
+ },
293
+ "errors": {},
294
+ "throughput": {
295
+ "eventsPerSecond": 384,
296
+ "storedEventsPerSecond": 384,
297
+ "estimatedEventsPerDay": 33218356,
298
+ "estimatedStoredEventsPerDay": 33218356,
299
+ "certifiedEventsPerDay": 33218356,
300
+ "certifiedStoredEventsPerDay": 33218356,
301
+ "requestBytesPerSecond": 119846
302
+ },
303
+ "latencyMs": { "p50": 3523, "p95": 6226, "p99": 7722, "max": 8524 },
304
+ "reconciliation": {
305
+ "scope": "run-session-ids",
306
+ "reliable": true,
307
+ "expectedSessions": 2048,
308
+ "requestedSessions": 2048,
309
+ "foundSessions": 2048,
310
+ "acceptedEvents": 232170,
311
+ "acceptedHeartbeats": 0,
312
+ "expectedStoredEvents": 232170,
313
+ "storedEvents": 232170,
314
+ "matches": true
315
+ }
316
+ }
317
+ ```
318
+
319
+ ## Conclusions
320
+
321
+ - Lean and realistic traffic exceeded 100 million stored events/day for a full
322
+ ten minutes with exact reconciliation and no failures.
323
+ - Heavy and feature traffic completed cleanly but did not meet the 100 million
324
+ stored-events/day target at the tested payloads and concurrency. The latest
325
+ heavy ceiling is 76.62 million events/day after recertification.
326
+ - The updated heavy result demonstrates a different ceiling: 2.76 MB/s of
327
+ near-limit requests. It must not be generalized to minimal or realistic
328
+ payloads.
329
+ - Trusted financial conversions were not exercised. They require a separate
330
+ server-side driver because browser traffic cannot cross the financial trust
331
+ boundary.
332
+ - GeoIP provider behavior was not benchmarked because provider enrichment was
333
+ disabled on this deployment.