[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-grafana-k6-cloud-investigate-test":3,"mdc--xuvusp-key":33,"related-repo-grafana-k6-cloud-investigate-test":2801,"related-org-grafana-k6-cloud-investigate-test":2918},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":29,"sourceUrl":31,"mdContent":32},"k6-cloud-investigate-test","investigate Grafana Cloud k6 test runs","Investigate a Grafana Cloud k6 test — describe the script, list run history, identify pass\u002Ffail status, pull raw metric time-series and log lines for one or more runs, and (if asked) safely edit the test script. Use when the user asks about a specific k6 cloud test or run, gives a `\u002Fa\u002Fk6-app\u002Ftests\u002F\u003Cid>` or `\u002Fa\u002Fk6-app\u002Fruns\u002F\u003Cid>` URL, asks \"is this test passing\", \"why are my k6 tests failing\", \"show me metrics for run X\", \"show me logs for run X\", or wants to add thresholds \u002F fix a failing test. Trigger this skill even when the user doesn't explicitly say \"investigate\" — pasted `\u002Fa\u002Fk6-app\u002F...` URLs, \"why did run X fail\", \"what happened with my test\", \"is my test healthy\", \"the latest run looks weird\", \"checks are failing but the run says passed\", or any request to diagnose a Grafana Cloud k6 run all qualify.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"grafana","Grafana","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fgrafana.jpg",[12,16,17,20],{"name":13,"slug":14,"type":15},"Observability","observability","tag",{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},"Testing","testing",{"name":21,"slug":22,"type":15},"Debugging","debugging",189,"https:\u002F\u002Fgithub.com\u002Fgrafana\u002Fskills","2026-07-18T05:47:59.937973",null,16,[],{"repoUrl":24,"stars":23,"forks":27,"topics":30,"description":26},[],"https:\u002F\u002Fgithub.com\u002Fgrafana\u002Fskills\u002Ftree\u002FHEAD\u002Fskills\u002Fgrafana-k6\u002Fk6-cloud-investigate-test","---\nname: k6-cloud-investigate-test\ndescription: Investigate a Grafana Cloud k6 test — describe the script, list run history, identify pass\u002Ffail status, pull raw metric time-series and log lines for one or more runs, and (if asked) safely edit the test script. Use when the user asks about a specific k6 cloud test or run, gives a `\u002Fa\u002Fk6-app\u002Ftests\u002F\u003Cid>` or `\u002Fa\u002Fk6-app\u002Fruns\u002F\u003Cid>` URL, asks \"is this test passing\", \"why are my k6 tests failing\", \"show me metrics for run X\", \"show me logs for run X\", or wants to add thresholds \u002F fix a failing test. Trigger this skill even when the user doesn't explicitly say \"investigate\" — pasted `\u002Fa\u002Fk6-app\u002F...` URLs, \"why did run X fail\", \"what happened with my test\", \"is my test healthy\", \"the latest run looks weird\", \"checks are failing but the run says passed\", or any request to diagnose a Grafana Cloud k6 run all qualify.\n---\n\n# k6 Cloud test investigator\n\nStructured 9-step workflow for investigating a Grafana Cloud k6 test or run.\n\nThis skill is **workflow-only**. All API calls go through `gcx api` against the plugin proxy, using v6 for REST and v5 for metrics. For the underlying mechanics (gcx auth, path conventions, endpoint discovery, log queries, script editing, threshold semantics, gotchas), see the `k6-manage` skill — every step below references it.\n\nThe content unique to this skill is:\n\n- the ordered investigation flow (Steps 1-9 below)\n- the date-alignment check (\"last 7 days\" ≠ \"last 7 runs\")\n- the 3-layer pass\u002Ffail determination (`result` vs `status` vs per-check `checks` query)\n- a worked example with realistic numbers (`references\u002Fworked-example.md`)\n\n## Core principles\n\n1. **Read before write.** Always GET the script before any PUT. `gcx k6 load-tests update-script` is a *write* that replaces the live script with whatever file you pass — running it \"just to see the URL it hits\" has cost users their production scripts. If you need to learn URLs, run any non-mutating command with `-vvv --log-http-payload` instead.\n2. **Paginate when enumerating runs.** The `\u002Ftest_runs` endpoint caps at 1000 rows and `gcx k6 runs list --limit 0` does not auto-follow `@nextLink`. Use the `gcx api` loop documented in `k6-manage` §3.\n3. **Verify date framing.** When the user says \"last 7 days\", \"this week\", \"recent runs\" — confirm the most-recent run's `created` actually falls in that window. Surface the gap if not.\n4. **`check()` doesn't fail runs; only `thresholds` do.** And thresholds with zero observations are reported as ✓ pass. See \"Threshold semantics\" below for the full deep dive; the per-check `checks` metric query in Step 5 catches both cases.\n\n## Prerequisites\n\n`gcx` installed and authenticated against the user's stack. See `k6-manage` §1. Verify with:\n\n```bash\ngcx --context \u003Cstack> config check    # expect \"✔ Connectivity: online\"\n```\n\n## Investigation workflow\n\n### Step 1: Identify the test and target run(s)\n\nFrom the user's URL:\n- `\u002Fa\u002Fk6-app\u002Ftests\u002F\u003Cid>` → load test (parent of many runs)\n- `\u002Fa\u002Fk6-app\u002Fruns\u002F\u003Cid>` → a specific run\n\nTo go run → test: fetch the run via `gcx api`, see `k6-manage` §2 for the path-shape rules:\n\n```bash\ngcx --context \u003Cstack> api \u002Fapi\u002Fplugins\u002Fk6-app\u002Fresources\u002Fcloud\u002Fcloud\u002Fv6\u002Ftest_runs\u002F\u003Crun_id>\n```\n\nand read `.test_id` from the response. To list runs for a test, see Step 3.\n\n### Step 2: Fetch test metadata and script\n\n```bash\ngcx --context \u003Cstack> k6 load-tests get \u003Ctest_id> -o json\n```\n\nFor the script, follow the GET half of the safe-edit recipe in `k6-manage` §5 — save a backup if you'll be editing later.\n\n**Two script endpoints exist, and the difference matters for investigation.** `k6-manage` §5 documents both: the current load-test script and the per-run snapshot that was actually executed. They drift apart whenever the script is edited after a run. Whenever the question involves \"what changed\", \"why did this run fail\", or you're examining a run more than a few days old, also fetch the run-bundled snapshot(s) via `k6-manage` §5's run-script endpoint and diff against the current load-test script (or against another run's snapshot). The current load-test script is the wrong artifact to reason about a past run.\n\n### Step 3: List runs WITH pagination\n\nUse the `gcx api` + `@nextLink` loop pattern documented in `k6-manage` §3 against `\u002Fcloud\u002Fv6\u002Fload_tests\u002F\u003Ctest_id>\u002Ftest_runs`. After collecting `all_runs`:\n\n```python\nprint(f\"Total: {len(all_runs)}\")\nruns_sorted = sorted(all_runs, key=lambda r: r['created'], reverse=True)\nfor r in runs_sorted[:10]:\n    print(f\"  {r['created']:30s} id={r['id']:>8} status={r['status']:\u003C10} result={r.get('result','?')}\")\n```\n\nReport to user: total run count, date range, latest run date. **If \"latest run\" is more than a day old**, call it out — they may believe the schedule is firing when it isn't.\n\n### Step 4: Verify date alignment with user's intent\n\nIf the user asked for \"last 7 days\" \u002F \"this week\" \u002F \"recent\": filter by date range, not by row count — \"7 most recent runs\" could span a day or a year depending on how often the test runs.\n\n```python\nlast7 = [r for r in all_runs if r['created'] >= '\u003Ctoday_minus_7_days_iso>']\n```\n\nIf `len(last7) == 0`: surface this to the user immediately. Don't proceed with stale data.\n\n### Step 5: Determine pass\u002Ffail status\n\nFor each run examine three independent layers:\n\n| Layer | Field | Meaning |\n|---|---|---|\n| Run-level outcome | `result` (`passed` \u002F `failed` \u002F `error` \u002F `aborted`) | Whether thresholds breached |\n| Run-level status | `status` (`completed` \u002F `aborted`) | Whether the run finished orderly |\n| In-script checks | v5 `checks` metric, aggregated by the `check` label | Per-check success rate |\n\nFor a run that the user thinks is \"failing\" but reports `result: passed`: check the third layer. Common pattern: every iteration's `check()` returns false but the run still \"passes\" because no threshold is defined on `checks`. See \"Threshold semantics\" below for the full deep dive (zero-observation trap, `abortOnFail` cloud delay, operator support).\n\nQuery the per-check breakdown via v5 (see `k6-manage\u002Freferences\u002Fmetrics.md` §7 for `query_aggregate_k6` shape):\n\n```bash\ngcx --context \u003Cstack> api \\\n  \"\u002Fapi\u002Fplugins\u002Fk6-app\u002Fresources\u002Fcloud\u002Fcloud\u002Fv5\u002Ftest_runs\u002F\u003Crun_id>\u002Fquery_aggregate_k6(query='ratio by (check)',metric='checks')\"\n```\n\nEach result entry in the response carries a `check` label with the check name and a single value: the success ratio (0.0–1.0). For raw success\u002Ffail counts, also query `increase_nz by (check)` (successes) and `increase_z by (check)` (failures).\n\n### Step 6: Fetch metrics for a run\n\nUse the v5 metrics endpoints documented in `k6-manage\u002Freferences\u002Fmetrics.md`. Typical workflow:\n\n```bash\n# 6a. List metrics available for the run (metrics.md §1)\ngcx --context \u003Cstack> api \u002Fapi\u002Fplugins\u002Fk6-app\u002Fresources\u002Fcloud\u002Fcloud\u002Fv5\u002Ftest_runs\u002F\u003Crun_id>\u002Fmetrics\n\n# 6b. List labels for a metric to know what's available to filter\u002Fgroup by (metrics.md §4)\ngcx --context \u003Cstack> api \\\n  \"\u002Fapi\u002Fplugins\u002Fk6-app\u002Fresources\u002Fcloud\u002Fcloud\u002Fv5\u002Ftest_runs\u002F\u003Crun_id>\u002Flabels?match[]=http_req_duration\"\n\n# 6c. Time-series — pick a query method that matches the metric's type (metrics.md §6)\ngcx --context \u003Cstack> api \\\n  \"\u002Fapi\u002Fplugins\u002Fk6-app\u002Fresources\u002Fcloud\u002Fcloud\u002Fv5\u002Ftest_runs\u002F\u003Crun_id>\u002Fquery_range_k6(query='histogram_quantile(0.95) by (name,status)',metric='http_req_duration',step=10)\"\n\n# 6d. Scalar aggregate over the whole run (metrics.md §7)\ngcx --context \u003Cstack> api \\\n  \"\u002Fapi\u002Fplugins\u002Fk6-app\u002Fresources\u002Fcloud\u002Fcloud\u002Fv5\u002Ftest_runs\u002F\u003Crun_id>\u002Fquery_aggregate_k6(query='increase',metric='http_reqs')\"\n```\n\nPicking the right query method per metric type matters — see the \"Query methods\" tables in `k6-manage\u002Freferences\u002Fmetrics.md`. For browser tests, the URL\u002Fstatus breakdown comes from `labels` + `label\u002F{name}\u002Fvalues` (metrics.md §4\u002F§5), not from a separate tags endpoint.\n\n### Step 7: Fetch logs for a run\n\nFollow the Loki recipe in `k6-manage` §4 (`gcx api` against `\u002Fapi\u002Fplugins\u002Fk6-app\u002Fresources\u002Flogs\u002F...`, `{test_run_id=\"\u003Cid>\"}` selector, mandatory `X-K6TestRun-Id` header, scope `start`\u002F`end` to `run.created`\u002F`run.ended`). Save the response to `\u002Ftmp\u002Frun_\u003Cid>_logs.json` and summarise from the file as described there.\n\n### Step 8: (If asked) edit the script safely\n\nUse the full safe-edit recipe in `k6-manage` §5 (GET → backup → edit → `k6 inspect` → 1-iter smoke → PUT with `Content-Type: application\u002Foctet-stream` → sha256 verify).\n\nWhen the edit involves thresholds, also read \"Threshold semantics\" below for the zero-observation trap, the `abortOnFail` cloud delay, and operator support (`==`\u002F`!=` work despite docs).\n\n### Step 9: Report\n\nPick a template based on the question shape.\n\n**For single-run investigations** (\"what's going on with run X\"):\n\n```\nTest: \u003Cname> (id \u003Ctest_id>)\nRun:  \u003Crun_id> @ \u003Ccreated> → \u003Cended>, load_zone=\u003Czone>, result=\u003Cresult>\n\nLogs (\u003Cn> streams, \u003Cm> lines):\n  - \u003Cstream summary>\n\nMetrics (key indicators):\n  - \u003Cmetric>: \u003Cmethod> = \u003Cvalue> (n=\u003Ccount>)\n  ...\n\nPer-check breakdown:\n  - \u003Ccheck name>: \u003Csuccess_rate> (succ=\u003Cn>, fail=\u003Cn>)\n  ...\n\nDiagnosis: \u003Cone-paragraph>\n```\n\n**For multi-run comparisons** (\"what's different between passing and failing runs\", \"did this change cause the failures\"):\n\n```\nQuestion: \u003Cone-line restatement of what the user is trying to attribute>\n\nRun timeline (relevant window):\n\n| Run ID | Created (UTC) | Result | exec_duration | processing_duration | k6 build | error code | key check ratios |\n|---|---|---|---|---|---|---|---|\n| ... | ... | passed | 60s | 195s | \u003Cbuild> | — | 1.0\u002F1.0\u002F1.0 |\n| ... | ... | failed | 27s | 193s | \u003Cbuild> | — | 0.0\u002Fn=0\u002Fn=0 |\n| ... | ... | error  | 51s | 3601s aborted | \u003Cbuild> | 8016 | 1.0\u002F1.0\u002F1.0 |\n\nDifferences that matter:\n  - \u003Cfield>: \u003Cvalue-in-passing> vs \u003Cvalue-in-failing> — \u003Cinterpretation>\n  ...\n\nScript diff (if relevant): \u003Cbundled-script diff between a representative passing and failing run, summarised>\n\nDiagnosis: \u003Cone-paragraph attributing the change to test-side, SUT-side, or platform-side, with the supporting evidence>\n```\n\nThe table makes side-by-side anomalies obvious (e.g. a column that's identical across passing and failing rules out that dimension as the cause; a column that flips between them is your candidate).\n\nIf the user asked for raw data dumps, also save them to `\u002Ftmp\u002Fk6inv\u002Frun\u003Cid>\u002F` and tell them the paths.\n\n## Threshold semantics\n\nThresholds, not `check()` calls, are what determine a run's `result`. The behaviour has several non-obvious corners that mislead first-time investigators, so they're collected here. Step 5 (\"Determine pass\u002Ffail status\") and Step 8 (\"edit the script safely\") both depend on this section.\n\n### What `result` means\n\n| `result` value | Meaning                                                       |\n|----------------|---------------------------------------------------------------|\n| `passed`       | All thresholds passed (or none defined)                       |\n| `failed`       | At least one threshold failed                                 |\n| `error`        | Either the script crashed before finishing (e.g. browser wouldn't launch) **or** k6 Cloud aborted the run platform-side. To tell which, check `status_history[*].extra.code` on the run — a non-null code indicates a platform abort (e.g. `8016` = \"Test run max lifetime exceeded\" during `processing_metrics`). Platform aborts are not your code's fault even though they surface as `error`. |\n| `aborted`      | User or system aborted the run                                |\n\n`check()` calls do **not** affect `result` directly. They emit observations into the built-in `checks` rate metric, which a threshold may then evaluate. If no threshold references `checks`, failing checks are invisible to the run-level `result`.\n\n### The \"zero observations = pass\" trap\n\nk6 reports a threshold as ✓ pass when the underlying metric has zero samples — even if the threshold expression would otherwise evaluate to false:\n\n```\nchecks{check:response is 200}\n✓ 'rate==1.0' rate=0.00%       ← ✓ pass!?\n```\n\nThis bites when the script throws before reaching the relevant `check()` call. Force a check observation in a `catch` block to make the threshold see *something*:\n\n```javascript\ntry {\n  const r = await page.goto(URL);\n  check(r, { \"response is 200\": x => x.status() === 200 });\n  \u002F\u002F ... rest of iteration body\n  check(true, { \"script completed without exception\": () => true });\n} catch (e) {\n  console.error(e);\n  check(null, { \"script completed without exception\": () => false });\n} finally {\n  await page.close();\n}\n```\n\nThen add `'checks{check:script completed without exception}': ['rate==1.0']` to thresholds. This catches both navigation failures AND later-stage exceptions.\n\n### `abortOnFail` cloud delay\n\n> When k6 runs in the cloud, thresholds are evaluated every 60 seconds. The `abortOnFail` feature may be delayed by up to 60 seconds.\n\nFor runs shorter than 60 s, `abortOnFail` may not fire before iterations complete naturally. The threshold is still evaluated at end-of-run and `result` flips to `failed` — abort just doesn't save execution time.\n\n### Operators\n\nDocs show `\u003C`, `>`, `\u003C=`, `>=`. **`==` and `!=` also work** even though they aren't in the docs. For `rate` metrics (value 0.00–1.00), `rate==1.0` means \"every observation was non-zero\" and `rate==0` means \"all observations were zero.\"\n\n## Workflow-specific gotchas\n\nFor the canonical gotcha list (auth expiry, doubled `cloud\u002Fcloud\u002F`, 415 on script PUT, Loki missing `X-K6TestRun-Id`, script PUT not bumping `updated`, `gcx k6 runs list --limit 0` not following `@nextLink`), see `k6-manage` §7. The entries below are specific to this investigation workflow:\n\n| Symptom | Cause | Fix |\n|---|---|---|\n| \"Latest run was 6 months ago\" but schedule says daily | You didn't paginate `\u002Ftest_runs` | Use the `@nextLink` loop in `k6-manage` §3 (Step 3) |\n| \"Last 7 days\" report contains only old runs | Filtered by row count, not date | Re-filter by `created >= \u003Ciso_date>` (Step 4) |\n| Threshold reports ✓ pass but checks fail | Zero check observations; iteration aborted before `check()` ran | See \"Threshold semantics\" above |\n| `result: error` but the script logs\u002Fmetrics look fine | Likely a platform abort (e.g. `processing_metrics` exceeded the 1h cap, `code 8016`). The execution itself completed normally. | Check `status_history[*].extra.code` on the run. Non-null platform code → not your code's fault. See \"Threshold semantics\" |\n| Investigating a past run by reading the current load-test script | Script may have been edited since the run executed — what you're reading isn't what ran | GET the run's *bundled* script via the per-run endpoint (`k6-manage` §5) and diff against the current load-test script before drawing conclusions |\n| Just overwrote the user's script | Invoked `update-script` to \"see the URL\" | Restore from the backup taken in Step 2. To learn URLs without writing, use `-vvv --log-http-payload` on any non-mutating command. |\n| CLI `--iterations 1` breaks browser scenarios | Overrides scenario block entirely | Edit `iterations:` in-file with sed instead |\n\n## Reference\n\n- [`references\u002Fworked-example.md`](references\u002Fworked-example.md) — a synthetic investigation with realistic findings, useful as a template for the Step 9 report.\n",{"data":34,"body":35},{"name":4,"description":6},{"type":36,"children":37},"root",[38,47,53,83,88,145,152,287,293,311,377,383,390,395,420,439,503,516,522,598,610,634,640,682,726,738,744,749,763,776,782,787,940,975,996,1057,1085,1091,1103,1385,1412,1418,1500,1506,1534,1561,1567,1572,1582,1592,1602,1611,1616,1629,1635,1654,1667,1795,1839,1845,1850,1859,1885,2312,2325,2336,2352,2378,2384,2459,2465,2513,2772,2778,2795],{"type":39,"tag":40,"props":41,"children":43},"element","h1",{"id":42},"k6-cloud-test-investigator",[44],{"type":45,"value":46},"text","k6 Cloud test investigator",{"type":39,"tag":48,"props":49,"children":50},"p",{},[51],{"type":45,"value":52},"Structured 9-step workflow for investigating a Grafana Cloud k6 test or run.",{"type":39,"tag":48,"props":54,"children":55},{},[56,58,64,66,73,75,81],{"type":45,"value":57},"This skill is ",{"type":39,"tag":59,"props":60,"children":61},"strong",{},[62],{"type":45,"value":63},"workflow-only",{"type":45,"value":65},". All API calls go through ",{"type":39,"tag":67,"props":68,"children":70},"code",{"className":69},[],[71],{"type":45,"value":72},"gcx api",{"type":45,"value":74}," against the plugin proxy, using v6 for REST and v5 for metrics. For the underlying mechanics (gcx auth, path conventions, endpoint discovery, log queries, script editing, threshold semantics, gotchas), see the ",{"type":39,"tag":67,"props":76,"children":78},{"className":77},[],[79],{"type":45,"value":80},"k6-manage",{"type":45,"value":82}," skill — every step below references it.",{"type":39,"tag":48,"props":84,"children":85},{},[86],{"type":45,"value":87},"The content unique to this skill is:",{"type":39,"tag":89,"props":90,"children":91},"ul",{},[92,98,103,132],{"type":39,"tag":93,"props":94,"children":95},"li",{},[96],{"type":45,"value":97},"the ordered investigation flow (Steps 1-9 below)",{"type":39,"tag":93,"props":99,"children":100},{},[101],{"type":45,"value":102},"the date-alignment check (\"last 7 days\" ≠ \"last 7 runs\")",{"type":39,"tag":93,"props":104,"children":105},{},[106,108,114,116,122,124,130],{"type":45,"value":107},"the 3-layer pass\u002Ffail determination (",{"type":39,"tag":67,"props":109,"children":111},{"className":110},[],[112],{"type":45,"value":113},"result",{"type":45,"value":115}," vs ",{"type":39,"tag":67,"props":117,"children":119},{"className":118},[],[120],{"type":45,"value":121},"status",{"type":45,"value":123}," vs per-check ",{"type":39,"tag":67,"props":125,"children":127},{"className":126},[],[128],{"type":45,"value":129},"checks",{"type":45,"value":131}," query)",{"type":39,"tag":93,"props":133,"children":134},{},[135,137,143],{"type":45,"value":136},"a worked example with realistic numbers (",{"type":39,"tag":67,"props":138,"children":140},{"className":139},[],[141],{"type":45,"value":142},"references\u002Fworked-example.md",{"type":45,"value":144},")",{"type":39,"tag":146,"props":147,"children":149},"h2",{"id":148},"core-principles",[150],{"type":45,"value":151},"Core principles",{"type":39,"tag":153,"props":154,"children":155},"ol",{},[156,190,238,256],{"type":39,"tag":93,"props":157,"children":158},{},[159,164,166,172,174,180,182,188],{"type":39,"tag":59,"props":160,"children":161},{},[162],{"type":45,"value":163},"Read before write.",{"type":45,"value":165}," Always GET the script before any PUT. ",{"type":39,"tag":67,"props":167,"children":169},{"className":168},[],[170],{"type":45,"value":171},"gcx k6 load-tests update-script",{"type":45,"value":173}," is a ",{"type":39,"tag":175,"props":176,"children":177},"em",{},[178],{"type":45,"value":179},"write",{"type":45,"value":181}," that replaces the live script with whatever file you pass — running it \"just to see the URL it hits\" has cost users their production scripts. If you need to learn URLs, run any non-mutating command with ",{"type":39,"tag":67,"props":183,"children":185},{"className":184},[],[186],{"type":45,"value":187},"-vvv --log-http-payload",{"type":45,"value":189}," instead.",{"type":39,"tag":93,"props":191,"children":192},{},[193,198,200,206,208,214,216,222,224,229,231,236],{"type":39,"tag":59,"props":194,"children":195},{},[196],{"type":45,"value":197},"Paginate when enumerating runs.",{"type":45,"value":199}," The ",{"type":39,"tag":67,"props":201,"children":203},{"className":202},[],[204],{"type":45,"value":205},"\u002Ftest_runs",{"type":45,"value":207}," endpoint caps at 1000 rows and ",{"type":39,"tag":67,"props":209,"children":211},{"className":210},[],[212],{"type":45,"value":213},"gcx k6 runs list --limit 0",{"type":45,"value":215}," does not auto-follow ",{"type":39,"tag":67,"props":217,"children":219},{"className":218},[],[220],{"type":45,"value":221},"@nextLink",{"type":45,"value":223},". Use the ",{"type":39,"tag":67,"props":225,"children":227},{"className":226},[],[228],{"type":45,"value":72},{"type":45,"value":230}," loop documented in ",{"type":39,"tag":67,"props":232,"children":234},{"className":233},[],[235],{"type":45,"value":80},{"type":45,"value":237}," §3.",{"type":39,"tag":93,"props":239,"children":240},{},[241,246,248,254],{"type":39,"tag":59,"props":242,"children":243},{},[244],{"type":45,"value":245},"Verify date framing.",{"type":45,"value":247}," When the user says \"last 7 days\", \"this week\", \"recent runs\" — confirm the most-recent run's ",{"type":39,"tag":67,"props":249,"children":251},{"className":250},[],[252],{"type":45,"value":253},"created",{"type":45,"value":255}," actually falls in that window. Surface the gap if not.",{"type":39,"tag":93,"props":257,"children":258},{},[259,278,280,285],{"type":39,"tag":59,"props":260,"children":261},{},[262,268,270,276],{"type":39,"tag":67,"props":263,"children":265},{"className":264},[],[266],{"type":45,"value":267},"check()",{"type":45,"value":269}," doesn't fail runs; only ",{"type":39,"tag":67,"props":271,"children":273},{"className":272},[],[274],{"type":45,"value":275},"thresholds",{"type":45,"value":277}," do.",{"type":45,"value":279}," And thresholds with zero observations are reported as ✓ pass. See \"Threshold semantics\" below for the full deep dive; the per-check ",{"type":39,"tag":67,"props":281,"children":283},{"className":282},[],[284],{"type":45,"value":129},{"type":45,"value":286}," metric query in Step 5 catches both cases.",{"type":39,"tag":146,"props":288,"children":290},{"id":289},"prerequisites",[291],{"type":45,"value":292},"Prerequisites",{"type":39,"tag":48,"props":294,"children":295},{},[296,302,304,309],{"type":39,"tag":67,"props":297,"children":299},{"className":298},[],[300],{"type":45,"value":301},"gcx",{"type":45,"value":303}," installed and authenticated against the user's stack. See ",{"type":39,"tag":67,"props":305,"children":307},{"className":306},[],[308],{"type":45,"value":80},{"type":45,"value":310}," §1. Verify with:",{"type":39,"tag":312,"props":313,"children":318},"pre",{"className":314,"code":315,"language":316,"meta":317,"style":317},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","gcx --context \u003Cstack> config check    # expect \"✔ Connectivity: online\"\n","bash","",[319],{"type":39,"tag":67,"props":320,"children":321},{"__ignoreMap":317},[322],{"type":39,"tag":323,"props":324,"children":327},"span",{"class":325,"line":326},"line",1,[328,333,339,345,350,356,361,366,371],{"type":39,"tag":323,"props":329,"children":331},{"style":330},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[332],{"type":45,"value":301},{"type":39,"tag":323,"props":334,"children":336},{"style":335},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[337],{"type":45,"value":338}," --context",{"type":39,"tag":323,"props":340,"children":342},{"style":341},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[343],{"type":45,"value":344}," \u003C",{"type":39,"tag":323,"props":346,"children":347},{"style":335},[348],{"type":45,"value":349},"stac",{"type":39,"tag":323,"props":351,"children":353},{"style":352},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[354],{"type":45,"value":355},"k",{"type":39,"tag":323,"props":357,"children":358},{"style":341},[359],{"type":45,"value":360},">",{"type":39,"tag":323,"props":362,"children":363},{"style":335},[364],{"type":45,"value":365}," config",{"type":39,"tag":323,"props":367,"children":368},{"style":335},[369],{"type":45,"value":370}," check",{"type":39,"tag":323,"props":372,"children":374},{"style":373},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[375],{"type":45,"value":376},"    # expect \"✔ Connectivity: online\"\n",{"type":39,"tag":146,"props":378,"children":380},{"id":379},"investigation-workflow",[381],{"type":45,"value":382},"Investigation workflow",{"type":39,"tag":384,"props":385,"children":387},"h3",{"id":386},"step-1-identify-the-test-and-target-runs",[388],{"type":45,"value":389},"Step 1: Identify the test and target run(s)",{"type":39,"tag":48,"props":391,"children":392},{},[393],{"type":45,"value":394},"From the user's URL:",{"type":39,"tag":89,"props":396,"children":397},{},[398,409],{"type":39,"tag":93,"props":399,"children":400},{},[401,407],{"type":39,"tag":67,"props":402,"children":404},{"className":403},[],[405],{"type":45,"value":406},"\u002Fa\u002Fk6-app\u002Ftests\u002F\u003Cid>",{"type":45,"value":408}," → load test (parent of many runs)",{"type":39,"tag":93,"props":410,"children":411},{},[412,418],{"type":39,"tag":67,"props":413,"children":415},{"className":414},[],[416],{"type":45,"value":417},"\u002Fa\u002Fk6-app\u002Fruns\u002F\u003Cid>",{"type":45,"value":419}," → a specific run",{"type":39,"tag":48,"props":421,"children":422},{},[423,425,430,432,437],{"type":45,"value":424},"To go run → test: fetch the run via ",{"type":39,"tag":67,"props":426,"children":428},{"className":427},[],[429],{"type":45,"value":72},{"type":45,"value":431},", see ",{"type":39,"tag":67,"props":433,"children":435},{"className":434},[],[436],{"type":45,"value":80},{"type":45,"value":438}," §2 for the path-shape rules:",{"type":39,"tag":312,"props":440,"children":442},{"className":314,"code":441,"language":316,"meta":317,"style":317},"gcx --context \u003Cstack> api \u002Fapi\u002Fplugins\u002Fk6-app\u002Fresources\u002Fcloud\u002Fcloud\u002Fv6\u002Ftest_runs\u002F\u003Crun_id>\n",[443],{"type":39,"tag":67,"props":444,"children":445},{"__ignoreMap":317},[446],{"type":39,"tag":323,"props":447,"children":448},{"class":325,"line":326},[449,453,457,461,465,469,473,478,483,488,493,498],{"type":39,"tag":323,"props":450,"children":451},{"style":330},[452],{"type":45,"value":301},{"type":39,"tag":323,"props":454,"children":455},{"style":335},[456],{"type":45,"value":338},{"type":39,"tag":323,"props":458,"children":459},{"style":341},[460],{"type":45,"value":344},{"type":39,"tag":323,"props":462,"children":463},{"style":335},[464],{"type":45,"value":349},{"type":39,"tag":323,"props":466,"children":467},{"style":352},[468],{"type":45,"value":355},{"type":39,"tag":323,"props":470,"children":471},{"style":341},[472],{"type":45,"value":360},{"type":39,"tag":323,"props":474,"children":475},{"style":335},[476],{"type":45,"value":477}," api",{"type":39,"tag":323,"props":479,"children":480},{"style":335},[481],{"type":45,"value":482}," \u002Fapi\u002Fplugins\u002Fk6-app\u002Fresources\u002Fcloud\u002Fcloud\u002Fv6\u002Ftest_runs\u002F",{"type":39,"tag":323,"props":484,"children":485},{"style":341},[486],{"type":45,"value":487},"\u003C",{"type":39,"tag":323,"props":489,"children":490},{"style":335},[491],{"type":45,"value":492},"run_i",{"type":39,"tag":323,"props":494,"children":495},{"style":352},[496],{"type":45,"value":497},"d",{"type":39,"tag":323,"props":499,"children":500},{"style":341},[501],{"type":45,"value":502},">\n",{"type":39,"tag":48,"props":504,"children":505},{},[506,508,514],{"type":45,"value":507},"and read ",{"type":39,"tag":67,"props":509,"children":511},{"className":510},[],[512],{"type":45,"value":513},".test_id",{"type":45,"value":515}," from the response. To list runs for a test, see Step 3.",{"type":39,"tag":384,"props":517,"children":519},{"id":518},"step-2-fetch-test-metadata-and-script",[520],{"type":45,"value":521},"Step 2: Fetch test metadata and script",{"type":39,"tag":312,"props":523,"children":525},{"className":314,"code":524,"language":316,"meta":317,"style":317},"gcx --context \u003Cstack> k6 load-tests get \u003Ctest_id> -o json\n",[526],{"type":39,"tag":67,"props":527,"children":528},{"__ignoreMap":317},[529],{"type":39,"tag":323,"props":530,"children":531},{"class":325,"line":326},[532,536,540,544,548,552,556,561,566,571,575,580,584,588,593],{"type":39,"tag":323,"props":533,"children":534},{"style":330},[535],{"type":45,"value":301},{"type":39,"tag":323,"props":537,"children":538},{"style":335},[539],{"type":45,"value":338},{"type":39,"tag":323,"props":541,"children":542},{"style":341},[543],{"type":45,"value":344},{"type":39,"tag":323,"props":545,"children":546},{"style":335},[547],{"type":45,"value":349},{"type":39,"tag":323,"props":549,"children":550},{"style":352},[551],{"type":45,"value":355},{"type":39,"tag":323,"props":553,"children":554},{"style":341},[555],{"type":45,"value":360},{"type":39,"tag":323,"props":557,"children":558},{"style":335},[559],{"type":45,"value":560}," k6",{"type":39,"tag":323,"props":562,"children":563},{"style":335},[564],{"type":45,"value":565}," load-tests",{"type":39,"tag":323,"props":567,"children":568},{"style":335},[569],{"type":45,"value":570}," get",{"type":39,"tag":323,"props":572,"children":573},{"style":341},[574],{"type":45,"value":344},{"type":39,"tag":323,"props":576,"children":577},{"style":335},[578],{"type":45,"value":579},"test_i",{"type":39,"tag":323,"props":581,"children":582},{"style":352},[583],{"type":45,"value":497},{"type":39,"tag":323,"props":585,"children":586},{"style":341},[587],{"type":45,"value":360},{"type":39,"tag":323,"props":589,"children":590},{"style":335},[591],{"type":45,"value":592}," -o",{"type":39,"tag":323,"props":594,"children":595},{"style":335},[596],{"type":45,"value":597}," json\n",{"type":39,"tag":48,"props":599,"children":600},{},[601,603,608],{"type":45,"value":602},"For the script, follow the GET half of the safe-edit recipe in ",{"type":39,"tag":67,"props":604,"children":606},{"className":605},[],[607],{"type":45,"value":80},{"type":45,"value":609}," §5 — save a backup if you'll be editing later.",{"type":39,"tag":48,"props":611,"children":612},{},[613,618,620,625,627,632],{"type":39,"tag":59,"props":614,"children":615},{},[616],{"type":45,"value":617},"Two script endpoints exist, and the difference matters for investigation.",{"type":45,"value":619}," ",{"type":39,"tag":67,"props":621,"children":623},{"className":622},[],[624],{"type":45,"value":80},{"type":45,"value":626}," §5 documents both: the current load-test script and the per-run snapshot that was actually executed. They drift apart whenever the script is edited after a run. Whenever the question involves \"what changed\", \"why did this run fail\", or you're examining a run more than a few days old, also fetch the run-bundled snapshot(s) via ",{"type":39,"tag":67,"props":628,"children":630},{"className":629},[],[631],{"type":45,"value":80},{"type":45,"value":633}," §5's run-script endpoint and diff against the current load-test script (or against another run's snapshot). The current load-test script is the wrong artifact to reason about a past run.",{"type":39,"tag":384,"props":635,"children":637},{"id":636},"step-3-list-runs-with-pagination",[638],{"type":45,"value":639},"Step 3: List runs WITH pagination",{"type":39,"tag":48,"props":641,"children":642},{},[643,645,650,652,657,659,664,666,672,674,680],{"type":45,"value":644},"Use the ",{"type":39,"tag":67,"props":646,"children":648},{"className":647},[],[649],{"type":45,"value":72},{"type":45,"value":651}," + ",{"type":39,"tag":67,"props":653,"children":655},{"className":654},[],[656],{"type":45,"value":221},{"type":45,"value":658}," loop pattern documented in ",{"type":39,"tag":67,"props":660,"children":662},{"className":661},[],[663],{"type":45,"value":80},{"type":45,"value":665}," §3 against ",{"type":39,"tag":67,"props":667,"children":669},{"className":668},[],[670],{"type":45,"value":671},"\u002Fcloud\u002Fv6\u002Fload_tests\u002F\u003Ctest_id>\u002Ftest_runs",{"type":45,"value":673},". After collecting ",{"type":39,"tag":67,"props":675,"children":677},{"className":676},[],[678],{"type":45,"value":679},"all_runs",{"type":45,"value":681},":",{"type":39,"tag":312,"props":683,"children":687},{"className":684,"code":685,"language":686,"meta":317,"style":317},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","print(f\"Total: {len(all_runs)}\")\nruns_sorted = sorted(all_runs, key=lambda r: r['created'], reverse=True)\nfor r in runs_sorted[:10]:\n    print(f\"  {r['created']:30s} id={r['id']:>8} status={r['status']:\u003C10} result={r.get('result','?')}\")\n","python",[688],{"type":39,"tag":67,"props":689,"children":690},{"__ignoreMap":317},[691,699,708,717],{"type":39,"tag":323,"props":692,"children":693},{"class":325,"line":326},[694],{"type":39,"tag":323,"props":695,"children":696},{},[697],{"type":45,"value":698},"print(f\"Total: {len(all_runs)}\")\n",{"type":39,"tag":323,"props":700,"children":702},{"class":325,"line":701},2,[703],{"type":39,"tag":323,"props":704,"children":705},{},[706],{"type":45,"value":707},"runs_sorted = sorted(all_runs, key=lambda r: r['created'], reverse=True)\n",{"type":39,"tag":323,"props":709,"children":711},{"class":325,"line":710},3,[712],{"type":39,"tag":323,"props":713,"children":714},{},[715],{"type":45,"value":716},"for r in runs_sorted[:10]:\n",{"type":39,"tag":323,"props":718,"children":720},{"class":325,"line":719},4,[721],{"type":39,"tag":323,"props":722,"children":723},{},[724],{"type":45,"value":725},"    print(f\"  {r['created']:30s} id={r['id']:>8} status={r['status']:\u003C10} result={r.get('result','?')}\")\n",{"type":39,"tag":48,"props":727,"children":728},{},[729,731,736],{"type":45,"value":730},"Report to user: total run count, date range, latest run date. ",{"type":39,"tag":59,"props":732,"children":733},{},[734],{"type":45,"value":735},"If \"latest run\" is more than a day old",{"type":45,"value":737},", call it out — they may believe the schedule is firing when it isn't.",{"type":39,"tag":384,"props":739,"children":741},{"id":740},"step-4-verify-date-alignment-with-users-intent",[742],{"type":45,"value":743},"Step 4: Verify date alignment with user's intent",{"type":39,"tag":48,"props":745,"children":746},{},[747],{"type":45,"value":748},"If the user asked for \"last 7 days\" \u002F \"this week\" \u002F \"recent\": filter by date range, not by row count — \"7 most recent runs\" could span a day or a year depending on how often the test runs.",{"type":39,"tag":312,"props":750,"children":752},{"className":684,"code":751,"language":686,"meta":317,"style":317},"last7 = [r for r in all_runs if r['created'] >= '\u003Ctoday_minus_7_days_iso>']\n",[753],{"type":39,"tag":67,"props":754,"children":755},{"__ignoreMap":317},[756],{"type":39,"tag":323,"props":757,"children":758},{"class":325,"line":326},[759],{"type":39,"tag":323,"props":760,"children":761},{},[762],{"type":45,"value":751},{"type":39,"tag":48,"props":764,"children":765},{},[766,768,774],{"type":45,"value":767},"If ",{"type":39,"tag":67,"props":769,"children":771},{"className":770},[],[772],{"type":45,"value":773},"len(last7) == 0",{"type":45,"value":775},": surface this to the user immediately. Don't proceed with stale data.",{"type":39,"tag":384,"props":777,"children":779},{"id":778},"step-5-determine-passfail-status",[780],{"type":45,"value":781},"Step 5: Determine pass\u002Ffail status",{"type":39,"tag":48,"props":783,"children":784},{},[785],{"type":45,"value":786},"For each run examine three independent layers:",{"type":39,"tag":788,"props":789,"children":790},"table",{},[791,815],{"type":39,"tag":792,"props":793,"children":794},"thead",{},[795],{"type":39,"tag":796,"props":797,"children":798},"tr",{},[799,805,810],{"type":39,"tag":800,"props":801,"children":802},"th",{},[803],{"type":45,"value":804},"Layer",{"type":39,"tag":800,"props":806,"children":807},{},[808],{"type":45,"value":809},"Field",{"type":39,"tag":800,"props":811,"children":812},{},[813],{"type":45,"value":814},"Meaning",{"type":39,"tag":816,"props":817,"children":818},"tbody",{},[819,872,907],{"type":39,"tag":796,"props":820,"children":821},{},[822,828,867],{"type":39,"tag":823,"props":824,"children":825},"td",{},[826],{"type":45,"value":827},"Run-level outcome",{"type":39,"tag":823,"props":829,"children":830},{},[831,836,838,844,846,852,853,859,860,866],{"type":39,"tag":67,"props":832,"children":834},{"className":833},[],[835],{"type":45,"value":113},{"type":45,"value":837}," (",{"type":39,"tag":67,"props":839,"children":841},{"className":840},[],[842],{"type":45,"value":843},"passed",{"type":45,"value":845}," \u002F ",{"type":39,"tag":67,"props":847,"children":849},{"className":848},[],[850],{"type":45,"value":851},"failed",{"type":45,"value":845},{"type":39,"tag":67,"props":854,"children":856},{"className":855},[],[857],{"type":45,"value":858},"error",{"type":45,"value":845},{"type":39,"tag":67,"props":861,"children":863},{"className":862},[],[864],{"type":45,"value":865},"aborted",{"type":45,"value":144},{"type":39,"tag":823,"props":868,"children":869},{},[870],{"type":45,"value":871},"Whether thresholds breached",{"type":39,"tag":796,"props":873,"children":874},{},[875,880,902],{"type":39,"tag":823,"props":876,"children":877},{},[878],{"type":45,"value":879},"Run-level status",{"type":39,"tag":823,"props":881,"children":882},{},[883,888,889,895,896,901],{"type":39,"tag":67,"props":884,"children":886},{"className":885},[],[887],{"type":45,"value":121},{"type":45,"value":837},{"type":39,"tag":67,"props":890,"children":892},{"className":891},[],[893],{"type":45,"value":894},"completed",{"type":45,"value":845},{"type":39,"tag":67,"props":897,"children":899},{"className":898},[],[900],{"type":45,"value":865},{"type":45,"value":144},{"type":39,"tag":823,"props":903,"children":904},{},[905],{"type":45,"value":906},"Whether the run finished orderly",{"type":39,"tag":796,"props":908,"children":909},{},[910,915,935],{"type":39,"tag":823,"props":911,"children":912},{},[913],{"type":45,"value":914},"In-script checks",{"type":39,"tag":823,"props":916,"children":917},{},[918,920,925,927,933],{"type":45,"value":919},"v5 ",{"type":39,"tag":67,"props":921,"children":923},{"className":922},[],[924],{"type":45,"value":129},{"type":45,"value":926}," metric, aggregated by the ",{"type":39,"tag":67,"props":928,"children":930},{"className":929},[],[931],{"type":45,"value":932},"check",{"type":45,"value":934}," label",{"type":39,"tag":823,"props":936,"children":937},{},[938],{"type":45,"value":939},"Per-check success rate",{"type":39,"tag":48,"props":941,"children":942},{},[943,945,951,953,958,960,965,967,973],{"type":45,"value":944},"For a run that the user thinks is \"failing\" but reports ",{"type":39,"tag":67,"props":946,"children":948},{"className":947},[],[949],{"type":45,"value":950},"result: passed",{"type":45,"value":952},": check the third layer. Common pattern: every iteration's ",{"type":39,"tag":67,"props":954,"children":956},{"className":955},[],[957],{"type":45,"value":267},{"type":45,"value":959}," returns false but the run still \"passes\" because no threshold is defined on ",{"type":39,"tag":67,"props":961,"children":963},{"className":962},[],[964],{"type":45,"value":129},{"type":45,"value":966},". See \"Threshold semantics\" below for the full deep dive (zero-observation trap, ",{"type":39,"tag":67,"props":968,"children":970},{"className":969},[],[971],{"type":45,"value":972},"abortOnFail",{"type":45,"value":974}," cloud delay, operator support).",{"type":39,"tag":48,"props":976,"children":977},{},[978,980,986,988,994],{"type":45,"value":979},"Query the per-check breakdown via v5 (see ",{"type":39,"tag":67,"props":981,"children":983},{"className":982},[],[984],{"type":45,"value":985},"k6-manage\u002Freferences\u002Fmetrics.md",{"type":45,"value":987}," §7 for ",{"type":39,"tag":67,"props":989,"children":991},{"className":990},[],[992],{"type":45,"value":993},"query_aggregate_k6",{"type":45,"value":995}," shape):",{"type":39,"tag":312,"props":997,"children":999},{"className":314,"code":998,"language":316,"meta":317,"style":317},"gcx --context \u003Cstack> api \\\n  \"\u002Fapi\u002Fplugins\u002Fk6-app\u002Fresources\u002Fcloud\u002Fcloud\u002Fv5\u002Ftest_runs\u002F\u003Crun_id>\u002Fquery_aggregate_k6(query='ratio by (check)',metric='checks')\"\n",[1000],{"type":39,"tag":67,"props":1001,"children":1002},{"__ignoreMap":317},[1003,1039],{"type":39,"tag":323,"props":1004,"children":1005},{"class":325,"line":326},[1006,1010,1014,1018,1022,1026,1030,1034],{"type":39,"tag":323,"props":1007,"children":1008},{"style":330},[1009],{"type":45,"value":301},{"type":39,"tag":323,"props":1011,"children":1012},{"style":335},[1013],{"type":45,"value":338},{"type":39,"tag":323,"props":1015,"children":1016},{"style":341},[1017],{"type":45,"value":344},{"type":39,"tag":323,"props":1019,"children":1020},{"style":335},[1021],{"type":45,"value":349},{"type":39,"tag":323,"props":1023,"children":1024},{"style":352},[1025],{"type":45,"value":355},{"type":39,"tag":323,"props":1027,"children":1028},{"style":341},[1029],{"type":45,"value":360},{"type":39,"tag":323,"props":1031,"children":1032},{"style":335},[1033],{"type":45,"value":477},{"type":39,"tag":323,"props":1035,"children":1036},{"style":352},[1037],{"type":45,"value":1038}," \\\n",{"type":39,"tag":323,"props":1040,"children":1041},{"class":325,"line":701},[1042,1047,1052],{"type":39,"tag":323,"props":1043,"children":1044},{"style":341},[1045],{"type":45,"value":1046},"  \"",{"type":39,"tag":323,"props":1048,"children":1049},{"style":335},[1050],{"type":45,"value":1051},"\u002Fapi\u002Fplugins\u002Fk6-app\u002Fresources\u002Fcloud\u002Fcloud\u002Fv5\u002Ftest_runs\u002F\u003Crun_id>\u002Fquery_aggregate_k6(query='ratio by (check)',metric='checks')",{"type":39,"tag":323,"props":1053,"children":1054},{"style":341},[1055],{"type":45,"value":1056},"\"\n",{"type":39,"tag":48,"props":1058,"children":1059},{},[1060,1062,1067,1069,1075,1077,1083],{"type":45,"value":1061},"Each result entry in the response carries a ",{"type":39,"tag":67,"props":1063,"children":1065},{"className":1064},[],[1066],{"type":45,"value":932},{"type":45,"value":1068}," label with the check name and a single value: the success ratio (0.0–1.0). For raw success\u002Ffail counts, also query ",{"type":39,"tag":67,"props":1070,"children":1072},{"className":1071},[],[1073],{"type":45,"value":1074},"increase_nz by (check)",{"type":45,"value":1076}," (successes) and ",{"type":39,"tag":67,"props":1078,"children":1080},{"className":1079},[],[1081],{"type":45,"value":1082},"increase_z by (check)",{"type":45,"value":1084}," (failures).",{"type":39,"tag":384,"props":1086,"children":1088},{"id":1087},"step-6-fetch-metrics-for-a-run",[1089],{"type":45,"value":1090},"Step 6: Fetch metrics for a run",{"type":39,"tag":48,"props":1092,"children":1093},{},[1094,1096,1101],{"type":45,"value":1095},"Use the v5 metrics endpoints documented in ",{"type":39,"tag":67,"props":1097,"children":1099},{"className":1098},[],[1100],{"type":45,"value":985},{"type":45,"value":1102},". Typical workflow:",{"type":39,"tag":312,"props":1104,"children":1106},{"className":314,"code":1105,"language":316,"meta":317,"style":317},"# 6a. List metrics available for the run (metrics.md §1)\ngcx --context \u003Cstack> api \u002Fapi\u002Fplugins\u002Fk6-app\u002Fresources\u002Fcloud\u002Fcloud\u002Fv5\u002Ftest_runs\u002F\u003Crun_id>\u002Fmetrics\n\n# 6b. List labels for a metric to know what's available to filter\u002Fgroup by (metrics.md §4)\ngcx --context \u003Cstack> api \\\n  \"\u002Fapi\u002Fplugins\u002Fk6-app\u002Fresources\u002Fcloud\u002Fcloud\u002Fv5\u002Ftest_runs\u002F\u003Crun_id>\u002Flabels?match[]=http_req_duration\"\n\n# 6c. Time-series — pick a query method that matches the metric's type (metrics.md §6)\ngcx --context \u003Cstack> api \\\n  \"\u002Fapi\u002Fplugins\u002Fk6-app\u002Fresources\u002Fcloud\u002Fcloud\u002Fv5\u002Ftest_runs\u002F\u003Crun_id>\u002Fquery_range_k6(query='histogram_quantile(0.95) by (name,status)',metric='http_req_duration',step=10)\"\n\n# 6d. Scalar aggregate over the whole run (metrics.md §7)\ngcx --context \u003Cstack> api \\\n  \"\u002Fapi\u002Fplugins\u002Fk6-app\u002Fresources\u002Fcloud\u002Fcloud\u002Fv5\u002Ftest_runs\u002F\u003Crun_id>\u002Fquery_aggregate_k6(query='increase',metric='http_reqs')\"\n",[1107],{"type":39,"tag":67,"props":1108,"children":1109},{"__ignoreMap":317},[1110,1118,1175,1184,1192,1228,1245,1253,1262,1298,1315,1323,1332,1368],{"type":39,"tag":323,"props":1111,"children":1112},{"class":325,"line":326},[1113],{"type":39,"tag":323,"props":1114,"children":1115},{"style":373},[1116],{"type":45,"value":1117},"# 6a. List metrics available for the run (metrics.md §1)\n",{"type":39,"tag":323,"props":1119,"children":1120},{"class":325,"line":701},[1121,1125,1129,1133,1137,1141,1145,1149,1154,1158,1162,1166,1170],{"type":39,"tag":323,"props":1122,"children":1123},{"style":330},[1124],{"type":45,"value":301},{"type":39,"tag":323,"props":1126,"children":1127},{"style":335},[1128],{"type":45,"value":338},{"type":39,"tag":323,"props":1130,"children":1131},{"style":341},[1132],{"type":45,"value":344},{"type":39,"tag":323,"props":1134,"children":1135},{"style":335},[1136],{"type":45,"value":349},{"type":39,"tag":323,"props":1138,"children":1139},{"style":352},[1140],{"type":45,"value":355},{"type":39,"tag":323,"props":1142,"children":1143},{"style":341},[1144],{"type":45,"value":360},{"type":39,"tag":323,"props":1146,"children":1147},{"style":335},[1148],{"type":45,"value":477},{"type":39,"tag":323,"props":1150,"children":1151},{"style":335},[1152],{"type":45,"value":1153}," \u002Fapi\u002Fplugins\u002Fk6-app\u002Fresources\u002Fcloud\u002Fcloud\u002Fv5\u002Ftest_runs\u002F",{"type":39,"tag":323,"props":1155,"children":1156},{"style":341},[1157],{"type":45,"value":487},{"type":39,"tag":323,"props":1159,"children":1160},{"style":335},[1161],{"type":45,"value":492},{"type":39,"tag":323,"props":1163,"children":1164},{"style":352},[1165],{"type":45,"value":497},{"type":39,"tag":323,"props":1167,"children":1168},{"style":341},[1169],{"type":45,"value":360},{"type":39,"tag":323,"props":1171,"children":1172},{"style":335},[1173],{"type":45,"value":1174},"\u002Fmetrics\n",{"type":39,"tag":323,"props":1176,"children":1177},{"class":325,"line":710},[1178],{"type":39,"tag":323,"props":1179,"children":1181},{"emptyLinePlaceholder":1180},true,[1182],{"type":45,"value":1183},"\n",{"type":39,"tag":323,"props":1185,"children":1186},{"class":325,"line":719},[1187],{"type":39,"tag":323,"props":1188,"children":1189},{"style":373},[1190],{"type":45,"value":1191},"# 6b. List labels for a metric to know what's available to filter\u002Fgroup by (metrics.md §4)\n",{"type":39,"tag":323,"props":1193,"children":1195},{"class":325,"line":1194},5,[1196,1200,1204,1208,1212,1216,1220,1224],{"type":39,"tag":323,"props":1197,"children":1198},{"style":330},[1199],{"type":45,"value":301},{"type":39,"tag":323,"props":1201,"children":1202},{"style":335},[1203],{"type":45,"value":338},{"type":39,"tag":323,"props":1205,"children":1206},{"style":341},[1207],{"type":45,"value":344},{"type":39,"tag":323,"props":1209,"children":1210},{"style":335},[1211],{"type":45,"value":349},{"type":39,"tag":323,"props":1213,"children":1214},{"style":352},[1215],{"type":45,"value":355},{"type":39,"tag":323,"props":1217,"children":1218},{"style":341},[1219],{"type":45,"value":360},{"type":39,"tag":323,"props":1221,"children":1222},{"style":335},[1223],{"type":45,"value":477},{"type":39,"tag":323,"props":1225,"children":1226},{"style":352},[1227],{"type":45,"value":1038},{"type":39,"tag":323,"props":1229,"children":1231},{"class":325,"line":1230},6,[1232,1236,1241],{"type":39,"tag":323,"props":1233,"children":1234},{"style":341},[1235],{"type":45,"value":1046},{"type":39,"tag":323,"props":1237,"children":1238},{"style":335},[1239],{"type":45,"value":1240},"\u002Fapi\u002Fplugins\u002Fk6-app\u002Fresources\u002Fcloud\u002Fcloud\u002Fv5\u002Ftest_runs\u002F\u003Crun_id>\u002Flabels?match[]=http_req_duration",{"type":39,"tag":323,"props":1242,"children":1243},{"style":341},[1244],{"type":45,"value":1056},{"type":39,"tag":323,"props":1246,"children":1248},{"class":325,"line":1247},7,[1249],{"type":39,"tag":323,"props":1250,"children":1251},{"emptyLinePlaceholder":1180},[1252],{"type":45,"value":1183},{"type":39,"tag":323,"props":1254,"children":1256},{"class":325,"line":1255},8,[1257],{"type":39,"tag":323,"props":1258,"children":1259},{"style":373},[1260],{"type":45,"value":1261},"# 6c. Time-series — pick a query method that matches the metric's type (metrics.md §6)\n",{"type":39,"tag":323,"props":1263,"children":1265},{"class":325,"line":1264},9,[1266,1270,1274,1278,1282,1286,1290,1294],{"type":39,"tag":323,"props":1267,"children":1268},{"style":330},[1269],{"type":45,"value":301},{"type":39,"tag":323,"props":1271,"children":1272},{"style":335},[1273],{"type":45,"value":338},{"type":39,"tag":323,"props":1275,"children":1276},{"style":341},[1277],{"type":45,"value":344},{"type":39,"tag":323,"props":1279,"children":1280},{"style":335},[1281],{"type":45,"value":349},{"type":39,"tag":323,"props":1283,"children":1284},{"style":352},[1285],{"type":45,"value":355},{"type":39,"tag":323,"props":1287,"children":1288},{"style":341},[1289],{"type":45,"value":360},{"type":39,"tag":323,"props":1291,"children":1292},{"style":335},[1293],{"type":45,"value":477},{"type":39,"tag":323,"props":1295,"children":1296},{"style":352},[1297],{"type":45,"value":1038},{"type":39,"tag":323,"props":1299,"children":1301},{"class":325,"line":1300},10,[1302,1306,1311],{"type":39,"tag":323,"props":1303,"children":1304},{"style":341},[1305],{"type":45,"value":1046},{"type":39,"tag":323,"props":1307,"children":1308},{"style":335},[1309],{"type":45,"value":1310},"\u002Fapi\u002Fplugins\u002Fk6-app\u002Fresources\u002Fcloud\u002Fcloud\u002Fv5\u002Ftest_runs\u002F\u003Crun_id>\u002Fquery_range_k6(query='histogram_quantile(0.95) by (name,status)',metric='http_req_duration',step=10)",{"type":39,"tag":323,"props":1312,"children":1313},{"style":341},[1314],{"type":45,"value":1056},{"type":39,"tag":323,"props":1316,"children":1318},{"class":325,"line":1317},11,[1319],{"type":39,"tag":323,"props":1320,"children":1321},{"emptyLinePlaceholder":1180},[1322],{"type":45,"value":1183},{"type":39,"tag":323,"props":1324,"children":1326},{"class":325,"line":1325},12,[1327],{"type":39,"tag":323,"props":1328,"children":1329},{"style":373},[1330],{"type":45,"value":1331},"# 6d. Scalar aggregate over the whole run (metrics.md §7)\n",{"type":39,"tag":323,"props":1333,"children":1335},{"class":325,"line":1334},13,[1336,1340,1344,1348,1352,1356,1360,1364],{"type":39,"tag":323,"props":1337,"children":1338},{"style":330},[1339],{"type":45,"value":301},{"type":39,"tag":323,"props":1341,"children":1342},{"style":335},[1343],{"type":45,"value":338},{"type":39,"tag":323,"props":1345,"children":1346},{"style":341},[1347],{"type":45,"value":344},{"type":39,"tag":323,"props":1349,"children":1350},{"style":335},[1351],{"type":45,"value":349},{"type":39,"tag":323,"props":1353,"children":1354},{"style":352},[1355],{"type":45,"value":355},{"type":39,"tag":323,"props":1357,"children":1358},{"style":341},[1359],{"type":45,"value":360},{"type":39,"tag":323,"props":1361,"children":1362},{"style":335},[1363],{"type":45,"value":477},{"type":39,"tag":323,"props":1365,"children":1366},{"style":352},[1367],{"type":45,"value":1038},{"type":39,"tag":323,"props":1369,"children":1371},{"class":325,"line":1370},14,[1372,1376,1381],{"type":39,"tag":323,"props":1373,"children":1374},{"style":341},[1375],{"type":45,"value":1046},{"type":39,"tag":323,"props":1377,"children":1378},{"style":335},[1379],{"type":45,"value":1380},"\u002Fapi\u002Fplugins\u002Fk6-app\u002Fresources\u002Fcloud\u002Fcloud\u002Fv5\u002Ftest_runs\u002F\u003Crun_id>\u002Fquery_aggregate_k6(query='increase',metric='http_reqs')",{"type":39,"tag":323,"props":1382,"children":1383},{"style":341},[1384],{"type":45,"value":1056},{"type":39,"tag":48,"props":1386,"children":1387},{},[1388,1390,1395,1397,1403,1404,1410],{"type":45,"value":1389},"Picking the right query method per metric type matters — see the \"Query methods\" tables in ",{"type":39,"tag":67,"props":1391,"children":1393},{"className":1392},[],[1394],{"type":45,"value":985},{"type":45,"value":1396},". For browser tests, the URL\u002Fstatus breakdown comes from ",{"type":39,"tag":67,"props":1398,"children":1400},{"className":1399},[],[1401],{"type":45,"value":1402},"labels",{"type":45,"value":651},{"type":39,"tag":67,"props":1405,"children":1407},{"className":1406},[],[1408],{"type":45,"value":1409},"label\u002F{name}\u002Fvalues",{"type":45,"value":1411}," (metrics.md §4\u002F§5), not from a separate tags endpoint.",{"type":39,"tag":384,"props":1413,"children":1415},{"id":1414},"step-7-fetch-logs-for-a-run",[1416],{"type":45,"value":1417},"Step 7: Fetch logs for a run",{"type":39,"tag":48,"props":1419,"children":1420},{},[1421,1423,1428,1430,1435,1437,1443,1445,1451,1453,1459,1461,1467,1469,1475,1477,1483,1484,1490,1492,1498],{"type":45,"value":1422},"Follow the Loki recipe in ",{"type":39,"tag":67,"props":1424,"children":1426},{"className":1425},[],[1427],{"type":45,"value":80},{"type":45,"value":1429}," §4 (",{"type":39,"tag":67,"props":1431,"children":1433},{"className":1432},[],[1434],{"type":45,"value":72},{"type":45,"value":1436}," against ",{"type":39,"tag":67,"props":1438,"children":1440},{"className":1439},[],[1441],{"type":45,"value":1442},"\u002Fapi\u002Fplugins\u002Fk6-app\u002Fresources\u002Flogs\u002F...",{"type":45,"value":1444},", ",{"type":39,"tag":67,"props":1446,"children":1448},{"className":1447},[],[1449],{"type":45,"value":1450},"{test_run_id=\"\u003Cid>\"}",{"type":45,"value":1452}," selector, mandatory ",{"type":39,"tag":67,"props":1454,"children":1456},{"className":1455},[],[1457],{"type":45,"value":1458},"X-K6TestRun-Id",{"type":45,"value":1460}," header, scope ",{"type":39,"tag":67,"props":1462,"children":1464},{"className":1463},[],[1465],{"type":45,"value":1466},"start",{"type":45,"value":1468},"\u002F",{"type":39,"tag":67,"props":1470,"children":1472},{"className":1471},[],[1473],{"type":45,"value":1474},"end",{"type":45,"value":1476}," to ",{"type":39,"tag":67,"props":1478,"children":1480},{"className":1479},[],[1481],{"type":45,"value":1482},"run.created",{"type":45,"value":1468},{"type":39,"tag":67,"props":1485,"children":1487},{"className":1486},[],[1488],{"type":45,"value":1489},"run.ended",{"type":45,"value":1491},"). Save the response to ",{"type":39,"tag":67,"props":1493,"children":1495},{"className":1494},[],[1496],{"type":45,"value":1497},"\u002Ftmp\u002Frun_\u003Cid>_logs.json",{"type":45,"value":1499}," and summarise from the file as described there.",{"type":39,"tag":384,"props":1501,"children":1503},{"id":1502},"step-8-if-asked-edit-the-script-safely",[1504],{"type":45,"value":1505},"Step 8: (If asked) edit the script safely",{"type":39,"tag":48,"props":1507,"children":1508},{},[1509,1511,1516,1518,1524,1526,1532],{"type":45,"value":1510},"Use the full safe-edit recipe in ",{"type":39,"tag":67,"props":1512,"children":1514},{"className":1513},[],[1515],{"type":45,"value":80},{"type":45,"value":1517}," §5 (GET → backup → edit → ",{"type":39,"tag":67,"props":1519,"children":1521},{"className":1520},[],[1522],{"type":45,"value":1523},"k6 inspect",{"type":45,"value":1525}," → 1-iter smoke → PUT with ",{"type":39,"tag":67,"props":1527,"children":1529},{"className":1528},[],[1530],{"type":45,"value":1531},"Content-Type: application\u002Foctet-stream",{"type":45,"value":1533}," → sha256 verify).",{"type":39,"tag":48,"props":1535,"children":1536},{},[1537,1539,1544,1546,1552,1553,1559],{"type":45,"value":1538},"When the edit involves thresholds, also read \"Threshold semantics\" below for the zero-observation trap, the ",{"type":39,"tag":67,"props":1540,"children":1542},{"className":1541},[],[1543],{"type":45,"value":972},{"type":45,"value":1545}," cloud delay, and operator support (",{"type":39,"tag":67,"props":1547,"children":1549},{"className":1548},[],[1550],{"type":45,"value":1551},"==",{"type":45,"value":1468},{"type":39,"tag":67,"props":1554,"children":1556},{"className":1555},[],[1557],{"type":45,"value":1558},"!=",{"type":45,"value":1560}," work despite docs).",{"type":39,"tag":384,"props":1562,"children":1564},{"id":1563},"step-9-report",[1565],{"type":45,"value":1566},"Step 9: Report",{"type":39,"tag":48,"props":1568,"children":1569},{},[1570],{"type":45,"value":1571},"Pick a template based on the question shape.",{"type":39,"tag":48,"props":1573,"children":1574},{},[1575,1580],{"type":39,"tag":59,"props":1576,"children":1577},{},[1578],{"type":45,"value":1579},"For single-run investigations",{"type":45,"value":1581}," (\"what's going on with run X\"):",{"type":39,"tag":312,"props":1583,"children":1587},{"className":1584,"code":1586,"language":45},[1585],"language-text","Test: \u003Cname> (id \u003Ctest_id>)\nRun:  \u003Crun_id> @ \u003Ccreated> → \u003Cended>, load_zone=\u003Czone>, result=\u003Cresult>\n\nLogs (\u003Cn> streams, \u003Cm> lines):\n  - \u003Cstream summary>\n\nMetrics (key indicators):\n  - \u003Cmetric>: \u003Cmethod> = \u003Cvalue> (n=\u003Ccount>)\n  ...\n\nPer-check breakdown:\n  - \u003Ccheck name>: \u003Csuccess_rate> (succ=\u003Cn>, fail=\u003Cn>)\n  ...\n\nDiagnosis: \u003Cone-paragraph>\n",[1588],{"type":39,"tag":67,"props":1589,"children":1590},{"__ignoreMap":317},[1591],{"type":45,"value":1586},{"type":39,"tag":48,"props":1593,"children":1594},{},[1595,1600],{"type":39,"tag":59,"props":1596,"children":1597},{},[1598],{"type":45,"value":1599},"For multi-run comparisons",{"type":45,"value":1601}," (\"what's different between passing and failing runs\", \"did this change cause the failures\"):",{"type":39,"tag":312,"props":1603,"children":1606},{"className":1604,"code":1605,"language":45},[1585],"Question: \u003Cone-line restatement of what the user is trying to attribute>\n\nRun timeline (relevant window):\n\n| Run ID | Created (UTC) | Result | exec_duration | processing_duration | k6 build | error code | key check ratios |\n|---|---|---|---|---|---|---|---|\n| ... | ... | passed | 60s | 195s | \u003Cbuild> | — | 1.0\u002F1.0\u002F1.0 |\n| ... | ... | failed | 27s | 193s | \u003Cbuild> | — | 0.0\u002Fn=0\u002Fn=0 |\n| ... | ... | error  | 51s | 3601s aborted | \u003Cbuild> | 8016 | 1.0\u002F1.0\u002F1.0 |\n\nDifferences that matter:\n  - \u003Cfield>: \u003Cvalue-in-passing> vs \u003Cvalue-in-failing> — \u003Cinterpretation>\n  ...\n\nScript diff (if relevant): \u003Cbundled-script diff between a representative passing and failing run, summarised>\n\nDiagnosis: \u003Cone-paragraph attributing the change to test-side, SUT-side, or platform-side, with the supporting evidence>\n",[1607],{"type":39,"tag":67,"props":1608,"children":1609},{"__ignoreMap":317},[1610],{"type":45,"value":1605},{"type":39,"tag":48,"props":1612,"children":1613},{},[1614],{"type":45,"value":1615},"The table makes side-by-side anomalies obvious (e.g. a column that's identical across passing and failing rules out that dimension as the cause; a column that flips between them is your candidate).",{"type":39,"tag":48,"props":1617,"children":1618},{},[1619,1621,1627],{"type":45,"value":1620},"If the user asked for raw data dumps, also save them to ",{"type":39,"tag":67,"props":1622,"children":1624},{"className":1623},[],[1625],{"type":45,"value":1626},"\u002Ftmp\u002Fk6inv\u002Frun\u003Cid>\u002F",{"type":45,"value":1628}," and tell them the paths.",{"type":39,"tag":146,"props":1630,"children":1632},{"id":1631},"threshold-semantics",[1633],{"type":45,"value":1634},"Threshold semantics",{"type":39,"tag":48,"props":1636,"children":1637},{},[1638,1640,1645,1647,1652],{"type":45,"value":1639},"Thresholds, not ",{"type":39,"tag":67,"props":1641,"children":1643},{"className":1642},[],[1644],{"type":45,"value":267},{"type":45,"value":1646}," calls, are what determine a run's ",{"type":39,"tag":67,"props":1648,"children":1650},{"className":1649},[],[1651],{"type":45,"value":113},{"type":45,"value":1653},". The behaviour has several non-obvious corners that mislead first-time investigators, so they're collected here. Step 5 (\"Determine pass\u002Ffail status\") and Step 8 (\"edit the script safely\") both depend on this section.",{"type":39,"tag":384,"props":1655,"children":1657},{"id":1656},"what-result-means",[1658,1660,1665],{"type":45,"value":1659},"What ",{"type":39,"tag":67,"props":1661,"children":1663},{"className":1662},[],[1664],{"type":45,"value":113},{"type":45,"value":1666}," means",{"type":39,"tag":788,"props":1668,"children":1669},{},[1670,1690],{"type":39,"tag":792,"props":1671,"children":1672},{},[1673],{"type":39,"tag":796,"props":1674,"children":1675},{},[1676,1686],{"type":39,"tag":800,"props":1677,"children":1678},{},[1679,1684],{"type":39,"tag":67,"props":1680,"children":1682},{"className":1681},[],[1683],{"type":45,"value":113},{"type":45,"value":1685}," value",{"type":39,"tag":800,"props":1687,"children":1688},{},[1689],{"type":45,"value":814},{"type":39,"tag":816,"props":1691,"children":1692},{},[1693,1709,1725,1779],{"type":39,"tag":796,"props":1694,"children":1695},{},[1696,1704],{"type":39,"tag":823,"props":1697,"children":1698},{},[1699],{"type":39,"tag":67,"props":1700,"children":1702},{"className":1701},[],[1703],{"type":45,"value":843},{"type":39,"tag":823,"props":1705,"children":1706},{},[1707],{"type":45,"value":1708},"All thresholds passed (or none defined)",{"type":39,"tag":796,"props":1710,"children":1711},{},[1712,1720],{"type":39,"tag":823,"props":1713,"children":1714},{},[1715],{"type":39,"tag":67,"props":1716,"children":1718},{"className":1717},[],[1719],{"type":45,"value":851},{"type":39,"tag":823,"props":1721,"children":1722},{},[1723],{"type":45,"value":1724},"At least one threshold failed",{"type":39,"tag":796,"props":1726,"children":1727},{},[1728,1736],{"type":39,"tag":823,"props":1729,"children":1730},{},[1731],{"type":39,"tag":67,"props":1732,"children":1734},{"className":1733},[],[1735],{"type":45,"value":858},{"type":39,"tag":823,"props":1737,"children":1738},{},[1739,1741,1746,1748,1754,1756,1762,1764,1770,1772,1777],{"type":45,"value":1740},"Either the script crashed before finishing (e.g. browser wouldn't launch) ",{"type":39,"tag":59,"props":1742,"children":1743},{},[1744],{"type":45,"value":1745},"or",{"type":45,"value":1747}," k6 Cloud aborted the run platform-side. To tell which, check ",{"type":39,"tag":67,"props":1749,"children":1751},{"className":1750},[],[1752],{"type":45,"value":1753},"status_history[*].extra.code",{"type":45,"value":1755}," on the run — a non-null code indicates a platform abort (e.g. ",{"type":39,"tag":67,"props":1757,"children":1759},{"className":1758},[],[1760],{"type":45,"value":1761},"8016",{"type":45,"value":1763}," = \"Test run max lifetime exceeded\" during ",{"type":39,"tag":67,"props":1765,"children":1767},{"className":1766},[],[1768],{"type":45,"value":1769},"processing_metrics",{"type":45,"value":1771},"). Platform aborts are not your code's fault even though they surface as ",{"type":39,"tag":67,"props":1773,"children":1775},{"className":1774},[],[1776],{"type":45,"value":858},{"type":45,"value":1778},".",{"type":39,"tag":796,"props":1780,"children":1781},{},[1782,1790],{"type":39,"tag":823,"props":1783,"children":1784},{},[1785],{"type":39,"tag":67,"props":1786,"children":1788},{"className":1787},[],[1789],{"type":45,"value":865},{"type":39,"tag":823,"props":1791,"children":1792},{},[1793],{"type":45,"value":1794},"User or system aborted the run",{"type":39,"tag":48,"props":1796,"children":1797},{},[1798,1803,1805,1810,1812,1817,1819,1824,1826,1831,1833,1838],{"type":39,"tag":67,"props":1799,"children":1801},{"className":1800},[],[1802],{"type":45,"value":267},{"type":45,"value":1804}," calls do ",{"type":39,"tag":59,"props":1806,"children":1807},{},[1808],{"type":45,"value":1809},"not",{"type":45,"value":1811}," affect ",{"type":39,"tag":67,"props":1813,"children":1815},{"className":1814},[],[1816],{"type":45,"value":113},{"type":45,"value":1818}," directly. They emit observations into the built-in ",{"type":39,"tag":67,"props":1820,"children":1822},{"className":1821},[],[1823],{"type":45,"value":129},{"type":45,"value":1825}," rate metric, which a threshold may then evaluate. If no threshold references ",{"type":39,"tag":67,"props":1827,"children":1829},{"className":1828},[],[1830],{"type":45,"value":129},{"type":45,"value":1832},", failing checks are invisible to the run-level ",{"type":39,"tag":67,"props":1834,"children":1836},{"className":1835},[],[1837],{"type":45,"value":113},{"type":45,"value":1778},{"type":39,"tag":384,"props":1840,"children":1842},{"id":1841},"the-zero-observations-pass-trap",[1843],{"type":45,"value":1844},"The \"zero observations = pass\" trap",{"type":39,"tag":48,"props":1846,"children":1847},{},[1848],{"type":45,"value":1849},"k6 reports a threshold as ✓ pass when the underlying metric has zero samples — even if the threshold expression would otherwise evaluate to false:",{"type":39,"tag":312,"props":1851,"children":1854},{"className":1852,"code":1853,"language":45},[1585],"checks{check:response is 200}\n✓ 'rate==1.0' rate=0.00%       ← ✓ pass!?\n",[1855],{"type":39,"tag":67,"props":1856,"children":1857},{"__ignoreMap":317},[1858],{"type":45,"value":1853},{"type":39,"tag":48,"props":1860,"children":1861},{},[1862,1864,1869,1871,1877,1879,1884],{"type":45,"value":1863},"This bites when the script throws before reaching the relevant ",{"type":39,"tag":67,"props":1865,"children":1867},{"className":1866},[],[1868],{"type":45,"value":267},{"type":45,"value":1870}," call. Force a check observation in a ",{"type":39,"tag":67,"props":1872,"children":1874},{"className":1873},[],[1875],{"type":45,"value":1876},"catch",{"type":45,"value":1878}," block to make the threshold see ",{"type":39,"tag":175,"props":1880,"children":1881},{},[1882],{"type":45,"value":1883},"something",{"type":45,"value":681},{"type":39,"tag":312,"props":1886,"children":1890},{"className":1887,"code":1888,"language":1889,"meta":317,"style":317},"language-javascript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","try {\n  const r = await page.goto(URL);\n  check(r, { \"response is 200\": x => x.status() === 200 });\n  \u002F\u002F ... rest of iteration body\n  check(true, { \"script completed without exception\": () => true });\n} catch (e) {\n  console.error(e);\n  check(null, { \"script completed without exception\": () => false });\n} finally {\n  await page.close();\n}\n","javascript",[1891],{"type":39,"tag":67,"props":1892,"children":1893},{"__ignoreMap":317},[1894,1908,1967,2065,2073,2141,2164,2197,2258,2274,2304],{"type":39,"tag":323,"props":1895,"children":1896},{"class":325,"line":326},[1897,1903],{"type":39,"tag":323,"props":1898,"children":1900},{"style":1899},"--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic",[1901],{"type":45,"value":1902},"try",{"type":39,"tag":323,"props":1904,"children":1905},{"style":341},[1906],{"type":45,"value":1907}," {\n",{"type":39,"tag":323,"props":1909,"children":1910},{"class":325,"line":701},[1911,1917,1922,1927,1932,1937,1941,1947,1953,1958,1962],{"type":39,"tag":323,"props":1912,"children":1914},{"style":1913},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[1915],{"type":45,"value":1916},"  const",{"type":39,"tag":323,"props":1918,"children":1919},{"style":352},[1920],{"type":45,"value":1921}," r",{"type":39,"tag":323,"props":1923,"children":1924},{"style":341},[1925],{"type":45,"value":1926}," =",{"type":39,"tag":323,"props":1928,"children":1929},{"style":1899},[1930],{"type":45,"value":1931}," await",{"type":39,"tag":323,"props":1933,"children":1934},{"style":352},[1935],{"type":45,"value":1936}," page",{"type":39,"tag":323,"props":1938,"children":1939},{"style":341},[1940],{"type":45,"value":1778},{"type":39,"tag":323,"props":1942,"children":1944},{"style":1943},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[1945],{"type":45,"value":1946},"goto",{"type":39,"tag":323,"props":1948,"children":1950},{"style":1949},"--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178",[1951],{"type":45,"value":1952},"(",{"type":39,"tag":323,"props":1954,"children":1955},{"style":352},[1956],{"type":45,"value":1957},"URL",{"type":39,"tag":323,"props":1959,"children":1960},{"style":1949},[1961],{"type":45,"value":144},{"type":39,"tag":323,"props":1963,"children":1964},{"style":341},[1965],{"type":45,"value":1966},";\n",{"type":39,"tag":323,"props":1968,"children":1969},{"class":325,"line":710},[1970,1975,1979,1984,1989,1994,1999,2004,2009,2013,2019,2024,2028,2032,2036,2041,2046,2052,2057,2061],{"type":39,"tag":323,"props":1971,"children":1972},{"style":1943},[1973],{"type":45,"value":1974},"  check",{"type":39,"tag":323,"props":1976,"children":1977},{"style":1949},[1978],{"type":45,"value":1952},{"type":39,"tag":323,"props":1980,"children":1981},{"style":352},[1982],{"type":45,"value":1983},"r",{"type":39,"tag":323,"props":1985,"children":1986},{"style":341},[1987],{"type":45,"value":1988},",",{"type":39,"tag":323,"props":1990,"children":1991},{"style":341},[1992],{"type":45,"value":1993}," {",{"type":39,"tag":323,"props":1995,"children":1996},{"style":341},[1997],{"type":45,"value":1998}," \"",{"type":39,"tag":323,"props":2000,"children":2001},{"style":1949},[2002],{"type":45,"value":2003},"response is 200",{"type":39,"tag":323,"props":2005,"children":2006},{"style":341},[2007],{"type":45,"value":2008},"\"",{"type":39,"tag":323,"props":2010,"children":2011},{"style":341},[2012],{"type":45,"value":681},{"type":39,"tag":323,"props":2014,"children":2016},{"style":2015},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic",[2017],{"type":45,"value":2018}," x",{"type":39,"tag":323,"props":2020,"children":2021},{"style":1913},[2022],{"type":45,"value":2023}," =>",{"type":39,"tag":323,"props":2025,"children":2026},{"style":352},[2027],{"type":45,"value":2018},{"type":39,"tag":323,"props":2029,"children":2030},{"style":341},[2031],{"type":45,"value":1778},{"type":39,"tag":323,"props":2033,"children":2034},{"style":1943},[2035],{"type":45,"value":121},{"type":39,"tag":323,"props":2037,"children":2038},{"style":1949},[2039],{"type":45,"value":2040},"() ",{"type":39,"tag":323,"props":2042,"children":2043},{"style":341},[2044],{"type":45,"value":2045},"===",{"type":39,"tag":323,"props":2047,"children":2049},{"style":2048},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[2050],{"type":45,"value":2051}," 200",{"type":39,"tag":323,"props":2053,"children":2054},{"style":341},[2055],{"type":45,"value":2056}," }",{"type":39,"tag":323,"props":2058,"children":2059},{"style":1949},[2060],{"type":45,"value":144},{"type":39,"tag":323,"props":2062,"children":2063},{"style":341},[2064],{"type":45,"value":1966},{"type":39,"tag":323,"props":2066,"children":2067},{"class":325,"line":719},[2068],{"type":39,"tag":323,"props":2069,"children":2070},{"style":373},[2071],{"type":45,"value":2072},"  \u002F\u002F ... rest of iteration body\n",{"type":39,"tag":323,"props":2074,"children":2075},{"class":325,"line":1194},[2076,2080,2084,2090,2094,2098,2102,2107,2111,2115,2120,2124,2129,2133,2137],{"type":39,"tag":323,"props":2077,"children":2078},{"style":1943},[2079],{"type":45,"value":1974},{"type":39,"tag":323,"props":2081,"children":2082},{"style":1949},[2083],{"type":45,"value":1952},{"type":39,"tag":323,"props":2085,"children":2087},{"style":2086},"--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC",[2088],{"type":45,"value":2089},"true",{"type":39,"tag":323,"props":2091,"children":2092},{"style":341},[2093],{"type":45,"value":1988},{"type":39,"tag":323,"props":2095,"children":2096},{"style":341},[2097],{"type":45,"value":1993},{"type":39,"tag":323,"props":2099,"children":2100},{"style":341},[2101],{"type":45,"value":1998},{"type":39,"tag":323,"props":2103,"children":2104},{"style":1949},[2105],{"type":45,"value":2106},"script completed without exception",{"type":39,"tag":323,"props":2108,"children":2109},{"style":341},[2110],{"type":45,"value":2008},{"type":39,"tag":323,"props":2112,"children":2113},{"style":341},[2114],{"type":45,"value":681},{"type":39,"tag":323,"props":2116,"children":2117},{"style":341},[2118],{"type":45,"value":2119}," ()",{"type":39,"tag":323,"props":2121,"children":2122},{"style":1913},[2123],{"type":45,"value":2023},{"type":39,"tag":323,"props":2125,"children":2126},{"style":2086},[2127],{"type":45,"value":2128}," true",{"type":39,"tag":323,"props":2130,"children":2131},{"style":341},[2132],{"type":45,"value":2056},{"type":39,"tag":323,"props":2134,"children":2135},{"style":1949},[2136],{"type":45,"value":144},{"type":39,"tag":323,"props":2138,"children":2139},{"style":341},[2140],{"type":45,"value":1966},{"type":39,"tag":323,"props":2142,"children":2143},{"class":325,"line":1230},[2144,2149,2154,2159],{"type":39,"tag":323,"props":2145,"children":2146},{"style":341},[2147],{"type":45,"value":2148},"}",{"type":39,"tag":323,"props":2150,"children":2151},{"style":1899},[2152],{"type":45,"value":2153}," catch",{"type":39,"tag":323,"props":2155,"children":2156},{"style":352},[2157],{"type":45,"value":2158}," (e) ",{"type":39,"tag":323,"props":2160,"children":2161},{"style":341},[2162],{"type":45,"value":2163},"{\n",{"type":39,"tag":323,"props":2165,"children":2166},{"class":325,"line":1247},[2167,2172,2176,2180,2184,2189,2193],{"type":39,"tag":323,"props":2168,"children":2169},{"style":352},[2170],{"type":45,"value":2171},"  console",{"type":39,"tag":323,"props":2173,"children":2174},{"style":341},[2175],{"type":45,"value":1778},{"type":39,"tag":323,"props":2177,"children":2178},{"style":1943},[2179],{"type":45,"value":858},{"type":39,"tag":323,"props":2181,"children":2182},{"style":1949},[2183],{"type":45,"value":1952},{"type":39,"tag":323,"props":2185,"children":2186},{"style":352},[2187],{"type":45,"value":2188},"e",{"type":39,"tag":323,"props":2190,"children":2191},{"style":1949},[2192],{"type":45,"value":144},{"type":39,"tag":323,"props":2194,"children":2195},{"style":341},[2196],{"type":45,"value":1966},{"type":39,"tag":323,"props":2198,"children":2199},{"class":325,"line":1255},[2200,2204,2208,2213,2217,2221,2225,2229,2233,2237,2241,2246,2250,2254],{"type":39,"tag":323,"props":2201,"children":2202},{"style":1943},[2203],{"type":45,"value":1974},{"type":39,"tag":323,"props":2205,"children":2206},{"style":1949},[2207],{"type":45,"value":1952},{"type":39,"tag":323,"props":2209,"children":2210},{"style":341},[2211],{"type":45,"value":2212},"null,",{"type":39,"tag":323,"props":2214,"children":2215},{"style":341},[2216],{"type":45,"value":1993},{"type":39,"tag":323,"props":2218,"children":2219},{"style":341},[2220],{"type":45,"value":1998},{"type":39,"tag":323,"props":2222,"children":2223},{"style":1949},[2224],{"type":45,"value":2106},{"type":39,"tag":323,"props":2226,"children":2227},{"style":341},[2228],{"type":45,"value":2008},{"type":39,"tag":323,"props":2230,"children":2231},{"style":341},[2232],{"type":45,"value":681},{"type":39,"tag":323,"props":2234,"children":2235},{"style":341},[2236],{"type":45,"value":2119},{"type":39,"tag":323,"props":2238,"children":2239},{"style":1913},[2240],{"type":45,"value":2023},{"type":39,"tag":323,"props":2242,"children":2243},{"style":2086},[2244],{"type":45,"value":2245}," false",{"type":39,"tag":323,"props":2247,"children":2248},{"style":341},[2249],{"type":45,"value":2056},{"type":39,"tag":323,"props":2251,"children":2252},{"style":1949},[2253],{"type":45,"value":144},{"type":39,"tag":323,"props":2255,"children":2256},{"style":341},[2257],{"type":45,"value":1966},{"type":39,"tag":323,"props":2259,"children":2260},{"class":325,"line":1264},[2261,2265,2270],{"type":39,"tag":323,"props":2262,"children":2263},{"style":341},[2264],{"type":45,"value":2148},{"type":39,"tag":323,"props":2266,"children":2267},{"style":1899},[2268],{"type":45,"value":2269}," finally",{"type":39,"tag":323,"props":2271,"children":2272},{"style":341},[2273],{"type":45,"value":1907},{"type":39,"tag":323,"props":2275,"children":2276},{"class":325,"line":1300},[2277,2282,2286,2290,2295,2300],{"type":39,"tag":323,"props":2278,"children":2279},{"style":1899},[2280],{"type":45,"value":2281},"  await",{"type":39,"tag":323,"props":2283,"children":2284},{"style":352},[2285],{"type":45,"value":1936},{"type":39,"tag":323,"props":2287,"children":2288},{"style":341},[2289],{"type":45,"value":1778},{"type":39,"tag":323,"props":2291,"children":2292},{"style":1943},[2293],{"type":45,"value":2294},"close",{"type":39,"tag":323,"props":2296,"children":2297},{"style":1949},[2298],{"type":45,"value":2299},"()",{"type":39,"tag":323,"props":2301,"children":2302},{"style":341},[2303],{"type":45,"value":1966},{"type":39,"tag":323,"props":2305,"children":2306},{"class":325,"line":1317},[2307],{"type":39,"tag":323,"props":2308,"children":2309},{"style":341},[2310],{"type":45,"value":2311},"}\n",{"type":39,"tag":48,"props":2313,"children":2314},{},[2315,2317,2323],{"type":45,"value":2316},"Then add ",{"type":39,"tag":67,"props":2318,"children":2320},{"className":2319},[],[2321],{"type":45,"value":2322},"'checks{check:script completed without exception}': ['rate==1.0']",{"type":45,"value":2324}," to thresholds. This catches both navigation failures AND later-stage exceptions.",{"type":39,"tag":384,"props":2326,"children":2328},{"id":2327},"abortonfail-cloud-delay",[2329,2334],{"type":39,"tag":67,"props":2330,"children":2332},{"className":2331},[],[2333],{"type":45,"value":972},{"type":45,"value":2335}," cloud delay",{"type":39,"tag":2337,"props":2338,"children":2339},"blockquote",{},[2340],{"type":39,"tag":48,"props":2341,"children":2342},{},[2343,2345,2350],{"type":45,"value":2344},"When k6 runs in the cloud, thresholds are evaluated every 60 seconds. The ",{"type":39,"tag":67,"props":2346,"children":2348},{"className":2347},[],[2349],{"type":45,"value":972},{"type":45,"value":2351}," feature may be delayed by up to 60 seconds.",{"type":39,"tag":48,"props":2353,"children":2354},{},[2355,2357,2362,2364,2369,2371,2376],{"type":45,"value":2356},"For runs shorter than 60 s, ",{"type":39,"tag":67,"props":2358,"children":2360},{"className":2359},[],[2361],{"type":45,"value":972},{"type":45,"value":2363}," may not fire before iterations complete naturally. The threshold is still evaluated at end-of-run and ",{"type":39,"tag":67,"props":2365,"children":2367},{"className":2366},[],[2368],{"type":45,"value":113},{"type":45,"value":2370}," flips to ",{"type":39,"tag":67,"props":2372,"children":2374},{"className":2373},[],[2375],{"type":45,"value":851},{"type":45,"value":2377}," — abort just doesn't save execution time.",{"type":39,"tag":384,"props":2379,"children":2381},{"id":2380},"operators",[2382],{"type":45,"value":2383},"Operators",{"type":39,"tag":48,"props":2385,"children":2386},{},[2387,2389,2394,2395,2400,2401,2407,2408,2414,2416,2433,2435,2441,2443,2449,2451,2457],{"type":45,"value":2388},"Docs show ",{"type":39,"tag":67,"props":2390,"children":2392},{"className":2391},[],[2393],{"type":45,"value":487},{"type":45,"value":1444},{"type":39,"tag":67,"props":2396,"children":2398},{"className":2397},[],[2399],{"type":45,"value":360},{"type":45,"value":1444},{"type":39,"tag":67,"props":2402,"children":2404},{"className":2403},[],[2405],{"type":45,"value":2406},"\u003C=",{"type":45,"value":1444},{"type":39,"tag":67,"props":2409,"children":2411},{"className":2410},[],[2412],{"type":45,"value":2413},">=",{"type":45,"value":2415},". ",{"type":39,"tag":59,"props":2417,"children":2418},{},[2419,2424,2426,2431],{"type":39,"tag":67,"props":2420,"children":2422},{"className":2421},[],[2423],{"type":45,"value":1551},{"type":45,"value":2425}," and ",{"type":39,"tag":67,"props":2427,"children":2429},{"className":2428},[],[2430],{"type":45,"value":1558},{"type":45,"value":2432}," also work",{"type":45,"value":2434}," even though they aren't in the docs. For ",{"type":39,"tag":67,"props":2436,"children":2438},{"className":2437},[],[2439],{"type":45,"value":2440},"rate",{"type":45,"value":2442}," metrics (value 0.00–1.00), ",{"type":39,"tag":67,"props":2444,"children":2446},{"className":2445},[],[2447],{"type":45,"value":2448},"rate==1.0",{"type":45,"value":2450}," means \"every observation was non-zero\" and ",{"type":39,"tag":67,"props":2452,"children":2454},{"className":2453},[],[2455],{"type":45,"value":2456},"rate==0",{"type":45,"value":2458}," means \"all observations were zero.\"",{"type":39,"tag":146,"props":2460,"children":2462},{"id":2461},"workflow-specific-gotchas",[2463],{"type":45,"value":2464},"Workflow-specific gotchas",{"type":39,"tag":48,"props":2466,"children":2467},{},[2468,2470,2476,2478,2483,2485,2491,2492,2497,2499,2504,2506,2511],{"type":45,"value":2469},"For the canonical gotcha list (auth expiry, doubled ",{"type":39,"tag":67,"props":2471,"children":2473},{"className":2472},[],[2474],{"type":45,"value":2475},"cloud\u002Fcloud\u002F",{"type":45,"value":2477},", 415 on script PUT, Loki missing ",{"type":39,"tag":67,"props":2479,"children":2481},{"className":2480},[],[2482],{"type":45,"value":1458},{"type":45,"value":2484},", script PUT not bumping ",{"type":39,"tag":67,"props":2486,"children":2488},{"className":2487},[],[2489],{"type":45,"value":2490},"updated",{"type":45,"value":1444},{"type":39,"tag":67,"props":2493,"children":2495},{"className":2494},[],[2496],{"type":45,"value":213},{"type":45,"value":2498}," not following ",{"type":39,"tag":67,"props":2500,"children":2502},{"className":2501},[],[2503],{"type":45,"value":221},{"type":45,"value":2505},"), see ",{"type":39,"tag":67,"props":2507,"children":2509},{"className":2508},[],[2510],{"type":45,"value":80},{"type":45,"value":2512}," §7. The entries below are specific to this investigation workflow:",{"type":39,"tag":788,"props":2514,"children":2515},{},[2516,2537],{"type":39,"tag":792,"props":2517,"children":2518},{},[2519],{"type":39,"tag":796,"props":2520,"children":2521},{},[2522,2527,2532],{"type":39,"tag":800,"props":2523,"children":2524},{},[2525],{"type":45,"value":2526},"Symptom",{"type":39,"tag":800,"props":2528,"children":2529},{},[2530],{"type":45,"value":2531},"Cause",{"type":39,"tag":800,"props":2533,"children":2534},{},[2535],{"type":45,"value":2536},"Fix",{"type":39,"tag":816,"props":2538,"children":2539},{},[2540,2576,2602,2627,2673,2705,2738],{"type":39,"tag":796,"props":2541,"children":2542},{},[2543,2548,2558],{"type":39,"tag":823,"props":2544,"children":2545},{},[2546],{"type":45,"value":2547},"\"Latest run was 6 months ago\" but schedule says daily",{"type":39,"tag":823,"props":2549,"children":2550},{},[2551,2553],{"type":45,"value":2552},"You didn't paginate ",{"type":39,"tag":67,"props":2554,"children":2556},{"className":2555},[],[2557],{"type":45,"value":205},{"type":39,"tag":823,"props":2559,"children":2560},{},[2561,2562,2567,2569,2574],{"type":45,"value":644},{"type":39,"tag":67,"props":2563,"children":2565},{"className":2564},[],[2566],{"type":45,"value":221},{"type":45,"value":2568}," loop in ",{"type":39,"tag":67,"props":2570,"children":2572},{"className":2571},[],[2573],{"type":45,"value":80},{"type":45,"value":2575}," §3 (Step 3)",{"type":39,"tag":796,"props":2577,"children":2578},{},[2579,2584,2589],{"type":39,"tag":823,"props":2580,"children":2581},{},[2582],{"type":45,"value":2583},"\"Last 7 days\" report contains only old runs",{"type":39,"tag":823,"props":2585,"children":2586},{},[2587],{"type":45,"value":2588},"Filtered by row count, not date",{"type":39,"tag":823,"props":2590,"children":2591},{},[2592,2594,2600],{"type":45,"value":2593},"Re-filter by ",{"type":39,"tag":67,"props":2595,"children":2597},{"className":2596},[],[2598],{"type":45,"value":2599},"created >= \u003Ciso_date>",{"type":45,"value":2601}," (Step 4)",{"type":39,"tag":796,"props":2603,"children":2604},{},[2605,2610,2622],{"type":39,"tag":823,"props":2606,"children":2607},{},[2608],{"type":45,"value":2609},"Threshold reports ✓ pass but checks fail",{"type":39,"tag":823,"props":2611,"children":2612},{},[2613,2615,2620],{"type":45,"value":2614},"Zero check observations; iteration aborted before ",{"type":39,"tag":67,"props":2616,"children":2618},{"className":2617},[],[2619],{"type":45,"value":267},{"type":45,"value":2621}," ran",{"type":39,"tag":823,"props":2623,"children":2624},{},[2625],{"type":45,"value":2626},"See \"Threshold semantics\" above",{"type":39,"tag":796,"props":2628,"children":2629},{},[2630,2641,2661],{"type":39,"tag":823,"props":2631,"children":2632},{},[2633,2639],{"type":39,"tag":67,"props":2634,"children":2636},{"className":2635},[],[2637],{"type":45,"value":2638},"result: error",{"type":45,"value":2640}," but the script logs\u002Fmetrics look fine",{"type":39,"tag":823,"props":2642,"children":2643},{},[2644,2646,2651,2653,2659],{"type":45,"value":2645},"Likely a platform abort (e.g. ",{"type":39,"tag":67,"props":2647,"children":2649},{"className":2648},[],[2650],{"type":45,"value":1769},{"type":45,"value":2652}," exceeded the 1h cap, ",{"type":39,"tag":67,"props":2654,"children":2656},{"className":2655},[],[2657],{"type":45,"value":2658},"code 8016",{"type":45,"value":2660},"). The execution itself completed normally.",{"type":39,"tag":823,"props":2662,"children":2663},{},[2664,2666,2671],{"type":45,"value":2665},"Check ",{"type":39,"tag":67,"props":2667,"children":2669},{"className":2668},[],[2670],{"type":45,"value":1753},{"type":45,"value":2672}," on the run. Non-null platform code → not your code's fault. See \"Threshold semantics\"",{"type":39,"tag":796,"props":2674,"children":2675},{},[2676,2681,2686],{"type":39,"tag":823,"props":2677,"children":2678},{},[2679],{"type":45,"value":2680},"Investigating a past run by reading the current load-test script",{"type":39,"tag":823,"props":2682,"children":2683},{},[2684],{"type":45,"value":2685},"Script may have been edited since the run executed — what you're reading isn't what ran",{"type":39,"tag":823,"props":2687,"children":2688},{},[2689,2691,2696,2698,2703],{"type":45,"value":2690},"GET the run's ",{"type":39,"tag":175,"props":2692,"children":2693},{},[2694],{"type":45,"value":2695},"bundled",{"type":45,"value":2697}," script via the per-run endpoint (",{"type":39,"tag":67,"props":2699,"children":2701},{"className":2700},[],[2702],{"type":45,"value":80},{"type":45,"value":2704}," §5) and diff against the current load-test script before drawing conclusions",{"type":39,"tag":796,"props":2706,"children":2707},{},[2708,2713,2726],{"type":39,"tag":823,"props":2709,"children":2710},{},[2711],{"type":45,"value":2712},"Just overwrote the user's script",{"type":39,"tag":823,"props":2714,"children":2715},{},[2716,2718,2724],{"type":45,"value":2717},"Invoked ",{"type":39,"tag":67,"props":2719,"children":2721},{"className":2720},[],[2722],{"type":45,"value":2723},"update-script",{"type":45,"value":2725}," to \"see the URL\"",{"type":39,"tag":823,"props":2727,"children":2728},{},[2729,2731,2736],{"type":45,"value":2730},"Restore from the backup taken in Step 2. To learn URLs without writing, use ",{"type":39,"tag":67,"props":2732,"children":2734},{"className":2733},[],[2735],{"type":45,"value":187},{"type":45,"value":2737}," on any non-mutating command.",{"type":39,"tag":796,"props":2739,"children":2740},{},[2741,2754,2759],{"type":39,"tag":823,"props":2742,"children":2743},{},[2744,2746,2752],{"type":45,"value":2745},"CLI ",{"type":39,"tag":67,"props":2747,"children":2749},{"className":2748},[],[2750],{"type":45,"value":2751},"--iterations 1",{"type":45,"value":2753}," breaks browser scenarios",{"type":39,"tag":823,"props":2755,"children":2756},{},[2757],{"type":45,"value":2758},"Overrides scenario block entirely",{"type":39,"tag":823,"props":2760,"children":2761},{},[2762,2764,2770],{"type":45,"value":2763},"Edit ",{"type":39,"tag":67,"props":2765,"children":2767},{"className":2766},[],[2768],{"type":45,"value":2769},"iterations:",{"type":45,"value":2771}," in-file with sed instead",{"type":39,"tag":146,"props":2773,"children":2775},{"id":2774},"reference",[2776],{"type":45,"value":2777},"Reference",{"type":39,"tag":89,"props":2779,"children":2780},{},[2781],{"type":39,"tag":93,"props":2782,"children":2783},{},[2784,2793],{"type":39,"tag":2785,"props":2786,"children":2787},"a",{"href":142},[2788],{"type":39,"tag":67,"props":2789,"children":2791},{"className":2790},[],[2792],{"type":45,"value":142},{"type":45,"value":2794}," — a synthetic investigation with realistic findings, useful as a template for the Step 9 report.",{"type":39,"tag":2796,"props":2797,"children":2798},"style",{},[2799],{"type":45,"value":2800},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":2802,"total":2917},[2803,2818,2835,2851,2868,2884,2902],{"slug":2804,"name":2804,"fn":2805,"description":2806,"org":2807,"tags":2808,"stars":23,"repoUrl":24,"updatedAt":2817},"adaptive-metrics","optimize Grafana Cloud metrics costs","Cut Grafana Cloud Metrics cost by shrinking active-series count with Adaptive Metrics aggregation rules — auto-recommendations from query history, custom exact\u002Fregex rules, label-drop config, unused-metric detection, and Alloy remote_write fallback. Use when investigating a high Mimir\u002FGrafana Cloud bill, hunting high-cardinality labels (`pod_uid`, `service_instance_id`, `version`), pre-aggregating counters\u002Fgauges, dropping unused metrics, or measuring `grafanacloud_instance_active_series` before\u002Fafter — even when the user says \"reduce cardinality\", \"too many series\", \"metrics spend\", \"active series count is exploding\", or \"drop the version label\" without naming Adaptive Metrics.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2809,2812,2813,2816],{"name":2810,"slug":2811,"type":15},"Cost Optimization","cost-optimization",{"name":9,"slug":8,"type":15},{"name":2814,"slug":2815,"type":15},"Metrics","metrics",{"name":13,"slug":14,"type":15},"2026-07-12T07:44:27.451068",{"slug":2819,"name":2819,"fn":2820,"description":2821,"org":2822,"tags":2823,"stars":23,"repoUrl":24,"updatedAt":2834},"admin","manage Grafana Cloud accounts and RBAC","Manage Grafana Cloud accounts — organizations, stacks, RBAC roles and assignments, SSO\u002FSAML\u002FOAuth\u002FGitHub auth, service accounts for CI\u002FCD, user invites, team membership, and API-driven provisioning. Creates stacks via the Cloud API, mints service-account tokens, applies role assignments, configures SSO providers, and provisions teams\u002Ffolders\u002Fdashboards via Terraform. Use when managing Grafana Cloud access, configuring SSO\u002FSAML\u002FOAuth, setting up service accounts for Terraform\u002FCI\u002FCD, assigning RBAC roles, inviting users, managing multiple stacks or organizations, provisioning cloud resources via API or Terraform, or auditing admin actions — even when the user says \"set up SSO\", \"create a stack\", \"make a service account\", or \"onboard a team\" without explicitly saying \"admin\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2824,2827,2830,2831],{"name":2825,"slug":2826,"type":15},"Access Control","access-control",{"name":2828,"slug":2829,"type":15},"Auth","auth",{"name":9,"slug":8,"type":15},{"name":2832,"slug":2833,"type":15},"Operations","operations","2026-07-12T07:44:12.078436",{"slug":2836,"name":2836,"fn":2837,"description":2838,"org":2839,"tags":2840,"stars":23,"repoUrl":24,"updatedAt":2850},"admission-control","implement admission control webhooks","Use when the user asks to \"write a validator\", \"add validation\", \"implement admission control\", \"write a mutating webhook\", \"add a mutation handler\", \"validate incoming resources\", \"implement admission logic\", \"add admission webhooks\", \"write ingress validation\", or asks how to validate or mutate resources before they are persisted in a grafana-app-sdk app. Provides guidance on implementing validation and mutation admission handlers for grafana-app-sdk apps.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2841,2844,2847],{"name":2842,"slug":2843,"type":15},"Architecture","architecture",{"name":2845,"slug":2846,"type":15},"Security","security",{"name":2848,"slug":2849,"type":15},"Validation","validation","2026-07-12T07:45:06.148973",{"slug":2852,"name":2852,"fn":2853,"description":2854,"org":2855,"tags":2856,"stars":23,"repoUrl":24,"updatedAt":2867},"alerting-irm","configure Grafana Alerting and Incident Management","Configure Grafana Alerting, Incident Response Management (IRM), and SLOs end-to-end — provisions Grafana-managed and data-source-managed alert rules, contact points (Slack\u002FPagerDuty\u002Femail\u002Fwebhook), notification policies with hierarchical matchers, silences, mute timings, on-call schedules and escalation chains, incident-management integrations, and SLOs with multi-window burn-rate alerts. Use when configuring alerts, debugging notification routing, setting up on-call rotations, declaring or managing incidents, defining SLOs, provisioning alerting via YAML or API, picking matchers for a notification policy, building a PagerDuty\u002FSlack webhook receiver, or troubleshooting why an alert isn't firing — even when the user says \"page me on errors\", \"alert me when X happens\", \"route this to the platform team\", or \"set up an SLO\" without naming Alerting or IRM.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2857,2860,2861,2864],{"name":2858,"slug":2859,"type":15},"Alerting","alerting",{"name":9,"slug":8,"type":15},{"name":2862,"slug":2863,"type":15},"Incident Response","incident-response",{"name":2865,"slug":2866,"type":15},"Monitoring","monitoring","2026-07-12T07:44:02.393397",{"slug":2869,"name":2869,"fn":2870,"description":2871,"org":2872,"tags":2873,"stars":23,"repoUrl":24,"updatedAt":2883},"alloy","build unified telemetry pipelines with Grafana Alloy","Build a unified telemetry pipeline with Grafana Alloy — one OpenTelemetry-compatible binary that collects metrics, logs, traces, and profiles and ships to Grafana Cloud \u002F Prometheus \u002F Loki \u002F Tempo \u002F Pyroscope. Covers the Alloy config language (blocks, `sys.env`, component refs), `prometheus.scrape` → `remote_write`, `loki.source.file` + `loki.process` → `loki.write`, `otelcol.receiver.otlp` → `otelcol.exporter.otlp`, `pyroscope.scrape`, K8s \u002F Docker \u002F EC2 discovery, relabeling, modules (`import.file\u002Fgit\u002Fhttp`), clustering, Fleet Management `remotecfg`, the Alloy UI at `:12345`, and `alloy fmt` \u002F `alloy validate`. Use when writing a `config.alloy`, replacing Grafana Agent \u002F OTel Collector, scraping K8s pods, parsing logs, ingesting OTLP, or debugging \"Alloy isn't sending anything\" — even when the user says \"set up the agent\", \"write me a scrape config\", \"drop these logs before sending\", or \"OTel collector config\" without naming Alloy.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2874,2875,2878,2879,2880],{"name":9,"slug":8,"type":15},{"name":2876,"slug":2877,"type":15},"Logs","logs",{"name":2814,"slug":2815,"type":15},{"name":13,"slug":14,"type":15},{"name":2881,"slug":2882,"type":15},"OpenTelemetry","opentelemetry","2026-07-12T07:43:54.817139",{"slug":2885,"name":2885,"fn":2886,"description":2887,"org":2888,"tags":2889,"stars":23,"repoUrl":24,"updatedAt":2901},"app-observability","monitor application performance in Grafana Cloud","Get RED metrics + service maps + frontend RUM + AI\u002FLLM monitoring out of Grafana Cloud — Application Observability (`traces_spanmetrics_*` from OTel traces, p50\u002Fp95\u002Fp99 latency, exemplar-to-trace, traces-to-logs \u002F profiles), Frontend Observability with the Faro Web SDK (Core Web Vitals, session replay, `pushError`, React + router integration, `TracingInstrumentation` for browser → backend trace correlation), and AI Observability via OpenLIT (token \u002F cost \u002F latency, GPU, hallucination + toxicity evals). Use when standing up APM for a service, wiring an Alloy OTLP receiver + forwarding to Cloud, instrumenting a React frontend for RUM, debugging why service-map edges are missing, monitoring LLM cost drift, or correlating a frontend error to its backend trace — even when the user says \"set up APM\", \"show service map\", \"monitor browser perf\", \"session replay\", \"RUM SDK\", or \"watch our OpenAI bill\" without naming App \u002F Frontend \u002F AI Observability.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2890,2893,2896,2897,2900],{"name":2891,"slug":2892,"type":15},"APM","apm",{"name":2894,"slug":2895,"type":15},"Distributed Tracing","distributed-tracing",{"name":9,"slug":8,"type":15},{"name":2898,"slug":2899,"type":15},"LLM","llm",{"name":13,"slug":14,"type":15},"2026-07-12T07:44:34.500406",{"slug":2903,"name":2903,"fn":2904,"description":2905,"org":2906,"tags":2907,"stars":23,"repoUrl":24,"updatedAt":2916},"app-sdk-concepts","scaffold and configure Grafana apps","Use when starting any grafana-app-sdk work — scaffolding a Grafana app, initializing a Grafana App Platform app, picking a deployment mode (standalone operator \u002F grafana\u002Fapps \u002F frontend-only), wiring app-specific config, or onboarding to the SDK. Covers `grafana-app-sdk` CLI install, `project init` per deployment mode, project layout, the schema-centric workflow (CUE kinds → generated code → reconciler\u002Fadmission logic), and `SpecificConfig` for env-driven app configuration. Use even if the user just says \"make a new app\", \"Grafana app platform\", \"kinds and watchers\", \"operator scaffold\", or asks about `apps\u002F` inside the Grafana repo, without naming the SDK explicitly.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2908,2909,2912,2915],{"name":2842,"slug":2843,"type":15},{"name":2910,"slug":2911,"type":15},"Deployment","deployment",{"name":2913,"slug":2914,"type":15},"Engineering","engineering",{"name":9,"slug":8,"type":15},"2026-07-12T07:45:08.595757",48,{"items":2919,"total":3094},[2920,2935,2954,2974,2989,3003,3016,3029,3046,3057,3070,3082],{"slug":2921,"name":2921,"fn":2922,"description":2923,"org":2924,"tags":2925,"stars":2932,"repoUrl":2933,"updatedAt":2934},"faro-setup-web","instrument web apps with Grafana Faro","Instruments a web app with Grafana Faro Web SDK for frontend observability. Use when setting up error tracking, Web Vitals, session monitoring, or distributed tracing in a browser app.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2926,2927,2930,2931],{"name":2894,"slug":2895,"type":15},{"name":2928,"slug":2929,"type":15},"Frontend","frontend",{"name":2865,"slug":2866,"type":15},{"name":13,"slug":14,"type":15},1103,"https:\u002F\u002Fgithub.com\u002Fgrafana\u002Ffaro-web-sdk","2026-07-12T07:43:24.63314",{"slug":2936,"name":2936,"fn":2937,"description":2938,"org":2939,"tags":2940,"stars":2951,"repoUrl":2952,"updatedAt":2953},"configuring-yesoreyeram-infinity-datasource","configure Grafana Infinity data source","Configure the Infinity data source — base URL and allowed hosts, the authentication methods (basic, bearer token, API key, digest, OAuth passthrough, OAuth 2.0 client credentials\u002FJWT, Azure, Azure Blob, AWS), TLS, custom HTTP headers, network and security settings, the custom health check, and provisioning with a config file. Use when a user asks how to set up, configure, or change settings for the Infinity data source; how to authenticate to an API; how to allow hosts; how to provision it as YAML; or how to troubleshoot connection, authentication, or health-check issues.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2941,2944,2947,2950],{"name":2942,"slug":2943,"type":15},"API Development","api-development",{"name":2945,"slug":2946,"type":15},"Authentication","authentication",{"name":2948,"slug":2949,"type":15},"Configuration","configuration",{"name":9,"slug":8,"type":15},1056,"https:\u002F\u002Fgithub.com\u002Fgrafana\u002Fgrafana-infinity-datasource","2026-07-12T07:43:25.939136",{"slug":2955,"name":2955,"fn":2956,"description":2957,"org":2958,"tags":2959,"stars":2951,"repoUrl":2952,"updatedAt":2973},"querying-yesoreyeram-infinity-datasource","query data with Infinity datasource","Build queries with the Infinity data source — the query types (JSON, CSV, TSV, XML, GraphQL, HTML, UQL, GROQ, Google Sheets, Series, Transformations), the parsers (Frontend\u002Fsimple, Backend JSONata, JQ, UQL, GROQ) and which support alerting, the sources (URL, Inline, Reference, Azure Blob, Random walk), output formats (table, timeseries, logs, trace, node graph, dataframe), root selector and columns, computed columns\u002Ffilters\u002Fsummarize, pagination, and template variables. Use when a user asks how to query Infinity; how to fetch JSON\u002FCSV\u002FXML\u002FGraphQL\u002FHTML from a URL or inline; how to select rows and columns; how to transform data with UQL\u002FGROQ\u002FJSONata\u002FJQ; how to make a query work with alerting; how to paginate; or how to use variables in a query.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2960,2963,2966,2967,2970],{"name":2961,"slug":2962,"type":15},"CSV","csv",{"name":2964,"slug":2965,"type":15},"Data Analysis","data-analysis",{"name":9,"slug":8,"type":15},{"name":2968,"slug":2969,"type":15},"GraphQL","graphql",{"name":2971,"slug":2972,"type":15},"JSON","json","2026-07-15T05:34:05.773947",{"slug":2975,"name":2975,"fn":2976,"description":2977,"org":2978,"tags":2979,"stars":2986,"repoUrl":2987,"updatedAt":2988},"agento11y","manage Grafana Agent Observability resources","Inspects and manages Grafana Agent Observability resources via gcx: conversations, generations, evaluators, rules, scores, and templates. Use when the user wants to list or search conversations, inspect generations, manage evaluators (upsert, test, delete), set up evaluation rules, check scores, or browse evaluator templates. Trigger on phrases like \"list conversations\", \"search generations\", \"what did the agent do\", \"debug LLM conversation\", \"create evaluator\", \"set up evaluation rule\", \"test evaluator\", \"check scores\", \"evaluate generation quality\", or \"set up online evaluation\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2980,2983,2984,2985],{"name":2981,"slug":2982,"type":15},"Agents","agents",{"name":9,"slug":8,"type":15},{"name":2865,"slug":2866,"type":15},{"name":13,"slug":14,"type":15},430,"https:\u002F\u002Fgithub.com\u002Fgrafana\u002Fgcx","2026-07-25T05:30:40.29622",{"slug":2990,"name":2990,"fn":2991,"description":2992,"org":2993,"tags":2994,"stars":2986,"repoUrl":2987,"updatedAt":3002},"agento11y-instrument","instrument LLM apps for agent observability","Sets up and instruments a developer's own LLM app or agent to send generations and agentic workflow to Grafana Agent Observability (the Agent Observability SDKs) — greenfield setup, fixing broken instrumentation, or filling gaps in existing instrumentation. Uses gcx for the parts a static prompt can't do: `gcx login` \u002F `gcx cloud stacks` to find the stack, and `gcx agento11y agents|conversations|generations` to VERIFY that data actually lands — so it iterates (instrument → run → verify → fix) until generations arrive, not blindly. Reads the app's code, detects language\u002Fframework, classifies instrumentation state (none \u002F partial \u002F broken), then runs a fixed gap checklist whose #1 item is the silent failure no other prompt catches: the SDK emits OTel spans\u002Fmetrics but never creates a TracerProvider\u002FMeterProvider, so without them all metrics go to a no-op and are lost. Also checks agent_version (required for per-version Performance charts), set_result completeness, SYNC vs STREAM, parent_generation_ids DAG links, and workflow-step coverage. Recommends changes citing file:line and, only with explicit confirmation, applies minimal diffs that don't change app behavior. Pulls SDK reference from agento11y's llms.txt rather than restating it, and hands off to `agento11y-test-starter` once data flows. It does NOT write test suites or set up tenant evaluations, rules, or guards — offline test suites are `agento11y-test-starter`, tenant eval rules + guards are `agento11y-prod-setup`; does NOT install coding-agent telemetry plugins (that is llms.txt \"Path A\"); does NOT mint or store credentials or invent endpoints. Trigger on phrases like \"instrument my app\", \"send my agent's traces to Grafana\", \"set up AI observability for my app\", \"my generations aren't showing up\", \"why is Performance empty\", \"add Agent Observability to my code\", \"fix my instrumentation\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2995,2996,2997,3000,3001],{"name":2981,"slug":2982,"type":15},{"name":9,"slug":8,"type":15},{"name":2998,"slug":2999,"type":15},"Instrumentation","instrumentation",{"name":2898,"slug":2899,"type":15},{"name":13,"slug":14,"type":15},"2026-07-31T05:53:52.580237",{"slug":3004,"name":3004,"fn":3005,"description":3006,"org":3007,"tags":3008,"stars":2986,"repoUrl":2987,"updatedAt":3015},"agento11y-prod-setup","setup production evaluation for AI agents","Sets up production evaluation and guardrails for a DEPLOYED AI agent in Grafana Agent Observability, grounded in the agent's own code and its real ingested traffic. The judgment layer on top of the `agento11y` skill: it reads the agent's source (system prompt, tools, entrypoint) AND samples its live traffic via gcx, checks what evaluators\u002Frules\u002Fguards already exist, then recommends only what's missing — online eval rules (score live conversations for regressions) and guards (warn-first request-path policies that redact \u002F tool-filter and may later be promoted to deny). It drafts reviewable YAML and, only with explicit confirmation, applies via `gcx agento11y`. New guards are drafted in warn mode (safe on live traffic — warn records but never blocks). It DOES create stack-level objects — that is the point — but every write is confirmed. It never rewrites or redeploys the agent. Trigger on phrases like \"set up production evaluation\", \"my agent is in prod what should I evaluate\", \"catch quality regressions\", \"add guardrails to my agent\", \"redact PII from my agent\", \"block dangerous tools\", \"set up online evals and guards\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3009,3010,3013,3014],{"name":2981,"slug":2982,"type":15},{"name":3011,"slug":3012,"type":15},"Evals","evals",{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},"2026-07-31T05:53:53.576347",{"slug":3017,"name":3017,"fn":3018,"description":3019,"org":3020,"tags":3021,"stars":2986,"repoUrl":2987,"updatedAt":3028},"agento11y-test-starter","build and run agent test suites","Use early in an AI-agent project — before ship, before real traffic — to build a starter test suite for the agent and run it offline. Reads the agent's own code (system prompt, tools, task), writes a labeled draft suite of test cases (happy\u002Fedge\u002Fadversarial) grounded in real lines, and recommends how to score each case (the evaluators\u002Fjudges the offline runner uses). Assesses how runnable the agent is: for an easily-invoked agent it generates a runner stub (run_experiment.py) with two holes to fill and can optionally run it (only with permission, only against the endpoint the developer configured); for agents needing a harness or full runtime it points to the existing eval infra. It runs OFFLINE and never creates tenant-level evaluators, rules, or guards — that is `agento11y-prod-setup`, for a deployed agent with real traffic. Trigger on phrases like \"how do I test my agent before shipping\", \"write test cases for my agent\", \"set up tests for my agent\", \"check my agent before prod\", \"I have no traffic yet, how do I evaluate it\", \"test my agent offline\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3022,3023,3024,3027],{"name":2981,"slug":2982,"type":15},{"name":9,"slug":8,"type":15},{"name":3025,"slug":3026,"type":15},"QA","qa",{"name":18,"slug":19,"type":15},"2026-07-31T05:53:51.62785",{"slug":3030,"name":3030,"fn":3031,"description":3032,"org":3033,"tags":3034,"stars":2986,"repoUrl":2987,"updatedAt":3045},"create-dashboard","create Grafana dashboards with gcx","Designs and creates Grafana dashboards with gcx, using `gcx dashboards snapshot` as a visual feedback loop. Use when the user wants to create a new Grafana dashboard, add panels, variables, or annotations to an existing dashboard, design dashboard panels, variables, queries, or layout, or make a material visual redesign. Triggers on \"create dashboard\", \"new dashboard\", \"build dashboard\", \"dashboard for \u003Cservice>\", \"add panels\", \"add variable\", \"add annotation\", \"improve this dashboard\", or \"iterate on a dashboard\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3035,3038,3041,3044],{"name":3036,"slug":3037,"type":15},"Dashboards","dashboards",{"name":3039,"slug":3040,"type":15},"Data Visualization","data-visualization",{"name":3042,"slug":3043,"type":15},"Design","design",{"name":9,"slug":8,"type":15},"2026-07-25T05:30:46.289717",{"slug":3047,"name":3047,"fn":3048,"description":3049,"org":3050,"tags":3051,"stars":2986,"repoUrl":2987,"updatedAt":3056},"debug-with-grafana","investigate application issues with Grafana","Structured workflow for investigating application problems with Grafana observability data (metrics, logs, traces) via gcx. Covers live firefighting AND retrospective incident analysis: incident triage, root-cause analysis, blast-radius checks (did an incident spill into other services), verifying whether a deployment or rollout triggered an incident, finding which service, endpoint, or path owns the most errors or slow requests, checking whether retries or queue backlogs piled up, and quantifying error or latency shares over a time window. Trigger on: \"my API is returning 500 errors\", \"latency is spiking\", \"investigate why requests are failing\", \"triage the incident\", \"blast radius\", \"root cause\", \"did the rollout cause it\", \"which endpoint owns the most 5xx\", \"did retries pile up\", or any request to analyse an earlier incident window using telemetry. For authoring dashboards use create-dashboard; for dashboard inventory use manage-dashboards.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3052,3053,3054,3055],{"name":21,"slug":22,"type":15},{"name":9,"slug":8,"type":15},{"name":2862,"slug":2863,"type":15},{"name":13,"slug":14,"type":15},"2026-07-18T05:11:10.445428",{"slug":3058,"name":3058,"fn":3059,"description":3060,"org":3061,"tags":3062,"stars":2986,"repoUrl":2987,"updatedAt":3069},"diagnose-entity-graph","diagnose Grafana Entity Graph issues","Diagnose Entity Graph problems: missing entities, missing edges, disconnected clusters, or filtering issues. Use when the user reports that Entity Graph doesn't look right, services are missing, edges aren't appearing, or environments can't be filtered. Triggers for: \"entity graph is empty\", \"services missing from entity graph\", \"no edges in entity graph\", \"disconnected services\", \"can't filter entity graph\", \"entity graph not working\", \"diagnose entity graph\", \"debug knowledge graph\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3063,3064,3065,3068],{"name":21,"slug":22,"type":15},{"name":9,"slug":8,"type":15},{"name":3066,"slug":3067,"type":15},"Graph Analysis","graph-analysis",{"name":13,"slug":14,"type":15},"2026-07-25T05:30:39.380934",{"slug":301,"name":301,"fn":3071,"description":3072,"org":3073,"tags":3074,"stars":2986,"repoUrl":2987,"updatedAt":3081},"manage Grafana Cloud resources via gcx","Manages Grafana Cloud resources via the gcx CLI. Trigger when the user wants to inspect, create, update, delete, query, or automate any Grafana resource - dashboards, datasources, alerts, SLOs, synthetic checks, oncall, incidents, fleet, k6, knowledge graph, or adaptive telemetry.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3075,3078,3079,3080],{"name":3076,"slug":3077,"type":15},"CLI","cli",{"name":9,"slug":8,"type":15},{"name":2865,"slug":2866,"type":15},{"name":2832,"slug":2833,"type":15},"2026-07-31T05:53:50.587304",{"slug":3083,"name":3083,"fn":3084,"description":3085,"org":3086,"tags":3087,"stars":2986,"repoUrl":2987,"updatedAt":3093},"gcx-demo","present gcx demo tours","Run a narrated, read-only demo tour of gcx for customer or colleague presentations. Showcases the breadth of gcx across every Grafana Cloud product area — resources, datasources, metrics, logs, traces, SLOs, alerts, synthetic monitoring, IRM, k6, fleet, and more. All commands are strictly read-only. Trigger when the user says \"demo gcx\", \"show off gcx\", \"customer demo\", \"gcx tour\", or \"\u002Fgcx-demo\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3088,3089,3090],{"name":3076,"slug":3077,"type":15},{"name":9,"slug":8,"type":15},{"name":3091,"slug":3092,"type":15},"Presentations","presentations","2026-07-25T05:30:45.282458",80]