@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.
- package/dist/build-info.json +1 -1
- package/dist/storefront/budgets.d.ts +106 -1
- package/dist/storefront/budgets.js +187 -16
- package/dist/storefront/budgets.js.map +1 -1
- package/docs/storefront-tier.md +32 -3
- package/package.json +2 -2
package/dist/build-info.json
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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('
|
|
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
|
-
|
|
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
|
|
309
|
+
const verdicts = [];
|
|
157
310
|
for (const p of pages) {
|
|
158
|
-
const
|
|
159
|
-
|
|
160
|
-
|
|
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
|
|
163
|
-
const
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
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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"}
|
package/docs/storefront-tier.md
CHANGED
|
@@ -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× (
|
|
109
|
-
150 ms + (bytes on the wire × 8 / 1638.4 kbps) by the gateway, text counted
|
|
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.
|
|
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": "
|
|
70
|
+
"gitHead": "ce9cb109aaf341115f02d02ba8515bc6dffe8a5c"
|
|
71
71
|
}
|