@gravitylabsllc/porthole 0.1.0 → 0.2.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 (55) hide show
  1. package/README.md +123 -0
  2. package/dist/adb.js +430 -21
  3. package/dist/adb.js.map +1 -1
  4. package/dist/args.js +144 -0
  5. package/dist/args.js.map +1 -0
  6. package/dist/capture.js +139 -30
  7. package/dist/capture.js.map +1 -1
  8. package/dist/cli.js +221 -62
  9. package/dist/cli.js.map +1 -1
  10. package/dist/device.js +337 -4
  11. package/dist/device.js.map +1 -1
  12. package/dist/index.js +2030 -377
  13. package/dist/index.js.map +1 -1
  14. package/dist/moment.js +240 -0
  15. package/dist/moment.js.map +1 -0
  16. package/dist/perfetto.js +826 -0
  17. package/dist/perfetto.js.map +1 -0
  18. package/dist/report.js +68 -7
  19. package/dist/report.js.map +1 -1
  20. package/dist/save.js +252 -0
  21. package/dist/save.js.map +1 -0
  22. package/dist/sessions.js +704 -0
  23. package/dist/sessions.js.map +1 -0
  24. package/dist/system.js +169 -0
  25. package/dist/system.js.map +1 -0
  26. package/dist/systrace.js +198 -0
  27. package/dist/systrace.js.map +1 -0
  28. package/dist/timeline.js +731 -29
  29. package/dist/timeline.js.map +1 -1
  30. package/dist/trace.js +317 -27
  31. package/dist/trace.js.map +1 -1
  32. package/dist/watermark.js +220 -0
  33. package/dist/watermark.js.map +1 -0
  34. package/package.json +10 -4
  35. package/src/adb.ts +583 -0
  36. package/src/args.ts +177 -0
  37. package/src/capture.ts +292 -0
  38. package/src/cli.ts +367 -0
  39. package/src/device.ts +635 -0
  40. package/src/index.ts +2545 -0
  41. package/src/moment.ts +306 -0
  42. package/src/perfetto.ts +972 -0
  43. package/src/report.ts +285 -0
  44. package/src/save.ts +322 -0
  45. package/src/sessions.ts +894 -0
  46. package/src/system.ts +221 -0
  47. package/src/systrace.ts +258 -0
  48. package/src/timeline.ts +1036 -0
  49. package/src/trace.ts +769 -0
  50. package/src/watermark.ts +337 -0
  51. package/ui/dist/assets/index-BzqwnvoU.js +70 -0
  52. package/ui/dist/assets/index-DtnyBXCM.css +1 -0
  53. package/ui/dist/index.html +2 -2
  54. package/ui/dist/assets/index--1mlZuNZ.css +0 -1
  55. package/ui/dist/assets/index-BeVGHRFm.js +0 -68
@@ -1 +1 @@
1
- {"version":3,"file":"timeline.js","sourceRoot":"","sources":["../src/timeline.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"timeline.js","sourceRoot":"","sources":["../src/timeline.ts"],"names":[],"mappings":"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"}
package/dist/trace.js CHANGED
@@ -5,20 +5,34 @@
5
5
  * from a capture is a short list of what is worth looking at; what CI wants is
6
6
  * a number it can compare. Both come from here.
7
7
  */
8
+ /**
9
+ * The shape of the trace file.
10
+ *
11
+ * Nothing validates against it on read, so it is a label rather than a gate.
12
+ * Adding an optional field or a new metric key is therefore compatible by
13
+ * construction — `compare` fills a key the other side lacks with zero — and does
14
+ * not move this number. Removing or repurposing one would.
15
+ */
8
16
  export const TRACE_VERSION = 1;
9
- const num = (value, fallback = 0) => {
17
+ /** Exported for `index.ts`'s `exits` section (GRA-58): the same loose coercion every event field here already gets, so a device's numeric fields don't need retyping at a second call site. */
18
+ export const num = (value, fallback = 0) => {
10
19
  if (typeof value === "number")
11
20
  return value;
12
21
  const parsed = Number(value);
13
22
  return Number.isFinite(parsed) ? parsed : fallback;
14
23
  };
15
- const str = (value, fallback = "") => typeof value === "string" ? value : value == null ? fallback : String(value);
24
+ export const str = (value, fallback = "") => typeof value === "string" ? value : value == null ? fallback : String(value);
16
25
  /**
17
26
  * The value below which `share` of the samples fall.
18
27
  *
19
28
  * Percentiles rather than means throughout: a mean frame time is the one number
20
29
  * guaranteed to hide the problem, because the frames anyone cares about are the
21
30
  * tail.
31
+ *
32
+ * Only ever fed completed work. A span that was still open has a floor under
33
+ * its duration and not a duration, and a floor mixed into a distribution of
34
+ * completions drags the tail *down* — the longest wait in the run would make
35
+ * the p95 look better. Open spans are counted and named separately instead.
22
36
  */
23
37
  function percentile(values, share) {
24
38
  if (values.length === 0)
@@ -27,20 +41,62 @@ function percentile(values, share) {
27
41
  const index = Math.min(sorted.length - 1, Math.floor(share * sorted.length));
28
42
  return Math.round(sorted[index]);
29
43
  }
44
+ // Predicates rather than inline `!s.open`, so the narrowing survives `filter`
45
+ // and the compiler is the thing that stops `atLeastMs` reaching a percentile.
46
+ const isCompleted = (span) => !span.open;
47
+ const isOpen = (span) => span.open;
48
+ /**
49
+ * Start/end pairs recovered from the event stream — including the ones with no
50
+ * end.
51
+ *
52
+ * A span still open when the recording stops is the shape of a hang: a request
53
+ * that never returns, a query that never completes, a job wedged on a lock. It
54
+ * used to be dropped here, which meant the trace reported fewer calls than were
55
+ * made, no percentile influence, and no finding about the one that mattered —
56
+ * the run that most needed investigating came back looking like the quietest on
57
+ * record. They are emitted instead, marked `open`, carrying a floor under their
58
+ * duration measured to the last event seen.
59
+ *
60
+ * An end with no start is the mirror case and is not a hang: that is a capture
61
+ * that attached mid-call. It keeps the device's own `elapsedMs`.
62
+ */
30
63
  function spans(events, prefix) {
31
64
  const open = new Map();
32
65
  const out = [];
66
+ let lastAt = 0;
33
67
  for (const event of events) {
68
+ lastAt = Math.max(lastAt, event.t);
34
69
  const id = str(event.data.id);
35
- if (event.event === `${prefix}_start`)
36
- open.set(id, event.t);
70
+ if (event.event === `${prefix}_start`) {
71
+ // Not an unconditional `set`. A repeated id is the device contradicting
72
+ // itself, and overwriting would silently discard the earlier start — the
73
+ // same class of defect as dropping open spans. Keeping the first start
74
+ // keeps the floor conservative and invents nothing.
75
+ if (!open.has(id))
76
+ open.set(id, { at: event.t, data: event.data });
77
+ }
37
78
  else if (event.event === `${prefix}_end`) {
38
79
  const started = open.get(id);
39
80
  open.delete(id);
40
- const ms = started === undefined ? num(event.data.elapsedMs) : event.t - started;
41
- out.push({ ms, data: event.data });
81
+ const ms = started === undefined ? num(event.data.elapsedMs) : event.t - started.at;
82
+ out.push({
83
+ open: false,
84
+ ms,
85
+ data: event.data,
86
+ endedAt: event.t,
87
+ startedAt: started ? started.at : null,
88
+ });
42
89
  }
43
90
  }
91
+ // Insertion order, so these come out oldest first.
92
+ for (const started of open.values()) {
93
+ out.push({
94
+ open: true,
95
+ atLeastMs: lastAt - started.at,
96
+ startedAt: started.at,
97
+ data: started.data,
98
+ });
99
+ }
44
100
  return out;
45
101
  }
46
102
  export function metricsOf(events) {
@@ -64,23 +120,54 @@ export function metricsOf(events) {
64
120
  "mainThread.stalls": stalls.length,
65
121
  "mainThread.worstMs": stalls.reduce((worst, e) => Math.max(worst, num(e.data.durationMs)), 0),
66
122
  "mainThread.blockedMs": stalls.reduce((sum, e) => sum + num(e.data.durationMs), 0),
123
+ // Counts are over everything that started, percentiles over what finished.
124
+ // A query that never came back still happened, and still cost the user the
125
+ // wait; it just has no duration to put in a distribution.
67
126
  "db.queries": db.length,
127
+ "db.stillOpen": db.filter(isOpen).length,
68
128
  "db.onMainThread": db.filter((q) => q.data.onMainThread === "true" || q.data.onMainThread === true).length,
69
- "db.p95Ms": percentile(db.map((q) => q.ms), 0.95),
129
+ // Over completed queries only — see `percentile`.
130
+ "db.p95Ms": percentile(db.filter(isCompleted).map((q) => q.ms), 0.95),
70
131
  "http.calls": http.length,
132
+ "http.stillOpen": http.filter(isOpen).length,
71
133
  "http.failed": http.filter((c) => num(c.data.status) >= 400 || c.data.error !== undefined)
72
134
  .length,
73
- "http.p95Ms": percentile(http.map((c) => c.ms), 0.95),
135
+ // Over completed calls only — see `percentile`.
136
+ "http.p95Ms": percentile(http.filter(isCompleted).map((c) => c.ms), 0.95),
74
137
  "recompose.total": recompose.length,
75
138
  "recompose.peakPerFrame": perFrame.size ? Math.max(...perFrame.values()) : 0,
76
139
  "memory.peakHeapMb": memory.reduce((peak, e) => Math.max(peak, num(e.data.heapUsedMb)), 0),
77
140
  "memory.peakRamMb": memory.reduce((peak, e) => Math.max(peak, num(e.data.totalRamMb)), 0),
78
141
  "memory.blockingGcMs": gc.reduce((sum, e) => sum + num(e.data.pausedMs), 0),
79
142
  "work.runs": work.length,
143
+ "work.stillOpen": work.filter(isOpen).length,
80
144
  "work.retries": work.filter((w) => w.data.retrying === "true").length,
81
145
  "work.failures": work.filter((w) => str(w.data.state) === "FAILED").length,
82
146
  };
83
147
  }
148
+ /**
149
+ * The envelope from the earliest to the latest of a set of real, timestamped
150
+ * events — for a finding that aggregates several occurrences (a run of
151
+ * blocking GCs, every `trimMemory` call) rather than naming one. Unlike a
152
+ * trace-side aggregate summed with no timestamp at all, each contributor here
153
+ * has a real `t`, so the envelope is read off the events that produced the
154
+ * finding, not invented for it. Undefined only for an empty list, which no
155
+ * caller should ever pass — every call site already checked `.length > 0`.
156
+ */
157
+ function eventWindow(events) {
158
+ if (events.length === 0)
159
+ return undefined;
160
+ const ts = events.map((e) => e.t);
161
+ return { from: Math.min(...ts), to: Math.max(...ts) };
162
+ }
163
+ /** `eventWindow`'s counterpart for a list of spans rather than raw events. */
164
+ function spanWindow(spans) {
165
+ if (spans.length === 0)
166
+ return undefined;
167
+ const starts = spans.map((s) => (s.open ? s.startedAt : (s.startedAt ?? s.endedAt)));
168
+ const ends = spans.map((s) => (s.open ? s.startedAt : s.endedAt));
169
+ return { from: Math.min(...starts), to: Math.max(...ends) };
170
+ }
84
171
  /** The mark in force at a moment, or undefined if the run was not marked. */
85
172
  function markAt(marks, at) {
86
173
  let current;
@@ -102,12 +189,129 @@ export function frameBudgetMs(refreshHz) {
102
189
  const hz = refreshHz > 1 ? refreshHz : 60;
103
190
  return Math.round((1000 / hz) * 10) / 10;
104
191
  }
105
- export function findingsOf(events, marks, refreshHz) {
192
+ /**
193
+ * The budget clause every place that names a frame budget in prose shares
194
+ * (GRA-185's "second, smaller thing": `frames` and `findings` used to print
195
+ * the same quantity two different ways on the same panel). `findingsOf`'s
196
+ * own `frames-dropped` title and `frames`' tool text (index.ts) both call
197
+ * this, so the two cannot drift apart again the way GRA-185 found them.
198
+ *
199
+ * When `assumed` is true this is a guess dressed as one, not printed as an
200
+ * observed fact — `resolveProfile`'s own doc comment explains why the
201
+ * fallback matters enough to say so in the sentence itself.
202
+ */
203
+ export function describeBudget(profile) {
204
+ const ms = frameBudgetMs(profile.refreshHz);
205
+ return profile.assumed
206
+ ? `${ms}ms (assumed ${Math.round(profile.refreshHz)}Hz; no display profile seen)`
207
+ : `${ms}ms at ${Math.round(profile.refreshHz)}Hz`;
208
+ }
209
+ /**
210
+ * `null` unless `event` is a `device`/`profile` event — the one place that
211
+ * shape is read off the wire, shared by `resolveProfile` below (the live-
212
+ * buffer scan) and `sessions.ts`'s `SessionWriter.append` (capturing it into
213
+ * `meta.json` as it flows past), so the two readings can never disagree
214
+ * about what a profile event means.
215
+ */
216
+ export function profileFromEvent(event) {
217
+ if (event.event !== "device" || str(event.data.kind) !== "profile")
218
+ return null;
219
+ return {
220
+ model: str(event.data.model),
221
+ sdkInt: num(event.data.sdkInt),
222
+ abi: str(event.data.abi),
223
+ cores: num(event.data.cores),
224
+ deviceRamMb: num(event.data.deviceRamMb),
225
+ refreshHz: num(event.data.refreshHz, 60),
226
+ lowRamDevice: event.data.lowRamDevice === "true" || event.data.lowRamDevice === true,
227
+ };
228
+ }
229
+ /**
230
+ * GRA-185 ruling 1: the device profile used for the frame budget must not
231
+ * depend on whether the requested window happens to contain the one
232
+ * `device`/`profile` event `DeviceCollector` emits at startup — a window
233
+ * that starts after startup used to silently fall back to 60Hz and print it
234
+ * as though it were observed. Resolved in one order, everywhere:
235
+ *
236
+ * 1. The most recent profile event in the *live* buffer at or before the
237
+ * window's end, **regardless of the window's start** — `liveEvents`
238
+ * here must be the whole ring (or run), never pre-filtered to `from`.
239
+ * 2. Else the profile recorded in the current session's `meta.json`
240
+ * (`SessionWriter.append` captures it as it flows past — see that
241
+ * function's own comment) — covers a window the live ring has already
242
+ * rolled the startup event out of, or a disk-only read
243
+ * (`saveFromSessions`) with no live ring at all.
244
+ * 3. Else the fallback: assumed 60Hz, `assumed: true`. Every caller
245
+ * (`findings`, `save_moment`, `porthole save`, `/api/findings`,
246
+ * `/api/save`, and `frames`' own prose) resolves through this one
247
+ * function — no second copy of the search order to drift from it.
248
+ */
249
+ export function resolveProfile(params) {
250
+ const { liveEvents, windowTo, sessionProfile } = params;
251
+ let latest = null;
252
+ for (const event of liveEvents) {
253
+ if (event.t > windowTo)
254
+ continue;
255
+ const data = profileFromEvent(event);
256
+ if (!data)
257
+ continue;
258
+ if (!latest || event.t > latest.t)
259
+ latest = { t: event.t, data };
260
+ }
261
+ if (latest)
262
+ return { assumed: false, refreshHz: latest.data.refreshHz, full: latest.data };
263
+ if (sessionProfile)
264
+ return { assumed: false, refreshHz: sessionProfile.refreshHz, full: sessionProfile };
265
+ return { assumed: true, refreshHz: 60 };
266
+ }
267
+ /**
268
+ * What was still running when the recording stopped.
269
+ *
270
+ * Its own finding rather than a line folded into the counts, because an
271
+ * unfinished call is not a slow call and the two want different responses. The
272
+ * wording carries "at least" into the title and the detail on purpose: the
273
+ * number is a floor, and a reader who copies it into a bug report should copy
274
+ * that qualifier with it.
275
+ */
276
+ function stillOpenFinding(lane, id, noun, describe, marks) {
277
+ const open = lane.filter(isOpen);
278
+ if (open.length === 0)
279
+ return undefined;
280
+ const oldest = open.reduce((a, b) => (a.atLeastMs >= b.atLeastMs ? a : b));
281
+ const { label, evidence } = describe(oldest.data);
282
+ const count = open.length;
283
+ return {
284
+ id,
285
+ severity: "warning",
286
+ confidence: "observed",
287
+ title: `${count} ${count === 1 ? noun.one : noun.many} ${count === 1 ? "was" : "were"} ` +
288
+ `still open when the capture ended, the oldest for at least ${oldest.atLeastMs}ms`,
289
+ detail: `oldest: ${label} — at least, not exactly: it had not finished, so that is a floor under the wait`,
290
+ count,
291
+ during: markAt(marks, oldest.startedAt),
292
+ evidence: { oldestAtLeastMs: oldest.atLeastMs, ...evidence },
293
+ // `to` is the last moment we know it was still open — the capture's own
294
+ // last event, which is exactly what `atLeastMs` is already measured
295
+ // against — not an invented "now". A window that stopped narrating
296
+ // wherever the run happened to end would be lying about how sure it is.
297
+ window: { from: oldest.startedAt, to: oldest.startedAt + oldest.atLeastMs },
298
+ };
299
+ }
300
+ export function findingsOf(events, marks, refreshHz,
301
+ /** GRA-185: true when `refreshHz` is the 60Hz fallback rather than something the device reported — flips `frames-dropped` from `observed` to `correlated` and says so in the title, instead of stating a guess as fact. Defaults to false so every existing caller (a bare refresh rate, no opinion on how it was derived) keeps behaving exactly as before. */
302
+ assumed = false) {
106
303
  const findings = [];
107
304
  const db = spans(events, "db");
108
305
  const http = spans(events, "http");
109
306
  const work = spans(events, "work");
110
- const onMain = db.filter((q) => q.data.onMainThread === "true" || q.data.onMainThread === true);
307
+ // Completed queries only, and not merely to have an `ms` to sort on: which
308
+ // thread a query ran on is reported by the *end* event, so an open span has
309
+ // nothing to answer the question with. A query still running on the main
310
+ // thread when the capture stopped is reported by `db-still-open` instead,
311
+ // which is the more alarming finding of the two anyway.
312
+ const onMain = db
313
+ .filter(isCompleted)
314
+ .filter((q) => q.data.onMainThread === "true" || q.data.onMainThread === true);
111
315
  if (onMain.length > 0) {
112
316
  const worst = onMain.reduce((a, b) => (a.ms >= b.ms ? a : b));
113
317
  findings.push({
@@ -118,6 +322,7 @@ export function findingsOf(events, marks, refreshHz) {
118
322
  detail: `Worst was ${worst.ms}ms: ${str(worst.data.sql).slice(0, 80)}`,
119
323
  count: onMain.length,
120
324
  evidence: { worstMs: worst.ms, sql: str(worst.data.sql) },
325
+ window: { from: worst.startedAt ?? worst.endedAt, to: worst.endedAt },
121
326
  });
122
327
  }
123
328
  const stalls = events.filter((e) => e.event === "blocked");
@@ -135,9 +340,16 @@ export function findingsOf(events, marks, refreshHz) {
135
340
  at: worst.t,
136
341
  stack: str(worst.data.stack).split("\n").slice(0, 6),
137
342
  },
343
+ // `blocked` is reported when the stall ends, so `worst.t` is its end and
344
+ // the start is however long before that its own duration says.
345
+ window: { from: worst.t - num(worst.data.durationMs), to: worst.t },
138
346
  });
139
347
  }
140
- const failed = http.filter((c) => num(c.data.status) >= 400 || c.data.error !== undefined);
348
+ // Completed only see the same reasoning as `onMain` above: a status or an
349
+ // error is reported by the *end* event, so an open span cannot be a failure
350
+ // yet, only a hang (`http-still-open` already covers that). Filtering here
351
+ // also gives `first` a real `endedAt`/`startedAt` to place a window with.
352
+ const failed = http.filter(isCompleted).filter((c) => num(c.data.status) >= 400 || c.data.error !== undefined);
141
353
  if (failed.length > 0) {
142
354
  const first = failed[0];
143
355
  findings.push({
@@ -147,8 +359,26 @@ export function findingsOf(events, marks, refreshHz) {
147
359
  title: `${failed.length} HTTP ${failed.length === 1 ? "call" : "calls"} failed`,
148
360
  detail: `${str(first.data.method)} ${str(first.data.url)} → ${str(first.data.status) || str(first.data.error)}`,
149
361
  count: failed.length,
362
+ window: { from: first.startedAt ?? first.endedAt, to: first.endedAt },
150
363
  });
151
364
  }
365
+ // The hang lanes. A capture is most often run *because* something hung, so
366
+ // these are the findings least able to afford being absent.
367
+ const open = [
368
+ stillOpenFinding(http, "http-still-open", { one: "HTTP call", many: "HTTP calls" }, (data) => ({
369
+ label: `${str(data.method)} ${str(data.url)}`.trim() || "unidentified call",
370
+ evidence: { method: str(data.method), url: str(data.url) },
371
+ }), marks),
372
+ stillOpenFinding(db, "db-still-open", { one: "database query", many: "database queries" }, (data) => ({
373
+ label: str(data.sql).slice(0, 80) || "unidentified query",
374
+ evidence: { sql: str(data.sql) },
375
+ }), marks),
376
+ stillOpenFinding(work, "work-still-open", { one: "background job", many: "background jobs" }, (data) => ({
377
+ label: str(data.name) || str(data.id) || "unidentified job",
378
+ evidence: { name: str(data.name), id: str(data.id) },
379
+ }), marks),
380
+ ].filter((finding) => finding !== undefined);
381
+ findings.push(...open);
152
382
  const frames = events.filter((e) => e.event === "frame");
153
383
  if (frames.length > 0) {
154
384
  const missed = frames.reduce((sum, e) => sum + num(e.data.missedFrames, 1), 0);
@@ -163,13 +393,17 @@ export function findingsOf(events, marks, refreshHz) {
163
393
  findings.push({
164
394
  id: "frames-dropped",
165
395
  severity: "warning",
166
- confidence: "observed",
167
- title: `${missed} frames missed their deadline (budget ${frameBudgetMs(refreshHz)}ms at ${Math.round(refreshHz)}Hz)`,
396
+ confidence: assumed ? "correlated" : "observed",
397
+ title: `${missed} frames missed their deadline (budget ${describeBudget({ refreshHz, assumed })})`,
168
398
  detail: commonest
169
399
  ? `worst ${num(worst.data.totalMs)}ms · most often in ${commonest[0]}`
170
400
  : undefined,
171
401
  count: missed,
172
402
  during: markAt(marks, worst.t),
403
+ // A `frame` event is posted when the frame finishes, so `worst.t` is its
404
+ // end and its own totalMs backdates the start — the same reasoning as
405
+ // `main-thread-stall`.
406
+ window: { from: worst.t - num(worst.data.totalMs), to: worst.t },
173
407
  });
174
408
  }
175
409
  const gc = events.filter((e) => e.event === "gc" && num(e.data.blocking) > 0);
@@ -181,6 +415,11 @@ export function findingsOf(events, marks, refreshHz) {
181
415
  confidence: "observed",
182
416
  title: `${gc.length} blocking collections paused the app for ${paused}ms`,
183
417
  count: gc.length,
418
+ // Not `spanning`: unlike a trace-side aggregate that sums duration with
419
+ // no timestamp of its own, every contributing collection here is a real
420
+ // event with a real `t`, so a window from the earliest to the latest is
421
+ // exactly where the count came from, not an invented range.
422
+ window: eventWindow(gc),
184
423
  });
185
424
  }
186
425
  const trims = events.filter((e) => e.event === "device" && str(e.data.kind) === "trimMemory");
@@ -192,6 +431,7 @@ export function findingsOf(events, marks, refreshHz) {
192
431
  title: `the system asked for memory back ${trims.length} ${trims.length === 1 ? "time" : "times"}`,
193
432
  detail: `worst level: ${str(trims[trims.length - 1].data.level)}`,
194
433
  count: trims.length,
434
+ window: eventWindow(trims),
195
435
  });
196
436
  }
197
437
  const retried = work.filter((w) => w.data.retrying === "true");
@@ -202,6 +442,7 @@ export function findingsOf(events, marks, refreshHz) {
202
442
  confidence: "observed",
203
443
  title: `${retried.length} background ${retried.length === 1 ? "job" : "jobs"} retried`,
204
444
  count: retried.length,
445
+ window: spanWindow(retried),
205
446
  });
206
447
  }
207
448
  // The only correlated one, and a note for that reason.
@@ -229,26 +470,75 @@ export function findingsOf(events, marks, refreshHz) {
229
470
  ? `most often within a frame of ${trigger[0]} — ordering, not proof`
230
471
  : undefined,
231
472
  count: hottest[1],
473
+ // Scoped to the hottest component's own recompositions, not every
474
+ // recompose in the run, so the window is as tight as the count it
475
+ // labels rather than as wide as the whole capture.
476
+ window: eventWindow(recompose.filter((e) => str(e.data.name) === hottest[0])),
232
477
  });
233
478
  }
234
479
  }
480
+ // exit-findings (GRA-58): a death the device reported, at the severity the
481
+ // ticket named explicitly — ANR, crash, native crash, low memory and
482
+ // excessive resource usage are `error` (each means the system killed the
483
+ // app, for a reason worth an agent's attention); a user-requested exit is
484
+ // a `note` (informational: the app is not running, but nothing is wrong).
485
+ // Everything else — REASON_OTHER, a signal, a background kill — produces
486
+ // no finding at all: those are the normal shape of an app's process being
487
+ // recycled, not evidence of anything.
488
+ const exits = events.filter((e) => e.event === "exit");
489
+ for (const exit of exits) {
490
+ const reason = str(exit.data.reason);
491
+ const severity = EXIT_ERROR_REASONS.has(reason)
492
+ ? "error"
493
+ : reason === "REASON_USER_REQUESTED"
494
+ ? "note"
495
+ : undefined;
496
+ if (!severity)
497
+ continue;
498
+ const versionName = exit.data.versionName != null ? str(exit.data.versionName) : null;
499
+ const versionAssumed = exit.data.versionAssumed === true;
500
+ const build = versionName ? `${versionName}${versionAssumed ? " (assumed)" : ""}` : "an unknown build";
501
+ const topFrame = str(exit.data.mainStack).split("\n")[0] || undefined;
502
+ // GRA-113: `spanning`, not `window`. `exit.t` is a timestamp in *this*
503
+ // process's uptime clock — the one reporting the death, at its next
504
+ // check-in — not the dead process's, whose own uptime clock reset with
505
+ // it and is gone. Placing the finding at `exit.t` would draw the death as
506
+ // though it happened just now, in the wrong process's session.
507
+ const predates = "the death predates this process's uptime clock, so it cannot be placed on this session's timeline";
508
+ const description = str(exit.data.description) || undefined;
509
+ findings.push({
510
+ id: `exit-${num(exit.data.timestamp)}`,
511
+ severity,
512
+ confidence: "observed",
513
+ title: `${reason} — ${build}` + (topFrame ? ` — ${topFrame}` : ""),
514
+ detail: description ? `${description} (${predates})` : predates,
515
+ during: markAt(marks, exit.t),
516
+ evidence: {
517
+ reason,
518
+ versionName,
519
+ versionAssumed,
520
+ timestamp: num(exit.data.timestamp),
521
+ ...(topFrame ? { topFrame } : {}),
522
+ },
523
+ spanning: true,
524
+ });
525
+ }
235
526
  const order = { error: 0, warning: 1, note: 2 };
236
527
  return findings.sort((a, b) => order[a.severity] - order[b.severity]);
237
528
  }
529
+ /** `error`-severity exit reasons (GRA-58#exit-findings) — see `findingsOf`'s own comment for the rest of the mapping. */
530
+ const EXIT_ERROR_REASONS = new Set([
531
+ "REASON_ANR",
532
+ "REASON_CRASH",
533
+ "REASON_CRASH_NATIVE",
534
+ "REASON_LOW_MEMORY",
535
+ "REASON_EXCESSIVE_RESOURCE_USAGE",
536
+ ]);
238
537
  export function buildTrace(options) {
239
- const { events, hello } = options;
240
- const profile = events.find((e) => e.event === "device" && str(e.data.kind) === "profile");
241
- const device = profile
242
- ? {
243
- model: str(profile.data.model),
244
- sdkInt: num(profile.data.sdkInt),
245
- abi: str(profile.data.abi),
246
- cores: num(profile.data.cores),
247
- deviceRamMb: num(profile.data.deviceRamMb),
248
- refreshHz: num(profile.data.refreshHz, 60),
249
- lowRamDevice: profile.data.lowRamDevice === "true",
250
- }
251
- : { model: str(hello?.device), sdkInt: num(hello?.sdkInt), refreshHz: 60 };
538
+ const { events, hello, profile } = options;
539
+ const device = profile.assumed
540
+ ? { model: str(hello?.device), sdkInt: num(hello?.sdkInt), refreshHz: profile.refreshHz }
541
+ : { ...profile.full, refreshHz: profile.refreshHz };
252
542
  const marks = events
253
543
  .filter((e) => e.event === "mark")
254
544
  .map((e) => ({
@@ -269,7 +559,7 @@ export function buildTrace(options) {
269
559
  device,
270
560
  marks,
271
561
  metrics: metricsOf(events),
272
- findings: findingsOf(events, marks, num(device.refreshHz, 60)),
562
+ findings: findingsOf(events, marks, profile.refreshHz, profile.assumed),
273
563
  events: options.withEvents ? events : undefined,
274
564
  };
275
565
  }