[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-datadog-dd-triage-flaky-test":3,"mdc--18hfc1-key":38,"related-repo-datadog-dd-triage-flaky-test":1833,"related-org-datadog-dd-triage-flaky-test":1924},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":24,"repoUrl":25,"updatedAt":26,"license":27,"forks":28,"topics":29,"repo":33,"sourceUrl":36,"mdContent":37},"dd-triage-flaky-test","triage and resolve flaky tests","Load when investigating a specific flaky test. Gets history, failure pattern, and category, then recommends fix, quarantine, or escalate.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"datadog","Datadog","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fdatadog.png","DataDog",[13,17,18,21],{"name":14,"slug":15,"type":16},"QA","qa","tag",{"name":9,"slug":8,"type":16},{"name":19,"slug":20,"type":16},"Testing","testing",{"name":22,"slug":23,"type":16},"Debugging","debugging",952,"https:\u002F\u002Fgithub.com\u002FDataDog\u002Fpup","2026-07-12T07:55:10.506266",null,90,[30,31,8,32],"cli","client","observability",{"repoUrl":25,"stars":24,"forks":28,"topics":34,"description":35},[30,31,8,32],"Give your AI agent a Pup — a CLI companion with 200+ commands across 33+ Datadog products.","https:\u002F\u002Fgithub.com\u002FDataDog\u002Fpup\u002Ftree\u002FHEAD\u002Fskills\u002Fdd-triage-flaky-test","---\nname: dd-triage-flaky-test\ndescription: Load when investigating a specific flaky test. Gets history, failure pattern, and category, then recommends fix, quarantine, or escalate.\nmetadata:\n  version: \"1.0.0\"\n  author: datadog-labs\n  repository: https:\u002F\u002Fgithub.com\u002Fdatadog-labs\u002Fagent-skills\n  tags: datadog,ci,cicd,flaky,flaky-tests,test-optimization\n  alwaysApply: \"false\"\n---\n\n# Triage Flaky Test\n\nOne-line summary: Investigate a specific flaky test — get history, failure pattern, and category, then recommend fix, quarantine, or escalate.\n\nRequires: `dd-pup` skill (pup CLI installed and authenticated).\n\n---\n\n## Input\n\n| Parameter | Description |\n|---|---|\n| Test name | Fully qualified test name (e.g. `TestMyFunc` or `com.example.MyTest`) |\n| Repository | Lowercase, no-schema URL (e.g. `github.com\u002Forg\u002Frepo`). Derive from `git remote get-url origin` if not provided. |\n\n---\n\n## Workflow\n\n### STEP 0 — Parse Input\n\nDerive repository ID from git if not provided:\n```bash\ngit remote get-url origin\n# Strip protocol and trailing .git, then lowercase the result\n# e.g. https:\u002F\u002Fgithub.com\u002FDataDog\u002Fmy-repo.git → github.com\u002Fdatadog\u002Fmy-repo\n```\n\n**Validation fallback:** If STEP 1 returns no results, confirm the correct repository by searching without a repo filter:\n```bash\npup cicd tests search \\\n  --query \"@test.name:\\\"\u003Ctest-name>\\\"\" \\\n  --from 30d \\\n  --limit 5\n```\nExtract `@git.repository.id_v2` from results and retry STEP 1 with the confirmed value.\n\n### STEP 1 — Get Flaky Test Details\n\n**Preferred — use `fingerprint_fqn` if known** (`fingerprint_fqn` is a valid CI Visibility search facet, distinct from `flaky_state`):\n```bash\npup cicd flaky-tests search \\\n  --query \"fingerprint_fqn:\u003Cfqn>\" \\\n  --sort=\"-last_flaked\" \\\n  --limit 5\n```\n\n**Fallback — use name + suite + repo:**\n```bash\npup cicd flaky-tests search \\\n  --query \"@test.name:\\\"\u003Ctest-name>\\\" @test.suite:\\\"\u003Csuite>\\\" @git.repository.id_v2:\\\"\u003Crepo>\\\"\" \\\n  --sort=\"-last_flaked\" \\\n  --limit 10\n```\nOmit `@test.suite` if unknown; if the same test name appears in multiple suites, pick the entry whose suite matches the failing test.\n\nDo not filter by `flaky_test_state` — return the test regardless of state.\n\nNote: the query filter facet is `flaky_test_state`; the returned response attribute is `flaky_state` — these are different names for the same concept; do not use `flaky_state:active` as a query filter.\n\nExtract from results:\n- `fingerprint_fqn` — unique test identifier; used as the `id` in STEP 5 write call. **If absent, do not proceed to quarantine — see STEP 5.**\n- `flaky_state` — current state (active \u002F quarantined \u002F disabled \u002F fixed)\n- `test_stats.failure_rate_pct` — percentage of runs that fail\n- `flaky_category` — root cause category\n- `codeowners` — owning team\n- `pipeline_stats.total_lost_time_ms` — total CI time lost\n\n### STEP 2 — Get Recent Failure History\n\n```bash\npup cicd tests search \\\n  --query \"@test.name:\\\"\u003Ctest-name>\\\" @test.suite:\\\"\u003Csuite>\\\" @test.status:fail @git.repository.id_v2:\\\"\u003Crepo>\\\"\" \\\n  --from 7d \\\n  --limit 20\n```\n\nExtract:\n- Error messages and stack traces (`@error.message`, `@error.stack`)\n- Failing branches (`@git.branch`) — branch-specific vs. widespread\n- Frequency pattern — random timing or specific conditions\n- Unique `@ci.pipeline.id` values for blast radius (STEP 3)\n\n### STEP 3 — Check Blast Radius\n\nCount distinct pipelines impacted using pipeline IDs from STEP 2:\n\n```bash\npup cicd events aggregate \\\n  --query \"@ci.status:error @ci.pipeline.id:(\u003Cid1> OR \u003Cid2> OR ...) @git.repository.id_v2:\\\"\u003Crepo>\\\"\" \\\n  --compute count \\\n  --group-by \"@ci.pipeline.name\" \\\n  --from 7d\n```\n\nUse the first 10 pipeline IDs from STEP 2 (cap at 10; if more are available, run a second batch and merge results by summing counts per `@ci.pipeline.name` across batches). Report blast radius as: total number of unique pipelines impacted and whether failures are branch-specific or widespread.\n\nNote: a pipeline failure is not necessarily caused solely by this flaky test — treat blast radius as a signal, not a definitive count.\n\n### STEP 4 — Recommend Fix or Quarantine\n\nUse `flaky_category` from STEP 1 and error messages from STEP 2.\n\n**Root cause first:**\n- Read the full error trace from bottom to top — chained errors hide the real cause; the innermost error is the root cause, not the first line.\n- Identify the exact source of nondeterminism (race, ordering, stale state, timing).\n- If the root cause is a CI infrastructure problem (runner unavailable, Docker daemon failure, network outage) → do NOT propose a code fix; classify as `infra` and recommend retry instead.\n- If root cause is uncertain and cannot be confirmed from the stack trace → skip fix, go to quarantine.\n\n**Fix at the correct layer:**\n- Test issue → fix in test or test helper only.\n- Production bug exposed by the test → fix in production code.\n- Shared helper used by multiple tests → fix the helper AND update all call sites; never patch a single test when the root cause is in shared code.\n\n**Forbidden — do not propose these:**\n- Timing hacks: increasing timeouts, adding sleeps, widening time windows, adding retries. A fix that only reduces flake probability without eliminating the root cause is invalid.\n- Masking: relaxing assertions (e.g., exact match → at least 1), dropping validations.\n- Partial fixes: touching one call site when multiple share the root cause.\n\n**Fix patterns by category:**\n\n| Category | Approach |\n|---|---|\n| `timeout` | Identify the slow operation and make it synchronous or deterministic — do NOT simply raise the timeout constant |\n| `concurrency` | Add deterministic synchronization (barriers, channels, locks); remove shared mutable state between tests |\n| `network` | Mock or stub network calls at the boundary; if the test requires a real connection, isolate it with a test server |\n| `time` | Inject a controllable clock; replace wall-clock assertions with relative or event-driven checks |\n| `order_dependency` | Isolate test state with setup\u002Fteardown; eliminate dependencies on execution order or global state |\n| `environment_dependency` | Mock env variables and external config; use test-local fixtures, not shared directories or singletons |\n| `resource_leak` | Ensure every resource opened in a test is closed in teardown; use cleanup hooks that run even on failure |\n| `randomness` | Fix the random seed for the test run; use deterministic inputs instead of random generation |\n| `asynchronous_wait` | Replace fixed sleeps with condition polling or event\u002Fsignal-driven waits with a hard timeout |\n| `io` | Use temp files\u002Fdirs cleaned up in teardown; mock or stub filesystem interactions |\n| `unknown` | Skip fix attempt → go to quarantine |\n\n**Before proposing code changes, verify all of the following — if any fails, skip fix and recommend quarantine:**\n- The root cause is the innermost error in the trace, not a surface-level symptom.\n- The failure is a code problem, not a CI infrastructure problem.\n- The fix eliminates the root cause (not just reduces flake probability).\n- The fix is at the correct layer (test vs. production vs. shared helper).\n- All call sites of any shared code are updated.\n- No timing hacks or relaxed assertions introduced.\n\n**Decision:**\n- If category is `unknown` OR verification above fails → skip fix, recommend quarantine\n- If category is known AND root cause is confirmed AND fix is valid → propose specific code change\n\n### STEP 5 — Produce Triage Brief and Act\n\n```\nFlaky Test Triage Brief\n=======================\nTest:           \u003Cfully qualified test name>\nService:        \u003C@test.service>\nCategory:       \u003Cflaky_category>\nFailure Rate:   \u003Ctest_stats.failure_rate_pct>%\nDuration Lost:  \u003Cpipeline_stats.total_lost_time_ms>ms\nCodeowners:     \u003Ccodeowners>\nBlast Radius:   \u003CN> pipelines (\u003Cbranch-specific | widespread>) [approximate — other failures in the same pipeline runs may not be related]\n\nEvidence:\n  \u003C1-2 key error message lines from STEP 2>\n\nRecommendation: \u003Cfix | quarantine | escalate>\nConfidence:     \u003Chigh | medium | low>\nAction:         \u003Cspecific next step>\n```\n\n**Decision thresholds:**\n- `failure_rate_pct > 10` OR blast radius > 5 pipelines → **quarantine**\n- `failure_rate_pct ≤ 10` AND known category AND clear fix → **fix**\n- `failure_rate_pct ≤ 10` AND category `unknown` → **escalate** to codeowners with triage brief\n\n**If recommending quarantine**, present and require explicit user approval before writing:\n\n```\nProposed action: quarantine \"\u003Ctest-name>\"\n  id (fingerprint_fqn): \u003Cfingerprint_fqn from STEP 1>\n  Effect: test still runs but failures are suppressed (CI will not be blocked)\n  Reversible: yes — update new_state to active to restore\n\nApprove? (yes\u002Fno)\n```\n\n**If `fingerprint_fqn` was not returned in STEP 1** (test not yet in FTM or query returned no results): do not attempt the write. Surface an error and ask the user to open the Flaky Test Management UI directly to quarantine manually.\n\nOnly after explicit approval and a confirmed `fingerprint_fqn`, write the body file and run:\n```bash\ncat > \u002Ftmp\u002Fflaky-update.json \u003C\u003C'EOF'\n{\n  \"data\": {\n    \"type\": \"UpdateFlakyTestsRequest\",\n    \"attributes\": {\n      \"tests\": [{\"id\": \"\u003Cfingerprint_fqn>\", \"new_state\": \"quarantined\"}]\n    }\n  }\n}\nEOF\npup test-optimization flaky-tests update --file \u002Ftmp\u002Fflaky-update.json\n```\n\nTo undo: repeat with `\"new_state\": \"active\"`.\n",{"data":39,"body":46},{"name":4,"description":6,"metadata":40},{"version":41,"author":42,"repository":43,"tags":44,"alwaysApply":45},"1.0.0","datadog-labs","https:\u002F\u002Fgithub.com\u002Fdatadog-labs\u002Fagent-skills","datadog,ci,cicd,flaky,flaky-tests,test-optimization","false",{"type":47,"children":48},"root",[49,58,64,78,82,89,175,178,184,191,196,254,265,375,388,394,427,518,526,662,675,688,715,720,802,808,934,939,993,999,1004,1127,1139,1144,1150,1162,1170,1201,1209,1227,1235,1253,1261,1470,1478,1511,1519,1539,1545,1555,1563,1622,1632,1641,1658,1670,1814,1827],{"type":50,"tag":51,"props":52,"children":54},"element","h1",{"id":53},"triage-flaky-test",[55],{"type":56,"value":57},"text","Triage Flaky Test",{"type":50,"tag":59,"props":60,"children":61},"p",{},[62],{"type":56,"value":63},"One-line summary: Investigate a specific flaky test — get history, failure pattern, and category, then recommend fix, quarantine, or escalate.",{"type":50,"tag":59,"props":65,"children":66},{},[67,69,76],{"type":56,"value":68},"Requires: ",{"type":50,"tag":70,"props":71,"children":73},"code",{"className":72},[],[74],{"type":56,"value":75},"dd-pup",{"type":56,"value":77}," skill (pup CLI installed and authenticated).",{"type":50,"tag":79,"props":80,"children":81},"hr",{},[],{"type":50,"tag":83,"props":84,"children":86},"h2",{"id":85},"input",[87],{"type":56,"value":88},"Input",{"type":50,"tag":90,"props":91,"children":92},"table",{},[93,112],{"type":50,"tag":94,"props":95,"children":96},"thead",{},[97],{"type":50,"tag":98,"props":99,"children":100},"tr",{},[101,107],{"type":50,"tag":102,"props":103,"children":104},"th",{},[105],{"type":56,"value":106},"Parameter",{"type":50,"tag":102,"props":108,"children":109},{},[110],{"type":56,"value":111},"Description",{"type":50,"tag":113,"props":114,"children":115},"tbody",{},[116,146],{"type":50,"tag":98,"props":117,"children":118},{},[119,125],{"type":50,"tag":120,"props":121,"children":122},"td",{},[123],{"type":56,"value":124},"Test name",{"type":50,"tag":120,"props":126,"children":127},{},[128,130,136,138,144],{"type":56,"value":129},"Fully qualified test name (e.g. ",{"type":50,"tag":70,"props":131,"children":133},{"className":132},[],[134],{"type":56,"value":135},"TestMyFunc",{"type":56,"value":137}," or ",{"type":50,"tag":70,"props":139,"children":141},{"className":140},[],[142],{"type":56,"value":143},"com.example.MyTest",{"type":56,"value":145},")",{"type":50,"tag":98,"props":147,"children":148},{},[149,154],{"type":50,"tag":120,"props":150,"children":151},{},[152],{"type":56,"value":153},"Repository",{"type":50,"tag":120,"props":155,"children":156},{},[157,159,165,167,173],{"type":56,"value":158},"Lowercase, no-schema URL (e.g. ",{"type":50,"tag":70,"props":160,"children":162},{"className":161},[],[163],{"type":56,"value":164},"github.com\u002Forg\u002Frepo",{"type":56,"value":166},"). Derive from ",{"type":50,"tag":70,"props":168,"children":170},{"className":169},[],[171],{"type":56,"value":172},"git remote get-url origin",{"type":56,"value":174}," if not provided.",{"type":50,"tag":79,"props":176,"children":177},{},[],{"type":50,"tag":83,"props":179,"children":181},{"id":180},"workflow",[182],{"type":56,"value":183},"Workflow",{"type":50,"tag":185,"props":186,"children":188},"h3",{"id":187},"step-0-parse-input",[189],{"type":56,"value":190},"STEP 0 — Parse Input",{"type":50,"tag":59,"props":192,"children":193},{},[194],{"type":56,"value":195},"Derive repository ID from git if not provided:",{"type":50,"tag":197,"props":198,"children":203},"pre",{"className":199,"code":200,"language":201,"meta":202,"style":202},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","git remote get-url origin\n# Strip protocol and trailing .git, then lowercase the result\n# e.g. https:\u002F\u002Fgithub.com\u002FDataDog\u002Fmy-repo.git → github.com\u002Fdatadog\u002Fmy-repo\n","bash","",[204],{"type":50,"tag":70,"props":205,"children":206},{"__ignoreMap":202},[207,235,245],{"type":50,"tag":208,"props":209,"children":212},"span",{"class":210,"line":211},"line",1,[213,219,225,230],{"type":50,"tag":208,"props":214,"children":216},{"style":215},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[217],{"type":56,"value":218},"git",{"type":50,"tag":208,"props":220,"children":222},{"style":221},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[223],{"type":56,"value":224}," remote",{"type":50,"tag":208,"props":226,"children":227},{"style":221},[228],{"type":56,"value":229}," get-url",{"type":50,"tag":208,"props":231,"children":232},{"style":221},[233],{"type":56,"value":234}," origin\n",{"type":50,"tag":208,"props":236,"children":238},{"class":210,"line":237},2,[239],{"type":50,"tag":208,"props":240,"children":242},{"style":241},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[243],{"type":56,"value":244},"# Strip protocol and trailing .git, then lowercase the result\n",{"type":50,"tag":208,"props":246,"children":248},{"class":210,"line":247},3,[249],{"type":50,"tag":208,"props":250,"children":251},{"style":241},[252],{"type":56,"value":253},"# e.g. https:\u002F\u002Fgithub.com\u002FDataDog\u002Fmy-repo.git → github.com\u002Fdatadog\u002Fmy-repo\n",{"type":50,"tag":59,"props":255,"children":256},{},[257,263],{"type":50,"tag":258,"props":259,"children":260},"strong",{},[261],{"type":56,"value":262},"Validation fallback:",{"type":56,"value":264}," If STEP 1 returns no results, confirm the correct repository by searching without a repo filter:",{"type":50,"tag":197,"props":266,"children":268},{"className":199,"code":267,"language":201,"meta":202,"style":202},"pup cicd tests search \\\n  --query \"@test.name:\\\"\u003Ctest-name>\\\"\" \\\n  --from 30d \\\n  --limit 5\n",[269],{"type":50,"tag":70,"props":270,"children":271},{"__ignoreMap":202},[272,301,343,360],{"type":50,"tag":208,"props":273,"children":274},{"class":210,"line":211},[275,280,285,290,295],{"type":50,"tag":208,"props":276,"children":277},{"style":215},[278],{"type":56,"value":279},"pup",{"type":50,"tag":208,"props":281,"children":282},{"style":221},[283],{"type":56,"value":284}," cicd",{"type":50,"tag":208,"props":286,"children":287},{"style":221},[288],{"type":56,"value":289}," tests",{"type":50,"tag":208,"props":291,"children":292},{"style":221},[293],{"type":56,"value":294}," search",{"type":50,"tag":208,"props":296,"children":298},{"style":297},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[299],{"type":56,"value":300}," \\\n",{"type":50,"tag":208,"props":302,"children":303},{"class":210,"line":237},[304,309,315,320,325,330,334,339],{"type":50,"tag":208,"props":305,"children":306},{"style":221},[307],{"type":56,"value":308},"  --query",{"type":50,"tag":208,"props":310,"children":312},{"style":311},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[313],{"type":56,"value":314}," \"",{"type":50,"tag":208,"props":316,"children":317},{"style":221},[318],{"type":56,"value":319},"@test.name:",{"type":50,"tag":208,"props":321,"children":322},{"style":297},[323],{"type":56,"value":324},"\\\"",{"type":50,"tag":208,"props":326,"children":327},{"style":221},[328],{"type":56,"value":329},"\u003Ctest-name>",{"type":50,"tag":208,"props":331,"children":332},{"style":297},[333],{"type":56,"value":324},{"type":50,"tag":208,"props":335,"children":336},{"style":311},[337],{"type":56,"value":338},"\"",{"type":50,"tag":208,"props":340,"children":341},{"style":297},[342],{"type":56,"value":300},{"type":50,"tag":208,"props":344,"children":345},{"class":210,"line":247},[346,351,356],{"type":50,"tag":208,"props":347,"children":348},{"style":221},[349],{"type":56,"value":350},"  --from",{"type":50,"tag":208,"props":352,"children":353},{"style":221},[354],{"type":56,"value":355}," 30d",{"type":50,"tag":208,"props":357,"children":358},{"style":297},[359],{"type":56,"value":300},{"type":50,"tag":208,"props":361,"children":363},{"class":210,"line":362},4,[364,369],{"type":50,"tag":208,"props":365,"children":366},{"style":221},[367],{"type":56,"value":368},"  --limit",{"type":50,"tag":208,"props":370,"children":372},{"style":371},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[373],{"type":56,"value":374}," 5\n",{"type":50,"tag":59,"props":376,"children":377},{},[378,380,386],{"type":56,"value":379},"Extract ",{"type":50,"tag":70,"props":381,"children":383},{"className":382},[],[384],{"type":56,"value":385},"@git.repository.id_v2",{"type":56,"value":387}," from results and retry STEP 1 with the confirmed value.",{"type":50,"tag":185,"props":389,"children":391},{"id":390},"step-1-get-flaky-test-details",[392],{"type":56,"value":393},"STEP 1 — Get Flaky Test Details",{"type":50,"tag":59,"props":395,"children":396},{},[397,410,412,417,419,425],{"type":50,"tag":258,"props":398,"children":399},{},[400,402,408],{"type":56,"value":401},"Preferred — use ",{"type":50,"tag":70,"props":403,"children":405},{"className":404},[],[406],{"type":56,"value":407},"fingerprint_fqn",{"type":56,"value":409}," if known",{"type":56,"value":411}," (",{"type":50,"tag":70,"props":413,"children":415},{"className":414},[],[416],{"type":56,"value":407},{"type":56,"value":418}," is a valid CI Visibility search facet, distinct from ",{"type":50,"tag":70,"props":420,"children":422},{"className":421},[],[423],{"type":56,"value":424},"flaky_state",{"type":56,"value":426},"):",{"type":50,"tag":197,"props":428,"children":430},{"className":199,"code":429,"language":201,"meta":202,"style":202},"pup cicd flaky-tests search \\\n  --query \"fingerprint_fqn:\u003Cfqn>\" \\\n  --sort=\"-last_flaked\" \\\n  --limit 5\n",[431],{"type":50,"tag":70,"props":432,"children":433},{"__ignoreMap":202},[434,458,482,507],{"type":50,"tag":208,"props":435,"children":436},{"class":210,"line":211},[437,441,445,450,454],{"type":50,"tag":208,"props":438,"children":439},{"style":215},[440],{"type":56,"value":279},{"type":50,"tag":208,"props":442,"children":443},{"style":221},[444],{"type":56,"value":284},{"type":50,"tag":208,"props":446,"children":447},{"style":221},[448],{"type":56,"value":449}," flaky-tests",{"type":50,"tag":208,"props":451,"children":452},{"style":221},[453],{"type":56,"value":294},{"type":50,"tag":208,"props":455,"children":456},{"style":297},[457],{"type":56,"value":300},{"type":50,"tag":208,"props":459,"children":460},{"class":210,"line":237},[461,465,469,474,478],{"type":50,"tag":208,"props":462,"children":463},{"style":221},[464],{"type":56,"value":308},{"type":50,"tag":208,"props":466,"children":467},{"style":311},[468],{"type":56,"value":314},{"type":50,"tag":208,"props":470,"children":471},{"style":221},[472],{"type":56,"value":473},"fingerprint_fqn:\u003Cfqn>",{"type":50,"tag":208,"props":475,"children":476},{"style":311},[477],{"type":56,"value":338},{"type":50,"tag":208,"props":479,"children":480},{"style":297},[481],{"type":56,"value":300},{"type":50,"tag":208,"props":483,"children":484},{"class":210,"line":247},[485,490,494,499,503],{"type":50,"tag":208,"props":486,"children":487},{"style":221},[488],{"type":56,"value":489},"  --sort=",{"type":50,"tag":208,"props":491,"children":492},{"style":311},[493],{"type":56,"value":338},{"type":50,"tag":208,"props":495,"children":496},{"style":221},[497],{"type":56,"value":498},"-last_flaked",{"type":50,"tag":208,"props":500,"children":501},{"style":311},[502],{"type":56,"value":338},{"type":50,"tag":208,"props":504,"children":505},{"style":297},[506],{"type":56,"value":300},{"type":50,"tag":208,"props":508,"children":509},{"class":210,"line":362},[510,514],{"type":50,"tag":208,"props":511,"children":512},{"style":221},[513],{"type":56,"value":368},{"type":50,"tag":208,"props":515,"children":516},{"style":371},[517],{"type":56,"value":374},{"type":50,"tag":59,"props":519,"children":520},{},[521],{"type":50,"tag":258,"props":522,"children":523},{},[524],{"type":56,"value":525},"Fallback — use name + suite + repo:",{"type":50,"tag":197,"props":527,"children":529},{"className":199,"code":528,"language":201,"meta":202,"style":202},"pup cicd flaky-tests search \\\n  --query \"@test.name:\\\"\u003Ctest-name>\\\" @test.suite:\\\"\u003Csuite>\\\" @git.repository.id_v2:\\\"\u003Crepo>\\\"\" \\\n  --sort=\"-last_flaked\" \\\n  --limit 10\n",[530],{"type":50,"tag":70,"props":531,"children":532},{"__ignoreMap":202},[533,556,627,650],{"type":50,"tag":208,"props":534,"children":535},{"class":210,"line":211},[536,540,544,548,552],{"type":50,"tag":208,"props":537,"children":538},{"style":215},[539],{"type":56,"value":279},{"type":50,"tag":208,"props":541,"children":542},{"style":221},[543],{"type":56,"value":284},{"type":50,"tag":208,"props":545,"children":546},{"style":221},[547],{"type":56,"value":449},{"type":50,"tag":208,"props":549,"children":550},{"style":221},[551],{"type":56,"value":294},{"type":50,"tag":208,"props":553,"children":554},{"style":297},[555],{"type":56,"value":300},{"type":50,"tag":208,"props":557,"children":558},{"class":210,"line":237},[559,563,567,571,575,579,583,588,592,597,601,606,610,615,619,623],{"type":50,"tag":208,"props":560,"children":561},{"style":221},[562],{"type":56,"value":308},{"type":50,"tag":208,"props":564,"children":565},{"style":311},[566],{"type":56,"value":314},{"type":50,"tag":208,"props":568,"children":569},{"style":221},[570],{"type":56,"value":319},{"type":50,"tag":208,"props":572,"children":573},{"style":297},[574],{"type":56,"value":324},{"type":50,"tag":208,"props":576,"children":577},{"style":221},[578],{"type":56,"value":329},{"type":50,"tag":208,"props":580,"children":581},{"style":297},[582],{"type":56,"value":324},{"type":50,"tag":208,"props":584,"children":585},{"style":221},[586],{"type":56,"value":587}," @test.suite:",{"type":50,"tag":208,"props":589,"children":590},{"style":297},[591],{"type":56,"value":324},{"type":50,"tag":208,"props":593,"children":594},{"style":221},[595],{"type":56,"value":596},"\u003Csuite>",{"type":50,"tag":208,"props":598,"children":599},{"style":297},[600],{"type":56,"value":324},{"type":50,"tag":208,"props":602,"children":603},{"style":221},[604],{"type":56,"value":605}," @git.repository.id_v2:",{"type":50,"tag":208,"props":607,"children":608},{"style":297},[609],{"type":56,"value":324},{"type":50,"tag":208,"props":611,"children":612},{"style":221},[613],{"type":56,"value":614},"\u003Crepo>",{"type":50,"tag":208,"props":616,"children":617},{"style":297},[618],{"type":56,"value":324},{"type":50,"tag":208,"props":620,"children":621},{"style":311},[622],{"type":56,"value":338},{"type":50,"tag":208,"props":624,"children":625},{"style":297},[626],{"type":56,"value":300},{"type":50,"tag":208,"props":628,"children":629},{"class":210,"line":247},[630,634,638,642,646],{"type":50,"tag":208,"props":631,"children":632},{"style":221},[633],{"type":56,"value":489},{"type":50,"tag":208,"props":635,"children":636},{"style":311},[637],{"type":56,"value":338},{"type":50,"tag":208,"props":639,"children":640},{"style":221},[641],{"type":56,"value":498},{"type":50,"tag":208,"props":643,"children":644},{"style":311},[645],{"type":56,"value":338},{"type":50,"tag":208,"props":647,"children":648},{"style":297},[649],{"type":56,"value":300},{"type":50,"tag":208,"props":651,"children":652},{"class":210,"line":362},[653,657],{"type":50,"tag":208,"props":654,"children":655},{"style":221},[656],{"type":56,"value":368},{"type":50,"tag":208,"props":658,"children":659},{"style":371},[660],{"type":56,"value":661}," 10\n",{"type":50,"tag":59,"props":663,"children":664},{},[665,667,673],{"type":56,"value":666},"Omit ",{"type":50,"tag":70,"props":668,"children":670},{"className":669},[],[671],{"type":56,"value":672},"@test.suite",{"type":56,"value":674}," if unknown; if the same test name appears in multiple suites, pick the entry whose suite matches the failing test.",{"type":50,"tag":59,"props":676,"children":677},{},[678,680,686],{"type":56,"value":679},"Do not filter by ",{"type":50,"tag":70,"props":681,"children":683},{"className":682},[],[684],{"type":56,"value":685},"flaky_test_state",{"type":56,"value":687}," — return the test regardless of state.",{"type":50,"tag":59,"props":689,"children":690},{},[691,693,698,700,705,707,713],{"type":56,"value":692},"Note: the query filter facet is ",{"type":50,"tag":70,"props":694,"children":696},{"className":695},[],[697],{"type":56,"value":685},{"type":56,"value":699},"; the returned response attribute is ",{"type":50,"tag":70,"props":701,"children":703},{"className":702},[],[704],{"type":56,"value":424},{"type":56,"value":706}," — these are different names for the same concept; do not use ",{"type":50,"tag":70,"props":708,"children":710},{"className":709},[],[711],{"type":56,"value":712},"flaky_state:active",{"type":56,"value":714}," as a query filter.",{"type":50,"tag":59,"props":716,"children":717},{},[718],{"type":56,"value":719},"Extract from results:",{"type":50,"tag":721,"props":722,"children":723},"ul",{},[724,748,758,769,780,791],{"type":50,"tag":725,"props":726,"children":727},"li",{},[728,733,735,741,743],{"type":50,"tag":70,"props":729,"children":731},{"className":730},[],[732],{"type":56,"value":407},{"type":56,"value":734}," — unique test identifier; used as the ",{"type":50,"tag":70,"props":736,"children":738},{"className":737},[],[739],{"type":56,"value":740},"id",{"type":56,"value":742}," in STEP 5 write call. ",{"type":50,"tag":258,"props":744,"children":745},{},[746],{"type":56,"value":747},"If absent, do not proceed to quarantine — see STEP 5.",{"type":50,"tag":725,"props":749,"children":750},{},[751,756],{"type":50,"tag":70,"props":752,"children":754},{"className":753},[],[755],{"type":56,"value":424},{"type":56,"value":757}," — current state (active \u002F quarantined \u002F disabled \u002F fixed)",{"type":50,"tag":725,"props":759,"children":760},{},[761,767],{"type":50,"tag":70,"props":762,"children":764},{"className":763},[],[765],{"type":56,"value":766},"test_stats.failure_rate_pct",{"type":56,"value":768}," — percentage of runs that fail",{"type":50,"tag":725,"props":770,"children":771},{},[772,778],{"type":50,"tag":70,"props":773,"children":775},{"className":774},[],[776],{"type":56,"value":777},"flaky_category",{"type":56,"value":779}," — root cause category",{"type":50,"tag":725,"props":781,"children":782},{},[783,789],{"type":50,"tag":70,"props":784,"children":786},{"className":785},[],[787],{"type":56,"value":788},"codeowners",{"type":56,"value":790}," — owning team",{"type":50,"tag":725,"props":792,"children":793},{},[794,800],{"type":50,"tag":70,"props":795,"children":797},{"className":796},[],[798],{"type":56,"value":799},"pipeline_stats.total_lost_time_ms",{"type":56,"value":801}," — total CI time lost",{"type":50,"tag":185,"props":803,"children":805},{"id":804},"step-2-get-recent-failure-history",[806],{"type":56,"value":807},"STEP 2 — Get Recent Failure History",{"type":50,"tag":197,"props":809,"children":811},{"className":199,"code":810,"language":201,"meta":202,"style":202},"pup cicd tests search \\\n  --query \"@test.name:\\\"\u003Ctest-name>\\\" @test.suite:\\\"\u003Csuite>\\\" @test.status:fail @git.repository.id_v2:\\\"\u003Crepo>\\\"\" \\\n  --from 7d \\\n  --limit 20\n",[812],{"type":50,"tag":70,"props":813,"children":814},{"__ignoreMap":202},[815,838,906,922],{"type":50,"tag":208,"props":816,"children":817},{"class":210,"line":211},[818,822,826,830,834],{"type":50,"tag":208,"props":819,"children":820},{"style":215},[821],{"type":56,"value":279},{"type":50,"tag":208,"props":823,"children":824},{"style":221},[825],{"type":56,"value":284},{"type":50,"tag":208,"props":827,"children":828},{"style":221},[829],{"type":56,"value":289},{"type":50,"tag":208,"props":831,"children":832},{"style":221},[833],{"type":56,"value":294},{"type":50,"tag":208,"props":835,"children":836},{"style":297},[837],{"type":56,"value":300},{"type":50,"tag":208,"props":839,"children":840},{"class":210,"line":237},[841,845,849,853,857,861,865,869,873,877,881,886,890,894,898,902],{"type":50,"tag":208,"props":842,"children":843},{"style":221},[844],{"type":56,"value":308},{"type":50,"tag":208,"props":846,"children":847},{"style":311},[848],{"type":56,"value":314},{"type":50,"tag":208,"props":850,"children":851},{"style":221},[852],{"type":56,"value":319},{"type":50,"tag":208,"props":854,"children":855},{"style":297},[856],{"type":56,"value":324},{"type":50,"tag":208,"props":858,"children":859},{"style":221},[860],{"type":56,"value":329},{"type":50,"tag":208,"props":862,"children":863},{"style":297},[864],{"type":56,"value":324},{"type":50,"tag":208,"props":866,"children":867},{"style":221},[868],{"type":56,"value":587},{"type":50,"tag":208,"props":870,"children":871},{"style":297},[872],{"type":56,"value":324},{"type":50,"tag":208,"props":874,"children":875},{"style":221},[876],{"type":56,"value":596},{"type":50,"tag":208,"props":878,"children":879},{"style":297},[880],{"type":56,"value":324},{"type":50,"tag":208,"props":882,"children":883},{"style":221},[884],{"type":56,"value":885}," @test.status:fail @git.repository.id_v2:",{"type":50,"tag":208,"props":887,"children":888},{"style":297},[889],{"type":56,"value":324},{"type":50,"tag":208,"props":891,"children":892},{"style":221},[893],{"type":56,"value":614},{"type":50,"tag":208,"props":895,"children":896},{"style":297},[897],{"type":56,"value":324},{"type":50,"tag":208,"props":899,"children":900},{"style":311},[901],{"type":56,"value":338},{"type":50,"tag":208,"props":903,"children":904},{"style":297},[905],{"type":56,"value":300},{"type":50,"tag":208,"props":907,"children":908},{"class":210,"line":247},[909,913,918],{"type":50,"tag":208,"props":910,"children":911},{"style":221},[912],{"type":56,"value":350},{"type":50,"tag":208,"props":914,"children":915},{"style":221},[916],{"type":56,"value":917}," 7d",{"type":50,"tag":208,"props":919,"children":920},{"style":297},[921],{"type":56,"value":300},{"type":50,"tag":208,"props":923,"children":924},{"class":210,"line":362},[925,929],{"type":50,"tag":208,"props":926,"children":927},{"style":221},[928],{"type":56,"value":368},{"type":50,"tag":208,"props":930,"children":931},{"style":371},[932],{"type":56,"value":933}," 20\n",{"type":50,"tag":59,"props":935,"children":936},{},[937],{"type":56,"value":938},"Extract:",{"type":50,"tag":721,"props":940,"children":941},{},[942,962,975,980],{"type":50,"tag":725,"props":943,"children":944},{},[945,947,953,955,961],{"type":56,"value":946},"Error messages and stack traces (",{"type":50,"tag":70,"props":948,"children":950},{"className":949},[],[951],{"type":56,"value":952},"@error.message",{"type":56,"value":954},", ",{"type":50,"tag":70,"props":956,"children":958},{"className":957},[],[959],{"type":56,"value":960},"@error.stack",{"type":56,"value":145},{"type":50,"tag":725,"props":963,"children":964},{},[965,967,973],{"type":56,"value":966},"Failing branches (",{"type":50,"tag":70,"props":968,"children":970},{"className":969},[],[971],{"type":56,"value":972},"@git.branch",{"type":56,"value":974},") — branch-specific vs. widespread",{"type":50,"tag":725,"props":976,"children":977},{},[978],{"type":56,"value":979},"Frequency pattern — random timing or specific conditions",{"type":50,"tag":725,"props":981,"children":982},{},[983,985,991],{"type":56,"value":984},"Unique ",{"type":50,"tag":70,"props":986,"children":988},{"className":987},[],[989],{"type":56,"value":990},"@ci.pipeline.id",{"type":56,"value":992}," values for blast radius (STEP 3)",{"type":50,"tag":185,"props":994,"children":996},{"id":995},"step-3-check-blast-radius",[997],{"type":56,"value":998},"STEP 3 — Check Blast Radius",{"type":50,"tag":59,"props":1000,"children":1001},{},[1002],{"type":56,"value":1003},"Count distinct pipelines impacted using pipeline IDs from STEP 2:",{"type":50,"tag":197,"props":1005,"children":1007},{"className":199,"code":1006,"language":201,"meta":202,"style":202},"pup cicd events aggregate \\\n  --query \"@ci.status:error @ci.pipeline.id:(\u003Cid1> OR \u003Cid2> OR ...) @git.repository.id_v2:\\\"\u003Crepo>\\\"\" \\\n  --compute count \\\n  --group-by \"@ci.pipeline.name\" \\\n  --from 7d\n",[1008],{"type":50,"tag":70,"props":1009,"children":1010},{"__ignoreMap":202},[1011,1036,1072,1089,1114],{"type":50,"tag":208,"props":1012,"children":1013},{"class":210,"line":211},[1014,1018,1022,1027,1032],{"type":50,"tag":208,"props":1015,"children":1016},{"style":215},[1017],{"type":56,"value":279},{"type":50,"tag":208,"props":1019,"children":1020},{"style":221},[1021],{"type":56,"value":284},{"type":50,"tag":208,"props":1023,"children":1024},{"style":221},[1025],{"type":56,"value":1026}," events",{"type":50,"tag":208,"props":1028,"children":1029},{"style":221},[1030],{"type":56,"value":1031}," aggregate",{"type":50,"tag":208,"props":1033,"children":1034},{"style":297},[1035],{"type":56,"value":300},{"type":50,"tag":208,"props":1037,"children":1038},{"class":210,"line":237},[1039,1043,1047,1052,1056,1060,1064,1068],{"type":50,"tag":208,"props":1040,"children":1041},{"style":221},[1042],{"type":56,"value":308},{"type":50,"tag":208,"props":1044,"children":1045},{"style":311},[1046],{"type":56,"value":314},{"type":50,"tag":208,"props":1048,"children":1049},{"style":221},[1050],{"type":56,"value":1051},"@ci.status:error @ci.pipeline.id:(\u003Cid1> OR \u003Cid2> OR ...) @git.repository.id_v2:",{"type":50,"tag":208,"props":1053,"children":1054},{"style":297},[1055],{"type":56,"value":324},{"type":50,"tag":208,"props":1057,"children":1058},{"style":221},[1059],{"type":56,"value":614},{"type":50,"tag":208,"props":1061,"children":1062},{"style":297},[1063],{"type":56,"value":324},{"type":50,"tag":208,"props":1065,"children":1066},{"style":311},[1067],{"type":56,"value":338},{"type":50,"tag":208,"props":1069,"children":1070},{"style":297},[1071],{"type":56,"value":300},{"type":50,"tag":208,"props":1073,"children":1074},{"class":210,"line":247},[1075,1080,1085],{"type":50,"tag":208,"props":1076,"children":1077},{"style":221},[1078],{"type":56,"value":1079},"  --compute",{"type":50,"tag":208,"props":1081,"children":1082},{"style":221},[1083],{"type":56,"value":1084}," count",{"type":50,"tag":208,"props":1086,"children":1087},{"style":297},[1088],{"type":56,"value":300},{"type":50,"tag":208,"props":1090,"children":1091},{"class":210,"line":362},[1092,1097,1101,1106,1110],{"type":50,"tag":208,"props":1093,"children":1094},{"style":221},[1095],{"type":56,"value":1096},"  --group-by",{"type":50,"tag":208,"props":1098,"children":1099},{"style":311},[1100],{"type":56,"value":314},{"type":50,"tag":208,"props":1102,"children":1103},{"style":221},[1104],{"type":56,"value":1105},"@ci.pipeline.name",{"type":50,"tag":208,"props":1107,"children":1108},{"style":311},[1109],{"type":56,"value":338},{"type":50,"tag":208,"props":1111,"children":1112},{"style":297},[1113],{"type":56,"value":300},{"type":50,"tag":208,"props":1115,"children":1117},{"class":210,"line":1116},5,[1118,1122],{"type":50,"tag":208,"props":1119,"children":1120},{"style":221},[1121],{"type":56,"value":350},{"type":50,"tag":208,"props":1123,"children":1124},{"style":221},[1125],{"type":56,"value":1126}," 7d\n",{"type":50,"tag":59,"props":1128,"children":1129},{},[1130,1132,1137],{"type":56,"value":1131},"Use the first 10 pipeline IDs from STEP 2 (cap at 10; if more are available, run a second batch and merge results by summing counts per ",{"type":50,"tag":70,"props":1133,"children":1135},{"className":1134},[],[1136],{"type":56,"value":1105},{"type":56,"value":1138}," across batches). Report blast radius as: total number of unique pipelines impacted and whether failures are branch-specific or widespread.",{"type":50,"tag":59,"props":1140,"children":1141},{},[1142],{"type":56,"value":1143},"Note: a pipeline failure is not necessarily caused solely by this flaky test — treat blast radius as a signal, not a definitive count.",{"type":50,"tag":185,"props":1145,"children":1147},{"id":1146},"step-4-recommend-fix-or-quarantine",[1148],{"type":56,"value":1149},"STEP 4 — Recommend Fix or Quarantine",{"type":50,"tag":59,"props":1151,"children":1152},{},[1153,1155,1160],{"type":56,"value":1154},"Use ",{"type":50,"tag":70,"props":1156,"children":1158},{"className":1157},[],[1159],{"type":56,"value":777},{"type":56,"value":1161}," from STEP 1 and error messages from STEP 2.",{"type":50,"tag":59,"props":1163,"children":1164},{},[1165],{"type":50,"tag":258,"props":1166,"children":1167},{},[1168],{"type":56,"value":1169},"Root cause first:",{"type":50,"tag":721,"props":1171,"children":1172},{},[1173,1178,1183,1196],{"type":50,"tag":725,"props":1174,"children":1175},{},[1176],{"type":56,"value":1177},"Read the full error trace from bottom to top — chained errors hide the real cause; the innermost error is the root cause, not the first line.",{"type":50,"tag":725,"props":1179,"children":1180},{},[1181],{"type":56,"value":1182},"Identify the exact source of nondeterminism (race, ordering, stale state, timing).",{"type":50,"tag":725,"props":1184,"children":1185},{},[1186,1188,1194],{"type":56,"value":1187},"If the root cause is a CI infrastructure problem (runner unavailable, Docker daemon failure, network outage) → do NOT propose a code fix; classify as ",{"type":50,"tag":70,"props":1189,"children":1191},{"className":1190},[],[1192],{"type":56,"value":1193},"infra",{"type":56,"value":1195}," and recommend retry instead.",{"type":50,"tag":725,"props":1197,"children":1198},{},[1199],{"type":56,"value":1200},"If root cause is uncertain and cannot be confirmed from the stack trace → skip fix, go to quarantine.",{"type":50,"tag":59,"props":1202,"children":1203},{},[1204],{"type":50,"tag":258,"props":1205,"children":1206},{},[1207],{"type":56,"value":1208},"Fix at the correct layer:",{"type":50,"tag":721,"props":1210,"children":1211},{},[1212,1217,1222],{"type":50,"tag":725,"props":1213,"children":1214},{},[1215],{"type":56,"value":1216},"Test issue → fix in test or test helper only.",{"type":50,"tag":725,"props":1218,"children":1219},{},[1220],{"type":56,"value":1221},"Production bug exposed by the test → fix in production code.",{"type":50,"tag":725,"props":1223,"children":1224},{},[1225],{"type":56,"value":1226},"Shared helper used by multiple tests → fix the helper AND update all call sites; never patch a single test when the root cause is in shared code.",{"type":50,"tag":59,"props":1228,"children":1229},{},[1230],{"type":50,"tag":258,"props":1231,"children":1232},{},[1233],{"type":56,"value":1234},"Forbidden — do not propose these:",{"type":50,"tag":721,"props":1236,"children":1237},{},[1238,1243,1248],{"type":50,"tag":725,"props":1239,"children":1240},{},[1241],{"type":56,"value":1242},"Timing hacks: increasing timeouts, adding sleeps, widening time windows, adding retries. A fix that only reduces flake probability without eliminating the root cause is invalid.",{"type":50,"tag":725,"props":1244,"children":1245},{},[1246],{"type":56,"value":1247},"Masking: relaxing assertions (e.g., exact match → at least 1), dropping validations.",{"type":50,"tag":725,"props":1249,"children":1250},{},[1251],{"type":56,"value":1252},"Partial fixes: touching one call site when multiple share the root cause.",{"type":50,"tag":59,"props":1254,"children":1255},{},[1256],{"type":50,"tag":258,"props":1257,"children":1258},{},[1259],{"type":56,"value":1260},"Fix patterns by category:",{"type":50,"tag":90,"props":1262,"children":1263},{},[1264,1280],{"type":50,"tag":94,"props":1265,"children":1266},{},[1267],{"type":50,"tag":98,"props":1268,"children":1269},{},[1270,1275],{"type":50,"tag":102,"props":1271,"children":1272},{},[1273],{"type":56,"value":1274},"Category",{"type":50,"tag":102,"props":1276,"children":1277},{},[1278],{"type":56,"value":1279},"Approach",{"type":50,"tag":113,"props":1281,"children":1282},{},[1283,1300,1317,1334,1351,1368,1385,1402,1419,1436,1453],{"type":50,"tag":98,"props":1284,"children":1285},{},[1286,1295],{"type":50,"tag":120,"props":1287,"children":1288},{},[1289],{"type":50,"tag":70,"props":1290,"children":1292},{"className":1291},[],[1293],{"type":56,"value":1294},"timeout",{"type":50,"tag":120,"props":1296,"children":1297},{},[1298],{"type":56,"value":1299},"Identify the slow operation and make it synchronous or deterministic — do NOT simply raise the timeout constant",{"type":50,"tag":98,"props":1301,"children":1302},{},[1303,1312],{"type":50,"tag":120,"props":1304,"children":1305},{},[1306],{"type":50,"tag":70,"props":1307,"children":1309},{"className":1308},[],[1310],{"type":56,"value":1311},"concurrency",{"type":50,"tag":120,"props":1313,"children":1314},{},[1315],{"type":56,"value":1316},"Add deterministic synchronization (barriers, channels, locks); remove shared mutable state between tests",{"type":50,"tag":98,"props":1318,"children":1319},{},[1320,1329],{"type":50,"tag":120,"props":1321,"children":1322},{},[1323],{"type":50,"tag":70,"props":1324,"children":1326},{"className":1325},[],[1327],{"type":56,"value":1328},"network",{"type":50,"tag":120,"props":1330,"children":1331},{},[1332],{"type":56,"value":1333},"Mock or stub network calls at the boundary; if the test requires a real connection, isolate it with a test server",{"type":50,"tag":98,"props":1335,"children":1336},{},[1337,1346],{"type":50,"tag":120,"props":1338,"children":1339},{},[1340],{"type":50,"tag":70,"props":1341,"children":1343},{"className":1342},[],[1344],{"type":56,"value":1345},"time",{"type":50,"tag":120,"props":1347,"children":1348},{},[1349],{"type":56,"value":1350},"Inject a controllable clock; replace wall-clock assertions with relative or event-driven checks",{"type":50,"tag":98,"props":1352,"children":1353},{},[1354,1363],{"type":50,"tag":120,"props":1355,"children":1356},{},[1357],{"type":50,"tag":70,"props":1358,"children":1360},{"className":1359},[],[1361],{"type":56,"value":1362},"order_dependency",{"type":50,"tag":120,"props":1364,"children":1365},{},[1366],{"type":56,"value":1367},"Isolate test state with setup\u002Fteardown; eliminate dependencies on execution order or global state",{"type":50,"tag":98,"props":1369,"children":1370},{},[1371,1380],{"type":50,"tag":120,"props":1372,"children":1373},{},[1374],{"type":50,"tag":70,"props":1375,"children":1377},{"className":1376},[],[1378],{"type":56,"value":1379},"environment_dependency",{"type":50,"tag":120,"props":1381,"children":1382},{},[1383],{"type":56,"value":1384},"Mock env variables and external config; use test-local fixtures, not shared directories or singletons",{"type":50,"tag":98,"props":1386,"children":1387},{},[1388,1397],{"type":50,"tag":120,"props":1389,"children":1390},{},[1391],{"type":50,"tag":70,"props":1392,"children":1394},{"className":1393},[],[1395],{"type":56,"value":1396},"resource_leak",{"type":50,"tag":120,"props":1398,"children":1399},{},[1400],{"type":56,"value":1401},"Ensure every resource opened in a test is closed in teardown; use cleanup hooks that run even on failure",{"type":50,"tag":98,"props":1403,"children":1404},{},[1405,1414],{"type":50,"tag":120,"props":1406,"children":1407},{},[1408],{"type":50,"tag":70,"props":1409,"children":1411},{"className":1410},[],[1412],{"type":56,"value":1413},"randomness",{"type":50,"tag":120,"props":1415,"children":1416},{},[1417],{"type":56,"value":1418},"Fix the random seed for the test run; use deterministic inputs instead of random generation",{"type":50,"tag":98,"props":1420,"children":1421},{},[1422,1431],{"type":50,"tag":120,"props":1423,"children":1424},{},[1425],{"type":50,"tag":70,"props":1426,"children":1428},{"className":1427},[],[1429],{"type":56,"value":1430},"asynchronous_wait",{"type":50,"tag":120,"props":1432,"children":1433},{},[1434],{"type":56,"value":1435},"Replace fixed sleeps with condition polling or event\u002Fsignal-driven waits with a hard timeout",{"type":50,"tag":98,"props":1437,"children":1438},{},[1439,1448],{"type":50,"tag":120,"props":1440,"children":1441},{},[1442],{"type":50,"tag":70,"props":1443,"children":1445},{"className":1444},[],[1446],{"type":56,"value":1447},"io",{"type":50,"tag":120,"props":1449,"children":1450},{},[1451],{"type":56,"value":1452},"Use temp files\u002Fdirs cleaned up in teardown; mock or stub filesystem interactions",{"type":50,"tag":98,"props":1454,"children":1455},{},[1456,1465],{"type":50,"tag":120,"props":1457,"children":1458},{},[1459],{"type":50,"tag":70,"props":1460,"children":1462},{"className":1461},[],[1463],{"type":56,"value":1464},"unknown",{"type":50,"tag":120,"props":1466,"children":1467},{},[1468],{"type":56,"value":1469},"Skip fix attempt → go to quarantine",{"type":50,"tag":59,"props":1471,"children":1472},{},[1473],{"type":50,"tag":258,"props":1474,"children":1475},{},[1476],{"type":56,"value":1477},"Before proposing code changes, verify all of the following — if any fails, skip fix and recommend quarantine:",{"type":50,"tag":721,"props":1479,"children":1480},{},[1481,1486,1491,1496,1501,1506],{"type":50,"tag":725,"props":1482,"children":1483},{},[1484],{"type":56,"value":1485},"The root cause is the innermost error in the trace, not a surface-level symptom.",{"type":50,"tag":725,"props":1487,"children":1488},{},[1489],{"type":56,"value":1490},"The failure is a code problem, not a CI infrastructure problem.",{"type":50,"tag":725,"props":1492,"children":1493},{},[1494],{"type":56,"value":1495},"The fix eliminates the root cause (not just reduces flake probability).",{"type":50,"tag":725,"props":1497,"children":1498},{},[1499],{"type":56,"value":1500},"The fix is at the correct layer (test vs. production vs. shared helper).",{"type":50,"tag":725,"props":1502,"children":1503},{},[1504],{"type":56,"value":1505},"All call sites of any shared code are updated.",{"type":50,"tag":725,"props":1507,"children":1508},{},[1509],{"type":56,"value":1510},"No timing hacks or relaxed assertions introduced.",{"type":50,"tag":59,"props":1512,"children":1513},{},[1514],{"type":50,"tag":258,"props":1515,"children":1516},{},[1517],{"type":56,"value":1518},"Decision:",{"type":50,"tag":721,"props":1520,"children":1521},{},[1522,1534],{"type":50,"tag":725,"props":1523,"children":1524},{},[1525,1527,1532],{"type":56,"value":1526},"If category is ",{"type":50,"tag":70,"props":1528,"children":1530},{"className":1529},[],[1531],{"type":56,"value":1464},{"type":56,"value":1533}," OR verification above fails → skip fix, recommend quarantine",{"type":50,"tag":725,"props":1535,"children":1536},{},[1537],{"type":56,"value":1538},"If category is known AND root cause is confirmed AND fix is valid → propose specific code change",{"type":50,"tag":185,"props":1540,"children":1542},{"id":1541},"step-5-produce-triage-brief-and-act",[1543],{"type":56,"value":1544},"STEP 5 — Produce Triage Brief and Act",{"type":50,"tag":197,"props":1546,"children":1550},{"className":1547,"code":1549,"language":56},[1548],"language-text","Flaky Test Triage Brief\n=======================\nTest:           \u003Cfully qualified test name>\nService:        \u003C@test.service>\nCategory:       \u003Cflaky_category>\nFailure Rate:   \u003Ctest_stats.failure_rate_pct>%\nDuration Lost:  \u003Cpipeline_stats.total_lost_time_ms>ms\nCodeowners:     \u003Ccodeowners>\nBlast Radius:   \u003CN> pipelines (\u003Cbranch-specific | widespread>) [approximate — other failures in the same pipeline runs may not be related]\n\nEvidence:\n  \u003C1-2 key error message lines from STEP 2>\n\nRecommendation: \u003Cfix | quarantine | escalate>\nConfidence:     \u003Chigh | medium | low>\nAction:         \u003Cspecific next step>\n",[1551],{"type":50,"tag":70,"props":1552,"children":1553},{"__ignoreMap":202},[1554],{"type":56,"value":1549},{"type":50,"tag":59,"props":1556,"children":1557},{},[1558],{"type":50,"tag":258,"props":1559,"children":1560},{},[1561],{"type":56,"value":1562},"Decision thresholds:",{"type":50,"tag":721,"props":1564,"children":1565},{},[1566,1582,1598],{"type":50,"tag":725,"props":1567,"children":1568},{},[1569,1575,1577],{"type":50,"tag":70,"props":1570,"children":1572},{"className":1571},[],[1573],{"type":56,"value":1574},"failure_rate_pct > 10",{"type":56,"value":1576}," OR blast radius > 5 pipelines → ",{"type":50,"tag":258,"props":1578,"children":1579},{},[1580],{"type":56,"value":1581},"quarantine",{"type":50,"tag":725,"props":1583,"children":1584},{},[1585,1591,1593],{"type":50,"tag":70,"props":1586,"children":1588},{"className":1587},[],[1589],{"type":56,"value":1590},"failure_rate_pct ≤ 10",{"type":56,"value":1592}," AND known category AND clear fix → ",{"type":50,"tag":258,"props":1594,"children":1595},{},[1596],{"type":56,"value":1597},"fix",{"type":50,"tag":725,"props":1599,"children":1600},{},[1601,1606,1608,1613,1615,1620],{"type":50,"tag":70,"props":1602,"children":1604},{"className":1603},[],[1605],{"type":56,"value":1590},{"type":56,"value":1607}," AND category ",{"type":50,"tag":70,"props":1609,"children":1611},{"className":1610},[],[1612],{"type":56,"value":1464},{"type":56,"value":1614}," → ",{"type":50,"tag":258,"props":1616,"children":1617},{},[1618],{"type":56,"value":1619},"escalate",{"type":56,"value":1621}," to codeowners with triage brief",{"type":50,"tag":59,"props":1623,"children":1624},{},[1625,1630],{"type":50,"tag":258,"props":1626,"children":1627},{},[1628],{"type":56,"value":1629},"If recommending quarantine",{"type":56,"value":1631},", present and require explicit user approval before writing:",{"type":50,"tag":197,"props":1633,"children":1636},{"className":1634,"code":1635,"language":56},[1548],"Proposed action: quarantine \"\u003Ctest-name>\"\n  id (fingerprint_fqn): \u003Cfingerprint_fqn from STEP 1>\n  Effect: test still runs but failures are suppressed (CI will not be blocked)\n  Reversible: yes — update new_state to active to restore\n\nApprove? (yes\u002Fno)\n",[1637],{"type":50,"tag":70,"props":1638,"children":1639},{"__ignoreMap":202},[1640],{"type":56,"value":1635},{"type":50,"tag":59,"props":1642,"children":1643},{},[1644,1656],{"type":50,"tag":258,"props":1645,"children":1646},{},[1647,1649,1654],{"type":56,"value":1648},"If ",{"type":50,"tag":70,"props":1650,"children":1652},{"className":1651},[],[1653],{"type":56,"value":407},{"type":56,"value":1655}," was not returned in STEP 1",{"type":56,"value":1657}," (test not yet in FTM or query returned no results): do not attempt the write. Surface an error and ask the user to open the Flaky Test Management UI directly to quarantine manually.",{"type":50,"tag":59,"props":1659,"children":1660},{},[1661,1663,1668],{"type":56,"value":1662},"Only after explicit approval and a confirmed ",{"type":50,"tag":70,"props":1664,"children":1666},{"className":1665},[],[1667],{"type":56,"value":407},{"type":56,"value":1669},", write the body file and run:",{"type":50,"tag":197,"props":1671,"children":1673},{"className":199,"code":1672,"language":201,"meta":202,"style":202},"cat > \u002Ftmp\u002Fflaky-update.json \u003C\u003C'EOF'\n{\n  \"data\": {\n    \"type\": \"UpdateFlakyTestsRequest\",\n    \"attributes\": {\n      \"tests\": [{\"id\": \"\u003Cfingerprint_fqn>\", \"new_state\": \"quarantined\"}]\n    }\n  }\n}\nEOF\npup test-optimization flaky-tests update --file \u002Ftmp\u002Fflaky-update.json\n",[1674],{"type":50,"tag":70,"props":1675,"children":1676},{"__ignoreMap":202},[1677,1705,1713,1721,1729,1737,1746,1755,1764,1773,1782],{"type":50,"tag":208,"props":1678,"children":1679},{"class":210,"line":211},[1680,1685,1690,1695,1700],{"type":50,"tag":208,"props":1681,"children":1682},{"style":215},[1683],{"type":56,"value":1684},"cat",{"type":50,"tag":208,"props":1686,"children":1687},{"style":311},[1688],{"type":56,"value":1689}," >",{"type":50,"tag":208,"props":1691,"children":1692},{"style":221},[1693],{"type":56,"value":1694}," \u002Ftmp\u002Fflaky-update.json",{"type":50,"tag":208,"props":1696,"children":1697},{"style":311},[1698],{"type":56,"value":1699}," \u003C\u003C",{"type":50,"tag":208,"props":1701,"children":1702},{"style":311},[1703],{"type":56,"value":1704},"'EOF'\n",{"type":50,"tag":208,"props":1706,"children":1707},{"class":210,"line":237},[1708],{"type":50,"tag":208,"props":1709,"children":1710},{"style":221},[1711],{"type":56,"value":1712},"{\n",{"type":50,"tag":208,"props":1714,"children":1715},{"class":210,"line":247},[1716],{"type":50,"tag":208,"props":1717,"children":1718},{"style":221},[1719],{"type":56,"value":1720},"  \"data\": {\n",{"type":50,"tag":208,"props":1722,"children":1723},{"class":210,"line":362},[1724],{"type":50,"tag":208,"props":1725,"children":1726},{"style":221},[1727],{"type":56,"value":1728},"    \"type\": \"UpdateFlakyTestsRequest\",\n",{"type":50,"tag":208,"props":1730,"children":1731},{"class":210,"line":1116},[1732],{"type":50,"tag":208,"props":1733,"children":1734},{"style":221},[1735],{"type":56,"value":1736},"    \"attributes\": {\n",{"type":50,"tag":208,"props":1738,"children":1740},{"class":210,"line":1739},6,[1741],{"type":50,"tag":208,"props":1742,"children":1743},{"style":221},[1744],{"type":56,"value":1745},"      \"tests\": [{\"id\": \"\u003Cfingerprint_fqn>\", \"new_state\": \"quarantined\"}]\n",{"type":50,"tag":208,"props":1747,"children":1749},{"class":210,"line":1748},7,[1750],{"type":50,"tag":208,"props":1751,"children":1752},{"style":221},[1753],{"type":56,"value":1754},"    }\n",{"type":50,"tag":208,"props":1756,"children":1758},{"class":210,"line":1757},8,[1759],{"type":50,"tag":208,"props":1760,"children":1761},{"style":221},[1762],{"type":56,"value":1763},"  }\n",{"type":50,"tag":208,"props":1765,"children":1767},{"class":210,"line":1766},9,[1768],{"type":50,"tag":208,"props":1769,"children":1770},{"style":221},[1771],{"type":56,"value":1772},"}\n",{"type":50,"tag":208,"props":1774,"children":1776},{"class":210,"line":1775},10,[1777],{"type":50,"tag":208,"props":1778,"children":1779},{"style":311},[1780],{"type":56,"value":1781},"EOF\n",{"type":50,"tag":208,"props":1783,"children":1785},{"class":210,"line":1784},11,[1786,1790,1795,1799,1804,1809],{"type":50,"tag":208,"props":1787,"children":1788},{"style":215},[1789],{"type":56,"value":279},{"type":50,"tag":208,"props":1791,"children":1792},{"style":221},[1793],{"type":56,"value":1794}," test-optimization",{"type":50,"tag":208,"props":1796,"children":1797},{"style":221},[1798],{"type":56,"value":449},{"type":50,"tag":208,"props":1800,"children":1801},{"style":221},[1802],{"type":56,"value":1803}," update",{"type":50,"tag":208,"props":1805,"children":1806},{"style":221},[1807],{"type":56,"value":1808}," --file",{"type":50,"tag":208,"props":1810,"children":1811},{"style":221},[1812],{"type":56,"value":1813}," \u002Ftmp\u002Fflaky-update.json\n",{"type":50,"tag":59,"props":1815,"children":1816},{},[1817,1819,1825],{"type":56,"value":1818},"To undo: repeat with ",{"type":50,"tag":70,"props":1820,"children":1822},{"className":1821},[],[1823],{"type":56,"value":1824},"\"new_state\": \"active\"",{"type":56,"value":1826},".",{"type":50,"tag":1828,"props":1829,"children":1830},"style",{},[1831],{"type":56,"value":1832},"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":1834,"total":1784},[1835,1851,1861,1875,1886,1898,1912],{"slug":1836,"name":1836,"fn":1837,"description":1838,"org":1839,"tags":1840,"stars":24,"repoUrl":25,"updatedAt":1850},"dd-apm","analyze Datadog APM traces and services","APM - traces, services, dependencies, performance analysis.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1841,1842,1845,1847],{"name":9,"slug":8,"type":16},{"name":1843,"slug":1844,"type":16},"Distributed Tracing","distributed-tracing",{"name":1846,"slug":32,"type":16},"Observability",{"name":1848,"slug":1849,"type":16},"Performance","performance","2026-07-15T05:38:04.953706",{"slug":1852,"name":1852,"fn":1853,"description":1854,"org":1855,"tags":1856,"stars":24,"repoUrl":25,"updatedAt":1860},"dd-debugger","debug production code with Datadog","Live Debugger - inspect runtime argument\u002Fvariable values in production by placing log probes on methods. Use when asked what values a function receives, what parameters look like at runtime, or to capture live data from running services without redeploying.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1857,1858,1859],{"name":9,"slug":8,"type":16},{"name":22,"slug":23,"type":16},{"name":1846,"slug":32,"type":16},"2026-07-15T05:38:09.905216",{"slug":1862,"name":1862,"fn":1863,"description":1864,"org":1865,"tags":1866,"stars":24,"repoUrl":25,"updatedAt":1874},"dd-docs","search Datadog documentation","Datadog docs lookup using docs.datadoghq.com\u002Fllms.txt and linked Markdown pages.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1867,1868,1871],{"name":9,"slug":8,"type":16},{"name":1869,"slug":1870,"type":16},"Documentation","documentation",{"name":1872,"slug":1873,"type":16},"Reference","reference","2026-07-15T05:38:06.203917",{"slug":1876,"name":1876,"fn":1877,"description":1878,"org":1879,"tags":1880,"stars":24,"repoUrl":25,"updatedAt":1885},"dd-file-issue","file GitHub issues for Datadog","File GitHub issues to the right repository (pup CLI or plugin)",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1881,1882],{"name":9,"slug":8,"type":16},{"name":1883,"slug":1884,"type":16},"GitHub","github","2026-07-15T05:38:11.122217",{"slug":1887,"name":1887,"fn":1888,"description":1889,"org":1890,"tags":1891,"stars":24,"repoUrl":25,"updatedAt":1897},"dd-logs","manage Datadog logs and pipelines","Log management - search, pipelines, archives, and cost control.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1892,1893,1896],{"name":9,"slug":8,"type":16},{"name":1894,"slug":1895,"type":16},"Logs","logs",{"name":1846,"slug":32,"type":16},"2026-07-15T05:38:07.426277",{"slug":1899,"name":1899,"fn":1900,"description":1901,"org":1902,"tags":1903,"stars":24,"repoUrl":25,"updatedAt":1911},"dd-monitors","manage Datadog monitors and alerts","Monitor management - create, update, mute, and alerting best practices.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1904,1907,1908],{"name":1905,"slug":1906,"type":16},"Alerting","alerting",{"name":9,"slug":8,"type":16},{"name":1909,"slug":1910,"type":16},"Monitoring","monitoring","2026-07-12T07:55:05.804251",{"slug":75,"name":75,"fn":1913,"description":1914,"org":1915,"tags":1916,"stars":24,"repoUrl":25,"updatedAt":1923},"authenticate with Datadog CLI","Datadog CLI (pup). OAuth2 auth with token refresh.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1917,1920,1922],{"name":1918,"slug":1919,"type":16},"Authentication","authentication",{"name":1921,"slug":30,"type":16},"CLI",{"name":9,"slug":8,"type":16},"2026-07-12T07:55:07.105248",{"items":1925,"total":1784},[1926,1933,1939,1945,1950,1956,1962,1968,1980,1987,2000],{"slug":1836,"name":1836,"fn":1837,"description":1838,"org":1927,"tags":1928,"stars":24,"repoUrl":25,"updatedAt":1850},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1929,1930,1931,1932],{"name":9,"slug":8,"type":16},{"name":1843,"slug":1844,"type":16},{"name":1846,"slug":32,"type":16},{"name":1848,"slug":1849,"type":16},{"slug":1852,"name":1852,"fn":1853,"description":1854,"org":1934,"tags":1935,"stars":24,"repoUrl":25,"updatedAt":1860},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1936,1937,1938],{"name":9,"slug":8,"type":16},{"name":22,"slug":23,"type":16},{"name":1846,"slug":32,"type":16},{"slug":1862,"name":1862,"fn":1863,"description":1864,"org":1940,"tags":1941,"stars":24,"repoUrl":25,"updatedAt":1874},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1942,1943,1944],{"name":9,"slug":8,"type":16},{"name":1869,"slug":1870,"type":16},{"name":1872,"slug":1873,"type":16},{"slug":1876,"name":1876,"fn":1877,"description":1878,"org":1946,"tags":1947,"stars":24,"repoUrl":25,"updatedAt":1885},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1948,1949],{"name":9,"slug":8,"type":16},{"name":1883,"slug":1884,"type":16},{"slug":1887,"name":1887,"fn":1888,"description":1889,"org":1951,"tags":1952,"stars":24,"repoUrl":25,"updatedAt":1897},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1953,1954,1955],{"name":9,"slug":8,"type":16},{"name":1894,"slug":1895,"type":16},{"name":1846,"slug":32,"type":16},{"slug":1899,"name":1899,"fn":1900,"description":1901,"org":1957,"tags":1958,"stars":24,"repoUrl":25,"updatedAt":1911},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1959,1960,1961],{"name":1905,"slug":1906,"type":16},{"name":9,"slug":8,"type":16},{"name":1909,"slug":1910,"type":16},{"slug":75,"name":75,"fn":1913,"description":1914,"org":1963,"tags":1964,"stars":24,"repoUrl":25,"updatedAt":1923},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1965,1966,1967],{"name":1918,"slug":1919,"type":16},{"name":1921,"slug":30,"type":16},{"name":9,"slug":8,"type":16},{"slug":1969,"name":1969,"fn":1970,"description":1971,"org":1972,"tags":1973,"stars":24,"repoUrl":25,"updatedAt":1979},"dd-symdb","search Datadog service symbols","Symbol Database - search service symbols, find probe-able methods.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1974,1977,1978],{"name":1975,"slug":1976,"type":16},"Code Analysis","code-analysis",{"name":9,"slug":8,"type":16},{"name":22,"slug":23,"type":16},"2026-07-15T05:38:08.664632",{"slug":4,"name":4,"fn":5,"description":6,"org":1981,"tags":1982,"stars":24,"repoUrl":25,"updatedAt":26},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1983,1984,1985,1986],{"name":9,"slug":8,"type":16},{"name":22,"slug":23,"type":16},{"name":14,"slug":15,"type":16},{"name":19,"slug":20,"type":16},{"slug":1988,"name":1988,"fn":1989,"description":1990,"org":1991,"tags":1992,"stars":24,"repoUrl":25,"updatedAt":1999},"dd-unblock-pr","diagnose and unblock CI pipelines","Load when investigating a failing PR CI pipeline or checking PR health. Attributes each CI failure as flaky, infra, or regression, proposes a targeted action, and reports code coverage.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1993,1996,1997,1998],{"name":1994,"slug":1995,"type":16},"CI\u002FCD","ci-cd",{"name":9,"slug":8,"type":16},{"name":22,"slug":23,"type":16},{"name":1883,"slug":1884,"type":16},"2026-07-15T05:38:12.359316",{"slug":279,"name":279,"fn":2001,"description":2002,"org":2003,"tags":2004,"stars":24,"repoUrl":25,"updatedAt":2011},"manage Datadog infrastructure via CLI","Datadog API CLI with 49 command groups, 300+ subcommands. Skills and domain agents for monitoring, logs, APM, security, and infrastructure.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2005,2006,2007,2010],{"name":1921,"slug":30,"type":16},{"name":9,"slug":8,"type":16},{"name":2008,"slug":2009,"type":16},"Infrastructure","infrastructure",{"name":1909,"slug":1910,"type":16},"2026-07-15T05:38:13.593372"]