[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-datadog-labs-dd-account-setup":3,"mdc-3ujwij-key":33,"related-org-datadog-labs-dd-account-setup":5562,"related-repo-datadog-labs-dd-account-setup":5731},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":22,"repoUrl":23,"updatedAt":24,"license":25,"forks":26,"topics":27,"repo":28,"sourceUrl":31,"mdContent":32},"dd-account-setup","configure Datadog account authentication","Ensure the user has an authenticated Datadog account with a valid DD_API_KEY on the right region before any Datadog setup or instrumentation. Detects existing DD_API_KEY \u002F DD_APP_KEY \u002F DD_SITE, validates them against the Datadog API, and fixes the common wrong-region 403. If no usable key exists, signs the user in (OAuth) or creates a new account, then obtains and validates a key. Use this whenever a user needs a Datadog account or API key, hits a 403 \u002F wrong-region error, or is about to run any Datadog *-setup or instrumentation skill.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"datadog-labs","Datadog Labs","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fdatadog-labs.png",[12,16,19],{"name":13,"slug":14,"type":15},"Observability","observability","tag",{"name":17,"slug":18,"type":15},"Configuration","configuration",{"name":20,"slug":21,"type":15},"Datadog","datadog",145,"https:\u002F\u002Fgithub.com\u002Fdatadog-labs\u002Fagent-skills","2026-08-16T04:01:04.151248",null,19,[],{"repoUrl":23,"stars":22,"forks":26,"topics":29,"description":30},[],"Public repository for Datadog Agent Skills","https:\u002F\u002Fgithub.com\u002Fdatadog-labs\u002Fagent-skills\u002Ftree\u002FHEAD\u002Fdd-account-setup","---\nname: dd-account-setup\ndescription: Ensure the user has an authenticated Datadog account with a valid DD_API_KEY on the right region before any Datadog setup or instrumentation. Detects existing DD_API_KEY \u002F DD_APP_KEY \u002F DD_SITE, validates them against the Datadog API, and fixes the common wrong-region 403. If no usable key exists, signs the user in (OAuth) or creates a new account, then obtains and validates a key. Use this whenever a user needs a Datadog account or API key, hits a 403 \u002F wrong-region error, or is about to run any Datadog *-setup or instrumentation skill.\n---\n\n# Create \u002F connect a Datadog account\n\nThis skill gets the user to a known-good state: **a valid API key + application key, on the right region, validated against the Datadog API.** It is the \"step 0\" that setup\u002Finstrumentation skills depend on — run it first, then hand off.\n\nIt is a standalone guided flow: detect what already exists, and when nothing usable is found, sign in with **OAuth** (browser, PKCE + state) or create a new account (in-terminal, with a **generated** password saved to `.env`), then turn that session into an API key. Everything runs as small **inline `bash` + `curl`** commands (OAuth also uses `openssl`) — **no bundled scripts, no node**; cross-platform (macOS, Linux, Windows via WSL\u002FGit Bash).\n\nThis SKILL.md is the spine — it carries the short steps inline and routes to `references\u002F` for the heavy per-step machinery. Read a reference only when you reach the step that names it.\n\n## The flow at a glance\n\n```\nheadless requested?  ──yes──▶  Step H: env keys only (OAuth needs a browser), validate, done\n   │no (default — interactive)\n   ▼\nStep 1  Detect existing credentials (env)\n   │\n   ▼\nStep 2  Determine region \u002F site  (DD_SITE → validate; else IP-detect → confirm)\n   │\n   ▼\nStep 3  Authenticate  — ask first (even if env keys were detected)   → references\u002Fauthenticate.md\n   │        └─ ASK: how to connect? ↴\n   │            ├─ A. Use the detected env key (only if one exists) → validate → Step 5\n   │            ├─ B. Sign in (I have an account) → OAuth (browser, PKCE + state) ──▶ Bearer token\n   │            └─ C. Create a new account → Path C: auto in-terminal signup, generated password ──▶ then OAuth\n   ▼\nStep 4  Turn the OAuth session into an API key   → references\u002Fget-api-key.md\n   │        (identity + region via \u002Fcurrent_user; OAuth→retrieve most-recent key, app-key→create → write straight to .env; else guide to UI key page)\n   ▼\nStep 5  Load creds from .env, validate, hand off\n```\n\n**Golden rule: never guess or fabricate an API key, app key, token, or site.** Read what's in the environment, validate it, and if it isn't there, authenticate — do not proceed on assumptions.\n\n## Display & wording conventions — read once before Step 1\n\n**Every step** obeys the same rules for how it talks to the user and renders progress: the clean-status-line presentation contract, asking with the host's native selector (never letter-entry), and the live progress checklist with its marker discipline. These live in **`references\u002Fconventions.md`** — read it before Step 1 and apply it throughout. Each step below ends with a `↳ Checklist:` cue telling you what to flip.\n\n---\n\n## Step 0 — Preflight (readiness board)\n\nRun this once, first, so the user sees the whole path before anything happens — which tools are\npresent, what's already detected, and what the flow will do (including that it opens the browser\nonce). It writes nothing and reveals no secret. Every invocation runs the full flow from Step 1 —\nthere is no resume\u002Fskip-ahead; a prior run is not reused.\n\n```bash\nDDLOG=\"${TMPDIR:-\u002Ftmp}\u002Fdd-onboard-$(id -u).log\"; : >\"$DDLOG\"   # fresh log for this run\nmark(){ command -v \"$1\" >\u002Fdev\u002Fnull 2>&1 && echo \"✓\" || echo \"$2\"; }\n# python3 gates the auto browser-callback; fall back to python only if it's a real py3.\nhave_py3(){ command -v python3 >\u002Fdev\u002Fnull 2>&1 && return 0; command -v python >\u002Fdev\u002Fnull 2>&1 && python -c 'import sys;exit(0 if sys.version_info[0]==3 else 1)' 2>\u002Fdev\u002Fnull; }\npy3msg(){ have_py3 && echo '✓ (auto browser-callback)' || echo '⊘ (will paste the redirect URL)'; }\necho   \"Datadog account setup — preflight\"\necho   \"  deps (required):  bash ✓   curl $(mark curl ✗)   openssl $(mark openssl ✗)\"\necho   \"  deps (optional):  python3 $(py3msg)   browser-open $( { command -v open >\u002Fdev\u002Fnull 2>&1 || command -v xdg-open >\u002Fdev\u002Fnull 2>&1; } && echo ✓ || echo '⊘ (open URL manually)')\"\n# Canonical DD_* loader — this same block is repeated verbatim in later steps because each ```bash runs a fresh shell (not drift).\n# Load DD_* with precedence: shell env > .env.local > .env. A real env var is never overwritten; surrounding quotes are stripped. *_SRC records where each came from (unset ⇒ from the shell env).\nfor f in .env.local .env; do [ -f \"$f\" ] || continue; for k in DD_SITE DD_API_KEY DD_APP_KEY; do eval \"[ -n \\\"\\${$k:-}\\\" ]\" && continue; v=$(grep -E \"^$k=\" \"$f\" | head -1 | cut -d= -f2- | sed 's\u002F^[\"'\\'']\u002F\u002F;s\u002F[\"'\\'']$\u002F\u002F'); [ -n \"$v\" ] && { export \"$k=$v\"; eval \"${k}_SRC=$f\"; }; done; done\necho   \"  detected creds:   DD_SITE=${DD_SITE:-\u003Cunset>}${DD_SITE_SRC:+ [$DD_SITE_SRC]}   DD_API_KEY=$([ -n \"$DD_API_KEY\" ] && echo \"set …${DD_API_KEY: -4}${DD_API_KEY_SRC:+ [$DD_API_KEY_SRC]}\" || echo '\u003Cunset>')   DD_APP_KEY=$([ -n \"$DD_APP_KEY\" ] && echo \"set${DD_APP_KEY_SRC:+ [$DD_APP_KEY_SRC]}\" || echo '\u003Cunset>')\"\necho   \"  what happens:     confirm region → authenticate (opens your browser once) → get an API key → write it to .env → validate. ~2 min, one browser approval.\"\n[ \"$(mark curl ✗)\" = ✗ ] || [ \"$(mark openssl ✗)\" = ✗ ] && echo \"  ✗ missing a required dep above — install it before continuing.\"\n```\n\nRead the board to the user as-is (it's already clean). If a **required** dep is missing, stop and\nsay so. Then tick the checklist's step 1 and move on — always continue into Step 1; never skip\nahead to a later step.\n\n> ↳ **Checklist:** post the board, then the checklist; mark **1. Detect credentials** ◔.\n\n---\n\n## Step H — Headless \u002F non-interactive (no browser, no prompts)\n\nDecide this first, because the browser + signup paths are impossible without a human. **Infer\nheadless from the skill's invocation, not from the environment** — the trigger is the user's\nrequest itself: they explicitly ask to run without a browser or without interactive prompts\n(e.g. \"set up Datadog non-interactively\", \"I'm in CI, no browser\").\n\nDo **not** infer headless merely from a missing TTY — an ordinary terminal run always gets the\ninteractive flow. Only an explicit request switches it off.\n\nWhen you've inferred a headless request, run the block below — and only then. There's no browser\nfor OAuth and no human to answer the signup prompts, so the one way to a valid state is with keys\nalready provided. Require `DD_API_KEY`, `DD_APP_KEY`, and `DD_SITE`, and fail fast otherwise:\n\n```bash\n# Run this block ONLY when you inferred a non-interactive request. It enforces the one thing\n# headless needs — keys already present — and fails fast when any are missing.\n# Load DD_* (env > .env.local > .env), same precedence as Step 1 — CI keys often live in .env, not exported.\nfor f in .env.local .env; do [ -f \"$f\" ] || continue; for k in DD_SITE DD_API_KEY DD_APP_KEY; do eval \"[ -n \\\"\\${$k:-}\\\" ]\" && continue; v=$(grep -E \"^$k=\" \"$f\" | head -1 | cut -d= -f2- | sed 's\u002F^[\"'\\'']\u002F\u002F;s\u002F[\"'\\'']$\u002F\u002F'); [ -n \"$v\" ] && export \"$k=$v\"; done; done\nmissing=\"\"\n[ -z \"$DD_API_KEY\" ] && missing=\"$missing DD_API_KEY\"\n[ -z \"$DD_APP_KEY\" ] && missing=\"$missing DD_APP_KEY\"\n[ -z \"$DD_SITE\" ]    && missing=\"$missing DD_SITE\"\n[ -n \"$missing\" ] && { echo \"Non-interactive mode requires:$missing — set them and re-run. Sign-in and trial signup need a browser.\"; exit 1; }\n```\n\nIf all three are set, hand off to **Step 5**, which validates the key via `\u002Fapi\u002Fv1\u002Fvalidate` (works with the `DD-API-KEY` header). Note: `\u002Fapi\u002Fv1\u002Fvalidate` checks `DD_API_KEY` only — `DD_APP_KEY` is required but not independently verified here; a wrong\u002Fexpired app key surfaces later at the first app-key-scoped call. There is **no OAuth or signup fallback when headless** — both need a browser — so fail with the message above and keep logs actionable.\n\n> ↳ **Checklist (headless):** two items only — once validate passes, tick both and jump to Step 5.\n\n---\n\n## Step 1 — Detect existing credentials\n\nRead the environment **and** the project's `.env` \u002F `.env.local` files. Do not read the values back to the user in full; mask them.\n\n```bash\n# Load DD_* with precedence: shell env > .env.local > .env (real env var wins; quotes stripped). *_SRC = file it came from (unset ⇒ shell env).\nfor f in .env.local .env; do [ -f \"$f\" ] || continue; for k in DD_SITE DD_API_KEY DD_APP_KEY; do eval \"[ -n \\\"\\${$k:-}\\\" ]\" && continue; v=$(grep -E \"^$k=\" \"$f\" | head -1 | cut -d= -f2- | sed 's\u002F^[\"'\\'']\u002F\u002F;s\u002F[\"'\\'']$\u002F\u002F'); [ -n \"$v\" ] && { export \"$k=$v\"; eval \"${k}_SRC=$f\"; }; done; done\necho \"DD_SITE   = ${DD_SITE:-\u003Cunset>}${DD_SITE_SRC:+ (from $DD_SITE_SRC)}\"\necho \"DD_API_KEY= $( [ -n \"$DD_API_KEY\" ] && echo \"set (…${DD_API_KEY: -4})${DD_API_KEY_SRC:+ (from $DD_API_KEY_SRC)}\" || echo \"\u003Cunset>\" )\"\necho \"DD_APP_KEY= $( [ -n \"$DD_APP_KEY\" ] && echo \"set (…${DD_APP_KEY: -4})${DD_APP_KEY_SRC:+ (from $DD_APP_KEY_SRC)}\" || echo \"\u003Cunset>\" )\"\n```\n\n- A `DD_API_KEY` is present (env **or** `.env`\u002F`.env.local`) → go to **Step 2** (pin the site), then **Step 3** and **ask** (choice **A** = use the detected key, or **B**\u002F**C** to authenticate \u002F create a different account). The detected key is an option the user confirms in Step 3, not a default to use silently — they may want a different org or account.\n- No `DD_API_KEY` anywhere → the user has nothing usable yet. Still do **Step 2** (so signup lands them on the right region), then go to **Step 3**, where you'll ask how to connect.\n\nAn app key without an api key is not enough; treat it as \"no key.\" Because the shell doesn't persist between blocks, every later block that consumes `$DD_API_KEY` re-runs this same loader at its top — that's why it reappears in Path A, Step 4, and Step 5.\n\n> ↳ **Checklist:** post the list now — tick **1. Detect credentials**, mark **2. Confirm region** ◔.\n\n---\n\n## Step 2 — Determine region \u002F site\n\nThe site drives *every* URL downstream (signup, API host, key pages), so pin it before validating.\nThe region table and the country→region IP mapping live in **`references\u002Fregions.md`**.\n\n1. **If `DD_SITE` is set** (env or `.env`): validate it against the allowed-site list in\n   `references\u002Fregions.md`. If it is **not** in that list, stop and show a clear error:\n   > `DD_SITE=\"\u003Cvalue>\"` isn't a recognized Datadog site. Pick one of the regions in `references\u002Fregions.md` and set `DD_SITE` accordingly.\n\n2. **If `DD_SITE` is unset:** auto-detect the region from the user's location, then **confirm** — never silently commit a region.\n\n   ```bash\n   country=$(curl -s --max-time 2 https:\u002F\u002Fipinfo.io\u002Fjson \\\n     | grep -o '\"country\"[^,]*' | grep -o '\"[A-Z][A-Z]\"' | tr -d '\"')\n   echo \"Detected country: ${country:-unknown}\"\n   ```\n\n   Map the country to a region using the **Country → region mapping** table in `references\u002Fregions.md`. On timeout, error, or no match, **default to US1** (`datadoghq.com`) — and say so. Then tell the user, e.g.:\n   > You look like you're in **DE** → suggesting **EU1 (Frankfurt), `datadoghq.eu`**. Use this, or pick another region below?\n\n   Wait for confirmation. Region cannot be changed after an account is created, so this choice matters.\n\nThe API host is uniformly `https:\u002F\u002Fapi.${DD_SITE}`.\n\n> ↳ **Checklist:** after the user confirms the region, tick **2. Confirm region**, mark **3. Authenticate** ◔.\n\n---\n\n## Step 3 — Authenticate\n\n**Ask how to connect first — even when Step 1 detected env credentials** — then run the path the user picks. Present \"The choice\" before touching any credential: an ambient `DD_API_KEY` may belong to a different org or account than the user intends, and region\u002FIP can't reveal which, so let the user decide rather than inferring it. (Headless\u002F**Step H** is exempt — no TTY to ask, env keys only.)\n\nThe full detail — \"The choice\" native-selector wording plus all three paths — lives in **`references\u002Fauthenticate.md`**:\n\n| The user picks | Path | What it does |\n|----------------|------|--------------|\n| Use my existing credentials *(only offered if Step 1 detected a key)* | **A** | Validate the detected key (also catches a wrong-region key → back to Step 2). |\n| Sign in — I already have an account | **B** | OAuth in the browser (PKCE + state), Bearer token to a `0600` file. |\n| Create a new account *(default)* | **C** | Automated in-terminal signup with a generated password → then Path B. |\n\nRead `references\u002Fauthenticate.md`, present the choice via the host's native selector, and run the matching path. Re-offer the choice whenever a path dead-ends (OAuth finds no account → **C**; a wrong-region key sent the user back to Step 2 first).\n\n> ↳ **Checklist:** keep **3. Authenticate** ◔ until a token or key is actually in hand (see the per-path cues in `references\u002Fauthenticate.md`).\n\n---\n\n## Step 4 — Turn the OAuth session into an API key\n\nThe OAuth token authenticates the user, but downstream instrumentation needs a **`DD_API_KEY`**. Use the Bearer token to confirm identity, then obtain a key — **retrieve** the org's most-recent key on an OAuth session (OAuth tokens cannot create keys), or **create** one when authenticating with an app key; else guide the user to the UI key page.\n\nThe full branch (identity check, retrieve-vs-create, the HTTP-code-tagged block, and the outcome table for `EMPTY_ORG` \u002F `LIST_DENIED` \u002F `SECRET_DENIED` \u002F `CREATE_DENIED` \u002F `TRANSPORT_ERROR`) lives in **`references\u002Fget-api-key.md`** — follow it. The secret is written straight to `.env`, never echoed.\n\n> ↳ **Checklist:** once a validated key is in hand, tick **4. Get & validate an API key**, mark **5** ◔.\n\n---\n\n## Step 5 — Confirm and hand off\n\nThe key is already in `.env`. Load it and validate (a fresh shell each call — always load `.env` first by *parsing* it, never `source` it, so a crafted `.env` can't execute; never inline the literal key):\n\n```bash\nDDLOG=\"${TMPDIR:-\u002Ftmp}\u002Fdd-onboard-$(id -u).log\"; tf=\"${TMPDIR:-\u002Ftmp}\u002Fdd-oauth-$(id -u).token\"\n# Load DD_* (env > .env.local > .env) — parse, don't source, so a crafted .env can't execute. Covers a Path-A key that lives only in the shell env or .env.local.\nfor f in .env.local .env; do [ -f \"$f\" ] || continue; for k in DD_SITE DD_API_KEY DD_APP_KEY; do eval \"[ -n \\\"\\${$k:-}\\\" ]\" && continue; v=$(grep -E \"^$k=\" \"$f\" | head -1 | cut -d= -f2- | sed 's\u002F^[\"'\\'']\u002F\u002F;s\u002F[\"'\\'']$\u002F\u002F'); [ -n \"$v\" ] && export \"$k=$v\"; done; done\nvcode=$(curl -sg -o \"$DDLOG\" -w '%{http_code}' -H \"DD-API-KEY: $DD_API_KEY\" \"https:\u002F\u002Fapi.${DD_SITE}\u002Fapi\u002Fv1\u002Fvalidate\")\n# re-derive org\u002Femail for the card (fresh shell — Step 4 vars don't persist); only if a token is still around\nwho=\"\"; [ -s \"$tf\" ] && who=$(curl -sg -H \"Authorization: Bearer $(cat \"$tf\")\" \"https:\u002F\u002Fapi.${DD_SITE}\u002Fapi\u002Fv2\u002Fcurrent_user\" 2>>\"$DDLOG\" | grep -oE '\"email\"[[:space:]]*:[[:space:]]*\"[^\"]*\"' | head -1 | cut -d'\"' -f4)\n# consistent 🔑 credential card — the one place credential state is summarized; secret shown only as last4\necho \"🔑 Datadog credential\"\n[ -n \"$who\" ] && echo \"   org:     $who\"\necho \"   region:  ${DD_SITE}\"\necho \"   api key: …${DD_API_KEY: -4}  (in .env — never printed in full)\"\necho \"   status:  $([ \"$vcode\" = 200 ] && echo '✓ validated (HTTP 200)' || echo \"✗ validate HTTP $vcode — see: tail -n 30 \\\"$DDLOG\\\"\")\"\n```\n\n- The card above is the canonical summary — don't also dump the raw validate response. On a non-200, surface `tail -n 30 \"$DDLOG\"` and treat it per the outcome table (a `403` here is usually wrong region → Step 2).\n- Report the authenticated org\u002Femail from the identity call.\n- Credentials all live in **`.env`** (`DD_SITE`, `DD_API_KEY`, and `DD_SIGNUP_PASSWORD` if the account was created via Path C) — written there directly, never echoed. Clean up the signup temp files and the OAuth *state* + *callback* files: `rm -f \"${TMPDIR:-\u002Ftmp}\"\u002Fdd-signup-$(id -u).* \"${TMPDIR:-\u002Ftmp}\"\u002Fdd-oauth-$(id -u).state \"${TMPDIR:-\u002Ftmp}\"\u002Fdd-oauth-$(id -u).cb`.\n- **Downstream handoff — keep the OAuth token.** Leave `${TMPDIR:-\u002Ftmp}\u002Fdd-oauth-$(id -u).token` (`0600`) in place. Downstream instrumentation reuses this Bearer token to provision resources a plain API key can't create — notably a RUM application. It is short-lived and scoped; the onboarding caller (e.g. the orchestrator) removes it once setup finishes (`rm -f \"${TMPDIR:-\u002Ftmp}\"\u002Fdd-oauth-$(id -u).token`). Running instrumentation standalone? Delete it yourself when done.\n- Hand back: \"Account is ready. You can now run the setup \u002F instrumentation step.\" (e.g. `studio-setup`, `browser-rum-setup`, `llm-observability-setup`, or any other `*-setup` skill).\n\n> ↳ **Checklist:** tick **5. Ready — hand off** — show the fully completed list so the user sees the flow is done.\n\n---\n\n## Troubleshooting & reference\n\nWhen a step fails, see **`references\u002Ftroubleshooting.md`** — the symptom→fix table (wrong region, OAuth state mismatch, headless exit, Path-C signup errors, …) plus the design-decision and temp-state notes.\n",{"data":34,"body":35},{"name":4,"description":6},{"type":36,"children":37},"root",[38,47,61,125,138,145,157,167,173,202,206,212,217,1743,1755,1778,1781,1787,1799,1811,1838,2490,2546,2560,2563,2569,2596,3363,3466,3478,3503,3506,3512,3536,3868,3880,3904,3907,3913,3937,3952,4063,4081,4107,4110,4116,4145,4204,4229,4232,4238,4279,5361,5511,5531,5534,5540,5556],{"type":39,"tag":40,"props":41,"children":43},"element","h1",{"id":42},"create-connect-a-datadog-account",[44],{"type":45,"value":46},"text","Create \u002F connect a Datadog account",{"type":39,"tag":48,"props":49,"children":50},"p",{},[51,53,59],{"type":45,"value":52},"This skill gets the user to a known-good state: ",{"type":39,"tag":54,"props":55,"children":56},"strong",{},[57],{"type":45,"value":58},"a valid API key + application key, on the right region, validated against the Datadog API.",{"type":45,"value":60}," It is the \"step 0\" that setup\u002Finstrumentation skills depend on — run it first, then hand off.",{"type":39,"tag":48,"props":62,"children":63},{},[64,66,71,73,78,80,87,89,108,110,116,118,123],{"type":45,"value":65},"It is a standalone guided flow: detect what already exists, and when nothing usable is found, sign in with ",{"type":39,"tag":54,"props":67,"children":68},{},[69],{"type":45,"value":70},"OAuth",{"type":45,"value":72}," (browser, PKCE + state) or create a new account (in-terminal, with a ",{"type":39,"tag":54,"props":74,"children":75},{},[76],{"type":45,"value":77},"generated",{"type":45,"value":79}," password saved to ",{"type":39,"tag":81,"props":82,"children":84},"code",{"className":83},[],[85],{"type":45,"value":86},".env",{"type":45,"value":88},"), then turn that session into an API key. Everything runs as small ",{"type":39,"tag":54,"props":90,"children":91},{},[92,94,100,102],{"type":45,"value":93},"inline ",{"type":39,"tag":81,"props":95,"children":97},{"className":96},[],[98],{"type":45,"value":99},"bash",{"type":45,"value":101}," + ",{"type":39,"tag":81,"props":103,"children":105},{"className":104},[],[106],{"type":45,"value":107},"curl",{"type":45,"value":109}," commands (OAuth also uses ",{"type":39,"tag":81,"props":111,"children":113},{"className":112},[],[114],{"type":45,"value":115},"openssl",{"type":45,"value":117},") — ",{"type":39,"tag":54,"props":119,"children":120},{},[121],{"type":45,"value":122},"no bundled scripts, no node",{"type":45,"value":124},"; cross-platform (macOS, Linux, Windows via WSL\u002FGit Bash).",{"type":39,"tag":48,"props":126,"children":127},{},[128,130,136],{"type":45,"value":129},"This SKILL.md is the spine — it carries the short steps inline and routes to ",{"type":39,"tag":81,"props":131,"children":133},{"className":132},[],[134],{"type":45,"value":135},"references\u002F",{"type":45,"value":137}," for the heavy per-step machinery. Read a reference only when you reach the step that names it.",{"type":39,"tag":139,"props":140,"children":142},"h2",{"id":141},"the-flow-at-a-glance",[143],{"type":45,"value":144},"The flow at a glance",{"type":39,"tag":146,"props":147,"children":151},"pre",{"className":148,"code":150,"language":45},[149],"language-text","headless requested?  ──yes──▶  Step H: env keys only (OAuth needs a browser), validate, done\n   │no (default — interactive)\n   ▼\nStep 1  Detect existing credentials (env)\n   │\n   ▼\nStep 2  Determine region \u002F site  (DD_SITE → validate; else IP-detect → confirm)\n   │\n   ▼\nStep 3  Authenticate  — ask first (even if env keys were detected)   → references\u002Fauthenticate.md\n   │        └─ ASK: how to connect? ↴\n   │            ├─ A. Use the detected env key (only if one exists) → validate → Step 5\n   │            ├─ B. Sign in (I have an account) → OAuth (browser, PKCE + state) ──▶ Bearer token\n   │            └─ C. Create a new account → Path C: auto in-terminal signup, generated password ──▶ then OAuth\n   ▼\nStep 4  Turn the OAuth session into an API key   → references\u002Fget-api-key.md\n   │        (identity + region via \u002Fcurrent_user; OAuth→retrieve most-recent key, app-key→create → write straight to .env; else guide to UI key page)\n   ▼\nStep 5  Load creds from .env, validate, hand off\n",[152],{"type":39,"tag":81,"props":153,"children":155},{"__ignoreMap":154},"",[156],{"type":45,"value":150},{"type":39,"tag":48,"props":158,"children":159},{},[160,165],{"type":39,"tag":54,"props":161,"children":162},{},[163],{"type":45,"value":164},"Golden rule: never guess or fabricate an API key, app key, token, or site.",{"type":45,"value":166}," Read what's in the environment, validate it, and if it isn't there, authenticate — do not proceed on assumptions.",{"type":39,"tag":139,"props":168,"children":170},{"id":169},"display-wording-conventions-read-once-before-step-1",[171],{"type":45,"value":172},"Display & wording conventions — read once before Step 1",{"type":39,"tag":48,"props":174,"children":175},{},[176,181,183,192,194,200],{"type":39,"tag":54,"props":177,"children":178},{},[179],{"type":45,"value":180},"Every step",{"type":45,"value":182}," obeys the same rules for how it talks to the user and renders progress: the clean-status-line presentation contract, asking with the host's native selector (never letter-entry), and the live progress checklist with its marker discipline. These live in ",{"type":39,"tag":54,"props":184,"children":185},{},[186],{"type":39,"tag":81,"props":187,"children":189},{"className":188},[],[190],{"type":45,"value":191},"references\u002Fconventions.md",{"type":45,"value":193}," — read it before Step 1 and apply it throughout. Each step below ends with a ",{"type":39,"tag":81,"props":195,"children":197},{"className":196},[],[198],{"type":45,"value":199},"↳ Checklist:",{"type":45,"value":201}," cue telling you what to flip.",{"type":39,"tag":203,"props":204,"children":205},"hr",{},[],{"type":39,"tag":139,"props":207,"children":209},{"id":208},"step-0-preflight-readiness-board",[210],{"type":45,"value":211},"Step 0 — Preflight (readiness board)",{"type":39,"tag":48,"props":213,"children":214},{},[215],{"type":45,"value":216},"Run this once, first, so the user sees the whole path before anything happens — which tools are\npresent, what's already detected, and what the flow will do (including that it opens the browser\nonce). It writes nothing and reveals no secret. Every invocation runs the full flow from Step 1 —\nthere is no resume\u002Fskip-ahead; a prior run is not reused.",{"type":39,"tag":146,"props":218,"children":221},{"className":219,"code":220,"language":99,"meta":154,"style":154},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","DDLOG=\"${TMPDIR:-\u002Ftmp}\u002Fdd-onboard-$(id -u).log\"; : >\"$DDLOG\"   # fresh log for this run\nmark(){ command -v \"$1\" >\u002Fdev\u002Fnull 2>&1 && echo \"✓\" || echo \"$2\"; }\n# python3 gates the auto browser-callback; fall back to python only if it's a real py3.\nhave_py3(){ command -v python3 >\u002Fdev\u002Fnull 2>&1 && return 0; command -v python >\u002Fdev\u002Fnull 2>&1 && python -c 'import sys;exit(0 if sys.version_info[0]==3 else 1)' 2>\u002Fdev\u002Fnull; }\npy3msg(){ have_py3 && echo '✓ (auto browser-callback)' || echo '⊘ (will paste the redirect URL)'; }\necho   \"Datadog account setup — preflight\"\necho   \"  deps (required):  bash ✓   curl $(mark curl ✗)   openssl $(mark openssl ✗)\"\necho   \"  deps (optional):  python3 $(py3msg)   browser-open $( { command -v open >\u002Fdev\u002Fnull 2>&1 || command -v xdg-open >\u002Fdev\u002Fnull 2>&1; } && echo ✓ || echo '⊘ (open URL manually)')\"\n# Canonical DD_* loader — this same block is repeated verbatim in later steps because each ```bash runs a fresh shell (not drift).\n# Load DD_* with precedence: shell env > .env.local > .env. A real env var is never overwritten; surrounding quotes are stripped. *_SRC records where each came from (unset ⇒ from the shell env).\nfor f in .env.local .env; do [ -f \"$f\" ] || continue; for k in DD_SITE DD_API_KEY DD_APP_KEY; do eval \"[ -n \\\"\\${$k:-}\\\" ]\" && continue; v=$(grep -E \"^$k=\" \"$f\" | head -1 | cut -d= -f2- | sed 's\u002F^[\"'\\'']\u002F\u002F;s\u002F[\"'\\'']$\u002F\u002F'); [ -n \"$v\" ] && { export \"$k=$v\"; eval \"${k}_SRC=$f\"; }; done; done\necho   \"  detected creds:   DD_SITE=${DD_SITE:-\u003Cunset>}${DD_SITE_SRC:+ [$DD_SITE_SRC]}   DD_API_KEY=$([ -n \"$DD_API_KEY\" ] && echo \"set …${DD_API_KEY: -4}${DD_API_KEY_SRC:+ [$DD_API_KEY_SRC]}\" || echo '\u003Cunset>')   DD_APP_KEY=$([ -n \"$DD_APP_KEY\" ] && echo \"set${DD_APP_KEY_SRC:+ [$DD_APP_KEY_SRC]}\" || echo '\u003Cunset>')\"\necho   \"  what happens:     confirm region → authenticate (opens your browser once) → get an API key → write it to .env → validate. ~2 min, one browser approval.\"\n[ \"$(mark curl ✗)\" = ✗ ] || [ \"$(mark openssl ✗)\" = ✗ ] && echo \"  ✗ missing a required dep above — install it before continuing.\"\n",[222],{"type":39,"tag":81,"props":223,"children":224},{"__ignoreMap":154},[225,340,447,456,584,652,676,733,867,876,885,1327,1624,1645],{"type":39,"tag":226,"props":227,"children":230},"span",{"class":228,"line":229},"line",1,[231,237,243,248,253,258,263,268,274,279,285,290,295,300,305,310,316,321,325,330,334],{"type":39,"tag":226,"props":232,"children":234},{"style":233},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[235],{"type":45,"value":236},"DDLOG",{"type":39,"tag":226,"props":238,"children":240},{"style":239},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[241],{"type":45,"value":242},"=",{"type":39,"tag":226,"props":244,"children":245},{"style":239},[246],{"type":45,"value":247},"\"${",{"type":39,"tag":226,"props":249,"children":250},{"style":233},[251],{"type":45,"value":252},"TMPDIR",{"type":39,"tag":226,"props":254,"children":255},{"style":239},[256],{"type":45,"value":257},":-\u002F",{"type":39,"tag":226,"props":259,"children":260},{"style":233},[261],{"type":45,"value":262},"tmp",{"type":39,"tag":226,"props":264,"children":265},{"style":239},[266],{"type":45,"value":267},"}",{"type":39,"tag":226,"props":269,"children":271},{"style":270},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[272],{"type":45,"value":273},"\u002Fdd-onboard-",{"type":39,"tag":226,"props":275,"children":276},{"style":239},[277],{"type":45,"value":278},"$(",{"type":39,"tag":226,"props":280,"children":282},{"style":281},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[283],{"type":45,"value":284},"id",{"type":39,"tag":226,"props":286,"children":287},{"style":270},[288],{"type":45,"value":289}," -u",{"type":39,"tag":226,"props":291,"children":292},{"style":239},[293],{"type":45,"value":294},")",{"type":39,"tag":226,"props":296,"children":297},{"style":270},[298],{"type":45,"value":299},".log",{"type":39,"tag":226,"props":301,"children":302},{"style":239},[303],{"type":45,"value":304},"\"",{"type":39,"tag":226,"props":306,"children":307},{"style":239},[308],{"type":45,"value":309},";",{"type":39,"tag":226,"props":311,"children":313},{"style":312},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[314],{"type":45,"value":315}," :",{"type":39,"tag":226,"props":317,"children":318},{"style":239},[319],{"type":45,"value":320}," >",{"type":39,"tag":226,"props":322,"children":323},{"style":239},[324],{"type":45,"value":304},{"type":39,"tag":226,"props":326,"children":327},{"style":233},[328],{"type":45,"value":329},"$DDLOG",{"type":39,"tag":226,"props":331,"children":332},{"style":239},[333],{"type":45,"value":304},{"type":39,"tag":226,"props":335,"children":337},{"style":336},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[338],{"type":45,"value":339},"   # fresh log for this run\n",{"type":39,"tag":226,"props":341,"children":343},{"class":228,"line":342},2,[344,349,354,359,364,369,375,379,383,388,393,398,403,407,412,416,421,425,429,434,438,442],{"type":39,"tag":226,"props":345,"children":346},{"style":312},[347],{"type":45,"value":348},"mark",{"type":39,"tag":226,"props":350,"children":351},{"style":239},[352],{"type":45,"value":353},"(){",{"type":39,"tag":226,"props":355,"children":356},{"style":312},[357],{"type":45,"value":358}," command",{"type":39,"tag":226,"props":360,"children":361},{"style":270},[362],{"type":45,"value":363}," -v",{"type":39,"tag":226,"props":365,"children":366},{"style":239},[367],{"type":45,"value":368}," \"",{"type":39,"tag":226,"props":370,"children":372},{"style":371},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic",[373],{"type":45,"value":374},"$1",{"type":39,"tag":226,"props":376,"children":377},{"style":239},[378],{"type":45,"value":304},{"type":39,"tag":226,"props":380,"children":381},{"style":239},[382],{"type":45,"value":320},{"type":39,"tag":226,"props":384,"children":385},{"style":270},[386],{"type":45,"value":387},"\u002Fdev\u002Fnull",{"type":39,"tag":226,"props":389,"children":390},{"style":239},[391],{"type":45,"value":392}," 2>&1",{"type":39,"tag":226,"props":394,"children":395},{"style":239},[396],{"type":45,"value":397}," &&",{"type":39,"tag":226,"props":399,"children":400},{"style":312},[401],{"type":45,"value":402}," echo",{"type":39,"tag":226,"props":404,"children":405},{"style":239},[406],{"type":45,"value":368},{"type":39,"tag":226,"props":408,"children":409},{"style":270},[410],{"type":45,"value":411},"✓",{"type":39,"tag":226,"props":413,"children":414},{"style":239},[415],{"type":45,"value":304},{"type":39,"tag":226,"props":417,"children":418},{"style":239},[419],{"type":45,"value":420}," ||",{"type":39,"tag":226,"props":422,"children":423},{"style":312},[424],{"type":45,"value":402},{"type":39,"tag":226,"props":426,"children":427},{"style":239},[428],{"type":45,"value":368},{"type":39,"tag":226,"props":430,"children":431},{"style":371},[432],{"type":45,"value":433},"$2",{"type":39,"tag":226,"props":435,"children":436},{"style":239},[437],{"type":45,"value":304},{"type":39,"tag":226,"props":439,"children":440},{"style":239},[441],{"type":45,"value":309},{"type":39,"tag":226,"props":443,"children":444},{"style":239},[445],{"type":45,"value":446}," }\n",{"type":39,"tag":226,"props":448,"children":450},{"class":228,"line":449},3,[451],{"type":39,"tag":226,"props":452,"children":453},{"style":336},[454],{"type":45,"value":455},"# python3 gates the auto browser-callback; fall back to python only if it's a real py3.\n",{"type":39,"tag":226,"props":457,"children":459},{"class":228,"line":458},4,[460,465,469,473,477,482,486,490,494,498,504,510,514,518,522,527,531,535,539,543,547,552,557,562,567,572,576,580],{"type":39,"tag":226,"props":461,"children":462},{"style":312},[463],{"type":45,"value":464},"have_py3",{"type":39,"tag":226,"props":466,"children":467},{"style":239},[468],{"type":45,"value":353},{"type":39,"tag":226,"props":470,"children":471},{"style":312},[472],{"type":45,"value":358},{"type":39,"tag":226,"props":474,"children":475},{"style":270},[476],{"type":45,"value":363},{"type":39,"tag":226,"props":478,"children":479},{"style":270},[480],{"type":45,"value":481}," python3",{"type":39,"tag":226,"props":483,"children":484},{"style":239},[485],{"type":45,"value":320},{"type":39,"tag":226,"props":487,"children":488},{"style":270},[489],{"type":45,"value":387},{"type":39,"tag":226,"props":491,"children":492},{"style":239},[493],{"type":45,"value":392},{"type":39,"tag":226,"props":495,"children":496},{"style":239},[497],{"type":45,"value":397},{"type":39,"tag":226,"props":499,"children":501},{"style":500},"--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic",[502],{"type":45,"value":503}," return",{"type":39,"tag":226,"props":505,"children":507},{"style":506},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[508],{"type":45,"value":509}," 0",{"type":39,"tag":226,"props":511,"children":512},{"style":239},[513],{"type":45,"value":309},{"type":39,"tag":226,"props":515,"children":516},{"style":312},[517],{"type":45,"value":358},{"type":39,"tag":226,"props":519,"children":520},{"style":270},[521],{"type":45,"value":363},{"type":39,"tag":226,"props":523,"children":524},{"style":270},[525],{"type":45,"value":526}," python",{"type":39,"tag":226,"props":528,"children":529},{"style":239},[530],{"type":45,"value":320},{"type":39,"tag":226,"props":532,"children":533},{"style":270},[534],{"type":45,"value":387},{"type":39,"tag":226,"props":536,"children":537},{"style":239},[538],{"type":45,"value":392},{"type":39,"tag":226,"props":540,"children":541},{"style":239},[542],{"type":45,"value":397},{"type":39,"tag":226,"props":544,"children":545},{"style":281},[546],{"type":45,"value":526},{"type":39,"tag":226,"props":548,"children":549},{"style":270},[550],{"type":45,"value":551}," -c",{"type":39,"tag":226,"props":553,"children":554},{"style":239},[555],{"type":45,"value":556}," '",{"type":39,"tag":226,"props":558,"children":559},{"style":270},[560],{"type":45,"value":561},"import sys;exit(0 if sys.version_info[0]==3 else 1)",{"type":39,"tag":226,"props":563,"children":564},{"style":239},[565],{"type":45,"value":566},"'",{"type":39,"tag":226,"props":568,"children":569},{"style":239},[570],{"type":45,"value":571}," 2>",{"type":39,"tag":226,"props":573,"children":574},{"style":270},[575],{"type":45,"value":387},{"type":39,"tag":226,"props":577,"children":578},{"style":239},[579],{"type":45,"value":309},{"type":39,"tag":226,"props":581,"children":582},{"style":239},[583],{"type":45,"value":446},{"type":39,"tag":226,"props":585,"children":587},{"class":228,"line":586},5,[588,593,597,602,606,610,614,619,623,627,631,635,640,644,648],{"type":39,"tag":226,"props":589,"children":590},{"style":312},[591],{"type":45,"value":592},"py3msg",{"type":39,"tag":226,"props":594,"children":595},{"style":239},[596],{"type":45,"value":353},{"type":39,"tag":226,"props":598,"children":599},{"style":281},[600],{"type":45,"value":601}," have_py3",{"type":39,"tag":226,"props":603,"children":604},{"style":239},[605],{"type":45,"value":397},{"type":39,"tag":226,"props":607,"children":608},{"style":312},[609],{"type":45,"value":402},{"type":39,"tag":226,"props":611,"children":612},{"style":239},[613],{"type":45,"value":556},{"type":39,"tag":226,"props":615,"children":616},{"style":270},[617],{"type":45,"value":618},"✓ (auto browser-callback)",{"type":39,"tag":226,"props":620,"children":621},{"style":239},[622],{"type":45,"value":566},{"type":39,"tag":226,"props":624,"children":625},{"style":239},[626],{"type":45,"value":420},{"type":39,"tag":226,"props":628,"children":629},{"style":312},[630],{"type":45,"value":402},{"type":39,"tag":226,"props":632,"children":633},{"style":239},[634],{"type":45,"value":556},{"type":39,"tag":226,"props":636,"children":637},{"style":270},[638],{"type":45,"value":639},"⊘ (will paste the redirect URL)",{"type":39,"tag":226,"props":641,"children":642},{"style":239},[643],{"type":45,"value":566},{"type":39,"tag":226,"props":645,"children":646},{"style":239},[647],{"type":45,"value":309},{"type":39,"tag":226,"props":649,"children":650},{"style":239},[651],{"type":45,"value":446},{"type":39,"tag":226,"props":653,"children":655},{"class":228,"line":654},6,[656,661,666,671],{"type":39,"tag":226,"props":657,"children":658},{"style":312},[659],{"type":45,"value":660},"echo",{"type":39,"tag":226,"props":662,"children":663},{"style":239},[664],{"type":45,"value":665},"   \"",{"type":39,"tag":226,"props":667,"children":668},{"style":270},[669],{"type":45,"value":670},"Datadog account setup — preflight",{"type":39,"tag":226,"props":672,"children":673},{"style":239},[674],{"type":45,"value":675},"\"\n",{"type":39,"tag":226,"props":677,"children":679},{"class":228,"line":678},7,[680,684,688,693,697,701,706,710,715,719,723,728],{"type":39,"tag":226,"props":681,"children":682},{"style":312},[683],{"type":45,"value":660},{"type":39,"tag":226,"props":685,"children":686},{"style":239},[687],{"type":45,"value":665},{"type":39,"tag":226,"props":689,"children":690},{"style":270},[691],{"type":45,"value":692},"  deps (required):  bash ✓   curl ",{"type":39,"tag":226,"props":694,"children":695},{"style":239},[696],{"type":45,"value":278},{"type":39,"tag":226,"props":698,"children":699},{"style":281},[700],{"type":45,"value":348},{"type":39,"tag":226,"props":702,"children":703},{"style":270},[704],{"type":45,"value":705}," curl ✗",{"type":39,"tag":226,"props":707,"children":708},{"style":239},[709],{"type":45,"value":294},{"type":39,"tag":226,"props":711,"children":712},{"style":270},[713],{"type":45,"value":714},"   openssl ",{"type":39,"tag":226,"props":716,"children":717},{"style":239},[718],{"type":45,"value":278},{"type":39,"tag":226,"props":720,"children":721},{"style":281},[722],{"type":45,"value":348},{"type":39,"tag":226,"props":724,"children":725},{"style":270},[726],{"type":45,"value":727}," openssl ✗",{"type":39,"tag":226,"props":729,"children":730},{"style":239},[731],{"type":45,"value":732},")\"\n",{"type":39,"tag":226,"props":734,"children":736},{"class":228,"line":735},8,[737,741,745,750,754,758,762,767,771,776,780,785,790,795,800,804,808,813,817,821,826,831,835,839,844,849,853,857,862],{"type":39,"tag":226,"props":738,"children":739},{"style":312},[740],{"type":45,"value":660},{"type":39,"tag":226,"props":742,"children":743},{"style":239},[744],{"type":45,"value":665},{"type":39,"tag":226,"props":746,"children":747},{"style":270},[748],{"type":45,"value":749},"  deps (optional):  python3 ",{"type":39,"tag":226,"props":751,"children":752},{"style":239},[753],{"type":45,"value":278},{"type":39,"tag":226,"props":755,"children":756},{"style":281},[757],{"type":45,"value":592},{"type":39,"tag":226,"props":759,"children":760},{"style":239},[761],{"type":45,"value":294},{"type":39,"tag":226,"props":763,"children":764},{"style":270},[765],{"type":45,"value":766},"   browser-open ",{"type":39,"tag":226,"props":768,"children":769},{"style":239},[770],{"type":45,"value":278},{"type":39,"tag":226,"props":772,"children":773},{"style":239},[774],{"type":45,"value":775}," {",{"type":39,"tag":226,"props":777,"children":778},{"style":312},[779],{"type":45,"value":358},{"type":39,"tag":226,"props":781,"children":782},{"style":270},[783],{"type":45,"value":784}," -v open ",{"type":39,"tag":226,"props":786,"children":787},{"style":239},[788],{"type":45,"value":789},">",{"type":39,"tag":226,"props":791,"children":792},{"style":270},[793],{"type":45,"value":794},"\u002Fdev\u002Fnull ",{"type":39,"tag":226,"props":796,"children":797},{"style":239},[798],{"type":45,"value":799},"2>&1",{"type":39,"tag":226,"props":801,"children":802},{"style":239},[803],{"type":45,"value":420},{"type":39,"tag":226,"props":805,"children":806},{"style":312},[807],{"type":45,"value":358},{"type":39,"tag":226,"props":809,"children":810},{"style":270},[811],{"type":45,"value":812}," -v xdg-open ",{"type":39,"tag":226,"props":814,"children":815},{"style":239},[816],{"type":45,"value":789},{"type":39,"tag":226,"props":818,"children":819},{"style":270},[820],{"type":45,"value":794},{"type":39,"tag":226,"props":822,"children":823},{"style":239},[824],{"type":45,"value":825},"2>&1;",{"type":39,"tag":226,"props":827,"children":828},{"style":239},[829],{"type":45,"value":830}," }",{"type":39,"tag":226,"props":832,"children":833},{"style":239},[834],{"type":45,"value":397},{"type":39,"tag":226,"props":836,"children":837},{"style":312},[838],{"type":45,"value":402},{"type":39,"tag":226,"props":840,"children":841},{"style":270},[842],{"type":45,"value":843}," ✓ ",{"type":39,"tag":226,"props":845,"children":846},{"style":239},[847],{"type":45,"value":848},"||",{"type":39,"tag":226,"props":850,"children":851},{"style":312},[852],{"type":45,"value":402},{"type":39,"tag":226,"props":854,"children":855},{"style":239},[856],{"type":45,"value":556},{"type":39,"tag":226,"props":858,"children":859},{"style":270},[860],{"type":45,"value":861},"⊘ (open URL manually)",{"type":39,"tag":226,"props":863,"children":864},{"style":239},[865],{"type":45,"value":866},"')\"\n",{"type":39,"tag":226,"props":868,"children":870},{"class":228,"line":869},9,[871],{"type":39,"tag":226,"props":872,"children":873},{"style":336},[874],{"type":45,"value":875},"# Canonical DD_* loader — this same block is repeated verbatim in later steps because each ```bash runs a fresh shell (not drift).\n",{"type":39,"tag":226,"props":877,"children":879},{"class":228,"line":878},10,[880],{"type":39,"tag":226,"props":881,"children":882},{"style":336},[883],{"type":45,"value":884},"# Load DD_* with precedence: shell env > .env.local > .env. A real env var is never overwritten; surrounding quotes are stripped. *_SRC records where each came from (unset ⇒ from the shell env).\n",{"type":39,"tag":226,"props":886,"children":888},{"class":228,"line":887},11,[889,894,899,904,909,914,918,923,928,933,937,942,946,951,955,960,964,969,974,978,983,988,993,997,1001,1006,1010,1015,1020,1025,1030,1035,1040,1044,1048,1052,1056,1060,1065,1070,1075,1080,1084,1089,1093,1097,1101,1105,1109,1113,1118,1123,1128,1132,1137,1142,1147,1151,1156,1160,1165,1169,1174,1178,1183,1187,1191,1195,1200,1204,1209,1213,1218,1222,1227,1231,1235,1239,1243,1249,1253,1257,1261,1265,1269,1273,1277,1282,1287,1291,1296,1300,1304,1308,1313,1318,1322],{"type":39,"tag":226,"props":890,"children":891},{"style":500},[892],{"type":45,"value":893},"for",{"type":39,"tag":226,"props":895,"children":896},{"style":233},[897],{"type":45,"value":898}," f ",{"type":39,"tag":226,"props":900,"children":901},{"style":500},[902],{"type":45,"value":903},"in",{"type":39,"tag":226,"props":905,"children":906},{"style":270},[907],{"type":45,"value":908}," .env.local",{"type":39,"tag":226,"props":910,"children":911},{"style":270},[912],{"type":45,"value":913}," .env",{"type":39,"tag":226,"props":915,"children":916},{"style":239},[917],{"type":45,"value":309},{"type":39,"tag":226,"props":919,"children":920},{"style":500},[921],{"type":45,"value":922}," do",{"type":39,"tag":226,"props":924,"children":925},{"style":239},[926],{"type":45,"value":927}," [",{"type":39,"tag":226,"props":929,"children":930},{"style":239},[931],{"type":45,"value":932}," -f",{"type":39,"tag":226,"props":934,"children":935},{"style":239},[936],{"type":45,"value":368},{"type":39,"tag":226,"props":938,"children":939},{"style":233},[940],{"type":45,"value":941},"$f",{"type":39,"tag":226,"props":943,"children":944},{"style":239},[945],{"type":45,"value":304},{"type":39,"tag":226,"props":947,"children":948},{"style":239},[949],{"type":45,"value":950}," ]",{"type":39,"tag":226,"props":952,"children":953},{"style":239},[954],{"type":45,"value":420},{"type":39,"tag":226,"props":956,"children":957},{"style":500},[958],{"type":45,"value":959}," continue",{"type":39,"tag":226,"props":961,"children":962},{"style":239},[963],{"type":45,"value":309},{"type":39,"tag":226,"props":965,"children":966},{"style":500},[967],{"type":45,"value":968}," for",{"type":39,"tag":226,"props":970,"children":971},{"style":233},[972],{"type":45,"value":973}," k ",{"type":39,"tag":226,"props":975,"children":976},{"style":500},[977],{"type":45,"value":903},{"type":39,"tag":226,"props":979,"children":980},{"style":270},[981],{"type":45,"value":982}," DD_SITE",{"type":39,"tag":226,"props":984,"children":985},{"style":270},[986],{"type":45,"value":987}," DD_API_KEY",{"type":39,"tag":226,"props":989,"children":990},{"style":270},[991],{"type":45,"value":992}," DD_APP_KEY",{"type":39,"tag":226,"props":994,"children":995},{"style":239},[996],{"type":45,"value":309},{"type":39,"tag":226,"props":998,"children":999},{"style":500},[1000],{"type":45,"value":922},{"type":39,"tag":226,"props":1002,"children":1003},{"style":312},[1004],{"type":45,"value":1005}," eval",{"type":39,"tag":226,"props":1007,"children":1008},{"style":239},[1009],{"type":45,"value":368},{"type":39,"tag":226,"props":1011,"children":1012},{"style":270},[1013],{"type":45,"value":1014},"[ -n ",{"type":39,"tag":226,"props":1016,"children":1017},{"style":233},[1018],{"type":45,"value":1019},"\\\"\\$",{"type":39,"tag":226,"props":1021,"children":1022},{"style":270},[1023],{"type":45,"value":1024},"{",{"type":39,"tag":226,"props":1026,"children":1027},{"style":233},[1028],{"type":45,"value":1029},"$k",{"type":39,"tag":226,"props":1031,"children":1032},{"style":270},[1033],{"type":45,"value":1034},":-}",{"type":39,"tag":226,"props":1036,"children":1037},{"style":233},[1038],{"type":45,"value":1039},"\\\"",{"type":39,"tag":226,"props":1041,"children":1042},{"style":270},[1043],{"type":45,"value":950},{"type":39,"tag":226,"props":1045,"children":1046},{"style":239},[1047],{"type":45,"value":304},{"type":39,"tag":226,"props":1049,"children":1050},{"style":239},[1051],{"type":45,"value":397},{"type":39,"tag":226,"props":1053,"children":1054},{"style":500},[1055],{"type":45,"value":959},{"type":39,"tag":226,"props":1057,"children":1058},{"style":239},[1059],{"type":45,"value":309},{"type":39,"tag":226,"props":1061,"children":1062},{"style":233},[1063],{"type":45,"value":1064}," v",{"type":39,"tag":226,"props":1066,"children":1067},{"style":239},[1068],{"type":45,"value":1069},"=$(",{"type":39,"tag":226,"props":1071,"children":1072},{"style":281},[1073],{"type":45,"value":1074},"grep",{"type":39,"tag":226,"props":1076,"children":1077},{"style":270},[1078],{"type":45,"value":1079}," -E",{"type":39,"tag":226,"props":1081,"children":1082},{"style":239},[1083],{"type":45,"value":368},{"type":39,"tag":226,"props":1085,"children":1086},{"style":270},[1087],{"type":45,"value":1088},"^",{"type":39,"tag":226,"props":1090,"children":1091},{"style":233},[1092],{"type":45,"value":1029},{"type":39,"tag":226,"props":1094,"children":1095},{"style":270},[1096],{"type":45,"value":242},{"type":39,"tag":226,"props":1098,"children":1099},{"style":239},[1100],{"type":45,"value":304},{"type":39,"tag":226,"props":1102,"children":1103},{"style":239},[1104],{"type":45,"value":368},{"type":39,"tag":226,"props":1106,"children":1107},{"style":233},[1108],{"type":45,"value":941},{"type":39,"tag":226,"props":1110,"children":1111},{"style":239},[1112],{"type":45,"value":304},{"type":39,"tag":226,"props":1114,"children":1115},{"style":239},[1116],{"type":45,"value":1117}," |",{"type":39,"tag":226,"props":1119,"children":1120},{"style":281},[1121],{"type":45,"value":1122}," head",{"type":39,"tag":226,"props":1124,"children":1125},{"style":270},[1126],{"type":45,"value":1127}," -1",{"type":39,"tag":226,"props":1129,"children":1130},{"style":239},[1131],{"type":45,"value":1117},{"type":39,"tag":226,"props":1133,"children":1134},{"style":281},[1135],{"type":45,"value":1136}," cut",{"type":39,"tag":226,"props":1138,"children":1139},{"style":270},[1140],{"type":45,"value":1141}," -d=",{"type":39,"tag":226,"props":1143,"children":1144},{"style":270},[1145],{"type":45,"value":1146}," -f2-",{"type":39,"tag":226,"props":1148,"children":1149},{"style":239},[1150],{"type":45,"value":1117},{"type":39,"tag":226,"props":1152,"children":1153},{"style":281},[1154],{"type":45,"value":1155}," sed",{"type":39,"tag":226,"props":1157,"children":1158},{"style":239},[1159],{"type":45,"value":556},{"type":39,"tag":226,"props":1161,"children":1162},{"style":270},[1163],{"type":45,"value":1164},"s\u002F^[\"",{"type":39,"tag":226,"props":1166,"children":1167},{"style":239},[1168],{"type":45,"value":566},{"type":39,"tag":226,"props":1170,"children":1171},{"style":233},[1172],{"type":45,"value":1173},"\\'",{"type":39,"tag":226,"props":1175,"children":1176},{"style":239},[1177],{"type":45,"value":566},{"type":39,"tag":226,"props":1179,"children":1180},{"style":270},[1181],{"type":45,"value":1182},"]\u002F\u002F;s\u002F[\"",{"type":39,"tag":226,"props":1184,"children":1185},{"style":239},[1186],{"type":45,"value":566},{"type":39,"tag":226,"props":1188,"children":1189},{"style":233},[1190],{"type":45,"value":1173},{"type":39,"tag":226,"props":1192,"children":1193},{"style":239},[1194],{"type":45,"value":566},{"type":39,"tag":226,"props":1196,"children":1197},{"style":270},[1198],{"type":45,"value":1199},"]$\u002F\u002F",{"type":39,"tag":226,"props":1201,"children":1202},{"style":239},[1203],{"type":45,"value":566},{"type":39,"tag":226,"props":1205,"children":1206},{"style":239},[1207],{"type":45,"value":1208},");",{"type":39,"tag":226,"props":1210,"children":1211},{"style":239},[1212],{"type":45,"value":927},{"type":39,"tag":226,"props":1214,"children":1215},{"style":239},[1216],{"type":45,"value":1217}," -n",{"type":39,"tag":226,"props":1219,"children":1220},{"style":239},[1221],{"type":45,"value":368},{"type":39,"tag":226,"props":1223,"children":1224},{"style":233},[1225],{"type":45,"value":1226},"$v",{"type":39,"tag":226,"props":1228,"children":1229},{"style":239},[1230],{"type":45,"value":304},{"type":39,"tag":226,"props":1232,"children":1233},{"style":239},[1234],{"type":45,"value":950},{"type":39,"tag":226,"props":1236,"children":1237},{"style":239},[1238],{"type":45,"value":397},{"type":39,"tag":226,"props":1240,"children":1241},{"style":239},[1242],{"type":45,"value":775},{"type":39,"tag":226,"props":1244,"children":1246},{"style":1245},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[1247],{"type":45,"value":1248}," export",{"type":39,"tag":226,"props":1250,"children":1251},{"style":239},[1252],{"type":45,"value":368},{"type":39,"tag":226,"props":1254,"children":1255},{"style":233},[1256],{"type":45,"value":1029},{"type":39,"tag":226,"props":1258,"children":1259},{"style":270},[1260],{"type":45,"value":242},{"type":39,"tag":226,"props":1262,"children":1263},{"style":233},[1264],{"type":45,"value":1226},{"type":39,"tag":226,"props":1266,"children":1267},{"style":239},[1268],{"type":45,"value":304},{"type":39,"tag":226,"props":1270,"children":1271},{"style":239},[1272],{"type":45,"value":309},{"type":39,"tag":226,"props":1274,"children":1275},{"style":312},[1276],{"type":45,"value":1005},{"type":39,"tag":226,"props":1278,"children":1279},{"style":239},[1280],{"type":45,"value":1281}," \"${",{"type":39,"tag":226,"props":1283,"children":1284},{"style":233},[1285],{"type":45,"value":1286},"k",{"type":39,"tag":226,"props":1288,"children":1289},{"style":239},[1290],{"type":45,"value":267},{"type":39,"tag":226,"props":1292,"children":1293},{"style":270},[1294],{"type":45,"value":1295},"_SRC=",{"type":39,"tag":226,"props":1297,"children":1298},{"style":233},[1299],{"type":45,"value":941},{"type":39,"tag":226,"props":1301,"children":1302},{"style":239},[1303],{"type":45,"value":304},{"type":39,"tag":226,"props":1305,"children":1306},{"style":239},[1307],{"type":45,"value":309},{"type":39,"tag":226,"props":1309,"children":1310},{"style":239},[1311],{"type":45,"value":1312}," };",{"type":39,"tag":226,"props":1314,"children":1315},{"style":500},[1316],{"type":45,"value":1317}," done",{"type":39,"tag":226,"props":1319,"children":1320},{"style":239},[1321],{"type":45,"value":309},{"type":39,"tag":226,"props":1323,"children":1324},{"style":500},[1325],{"type":45,"value":1326}," done\n",{"type":39,"tag":226,"props":1328,"children":1330},{"class":228,"line":1329},12,[1331,1335,1339,1344,1349,1354,1359,1364,1369,1373,1378,1383,1388,1393,1398,1403,1408,1413,1418,1422,1426,1431,1435,1439,1443,1447,1451,1456,1460,1465,1469,1474,1478,1483,1487,1491,1495,1500,1505,1509,1513,1517,1522,1527,1532,1536,1540,1544,1549,1553,1557,1561,1565,1569,1574,1578,1583,1587,1591,1595,1600,1604,1608,1612,1616,1620],{"type":39,"tag":226,"props":1332,"children":1333},{"style":312},[1334],{"type":45,"value":660},{"type":39,"tag":226,"props":1336,"children":1337},{"style":239},[1338],{"type":45,"value":665},{"type":39,"tag":226,"props":1340,"children":1341},{"style":270},[1342],{"type":45,"value":1343},"  detected creds:   DD_SITE=",{"type":39,"tag":226,"props":1345,"children":1346},{"style":239},[1347],{"type":45,"value":1348},"${",{"type":39,"tag":226,"props":1350,"children":1351},{"style":233},[1352],{"type":45,"value":1353},"DD_SITE",{"type":39,"tag":226,"props":1355,"children":1356},{"style":239},[1357],{"type":45,"value":1358},":-",{"type":39,"tag":226,"props":1360,"children":1361},{"style":270},[1362],{"type":45,"value":1363},"\u003C",{"type":39,"tag":226,"props":1365,"children":1366},{"style":233},[1367],{"type":45,"value":1368},"unset",{"type":39,"tag":226,"props":1370,"children":1371},{"style":270},[1372],{"type":45,"value":789},{"type":39,"tag":226,"props":1374,"children":1375},{"style":239},[1376],{"type":45,"value":1377},"}${",{"type":39,"tag":226,"props":1379,"children":1380},{"style":233},[1381],{"type":45,"value":1382},"DD_SITE_SRC",{"type":39,"tag":226,"props":1384,"children":1385},{"style":239},[1386],{"type":45,"value":1387},":",{"type":39,"tag":226,"props":1389,"children":1390},{"style":270},[1391],{"type":45,"value":1392},"+ ",{"type":39,"tag":226,"props":1394,"children":1395},{"style":239},[1396],{"type":45,"value":1397},"[",{"type":39,"tag":226,"props":1399,"children":1400},{"style":233},[1401],{"type":45,"value":1402},"$DD_SITE_SRC",{"type":39,"tag":226,"props":1404,"children":1405},{"style":239},[1406],{"type":45,"value":1407},"]}",{"type":39,"tag":226,"props":1409,"children":1410},{"style":270},[1411],{"type":45,"value":1412},"   DD_API_KEY=",{"type":39,"tag":226,"props":1414,"children":1415},{"style":239},[1416],{"type":45,"value":1417},"$([",{"type":39,"tag":226,"props":1419,"children":1420},{"style":239},[1421],{"type":45,"value":1217},{"type":39,"tag":226,"props":1423,"children":1424},{"style":239},[1425],{"type":45,"value":368},{"type":39,"tag":226,"props":1427,"children":1428},{"style":233},[1429],{"type":45,"value":1430},"$DD_API_KEY",{"type":39,"tag":226,"props":1432,"children":1433},{"style":239},[1434],{"type":45,"value":304},{"type":39,"tag":226,"props":1436,"children":1437},{"style":239},[1438],{"type":45,"value":950},{"type":39,"tag":226,"props":1440,"children":1441},{"style":239},[1442],{"type":45,"value":397},{"type":39,"tag":226,"props":1444,"children":1445},{"style":312},[1446],{"type":45,"value":402},{"type":39,"tag":226,"props":1448,"children":1449},{"style":239},[1450],{"type":45,"value":368},{"type":39,"tag":226,"props":1452,"children":1453},{"style":270},[1454],{"type":45,"value":1455},"set …",{"type":39,"tag":226,"props":1457,"children":1458},{"style":239},[1459],{"type":45,"value":1348},{"type":39,"tag":226,"props":1461,"children":1462},{"style":233},[1463],{"type":45,"value":1464},"DD_API_KEY",{"type":39,"tag":226,"props":1466,"children":1467},{"style":239},[1468],{"type":45,"value":1387},{"type":39,"tag":226,"props":1470,"children":1471},{"style":233},[1472],{"type":45,"value":1473}," -4",{"type":39,"tag":226,"props":1475,"children":1476},{"style":239},[1477],{"type":45,"value":1377},{"type":39,"tag":226,"props":1479,"children":1480},{"style":233},[1481],{"type":45,"value":1482},"DD_API_KEY_SRC",{"type":39,"tag":226,"props":1484,"children":1485},{"style":239},[1486],{"type":45,"value":1387},{"type":39,"tag":226,"props":1488,"children":1489},{"style":270},[1490],{"type":45,"value":1392},{"type":39,"tag":226,"props":1492,"children":1493},{"style":239},[1494],{"type":45,"value":1397},{"type":39,"tag":226,"props":1496,"children":1497},{"style":233},[1498],{"type":45,"value":1499},"$DD_API_KEY_SRC",{"type":39,"tag":226,"props":1501,"children":1502},{"style":239},[1503],{"type":45,"value":1504},"]}\"",{"type":39,"tag":226,"props":1506,"children":1507},{"style":239},[1508],{"type":45,"value":420},{"type":39,"tag":226,"props":1510,"children":1511},{"style":312},[1512],{"type":45,"value":402},{"type":39,"tag":226,"props":1514,"children":1515},{"style":239},[1516],{"type":45,"value":556},{"type":39,"tag":226,"props":1518,"children":1519},{"style":270},[1520],{"type":45,"value":1521},"\u003Cunset>",{"type":39,"tag":226,"props":1523,"children":1524},{"style":239},[1525],{"type":45,"value":1526},"')",{"type":39,"tag":226,"props":1528,"children":1529},{"style":270},[1530],{"type":45,"value":1531},"   DD_APP_KEY=",{"type":39,"tag":226,"props":1533,"children":1534},{"style":239},[1535],{"type":45,"value":1417},{"type":39,"tag":226,"props":1537,"children":1538},{"style":239},[1539],{"type":45,"value":1217},{"type":39,"tag":226,"props":1541,"children":1542},{"style":239},[1543],{"type":45,"value":368},{"type":39,"tag":226,"props":1545,"children":1546},{"style":233},[1547],{"type":45,"value":1548},"$DD_APP_KEY",{"type":39,"tag":226,"props":1550,"children":1551},{"style":239},[1552],{"type":45,"value":304},{"type":39,"tag":226,"props":1554,"children":1555},{"style":239},[1556],{"type":45,"value":950},{"type":39,"tag":226,"props":1558,"children":1559},{"style":239},[1560],{"type":45,"value":397},{"type":39,"tag":226,"props":1562,"children":1563},{"style":312},[1564],{"type":45,"value":402},{"type":39,"tag":226,"props":1566,"children":1567},{"style":239},[1568],{"type":45,"value":368},{"type":39,"tag":226,"props":1570,"children":1571},{"style":270},[1572],{"type":45,"value":1573},"set",{"type":39,"tag":226,"props":1575,"children":1576},{"style":239},[1577],{"type":45,"value":1348},{"type":39,"tag":226,"props":1579,"children":1580},{"style":233},[1581],{"type":45,"value":1582},"DD_APP_KEY_SRC",{"type":39,"tag":226,"props":1584,"children":1585},{"style":239},[1586],{"type":45,"value":1387},{"type":39,"tag":226,"props":1588,"children":1589},{"style":270},[1590],{"type":45,"value":1392},{"type":39,"tag":226,"props":1592,"children":1593},{"style":239},[1594],{"type":45,"value":1397},{"type":39,"tag":226,"props":1596,"children":1597},{"style":233},[1598],{"type":45,"value":1599},"$DD_APP_KEY_SRC",{"type":39,"tag":226,"props":1601,"children":1602},{"style":239},[1603],{"type":45,"value":1504},{"type":39,"tag":226,"props":1605,"children":1606},{"style":239},[1607],{"type":45,"value":420},{"type":39,"tag":226,"props":1609,"children":1610},{"style":312},[1611],{"type":45,"value":402},{"type":39,"tag":226,"props":1613,"children":1614},{"style":239},[1615],{"type":45,"value":556},{"type":39,"tag":226,"props":1617,"children":1618},{"style":270},[1619],{"type":45,"value":1521},{"type":39,"tag":226,"props":1621,"children":1622},{"style":239},[1623],{"type":45,"value":866},{"type":39,"tag":226,"props":1625,"children":1627},{"class":228,"line":1626},13,[1628,1632,1636,1641],{"type":39,"tag":226,"props":1629,"children":1630},{"style":312},[1631],{"type":45,"value":660},{"type":39,"tag":226,"props":1633,"children":1634},{"style":239},[1635],{"type":45,"value":665},{"type":39,"tag":226,"props":1637,"children":1638},{"style":270},[1639],{"type":45,"value":1640},"  what happens:     confirm region → authenticate (opens your browser once) → get an API key → write it to .env → validate. ~2 min, one browser approval.",{"type":39,"tag":226,"props":1642,"children":1643},{"style":239},[1644],{"type":45,"value":675},{"type":39,"tag":226,"props":1646,"children":1648},{"class":228,"line":1647},14,[1649,1653,1658,1662,1666,1671,1676,1681,1686,1690,1694,1698,1702,1706,1710,1714,1718,1722,1726,1730,1734,1739],{"type":39,"tag":226,"props":1650,"children":1651},{"style":239},[1652],{"type":45,"value":1397},{"type":39,"tag":226,"props":1654,"children":1655},{"style":239},[1656],{"type":45,"value":1657}," \"$(",{"type":39,"tag":226,"props":1659,"children":1660},{"style":281},[1661],{"type":45,"value":348},{"type":39,"tag":226,"props":1663,"children":1664},{"style":270},[1665],{"type":45,"value":705},{"type":39,"tag":226,"props":1667,"children":1668},{"style":239},[1669],{"type":45,"value":1670},")\"",{"type":39,"tag":226,"props":1672,"children":1673},{"style":239},[1674],{"type":45,"value":1675}," =",{"type":39,"tag":226,"props":1677,"children":1678},{"style":233},[1679],{"type":45,"value":1680}," ✗ ",{"type":39,"tag":226,"props":1682,"children":1683},{"style":239},[1684],{"type":45,"value":1685},"]",{"type":39,"tag":226,"props":1687,"children":1688},{"style":239},[1689],{"type":45,"value":420},{"type":39,"tag":226,"props":1691,"children":1692},{"style":239},[1693],{"type":45,"value":927},{"type":39,"tag":226,"props":1695,"children":1696},{"style":239},[1697],{"type":45,"value":1657},{"type":39,"tag":226,"props":1699,"children":1700},{"style":281},[1701],{"type":45,"value":348},{"type":39,"tag":226,"props":1703,"children":1704},{"style":270},[1705],{"type":45,"value":727},{"type":39,"tag":226,"props":1707,"children":1708},{"style":239},[1709],{"type":45,"value":1670},{"type":39,"tag":226,"props":1711,"children":1712},{"style":239},[1713],{"type":45,"value":1675},{"type":39,"tag":226,"props":1715,"children":1716},{"style":233},[1717],{"type":45,"value":1680},{"type":39,"tag":226,"props":1719,"children":1720},{"style":239},[1721],{"type":45,"value":1685},{"type":39,"tag":226,"props":1723,"children":1724},{"style":239},[1725],{"type":45,"value":397},{"type":39,"tag":226,"props":1727,"children":1728},{"style":312},[1729],{"type":45,"value":402},{"type":39,"tag":226,"props":1731,"children":1732},{"style":239},[1733],{"type":45,"value":368},{"type":39,"tag":226,"props":1735,"children":1736},{"style":270},[1737],{"type":45,"value":1738},"  ✗ missing a required dep above — install it before continuing.",{"type":39,"tag":226,"props":1740,"children":1741},{"style":239},[1742],{"type":45,"value":675},{"type":39,"tag":48,"props":1744,"children":1745},{},[1746,1748,1753],{"type":45,"value":1747},"Read the board to the user as-is (it's already clean). If a ",{"type":39,"tag":54,"props":1749,"children":1750},{},[1751],{"type":45,"value":1752},"required",{"type":45,"value":1754}," dep is missing, stop and\nsay so. Then tick the checklist's step 1 and move on — always continue into Step 1; never skip\nahead to a later step.",{"type":39,"tag":1756,"props":1757,"children":1758},"blockquote",{},[1759],{"type":39,"tag":48,"props":1760,"children":1761},{},[1762,1764,1769,1771,1776],{"type":45,"value":1763},"↳ ",{"type":39,"tag":54,"props":1765,"children":1766},{},[1767],{"type":45,"value":1768},"Checklist:",{"type":45,"value":1770}," post the board, then the checklist; mark ",{"type":39,"tag":54,"props":1772,"children":1773},{},[1774],{"type":45,"value":1775},"1. Detect credentials",{"type":45,"value":1777}," ◔.",{"type":39,"tag":203,"props":1779,"children":1780},{},[],{"type":39,"tag":139,"props":1782,"children":1784},{"id":1783},"step-h-headless-non-interactive-no-browser-no-prompts",[1785],{"type":45,"value":1786},"Step H — Headless \u002F non-interactive (no browser, no prompts)",{"type":39,"tag":48,"props":1788,"children":1789},{},[1790,1792,1797],{"type":45,"value":1791},"Decide this first, because the browser + signup paths are impossible without a human. ",{"type":39,"tag":54,"props":1793,"children":1794},{},[1795],{"type":45,"value":1796},"Infer\nheadless from the skill's invocation, not from the environment",{"type":45,"value":1798}," — the trigger is the user's\nrequest itself: they explicitly ask to run without a browser or without interactive prompts\n(e.g. \"set up Datadog non-interactively\", \"I'm in CI, no browser\").",{"type":39,"tag":48,"props":1800,"children":1801},{},[1802,1804,1809],{"type":45,"value":1803},"Do ",{"type":39,"tag":54,"props":1805,"children":1806},{},[1807],{"type":45,"value":1808},"not",{"type":45,"value":1810}," infer headless merely from a missing TTY — an ordinary terminal run always gets the\ninteractive flow. Only an explicit request switches it off.",{"type":39,"tag":48,"props":1812,"children":1813},{},[1814,1816,1821,1823,1829,1831,1836],{"type":45,"value":1815},"When you've inferred a headless request, run the block below — and only then. There's no browser\nfor OAuth and no human to answer the signup prompts, so the one way to a valid state is with keys\nalready provided. Require ",{"type":39,"tag":81,"props":1817,"children":1819},{"className":1818},[],[1820],{"type":45,"value":1464},{"type":45,"value":1822},", ",{"type":39,"tag":81,"props":1824,"children":1826},{"className":1825},[],[1827],{"type":45,"value":1828},"DD_APP_KEY",{"type":45,"value":1830},", and ",{"type":39,"tag":81,"props":1832,"children":1834},{"className":1833},[],[1835],{"type":45,"value":1353},{"type":45,"value":1837},", and fail fast otherwise:",{"type":39,"tag":146,"props":1839,"children":1841},{"className":219,"code":1840,"language":99,"meta":154,"style":154},"# Run this block ONLY when you inferred a non-interactive request. It enforces the one thing\n# headless needs — keys already present — and fails fast when any are missing.\n# Load DD_* (env > .env.local > .env), same precedence as Step 1 — CI keys often live in .env, not exported.\nfor f in .env.local .env; do [ -f \"$f\" ] || continue; for k in DD_SITE DD_API_KEY DD_APP_KEY; do eval \"[ -n \\\"\\${$k:-}\\\" ]\" && continue; v=$(grep -E \"^$k=\" \"$f\" | head -1 | cut -d= -f2- | sed 's\u002F^[\"'\\'']\u002F\u002F;s\u002F[\"'\\'']$\u002F\u002F'); [ -n \"$v\" ] && export \"$k=$v\"; done; done\nmissing=\"\"\n[ -z \"$DD_API_KEY\" ] && missing=\"$missing DD_API_KEY\"\n[ -z \"$DD_APP_KEY\" ] && missing=\"$missing DD_APP_KEY\"\n[ -z \"$DD_SITE\" ]    && missing=\"$missing DD_SITE\"\n[ -n \"$missing\" ] && { echo \"Non-interactive mode requires:$missing — set them and re-run. Sign-in and trial signup need a browser.\"; exit 1; }\n",[1842],{"type":39,"tag":81,"props":1843,"children":1844},{"__ignoreMap":154},[1845,1853,1861,1869,2220,2237,2295,2350,2407],{"type":39,"tag":226,"props":1846,"children":1847},{"class":228,"line":229},[1848],{"type":39,"tag":226,"props":1849,"children":1850},{"style":336},[1851],{"type":45,"value":1852},"# Run this block ONLY when you inferred a non-interactive request. It enforces the one thing\n",{"type":39,"tag":226,"props":1854,"children":1855},{"class":228,"line":342},[1856],{"type":39,"tag":226,"props":1857,"children":1858},{"style":336},[1859],{"type":45,"value":1860},"# headless needs — keys already present — and fails fast when any are missing.\n",{"type":39,"tag":226,"props":1862,"children":1863},{"class":228,"line":449},[1864],{"type":39,"tag":226,"props":1865,"children":1866},{"style":336},[1867],{"type":45,"value":1868},"# Load DD_* (env > .env.local > .env), same precedence as Step 1 — CI keys often live in .env, not exported.\n",{"type":39,"tag":226,"props":1870,"children":1871},{"class":228,"line":458},[1872,1876,1880,1884,1888,1892,1896,1900,1904,1908,1912,1916,1920,1924,1928,1932,1936,1940,1944,1948,1952,1956,1960,1964,1968,1972,1976,1980,1984,1988,1992,1996,2000,2004,2008,2012,2016,2020,2024,2028,2032,2036,2040,2044,2048,2052,2056,2060,2064,2068,2072,2076,2080,2084,2088,2092,2096,2100,2104,2108,2112,2116,2120,2124,2128,2132,2136,2140,2144,2148,2152,2156,2160,2164,2168,2172,2176,2180,2184,2188,2192,2196,2200,2204,2208,2212,2216],{"type":39,"tag":226,"props":1873,"children":1874},{"style":500},[1875],{"type":45,"value":893},{"type":39,"tag":226,"props":1877,"children":1878},{"style":233},[1879],{"type":45,"value":898},{"type":39,"tag":226,"props":1881,"children":1882},{"style":500},[1883],{"type":45,"value":903},{"type":39,"tag":226,"props":1885,"children":1886},{"style":270},[1887],{"type":45,"value":908},{"type":39,"tag":226,"props":1889,"children":1890},{"style":270},[1891],{"type":45,"value":913},{"type":39,"tag":226,"props":1893,"children":1894},{"style":239},[1895],{"type":45,"value":309},{"type":39,"tag":226,"props":1897,"children":1898},{"style":500},[1899],{"type":45,"value":922},{"type":39,"tag":226,"props":1901,"children":1902},{"style":239},[1903],{"type":45,"value":927},{"type":39,"tag":226,"props":1905,"children":1906},{"style":239},[1907],{"type":45,"value":932},{"type":39,"tag":226,"props":1909,"children":1910},{"style":239},[1911],{"type":45,"value":368},{"type":39,"tag":226,"props":1913,"children":1914},{"style":233},[1915],{"type":45,"value":941},{"type":39,"tag":226,"props":1917,"children":1918},{"style":239},[1919],{"type":45,"value":304},{"type":39,"tag":226,"props":1921,"children":1922},{"style":239},[1923],{"type":45,"value":950},{"type":39,"tag":226,"props":1925,"children":1926},{"style":239},[1927],{"type":45,"value":420},{"type":39,"tag":226,"props":1929,"children":1930},{"style":500},[1931],{"type":45,"value":959},{"type":39,"tag":226,"props":1933,"children":1934},{"style":239},[1935],{"type":45,"value":309},{"type":39,"tag":226,"props":1937,"children":1938},{"style":500},[1939],{"type":45,"value":968},{"type":39,"tag":226,"props":1941,"children":1942},{"style":233},[1943],{"type":45,"value":973},{"type":39,"tag":226,"props":1945,"children":1946},{"style":500},[1947],{"type":45,"value":903},{"type":39,"tag":226,"props":1949,"children":1950},{"style":270},[1951],{"type":45,"value":982},{"type":39,"tag":226,"props":1953,"children":1954},{"style":270},[1955],{"type":45,"value":987},{"type":39,"tag":226,"props":1957,"children":1958},{"style":270},[1959],{"type":45,"value":992},{"type":39,"tag":226,"props":1961,"children":1962},{"style":239},[1963],{"type":45,"value":309},{"type":39,"tag":226,"props":1965,"children":1966},{"style":500},[1967],{"type":45,"value":922},{"type":39,"tag":226,"props":1969,"children":1970},{"style":312},[1971],{"type":45,"value":1005},{"type":39,"tag":226,"props":1973,"children":1974},{"style":239},[1975],{"type":45,"value":368},{"type":39,"tag":226,"props":1977,"children":1978},{"style":270},[1979],{"type":45,"value":1014},{"type":39,"tag":226,"props":1981,"children":1982},{"style":233},[1983],{"type":45,"value":1019},{"type":39,"tag":226,"props":1985,"children":1986},{"style":270},[1987],{"type":45,"value":1024},{"type":39,"tag":226,"props":1989,"children":1990},{"style":233},[1991],{"type":45,"value":1029},{"type":39,"tag":226,"props":1993,"children":1994},{"style":270},[1995],{"type":45,"value":1034},{"type":39,"tag":226,"props":1997,"children":1998},{"style":233},[1999],{"type":45,"value":1039},{"type":39,"tag":226,"props":2001,"children":2002},{"style":270},[2003],{"type":45,"value":950},{"type":39,"tag":226,"props":2005,"children":2006},{"style":239},[2007],{"type":45,"value":304},{"type":39,"tag":226,"props":2009,"children":2010},{"style":239},[2011],{"type":45,"value":397},{"type":39,"tag":226,"props":2013,"children":2014},{"style":500},[2015],{"type":45,"value":959},{"type":39,"tag":226,"props":2017,"children":2018},{"style":239},[2019],{"type":45,"value":309},{"type":39,"tag":226,"props":2021,"children":2022},{"style":233},[2023],{"type":45,"value":1064},{"type":39,"tag":226,"props":2025,"children":2026},{"style":239},[2027],{"type":45,"value":1069},{"type":39,"tag":226,"props":2029,"children":2030},{"style":281},[2031],{"type":45,"value":1074},{"type":39,"tag":226,"props":2033,"children":2034},{"style":270},[2035],{"type":45,"value":1079},{"type":39,"tag":226,"props":2037,"children":2038},{"style":239},[2039],{"type":45,"value":368},{"type":39,"tag":226,"props":2041,"children":2042},{"style":270},[2043],{"type":45,"value":1088},{"type":39,"tag":226,"props":2045,"children":2046},{"style":233},[2047],{"type":45,"value":1029},{"type":39,"tag":226,"props":2049,"children":2050},{"style":270},[2051],{"type":45,"value":242},{"type":39,"tag":226,"props":2053,"children":2054},{"style":239},[2055],{"type":45,"value":304},{"type":39,"tag":226,"props":2057,"children":2058},{"style":239},[2059],{"type":45,"value":368},{"type":39,"tag":226,"props":2061,"children":2062},{"style":233},[2063],{"type":45,"value":941},{"type":39,"tag":226,"props":2065,"children":2066},{"style":239},[2067],{"type":45,"value":304},{"type":39,"tag":226,"props":2069,"children":2070},{"style":239},[2071],{"type":45,"value":1117},{"type":39,"tag":226,"props":2073,"children":2074},{"style":281},[2075],{"type":45,"value":1122},{"type":39,"tag":226,"props":2077,"children":2078},{"style":270},[2079],{"type":45,"value":1127},{"type":39,"tag":226,"props":2081,"children":2082},{"style":239},[2083],{"type":45,"value":1117},{"type":39,"tag":226,"props":2085,"children":2086},{"style":281},[2087],{"type":45,"value":1136},{"type":39,"tag":226,"props":2089,"children":2090},{"style":270},[2091],{"type":45,"value":1141},{"type":39,"tag":226,"props":2093,"children":2094},{"style":270},[2095],{"type":45,"value":1146},{"type":39,"tag":226,"props":2097,"children":2098},{"style":239},[2099],{"type":45,"value":1117},{"type":39,"tag":226,"props":2101,"children":2102},{"style":281},[2103],{"type":45,"value":1155},{"type":39,"tag":226,"props":2105,"children":2106},{"style":239},[2107],{"type":45,"value":556},{"type":39,"tag":226,"props":2109,"children":2110},{"style":270},[2111],{"type":45,"value":1164},{"type":39,"tag":226,"props":2113,"children":2114},{"style":239},[2115],{"type":45,"value":566},{"type":39,"tag":226,"props":2117,"children":2118},{"style":233},[2119],{"type":45,"value":1173},{"type":39,"tag":226,"props":2121,"children":2122},{"style":239},[2123],{"type":45,"value":566},{"type":39,"tag":226,"props":2125,"children":2126},{"style":270},[2127],{"type":45,"value":1182},{"type":39,"tag":226,"props":2129,"children":2130},{"style":239},[2131],{"type":45,"value":566},{"type":39,"tag":226,"props":2133,"children":2134},{"style":233},[2135],{"type":45,"value":1173},{"type":39,"tag":226,"props":2137,"children":2138},{"style":239},[2139],{"type":45,"value":566},{"type":39,"tag":226,"props":2141,"children":2142},{"style":270},[2143],{"type":45,"value":1199},{"type":39,"tag":226,"props":2145,"children":2146},{"style":239},[2147],{"type":45,"value":566},{"type":39,"tag":226,"props":2149,"children":2150},{"style":239},[2151],{"type":45,"value":1208},{"type":39,"tag":226,"props":2153,"children":2154},{"style":239},[2155],{"type":45,"value":927},{"type":39,"tag":226,"props":2157,"children":2158},{"style":239},[2159],{"type":45,"value":1217},{"type":39,"tag":226,"props":2161,"children":2162},{"style":239},[2163],{"type":45,"value":368},{"type":39,"tag":226,"props":2165,"children":2166},{"style":233},[2167],{"type":45,"value":1226},{"type":39,"tag":226,"props":2169,"children":2170},{"style":239},[2171],{"type":45,"value":304},{"type":39,"tag":226,"props":2173,"children":2174},{"style":239},[2175],{"type":45,"value":950},{"type":39,"tag":226,"props":2177,"children":2178},{"style":239},[2179],{"type":45,"value":397},{"type":39,"tag":226,"props":2181,"children":2182},{"style":1245},[2183],{"type":45,"value":1248},{"type":39,"tag":226,"props":2185,"children":2186},{"style":239},[2187],{"type":45,"value":368},{"type":39,"tag":226,"props":2189,"children":2190},{"style":233},[2191],{"type":45,"value":1029},{"type":39,"tag":226,"props":2193,"children":2194},{"style":270},[2195],{"type":45,"value":242},{"type":39,"tag":226,"props":2197,"children":2198},{"style":233},[2199],{"type":45,"value":1226},{"type":39,"tag":226,"props":2201,"children":2202},{"style":239},[2203],{"type":45,"value":304},{"type":39,"tag":226,"props":2205,"children":2206},{"style":239},[2207],{"type":45,"value":309},{"type":39,"tag":226,"props":2209,"children":2210},{"style":500},[2211],{"type":45,"value":1317},{"type":39,"tag":226,"props":2213,"children":2214},{"style":239},[2215],{"type":45,"value":309},{"type":39,"tag":226,"props":2217,"children":2218},{"style":500},[2219],{"type":45,"value":1326},{"type":39,"tag":226,"props":2221,"children":2222},{"class":228,"line":586},[2223,2228,2232],{"type":39,"tag":226,"props":2224,"children":2225},{"style":233},[2226],{"type":45,"value":2227},"missing",{"type":39,"tag":226,"props":2229,"children":2230},{"style":239},[2231],{"type":45,"value":242},{"type":39,"tag":226,"props":2233,"children":2234},{"style":239},[2235],{"type":45,"value":2236},"\"\"\n",{"type":39,"tag":226,"props":2238,"children":2239},{"class":228,"line":654},[2240,2244,2249,2253,2257,2261,2265,2269,2274,2278,2282,2287,2291],{"type":39,"tag":226,"props":2241,"children":2242},{"style":239},[2243],{"type":45,"value":1397},{"type":39,"tag":226,"props":2245,"children":2246},{"style":239},[2247],{"type":45,"value":2248}," -z",{"type":39,"tag":226,"props":2250,"children":2251},{"style":239},[2252],{"type":45,"value":368},{"type":39,"tag":226,"props":2254,"children":2255},{"style":233},[2256],{"type":45,"value":1430},{"type":39,"tag":226,"props":2258,"children":2259},{"style":239},[2260],{"type":45,"value":304},{"type":39,"tag":226,"props":2262,"children":2263},{"style":239},[2264],{"type":45,"value":950},{"type":39,"tag":226,"props":2266,"children":2267},{"style":239},[2268],{"type":45,"value":397},{"type":39,"tag":226,"props":2270,"children":2271},{"style":233},[2272],{"type":45,"value":2273}," missing",{"type":39,"tag":226,"props":2275,"children":2276},{"style":239},[2277],{"type":45,"value":242},{"type":39,"tag":226,"props":2279,"children":2280},{"style":239},[2281],{"type":45,"value":304},{"type":39,"tag":226,"props":2283,"children":2284},{"style":233},[2285],{"type":45,"value":2286},"$missing",{"type":39,"tag":226,"props":2288,"children":2289},{"style":270},[2290],{"type":45,"value":987},{"type":39,"tag":226,"props":2292,"children":2293},{"style":239},[2294],{"type":45,"value":675},{"type":39,"tag":226,"props":2296,"children":2297},{"class":228,"line":678},[2298,2302,2306,2310,2314,2318,2322,2326,2330,2334,2338,2342,2346],{"type":39,"tag":226,"props":2299,"children":2300},{"style":239},[2301],{"type":45,"value":1397},{"type":39,"tag":226,"props":2303,"children":2304},{"style":239},[2305],{"type":45,"value":2248},{"type":39,"tag":226,"props":2307,"children":2308},{"style":239},[2309],{"type":45,"value":368},{"type":39,"tag":226,"props":2311,"children":2312},{"style":233},[2313],{"type":45,"value":1548},{"type":39,"tag":226,"props":2315,"children":2316},{"style":239},[2317],{"type":45,"value":304},{"type":39,"tag":226,"props":2319,"children":2320},{"style":239},[2321],{"type":45,"value":950},{"type":39,"tag":226,"props":2323,"children":2324},{"style":239},[2325],{"type":45,"value":397},{"type":39,"tag":226,"props":2327,"children":2328},{"style":233},[2329],{"type":45,"value":2273},{"type":39,"tag":226,"props":2331,"children":2332},{"style":239},[2333],{"type":45,"value":242},{"type":39,"tag":226,"props":2335,"children":2336},{"style":239},[2337],{"type":45,"value":304},{"type":39,"tag":226,"props":2339,"children":2340},{"style":233},[2341],{"type":45,"value":2286},{"type":39,"tag":226,"props":2343,"children":2344},{"style":270},[2345],{"type":45,"value":992},{"type":39,"tag":226,"props":2347,"children":2348},{"style":239},[2349],{"type":45,"value":675},{"type":39,"tag":226,"props":2351,"children":2352},{"class":228,"line":735},[2353,2357,2361,2365,2370,2374,2378,2383,2387,2391,2395,2399,2403],{"type":39,"tag":226,"props":2354,"children":2355},{"style":239},[2356],{"type":45,"value":1397},{"type":39,"tag":226,"props":2358,"children":2359},{"style":239},[2360],{"type":45,"value":2248},{"type":39,"tag":226,"props":2362,"children":2363},{"style":239},[2364],{"type":45,"value":368},{"type":39,"tag":226,"props":2366,"children":2367},{"style":233},[2368],{"type":45,"value":2369},"$DD_SITE",{"type":39,"tag":226,"props":2371,"children":2372},{"style":239},[2373],{"type":45,"value":304},{"type":39,"tag":226,"props":2375,"children":2376},{"style":239},[2377],{"type":45,"value":950},{"type":39,"tag":226,"props":2379,"children":2380},{"style":239},[2381],{"type":45,"value":2382},"    &&",{"type":39,"tag":226,"props":2384,"children":2385},{"style":233},[2386],{"type":45,"value":2273},{"type":39,"tag":226,"props":2388,"children":2389},{"style":239},[2390],{"type":45,"value":242},{"type":39,"tag":226,"props":2392,"children":2393},{"style":239},[2394],{"type":45,"value":304},{"type":39,"tag":226,"props":2396,"children":2397},{"style":233},[2398],{"type":45,"value":2286},{"type":39,"tag":226,"props":2400,"children":2401},{"style":270},[2402],{"type":45,"value":982},{"type":39,"tag":226,"props":2404,"children":2405},{"style":239},[2406],{"type":45,"value":675},{"type":39,"tag":226,"props":2408,"children":2409},{"class":228,"line":869},[2410,2414,2418,2422,2426,2430,2434,2438,2442,2446,2450,2455,2459,2464,2468,2472,2477,2482,2486],{"type":39,"tag":226,"props":2411,"children":2412},{"style":239},[2413],{"type":45,"value":1397},{"type":39,"tag":226,"props":2415,"children":2416},{"style":239},[2417],{"type":45,"value":1217},{"type":39,"tag":226,"props":2419,"children":2420},{"style":239},[2421],{"type":45,"value":368},{"type":39,"tag":226,"props":2423,"children":2424},{"style":233},[2425],{"type":45,"value":2286},{"type":39,"tag":226,"props":2427,"children":2428},{"style":239},[2429],{"type":45,"value":304},{"type":39,"tag":226,"props":2431,"children":2432},{"style":239},[2433],{"type":45,"value":950},{"type":39,"tag":226,"props":2435,"children":2436},{"style":239},[2437],{"type":45,"value":397},{"type":39,"tag":226,"props":2439,"children":2440},{"style":239},[2441],{"type":45,"value":775},{"type":39,"tag":226,"props":2443,"children":2444},{"style":312},[2445],{"type":45,"value":402},{"type":39,"tag":226,"props":2447,"children":2448},{"style":239},[2449],{"type":45,"value":368},{"type":39,"tag":226,"props":2451,"children":2452},{"style":270},[2453],{"type":45,"value":2454},"Non-interactive mode requires:",{"type":39,"tag":226,"props":2456,"children":2457},{"style":233},[2458],{"type":45,"value":2286},{"type":39,"tag":226,"props":2460,"children":2461},{"style":270},[2462],{"type":45,"value":2463}," — set them and re-run. Sign-in and trial signup need a browser.",{"type":39,"tag":226,"props":2465,"children":2466},{"style":239},[2467],{"type":45,"value":304},{"type":39,"tag":226,"props":2469,"children":2470},{"style":239},[2471],{"type":45,"value":309},{"type":39,"tag":226,"props":2473,"children":2474},{"style":312},[2475],{"type":45,"value":2476}," exit",{"type":39,"tag":226,"props":2478,"children":2479},{"style":506},[2480],{"type":45,"value":2481}," 1",{"type":39,"tag":226,"props":2483,"children":2484},{"style":239},[2485],{"type":45,"value":309},{"type":39,"tag":226,"props":2487,"children":2488},{"style":239},[2489],{"type":45,"value":446},{"type":39,"tag":48,"props":2491,"children":2492},{},[2493,2495,2500,2502,2508,2510,2516,2518,2523,2525,2530,2532,2537,2539,2544],{"type":45,"value":2494},"If all three are set, hand off to ",{"type":39,"tag":54,"props":2496,"children":2497},{},[2498],{"type":45,"value":2499},"Step 5",{"type":45,"value":2501},", which validates the key via ",{"type":39,"tag":81,"props":2503,"children":2505},{"className":2504},[],[2506],{"type":45,"value":2507},"\u002Fapi\u002Fv1\u002Fvalidate",{"type":45,"value":2509}," (works with the ",{"type":39,"tag":81,"props":2511,"children":2513},{"className":2512},[],[2514],{"type":45,"value":2515},"DD-API-KEY",{"type":45,"value":2517}," header). Note: ",{"type":39,"tag":81,"props":2519,"children":2521},{"className":2520},[],[2522],{"type":45,"value":2507},{"type":45,"value":2524}," checks ",{"type":39,"tag":81,"props":2526,"children":2528},{"className":2527},[],[2529],{"type":45,"value":1464},{"type":45,"value":2531}," only — ",{"type":39,"tag":81,"props":2533,"children":2535},{"className":2534},[],[2536],{"type":45,"value":1828},{"type":45,"value":2538}," is required but not independently verified here; a wrong\u002Fexpired app key surfaces later at the first app-key-scoped call. There is ",{"type":39,"tag":54,"props":2540,"children":2541},{},[2542],{"type":45,"value":2543},"no OAuth or signup fallback when headless",{"type":45,"value":2545}," — both need a browser — so fail with the message above and keep logs actionable.",{"type":39,"tag":1756,"props":2547,"children":2548},{},[2549],{"type":39,"tag":48,"props":2550,"children":2551},{},[2552,2553,2558],{"type":45,"value":1763},{"type":39,"tag":54,"props":2554,"children":2555},{},[2556],{"type":45,"value":2557},"Checklist (headless):",{"type":45,"value":2559}," two items only — once validate passes, tick both and jump to Step 5.",{"type":39,"tag":203,"props":2561,"children":2562},{},[],{"type":39,"tag":139,"props":2564,"children":2566},{"id":2565},"step-1-detect-existing-credentials",[2567],{"type":45,"value":2568},"Step 1 — Detect existing credentials",{"type":39,"tag":48,"props":2570,"children":2571},{},[2572,2574,2579,2581,2586,2588,2594],{"type":45,"value":2573},"Read the environment ",{"type":39,"tag":54,"props":2575,"children":2576},{},[2577],{"type":45,"value":2578},"and",{"type":45,"value":2580}," the project's ",{"type":39,"tag":81,"props":2582,"children":2584},{"className":2583},[],[2585],{"type":45,"value":86},{"type":45,"value":2587}," \u002F ",{"type":39,"tag":81,"props":2589,"children":2591},{"className":2590},[],[2592],{"type":45,"value":2593},".env.local",{"type":45,"value":2595}," files. Do not read the values back to the user in full; mask them.",{"type":39,"tag":146,"props":2597,"children":2599},{"className":219,"code":2598,"language":99,"meta":154,"style":154},"# Load DD_* with precedence: shell env > .env.local > .env (real env var wins; quotes stripped). *_SRC = file it came from (unset ⇒ shell env).\nfor f in .env.local .env; do [ -f \"$f\" ] || continue; for k in DD_SITE DD_API_KEY DD_APP_KEY; do eval \"[ -n \\\"\\${$k:-}\\\" ]\" && continue; v=$(grep -E \"^$k=\" \"$f\" | head -1 | cut -d= -f2- | sed 's\u002F^[\"'\\'']\u002F\u002F;s\u002F[\"'\\'']$\u002F\u002F'); [ -n \"$v\" ] && { export \"$k=$v\"; eval \"${k}_SRC=$f\"; }; done; done\necho \"DD_SITE   = ${DD_SITE:-\u003Cunset>}${DD_SITE_SRC:+ (from $DD_SITE_SRC)}\"\necho \"DD_API_KEY= $( [ -n \"$DD_API_KEY\" ] && echo \"set (…${DD_API_KEY: -4})${DD_API_KEY_SRC:+ (from $DD_API_KEY_SRC)}\" || echo \"\u003Cunset>\" )\"\necho \"DD_APP_KEY= $( [ -n \"$DD_APP_KEY\" ] && echo \"set (…${DD_APP_KEY: -4})${DD_APP_KEY_SRC:+ (from $DD_APP_KEY_SRC)}\" || echo \"\u003Cunset>\" )\"\n",[2600],{"type":39,"tag":81,"props":2601,"children":2602},{"__ignoreMap":154},[2603,2611,3002,3078,3222],{"type":39,"tag":226,"props":2604,"children":2605},{"class":228,"line":229},[2606],{"type":39,"tag":226,"props":2607,"children":2608},{"style":336},[2609],{"type":45,"value":2610},"# Load DD_* with precedence: shell env > .env.local > .env (real env var wins; quotes stripped). *_SRC = file it came from (unset ⇒ shell env).\n",{"type":39,"tag":226,"props":2612,"children":2613},{"class":228,"line":342},[2614,2618,2622,2626,2630,2634,2638,2642,2646,2650,2654,2658,2662,2666,2670,2674,2678,2682,2686,2690,2694,2698,2702,2706,2710,2714,2718,2722,2726,2730,2734,2738,2742,2746,2750,2754,2758,2762,2766,2770,2774,2778,2782,2786,2790,2794,2798,2802,2806,2810,2814,2818,2822,2826,2830,2834,2838,2842,2846,2850,2854,2858,2862,2866,2870,2874,2878,2882,2886,2890,2894,2898,2902,2906,2910,2914,2918,2922,2926,2930,2934,2938,2942,2946,2950,2954,2958,2962,2966,2970,2974,2978,2982,2986,2990,2994,2998],{"type":39,"tag":226,"props":2615,"children":2616},{"style":500},[2617],{"type":45,"value":893},{"type":39,"tag":226,"props":2619,"children":2620},{"style":233},[2621],{"type":45,"value":898},{"type":39,"tag":226,"props":2623,"children":2624},{"style":500},[2625],{"type":45,"value":903},{"type":39,"tag":226,"props":2627,"children":2628},{"style":270},[2629],{"type":45,"value":908},{"type":39,"tag":226,"props":2631,"children":2632},{"style":270},[2633],{"type":45,"value":913},{"type":39,"tag":226,"props":2635,"children":2636},{"style":239},[2637],{"type":45,"value":309},{"type":39,"tag":226,"props":2639,"children":2640},{"style":500},[2641],{"type":45,"value":922},{"type":39,"tag":226,"props":2643,"children":2644},{"style":239},[2645],{"type":45,"value":927},{"type":39,"tag":226,"props":2647,"children":2648},{"style":239},[2649],{"type":45,"value":932},{"type":39,"tag":226,"props":2651,"children":2652},{"style":239},[2653],{"type":45,"value":368},{"type":39,"tag":226,"props":2655,"children":2656},{"style":233},[2657],{"type":45,"value":941},{"type":39,"tag":226,"props":2659,"children":2660},{"style":239},[2661],{"type":45,"value":304},{"type":39,"tag":226,"props":2663,"children":2664},{"style":239},[2665],{"type":45,"value":950},{"type":39,"tag":226,"props":2667,"children":2668},{"style":239},[2669],{"type":45,"value":420},{"type":39,"tag":226,"props":2671,"children":2672},{"style":500},[2673],{"type":45,"value":959},{"type":39,"tag":226,"props":2675,"children":2676},{"style":239},[2677],{"type":45,"value":309},{"type":39,"tag":226,"props":2679,"children":2680},{"style":500},[2681],{"type":45,"value":968},{"type":39,"tag":226,"props":2683,"children":2684},{"style":233},[2685],{"type":45,"value":973},{"type":39,"tag":226,"props":2687,"children":2688},{"style":500},[2689],{"type":45,"value":903},{"type":39,"tag":226,"props":2691,"children":2692},{"style":270},[2693],{"type":45,"value":982},{"type":39,"tag":226,"props":2695,"children":2696},{"style":270},[2697],{"type":45,"value":987},{"type":39,"tag":226,"props":2699,"children":2700},{"style":270},[2701],{"type":45,"value":992},{"type":39,"tag":226,"props":2703,"children":2704},{"style":239},[2705],{"type":45,"value":309},{"type":39,"tag":226,"props":2707,"children":2708},{"style":500},[2709],{"type":45,"value":922},{"type":39,"tag":226,"props":2711,"children":2712},{"style":312},[2713],{"type":45,"value":1005},{"type":39,"tag":226,"props":2715,"children":2716},{"style":239},[2717],{"type":45,"value":368},{"type":39,"tag":226,"props":2719,"children":2720},{"style":270},[2721],{"type":45,"value":1014},{"type":39,"tag":226,"props":2723,"children":2724},{"style":233},[2725],{"type":45,"value":1019},{"type":39,"tag":226,"props":2727,"children":2728},{"style":270},[2729],{"type":45,"value":1024},{"type":39,"tag":226,"props":2731,"children":2732},{"style":233},[2733],{"type":45,"value":1029},{"type":39,"tag":226,"props":2735,"children":2736},{"style":270},[2737],{"type":45,"value":1034},{"type":39,"tag":226,"props":2739,"children":2740},{"style":233},[2741],{"type":45,"value":1039},{"type":39,"tag":226,"props":2743,"children":2744},{"style":270},[2745],{"type":45,"value":950},{"type":39,"tag":226,"props":2747,"children":2748},{"style":239},[2749],{"type":45,"value":304},{"type":39,"tag":226,"props":2751,"children":2752},{"style":239},[2753],{"type":45,"value":397},{"type":39,"tag":226,"props":2755,"children":2756},{"style":500},[2757],{"type":45,"value":959},{"type":39,"tag":226,"props":2759,"children":2760},{"style":239},[2761],{"type":45,"value":309},{"type":39,"tag":226,"props":2763,"children":2764},{"style":233},[2765],{"type":45,"value":1064},{"type":39,"tag":226,"props":2767,"children":2768},{"style":239},[2769],{"type":45,"value":1069},{"type":39,"tag":226,"props":2771,"children":2772},{"style":281},[2773],{"type":45,"value":1074},{"type":39,"tag":226,"props":2775,"children":2776},{"style":270},[2777],{"type":45,"value":1079},{"type":39,"tag":226,"props":2779,"children":2780},{"style":239},[2781],{"type":45,"value":368},{"type":39,"tag":226,"props":2783,"children":2784},{"style":270},[2785],{"type":45,"value":1088},{"type":39,"tag":226,"props":2787,"children":2788},{"style":233},[2789],{"type":45,"value":1029},{"type":39,"tag":226,"props":2791,"children":2792},{"style":270},[2793],{"type":45,"value":242},{"type":39,"tag":226,"props":2795,"children":2796},{"style":239},[2797],{"type":45,"value":304},{"type":39,"tag":226,"props":2799,"children":2800},{"style":239},[2801],{"type":45,"value":368},{"type":39,"tag":226,"props":2803,"children":2804},{"style":233},[2805],{"type":45,"value":941},{"type":39,"tag":226,"props":2807,"children":2808},{"style":239},[2809],{"type":45,"value":304},{"type":39,"tag":226,"props":2811,"children":2812},{"style":239},[2813],{"type":45,"value":1117},{"type":39,"tag":226,"props":2815,"children":2816},{"style":281},[2817],{"type":45,"value":1122},{"type":39,"tag":226,"props":2819,"children":2820},{"style":270},[2821],{"type":45,"value":1127},{"type":39,"tag":226,"props":2823,"children":2824},{"style":239},[2825],{"type":45,"value":1117},{"type":39,"tag":226,"props":2827,"children":2828},{"style":281},[2829],{"type":45,"value":1136},{"type":39,"tag":226,"props":2831,"children":2832},{"style":270},[2833],{"type":45,"value":1141},{"type":39,"tag":226,"props":2835,"children":2836},{"style":270},[2837],{"type":45,"value":1146},{"type":39,"tag":226,"props":2839,"children":2840},{"style":239},[2841],{"type":45,"value":1117},{"type":39,"tag":226,"props":2843,"children":2844},{"style":281},[2845],{"type":45,"value":1155},{"type":39,"tag":226,"props":2847,"children":2848},{"style":239},[2849],{"type":45,"value":556},{"type":39,"tag":226,"props":2851,"children":2852},{"style":270},[2853],{"type":45,"value":1164},{"type":39,"tag":226,"props":2855,"children":2856},{"style":239},[2857],{"type":45,"value":566},{"type":39,"tag":226,"props":2859,"children":2860},{"style":233},[2861],{"type":45,"value":1173},{"type":39,"tag":226,"props":2863,"children":2864},{"style":239},[2865],{"type":45,"value":566},{"type":39,"tag":226,"props":2867,"children":2868},{"style":270},[2869],{"type":45,"value":1182},{"type":39,"tag":226,"props":2871,"children":2872},{"style":239},[2873],{"type":45,"value":566},{"type":39,"tag":226,"props":2875,"children":2876},{"style":233},[2877],{"type":45,"value":1173},{"type":39,"tag":226,"props":2879,"children":2880},{"style":239},[2881],{"type":45,"value":566},{"type":39,"tag":226,"props":2883,"children":2884},{"style":270},[2885],{"type":45,"value":1199},{"type":39,"tag":226,"props":2887,"children":2888},{"style":239},[2889],{"type":45,"value":566},{"type":39,"tag":226,"props":2891,"children":2892},{"style":239},[2893],{"type":45,"value":1208},{"type":39,"tag":226,"props":2895,"children":2896},{"style":239},[2897],{"type":45,"value":927},{"type":39,"tag":226,"props":2899,"children":2900},{"style":239},[2901],{"type":45,"value":1217},{"type":39,"tag":226,"props":2903,"children":2904},{"style":239},[2905],{"type":45,"value":368},{"type":39,"tag":226,"props":2907,"children":2908},{"style":233},[2909],{"type":45,"value":1226},{"type":39,"tag":226,"props":2911,"children":2912},{"style":239},[2913],{"type":45,"value":304},{"type":39,"tag":226,"props":2915,"children":2916},{"style":239},[2917],{"type":45,"value":950},{"type":39,"tag":226,"props":2919,"children":2920},{"style":239},[2921],{"type":45,"value":397},{"type":39,"tag":226,"props":2923,"children":2924},{"style":239},[2925],{"type":45,"value":775},{"type":39,"tag":226,"props":2927,"children":2928},{"style":1245},[2929],{"type":45,"value":1248},{"type":39,"tag":226,"props":2931,"children":2932},{"style":239},[2933],{"type":45,"value":368},{"type":39,"tag":226,"props":2935,"children":2936},{"style":233},[2937],{"type":45,"value":1029},{"type":39,"tag":226,"props":2939,"children":2940},{"style":270},[2941],{"type":45,"value":242},{"type":39,"tag":226,"props":2943,"children":2944},{"style":233},[2945],{"type":45,"value":1226},{"type":39,"tag":226,"props":2947,"children":2948},{"style":239},[2949],{"type":45,"value":304},{"type":39,"tag":226,"props":2951,"children":2952},{"style":239},[2953],{"type":45,"value":309},{"type":39,"tag":226,"props":2955,"children":2956},{"style":312},[2957],{"type":45,"value":1005},{"type":39,"tag":226,"props":2959,"children":2960},{"style":239},[2961],{"type":45,"value":1281},{"type":39,"tag":226,"props":2963,"children":2964},{"style":233},[2965],{"type":45,"value":1286},{"type":39,"tag":226,"props":2967,"children":2968},{"style":239},[2969],{"type":45,"value":267},{"type":39,"tag":226,"props":2971,"children":2972},{"style":270},[2973],{"type":45,"value":1295},{"type":39,"tag":226,"props":2975,"children":2976},{"style":233},[2977],{"type":45,"value":941},{"type":39,"tag":226,"props":2979,"children":2980},{"style":239},[2981],{"type":45,"value":304},{"type":39,"tag":226,"props":2983,"children":2984},{"style":239},[2985],{"type":45,"value":309},{"type":39,"tag":226,"props":2987,"children":2988},{"style":239},[2989],{"type":45,"value":1312},{"type":39,"tag":226,"props":2991,"children":2992},{"style":500},[2993],{"type":45,"value":1317},{"type":39,"tag":226,"props":2995,"children":2996},{"style":239},[2997],{"type":45,"value":309},{"type":39,"tag":226,"props":2999,"children":3000},{"style":500},[3001],{"type":45,"value":1326},{"type":39,"tag":226,"props":3003,"children":3004},{"class":228,"line":449},[3005,3009,3013,3018,3022,3026,3030,3034,3038,3042,3046,3050,3054,3059,3064,3069,3073],{"type":39,"tag":226,"props":3006,"children":3007},{"style":312},[3008],{"type":45,"value":660},{"type":39,"tag":226,"props":3010,"children":3011},{"style":239},[3012],{"type":45,"value":368},{"type":39,"tag":226,"props":3014,"children":3015},{"style":270},[3016],{"type":45,"value":3017},"DD_SITE   = ",{"type":39,"tag":226,"props":3019,"children":3020},{"style":239},[3021],{"type":45,"value":1348},{"type":39,"tag":226,"props":3023,"children":3024},{"style":233},[3025],{"type":45,"value":1353},{"type":39,"tag":226,"props":3027,"children":3028},{"style":239},[3029],{"type":45,"value":1358},{"type":39,"tag":226,"props":3031,"children":3032},{"style":270},[3033],{"type":45,"value":1363},{"type":39,"tag":226,"props":3035,"children":3036},{"style":233},[3037],{"type":45,"value":1368},{"type":39,"tag":226,"props":3039,"children":3040},{"style":270},[3041],{"type":45,"value":789},{"type":39,"tag":226,"props":3043,"children":3044},{"style":239},[3045],{"type":45,"value":1377},{"type":39,"tag":226,"props":3047,"children":3048},{"style":233},[3049],{"type":45,"value":1382},{"type":39,"tag":226,"props":3051,"children":3052},{"style":239},[3053],{"type":45,"value":1387},{"type":39,"tag":226,"props":3055,"children":3056},{"style":270},[3057],{"type":45,"value":3058},"+ (",{"type":39,"tag":226,"props":3060,"children":3061},{"style":233},[3062],{"type":45,"value":3063},"from",{"type":39,"tag":226,"props":3065,"children":3066},{"style":233},[3067],{"type":45,"value":3068}," $DD_SITE_SRC",{"type":39,"tag":226,"props":3070,"children":3071},{"style":270},[3072],{"type":45,"value":294},{"type":39,"tag":226,"props":3074,"children":3075},{"style":239},[3076],{"type":45,"value":3077},"}\"\n",{"type":39,"tag":226,"props":3079,"children":3080},{"class":228,"line":458},[3081,3085,3089,3094,3098,3102,3106,3110,3114,3118,3122,3126,3130,3134,3139,3143,3147,3151,3155,3159,3163,3167,3171,3175,3179,3183,3188,3192,3197,3201,3205,3209,3213,3217],{"type":39,"tag":226,"props":3082,"children":3083},{"style":312},[3084],{"type":45,"value":660},{"type":39,"tag":226,"props":3086,"children":3087},{"style":239},[3088],{"type":45,"value":368},{"type":39,"tag":226,"props":3090,"children":3091},{"style":270},[3092],{"type":45,"value":3093},"DD_API_KEY= ",{"type":39,"tag":226,"props":3095,"children":3096},{"style":239},[3097],{"type":45,"value":278},{"type":39,"tag":226,"props":3099,"children":3100},{"style":239},[3101],{"type":45,"value":927},{"type":39,"tag":226,"props":3103,"children":3104},{"style":239},[3105],{"type":45,"value":1217},{"type":39,"tag":226,"props":3107,"children":3108},{"style":239},[3109],{"type":45,"value":368},{"type":39,"tag":226,"props":3111,"children":3112},{"style":233},[3113],{"type":45,"value":1430},{"type":39,"tag":226,"props":3115,"children":3116},{"style":239},[3117],{"type":45,"value":304},{"type":39,"tag":226,"props":3119,"children":3120},{"style":239},[3121],{"type":45,"value":950},{"type":39,"tag":226,"props":3123,"children":3124},{"style":239},[3125],{"type":45,"value":397},{"type":39,"tag":226,"props":3127,"children":3128},{"style":312},[3129],{"type":45,"value":402},{"type":39,"tag":226,"props":3131,"children":3132},{"style":239},[3133],{"type":45,"value":368},{"type":39,"tag":226,"props":3135,"children":3136},{"style":270},[3137],{"type":45,"value":3138},"set (…",{"type":39,"tag":226,"props":3140,"children":3141},{"style":239},[3142],{"type":45,"value":1348},{"type":39,"tag":226,"props":3144,"children":3145},{"style":233},[3146],{"type":45,"value":1464},{"type":39,"tag":226,"props":3148,"children":3149},{"style":239},[3150],{"type":45,"value":1387},{"type":39,"tag":226,"props":3152,"children":3153},{"style":233},[3154],{"type":45,"value":1473},{"type":39,"tag":226,"props":3156,"children":3157},{"style":239},[3158],{"type":45,"value":267},{"type":39,"tag":226,"props":3160,"children":3161},{"style":270},[3162],{"type":45,"value":294},{"type":39,"tag":226,"props":3164,"children":3165},{"style":239},[3166],{"type":45,"value":1348},{"type":39,"tag":226,"props":3168,"children":3169},{"style":233},[3170],{"type":45,"value":1482},{"type":39,"tag":226,"props":3172,"children":3173},{"style":239},[3174],{"type":45,"value":1387},{"type":39,"tag":226,"props":3176,"children":3177},{"style":270},[3178],{"type":45,"value":3058},{"type":39,"tag":226,"props":3180,"children":3181},{"style":233},[3182],{"type":45,"value":3063},{"type":39,"tag":226,"props":3184,"children":3185},{"style":233},[3186],{"type":45,"value":3187}," $DD_API_KEY_SRC",{"type":39,"tag":226,"props":3189,"children":3190},{"style":270},[3191],{"type":45,"value":294},{"type":39,"tag":226,"props":3193,"children":3194},{"style":239},[3195],{"type":45,"value":3196},"}\"",{"type":39,"tag":226,"props":3198,"children":3199},{"style":239},[3200],{"type":45,"value":420},{"type":39,"tag":226,"props":3202,"children":3203},{"style":312},[3204],{"type":45,"value":402},{"type":39,"tag":226,"props":3206,"children":3207},{"style":239},[3208],{"type":45,"value":368},{"type":39,"tag":226,"props":3210,"children":3211},{"style":270},[3212],{"type":45,"value":1521},{"type":39,"tag":226,"props":3214,"children":3215},{"style":239},[3216],{"type":45,"value":304},{"type":39,"tag":226,"props":3218,"children":3219},{"style":239},[3220],{"type":45,"value":3221}," )\"\n",{"type":39,"tag":226,"props":3223,"children":3224},{"class":228,"line":586},[3225,3229,3233,3238,3242,3246,3250,3254,3258,3262,3266,3270,3274,3278,3282,3286,3290,3294,3298,3302,3306,3310,3314,3318,3322,3326,3331,3335,3339,3343,3347,3351,3355,3359],{"type":39,"tag":226,"props":3226,"children":3227},{"style":312},[3228],{"type":45,"value":660},{"type":39,"tag":226,"props":3230,"children":3231},{"style":239},[3232],{"type":45,"value":368},{"type":39,"tag":226,"props":3234,"children":3235},{"style":270},[3236],{"type":45,"value":3237},"DD_APP_KEY= ",{"type":39,"tag":226,"props":3239,"children":3240},{"style":239},[3241],{"type":45,"value":278},{"type":39,"tag":226,"props":3243,"children":3244},{"style":239},[3245],{"type":45,"value":927},{"type":39,"tag":226,"props":3247,"children":3248},{"style":239},[3249],{"type":45,"value":1217},{"type":39,"tag":226,"props":3251,"children":3252},{"style":239},[3253],{"type":45,"value":368},{"type":39,"tag":226,"props":3255,"children":3256},{"style":233},[3257],{"type":45,"value":1548},{"type":39,"tag":226,"props":3259,"children":3260},{"style":239},[3261],{"type":45,"value":304},{"type":39,"tag":226,"props":3263,"children":3264},{"style":239},[3265],{"type":45,"value":950},{"type":39,"tag":226,"props":3267,"children":3268},{"style":239},[3269],{"type":45,"value":397},{"type":39,"tag":226,"props":3271,"children":3272},{"style":312},[3273],{"type":45,"value":402},{"type":39,"tag":226,"props":3275,"children":3276},{"style":239},[3277],{"type":45,"value":368},{"type":39,"tag":226,"props":3279,"children":3280},{"style":270},[3281],{"type":45,"value":3138},{"type":39,"tag":226,"props":3283,"children":3284},{"style":239},[3285],{"type":45,"value":1348},{"type":39,"tag":226,"props":3287,"children":3288},{"style":233},[3289],{"type":45,"value":1828},{"type":39,"tag":226,"props":3291,"children":3292},{"style":239},[3293],{"type":45,"value":1387},{"type":39,"tag":226,"props":3295,"children":3296},{"style":233},[3297],{"type":45,"value":1473},{"type":39,"tag":226,"props":3299,"children":3300},{"style":239},[3301],{"type":45,"value":267},{"type":39,"tag":226,"props":3303,"children":3304},{"style":270},[3305],{"type":45,"value":294},{"type":39,"tag":226,"props":3307,"children":3308},{"style":239},[3309],{"type":45,"value":1348},{"type":39,"tag":226,"props":3311,"children":3312},{"style":233},[3313],{"type":45,"value":1582},{"type":39,"tag":226,"props":3315,"children":3316},{"style":239},[3317],{"type":45,"value":1387},{"type":39,"tag":226,"props":3319,"children":3320},{"style":270},[3321],{"type":45,"value":3058},{"type":39,"tag":226,"props":3323,"children":3324},{"style":233},[3325],{"type":45,"value":3063},{"type":39,"tag":226,"props":3327,"children":3328},{"style":233},[3329],{"type":45,"value":3330}," $DD_APP_KEY_SRC",{"type":39,"tag":226,"props":3332,"children":3333},{"style":270},[3334],{"type":45,"value":294},{"type":39,"tag":226,"props":3336,"children":3337},{"style":239},[3338],{"type":45,"value":3196},{"type":39,"tag":226,"props":3340,"children":3341},{"style":239},[3342],{"type":45,"value":420},{"type":39,"tag":226,"props":3344,"children":3345},{"style":312},[3346],{"type":45,"value":402},{"type":39,"tag":226,"props":3348,"children":3349},{"style":239},[3350],{"type":45,"value":368},{"type":39,"tag":226,"props":3352,"children":3353},{"style":270},[3354],{"type":45,"value":1521},{"type":39,"tag":226,"props":3356,"children":3357},{"style":239},[3358],{"type":45,"value":304},{"type":39,"tag":226,"props":3360,"children":3361},{"style":239},[3362],{"type":45,"value":3221},{"type":39,"tag":3364,"props":3365,"children":3366},"ul",{},[3367,3442],{"type":39,"tag":3368,"props":3369,"children":3370},"li",{},[3371,3373,3378,3380,3385,3387,3392,3394,3399,3401,3406,3408,3413,3415,3420,3422,3427,3429,3434,3435,3440],{"type":45,"value":3372},"A ",{"type":39,"tag":81,"props":3374,"children":3376},{"className":3375},[],[3377],{"type":45,"value":1464},{"type":45,"value":3379}," is present (env ",{"type":39,"tag":54,"props":3381,"children":3382},{},[3383],{"type":45,"value":3384},"or",{"type":45,"value":3386}," ",{"type":39,"tag":81,"props":3388,"children":3390},{"className":3389},[],[3391],{"type":45,"value":86},{"type":45,"value":3393},"\u002F",{"type":39,"tag":81,"props":3395,"children":3397},{"className":3396},[],[3398],{"type":45,"value":2593},{"type":45,"value":3400},") → go to ",{"type":39,"tag":54,"props":3402,"children":3403},{},[3404],{"type":45,"value":3405},"Step 2",{"type":45,"value":3407}," (pin the site), then ",{"type":39,"tag":54,"props":3409,"children":3410},{},[3411],{"type":45,"value":3412},"Step 3",{"type":45,"value":3414}," and ",{"type":39,"tag":54,"props":3416,"children":3417},{},[3418],{"type":45,"value":3419},"ask",{"type":45,"value":3421}," (choice ",{"type":39,"tag":54,"props":3423,"children":3424},{},[3425],{"type":45,"value":3426},"A",{"type":45,"value":3428}," = use the detected key, or ",{"type":39,"tag":54,"props":3430,"children":3431},{},[3432],{"type":45,"value":3433},"B",{"type":45,"value":3393},{"type":39,"tag":54,"props":3436,"children":3437},{},[3438],{"type":45,"value":3439},"C",{"type":45,"value":3441}," to authenticate \u002F create a different account). The detected key is an option the user confirms in Step 3, not a default to use silently — they may want a different org or account.",{"type":39,"tag":3368,"props":3443,"children":3444},{},[3445,3447,3452,3454,3458,3460,3464],{"type":45,"value":3446},"No ",{"type":39,"tag":81,"props":3448,"children":3450},{"className":3449},[],[3451],{"type":45,"value":1464},{"type":45,"value":3453}," anywhere → the user has nothing usable yet. Still do ",{"type":39,"tag":54,"props":3455,"children":3456},{},[3457],{"type":45,"value":3405},{"type":45,"value":3459}," (so signup lands them on the right region), then go to ",{"type":39,"tag":54,"props":3461,"children":3462},{},[3463],{"type":45,"value":3412},{"type":45,"value":3465},", where you'll ask how to connect.",{"type":39,"tag":48,"props":3467,"children":3468},{},[3469,3471,3476],{"type":45,"value":3470},"An app key without an api key is not enough; treat it as \"no key.\" Because the shell doesn't persist between blocks, every later block that consumes ",{"type":39,"tag":81,"props":3472,"children":3474},{"className":3473},[],[3475],{"type":45,"value":1430},{"type":45,"value":3477}," re-runs this same loader at its top — that's why it reappears in Path A, Step 4, and Step 5.",{"type":39,"tag":1756,"props":3479,"children":3480},{},[3481],{"type":39,"tag":48,"props":3482,"children":3483},{},[3484,3485,3489,3491,3495,3497,3502],{"type":45,"value":1763},{"type":39,"tag":54,"props":3486,"children":3487},{},[3488],{"type":45,"value":1768},{"type":45,"value":3490}," post the list now — tick ",{"type":39,"tag":54,"props":3492,"children":3493},{},[3494],{"type":45,"value":1775},{"type":45,"value":3496},", mark ",{"type":39,"tag":54,"props":3498,"children":3499},{},[3500],{"type":45,"value":3501},"2. Confirm region",{"type":45,"value":1777},{"type":39,"tag":203,"props":3504,"children":3505},{},[],{"type":39,"tag":139,"props":3507,"children":3509},{"id":3508},"step-2-determine-region-site",[3510],{"type":45,"value":3511},"Step 2 — Determine region \u002F site",{"type":39,"tag":48,"props":3513,"children":3514},{},[3515,3517,3523,3525,3534],{"type":45,"value":3516},"The site drives ",{"type":39,"tag":3518,"props":3519,"children":3520},"em",{},[3521],{"type":45,"value":3522},"every",{"type":45,"value":3524}," URL downstream (signup, API host, key pages), so pin it before validating.\nThe region table and the country→region IP mapping live in ",{"type":39,"tag":54,"props":3526,"children":3527},{},[3528],{"type":39,"tag":81,"props":3529,"children":3531},{"className":3530},[],[3532],{"type":45,"value":3533},"references\u002Fregions.md",{"type":45,"value":3535},".",{"type":39,"tag":3537,"props":3538,"children":3539},"ol",{},[3540,3605],{"type":39,"tag":3368,"props":3541,"children":3542},{},[3543,3555,3557,3562,3564,3569,3571,3575,3577],{"type":39,"tag":54,"props":3544,"children":3545},{},[3546,3548,3553],{"type":45,"value":3547},"If ",{"type":39,"tag":81,"props":3549,"children":3551},{"className":3550},[],[3552],{"type":45,"value":1353},{"type":45,"value":3554}," is set",{"type":45,"value":3556}," (env or ",{"type":39,"tag":81,"props":3558,"children":3560},{"className":3559},[],[3561],{"type":45,"value":86},{"type":45,"value":3563},"): validate it against the allowed-site list in\n",{"type":39,"tag":81,"props":3565,"children":3567},{"className":3566},[],[3568],{"type":45,"value":3533},{"type":45,"value":3570},". If it is ",{"type":39,"tag":54,"props":3572,"children":3573},{},[3574],{"type":45,"value":1808},{"type":45,"value":3576}," in that list, stop and show a clear error:",{"type":39,"tag":1756,"props":3578,"children":3579},{},[3580],{"type":39,"tag":48,"props":3581,"children":3582},{},[3583,3589,3591,3596,3598,3603],{"type":39,"tag":81,"props":3584,"children":3586},{"className":3585},[],[3587],{"type":45,"value":3588},"DD_SITE=\"\u003Cvalue>\"",{"type":45,"value":3590}," isn't a recognized Datadog site. Pick one of the regions in ",{"type":39,"tag":81,"props":3592,"children":3594},{"className":3593},[],[3595],{"type":45,"value":3533},{"type":45,"value":3597}," and set ",{"type":39,"tag":81,"props":3599,"children":3601},{"className":3600},[],[3602],{"type":45,"value":1353},{"type":45,"value":3604}," accordingly.",{"type":39,"tag":3368,"props":3606,"children":3607},{},[3608,3619,3621,3626,3628,3800,3804,3806,3811,3813,3818,3820,3825,3827,3833,3835,3863,3866],{"type":39,"tag":54,"props":3609,"children":3610},{},[3611,3612,3617],{"type":45,"value":3547},{"type":39,"tag":81,"props":3613,"children":3615},{"className":3614},[],[3616],{"type":45,"value":1353},{"type":45,"value":3618}," is unset:",{"type":45,"value":3620}," auto-detect the region from the user's location, then ",{"type":39,"tag":54,"props":3622,"children":3623},{},[3624],{"type":45,"value":3625},"confirm",{"type":45,"value":3627}," — never silently commit a region.",{"type":39,"tag":146,"props":3629,"children":3631},{"className":219,"code":3630,"language":99,"meta":154,"style":154},"country=$(curl -s --max-time 2 https:\u002F\u002Fipinfo.io\u002Fjson \\\n  | grep -o '\"country\"[^,]*' | grep -o '\"[A-Z][A-Z]\"' | tr -d '\"')\necho \"Detected country: ${country:-unknown}\"\n",[3632],{"type":39,"tag":81,"props":3633,"children":3634},{"__ignoreMap":154},[3635,3676,3763],{"type":39,"tag":226,"props":3636,"children":3637},{"class":228,"line":229},[3638,3643,3647,3651,3656,3661,3666,3671],{"type":39,"tag":226,"props":3639,"children":3640},{"style":233},[3641],{"type":45,"value":3642},"country",{"type":39,"tag":226,"props":3644,"children":3645},{"style":239},[3646],{"type":45,"value":1069},{"type":39,"tag":226,"props":3648,"children":3649},{"style":281},[3650],{"type":45,"value":107},{"type":39,"tag":226,"props":3652,"children":3653},{"style":270},[3654],{"type":45,"value":3655}," -s",{"type":39,"tag":226,"props":3657,"children":3658},{"style":270},[3659],{"type":45,"value":3660}," --max-time",{"type":39,"tag":226,"props":3662,"children":3663},{"style":506},[3664],{"type":45,"value":3665}," 2",{"type":39,"tag":226,"props":3667,"children":3668},{"style":270},[3669],{"type":45,"value":3670}," https:\u002F\u002Fipinfo.io\u002Fjson",{"type":39,"tag":226,"props":3672,"children":3673},{"style":233},[3674],{"type":45,"value":3675}," \\\n",{"type":39,"tag":226,"props":3677,"children":3678},{"class":228,"line":342},[3679,3684,3689,3694,3698,3703,3707,3711,3715,3719,3723,3728,3732,3736,3741,3746,3750,3754,3758],{"type":39,"tag":226,"props":3680,"children":3681},{"style":239},[3682],{"type":45,"value":3683},"  |",{"type":39,"tag":226,"props":3685,"children":3686},{"style":281},[3687],{"type":45,"value":3688}," grep",{"type":39,"tag":226,"props":3690,"children":3691},{"style":270},[3692],{"type":45,"value":3693}," -o",{"type":39,"tag":226,"props":3695,"children":3696},{"style":239},[3697],{"type":45,"value":556},{"type":39,"tag":226,"props":3699,"children":3700},{"style":270},[3701],{"type":45,"value":3702},"\"country\"[^,]*",{"type":39,"tag":226,"props":3704,"children":3705},{"style":239},[3706],{"type":45,"value":566},{"type":39,"tag":226,"props":3708,"children":3709},{"style":239},[3710],{"type":45,"value":1117},{"type":39,"tag":226,"props":3712,"children":3713},{"style":281},[3714],{"type":45,"value":3688},{"type":39,"tag":226,"props":3716,"children":3717},{"style":270},[3718],{"type":45,"value":3693},{"type":39,"tag":226,"props":3720,"children":3721},{"style":239},[3722],{"type":45,"value":556},{"type":39,"tag":226,"props":3724,"children":3725},{"style":270},[3726],{"type":45,"value":3727},"\"[A-Z][A-Z]\"",{"type":39,"tag":226,"props":3729,"children":3730},{"style":239},[3731],{"type":45,"value":566},{"type":39,"tag":226,"props":3733,"children":3734},{"style":239},[3735],{"type":45,"value":1117},{"type":39,"tag":226,"props":3737,"children":3738},{"style":281},[3739],{"type":45,"value":3740}," tr",{"type":39,"tag":226,"props":3742,"children":3743},{"style":270},[3744],{"type":45,"value":3745}," -d",{"type":39,"tag":226,"props":3747,"children":3748},{"style":239},[3749],{"type":45,"value":556},{"type":39,"tag":226,"props":3751,"children":3752},{"style":270},[3753],{"type":45,"value":304},{"type":39,"tag":226,"props":3755,"children":3756},{"style":239},[3757],{"type":45,"value":566},{"type":39,"tag":226,"props":3759,"children":3760},{"style":239},[3761],{"type":45,"value":3762},")\n",{"type":39,"tag":226,"props":3764,"children":3765},{"class":228,"line":449},[3766,3770,3774,3779,3783,3787,3791,3796],{"type":39,"tag":226,"props":3767,"children":3768},{"style":312},[3769],{"type":45,"value":660},{"type":39,"tag":226,"props":3771,"children":3772},{"style":239},[3773],{"type":45,"value":368},{"type":39,"tag":226,"props":3775,"children":3776},{"style":270},[3777],{"type":45,"value":3778},"Detected country: ",{"type":39,"tag":226,"props":3780,"children":3781},{"style":239},[3782],{"type":45,"value":1348},{"type":39,"tag":226,"props":3784,"children":3785},{"style":233},[3786],{"type":45,"value":3642},{"type":39,"tag":226,"props":3788,"children":3789},{"style":239},[3790],{"type":45,"value":1358},{"type":39,"tag":226,"props":3792,"children":3793},{"style":233},[3794],{"type":45,"value":3795},"unknown",{"type":39,"tag":226,"props":3797,"children":3798},{"style":239},[3799],{"type":45,"value":3077},{"type":39,"tag":3801,"props":3802,"children":3803},"br",{},[],{"type":45,"value":3805},"Map the country to a region using the ",{"type":39,"tag":54,"props":3807,"children":3808},{},[3809],{"type":45,"value":3810},"Country → region mapping",{"type":45,"value":3812}," table in ",{"type":39,"tag":81,"props":3814,"children":3816},{"className":3815},[],[3817],{"type":45,"value":3533},{"type":45,"value":3819},". On timeout, error, or no match, ",{"type":39,"tag":54,"props":3821,"children":3822},{},[3823],{"type":45,"value":3824},"default to US1",{"type":45,"value":3826}," (",{"type":39,"tag":81,"props":3828,"children":3830},{"className":3829},[],[3831],{"type":45,"value":3832},"datadoghq.com",{"type":45,"value":3834},") — and say so. Then tell the user, e.g.:",{"type":39,"tag":1756,"props":3836,"children":3837},{},[3838],{"type":39,"tag":48,"props":3839,"children":3840},{},[3841,3843,3848,3850,3861],{"type":45,"value":3842},"You look like you're in ",{"type":39,"tag":54,"props":3844,"children":3845},{},[3846],{"type":45,"value":3847},"DE",{"type":45,"value":3849}," → suggesting ",{"type":39,"tag":54,"props":3851,"children":3852},{},[3853,3855],{"type":45,"value":3854},"EU1 (Frankfurt), ",{"type":39,"tag":81,"props":3856,"children":3858},{"className":3857},[],[3859],{"type":45,"value":3860},"datadoghq.eu",{"type":45,"value":3862},". Use this, or pick another region below?",{"type":39,"tag":3801,"props":3864,"children":3865},{},[],{"type":45,"value":3867},"Wait for confirmation. Region cannot be changed after an account is created, so this choice matters.",{"type":39,"tag":48,"props":3869,"children":3870},{},[3871,3873,3879],{"type":45,"value":3872},"The API host is uniformly ",{"type":39,"tag":81,"props":3874,"children":3876},{"className":3875},[],[3877],{"type":45,"value":3878},"https:\u002F\u002Fapi.${DD_SITE}",{"type":45,"value":3535},{"type":39,"tag":1756,"props":3881,"children":3882},{},[3883],{"type":39,"tag":48,"props":3884,"children":3885},{},[3886,3887,3891,3893,3897,3898,3903],{"type":45,"value":1763},{"type":39,"tag":54,"props":3888,"children":3889},{},[3890],{"type":45,"value":1768},{"type":45,"value":3892}," after the user confirms the region, tick ",{"type":39,"tag":54,"props":3894,"children":3895},{},[3896],{"type":45,"value":3501},{"type":45,"value":3496},{"type":39,"tag":54,"props":3899,"children":3900},{},[3901],{"type":45,"value":3902},"3. Authenticate",{"type":45,"value":1777},{"type":39,"tag":203,"props":3905,"children":3906},{},[],{"type":39,"tag":139,"props":3908,"children":3910},{"id":3909},"step-3-authenticate",[3911],{"type":45,"value":3912},"Step 3 — Authenticate",{"type":39,"tag":48,"props":3914,"children":3915},{},[3916,3921,3923,3928,3930,3935],{"type":39,"tag":54,"props":3917,"children":3918},{},[3919],{"type":45,"value":3920},"Ask how to connect first — even when Step 1 detected env credentials",{"type":45,"value":3922}," — then run the path the user picks. Present \"The choice\" before touching any credential: an ambient ",{"type":39,"tag":81,"props":3924,"children":3926},{"className":3925},[],[3927],{"type":45,"value":1464},{"type":45,"value":3929}," may belong to a different org or account than the user intends, and region\u002FIP can't reveal which, so let the user decide rather than inferring it. (Headless\u002F",{"type":39,"tag":54,"props":3931,"children":3932},{},[3933],{"type":45,"value":3934},"Step H",{"type":45,"value":3936}," is exempt — no TTY to ask, env keys only.)",{"type":39,"tag":48,"props":3938,"children":3939},{},[3940,3942,3951],{"type":45,"value":3941},"The full detail — \"The choice\" native-selector wording plus all three paths — lives in ",{"type":39,"tag":54,"props":3943,"children":3944},{},[3945],{"type":39,"tag":81,"props":3946,"children":3948},{"className":3947},[],[3949],{"type":45,"value":3950},"references\u002Fauthenticate.md",{"type":45,"value":1387},{"type":39,"tag":3953,"props":3954,"children":3955},"table",{},[3956,3980],{"type":39,"tag":3957,"props":3958,"children":3959},"thead",{},[3960],{"type":39,"tag":3961,"props":3962,"children":3963},"tr",{},[3964,3970,3975],{"type":39,"tag":3965,"props":3966,"children":3967},"th",{},[3968],{"type":45,"value":3969},"The user picks",{"type":39,"tag":3965,"props":3971,"children":3972},{},[3973],{"type":45,"value":3974},"Path",{"type":39,"tag":3965,"props":3976,"children":3977},{},[3978],{"type":45,"value":3979},"What it does",{"type":39,"tag":3981,"props":3982,"children":3983},"tbody",{},[3984,4010,4038],{"type":39,"tag":3961,"props":3985,"children":3986},{},[3987,3998,4005],{"type":39,"tag":3988,"props":3989,"children":3990},"td",{},[3991,3993],{"type":45,"value":3992},"Use my existing credentials ",{"type":39,"tag":3518,"props":3994,"children":3995},{},[3996],{"type":45,"value":3997},"(only offered if Step 1 detected a key)",{"type":39,"tag":3988,"props":3999,"children":4000},{},[4001],{"type":39,"tag":54,"props":4002,"children":4003},{},[4004],{"type":45,"value":3426},{"type":39,"tag":3988,"props":4006,"children":4007},{},[4008],{"type":45,"value":4009},"Validate the detected key (also catches a wrong-region key → back to Step 2).",{"type":39,"tag":3961,"props":4011,"children":4012},{},[4013,4018,4025],{"type":39,"tag":3988,"props":4014,"children":4015},{},[4016],{"type":45,"value":4017},"Sign in — I already have an account",{"type":39,"tag":3988,"props":4019,"children":4020},{},[4021],{"type":39,"tag":54,"props":4022,"children":4023},{},[4024],{"type":45,"value":3433},{"type":39,"tag":3988,"props":4026,"children":4027},{},[4028,4030,4036],{"type":45,"value":4029},"OAuth in the browser (PKCE + state), Bearer token to a ",{"type":39,"tag":81,"props":4031,"children":4033},{"className":4032},[],[4034],{"type":45,"value":4035},"0600",{"type":45,"value":4037}," file.",{"type":39,"tag":3961,"props":4039,"children":4040},{},[4041,4051,4058],{"type":39,"tag":3988,"props":4042,"children":4043},{},[4044,4046],{"type":45,"value":4045},"Create a new account ",{"type":39,"tag":3518,"props":4047,"children":4048},{},[4049],{"type":45,"value":4050},"(default)",{"type":39,"tag":3988,"props":4052,"children":4053},{},[4054],{"type":39,"tag":54,"props":4055,"children":4056},{},[4057],{"type":45,"value":3439},{"type":39,"tag":3988,"props":4059,"children":4060},{},[4061],{"type":45,"value":4062},"Automated in-terminal signup with a generated password → then Path B.",{"type":39,"tag":48,"props":4064,"children":4065},{},[4066,4068,4073,4075,4079],{"type":45,"value":4067},"Read ",{"type":39,"tag":81,"props":4069,"children":4071},{"className":4070},[],[4072],{"type":45,"value":3950},{"type":45,"value":4074},", present the choice via the host's native selector, and run the matching path. Re-offer the choice whenever a path dead-ends (OAuth finds no account → ",{"type":39,"tag":54,"props":4076,"children":4077},{},[4078],{"type":45,"value":3439},{"type":45,"value":4080},"; a wrong-region key sent the user back to Step 2 first).",{"type":39,"tag":1756,"props":4082,"children":4083},{},[4084],{"type":39,"tag":48,"props":4085,"children":4086},{},[4087,4088,4092,4094,4098,4100,4105],{"type":45,"value":1763},{"type":39,"tag":54,"props":4089,"children":4090},{},[4091],{"type":45,"value":1768},{"type":45,"value":4093}," keep ",{"type":39,"tag":54,"props":4095,"children":4096},{},[4097],{"type":45,"value":3902},{"type":45,"value":4099}," ◔ until a token or key is actually in hand (see the per-path cues in ",{"type":39,"tag":81,"props":4101,"children":4103},{"className":4102},[],[4104],{"type":45,"value":3950},{"type":45,"value":4106},").",{"type":39,"tag":203,"props":4108,"children":4109},{},[],{"type":39,"tag":139,"props":4111,"children":4113},{"id":4112},"step-4-turn-the-oauth-session-into-an-api-key",[4114],{"type":45,"value":4115},"Step 4 — Turn the OAuth session into an API key",{"type":39,"tag":48,"props":4117,"children":4118},{},[4119,4121,4129,4131,4136,4138,4143],{"type":45,"value":4120},"The OAuth token authenticates the user, but downstream instrumentation needs a ",{"type":39,"tag":54,"props":4122,"children":4123},{},[4124],{"type":39,"tag":81,"props":4125,"children":4127},{"className":4126},[],[4128],{"type":45,"value":1464},{"type":45,"value":4130},". Use the Bearer token to confirm identity, then obtain a key — ",{"type":39,"tag":54,"props":4132,"children":4133},{},[4134],{"type":45,"value":4135},"retrieve",{"type":45,"value":4137}," the org's most-recent key on an OAuth session (OAuth tokens cannot create keys), or ",{"type":39,"tag":54,"props":4139,"children":4140},{},[4141],{"type":45,"value":4142},"create",{"type":45,"value":4144}," one when authenticating with an app key; else guide the user to the UI key page.",{"type":39,"tag":48,"props":4146,"children":4147},{},[4148,4150,4156,4157,4163,4164,4170,4171,4177,4178,4184,4186,4195,4197,4202],{"type":45,"value":4149},"The full branch (identity check, retrieve-vs-create, the HTTP-code-tagged block, and the outcome table for ",{"type":39,"tag":81,"props":4151,"children":4153},{"className":4152},[],[4154],{"type":45,"value":4155},"EMPTY_ORG",{"type":45,"value":2587},{"type":39,"tag":81,"props":4158,"children":4160},{"className":4159},[],[4161],{"type":45,"value":4162},"LIST_DENIED",{"type":45,"value":2587},{"type":39,"tag":81,"props":4165,"children":4167},{"className":4166},[],[4168],{"type":45,"value":4169},"SECRET_DENIED",{"type":45,"value":2587},{"type":39,"tag":81,"props":4172,"children":4174},{"className":4173},[],[4175],{"type":45,"value":4176},"CREATE_DENIED",{"type":45,"value":2587},{"type":39,"tag":81,"props":4179,"children":4181},{"className":4180},[],[4182],{"type":45,"value":4183},"TRANSPORT_ERROR",{"type":45,"value":4185},") lives in ",{"type":39,"tag":54,"props":4187,"children":4188},{},[4189],{"type":39,"tag":81,"props":4190,"children":4192},{"className":4191},[],[4193],{"type":45,"value":4194},"references\u002Fget-api-key.md",{"type":45,"value":4196}," — follow it. The secret is written straight to ",{"type":39,"tag":81,"props":4198,"children":4200},{"className":4199},[],[4201],{"type":45,"value":86},{"type":45,"value":4203},", never echoed.",{"type":39,"tag":1756,"props":4205,"children":4206},{},[4207],{"type":39,"tag":48,"props":4208,"children":4209},{},[4210,4211,4215,4217,4222,4223,4228],{"type":45,"value":1763},{"type":39,"tag":54,"props":4212,"children":4213},{},[4214],{"type":45,"value":1768},{"type":45,"value":4216}," once a validated key is in hand, tick ",{"type":39,"tag":54,"props":4218,"children":4219},{},[4220],{"type":45,"value":4221},"4. Get & validate an API key",{"type":45,"value":3496},{"type":39,"tag":54,"props":4224,"children":4225},{},[4226],{"type":45,"value":4227},"5",{"type":45,"value":1777},{"type":39,"tag":203,"props":4230,"children":4231},{},[],{"type":39,"tag":139,"props":4233,"children":4235},{"id":4234},"step-5-confirm-and-hand-off",[4236],{"type":45,"value":4237},"Step 5 — Confirm and hand off",{"type":39,"tag":48,"props":4239,"children":4240},{},[4241,4243,4248,4250,4255,4257,4262,4264,4270,4272,4277],{"type":45,"value":4242},"The key is already in ",{"type":39,"tag":81,"props":4244,"children":4246},{"className":4245},[],[4247],{"type":45,"value":86},{"type":45,"value":4249},". Load it and validate (a fresh shell each call — always load ",{"type":39,"tag":81,"props":4251,"children":4253},{"className":4252},[],[4254],{"type":45,"value":86},{"type":45,"value":4256}," first by ",{"type":39,"tag":3518,"props":4258,"children":4259},{},[4260],{"type":45,"value":4261},"parsing",{"type":45,"value":4263}," it, never ",{"type":39,"tag":81,"props":4265,"children":4267},{"className":4266},[],[4268],{"type":45,"value":4269},"source",{"type":45,"value":4271}," it, so a crafted ",{"type":39,"tag":81,"props":4273,"children":4275},{"className":4274},[],[4276],{"type":45,"value":86},{"type":45,"value":4278}," can't execute; never inline the literal key):",{"type":39,"tag":146,"props":4280,"children":4282},{"className":219,"code":4281,"language":99,"meta":154,"style":154},"DDLOG=\"${TMPDIR:-\u002Ftmp}\u002Fdd-onboard-$(id -u).log\"; tf=\"${TMPDIR:-\u002Ftmp}\u002Fdd-oauth-$(id -u).token\"\n# Load DD_* (env > .env.local > .env) — parse, don't source, so a crafted .env can't execute. Covers a Path-A key that lives only in the shell env or .env.local.\nfor f in .env.local .env; do [ -f \"$f\" ] || continue; for k in DD_SITE DD_API_KEY DD_APP_KEY; do eval \"[ -n \\\"\\${$k:-}\\\" ]\" && continue; v=$(grep -E \"^$k=\" \"$f\" | head -1 | cut -d= -f2- | sed 's\u002F^[\"'\\'']\u002F\u002F;s\u002F[\"'\\'']$\u002F\u002F'); [ -n \"$v\" ] && export \"$k=$v\"; done; done\nvcode=$(curl -sg -o \"$DDLOG\" -w '%{http_code}' -H \"DD-API-KEY: $DD_API_KEY\" \"https:\u002F\u002Fapi.${DD_SITE}\u002Fapi\u002Fv1\u002Fvalidate\")\n# re-derive org\u002Femail for the card (fresh shell — Step 4 vars don't persist); only if a token is still around\nwho=\"\"; [ -s \"$tf\" ] && who=$(curl -sg -H \"Authorization: Bearer $(cat \"$tf\")\" \"https:\u002F\u002Fapi.${DD_SITE}\u002Fapi\u002Fv2\u002Fcurrent_user\" 2>>\"$DDLOG\" | grep -oE '\"email\"[[:space:]]*:[[:space:]]*\"[^\"]*\"' | head -1 | cut -d'\"' -f4)\n# consistent 🔑 credential card — the one place credential state is summarized; secret shown only as last4\necho \"🔑 Datadog credential\"\n[ -n \"$who\" ] && echo \"   org:     $who\"\necho \"   region:  ${DD_SITE}\"\necho \"   api key: …${DD_API_KEY: -4}  (in .env — never printed in full)\"\necho \"   status:  $([ \"$vcode\" = 200 ] && echo '✓ validated (HTTP 200)' || echo \"✗ validate HTTP $vcode — see: tail -n 30 \\\"$DDLOG\\\"\")\"\n",[4283],{"type":39,"tag":81,"props":4284,"children":4285},{"__ignoreMap":154},[4286,4408,4416,4767,4877,4885,5104,5112,5132,5185,5213,5258],{"type":39,"tag":226,"props":4287,"children":4288},{"class":228,"line":229},[4289,4293,4297,4301,4305,4309,4313,4317,4321,4325,4329,4333,4337,4341,4345,4349,4354,4358,4362,4366,4370,4374,4378,4383,4387,4391,4395,4399,4404],{"type":39,"tag":226,"props":4290,"children":4291},{"style":233},[4292],{"type":45,"value":236},{"type":39,"tag":226,"props":4294,"children":4295},{"style":239},[4296],{"type":45,"value":242},{"type":39,"tag":226,"props":4298,"children":4299},{"style":239},[4300],{"type":45,"value":247},{"type":39,"tag":226,"props":4302,"children":4303},{"style":233},[4304],{"type":45,"value":252},{"type":39,"tag":226,"props":4306,"children":4307},{"style":239},[4308],{"type":45,"value":257},{"type":39,"tag":226,"props":4310,"children":4311},{"style":233},[4312],{"type":45,"value":262},{"type":39,"tag":226,"props":4314,"children":4315},{"style":239},[4316],{"type":45,"value":267},{"type":39,"tag":226,"props":4318,"children":4319},{"style":270},[4320],{"type":45,"value":273},{"type":39,"tag":226,"props":4322,"children":4323},{"style":239},[4324],{"type":45,"value":278},{"type":39,"tag":226,"props":4326,"children":4327},{"style":281},[4328],{"type":45,"value":284},{"type":39,"tag":226,"props":4330,"children":4331},{"style":270},[4332],{"type":45,"value":289},{"type":39,"tag":226,"props":4334,"children":4335},{"style":239},[4336],{"type":45,"value":294},{"type":39,"tag":226,"props":4338,"children":4339},{"style":270},[4340],{"type":45,"value":299},{"type":39,"tag":226,"props":4342,"children":4343},{"style":239},[4344],{"type":45,"value":304},{"type":39,"tag":226,"props":4346,"children":4347},{"style":239},[4348],{"type":45,"value":309},{"type":39,"tag":226,"props":4350,"children":4351},{"style":233},[4352],{"type":45,"value":4353}," tf",{"type":39,"tag":226,"props":4355,"children":4356},{"style":239},[4357],{"type":45,"value":242},{"type":39,"tag":226,"props":4359,"children":4360},{"style":239},[4361],{"type":45,"value":247},{"type":39,"tag":226,"props":4363,"children":4364},{"style":233},[4365],{"type":45,"value":252},{"type":39,"tag":226,"props":4367,"children":4368},{"style":239},[4369],{"type":45,"value":257},{"type":39,"tag":226,"props":4371,"children":4372},{"style":233},[4373],{"type":45,"value":262},{"type":39,"tag":226,"props":4375,"children":4376},{"style":239},[4377],{"type":45,"value":267},{"type":39,"tag":226,"props":4379,"children":4380},{"style":270},[4381],{"type":45,"value":4382},"\u002Fdd-oauth-",{"type":39,"tag":226,"props":4384,"children":4385},{"style":239},[4386],{"type":45,"value":278},{"type":39,"tag":226,"props":4388,"children":4389},{"style":281},[4390],{"type":45,"value":284},{"type":39,"tag":226,"props":4392,"children":4393},{"style":270},[4394],{"type":45,"value":289},{"type":39,"tag":226,"props":4396,"children":4397},{"style":239},[4398],{"type":45,"value":294},{"type":39,"tag":226,"props":4400,"children":4401},{"style":270},[4402],{"type":45,"value":4403},".token",{"type":39,"tag":226,"props":4405,"children":4406},{"style":239},[4407],{"type":45,"value":675},{"type":39,"tag":226,"props":4409,"children":4410},{"class":228,"line":342},[4411],{"type":39,"tag":226,"props":4412,"children":4413},{"style":336},[4414],{"type":45,"value":4415},"# Load DD_* (env > .env.local > .env) — parse, don't source, so a crafted .env can't execute. Covers a Path-A key that lives only in the shell env or .env.local.\n",{"type":39,"tag":226,"props":4417,"children":4418},{"class":228,"line":449},[4419,4423,4427,4431,4435,4439,4443,4447,4451,4455,4459,4463,4467,4471,4475,4479,4483,4487,4491,4495,4499,4503,4507,4511,4515,4519,4523,4527,4531,4535,4539,4543,4547,4551,4555,4559,4563,4567,4571,4575,4579,4583,4587,4591,4595,4599,4603,4607,4611,4615,4619,4623,4627,4631,4635,4639,4643,4647,4651,4655,4659,4663,4667,4671,4675,4679,4683,4687,4691,4695,4699,4703,4707,4711,4715,4719,4723,4727,4731,4735,4739,4743,4747,4751,4755,4759,4763],{"type":39,"tag":226,"props":4420,"children":4421},{"style":500},[4422],{"type":45,"value":893},{"type":39,"tag":226,"props":4424,"children":4425},{"style":233},[4426],{"type":45,"value":898},{"type":39,"tag":226,"props":4428,"children":4429},{"style":500},[4430],{"type":45,"value":903},{"type":39,"tag":226,"props":4432,"children":4433},{"style":270},[4434],{"type":45,"value":908},{"type":39,"tag":226,"props":4436,"children":4437},{"style":270},[4438],{"type":45,"value":913},{"type":39,"tag":226,"props":4440,"children":4441},{"style":239},[4442],{"type":45,"value":309},{"type":39,"tag":226,"props":4444,"children":4445},{"style":500},[4446],{"type":45,"value":922},{"type":39,"tag":226,"props":4448,"children":4449},{"style":239},[4450],{"type":45,"value":927},{"type":39,"tag":226,"props":4452,"children":4453},{"style":239},[4454],{"type":45,"value":932},{"type":39,"tag":226,"props":4456,"children":4457},{"style":239},[4458],{"type":45,"value":368},{"type":39,"tag":226,"props":4460,"children":4461},{"style":233},[4462],{"type":45,"value":941},{"type":39,"tag":226,"props":4464,"children":4465},{"style":239},[4466],{"type":45,"value":304},{"type":39,"tag":226,"props":4468,"children":4469},{"style":239},[4470],{"type":45,"value":950},{"type":39,"tag":226,"props":4472,"children":4473},{"style":239},[4474],{"type":45,"value":420},{"type":39,"tag":226,"props":4476,"children":4477},{"style":500},[4478],{"type":45,"value":959},{"type":39,"tag":226,"props":4480,"children":4481},{"style":239},[4482],{"type":45,"value":309},{"type":39,"tag":226,"props":4484,"children":4485},{"style":500},[4486],{"type":45,"value":968},{"type":39,"tag":226,"props":4488,"children":4489},{"style":233},[4490],{"type":45,"value":973},{"type":39,"tag":226,"props":4492,"children":4493},{"style":500},[4494],{"type":45,"value":903},{"type":39,"tag":226,"props":4496,"children":4497},{"style":270},[4498],{"type":45,"value":982},{"type":39,"tag":226,"props":4500,"children":4501},{"style":270},[4502],{"type":45,"value":987},{"type":39,"tag":226,"props":4504,"children":4505},{"style":270},[4506],{"type":45,"value":992},{"type":39,"tag":226,"props":4508,"children":4509},{"style":239},[4510],{"type":45,"value":309},{"type":39,"tag":226,"props":4512,"children":4513},{"style":500},[4514],{"type":45,"value":922},{"type":39,"tag":226,"props":4516,"children":4517},{"style":312},[4518],{"type":45,"value":1005},{"type":39,"tag":226,"props":4520,"children":4521},{"style":239},[4522],{"type":45,"value":368},{"type":39,"tag":226,"props":4524,"children":4525},{"style":270},[4526],{"type":45,"value":1014},{"type":39,"tag":226,"props":4528,"children":4529},{"style":233},[4530],{"type":45,"value":1019},{"type":39,"tag":226,"props":4532,"children":4533},{"style":270},[4534],{"type":45,"value":1024},{"type":39,"tag":226,"props":4536,"children":4537},{"style":233},[4538],{"type":45,"value":1029},{"type":39,"tag":226,"props":4540,"children":4541},{"style":270},[4542],{"type":45,"value":1034},{"type":39,"tag":226,"props":4544,"children":4545},{"style":233},[4546],{"type":45,"value":1039},{"type":39,"tag":226,"props":4548,"children":4549},{"style":270},[4550],{"type":45,"value":950},{"type":39,"tag":226,"props":4552,"children":4553},{"style":239},[4554],{"type":45,"value":304},{"type":39,"tag":226,"props":4556,"children":4557},{"style":239},[4558],{"type":45,"value":397},{"type":39,"tag":226,"props":4560,"children":4561},{"style":500},[4562],{"type":45,"value":959},{"type":39,"tag":226,"props":4564,"children":4565},{"style":239},[4566],{"type":45,"value":309},{"type":39,"tag":226,"props":4568,"children":4569},{"style":233},[4570],{"type":45,"value":1064},{"type":39,"tag":226,"props":4572,"children":4573},{"style":239},[4574],{"type":45,"value":1069},{"type":39,"tag":226,"props":4576,"children":4577},{"style":281},[4578],{"type":45,"value":1074},{"type":39,"tag":226,"props":4580,"children":4581},{"style":270},[4582],{"type":45,"value":1079},{"type":39,"tag":226,"props":4584,"children":4585},{"style":239},[4586],{"type":45,"value":368},{"type":39,"tag":226,"props":4588,"children":4589},{"style":270},[4590],{"type":45,"value":1088},{"type":39,"tag":226,"props":4592,"children":4593},{"style":233},[4594],{"type":45,"value":1029},{"type":39,"tag":226,"props":4596,"children":4597},{"style":270},[4598],{"type":45,"value":242},{"type":39,"tag":226,"props":4600,"children":4601},{"style":239},[4602],{"type":45,"value":304},{"type":39,"tag":226,"props":4604,"children":4605},{"style":239},[4606],{"type":45,"value":368},{"type":39,"tag":226,"props":4608,"children":4609},{"style":233},[4610],{"type":45,"value":941},{"type":39,"tag":226,"props":4612,"children":4613},{"style":239},[4614],{"type":45,"value":304},{"type":39,"tag":226,"props":4616,"children":4617},{"style":239},[4618],{"type":45,"value":1117},{"type":39,"tag":226,"props":4620,"children":4621},{"style":281},[4622],{"type":45,"value":1122},{"type":39,"tag":226,"props":4624,"children":4625},{"style":270},[4626],{"type":45,"value":1127},{"type":39,"tag":226,"props":4628,"children":4629},{"style":239},[4630],{"type":45,"value":1117},{"type":39,"tag":226,"props":4632,"children":4633},{"style":281},[4634],{"type":45,"value":1136},{"type":39,"tag":226,"props":4636,"children":4637},{"style":270},[4638],{"type":45,"value":1141},{"type":39,"tag":226,"props":4640,"children":4641},{"style":270},[4642],{"type":45,"value":1146},{"type":39,"tag":226,"props":4644,"children":4645},{"style":239},[4646],{"type":45,"value":1117},{"type":39,"tag":226,"props":4648,"children":4649},{"style":281},[4650],{"type":45,"value":1155},{"type":39,"tag":226,"props":4652,"children":4653},{"style":239},[4654],{"type":45,"value":556},{"type":39,"tag":226,"props":4656,"children":4657},{"style":270},[4658],{"type":45,"value":1164},{"type":39,"tag":226,"props":4660,"children":4661},{"style":239},[4662],{"type":45,"value":566},{"type":39,"tag":226,"props":4664,"children":4665},{"style":233},[4666],{"type":45,"value":1173},{"type":39,"tag":226,"props":4668,"children":4669},{"style":239},[4670],{"type":45,"value":566},{"type":39,"tag":226,"props":4672,"children":4673},{"style":270},[4674],{"type":45,"value":1182},{"type":39,"tag":226,"props":4676,"children":4677},{"style":239},[4678],{"type":45,"value":566},{"type":39,"tag":226,"props":4680,"children":4681},{"style":233},[4682],{"type":45,"value":1173},{"type":39,"tag":226,"props":4684,"children":4685},{"style":239},[4686],{"type":45,"value":566},{"type":39,"tag":226,"props":4688,"children":4689},{"style":270},[4690],{"type":45,"value":1199},{"type":39,"tag":226,"props":4692,"children":4693},{"style":239},[4694],{"type":45,"value":566},{"type":39,"tag":226,"props":4696,"children":4697},{"style":239},[4698],{"type":45,"value":1208},{"type":39,"tag":226,"props":4700,"children":4701},{"style":239},[4702],{"type":45,"value":927},{"type":39,"tag":226,"props":4704,"children":4705},{"style":239},[4706],{"type":45,"value":1217},{"type":39,"tag":226,"props":4708,"children":4709},{"style":239},[4710],{"type":45,"value":368},{"type":39,"tag":226,"props":4712,"children":4713},{"style":233},[4714],{"type":45,"value":1226},{"type":39,"tag":226,"props":4716,"children":4717},{"style":239},[4718],{"type":45,"value":304},{"type":39,"tag":226,"props":4720,"children":4721},{"style":239},[4722],{"type":45,"value":950},{"type":39,"tag":226,"props":4724,"children":4725},{"style":239},[4726],{"type":45,"value":397},{"type":39,"tag":226,"props":4728,"children":4729},{"style":1245},[4730],{"type":45,"value":1248},{"type":39,"tag":226,"props":4732,"children":4733},{"style":239},[4734],{"type":45,"value":368},{"type":39,"tag":226,"props":4736,"children":4737},{"style":233},[4738],{"type":45,"value":1029},{"type":39,"tag":226,"props":4740,"children":4741},{"style":270},[4742],{"type":45,"value":242},{"type":39,"tag":226,"props":4744,"children":4745},{"style":233},[4746],{"type":45,"value":1226},{"type":39,"tag":226,"props":4748,"children":4749},{"style":239},[4750],{"type":45,"value":304},{"type":39,"tag":226,"props":4752,"children":4753},{"style":239},[4754],{"type":45,"value":309},{"type":39,"tag":226,"props":4756,"children":4757},{"style":500},[4758],{"type":45,"value":1317},{"type":39,"tag":226,"props":4760,"children":4761},{"style":239},[4762],{"type":45,"value":309},{"type":39,"tag":226,"props":4764,"children":4765},{"style":500},[4766],{"type":45,"value":1326},{"type":39,"tag":226,"props":4768,"children":4769},{"class":228,"line":458},[4770,4775,4779,4783,4788,4792,4796,4800,4804,4809,4813,4818,4822,4827,4831,4836,4840,4844,4848,4853,4857,4861,4865,4869,4873],{"type":39,"tag":226,"props":4771,"children":4772},{"style":233},[4773],{"type":45,"value":4774},"vcode",{"type":39,"tag":226,"props":4776,"children":4777},{"style":239},[4778],{"type":45,"value":1069},{"type":39,"tag":226,"props":4780,"children":4781},{"style":281},[4782],{"type":45,"value":107},{"type":39,"tag":226,"props":4784,"children":4785},{"style":270},[4786],{"type":45,"value":4787}," -sg",{"type":39,"tag":226,"props":4789,"children":4790},{"style":270},[4791],{"type":45,"value":3693},{"type":39,"tag":226,"props":4793,"children":4794},{"style":239},[4795],{"type":45,"value":368},{"type":39,"tag":226,"props":4797,"children":4798},{"style":233},[4799],{"type":45,"value":329},{"type":39,"tag":226,"props":4801,"children":4802},{"style":239},[4803],{"type":45,"value":304},{"type":39,"tag":226,"props":4805,"children":4806},{"style":270},[4807],{"type":45,"value":4808}," -w",{"type":39,"tag":226,"props":4810,"children":4811},{"style":239},[4812],{"type":45,"value":556},{"type":39,"tag":226,"props":4814,"children":4815},{"style":270},[4816],{"type":45,"value":4817},"%{http_code}",{"type":39,"tag":226,"props":4819,"children":4820},{"style":239},[4821],{"type":45,"value":566},{"type":39,"tag":226,"props":4823,"children":4824},{"style":270},[4825],{"type":45,"value":4826}," -H",{"type":39,"tag":226,"props":4828,"children":4829},{"style":239},[4830],{"type":45,"value":368},{"type":39,"tag":226,"props":4832,"children":4833},{"style":270},[4834],{"type":45,"value":4835},"DD-API-KEY: ",{"type":39,"tag":226,"props":4837,"children":4838},{"style":233},[4839],{"type":45,"value":1430},{"type":39,"tag":226,"props":4841,"children":4842},{"style":239},[4843],{"type":45,"value":304},{"type":39,"tag":226,"props":4845,"children":4846},{"style":239},[4847],{"type":45,"value":368},{"type":39,"tag":226,"props":4849,"children":4850},{"style":270},[4851],{"type":45,"value":4852},"https:\u002F\u002Fapi.",{"type":39,"tag":226,"props":4854,"children":4855},{"style":239},[4856],{"type":45,"value":1348},{"type":39,"tag":226,"props":4858,"children":4859},{"style":233},[4860],{"type":45,"value":1353},{"type":39,"tag":226,"props":4862,"children":4863},{"style":239},[4864],{"type":45,"value":267},{"type":39,"tag":226,"props":4866,"children":4867},{"style":270},[4868],{"type":45,"value":2507},{"type":39,"tag":226,"props":4870,"children":4871},{"style":239},[4872],{"type":45,"value":304},{"type":39,"tag":226,"props":4874,"children":4875},{"style":239},[4876],{"type":45,"value":3762},{"type":39,"tag":226,"props":4878,"children":4879},{"class":228,"line":586},[4880],{"type":39,"tag":226,"props":4881,"children":4882},{"style":336},[4883],{"type":45,"value":4884},"# re-derive org\u002Femail for the card (fresh shell — Step 4 vars don't persist); only if a token is still around\n",{"type":39,"tag":226,"props":4886,"children":4887},{"class":228,"line":654},[4888,4893,4897,4902,4906,4910,4914,4918,4923,4927,4931,4935,4940,4944,4948,4952,4956,4960,4965,4969,4974,4978,4982,4987,4991,4995,4999,5003,5007,5012,5016,5021,5025,5029,5033,5037,5041,5046,5050,5055,5059,5063,5067,5071,5075,5079,5083,5087,5091,5095,5100],{"type":39,"tag":226,"props":4889,"children":4890},{"style":233},[4891],{"type":45,"value":4892},"who",{"type":39,"tag":226,"props":4894,"children":4895},{"style":239},[4896],{"type":45,"value":242},{"type":39,"tag":226,"props":4898,"children":4899},{"style":239},[4900],{"type":45,"value":4901},"\"\"",{"type":39,"tag":226,"props":4903,"children":4904},{"style":239},[4905],{"type":45,"value":309},{"type":39,"tag":226,"props":4907,"children":4908},{"style":239},[4909],{"type":45,"value":927},{"type":39,"tag":226,"props":4911,"children":4912},{"style":239},[4913],{"type":45,"value":3655},{"type":39,"tag":226,"props":4915,"children":4916},{"style":239},[4917],{"type":45,"value":368},{"type":39,"tag":226,"props":4919,"children":4920},{"style":233},[4921],{"type":45,"value":4922},"$tf",{"type":39,"tag":226,"props":4924,"children":4925},{"style":239},[4926],{"type":45,"value":304},{"type":39,"tag":226,"props":4928,"children":4929},{"style":239},[4930],{"type":45,"value":950},{"type":39,"tag":226,"props":4932,"children":4933},{"style":239},[4934],{"type":45,"value":397},{"type":39,"tag":226,"props":4936,"children":4937},{"style":233},[4938],{"type":45,"value":4939}," who",{"type":39,"tag":226,"props":4941,"children":4942},{"style":239},[4943],{"type":45,"value":1069},{"type":39,"tag":226,"props":4945,"children":4946},{"style":281},[4947],{"type":45,"value":107},{"type":39,"tag":226,"props":4949,"children":4950},{"style":270},[4951],{"type":45,"value":4787},{"type":39,"tag":226,"props":4953,"children":4954},{"style":270},[4955],{"type":45,"value":4826},{"type":39,"tag":226,"props":4957,"children":4958},{"style":239},[4959],{"type":45,"value":368},{"type":39,"tag":226,"props":4961,"children":4962},{"style":270},[4963],{"type":45,"value":4964},"Authorization: Bearer ",{"type":39,"tag":226,"props":4966,"children":4967},{"style":239},[4968],{"type":45,"value":278},{"type":39,"tag":226,"props":4970,"children":4971},{"style":281},[4972],{"type":45,"value":4973},"cat",{"type":39,"tag":226,"props":4975,"children":4976},{"style":239},[4977],{"type":45,"value":368},{"type":39,"tag":226,"props":4979,"children":4980},{"style":233},[4981],{"type":45,"value":4922},{"type":39,"tag":226,"props":4983,"children":4984},{"style":239},[4985],{"type":45,"value":4986},"\")\"",{"type":39,"tag":226,"props":4988,"children":4989},{"style":239},[4990],{"type":45,"value":368},{"type":39,"tag":226,"props":4992,"children":4993},{"style":270},[4994],{"type":45,"value":4852},{"type":39,"tag":226,"props":4996,"children":4997},{"style":239},[4998],{"type":45,"value":1348},{"type":39,"tag":226,"props":5000,"children":5001},{"style":233},[5002],{"type":45,"value":1353},{"type":39,"tag":226,"props":5004,"children":5005},{"style":239},[5006],{"type":45,"value":267},{"type":39,"tag":226,"props":5008,"children":5009},{"style":270},[5010],{"type":45,"value":5011},"\u002Fapi\u002Fv2\u002Fcurrent_user",{"type":39,"tag":226,"props":5013,"children":5014},{"style":239},[5015],{"type":45,"value":304},{"type":39,"tag":226,"props":5017,"children":5018},{"style":239},[5019],{"type":45,"value":5020}," 2>>",{"type":39,"tag":226,"props":5022,"children":5023},{"style":239},[5024],{"type":45,"value":304},{"type":39,"tag":226,"props":5026,"children":5027},{"style":233},[5028],{"type":45,"value":329},{"type":39,"tag":226,"props":5030,"children":5031},{"style":239},[5032],{"type":45,"value":304},{"type":39,"tag":226,"props":5034,"children":5035},{"style":239},[5036],{"type":45,"value":1117},{"type":39,"tag":226,"props":5038,"children":5039},{"style":281},[5040],{"type":45,"value":3688},{"type":39,"tag":226,"props":5042,"children":5043},{"style":270},[5044],{"type":45,"value":5045}," -oE",{"type":39,"tag":226,"props":5047,"children":5048},{"style":239},[5049],{"type":45,"value":556},{"type":39,"tag":226,"props":5051,"children":5052},{"style":270},[5053],{"type":45,"value":5054},"\"email\"[[:space:]]*:[[:space:]]*\"[^\"]*\"",{"type":39,"tag":226,"props":5056,"children":5057},{"style":239},[5058],{"type":45,"value":566},{"type":39,"tag":226,"props":5060,"children":5061},{"style":239},[5062],{"type":45,"value":1117},{"type":39,"tag":226,"props":5064,"children":5065},{"style":281},[5066],{"type":45,"value":1122},{"type":39,"tag":226,"props":5068,"children":5069},{"style":270},[5070],{"type":45,"value":1127},{"type":39,"tag":226,"props":5072,"children":5073},{"style":239},[5074],{"type":45,"value":1117},{"type":39,"tag":226,"props":5076,"children":5077},{"style":281},[5078],{"type":45,"value":1136},{"type":39,"tag":226,"props":5080,"children":5081},{"style":270},[5082],{"type":45,"value":3745},{"type":39,"tag":226,"props":5084,"children":5085},{"style":239},[5086],{"type":45,"value":566},{"type":39,"tag":226,"props":5088,"children":5089},{"style":270},[5090],{"type":45,"value":304},{"type":39,"tag":226,"props":5092,"children":5093},{"style":239},[5094],{"type":45,"value":566},{"type":39,"tag":226,"props":5096,"children":5097},{"style":270},[5098],{"type":45,"value":5099}," -f4",{"type":39,"tag":226,"props":5101,"children":5102},{"style":239},[5103],{"type":45,"value":3762},{"type":39,"tag":226,"props":5105,"children":5106},{"class":228,"line":678},[5107],{"type":39,"tag":226,"props":5108,"children":5109},{"style":336},[5110],{"type":45,"value":5111},"# consistent 🔑 credential card — the one place credential state is summarized; secret shown only as last4\n",{"type":39,"tag":226,"props":5113,"children":5114},{"class":228,"line":735},[5115,5119,5123,5128],{"type":39,"tag":226,"props":5116,"children":5117},{"style":312},[5118],{"type":45,"value":660},{"type":39,"tag":226,"props":5120,"children":5121},{"style":239},[5122],{"type":45,"value":368},{"type":39,"tag":226,"props":5124,"children":5125},{"style":270},[5126],{"type":45,"value":5127},"🔑 Datadog credential",{"type":39,"tag":226,"props":5129,"children":5130},{"style":239},[5131],{"type":45,"value":675},{"type":39,"tag":226,"props":5133,"children":5134},{"class":228,"line":869},[5135,5139,5143,5147,5152,5156,5160,5164,5168,5172,5177,5181],{"type":39,"tag":226,"props":5136,"children":5137},{"style":239},[5138],{"type":45,"value":1397},{"type":39,"tag":226,"props":5140,"children":5141},{"style":239},[5142],{"type":45,"value":1217},{"type":39,"tag":226,"props":5144,"children":5145},{"style":239},[5146],{"type":45,"value":368},{"type":39,"tag":226,"props":5148,"children":5149},{"style":233},[5150],{"type":45,"value":5151},"$who",{"type":39,"tag":226,"props":5153,"children":5154},{"style":239},[5155],{"type":45,"value":304},{"type":39,"tag":226,"props":5157,"children":5158},{"style":239},[5159],{"type":45,"value":950},{"type":39,"tag":226,"props":5161,"children":5162},{"style":239},[5163],{"type":45,"value":397},{"type":39,"tag":226,"props":5165,"children":5166},{"style":312},[5167],{"type":45,"value":402},{"type":39,"tag":226,"props":5169,"children":5170},{"style":239},[5171],{"type":45,"value":368},{"type":39,"tag":226,"props":5173,"children":5174},{"style":270},[5175],{"type":45,"value":5176},"   org:     ",{"type":39,"tag":226,"props":5178,"children":5179},{"style":233},[5180],{"type":45,"value":5151},{"type":39,"tag":226,"props":5182,"children":5183},{"style":239},[5184],{"type":45,"value":675},{"type":39,"tag":226,"props":5186,"children":5187},{"class":228,"line":878},[5188,5192,5196,5201,5205,5209],{"type":39,"tag":226,"props":5189,"children":5190},{"style":312},[5191],{"type":45,"value":660},{"type":39,"tag":226,"props":5193,"children":5194},{"style":239},[5195],{"type":45,"value":368},{"type":39,"tag":226,"props":5197,"children":5198},{"style":270},[5199],{"type":45,"value":5200},"   region:  ",{"type":39,"tag":226,"props":5202,"children":5203},{"style":239},[5204],{"type":45,"value":1348},{"type":39,"tag":226,"props":5206,"children":5207},{"style":233},[5208],{"type":45,"value":1353},{"type":39,"tag":226,"props":5210,"children":5211},{"style":239},[5212],{"type":45,"value":3077},{"type":39,"tag":226,"props":5214,"children":5215},{"class":228,"line":887},[5216,5220,5224,5229,5233,5237,5241,5245,5249,5254],{"type":39,"tag":226,"props":5217,"children":5218},{"style":312},[5219],{"type":45,"value":660},{"type":39,"tag":226,"props":5221,"children":5222},{"style":239},[5223],{"type":45,"value":368},{"type":39,"tag":226,"props":5225,"children":5226},{"style":270},[5227],{"type":45,"value":5228},"   api key: …",{"type":39,"tag":226,"props":5230,"children":5231},{"style":239},[5232],{"type":45,"value":1348},{"type":39,"tag":226,"props":5234,"children":5235},{"style":233},[5236],{"type":45,"value":1464},{"type":39,"tag":226,"props":5238,"children":5239},{"style":239},[5240],{"type":45,"value":1387},{"type":39,"tag":226,"props":5242,"children":5243},{"style":233},[5244],{"type":45,"value":1473},{"type":39,"tag":226,"props":5246,"children":5247},{"style":239},[5248],{"type":45,"value":267},{"type":39,"tag":226,"props":5250,"children":5251},{"style":270},[5252],{"type":45,"value":5253},"  (in .env — never printed in full)",{"type":39,"tag":226,"props":5255,"children":5256},{"style":239},[5257],{"type":45,"value":675},{"type":39,"tag":226,"props":5259,"children":5260},{"class":228,"line":1329},[5261,5265,5269,5274,5278,5282,5287,5291,5295,5300,5304,5308,5312,5316,5321,5325,5329,5333,5337,5342,5346,5351,5356],{"type":39,"tag":226,"props":5262,"children":5263},{"style":312},[5264],{"type":45,"value":660},{"type":39,"tag":226,"props":5266,"children":5267},{"style":239},[5268],{"type":45,"value":368},{"type":39,"tag":226,"props":5270,"children":5271},{"style":270},[5272],{"type":45,"value":5273},"   status:  ",{"type":39,"tag":226,"props":5275,"children":5276},{"style":239},[5277],{"type":45,"value":1417},{"type":39,"tag":226,"props":5279,"children":5280},{"style":239},[5281],{"type":45,"value":368},{"type":39,"tag":226,"props":5283,"children":5284},{"style":233},[5285],{"type":45,"value":5286},"$vcode",{"type":39,"tag":226,"props":5288,"children":5289},{"style":239},[5290],{"type":45,"value":304},{"type":39,"tag":226,"props":5292,"children":5293},{"style":239},[5294],{"type":45,"value":1675},{"type":39,"tag":226,"props":5296,"children":5297},{"style":506},[5298],{"type":45,"value":5299}," 200",{"type":39,"tag":226,"props":5301,"children":5302},{"style":239},[5303],{"type":45,"value":950},{"type":39,"tag":226,"props":5305,"children":5306},{"style":239},[5307],{"type":45,"value":397},{"type":39,"tag":226,"props":5309,"children":5310},{"style":312},[5311],{"type":45,"value":402},{"type":39,"tag":226,"props":5313,"children":5314},{"style":239},[5315],{"type":45,"value":556},{"type":39,"tag":226,"props":5317,"children":5318},{"style":270},[5319],{"type":45,"value":5320},"✓ validated (HTTP 200)",{"type":39,"tag":226,"props":5322,"children":5323},{"style":239},[5324],{"type":45,"value":566},{"type":39,"tag":226,"props":5326,"children":5327},{"style":239},[5328],{"type":45,"value":420},{"type":39,"tag":226,"props":5330,"children":5331},{"style":312},[5332],{"type":45,"value":402},{"type":39,"tag":226,"props":5334,"children":5335},{"style":239},[5336],{"type":45,"value":368},{"type":39,"tag":226,"props":5338,"children":5339},{"style":270},[5340],{"type":45,"value":5341},"✗ validate HTTP ",{"type":39,"tag":226,"props":5343,"children":5344},{"style":233},[5345],{"type":45,"value":5286},{"type":39,"tag":226,"props":5347,"children":5348},{"style":270},[5349],{"type":45,"value":5350}," — see: tail -n 30 ",{"type":39,"tag":226,"props":5352,"children":5353},{"style":233},[5354],{"type":45,"value":5355},"\\\"$DDLOG\\\"",{"type":39,"tag":226,"props":5357,"children":5358},{"style":239},[5359],{"type":45,"value":5360},"\")\"\n",{"type":39,"tag":3364,"props":5362,"children":5363},{},[5364,5385,5390,5444,5476],{"type":39,"tag":3368,"props":5365,"children":5366},{},[5367,5369,5375,5377,5383],{"type":45,"value":5368},"The card above is the canonical summary — don't also dump the raw validate response. On a non-200, surface ",{"type":39,"tag":81,"props":5370,"children":5372},{"className":5371},[],[5373],{"type":45,"value":5374},"tail -n 30 \"$DDLOG\"",{"type":45,"value":5376}," and treat it per the outcome table (a ",{"type":39,"tag":81,"props":5378,"children":5380},{"className":5379},[],[5381],{"type":45,"value":5382},"403",{"type":45,"value":5384}," here is usually wrong region → Step 2).",{"type":39,"tag":3368,"props":5386,"children":5387},{},[5388],{"type":45,"value":5389},"Report the authenticated org\u002Femail from the identity call.",{"type":39,"tag":3368,"props":5391,"children":5392},{},[5393,5395,5403,5404,5409,5410,5415,5416,5422,5424,5429,5430,5435,5437,5443],{"type":45,"value":5394},"Credentials all live in ",{"type":39,"tag":54,"props":5396,"children":5397},{},[5398],{"type":39,"tag":81,"props":5399,"children":5401},{"className":5400},[],[5402],{"type":45,"value":86},{"type":45,"value":3826},{"type":39,"tag":81,"props":5405,"children":5407},{"className":5406},[],[5408],{"type":45,"value":1353},{"type":45,"value":1822},{"type":39,"tag":81,"props":5411,"children":5413},{"className":5412},[],[5414],{"type":45,"value":1464},{"type":45,"value":1830},{"type":39,"tag":81,"props":5417,"children":5419},{"className":5418},[],[5420],{"type":45,"value":5421},"DD_SIGNUP_PASSWORD",{"type":45,"value":5423}," if the account was created via Path C) — written there directly, never echoed. Clean up the signup temp files and the OAuth ",{"type":39,"tag":3518,"props":5425,"children":5426},{},[5427],{"type":45,"value":5428},"state",{"type":45,"value":101},{"type":39,"tag":3518,"props":5431,"children":5432},{},[5433],{"type":45,"value":5434},"callback",{"type":45,"value":5436}," files: ",{"type":39,"tag":81,"props":5438,"children":5440},{"className":5439},[],[5441],{"type":45,"value":5442},"rm -f \"${TMPDIR:-\u002Ftmp}\"\u002Fdd-signup-$(id -u).* \"${TMPDIR:-\u002Ftmp}\"\u002Fdd-oauth-$(id -u).state \"${TMPDIR:-\u002Ftmp}\"\u002Fdd-oauth-$(id -u).cb",{"type":45,"value":3535},{"type":39,"tag":3368,"props":5445,"children":5446},{},[5447,5452,5454,5460,5461,5466,5468,5474],{"type":39,"tag":54,"props":5448,"children":5449},{},[5450],{"type":45,"value":5451},"Downstream handoff — keep the OAuth token.",{"type":45,"value":5453}," Leave ",{"type":39,"tag":81,"props":5455,"children":5457},{"className":5456},[],[5458],{"type":45,"value":5459},"${TMPDIR:-\u002Ftmp}\u002Fdd-oauth-$(id -u).token",{"type":45,"value":3826},{"type":39,"tag":81,"props":5462,"children":5464},{"className":5463},[],[5465],{"type":45,"value":4035},{"type":45,"value":5467},") in place. Downstream instrumentation reuses this Bearer token to provision resources a plain API key can't create — notably a RUM application. It is short-lived and scoped; the onboarding caller (e.g. the orchestrator) removes it once setup finishes (",{"type":39,"tag":81,"props":5469,"children":5471},{"className":5470},[],[5472],{"type":45,"value":5473},"rm -f \"${TMPDIR:-\u002Ftmp}\"\u002Fdd-oauth-$(id -u).token",{"type":45,"value":5475},"). Running instrumentation standalone? Delete it yourself when done.",{"type":39,"tag":3368,"props":5477,"children":5478},{},[5479,5481,5487,5488,5494,5495,5501,5503,5509],{"type":45,"value":5480},"Hand back: \"Account is ready. You can now run the setup \u002F instrumentation step.\" (e.g. ",{"type":39,"tag":81,"props":5482,"children":5484},{"className":5483},[],[5485],{"type":45,"value":5486},"studio-setup",{"type":45,"value":1822},{"type":39,"tag":81,"props":5489,"children":5491},{"className":5490},[],[5492],{"type":45,"value":5493},"browser-rum-setup",{"type":45,"value":1822},{"type":39,"tag":81,"props":5496,"children":5498},{"className":5497},[],[5499],{"type":45,"value":5500},"llm-observability-setup",{"type":45,"value":5502},", or any other ",{"type":39,"tag":81,"props":5504,"children":5506},{"className":5505},[],[5507],{"type":45,"value":5508},"*-setup",{"type":45,"value":5510}," skill).",{"type":39,"tag":1756,"props":5512,"children":5513},{},[5514],{"type":39,"tag":48,"props":5515,"children":5516},{},[5517,5518,5522,5524,5529],{"type":45,"value":1763},{"type":39,"tag":54,"props":5519,"children":5520},{},[5521],{"type":45,"value":1768},{"type":45,"value":5523}," tick ",{"type":39,"tag":54,"props":5525,"children":5526},{},[5527],{"type":45,"value":5528},"5. Ready — hand off",{"type":45,"value":5530}," — show the fully completed list so the user sees the flow is done.",{"type":39,"tag":203,"props":5532,"children":5533},{},[],{"type":39,"tag":139,"props":5535,"children":5537},{"id":5536},"troubleshooting-reference",[5538],{"type":45,"value":5539},"Troubleshooting & reference",{"type":39,"tag":48,"props":5541,"children":5542},{},[5543,5545,5554],{"type":45,"value":5544},"When a step fails, see ",{"type":39,"tag":54,"props":5546,"children":5547},{},[5548],{"type":39,"tag":81,"props":5549,"children":5551},{"className":5550},[],[5552],{"type":45,"value":5553},"references\u002Ftroubleshooting.md",{"type":45,"value":5555}," — the symptom→fix table (wrong region, OAuth state mismatch, headless exit, Path-C signup errors, …) plus the design-decision and temp-state notes.",{"type":39,"tag":5557,"props":5558,"children":5559},"style",{},[5560],{"type":45,"value":5561},"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":5563,"total":5730},[5564,5579,5597,5608,5624,5638,5654,5668,5680,5692,5704,5724],{"slug":5565,"name":5565,"fn":5566,"description":5567,"org":5568,"tags":5569,"stars":22,"repoUrl":23,"updatedAt":5578},"agent-install","install Datadog Agent on Kubernetes","Install the Datadog Agent on Kubernetes using the Datadog Operator — required before enabling Single Step Instrumentation (SSI), which automatically instruments applications for APM without code changes. Only use if no Datadog Agent is deployed on the cluster yet.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5570,5571,5574,5577],{"name":20,"slug":21,"type":15},{"name":5572,"slug":5573,"type":15},"Deployment","deployment",{"name":5575,"slug":5576,"type":15},"Kubernetes","kubernetes",{"name":13,"slug":14,"type":15},"2026-04-15T04:57:27.489805",{"slug":5580,"name":5580,"fn":5581,"description":5582,"org":5583,"tags":5584,"stars":22,"repoUrl":23,"updatedAt":5596},"agent-observability-auto-experiment","run iterative code improvements using Datadog data","Run an iterative code-improvement hill-climb against real Datadog LLM-Obs data, locally, with Claude Code as the agent. Establishes a baseline eval, makes one focused change, re-scores with the same harness, keeps the change if it improves the score in the goal's direction (labeling within-noise gains tentative), and repeats. Use when the user says \"run an auto experiment\", \"hill-climb this code\", \"iteratively improve X and measure the delta\", \"optimize this prompt\u002Ffile against my traces\", \"auto-optimize against LLM-Obs\", or wants the local equivalent of the auto_experiments worker. Works from a local dataset file, an ml_app, a dataset_id, or a list of trace_ids.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5585,5586,5589,5592,5595],{"name":20,"slug":21,"type":15},{"name":5587,"slug":5588,"type":15},"Debugging","debugging",{"name":5590,"slug":5591,"type":15},"Evals","evals",{"name":5593,"slug":5594,"type":15},"LLM","llm",{"name":13,"slug":14,"type":15},"2026-08-16T03:30:07.668079",{"slug":5598,"name":5598,"fn":5599,"description":5600,"org":5601,"tags":5602,"stars":22,"repoUrl":23,"updatedAt":5607},"agent-observability-eval-bootstrap","bootstrap evaluators from production traces","Bootstrap evaluators from production traces — by default propose online LLM-judge evaluators and, after you confirm, create them in Datadog as disabled drafts (never auto-enabled); on request emit Python SDK code or a framework-agnostic JSON spec instead. Use when user says \"bootstrap evaluators\", \"generate evaluators\", \"create evals from traces\", \"eval bootstrap\", \"write evaluators\", \"build eval suite\", \"publish evaluators\", or wants to generate BaseEvaluator\u002FLLMJudge code or online judge configs from production LLM trace data. Works with ml_app and optional RCA report or failure hypothesis.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5603,5604,5605,5606],{"name":20,"slug":21,"type":15},{"name":5590,"slug":5591,"type":15},{"name":5593,"slug":5594,"type":15},{"name":13,"slug":14,"type":15},"2026-06-19T09:04:19.259734",{"slug":5609,"name":5609,"fn":5610,"description":5611,"org":5612,"tags":5613,"stars":22,"repoUrl":23,"updatedAt":5623},"agent-observability-eval-pipeline","run agent observability and evaluation pipelines","End-to-end Agent Observability pipeline for an instrumented ml_app — classify production traces, root-cause failures, bootstrap evaluators, then (optionally) sample + publish a dataset, generate + run an experiment, and analyze results. Six narrated phases with a standardized banner and a \"continue\" checkpoint between each. Pure orchestration over the agent-observability sub-skills (`agent-observability-session-classify`, `agent-observability-trace-rca`, `agent-observability-eval-bootstrap`, `agent-observability-experiment-py-bootstrap`, `agent-observability-experiment-analyzer`). Use when user says \"run the eval pipeline\", \"go from traces to evals\", \"bootstrap evals end to end\", \"classify then RCA then bootstrap\", \"build an eval set from scratch\", \"onboard me to datasets and experiments\", \"walk me through experiments\", \"I have an ml_app, now what\", \"Agent Observability onboarding\", \"guided experiment setup\", \"from traces to experiments\", or wants a deterministic, narrated tour from production data through evaluators, datasets, and experiments. Stop early with `--stop-after \u003Cphase>` to short-circuit at evaluators or dataset, or resume mid-flow with `--start-at \u003Cphase>`.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5614,5617,5620,5621,5622],{"name":5615,"slug":5616,"type":15},"Agents","agents",{"name":5618,"slug":5619,"type":15},"Data Pipeline","data-pipeline",{"name":20,"slug":21,"type":15},{"name":5590,"slug":5591,"type":15},{"name":13,"slug":14,"type":15},"2026-06-19T09:04:17.231423",{"slug":5625,"name":5625,"fn":5626,"description":5627,"org":5628,"tags":5629,"stars":22,"repoUrl":23,"updatedAt":5637},"agent-observability-experiment-analyzer","analyze LLM experiment results","Analyze LLM experiment results. Handles single or comparative experiments, exploratory or Q&A modes. Use when user says \"analyze experiment\", \"compare experiments\", \"analyze against baseline\", or provides one or two experiment IDs for analysis.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5630,5633,5634,5635,5636],{"name":5631,"slug":5632,"type":15},"Analytics","analytics",{"name":20,"slug":21,"type":15},{"name":5590,"slug":5591,"type":15},{"name":5593,"slug":5594,"type":15},{"name":13,"slug":14,"type":15},"2026-06-19T09:04:21.212498",{"slug":5639,"name":5639,"fn":5640,"description":5641,"org":5642,"tags":5643,"stars":22,"repoUrl":23,"updatedAt":5653},"agent-observability-experiment-py-bootstrap","generate Python experiment clients for LLM observability","Generates a self-contained Python experiment client that uses the ddtrace.llmobs SDK. Emits either a runnable .py script or a Jupyter .ipynb notebook matching the canonical DataDog reference notebook style. Use when the user says \"generate Python experiment\", \"write an SDK experiment\", \"create a ddtrace experiment\", \"Python notebook experiment\", \"use the Agent Observability SDK\", or has `ddtrace` installed and wants idiomatic SDK code.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5644,5645,5648,5649,5650],{"name":20,"slug":21,"type":15},{"name":5646,"slug":5647,"type":15},"Jupyter","jupyter",{"name":5593,"slug":5594,"type":15},{"name":13,"slug":14,"type":15},{"name":5651,"slug":5652,"type":15},"Python","python","2026-06-19T09:04:22.640384",{"slug":5655,"name":5655,"fn":5656,"description":5657,"org":5658,"tags":5659,"stars":22,"repoUrl":23,"updatedAt":5667},"agent-observability-replay-trace","iterate on LLM traces with local code","Use when a developer wants to iterate on ONE specific Agent Observability \u002F LLM Obs trace whose output they didn't like — re-running that trace against their LOCAL code, seeing a concise diff of the old vs new output, and looping (change code → replay → diff) until satisfied. Invoked as \u002Fagent-observability-replay-trace \u003Ctrace-id> [changes to test]. Signals: \"replay this trace\"; \"iterate on a trace\"; \"this trace's output is wrong, fix it and re-run\"; \"re-run trace \u003Cid> with \u003Cchange>\"; pasting a trace id from the Agent Observability UI with a description of what to fix. It fetches the trace via the datadog-llmo MCP or the pup CLI, edits code, re-runs the app to emit a NEW trace, and diffs the two — no local server, no browser. For agents traced with ddtrace \u002F LLM Obs (Python first-class), with JSON-serializable entry input. Do NOT use for: scored Experiments or the browser \"Replay\" button (that's agent-observability-replay-experiment), building an experiment from a dataset\u002FCSV, writing evaluators, root-causing failed traces, or RUM\u002FHTTP session replay.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5660,5661,5662,5663,5664],{"name":20,"slug":21,"type":15},{"name":5587,"slug":5588,"type":15},{"name":5593,"slug":5594,"type":15},{"name":13,"slug":14,"type":15},{"name":5665,"slug":5666,"type":15},"Tracing","tracing","2026-08-06T05:38:08.57055",{"slug":5669,"name":5669,"fn":5670,"description":5671,"org":5672,"tags":5673,"stars":22,"repoUrl":23,"updatedAt":5679},"agent-observability-session-classify","evaluate user intent satisfaction in sessions","Classify whether user intent was satisfied in a Datadog Agent Observability trace or session. Three modes: (1) session_id — classify a single CMD+I assistant session with RUM; (2) trace_id — classify a single Agent Observability trace without RUM; (3) ml_app — sample and classify multiple sessions or traces from a given LLM app. Output is compact by default (verdict + one-sentence reason). Use when evaluating satisfaction, classifying sessions\u002Ftraces, labeling data, or generating signal for agent-observability-eval-pipeline or agent-observability-trace-rca.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5674,5675,5676,5677,5678],{"name":5631,"slug":5632,"type":15},{"name":20,"slug":21,"type":15},{"name":5590,"slug":5591,"type":15},{"name":5593,"slug":5594,"type":15},{"name":13,"slug":14,"type":15},"2026-06-19T09:04:26.341497",{"slug":5681,"name":5681,"fn":5682,"description":5683,"org":5684,"tags":5685,"stars":22,"repoUrl":23,"updatedAt":5691},"agent-observability-trace-rca","diagnose LLM application failures from traces","Root cause analysis on production LLM traces. Diagnoses why an LLM application is failing — works from eval judge verdicts, runtime errors, or structural anomalies depending on what signals are present. Walks the span tree from symptom to root cause. Use when user says \"what's wrong with my app\", \"why is my eval failing\", \"analyze errors\", \"root cause analysis\", \"diagnose failures\", or wants to understand production failure patterns.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5686,5687,5688,5689,5690],{"name":20,"slug":21,"type":15},{"name":5587,"slug":5588,"type":15},{"name":5590,"slug":5591,"type":15},{"name":5593,"slug":5594,"type":15},{"name":13,"slug":14,"type":15},"2026-06-19T09:04:24.316244",{"slug":5693,"name":5693,"fn":5694,"description":5695,"org":5696,"tags":5697,"stars":22,"repoUrl":23,"updatedAt":5703},"agent-skills","use Datadog observability skills","Datadog skills for AI agents. Essential monitoring, logging, tracing and observability.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5698,5699,5702],{"name":20,"slug":21,"type":15},{"name":5700,"slug":5701,"type":15},"Monitoring","monitoring",{"name":13,"slug":14,"type":15},"2026-08-16T03:30:06.569153",{"slug":5705,"name":5705,"fn":5706,"description":5707,"org":5708,"tags":5709,"stars":22,"repoUrl":23,"updatedAt":5723},"datadog-app","build and manage Datadog applications","Guides developers building Datadog Apps with TypeScript, React, the @datadog\u002Fapps scaffolder, and @datadog\u002Fvite-plugin. Use when a user wants to scaffold, run, debug, upgrade, build, upload, publish, upload without publishing (draft upload), add an upload-no-publish script, set up CI\u002FCD, use OAuth or API\u002Fapplication key auth, trigger\u002Fpoll Workflow Automation, choose DDSQL or Action Catalog for backend data access, or query app datastores with DDSQL, including backend function troubleshooting.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5710,5711,5714,5717,5720],{"name":20,"slug":21,"type":15},{"name":5712,"slug":5713,"type":15},"Frontend","frontend",{"name":5715,"slug":5716,"type":15},"React","react",{"name":5718,"slug":5719,"type":15},"TypeScript","typescript",{"name":5721,"slug":5722,"type":15},"Vite","vite","2026-06-18T08:01:32.562331",{"slug":4,"name":4,"fn":5,"description":6,"org":5725,"tags":5726,"stars":22,"repoUrl":23,"updatedAt":24},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5727,5728,5729],{"name":17,"slug":18,"type":15},{"name":20,"slug":21,"type":15},{"name":13,"slug":14,"type":15},38,{"items":5732,"total":5787},[5733,5740,5748,5755,5763,5771,5779],{"slug":5565,"name":5565,"fn":5566,"description":5567,"org":5734,"tags":5735,"stars":22,"repoUrl":23,"updatedAt":5578},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5736,5737,5738,5739],{"name":20,"slug":21,"type":15},{"name":5572,"slug":5573,"type":15},{"name":5575,"slug":5576,"type":15},{"name":13,"slug":14,"type":15},{"slug":5580,"name":5580,"fn":5581,"description":5582,"org":5741,"tags":5742,"stars":22,"repoUrl":23,"updatedAt":5596},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5743,5744,5745,5746,5747],{"name":20,"slug":21,"type":15},{"name":5587,"slug":5588,"type":15},{"name":5590,"slug":5591,"type":15},{"name":5593,"slug":5594,"type":15},{"name":13,"slug":14,"type":15},{"slug":5598,"name":5598,"fn":5599,"description":5600,"org":5749,"tags":5750,"stars":22,"repoUrl":23,"updatedAt":5607},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5751,5752,5753,5754],{"name":20,"slug":21,"type":15},{"name":5590,"slug":5591,"type":15},{"name":5593,"slug":5594,"type":15},{"name":13,"slug":14,"type":15},{"slug":5609,"name":5609,"fn":5610,"description":5611,"org":5756,"tags":5757,"stars":22,"repoUrl":23,"updatedAt":5623},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5758,5759,5760,5761,5762],{"name":5615,"slug":5616,"type":15},{"name":5618,"slug":5619,"type":15},{"name":20,"slug":21,"type":15},{"name":5590,"slug":5591,"type":15},{"name":13,"slug":14,"type":15},{"slug":5625,"name":5625,"fn":5626,"description":5627,"org":5764,"tags":5765,"stars":22,"repoUrl":23,"updatedAt":5637},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5766,5767,5768,5769,5770],{"name":5631,"slug":5632,"type":15},{"name":20,"slug":21,"type":15},{"name":5590,"slug":5591,"type":15},{"name":5593,"slug":5594,"type":15},{"name":13,"slug":14,"type":15},{"slug":5639,"name":5639,"fn":5640,"description":5641,"org":5772,"tags":5773,"stars":22,"repoUrl":23,"updatedAt":5653},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5774,5775,5776,5777,5778],{"name":20,"slug":21,"type":15},{"name":5646,"slug":5647,"type":15},{"name":5593,"slug":5594,"type":15},{"name":13,"slug":14,"type":15},{"name":5651,"slug":5652,"type":15},{"slug":5655,"name":5655,"fn":5656,"description":5657,"org":5780,"tags":5781,"stars":22,"repoUrl":23,"updatedAt":5667},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5782,5783,5784,5785,5786],{"name":20,"slug":21,"type":15},{"name":5587,"slug":5588,"type":15},{"name":5593,"slug":5594,"type":15},{"name":13,"slug":14,"type":15},{"name":5665,"slug":5666,"type":15},36]