sincecutoff.com

What changed in k6.

We scan this tool’s changelog a few times a day and keep the changes that would alter your agent’s next action: 28 since January 2026, each linked to its source.

YOUR MODEL or

Changes

INTRODUCED
28 CHANGES
LATEST 2026-09-21 · 1 TOOLS
SEP 212026

k6 group() preserves metric context across asynchronous calls

When an asynchronous test flow needs requests and checks to remain in one group across `await`, run it with the experimental `async-metric-context` feature and use an async `group()` callback. `group_duration` then measures until the callback’s returned promise settles.

k6 run --features async-metric-context <script.js>
evidence github.comscore 0.96open card ↗
SEP 212026

k6 JavaScript adds byte, Set, and raw JSON built-ins

When preparing binary test data or checking response fields, use the documented `Uint8Array` conversions and `Set` operations. To serialize an exact numeric JSON value, pass its decimal text to `JSON.rawJSON()` before `JSON.stringify()`; k6 v2.3.0 release notes document these examples.

const bytes = Uint8Array.fromHex('6b36'); console.log(bytes.toBase64()); // azY=
evidence github.comscore 0.95open card ↗
SEP 212026

k6 --once runs the configured scenario once

When debugging a script with at most one configured scenario, run `k6 run --once script.js` to execute its function once with one VU and one iteration while preserving scenario settings, including browser settings.

k6 run --once <script.js>
evidence github.comscore 0.98open card ↗
SEP 212026

k6 Prometheus remote write adds static labels

When multiple k6 processes send metrics to the same Prometheus endpoint, set `K6_PROMETHEUS_RW_LABELS` to comma-separated `key=value` labels and run with `--out experimental-prometheus-rw` so each process's time series can be distinguished.

K6_PROMETHEUS_RW_LABELS="environment=production,server=srv1" k6 run --out experimental-prometheus-rw <script.js>
evidence github.comscore 0.98open card ↗
SEP 212026

k6 run --scenario selects configured workloads

When debugging a script with multiple configured scenarios, run `k6 run --scenario <name> <script.js>` to run only the named workload. Separate multiple scenario names with commas.

k6 run --scenario homepage script.js
evidence github.comscore 0.98open card ↗
SEP 212026

k6 tlsAIAFetch retrieves missing TLS certificates

If an HTTPS test fails because the server omits an intermediate certificate, set `tlsAIAFetch: true` in the k6 options to fetch it while verifying the TLS chain.

export const options = { tlsAIAFetch: true, };
evidence github.comscore 0.96open card ↗
SEP 212026

k6 WebSocket exposes ready-state constants

When reviewing WebSocket message handling, check the socket state before sending. Send only when `socket.readyState === WebSocket.OPEN`; `OPEN` means the connection is ready to communicate.

if (socket.readyState === WebSocket.OPEN) { socket.send('hello'); }
evidence github.comscore 0.91open card ↗
AUG 102026

k6/browser chromium.connectOverCDP() attaches to a running browser

When a test needs to attach to an existing Chromium-based browser, pass its CDP WebSocket endpoint to `chromium.connectOverCDP()` inside the iteration and use the returned browser. k6 closes the connection at iteration end; call `browser.close()` to close it earlier.

import { chromium } from 'k6/browser'; export default async function () { const browser = await chromium.connectOverCDP('ws://localhost:9222/devtools/browser/<BROWSER_ID>'); const page = await browser.newPage(); try { await page.goto('https://quickpizza.grafana.com/'); } finally { await page.close(); await browser.close(); } }
evidence github.comscore 0.95open card ↗
AUG 102026

k6 cloud load-zone list command

When inspecting load zones in a configured Grafana Cloud k6 stack, run `k6 cloud load-zone list`; add `--json` for a JSON array instead of the default table.

k6 cloud load-zone list
evidence github.comscore 0.97open card ↗
AUG 102026

k6 experimental streams WritableStream and WritableStreamDefaultWriter

When implementing a writable stream in k6 v2.2.0, import `WritableStream` from `k6/experimental/streams`. Create it with a `write` handler, then call `getWriter()`, `write()`, and `close()` as shown.

import { WritableStream } from 'k6/experimental/streams'; export default async function () { const stream = new WritableStream({ write(chunk) { console.log(`wrote ${chunk}`); }, }); const writer = stream.getWriter(); await writer.write('hello'); await writer.close(); }
evidence github.comscore 0.93open card ↗