@tanqory/theme-conformance 0.1.0-alpha.14 → 0.1.0-alpha.15

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.
@@ -1,4 +1,4 @@
1
1
  {
2
- "gitHead": "100a4073766b0f3d55be884e68683ece5a84a773",
2
+ "gitHead": "ce9cb109aaf341115f02d02ba8515bc6dffe8a5c",
3
3
  "dirty": false
4
4
  }
@@ -1,3 +1,4 @@
1
+ import type { CDPSession, Page } from 'playwright';
1
2
  import { type SfContext } from './context.js';
2
3
  import type { BudgetMeasurement } from './report.js';
3
4
  /** Lighthouse mobile scoring curves (v10–v12): metric → {p10, median, weight}. */
@@ -54,12 +55,116 @@ export declare function initialClient(ctx: SfContext): {
54
55
  gzip: number;
55
56
  }[];
56
57
  } | null;
57
- export declare function labMetrics(ctx: SfContext, path: string): Promise<{
58
+ /**
59
+ * Host calibration. CDP CPU throttling slows the renderer relative to the host it runs on, so on a host whose
60
+ * cores are shared with other work the page is slowed by the throttle AND by the contention (4× on a quiet
61
+ * host became ~8–16× at load 50–240: the same theme scored 96–99 quiet and 76–83 loaded). The runner therefore
62
+ * measures the contention the renderer main thread sees — wall-clock ÷ thread-CPU time of a fixed busy loop,
63
+ * 1.0 on an idle core — and divides the throttle rate by it, so the page is slowed ~4× relative to the
64
+ * UNCONTENDED host in both cases. It then re-measures the contention the measured page's own tasks saw
65
+ * (Σ task wall time ÷ main-thread CPU time over the measurement window) to know the slowdown actually applied.
66
+ */
67
+ export declare const HOST_CALIBRATION: {
68
+ /** busy-loop samples per calibration, each a fixed iteration count (~50 ms of CPU on a 2020 desktop core) */
69
+ readonly samples: 5;
70
+ readonly iterations: 15000000;
71
+ /** a measurement is at the target slowdown when effective/target is within [1/tolerance, tolerance] */
72
+ readonly tolerance: 1.25;
73
+ /** measurements per page at most; one is enough when it decides and is ≥ `margin` points from the budget */
74
+ readonly maxRuns: 4;
75
+ readonly margin: 5;
76
+ };
77
+ export interface HostSample {
78
+ /** contention before the run: median wall ÷ thread-CPU of the busy loop (1.0 = idle core) */
79
+ hostFactor: number;
80
+ /** the CDP throttle rate applied: target ÷ hostFactor, within [1, target] */
81
+ cpuRate: number;
82
+ /** contention the page's own tasks saw during the measurement window */
83
+ windowFactor: number;
84
+ /** cpuRate × windowFactor: the slowdown actually applied relative to the uncontended host */
85
+ effectiveSlowdown: number;
86
+ /** main-thread task CPU and wall time in the trace (absent when there was no usable trace) */
87
+ taskCpuMs?: number;
88
+ taskWallMs?: number;
89
+ /** set when the trace gave nothing and windowFactor is the busy-loop figure */
90
+ windowFrom?: 'busy-loop';
91
+ }
92
+ export type LabRun = {
93
+ score: number;
94
+ metrics: {
95
+ fcpMs: number;
96
+ lcpMs: number;
97
+ tbtMs: number;
98
+ cls: number;
99
+ siMs: number;
100
+ loadMs: number;
101
+ };
102
+ host: HostSample;
103
+ };
104
+ /**
105
+ * Whether one run can decide the verdict. At the target slowdown (within tolerance) it can either way. Slowed
106
+ * MORE than the target (the host got busier than calibration saw, or contention exceeds what lowering the
107
+ * throttle can offset) it is pessimistic: a pass still proves the theme passes, a fail proves nothing. Slowed
108
+ * LESS than the target it is optimistic: only a fail is proof.
109
+ */
110
+ export declare function runDecides(run: Pick<LabRun, 'score' | 'host'>, budget?: number, target?: number, tolerance?: number): boolean;
111
+ export type PageVerdict = {
112
+ score: number | null;
113
+ decided: boolean;
114
+ runs: LabRun[];
115
+ };
116
+ /** A page's score: the lower median of the runs that can decide it; `decided: false` when none can. */
117
+ export declare function pageVerdict(runs: LabRun[], budget?: number): PageVerdict;
118
+ /**
119
+ * True once more runs cannot change the page's verdict enough to matter: one run that decides (at the target,
120
+ * or over-slowed and passing, or under-slowed and failing) and is ≥ `margin` points clear of the budget.
121
+ */
122
+ export declare function enoughRuns(runs: LabRun[], budget?: number): boolean;
123
+ /**
124
+ * The CDP rate for the next run of a page, from its previous runs (undefined for the first: then the busy-loop
125
+ * contention sets it). The page's contention depends on the rate itself — the throttle burns CPU, so a heavily
126
+ * throttled renderer competes like a batch job while a lightly throttled one stays interactive — so a plain
127
+ * proportional correction can jump from one side of the band to the other. The rate is therefore also kept
128
+ * strictly between the highest rate that slowed the page too little and the lowest that slowed it too much.
129
+ */
130
+ export declare function nextCpuRate(runs: readonly Pick<LabRun, 'host'>[], target?: number, tolerance?: number): number | undefined;
131
+ type Cdp = CDPSession;
132
+ /** Median wall ÷ main-thread CPU time of a fixed busy loop, unthrottled, in `page`'s renderer. */
133
+ export declare function measureHostFactor(page: Page, cdp: Cdp): Promise<number>;
134
+ type TraceEvent = {
135
+ name: string;
136
+ ph: string;
137
+ pid: number;
138
+ tid: number;
139
+ dur?: number;
140
+ tdur?: number;
141
+ args?: {
142
+ name?: string;
143
+ };
144
+ };
145
+ /**
146
+ * Contention the renderer main thread saw, from a `toplevel` trace: Σ wall ÷ Σ thread-CPU time of its tasks
147
+ * (`dur` / `tdur`). The CDP throttle burns CPU on the throttled thread, so it is in both and cancels out: what
148
+ * is left is the share of time the thread was runnable but not running. The main thread is the CrRendererMain
149
+ * with the most task CPU (the tab's first renderer, at about:blank, may be swapped out by the navigation).
150
+ */
151
+ export declare function traceContention(events: readonly TraceEvent[]): {
152
+ factor: number;
153
+ cpuMs: number;
154
+ wallMs: number;
155
+ } | null;
156
+ /**
157
+ * One lab measurement. `cpuRate` defaults to target ÷ the busy-loop contention measured just before; a re-run
158
+ * passes the rate corrected by the previous run's trace contention.
159
+ */
160
+ export declare function labMetrics(ctx: SfContext, path: string, cpuRateHint?: number): Promise<{
58
161
  fcp: number;
59
162
  lcp: number;
60
163
  tbt: number;
61
164
  cls: number;
62
165
  si: number;
63
166
  load: number;
167
+ host: HostSample;
64
168
  } | null>;
65
169
  export declare function budgets(ctx: SfContext, measurements: BudgetMeasurement[]): Promise<void>;
170
+ export {};
@@ -87,25 +87,178 @@ const INIT = `(() => {
87
87
  try { new PerformanceObserver((l) => { for (const e of l.getEntries()) if (!e.hadRecentInput) m.cls += e.value }).observe({ type: 'layout-shift', buffered: true }) } catch {}
88
88
  try { new PerformanceObserver((l) => { for (const e of l.getEntries()) m.longTasks.push([e.startTime, e.duration]) }).observe({ type: 'longtask', buffered: true }) } catch {}
89
89
  })()`;
90
- export async function labMetrics(ctx, path) {
90
+ /**
91
+ * Host calibration. CDP CPU throttling slows the renderer relative to the host it runs on, so on a host whose
92
+ * cores are shared with other work the page is slowed by the throttle AND by the contention (4× on a quiet
93
+ * host became ~8–16× at load 50–240: the same theme scored 96–99 quiet and 76–83 loaded). The runner therefore
94
+ * measures the contention the renderer main thread sees — wall-clock ÷ thread-CPU time of a fixed busy loop,
95
+ * 1.0 on an idle core — and divides the throttle rate by it, so the page is slowed ~4× relative to the
96
+ * UNCONTENDED host in both cases. It then re-measures the contention the measured page's own tasks saw
97
+ * (Σ task wall time ÷ main-thread CPU time over the measurement window) to know the slowdown actually applied.
98
+ */
99
+ export const HOST_CALIBRATION = {
100
+ /** busy-loop samples per calibration, each a fixed iteration count (~50 ms of CPU on a 2020 desktop core) */
101
+ samples: 5,
102
+ iterations: 15_000_000,
103
+ /** a measurement is at the target slowdown when effective/target is within [1/tolerance, tolerance] */
104
+ tolerance: 1.25,
105
+ /** measurements per page at most; one is enough when it decides and is ≥ `margin` points from the budget */
106
+ maxRuns: 4,
107
+ margin: 5,
108
+ };
109
+ /**
110
+ * Whether one run can decide the verdict. At the target slowdown (within tolerance) it can either way. Slowed
111
+ * MORE than the target (the host got busier than calibration saw, or contention exceeds what lowering the
112
+ * throttle can offset) it is pessimistic: a pass still proves the theme passes, a fail proves nothing. Slowed
113
+ * LESS than the target it is optimistic: only a fail is proof.
114
+ */
115
+ export function runDecides(run, budget = PERF_BUDGET, target = MOBILE_THROTTLE.cpuSlowdown, tolerance = HOST_CALIBRATION.tolerance) {
116
+ const r = run.host.effectiveSlowdown / target;
117
+ if (r <= tolerance && r >= 1 / tolerance)
118
+ return true;
119
+ return r > tolerance ? run.score >= budget : run.score < budget;
120
+ }
121
+ /** Lower median (the conservative middle for an even count). */
122
+ function lowerMedian(xs) {
123
+ const s = [...xs].sort((a, b) => a - b);
124
+ return s[Math.floor((s.length - 1) / 2)];
125
+ }
126
+ /** A page's score: the lower median of the runs that can decide it; `decided: false` when none can. */
127
+ export function pageVerdict(runs, budget = PERF_BUDGET) {
128
+ const ok = runs.filter((r) => runDecides(r, budget));
129
+ return ok.length ? { score: lowerMedian(ok.map((r) => r.score)), decided: true, runs } : { score: null, decided: false, runs };
130
+ }
131
+ /**
132
+ * True once more runs cannot change the page's verdict enough to matter: one run that decides (at the target,
133
+ * or over-slowed and passing, or under-slowed and failing) and is ≥ `margin` points clear of the budget.
134
+ */
135
+ export function enoughRuns(runs, budget = PERF_BUDGET) {
136
+ if (runs.length >= HOST_CALIBRATION.maxRuns)
137
+ return true;
138
+ if (runs.length !== 1)
139
+ return false;
140
+ const r = runs[0];
141
+ return runDecides(r, budget) && Math.abs(r.score - budget) >= HOST_CALIBRATION.margin;
142
+ }
143
+ /**
144
+ * The CDP rate for the next run of a page, from its previous runs (undefined for the first: then the busy-loop
145
+ * contention sets it). The page's contention depends on the rate itself — the throttle burns CPU, so a heavily
146
+ * throttled renderer competes like a batch job while a lightly throttled one stays interactive — so a plain
147
+ * proportional correction can jump from one side of the band to the other. The rate is therefore also kept
148
+ * strictly between the highest rate that slowed the page too little and the lowest that slowed it too much.
149
+ */
150
+ export function nextCpuRate(runs, target = MOBILE_THROTTLE.cpuSlowdown, tolerance = HOST_CALIBRATION.tolerance) {
151
+ const prev = runs[runs.length - 1];
152
+ if (!prev)
153
+ return undefined;
154
+ let lo = 1;
155
+ let hi = target;
156
+ let under = false;
157
+ let over = false;
158
+ for (const r of runs) {
159
+ const ratio = r.host.effectiveSlowdown / target;
160
+ if (ratio < 1 / tolerance && r.host.cpuRate >= lo) {
161
+ lo = r.host.cpuRate;
162
+ under = true;
163
+ }
164
+ if (ratio > tolerance && r.host.cpuRate <= hi) {
165
+ hi = r.host.cpuRate;
166
+ over = true;
167
+ }
168
+ }
169
+ const clamp = (x) => Math.min(target, Math.max(1, x));
170
+ const proportional = clamp(target / prev.host.windowFactor);
171
+ if (under && over && hi <= lo)
172
+ return proportional; // the page's contention changed under it: start afresh
173
+ const inside = (x) => (!under || x > lo) && (!over || x < hi);
174
+ if (inside(proportional))
175
+ return proportional;
176
+ return clamp(under && over ? Math.sqrt(lo * hi) : over ? Math.max(1, hi / 2) : Math.min(target, lo * 2));
177
+ }
178
+ async function cdpMetrics(cdp) {
179
+ const r = (await cdp.send('Performance.getMetrics'));
180
+ return Object.fromEntries(r.metrics.map((m) => [m.name, m.value]));
181
+ }
182
+ /** Median wall ÷ main-thread CPU time of a fixed busy loop, unthrottled, in `page`'s renderer. */
183
+ export async function measureHostFactor(page, cdp) {
184
+ await cdp.send('Emulation.setCPUThrottlingRate', { rate: 1 });
185
+ const ratios = [];
186
+ for (let i = 0; i < HOST_CALIBRATION.samples; i++) {
187
+ const a = await cdpMetrics(cdp);
188
+ const wall = await page.evaluate((n) => { const t = performance.now(); let x = 0; for (let j = 0; j < n; j++)
189
+ x = (x + j * 7) % 1000003; return x >= 0 ? performance.now() - t : 0; }, HOST_CALIBRATION.iterations);
190
+ const z = await cdpMetrics(cdp);
191
+ const cpu = ((z.ThreadTime ?? 0) - (a.ThreadTime ?? 0)) * 1000;
192
+ if (cpu > 0 && wall > 0)
193
+ ratios.push(wall / cpu);
194
+ }
195
+ // a thread cannot run faster than its own CPU time: a ratio < 1 is timer granularity, read as 1
196
+ return ratios.length ? Math.max(1, lowerMedian(ratios)) : 1;
197
+ }
198
+ /**
199
+ * Contention the renderer main thread saw, from a `toplevel` trace: Σ wall ÷ Σ thread-CPU time of its tasks
200
+ * (`dur` / `tdur`). The CDP throttle burns CPU on the throttled thread, so it is in both and cancels out: what
201
+ * is left is the share of time the thread was runnable but not running. The main thread is the CrRendererMain
202
+ * with the most task CPU (the tab's first renderer, at about:blank, may be swapped out by the navigation).
203
+ */
204
+ export function traceContention(events) {
205
+ const main = new Set(events.filter((e) => e.ph === 'M' && e.name === 'thread_name' && e.args?.name === 'CrRendererMain').map((e) => `${e.pid}:${e.tid}`));
206
+ const per = new Map();
207
+ for (const e of events) {
208
+ if (e.ph !== 'X' || (e.name !== 'ThreadControllerImpl::RunTask' && e.name !== 'RunTask') || e.dur === undefined || e.tdur === undefined)
209
+ continue;
210
+ const k = `${e.pid}:${e.tid}`;
211
+ if (!main.has(k))
212
+ continue;
213
+ const v = per.get(k) ?? { dur: 0, tdur: 0 };
214
+ v.dur += e.dur;
215
+ v.tdur += e.tdur;
216
+ per.set(k, v);
217
+ }
218
+ const best = [...per.values()].sort((x, y) => y.tdur - x.tdur)[0];
219
+ if (!best || best.tdur <= 0)
220
+ return null;
221
+ return { factor: Math.max(1, best.dur / best.tdur), cpuMs: Math.round(best.tdur / 1000), wallMs: Math.round(best.dur / 1000) };
222
+ }
223
+ /**
224
+ * One lab measurement. `cpuRate` defaults to target ÷ the busy-loop contention measured just before; a re-run
225
+ * passes the rate corrected by the previous run's trace contention.
226
+ */
227
+ export async function labMetrics(ctx, path, cpuRateHint) {
91
228
  const t = await openTab(ctx.harness, ctx.gw, { viewport: 'mobile', consentKnown: true });
92
229
  try {
93
230
  t.session.throttle = { rttMs: MOBILE_THROTTLE.rttMs, kbps: MOBILE_THROTTLE.kbps };
94
231
  await t.context.addInitScript({ content: INIT });
95
232
  const cdp = await t.context.newCDPSession(t.page);
96
- await cdp.send('Emulation.setCPUThrottlingRate', { rate: MOBILE_THROTTLE.cpuSlowdown });
233
+ await cdp.send('Performance.enable');
234
+ const hostFactor = await measureHostFactor(t.page, cdp);
235
+ const target = MOBILE_THROTTLE.cpuSlowdown;
236
+ const cpuRate = Math.min(target, Math.max(1, cpuRateHint ?? target / hostFactor));
237
+ await cdp.send('Emulation.setCPUThrottlingRate', { rate: cpuRate });
238
+ const events = [];
239
+ const onData = (d) => { events.push(...d.value); };
240
+ cdp.on('Tracing.dataCollected', onData);
241
+ await cdp.send('Tracing.start', { traceConfig: { includedCategories: ['toplevel'], recordMode: 'recordAsMuchAsPossible' }, transferMode: 'ReportEvents' });
97
242
  const t0 = Date.now();
98
243
  await t.go(path);
99
244
  const load = Date.now() - t0;
100
245
  await sleep(3000);
246
+ const done = new Promise((res) => { cdp.once('Tracing.tracingComplete', () => res()); });
247
+ await cdp.send('Tracing.end').catch(() => { });
248
+ await Promise.race([done, sleep(5000)]);
249
+ cdp.off('Tracing.dataCollected', onData);
101
250
  const m = await t.page.evaluate(() => globalThis.__tqLab).catch(() => null);
102
251
  await cdp.detach().catch(() => { });
103
252
  if (!m || m.fcp === null)
104
253
  return null;
254
+ // no usable trace: fall back to the busy-loop contention (never to "no contention")
255
+ const tc = traceContention(events);
256
+ const windowFactor = tc?.factor ?? hostFactor;
105
257
  const fcp = m.fcp;
106
258
  const lcp = m.lcp ?? fcp;
107
259
  const tbt = m.longTasks.filter(([s]) => s >= fcp).reduce((n, [, d]) => n + Math.max(0, d - 50), 0);
108
- return { fcp, lcp, tbt, cls: m.cls, si: (fcp + lcp) / 2, load };
260
+ const r2 = (x) => Math.round(x * 100) / 100;
261
+ return { fcp, lcp, tbt, cls: m.cls, si: (fcp + lcp) / 2, load, host: { hostFactor: r2(hostFactor), cpuRate: r2(cpuRate), windowFactor: r2(windowFactor), effectiveSlowdown: r2(cpuRate * windowFactor), ...(tc ? { taskCpuMs: tc.cpuMs, taskWallMs: tc.wallMs } : { windowFrom: 'busy-loop' }) } };
109
262
  }
110
263
  finally {
111
264
  await t.close();
@@ -151,22 +304,40 @@ export async function budgets(ctx, measurements) {
151
304
  finally {
152
305
  await rt.close();
153
306
  }
154
- // lab approximation of Lighthouse mobile performance
307
+ // lab approximation of Lighthouse mobile performance, throttled relative to the uncontended host
155
308
  const pages = ['/', `/products/${HERO.handle}`];
156
- const scores = [];
309
+ const verdicts = [];
157
310
  for (const p of pages) {
158
- const m = await labMetrics(ctx, p);
159
- if (m)
160
- scores.push({ path: p, score: perfScore(m), metrics: { fcpMs: Math.round(m.fcp), lcpMs: Math.round(m.lcp), tbtMs: Math.round(m.tbt), cls: Number(m.cls.toFixed(3)), siMs: Math.round(m.si), loadMs: m.load } });
311
+ const runs = [];
312
+ while (!enoughRuns(runs)) {
313
+ // after a run off the target, re-run with the rate corrected by the contention that run's page saw
314
+ const m = await labMetrics(ctx, p, nextCpuRate(runs));
315
+ if (!m)
316
+ break;
317
+ runs.push({ score: perfScore(m), metrics: { fcpMs: Math.round(m.fcp), lcpMs: Math.round(m.lcp), tbtMs: Math.round(m.tbt), cls: Number(m.cls.toFixed(3)), siMs: Math.round(m.si), loadMs: m.load }, host: m.host });
318
+ }
319
+ if (runs.length)
320
+ verdicts.push({ path: p, ...pageVerdict(runs) });
161
321
  }
162
- const perf = scores.length ? Math.min(...scores.map((s) => s.score)) : null;
163
- const note = `LAB APPROXIMATION, not Lighthouse: mobile 390×844 DPR2, CPU ${MOBILE_THROTTLE.cpuSlowdown}× (CDP), every response delayed ${MOBILE_THROTTLE.rttMs} ms + size/${MOBILE_THROTTLE.kbps} kbps by the gateway; FCP/LCP/CLS/long tasks from PerformanceObserver; TBT = Σ(longtask−50ms) after FCP; Speed Index NOT measured — taken as (FCP+LCP)/2; scored with Lighthouse's mobile log-normal curves and weights; min over ${pages.join(', ')}`;
164
- measurements.push({ name: 'performanceScoreMobile', unit: 'score', value: perf, budget: PERF_BUDGET, method: 'lab-approximation', status: perf === null ? 'not_measured' : perf < PERF_BUDGET ? 'over_budget' : 'ok', note });
165
- add(ctx, perf === null
166
- ? { tier, id: 'budgets:performance', group: 'budgets', title: `Mobile performance ≥ ${PERF_BUDGET} (lab)`, status: 'incomplete', message: 'no paint was observed', fixHint: 're-run; the page did not paint under throttling' }
167
- : perf < PERF_BUDGET
168
- ? { tier, id: 'budgets:performance', group: 'budgets', title: `Mobile performance ≥ ${PERF_BUDGET} (lab)`, status: 'fail', message: `lab performance score ${perf} < ${PERF_BUDGET}`, evidence: { details: scores }, fixHint: 'reduce initial JS (TBT) and make the LCP element (usually the hero image) load early' }
169
- : { tier, id: 'budgets:performance', group: 'budgets', title: `Mobile performance ≥ ${PERF_BUDGET} (lab)`, status: 'pass', evidence: { details: scores } });
322
+ const decided = verdicts.filter((v) => v.decided);
323
+ const undecided = verdicts.filter((v) => !v.decided);
324
+ const perf = decided.length ? Math.min(...decided.map((v) => v.score)) : null;
325
+ const failed = perf !== null && perf < PERF_BUDGET;
326
+ const allRuns = verdicts.flatMap((v) => v.runs);
327
+ const maxHost = allRuns.length ? Math.max(...allRuns.map((r) => r.host.hostFactor)) : null;
328
+ const maxEff = allRuns.length ? Math.max(...allRuns.map((r) => r.host.effectiveSlowdown)) : null;
329
+ const details = { target: { cpuSlowdown: MOBILE_THROTTLE.cpuSlowdown, tolerance: HOST_CALIBRATION.tolerance }, hostFactorMax: maxHost, effectiveSlowdownMax: maxEff, pages: verdicts.map((v) => ({ path: v.path, score: v.score, decided: v.decided, runs: v.runs })) };
330
+ const inconclusive = !failed && undecided.length > 0;
331
+ const note = `LAB APPROXIMATION, not Lighthouse: mobile 390×844 DPR2, CPU ${MOBILE_THROTTLE.cpuSlowdown}× the uncontended host (CDP rate = ${MOBILE_THROTTLE.cpuSlowdown} ÷ measured host contention, min 1), every response delayed ${MOBILE_THROTTLE.rttMs} ms + size/${MOBILE_THROTTLE.kbps} kbps by the gateway; FCP/LCP/CLS/long tasks from PerformanceObserver; TBT = Σ(longtask−50ms) after FCP; Speed Index NOT measured — taken as (FCP+LCP)/2; scored with Lighthouse's mobile log-normal curves and weights; lower median of up to ${HOST_CALIBRATION.maxRuns} runs per page that are at ${MOBILE_THROTTLE.cpuSlowdown}× within ×${HOST_CALIBRATION.tolerance} (or slowed more and passing, or less and failing), min over ${pages.join(', ')}; host contention max ×${maxHost ?? 'n/a'}, effective slowdown max ×${maxEff ?? 'n/a'}${inconclusive ? '; INCONCLUSIVE: the host was too loaded to slow the page only 4×' : ''}`;
332
+ measurements.push({ name: 'performanceScoreMobile', unit: 'score', value: perf, budget: PERF_BUDGET, method: 'lab-approximation', status: perf === null || inconclusive ? 'not_measured' : failed ? 'over_budget' : 'ok', note });
333
+ const title = `Mobile performance ≥ ${PERF_BUDGET} (lab)`;
334
+ add(ctx, verdicts.length === 0
335
+ ? { tier, id: 'budgets:performance', group: 'budgets', title, status: 'incomplete', message: 'no paint was observed', fixHint: 're-run; the page did not paint under throttling' }
336
+ : failed
337
+ ? { tier, id: 'budgets:performance', group: 'budgets', title, status: 'fail', message: `lab performance score ${perf} < ${PERF_BUDGET}`, evidence: { details }, fixHint: 'reduce initial JS (TBT) and make the LCP element (usually the hero image) load early' }
338
+ : inconclusive
339
+ ? { tier, id: 'budgets:performance', group: 'budgets', title, status: 'warn', message: `inconclusive: this host was too busy to measure (host contention up to ×${maxHost}, the page was slowed up to ×${maxEff} instead of ×${MOBILE_THROTTLE.cpuSlowdown}) and the over-slowed score ${Math.min(...undecided.flatMap((v) => v.runs.map((r) => r.score)))} is below ${PERF_BUDGET}${perf !== null ? `; the pages measured at the target scored ${perf}` : ''}`, evidence: { details }, fixHint: 're-run when the machine is less busy (close other builds/tests); this is not a theme failure' }
340
+ : { tier, id: 'budgets:performance', group: 'budgets', title, status: 'pass', evidence: { details } });
170
341
  // accessibility score approximation: share of applicable axe rules that pass (equal weights)
171
342
  const t = await openTab(ctx.harness, ctx.gw, { viewport: 'mobile', consentKnown: true });
172
343
  const per = [];
@@ -1 +1 @@
1
- {"version":3,"file":"budgets.js","sourceRoot":"","sources":["../../src/storefront/budgets.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"budgets.js","sourceRoot":"","sources":["../../src/storefront/budgets.ts"],"names":[],"mappings":"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"}
@@ -105,9 +105,9 @@ Status per check: `pass`, `fail`, `warn` (reported, never fails the tier), `not_
105
105
 
106
106
  **What is approximated (exactly).** Lighthouse is not run: its own navigation would bypass the gateway
107
107
  that answers every request in-process. The runner measures in its own Chromium instead:
108
- - mobile 390×844 DPR 2; CPU slowed 4× (`Emulation.setCPUThrottlingRate`); every response delayed by
109
- 150 ms + (bytes on the wire × 8 / 1638.4 kbps) by the gateway, text counted gzipped (Lighthouse's
110
- "slow 4G" figures applied per response, not a simulated connection pool);
108
+ - mobile 390×844 DPR 2; CPU slowed 4× relative to the **uncontended** host (see "Busy hosts" below);
109
+ every response delayed by 150 ms + (bytes on the wire × 8 / 1638.4 kbps) by the gateway, text counted
110
+ gzipped (Lighthouse's "slow 4G" figures applied per response, not a simulated connection pool);
111
111
  - FCP, LCP and CLS from `PerformanceObserver`; TBT = Σ(long task − 50 ms) after FCP over load + 3 s;
112
112
  - **Speed Index is not measured** (no filmstrip); it is taken as (FCP + LCP) / 2;
113
113
  - the score uses Lighthouse's mobile log-normal curves and weights (FCP 10, SI 10, LCP 25, TBT 30, CLS 25);
@@ -116,6 +116,35 @@ that answers every request in-process. The runner measures in its own Chromium i
116
116
 
117
117
  Both scores are labelled `lab-approximation` in the report and are not Lighthouse scores.
118
118
 
119
+ **Busy hosts (host calibration).** `Emulation.setCPUThrottlingRate` slows the renderer relative to the machine
120
+ it runs on, so on a machine whose cores are busy with other work the page is slowed by the throttle *and* by
121
+ the contention: the same theme scored 96–99 on a quiet 6-core host and 76–83 at load 50–240. The runner
122
+ therefore measures and removes the contention instead of letting it count against the theme:
123
+
124
+ 1. *Before* each lab run it times a fixed busy loop in the page's renderer, unthrottled: wall-clock ÷ the main
125
+ thread's CPU time (`Performance.getMetrics` `ThreadTime`) is the host contention, 1.0 on an idle core. The
126
+ CDP rate is `4 ÷ contention`, never below 1.
127
+ 2. *During* the run it records a `toplevel` trace. Σ wall ÷ Σ CPU time (`dur` / `tdur`) of the renderer main
128
+ thread's tasks is the contention the measured page actually saw (the throttle burns CPU on that thread,
129
+ so it cancels out). `effectiveSlowdown = rate × that factor` is the slowdown the page really got.
130
+ 3. A run *decides* the verdict when its effective slowdown is 4× within ×1.25 (3.2–5×). A run slowed more
131
+ than that still proves a **pass** (the theme passed under a harsher device); a run slowed less still
132
+ proves a **fail**. A run off the target is repeated with the rate corrected by its own measured contention,
133
+ kept strictly between the highest rate that slowed the page too little and the lowest that slowed it too
134
+ much (the contention depends on the rate: a heavily throttled renderer burns CPU and is scheduled like a
135
+ batch job, a lightly throttled one stays interactive, so a plain correction can overshoot the band).
136
+ 4. One run per page is enough when it decides and is ≥ 5 points from the budget; otherwise up to four.
137
+ The page score is the lower median of its deciding runs; the check is the minimum over the pages.
138
+ 5. If a page has no deciding run (every run was over-slowed and below 85, or under-slowed and above it) and
139
+ no decided page failed, `budgets:performance` is **`warn`** with `inconclusive: this host was too busy…`
140
+ and the measured factors — not a failure, and not a pass of the theme. Re-run on a quieter machine.
141
+
142
+ On a quiet host the contention is ~1.0, the rate stays 4× and the result is what it was before calibration.
143
+ The busy-loop is not an absolute reference device: throttling stays relative to the machine's own idle
144
+ speed, as before, so a quiet fast machine and a quiet slow one judge a theme exactly as they did. Every run's
145
+ `hostFactor`, `cpuRate`, `windowFactor` and `effectiveSlowdown` is in the check's `evidence.details.pages[].runs`,
146
+ and the maxima in the `performanceScoreMobile` measurement note.
147
+
119
148
  ## 4. Locale-key patterns (the semantic fallback)
120
149
 
121
150
  When no hook is present, a control is a button/link (by ARIA role) whose accessible name equals one of the
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanqory/theme-conformance",
3
- "version": "0.1.0-alpha.14",
3
+ "version": "0.1.0-alpha.15",
4
4
  "description": "Conformance runner for Theme ABI v2 — boots a theme artifact under workerd with a host shim, runs the contract's nine suites (conformance-report.json) and the storefront / budgets tiers (storefront-report.json).",
5
5
  "license": "MIT",
6
6
  "author": "Tanqory",
@@ -67,5 +67,5 @@
67
67
  "typescript": "~5.9.3",
68
68
  "vitest": "^3.2.4"
69
69
  },
70
- "gitHead": "100a4073766b0f3d55be884e68683ece5a84a773"
70
+ "gitHead": "ce9cb109aaf341115f02d02ba8515bc6dffe8a5c"
71
71
  }