@uptimizr/db 2.0.1 → 2.1.0

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 (171) hide show
  1. package/AGENTS.md +228 -3
  2. package/README.md +13 -0
  3. package/dist/duckdb/migrations.d.ts.map +1 -1
  4. package/dist/duckdb/migrations.js +169 -0
  5. package/dist/duckdb/migrations.js.map +1 -1
  6. package/dist/duckdb/panelSpecs.d.ts +29 -0
  7. package/dist/duckdb/panelSpecs.d.ts.map +1 -0
  8. package/dist/duckdb/panelSpecs.js +104 -0
  9. package/dist/duckdb/panelSpecs.js.map +1 -0
  10. package/dist/duckdb/projectMetadata.d.ts +43 -0
  11. package/dist/duckdb/projectMetadata.d.ts.map +1 -0
  12. package/dist/duckdb/projectMetadata.js +222 -0
  13. package/dist/duckdb/projectMetadata.js.map +1 -0
  14. package/dist/duckdb/subscriptions.d.ts +45 -0
  15. package/dist/duckdb/subscriptions.d.ts.map +1 -0
  16. package/dist/duckdb/subscriptions.js +202 -0
  17. package/dist/duckdb/subscriptions.js.map +1 -0
  18. package/dist/index.d.ts +18 -4
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +48 -3
  21. package/dist/index.js.map +1 -1
  22. package/dist/insights/anomalies.d.ts +213 -0
  23. package/dist/insights/anomalies.d.ts.map +1 -0
  24. package/dist/insights/anomalies.js +340 -0
  25. package/dist/insights/anomalies.js.map +1 -0
  26. package/dist/insights/baseline.d.ts +51 -0
  27. package/dist/insights/baseline.d.ts.map +1 -0
  28. package/dist/insights/baseline.js +48 -0
  29. package/dist/insights/baseline.js.map +1 -0
  30. package/dist/insights/buckets.d.ts +114 -0
  31. package/dist/insights/buckets.d.ts.map +1 -0
  32. package/dist/insights/buckets.js +220 -0
  33. package/dist/insights/buckets.js.map +1 -0
  34. package/dist/insights/changepoint.d.ts +130 -0
  35. package/dist/insights/changepoint.d.ts.map +1 -0
  36. package/dist/insights/changepoint.js +209 -0
  37. package/dist/insights/changepoint.js.map +1 -0
  38. package/dist/insights/evaluate.d.ts +63 -0
  39. package/dist/insights/evaluate.d.ts.map +1 -0
  40. package/dist/insights/evaluate.js +158 -0
  41. package/dist/insights/evaluate.js.map +1 -0
  42. package/dist/insights/health.d.ts +219 -0
  43. package/dist/insights/health.d.ts.map +1 -0
  44. package/dist/insights/health.js +349 -0
  45. package/dist/insights/health.js.map +1 -0
  46. package/dist/insights/index.d.ts +45 -0
  47. package/dist/insights/index.d.ts.map +1 -0
  48. package/dist/insights/index.js +40 -0
  49. package/dist/insights/index.js.map +1 -0
  50. package/dist/insights/measures.d.ts +222 -0
  51. package/dist/insights/measures.d.ts.map +1 -0
  52. package/dist/insights/measures.js +431 -0
  53. package/dist/insights/measures.js.map +1 -0
  54. package/dist/insights/movers.d.ts +123 -0
  55. package/dist/insights/movers.d.ts.map +1 -0
  56. package/dist/insights/movers.js +166 -0
  57. package/dist/insights/movers.js.map +1 -0
  58. package/dist/insights/significance.d.ts +221 -0
  59. package/dist/insights/significance.d.ts.map +1 -0
  60. package/dist/insights/significance.js +531 -0
  61. package/dist/insights/significance.js.map +1 -0
  62. package/dist/insights/stats.d.ts +104 -0
  63. package/dist/insights/stats.d.ts.map +1 -0
  64. package/dist/insights/stats.js +181 -0
  65. package/dist/insights/stats.js.map +1 -0
  66. package/dist/insights/windows.d.ts +95 -0
  67. package/dist/insights/windows.d.ts.map +1 -0
  68. package/dist/insights/windows.js +97 -0
  69. package/dist/insights/windows.js.map +1 -0
  70. package/dist/metadata.d.ts +178 -1
  71. package/dist/metadata.d.ts.map +1 -1
  72. package/dist/metadata.js +80 -0
  73. package/dist/metadata.js.map +1 -1
  74. package/dist/narrative/build.d.ts +78 -0
  75. package/dist/narrative/build.d.ts.map +1 -0
  76. package/dist/narrative/build.js +437 -0
  77. package/dist/narrative/build.js.map +1 -0
  78. package/dist/narrative/index.d.ts +14 -0
  79. package/dist/narrative/index.d.ts.map +1 -0
  80. package/dist/narrative/index.js +13 -0
  81. package/dist/narrative/index.js.map +1 -0
  82. package/dist/narrative/text.d.ts +25 -0
  83. package/dist/narrative/text.d.ts.map +1 -0
  84. package/dist/narrative/text.js +41 -0
  85. package/dist/narrative/text.js.map +1 -0
  86. package/dist/parity/cases.d.ts +3 -0
  87. package/dist/parity/cases.d.ts.map +1 -1
  88. package/dist/parity/cases.js +387 -7
  89. package/dist/parity/cases.js.map +1 -1
  90. package/dist/parity/compare.d.ts +19 -0
  91. package/dist/parity/compare.d.ts.map +1 -1
  92. package/dist/parity/compare.js +19 -0
  93. package/dist/parity/compare.js.map +1 -1
  94. package/dist/parity/fixtures.d.ts.map +1 -1
  95. package/dist/parity/fixtures.js +25 -0
  96. package/dist/parity/fixtures.js.map +1 -1
  97. package/dist/query/aggregations.d.ts +46 -1
  98. package/dist/query/aggregations.d.ts.map +1 -1
  99. package/dist/query/aggregations.js +86 -0
  100. package/dist/query/aggregations.js.map +1 -1
  101. package/dist/query/clickhouseDialect.d.ts.map +1 -1
  102. package/dist/query/clickhouseDialect.js +5 -1
  103. package/dist/query/clickhouseDialect.js.map +1 -1
  104. package/dist/query/customEventVocabulary.d.ts +46 -0
  105. package/dist/query/customEventVocabulary.d.ts.map +1 -0
  106. package/dist/query/customEventVocabulary.js +127 -0
  107. package/dist/query/customEventVocabulary.js.map +1 -0
  108. package/dist/query/dsl/builders.d.ts +38 -0
  109. package/dist/query/dsl/builders.d.ts.map +1 -0
  110. package/dist/query/dsl/builders.js +35 -0
  111. package/dist/query/dsl/builders.js.map +1 -0
  112. package/dist/query/dsl/compare.d.ts +167 -0
  113. package/dist/query/dsl/compare.d.ts.map +1 -0
  114. package/dist/query/dsl/compare.js +358 -0
  115. package/dist/query/dsl/compare.js.map +1 -0
  116. package/dist/query/dsl/compile.d.ts +89 -0
  117. package/dist/query/dsl/compile.d.ts.map +1 -0
  118. package/dist/query/dsl/compile.js +174 -0
  119. package/dist/query/dsl/compile.js.map +1 -0
  120. package/dist/query/dsl/explain.d.ts +115 -0
  121. package/dist/query/dsl/explain.d.ts.map +1 -0
  122. package/dist/query/dsl/explain.js +143 -0
  123. package/dist/query/dsl/explain.js.map +1 -0
  124. package/dist/query/dsl/generic.d.ts +127 -0
  125. package/dist/query/dsl/generic.d.ts.map +1 -0
  126. package/dist/query/dsl/generic.js +323 -0
  127. package/dist/query/dsl/generic.js.map +1 -0
  128. package/dist/query/dsl/index.d.ts +30 -0
  129. package/dist/query/dsl/index.d.ts.map +1 -0
  130. package/dist/query/dsl/index.js +23 -0
  131. package/dist/query/dsl/index.js.map +1 -0
  132. package/dist/query/dsl/order.d.ts +41 -0
  133. package/dist/query/dsl/order.d.ts.map +1 -0
  134. package/dist/query/dsl/order.js +55 -0
  135. package/dist/query/dsl/order.js.map +1 -0
  136. package/dist/query/dsl/significance.d.ts +130 -0
  137. package/dist/query/dsl/significance.d.ts.map +1 -0
  138. package/dist/query/dsl/significance.js +224 -0
  139. package/dist/query/dsl/significance.js.map +1 -0
  140. package/dist/query/index.d.ts +2 -0
  141. package/dist/query/index.d.ts.map +1 -1
  142. package/dist/query/index.js +8 -0
  143. package/dist/query/index.js.map +1 -1
  144. package/dist/query/summary/index.d.ts +4 -2
  145. package/dist/query/summary/index.d.ts.map +1 -1
  146. package/dist/query/summary/index.js +2 -1
  147. package/dist/query/summary/index.js.map +1 -1
  148. package/dist/query/summary/labels.d.ts +101 -0
  149. package/dist/query/summary/labels.d.ts.map +1 -0
  150. package/dist/query/summary/labels.js +261 -0
  151. package/dist/query/summary/labels.js.map +1 -0
  152. package/dist/query/summary/reading.d.ts.map +1 -1
  153. package/dist/query/summary/reading.js +21 -2
  154. package/dist/query/summary/reading.js.map +1 -1
  155. package/dist/query/summary/schema.d.ts +250 -20
  156. package/dist/query/summary/schema.d.ts.map +1 -1
  157. package/dist/query/summary/schema.js +135 -123
  158. package/dist/query/summary/schema.js.map +1 -1
  159. package/dist/query/summary/summarize.d.ts.map +1 -1
  160. package/dist/query/summary/summarize.js +91 -5
  161. package/dist/query/summary/summarize.js.map +1 -1
  162. package/dist/query/summary/types.d.ts +77 -2
  163. package/dist/query/summary/types.d.ts.map +1 -1
  164. package/dist/query/types.d.ts +47 -1
  165. package/dist/query/types.d.ts.map +1 -1
  166. package/dist/subscriptions.d.ts +208 -0
  167. package/dist/subscriptions.d.ts.map +1 -0
  168. package/dist/subscriptions.js +153 -0
  169. package/dist/subscriptions.js.map +1 -0
  170. package/llms.txt +9 -0
  171. package/package.json +8 -8
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/narrative/build.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Session narrative — the `query:raw`-gated compaction of one session's raw
3
+ * event stream into an ordered, bounded account of what it did
4
+ * (ADR 0051 §7, design sketch §G.2).
5
+ *
6
+ * Pure functions over `AnyEvent[]`: no store, no request, no I/O. The collector
7
+ * serves them on `GET /api/v1/sessions/:id/narrative`; the shapes and bounds
8
+ * live in `@uptimizr/metrics` so the registry entry, the generated tool and this
9
+ * implementation cannot drift.
10
+ */
11
+ export { buildSessionNarrative } from "./build.js";
12
+ export type { SessionNarrative, SessionNarrativeOptions } from "./build.js";
13
+ export { renderSessionNarrativeText } from "./text.js";
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/narrative/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,YAAY,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAC5E,OAAO,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Session narrative — the `query:raw`-gated compaction of one session's raw
3
+ * event stream into an ordered, bounded account of what it did
4
+ * (ADR 0051 §7, design sketch §G.2).
5
+ *
6
+ * Pure functions over `AnyEvent[]`: no store, no request, no I/O. The collector
7
+ * serves them on `GET /api/v1/sessions/:id/narrative`; the shapes and bounds
8
+ * live in `@uptimizr/metrics` so the registry entry, the generated tool and this
9
+ * implementation cannot drift.
10
+ */
11
+ export { buildSessionNarrative } from "./build.js";
12
+ export { renderSessionNarrativeText } from "./text.js";
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/narrative/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEnD,OAAO,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * `renderSessionNarrativeText` — the `format=text` rendering of a session
3
+ * narrative (ADR 0051 §7).
4
+ *
5
+ * Why a third format at all, when `full` and `table` already exist: the
6
+ * narrative's one consumer is a language model reading a session back, and a
7
+ * JSON array of two hundred objects spends most of its tokens on repeated key
8
+ * names. A line-per-entry rendering of the same data is roughly a third of the
9
+ * tokens and is what a model reads best. It is **only** offered on this route;
10
+ * no other endpoint gains a text format (design sketch §B.1 keeps `full`,
11
+ * `table` and `summary` as the shared envelopes).
12
+ *
13
+ * The output is derived entirely from the narrative's own fields — this module
14
+ * adds no information and reads no event — so the privacy allow-list enforced by
15
+ * `buildSessionNarrative` holds for it unchanged.
16
+ */
17
+ import type { SessionNarrative } from "./build.js";
18
+ /**
19
+ * Render a narrative as plain text: a header line naming the session and its
20
+ * span, then one line per entry (`<t> <kind> <summary>`), oldest first, ending
21
+ * with the totals line. Never longer than the narrative's own entry count plus
22
+ * one, so `maxEntries` bounds the text exactly as it bounds the JSON.
23
+ */
24
+ export declare function renderSessionNarrativeText(narrative: SessionNarrative): string;
25
+ //# sourceMappingURL=text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/narrative/text.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAQnD;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,gBAAgB,GAAG,MAAM,CAY9E"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * `renderSessionNarrativeText` — the `format=text` rendering of a session
3
+ * narrative (ADR 0051 §7).
4
+ *
5
+ * Why a third format at all, when `full` and `table` already exist: the
6
+ * narrative's one consumer is a language model reading a session back, and a
7
+ * JSON array of two hundred objects spends most of its tokens on repeated key
8
+ * names. A line-per-entry rendering of the same data is roughly a third of the
9
+ * tokens and is what a model reads best. It is **only** offered on this route;
10
+ * no other endpoint gains a text format (design sketch §B.1 keeps `full`,
11
+ * `table` and `summary` as the shared envelopes).
12
+ *
13
+ * The output is derived entirely from the narrative's own fields — this module
14
+ * adds no information and reads no event — so the privacy allow-list enforced by
15
+ * `buildSessionNarrative` holds for it unchanged.
16
+ */
17
+ /** `1200` → `"1.2s"`, padded so the timestamps form a readable column. */
18
+ function stamp(tMs) {
19
+ const seconds = (tMs / 1000).toFixed(1);
20
+ return `${seconds}s`.padStart(8);
21
+ }
22
+ /**
23
+ * Render a narrative as plain text: a header line naming the session and its
24
+ * span, then one line per entry (`<t> <kind> <summary>`), oldest first, ending
25
+ * with the totals line. Never longer than the narrative's own entry count plus
26
+ * one, so `maxEntries` bounds the text exactly as it bounds the JSON.
27
+ */
28
+ export function renderSessionNarrativeText(narrative) {
29
+ const { totals } = narrative;
30
+ const lines = [
31
+ `session ${narrative.sessionId} — ${totals.events} events over ` +
32
+ `${(totals.durationMs / 1000).toFixed(1)}s` +
33
+ (narrative.truncated ? " (truncated)" : ""),
34
+ ];
35
+ const width = narrative.entries.reduce((max, entry) => Math.max(max, entry.kind.length), 0);
36
+ for (const entry of narrative.entries) {
37
+ lines.push(`${stamp(entry.tMs)} ${entry.kind.padEnd(width)} ${entry.summary}`);
38
+ }
39
+ return `${lines.join("\n")}\n`;
40
+ }
41
+ //# sourceMappingURL=text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/narrative/text.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,0EAA0E;AAC1E,SAAS,KAAK,CAAC,GAAW;IACxB,MAAM,OAAO,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACxC,OAAO,GAAG,OAAO,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AACnC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,0BAA0B,CAAC,SAA2B;IACpE,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC7B,MAAM,KAAK,GAAG;QACZ,WAAW,SAAS,CAAC,SAAS,MAAM,MAAM,CAAC,MAAM,eAAe;YAC9D,GAAG,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;YAC3C,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9C,CAAC;IACF,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5F,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACnF,CAAC;IACD,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACjC,CAAC"}
@@ -27,5 +27,8 @@ export interface ParityCase {
27
27
  /** Engine-independent expected output. */
28
28
  readonly golden: readonly ParityRow[];
29
29
  }
30
+ /** Every case the cross-engine harness runs: delegated, then generic, then insights. */
30
31
  export declare const PARITY_CASES: readonly ParityCase[];
32
+ /** The subset compiled through the generic group-by tier (#304). */
33
+ export declare const GENERIC_PARITY_CASE_NAMES: readonly string[];
31
34
  //# sourceMappingURL=cases.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cases.d.ts","sourceRoot":"","sources":["../../src/parity/cases.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAqEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAS9C,MAAM,WAAW,UAAU;IACzB,8CAA8C;IAC9C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,yDAAyD;IACzD,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC;IACnC,iEAAiE;IACjE,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,iEAAiE;IACjE,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,0CAA0C;IAC1C,QAAQ,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,CAAC;CACvC;AAID,eAAO,MAAM,YAAY,EAAE,SAAS,UAAU,EAw3B7C,CAAC"}
1
+ {"version":3,"file":"cases.d.ts","sourceRoot":"","sources":["../../src/parity/cases.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAuEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAGnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAS9C,MAAM,WAAW,UAAU;IACzB,8CAA8C;IAC9C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,yDAAyD;IACzD,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC;IACnC,iEAAiE;IACjE,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,iEAAiE;IACjE,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,0CAA0C;IAC1C,QAAQ,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,CAAC;CACvC;AA60CD,wFAAwF;AACxF,eAAO,MAAM,YAAY,EAAE,SAAS,UAAU,EAI7C,CAAC;AAEF,oEAAoE;AACpE,eAAO,MAAM,yBAAyB,EAAE,SAAS,MAAM,EAEtD,CAAC"}
@@ -12,18 +12,21 @@
12
12
  * float-tolerant on continuous columns, integer-exact on bin indices, and
13
13
  * temporal projection columns excluded.
14
14
  */
15
- import { buildCameraDirectionHeatmap, buildCameraDistance, buildCameraPositionHeatmap, buildClickGazeRay, buildDistinctScenes, buildEventTypeCounts, buildEventsDaily, buildFlowHeatmap, buildListSessions, buildMeshDwell, buildMeshBlindSpots, buildMeshInteractionKinds, buildReachability, buildTopInputActions, buildDeadClicks, buildRageClicks, buildHoverDwell, buildCompileStalls, buildResourceSummary, buildCapabilityChanges, buildCameraGestures, buildNavigationStats, buildBacktrackRatio, buildXrRotationRate, buildXrSourceUsage, buildXrAbandonment, buildXrLocomotionComfort, buildTrackingQuality, buildInteractionsBySource, buildArPlacementTimeToPlace, buildArPlacementAttempts, buildArPlacementSurfaces, buildFunnel, buildLoadBounceFunnel, buildPerfDaily, buildPerfSummary, buildRenderScaleTruth, buildPerfDistribution, buildFpsHistogram, buildFrameTimePercentiles, buildJankRate, buildPerfByDevice, buildPerfByScene, buildResourcePercentiles, buildStabilityCounts, buildGraphicsDiagnosticCounts, buildErrorHeatmap, buildBoundaryHeatmap, buildBoundaryHeatmapStats, buildBoundaryContacts, buildRenderingTechnology, buildPointerHeatmap, buildMeshUvHeatmap, buildSceneCoverage, buildPerfHeatmap, buildSessionTrajectory, buildAggregateTrajectories, buildTimeseries, buildTopMeshes, buildTopMeshesBySource, buildTopMeshesTrend, buildWorldHeatmap, buildWorldHeatmapStats, buildGazeHeatmap, buildGazeHeatmapStats, } from "../query/aggregations.js";
15
+ import { buildCameraDirectionHeatmap, buildCameraDistance, buildCameraPositionHeatmap, buildClickGazeRay, buildDistinctScenes, buildEventTypeCounts, buildEventsDaily, buildFlowHeatmap, buildListSessions, buildMeshDwell, buildMeshBlindSpots, buildMeshInteractionKinds, buildReachability, buildTopInputActions, buildCustomEventVocabulary, buildDeadClicks, buildRageClicks, buildHoverDwell, buildCompileStalls, buildResourceSummary, buildCapabilityChanges, buildCameraGestures, buildNavigationStats, buildBacktrackRatio, buildXrRotationRate, buildXrSourceUsage, buildXrAbandonment, buildXrLocomotionComfort, buildTrackingQuality, buildInteractionsBySource, buildArPlacementTimeToPlace, buildArPlacementAttempts, buildArPlacementSurfaces, buildFunnel, buildLoadBounceFunnel, buildPerfDaily, buildPerfSummary, buildRenderScaleTruth, buildPerfDistribution, buildFpsHistogram, buildFrameTimePercentiles, buildJankRate, buildPerfByDevice, buildPerfByScene, buildResourcePercentiles, buildStabilityCounts, buildGraphicsDiagnosticCounts, buildErrorHeatmap, buildBoundaryHeatmap, buildBoundaryHeatmapStats, buildBoundaryContacts, buildRenderingTechnology, buildPointerHeatmap, buildMeshUvHeatmap, buildSceneCoverage, buildPerfHeatmap, buildSessionTrajectory, buildAggregateTrajectories, buildTimeseries, buildTopMeshes, buildTopMeshesBySource, buildTopMeshesTrend, buildWorldHeatmap, buildWorldHeatmapStats, buildGazeHeatmap, buildGazeHeatmapStats, } from "../query/aggregations.js";
16
+ import { buildMetricBuckets } from "../insights/buckets.js";
17
+ import { compileQuery } from "../query/dsl/index.js";
18
+ import { queryV1Schema } from "@uptimizr/schema";
16
19
  import { PARITY_DAY, PARITY_DAY_RANGE, PARITY_PROJECT_ID, PARITY_RANGE, PARITY_T0, } from "./fixtures.js";
17
20
  const PID = PARITY_PROJECT_ID;
18
- export const PARITY_CASES = [
21
+ const DELEGATED_PARITY_CASES = [
19
22
  {
20
23
  name: "listSessions",
21
24
  build: (d) => buildListSessions(PID, PARITY_RANGE, d),
22
25
  sortKeys: ["session_id"],
23
26
  ignoreColumns: ["started_at", "ended_at"],
24
27
  golden: [
25
- { session_id: "s1", visitor_id: "", events: 10 },
26
- { session_id: "s2", visitor_id: "", events: 9 },
28
+ { session_id: "s1", visitor_id: "", events: 12 },
29
+ { session_id: "s2", visitor_id: "", events: 11 },
27
30
  ],
28
31
  },
29
32
  {
@@ -380,6 +383,30 @@ export const PARITY_CASES = [
380
383
  // engines (#75); real grouping is covered by the DuckDB unit suite.
381
384
  golden: [],
382
385
  },
386
+ {
387
+ // Custom-event vocabulary (ADR 0051 §5, design sketch §E.1). Three
388
+ // `add_to_cart` events (s1 + s2) and one `level_complete` (s1), so the
389
+ // totals are (3, 2 sessions) and (1, 1 session). The aggregation emits the
390
+ // totals once per sampled payload, so `add_to_cart` repeats three times and
391
+ // `level_complete` once — four rows in all, ranked by count.
392
+ //
393
+ // `sample_payload` is the raw event JSON as each engine stores it (Postgres
394
+ // normalises it through `jsonb`), so it is engine-dependent by construction
395
+ // and excluded from the comparison — exactly like the engine-formatted
396
+ // timestamps above. What must agree across engines is the counting and the
397
+ // sampling *shape*, which is what the golden pins. The fold from payloads to
398
+ // prop types is pure TypeScript and is unit-tested separately.
399
+ name: "customEventVocabulary",
400
+ build: (d) => buildCustomEventVocabulary(PID, PARITY_RANGE, d),
401
+ sortKeys: ["name", "count"],
402
+ ignoreColumns: ["sample_payload"],
403
+ golden: [
404
+ { name: "add_to_cart", count: 3, sessions: 2 },
405
+ { name: "add_to_cart", count: 3, sessions: 2 },
406
+ { name: "add_to_cart", count: 3, sessions: 2 },
407
+ { name: "level_complete", count: 1, sessions: 1 },
408
+ ],
409
+ },
383
410
  {
384
411
  name: "perfSummary",
385
412
  build: (d) => buildPerfSummary(PID, PARITY_RANGE, d),
@@ -697,6 +724,7 @@ export const PARITY_CASES = [
697
724
  sortKeys: ["event_type"],
698
725
  golden: [
699
726
  { day: PARITY_DAY, event_type: "camera_sample", events: 3 },
727
+ { day: PARITY_DAY, event_type: "custom", events: 4 },
700
728
  { day: PARITY_DAY, event_type: "frame_perf", events: 3 },
701
729
  { day: PARITY_DAY, event_type: "graphics_diagnostic", events: 1 },
702
730
  { day: PARITY_DAY, event_type: "mesh_visibility", events: 2 },
@@ -713,15 +741,15 @@ export const PARITY_CASES = [
713
741
  sortKeys: ["scene_id"],
714
742
  ignoreColumns: ["last_seen"],
715
743
  golden: [
716
- { scene_id: "arena", events: 9 },
717
- { scene_id: "lobby", events: 10 },
744
+ { scene_id: "arena", events: 11 },
745
+ { scene_id: "lobby", events: 12 },
718
746
  ],
719
747
  },
720
748
  {
721
749
  name: "timeseries",
722
750
  build: (d) => buildTimeseries(PID, { ...PARITY_RANGE, interval: 60 }, d),
723
751
  sortKeys: ["bucket"],
724
- golden: [{ bucket: PARITY_T0, events: 19, avg_fps: 45 }],
752
+ golden: [{ bucket: PARITY_T0, events: 23, avg_fps: 45 }],
725
753
  },
726
754
  {
727
755
  name: "eventTypeCounts",
@@ -729,6 +757,7 @@ export const PARITY_CASES = [
729
757
  sortKeys: ["event_type"],
730
758
  golden: [
731
759
  { event_type: "camera_sample", count: 3 },
760
+ { event_type: "custom", count: 4 },
732
761
  { event_type: "frame_perf", count: 3 },
733
762
  { event_type: "graphics_diagnostic", count: 1 },
734
763
  { event_type: "mesh_visibility", count: 2 },
@@ -895,5 +924,356 @@ export const PARITY_CASES = [
895
924
  sortKeys: ["band"],
896
925
  golden: [],
897
926
  },
927
+ // --- Query DSL v1 (ADR 0051 §3) ----------------------------------------
928
+ //
929
+ // The delegated compiler renders a validated `queryV1` document through the
930
+ // metric's own builder, so in principle it cannot disagree with the cases
931
+ // above — and `src/__tests__/queryDsl.test.ts` proves that spec-for-spec, on
932
+ // every dialect. These three cases prove it the other way round, where it
933
+ // actually matters: the compiled SQL is *executed* on each engine and its rows
934
+ // are compared against the same engine-independent golden. A filter-mapping
935
+ // regression that produced valid-but-different SQL would fail here.
936
+ {
937
+ name: "dsl:topMeshes",
938
+ build: (d) => compileQuery(PID, queryV1Schema.parse({ v: 1, metric: "top_meshes", range: PARITY_RANGE }), d),
939
+ sortKeys: ["mesh"],
940
+ golden: [
941
+ { mesh: "box", count: 2 },
942
+ { mesh: "floor", count: 2 },
943
+ { mesh: "sphere", count: 2 },
944
+ ],
945
+ },
946
+ {
947
+ // A filtered query: `filters.source` must reach `SourceOptions.source`
948
+ // through the registry's `FILTER_TARGETS`, not by coincidence.
949
+ name: "dsl:meshSourcesFiltered",
950
+ build: (d) => compileQuery(PID, queryV1Schema.parse({
951
+ v: 1,
952
+ metric: "mesh_sources",
953
+ range: PARITY_RANGE,
954
+ filters: { source: "mouse" },
955
+ }), d),
956
+ sortKeys: ["mesh", "source"],
957
+ golden: [
958
+ { mesh: "box", source: "mouse", count: 1 },
959
+ { mesh: "floor", source: "mouse", count: 1 },
960
+ { mesh: "sphere", source: "mouse", count: 1 },
961
+ ],
962
+ },
963
+ {
964
+ // A funnel through the DSL: the ADR 0038 step predicates travel as real
965
+ // JSON rather than a re-parsed string, and land on `FunnelOptions.steps`.
966
+ name: "dsl:funnel",
967
+ build: (d) => compileQuery(PID, queryV1Schema.parse({
968
+ v: 1,
969
+ metric: "funnel",
970
+ range: PARITY_RANGE,
971
+ filters: {
972
+ steps: [{ type: "camera_sample" }, { type: "pointer_click", mesh: "sphere" }],
973
+ },
974
+ }), d),
975
+ sortKeys: ["step"],
976
+ golden: [
977
+ { step: 0, sessions: 2 },
978
+ { step: 1, sessions: 1 },
979
+ ],
980
+ },
981
+ ];
982
+ /**
983
+ * **Generic group-by tier** (ADR 0051 §3, design sketch §C.2 tier 2, #304).
984
+ *
985
+ * The delegated cases above prove the DSL reaches each metric's own builder.
986
+ * These prove the *other* compiler: one shared `SELECT <dims>, <measures> FROM
987
+ * events GROUP BY <dims>` rendered from registry data, executed on every engine
988
+ * and compared against the same hand-verified golden.
989
+ *
990
+ * Three metrics at two grains each, chosen to exercise every part of the
991
+ * builder: promoted columns alone (`top_meshes`, `event_counts`,
992
+ * `mesh_sources`), a two-dimension group-by, and the `session_start` attribute
993
+ * CTE that `device.*` and `cameraMode` are read through — which is the piece
994
+ * most likely to diverge between engines, since it is the only one that goes
995
+ * through `Dialect.jsonText` and a `LEFT JOIN`.
996
+ *
997
+ * Appended as a separate block rather than merged above so the v1 goldens stay
998
+ * exactly where #349 left them.
999
+ */
1000
+ const GENERIC_PARITY_CASES = [
1001
+ {
1002
+ // `top_meshes` is keyed by `mesh`; asking for `(mesh, event_type)` splits
1003
+ // each mesh's tally by what actually referenced it — a passive visibility
1004
+ // sample versus a real click. The delegated builder cannot express it at all.
1005
+ name: "dsl:genericMeshesByEventType",
1006
+ build: (d) => compileQuery(PID, queryV1Schema.parse({
1007
+ v: 1,
1008
+ metric: "top_meshes",
1009
+ dimensions: ["mesh", "event_type"],
1010
+ range: PARITY_RANGE,
1011
+ }), d),
1012
+ sortKeys: ["mesh", "event_type"],
1013
+ golden: [
1014
+ { mesh: "box", event_type: "mesh_visibility", count: 1 },
1015
+ { mesh: "box", event_type: "pointer_click", count: 1 },
1016
+ { mesh: "floor", event_type: "pointer_click", count: 1 },
1017
+ { mesh: "floor", event_type: "pointer_move", count: 1 },
1018
+ { mesh: "sphere", event_type: "mesh_visibility", count: 1 },
1019
+ { mesh: "sphere", event_type: "pointer_click", count: 1 },
1020
+ ],
1021
+ },
1022
+ {
1023
+ // The same metric regrouped onto a dimension it can only be *filtered* by on
1024
+ // the delegated tier — and, for `top_meshes`, not even that: its builder has
1025
+ // no scene clause at all.
1026
+ name: "dsl:genericMeshesByScene",
1027
+ build: (d) => compileQuery(PID, queryV1Schema.parse({
1028
+ v: 1,
1029
+ metric: "top_meshes",
1030
+ dimensions: ["scene"],
1031
+ range: PARITY_RANGE,
1032
+ }), d),
1033
+ sortKeys: ["scene_id"],
1034
+ golden: [
1035
+ { scene_id: "arena", count: 2 },
1036
+ { scene_id: "lobby", count: 4 },
1037
+ ],
1038
+ },
1039
+ {
1040
+ // Two promoted dimensions at once, over the whole event stream.
1041
+ name: "dsl:genericEventCountsByScene",
1042
+ build: (d) => compileQuery(PID, queryV1Schema.parse({
1043
+ v: 1,
1044
+ metric: "event_counts",
1045
+ dimensions: ["event_type", "scene"],
1046
+ range: PARITY_RANGE,
1047
+ }), d),
1048
+ sortKeys: ["event_type", "scene_id"],
1049
+ golden: [
1050
+ { event_type: "camera_sample", scene_id: "arena", count: 1 },
1051
+ { event_type: "camera_sample", scene_id: "lobby", count: 2 },
1052
+ { event_type: "custom", scene_id: "arena", count: 2 },
1053
+ { event_type: "custom", scene_id: "lobby", count: 2 },
1054
+ { event_type: "frame_perf", scene_id: "arena", count: 1 },
1055
+ { event_type: "frame_perf", scene_id: "lobby", count: 2 },
1056
+ { event_type: "graphics_diagnostic", scene_id: "arena", count: 1 },
1057
+ { event_type: "mesh_visibility", scene_id: "lobby", count: 2 },
1058
+ { event_type: "pointer_click", scene_id: "arena", count: 1 },
1059
+ { event_type: "pointer_click", scene_id: "lobby", count: 2 },
1060
+ { event_type: "pointer_move", scene_id: "arena", count: 1 },
1061
+ { event_type: "runtime_error", scene_id: "arena", count: 1 },
1062
+ { event_type: "session_start", scene_id: "arena", count: 1 },
1063
+ { event_type: "session_start", scene_id: "lobby", count: 1 },
1064
+ { event_type: "xr_boundary_proximity", scene_id: "arena", count: 2 },
1065
+ { event_type: "xr_boundary_proximity", scene_id: "lobby", count: 1 },
1066
+ ],
1067
+ },
1068
+ {
1069
+ // The session-attribute CTE: `device.engine` lives in the `session_start`
1070
+ // payload, so this is the case that proves `jsonText` + `LEFT JOIN` render
1071
+ // and group identically on all four engines.
1072
+ name: "dsl:genericEventCountsByEngine",
1073
+ build: (d) => compileQuery(PID, queryV1Schema.parse({
1074
+ v: 1,
1075
+ metric: "event_counts",
1076
+ dimensions: ["device.engine"],
1077
+ range: PARITY_RANGE,
1078
+ }), d),
1079
+ sortKeys: ["engine"],
1080
+ golden: [
1081
+ { engine: "webgl2", count: 11 },
1082
+ { engine: "webgpu", count: 12 },
1083
+ ],
1084
+ },
1085
+ {
1086
+ // A metric with an `event_type` scope *and* a `mesh != ''` scope, regrouped:
1087
+ // the scope predicates must survive the regrouping or the counts inflate.
1088
+ name: "dsl:genericMeshSourcesByScene",
1089
+ build: (d) => compileQuery(PID, queryV1Schema.parse({
1090
+ v: 1,
1091
+ metric: "mesh_sources",
1092
+ dimensions: ["scene", "source"],
1093
+ range: PARITY_RANGE,
1094
+ }), d),
1095
+ sortKeys: ["scene_id", "source"],
1096
+ golden: [
1097
+ { scene_id: "arena", source: "mouse", count: 1 },
1098
+ { scene_id: "lobby", source: "mouse", count: 2 },
1099
+ ],
1100
+ },
1101
+ {
1102
+ // Two measures (`count` and `count(DISTINCT session_id)`) over a session
1103
+ // attribute that is not a device field — the camera model (ADR 0026).
1104
+ name: "dsl:genericInteractionsByCameraMode",
1105
+ build: (d) => compileQuery(PID, queryV1Schema.parse({
1106
+ v: 1,
1107
+ metric: "interaction_sources",
1108
+ dimensions: ["cameraMode"],
1109
+ range: PARITY_RANGE,
1110
+ }), d),
1111
+ sortKeys: ["camera_mode"],
1112
+ golden: [
1113
+ { camera_mode: "arc-rotate", count: 2, sessions: 1 },
1114
+ { camera_mode: "free", count: 2, sessions: 1 },
1115
+ ],
1116
+ },
1117
+ ];
1118
+ /**
1119
+ * **Insight bucket series** (ADR 0051 §4, design sketch §D).
1120
+ *
1121
+ * `buildMetricBuckets` is the single query both insight primitives consume, and
1122
+ * the only per-dialect SQL they involve: every statistic over the series is pure
1123
+ * TypeScript. So parity here is parity for `baseline` and `movers` as a whole.
1124
+ * One case per *aggregate shape* the measure catalog can render — count,
1125
+ * distinct sessions, sum, quantile, and a geometry-guarded count — because the
1126
+ * shapes are what differ between engines, not the metrics.
1127
+ *
1128
+ * Every fixture event lands in the same UTC hour (2024-06-16 10:00), so each
1129
+ * series is a single bucket at `PARITY_T0`. That is the point: the fixtures fix
1130
+ * the *values*, and these cases fix the fact that four dialects render and
1131
+ * execute the same bucketing, the same aggregates and the same predicate
1132
+ * vocabulary to the same numbers.
1133
+ *
1134
+ * Appended last, as its own block, so the delegated and generic goldens stay
1135
+ * exactly where #349 and #304 left them.
1136
+ */
1137
+ const INSIGHT_PARITY_CASES = [
1138
+ {
1139
+ // count(*) over every event type: all 23 fixture events in one hour bucket.
1140
+ name: "metricBuckets:count",
1141
+ build: (d) => buildMetricBuckets(PID, { ...PARITY_RANGE, metric: "list_sessions", bucket: "hour" }, d),
1142
+ sortKeys: ["bucket"],
1143
+ golden: [{ bucket: PARITY_T0, value: 23, sample_size: 23 }],
1144
+ },
1145
+ {
1146
+ // count(DISTINCT session_id) over `session_start`: s1 and s2.
1147
+ name: "metricBuckets:sessions",
1148
+ build: (d) => buildMetricBuckets(PID, { ...PARITY_RANGE, metric: "rendering_technology", bucket: "hour" }, d),
1149
+ sortKeys: ["bucket"],
1150
+ golden: [{ bucket: PARITY_T0, value: 2, sample_size: 2 }],
1151
+ },
1152
+ {
1153
+ // quantile(fps, 0.5) over the three `frame_perf` samples (60, 30, 45) → 45.
1154
+ name: "metricBuckets:quantile",
1155
+ build: (d) => buildMetricBuckets(PID, { ...PARITY_RANGE, metric: "perf_summary", bucket: "hour" }, d),
1156
+ sortKeys: ["bucket"],
1157
+ golden: [{ bucket: PARITY_T0, value: 45, sample_size: 3 }],
1158
+ },
1159
+ {
1160
+ // sum(visible_ms) over `mesh_visibility` with a non-empty mesh: 4000 + 2000.
1161
+ name: "metricBuckets:sum",
1162
+ build: (d) => buildMetricBuckets(PID, { ...PARITY_RANGE, metric: "mesh_dwell", bucket: "hour" }, d),
1163
+ sortKeys: ["bucket"],
1164
+ golden: [{ bucket: PARITY_T0, value: 6000, sample_size: 2 }],
1165
+ },
1166
+ {
1167
+ // The geometry guard: `camera_sample` rows whose `direction` carries all
1168
+ // three components — the same predicate `buildCameraDirectionHeatmap` applies
1169
+ // before it bins, so the series total equals that heatmap's own row total.
1170
+ name: "metricBuckets:geometry",
1171
+ build: (d) => buildMetricBuckets(PID, { ...PARITY_RANGE, metric: "camera_heatmap", bucket: "hour" }, d),
1172
+ sortKeys: ["bucket"],
1173
+ golden: [{ bucket: PARITY_T0, value: 3, sample_size: 3 }],
1174
+ },
1175
+ {
1176
+ // Scene scoping plus an equality predicate: clicks in `lobby` that hit
1177
+ // nothing. Both lobby clicks hit a mesh, so the series is empty — a bucket
1178
+ // with no matching events is absent, never a zero row.
1179
+ name: "metricBuckets:emptySeries",
1180
+ build: (d) => buildMetricBuckets(PID, { ...PARITY_RANGE, metric: "dead_clicks", bucket: "hour", scene: "lobby" }, d),
1181
+ sortKeys: ["bucket"],
1182
+ golden: [],
1183
+ },
1184
+ {
1185
+ // Day grain over the day-wide range: the same 19 events, one calendar-day
1186
+ // bucket, proving the grain is a parameter rather than a second query.
1187
+ name: "metricBuckets:dayGrain",
1188
+ build: (d) => buildMetricBuckets(PID, { ...PARITY_DAY_RANGE, metric: "list_sessions", bucket: "day" }, d),
1189
+ sortKeys: ["bucket"],
1190
+ golden: [{ bucket: Date.UTC(2024, 5, 16), value: 23, sample_size: 23 }],
1191
+ },
1192
+ // --- anomalies (#306): the grouped split --------------------------------
1193
+ //
1194
+ // The same measure, the same predicates, plus one promoted column in the
1195
+ // `SELECT` / `GROUP BY` / `ORDER BY`. It is what `anomalies` re-reads to say
1196
+ // *which* value inside a metric accounts for an anomalous bucket, and it is
1197
+ // the only new per-dialect SQL the primitive involves — so parity here is
1198
+ // parity for contributor attribution as a whole. One case per shape the split
1199
+ // has to survive: a multi-channel count, a summed value column, and a distinct
1200
+ // count (where the grouping key also changes what "distinct" ranges over).
1201
+ {
1202
+ // Split a two-channel error count by the channel: one diagnostic, one
1203
+ // runtime error, in the same hour bucket.
1204
+ name: "metricBuckets:splitEventType",
1205
+ build: (d) => buildMetricBuckets(PID, { ...PARITY_RANGE, metric: "error_heatmap", bucket: "hour", groupBy: "event_type" }, d),
1206
+ sortKeys: ["bucket", "dimension_value"],
1207
+ golden: [
1208
+ { bucket: PARITY_T0, dimension_value: "graphics_diagnostic", value: 1, sample_size: 1 },
1209
+ { bucket: PARITY_T0, dimension_value: "runtime_error", value: 1, sample_size: 1 },
1210
+ ],
1211
+ },
1212
+ {
1213
+ // sum(visible_ms) split by mesh: the 6000 ms the ungrouped case reports is
1214
+ // 4000 on `box` and 2000 on `sphere` — the shares an attribution reads.
1215
+ name: "metricBuckets:splitMesh",
1216
+ build: (d) => buildMetricBuckets(PID, { ...PARITY_RANGE, metric: "mesh_dwell", bucket: "hour", groupBy: "mesh" }, d),
1217
+ sortKeys: ["bucket", "dimension_value"],
1218
+ golden: [
1219
+ { bucket: PARITY_T0, dimension_value: "box", value: 4000, sample_size: 1 },
1220
+ { bucket: PARITY_T0, dimension_value: "sphere", value: 2000, sample_size: 1 },
1221
+ ],
1222
+ },
1223
+ {
1224
+ // count(DISTINCT session_id) split by scene: the grouping key narrows what
1225
+ // "distinct" ranges over, so the two sessions become one per scene rather
1226
+ // than two in both.
1227
+ name: "metricBuckets:splitScene",
1228
+ build: (d) => buildMetricBuckets(PID, { ...PARITY_RANGE, metric: "rendering_technology", bucket: "hour", groupBy: "scene" }, d),
1229
+ sortKeys: ["bucket", "dimension_value"],
1230
+ golden: [
1231
+ { bucket: PARITY_T0, dimension_value: "arena", value: 1, sample_size: 1 },
1232
+ { bucket: PARITY_T0, dimension_value: "lobby", value: 1, sample_size: 1 },
1233
+ ],
1234
+ },
1235
+ // --- significance / scene health (#307) ---
1236
+ //
1237
+ // The named auxiliary series (`measures.ts`, `BUCKET_MEASURE_VARIANTS`) render
1238
+ // through the same builder, so only the shapes they *add* need a case: a rate
1239
+ // denominator, a new promoted value column, and a non-median quantile.
1240
+ {
1241
+ // A rate denominator: every `pointer_click`, against `dead_clicks`, whose
1242
+ // main measure counts only the clicks that hit nothing. Three clicks in the
1243
+ // fixtures; two of them hit a mesh, which is why the main series over the
1244
+ // same window is the one the `emptySeries` case pins.
1245
+ name: "metricBuckets:rateDenominator",
1246
+ build: (d) => buildMetricBuckets(PID, { ...PARITY_RANGE, metric: "dead_clicks", series: "denominator", bucket: "hour" }, d),
1247
+ sortKeys: ["bucket"],
1248
+ golden: [{ bucket: PARITY_T0, value: 3, sample_size: 3 }],
1249
+ },
1250
+ {
1251
+ // `sum(long_frames)` — a promoted column no main measure reads. The same
1252
+ // raw material `buildJankRate` sums per session, pooled here instead.
1253
+ name: "metricBuckets:longFrames",
1254
+ build: (d) => buildMetricBuckets(PID, { ...PARITY_RANGE, metric: "jank_rate", series: "numerator", bucket: "hour" }, d),
1255
+ sortKeys: ["bucket"],
1256
+ golden: [{ bucket: PARITY_T0, value: 8, sample_size: 3 }],
1257
+ },
1258
+ {
1259
+ // A tail quantile rather than the median: q = 0.05 over the three
1260
+ // `frame_perf` samples (60, 30, 45) is 30 + (45 - 30) * 0.1 = 31.5 under
1261
+ // the type-7 interpolation all four dialects use. It lands *between* two
1262
+ // samples rather than on one, which is exactly why it needs a case of its
1263
+ // own: an engine that returned an actual element instead of interpolating
1264
+ // would pass `metricBuckets:quantile` and fail here.
1265
+ name: "metricBuckets:tailQuantile",
1266
+ build: (d) => buildMetricBuckets(PID, { ...PARITY_RANGE, metric: "perf_summary", series: "p05", bucket: "hour" }, d),
1267
+ sortKeys: ["bucket"],
1268
+ golden: [{ bucket: PARITY_T0, value: 31.5, sample_size: 3 }],
1269
+ },
1270
+ ];
1271
+ /** Every case the cross-engine harness runs: delegated, then generic, then insights. */
1272
+ export const PARITY_CASES = [
1273
+ ...DELEGATED_PARITY_CASES,
1274
+ ...GENERIC_PARITY_CASES,
1275
+ ...INSIGHT_PARITY_CASES,
898
1276
  ];
1277
+ /** The subset compiled through the generic group-by tier (#304). */
1278
+ export const GENERIC_PARITY_CASE_NAMES = GENERIC_PARITY_CASES.map((parityCase) => parityCase.name);
899
1279
  //# sourceMappingURL=cases.js.map