PlatformsRedditExperiments

ExposeVariant

Domainexperiments
Kindmutation
doc_id—
Path/svc/shreddit/graphql
Sendsinput
Readsdata.exposeExperiment, errors, operation, extensions.traceID
Called fromruns/inspect/20261025T124815_MaleficentTry8338/script0.js:25 ai, runs/inspect/20261025T124815_MaleficentTry8338/script106.js:4200 statement
reaev_c479322079acc5e9705ab61a5e8726d5e92eaffedc0babbf6f5df7597c433dce

Seen 9 time(s) in 1 run(s).

ActionOur stepTimesStatusTookAfter step startErrors
inspectstep 1: goto /1200645 ms3131 ms—
inspectstep 3: goto /r/AskReddit/2200402–977 ms4824–5809 ms—
inspectstep 5: goto /search/2200359–373 ms1599–1600 ms—
inspectstep 6: goto /r/AskReddit/comments/1x8sr8s/whats_a_high_paying_but_soul_crushing_career_th1200319 ms1334 ms—
inspectstep 10: goto /user/Maleficent-Try-8338/1200336 ms2064 ms—
inspectstep 11: goto /notifications1200326 ms1703 ms—
inspectstep 12: goto /r/popular/1200313 ms1255 ms—

What it sent and what came back (the newest 3 from our runs)

Read from each run's own recording (rule 73), secrets and signed link tokens taken out. Kept in ~/.logCli/rea/clientFacts.json, so it stays after the run is pruned.

runs/inspect/20261025T124815_MaleficentTry8338, step 1: goto /: 200, 645 ms

Sent:

{
  "operation": "ExposeVariant",
  "variables": {
    "input": {
      "experimentName": "shreddit_search_expanded_composer",
      "variant": "ephemeral",
      "experimentVersion": "8"
    }
  }
}

Answered:

{
  "data": {
    "exposeExperiment": {
      "errors": null,
      "ok": true
    }
  },
  "errors": [],
  "operation": "ExposeVariant",
  "extensions": {
    "traceID": "c0cb2ac6056035935d479f3174747258"
  }
}

runs/inspect/20261025T124815_MaleficentTry8338, step 3: goto /r/AskReddit/: 200, 402 ms

Sent:

{
  "operation": "ExposeVariant",
  "variables": {
    "input": {
      "experimentName": "new_community_guidance_checklists_m1",
      "variant": "enabled",
      "experimentVersion": "1",
      "targetingInputs": [
        {
          "field": "subreddit_id",
          "value": "t5_2qh1i"
        }
      ]
    }
  }
}

Answered:

{
  "data": {
    "exposeExperiment": {
      "errors": null,
      "ok": true
    }
  },
  "errors": [],
  "operation": "ExposeVariant",
  "extensions": {
    "traceID": "81734c0ddba0d799eb72bb6374bca488"
  }
}

runs/inspect/20261025T124815_MaleficentTry8338, step 5: goto /search/: 200, 373 ms

Sent:

{
  "operation": "ExposeVariant",
  "variables": {
    "input": {
      "experimentName": "shreddit_search_expanded_composer",
      "variant": "ephemeral",
      "experimentVersion": "8"
    }
  }
}

Answered:

{
  "data": {
    "exposeExperiment": {
      "errors": null,
      "ok": true
    }
  },
  "errors": [],
  "operation": "ExposeVariant",
  "extensions": {
    "traceID": "4cd8eca9e11e912d69ee0d88982cce21"
  }
}

What it does

ai(e) sends the GraphQL mutation ExposeVariant with {input} to record that this user was shown one variant of an experiment: experimentName, variant, experimentVersion and sometimes targetingInputs (in our run, shreddit_search_expanded_composer ephemeral on home and search, and new_community_guidance_checklists_m1 enabled with r/AskReddit's id). The second call site is a GraphQL client that sends it as a persisted query, {name: "ExposeVariant", hash: "350fd154…"} (rea ev_c4793220…). It fired on every page we opened, as each experiment's feature came on screen.

What our machine does with it

log-cli's Reddit platform has only log reddit session check (the direct-API engine, with no Reddit client vendored yet) and log inspect in the account's AdsPower browser with no proxy (rule 84). Nothing waits on this call yet: inspect records it and names it in each step's exchanges.json, and SubQ reads it with the rest of the step. If log-cli acts on Reddit, these calls say which experiments our account is in, so a page that looks different between two runs can be checked against them first.

What can go wrong

All nine recorded calls answered 200 with ok: true and no errors. In the persisted-query client a 401 refreshes the token and tries again, any other status or an unreadable answer throws and is logged, and the call is abandoned after 10 s; none of this changes the page, so a failed exposure never stops a run.