| Server IP : 35.80.110.71 / Your IP : 216.73.216.221 Web Server : Apache/2.4.58 (Ubuntu) System : Linux ip-172-31-21-44 6.17.0-1019-aws #19~24.04.1-Ubuntu SMP Tue Jun 23 18:53:06 UTC 2026 x86_64 User : ubuntu ( 1000) PHP Version : 8.3.31 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : OFF Directory : /var/www/splitstream-web/.next/server/app/ |
Upload File : |
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/002zte3riz0h6.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/2xx73w8k5o69w.js"/><script src="/_next/static/chunks/0_bmh1s0g_5m3.js" async=""></script><script src="/_next/static/chunks/390e59xl7grtx.js" async=""></script><script src="/_next/static/chunks/3ss6b_eo0gpqh.js" async=""></script><script src="/_next/static/chunks/turbopack-0frl60onblppy.js" async=""></script><script src="/_next/static/chunks/3u-4v10_yuvs8.js" async=""></script><script src="/_next/static/chunks/31jk64s9j6agx.js" async=""></script><link rel="preload" href="https://www.googletagmanager.com/gtag/js?id=G-HZ8Z4XP611" as="script"/><title>Docs — Splitstream</title><meta name="description" content="Production-shaped A/B testing platform: sticky bucketing, mutex experiment groups, Sample Ratio Mismatch detection, guardrail metrics, an Octane carve-out for the hot path, and a Bayesian stats engine whose decision rule is empirically calibrated — not asserted."/><script src="/_next/static/chunks/0cz1d0mv5g_q7.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><header class="border-b border-(--color-paper-dim) bg-(--color-paper)"><div class="mx-auto flex max-w-6xl items-center justify-between px-6 py-5"><a class="text-lg font-bold tracking-tight text-(--color-ink) no-underline" href="/">Splitstream<span class="ml-2 rounded-full bg-(--color-accent-soft) px-2 py-0.5 text-xs font-medium text-(--color-accent) align-middle">portfolio demo</span></a><nav class="hidden md:flex items-center gap-5 text-sm text-(--color-ink-dim)"><a href="/docs">Docs</a><a href="/reference">API reference</a><a href="/sdks">SDKs</a><a href="/bucketing">Bucketing</a><a href="/stats-playground">Stats playground</a><a href="/with-pennant">With Pennant</a><a href="/about">About</a></nav><button type="button" aria-label="Open menu" aria-expanded="false" aria-controls="site-mobile-nav" class="md:hidden inline-flex items-center justify-center rounded-md border border-(--color-paper-dim) p-2 text-(--color-ink) cursor-pointer"><svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><line x1="3" y1="6" x2="21" y2="6"></line><line x1="3" y1="12" x2="21" y2="12"></line><line x1="3" y1="18" x2="21" y2="18"></line></svg></button></div></header><main class="mx-auto max-w-6xl px-6 py-10"><div class="grid grid-cols-1 gap-10 md:grid-cols-[220px_1fr]"><aside class="md:sticky md:top-6 md:self-start text-sm"><nav class="space-y-6"><div><div class="text-xs font-semibold uppercase tracking-wider text-(--color-ink-dim)">Get started</div><ul class="mt-2 space-y-1.5"><li><a class="block rounded px-2 py-1 text-(--color-ink) no-underline hover:bg-(--color-paper-dim)" href="/docs">Overview</a></li><li><a class="block rounded px-2 py-1 text-(--color-ink) no-underline hover:bg-(--color-paper-dim)" href="/sdks">SDKs</a></li><li><a class="block rounded px-2 py-1 text-(--color-ink) no-underline hover:bg-(--color-paper-dim)" href="/reference">API reference</a></li></ul></div><div><div class="text-xs font-semibold uppercase tracking-wider text-(--color-ink-dim)">Concepts</div><ul class="mt-2 space-y-1.5"><li><a class="block rounded px-2 py-1 text-(--color-ink) no-underline hover:bg-(--color-paper-dim)" href="/docs/concepts/bayesian-inference">Bayesian inference (calibrated)</a></li><li><a class="block rounded px-2 py-1 text-(--color-ink) no-underline hover:bg-(--color-paper-dim)" href="/docs/concepts/sticky-assignment">Sticky assignment</a></li><li><a class="block rounded px-2 py-1 text-(--color-ink) no-underline hover:bg-(--color-paper-dim)" href="/docs/concepts/bucketing">Bucketing</a></li><li><a class="block rounded px-2 py-1 text-(--color-ink) no-underline hover:bg-(--color-paper-dim)" href="/docs/concepts/peeking">Peeking discipline</a></li><li><a class="block rounded px-2 py-1 text-(--color-ink) no-underline hover:bg-(--color-paper-dim)" href="/docs/concepts/srm">Sample Ratio Mismatch</a></li><li><a class="block rounded px-2 py-1 text-(--color-ink) no-underline hover:bg-(--color-paper-dim)" href="/docs/concepts/mutex-groups">Mutex groups</a></li></ul></div><div><div class="text-xs font-semibold uppercase tracking-wider text-(--color-ink-dim)">Pair with Pennant</div><ul class="mt-2 space-y-1.5"><li><a class="block rounded px-2 py-1 text-(--color-ink) no-underline hover:bg-(--color-paper-dim)" href="/with-pennant">Joint quickstart</a></li></ul></div></nav></aside><article class="prose"><h1 class="text-3xl font-bold">Splitstream docs</h1><p>Splitstream is the experimentation half of a feature-rollout pair. Pennant decides <em>whether</em> a feature ships. Splitstream decides<!-- --> <em>which variant</em> a user sees and <em>whether the variant moved the metric.</em> The two ship a joint quickstart via the<!-- --> <a href="/with-pennant">growth wrapper</a>; the rest of this section explains the load-bearing pieces of Splitstream itself.</p><h2>The defaults are calibrated, not asserted.</h2><p>The most important thing to read first is<!-- --> <a href="/docs/concepts/bayesian-inference">/docs/concepts/bayesian-inference</a>. The plan's draft thresholds (<code>0.95 / 1,000 / 15 min</code>) delivered <strong>66% empirical false-positive rate</strong> in our null-effect simulation. The calibrated tuple is<!-- --> <code>0.995 / 20,000 / 240 min</code>; that's the default every new experiment inherits. Lowering thresholds without re-running the simulation re-inflates the false-positive rate.</p><h2>What the docs cover</h2><ul><li><a href="/docs/concepts/bayesian-inference">Bayesian inference</a> <!-- -->— the calibration table and why your prior intuitions about peeking are wrong.</li><li><a href="/docs/concepts/sticky-assignment">Sticky assignment</a> <!-- -->— sticky-forever, mid-experiment weight-change semantics, and the force-rebucket tombstone story.</li><li><a href="/docs/concepts/bucketing">Bucketing</a> — the hash function and the cross-SDK corpus that guards drift.</li><li><a href="/docs/concepts/peeking">Peeking discipline</a> — why every dashboard open is logged and how the audit log reads.</li><li><a href="/docs/concepts/srm">Sample Ratio Mismatch</a> — the chi-squared monitor that catches bucket-pipeline bugs.</li><li><a href="/docs/concepts/mutex-groups">Mutex groups</a> — mutually exclusive experiments, forward-only semantics, and the SELECT FOR UPDATE race protection.</li></ul><h2>Where to start writing code</h2><p>Five-line samples per stack live on the<!-- --> <a href="/">home page</a>. Full SDK references and install instructions are on <a href="/sdks">/sdks</a>. The API surface is rendered inline at<!-- --> <a href="/reference">/reference</a> via Scalar.</p><!--$--><!--/$--></article></div></main><footer class="border-t border-(--color-paper-dim) mt-20"><div class="mx-auto flex max-w-6xl items-center justify-between px-6 py-8 text-sm text-(--color-ink-dim)"><div>Splitstream is a portfolio demonstration by<!-- --> <a href="https://philiprehberger.com">Philip Rehberger</a>.</div><div class="flex flex-wrap gap-4"><a href="https://github.com/philiprehberger/splitstream">GitHub</a><a href="/pricing">Pricing</a><a href="/downloads">Downloads</a><a href="/status">Status</a><a href="/about">About this demo</a></div></div></footer><script src="/_next/static/chunks/2xx73w8k5o69w.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[79404,[\"/_next/static/chunks/3u-4v10_yuvs8.js\",\"/_next/static/chunks/31jk64s9j6agx.js\"],\"default\"]\n3:I[88287,[\"/_next/static/chunks/3u-4v10_yuvs8.js\",\"/_next/static/chunks/31jk64s9j6agx.js\"],\"default\"]\n4:I[74895,[\"/_next/static/chunks/3u-4v10_yuvs8.js\",\"/_next/static/chunks/31jk64s9j6agx.js\"],\"default\"]\n5:I[4561,[\"/_next/static/chunks/3u-4v10_yuvs8.js\",\"/_next/static/chunks/31jk64s9j6agx.js\"],\"\"]\n6:I[70805,[\"/_next/static/chunks/3u-4v10_yuvs8.js\",\"/_next/static/chunks/31jk64s9j6agx.js\"],\"default\"]\nf:I[52576,[\"/_next/static/chunks/3u-4v10_yuvs8.js\",\"/_next/static/chunks/31jk64s9j6agx.js\"],\"default\",1]\n:HL[\"/_next/static/chunks/002zte3riz0h6.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"docs\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"docs\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/002zte3riz0h6.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/3u-4v10_yuvs8.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/31jk64s9j6agx.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[\"$\",\"body\",null,{\"children\":[[\"$\",\"$L2\",null,{}],[\"$\",\"main\",null,{\"className\":\"mx-auto max-w-6xl px-6 py-10\",\"children\":[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}],[\"$\",\"footer\",null,{\"className\":\"border-t border-(--color-paper-dim) mt-20\",\"children\":[\"$\",\"div\",null,{\"className\":\"mx-auto flex max-w-6xl items-center justify-between px-6 py-8 text-sm text-(--color-ink-dim)\",\"children\":[[\"$\",\"div\",null,{\"children\":[\"Splitstream is a portfolio demonstration by\",\" \",[\"$\",\"a\",null,{\"href\":\"https://philiprehberger.com\",\"children\":\"Philip Rehberger\"}],\".\"]}],[\"$\",\"div\",null,{\"className\":\"flex flex-wrap gap-4\",\"children\":[[\"$\",\"a\",null,{\"href\":\"https://github.com/philiprehberger/splitstream\",\"children\":\"GitHub\"}],[\"$\",\"$L5\",null,{\"href\":\"/pricing\",\"children\":\"Pricing\"}],[\"$\",\"$L5\",null,{\"href\":\"/downloads\",\"children\":\"Downloads\"}],[\"$\",\"$L5\",null,{\"href\":\"/status\",\"children\":\"Status\"}],[\"$\",\"$L5\",null,{\"href\":\"/about\",\"children\":\"About this demo\"}]]}]]}]}],[\"$\",\"$L6\",null,{}]]}]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"div\",null,{\"className\":\"grid grid-cols-1 gap-10 md:grid-cols-[220px_1fr]\",\"children\":[[\"$\",\"aside\",null,{\"className\":\"md:sticky md:top-6 md:self-start text-sm\",\"children\":[\"$\",\"nav\",null,{\"className\":\"space-y-6\",\"children\":[[\"$\",\"div\",\"Get started\",{\"children\":[[\"$\",\"div\",null,{\"className\":\"text-xs font-semibold uppercase tracking-wider text-(--color-ink-dim)\",\"children\":\"Get started\"}],[\"$\",\"ul\",null,{\"className\":\"mt-2 space-y-1.5\",\"children\":[[\"$\",\"li\",\"/docs\",{\"children\":[\"$\",\"$L5\",null,{\"href\":\"/docs\",\"className\":\"block rounded px-2 py-1 text-(--color-ink) no-underline hover:bg-(--color-paper-dim)\",\"children\":\"Overview\"}]}],[\"$\",\"li\",\"/sdks\",{\"children\":[\"$\",\"$L5\",null,{\"href\":\"/sdks\",\"className\":\"block rounded px-2 py-1 text-(--color-ink) no-underline hover:bg-(--color-paper-dim)\",\"children\":\"SDKs\"}]}],[\"$\",\"li\",\"/reference\",{\"children\":[\"$\",\"$L5\",null,{\"href\":\"/reference\",\"className\":\"block rounded px-2 py-1 text-(--color-ink) no-underline hover:bg-(--color-paper-dim)\",\"children\":\"API reference\"}]}]]}]]}],[\"$\",\"div\",\"Concepts\",{\"children\":[[\"$\",\"div\",null,{\"className\":\"text-xs font-semibold uppercase tracking-wider text-(--color-ink-dim)\",\"children\":\"Concepts\"}],[\"$\",\"ul\",null,{\"className\":\"mt-2 space-y-1.5\",\"children\":[[\"$\",\"li\",\"/docs/concepts/bayesian-inference\",{\"children\":[\"$\",\"$L5\",null,{\"href\":\"/docs/concepts/bayesian-inference\",\"className\":\"block rounded px-2 py-1 text-(--color-ink) no-underline hover:bg-(--color-paper-dim)\",\"children\":\"Bayesian inference (calibrated)\"}]}],[\"$\",\"li\",\"/docs/concepts/sticky-assignment\",{\"children\":[\"$\",\"$L5\",null,{\"href\":\"/docs/concepts/sticky-assignment\",\"className\":\"block rounded px-2 py-1 text-(--color-ink) no-underline hover:bg-(--color-paper-dim)\",\"children\":\"Sticky assignment\"}]}],\"$L7\",\"$L8\",\"$L9\",\"$La\"]}]]}],\"$Lb\"]}]}],\"$Lc\"]}]]}],{\"children\":[\"$Ld\",{},null,false,null]},null,false,null]},null,false,null],\"$Le\",false]],\"m\":\"$undefined\",\"G\":[\"$f\",[\"$L10\"]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"d4p1Nsp7dnkNrIm-L0oJl\"}\n"])</script><script>self.__next_f.push([1,"11:I[51858,[\"/_next/static/chunks/3u-4v10_yuvs8.js\",\"/_next/static/chunks/31jk64s9j6agx.js\"],\"OutletBoundary\"]\n12:\"$Sreact.suspense\"\n14:I[51858,[\"/_next/static/chunks/3u-4v10_yuvs8.js\",\"/_next/static/chunks/31jk64s9j6agx.js\"],\"ViewportBoundary\"]\n16:I[51858,[\"/_next/static/chunks/3u-4v10_yuvs8.js\",\"/_next/static/chunks/31jk64s9j6agx.js\"],\"MetadataBoundary\"]\n7:[\"$\",\"li\",\"/docs/concepts/bucketing\",{\"children\":[\"$\",\"$L5\",null,{\"href\":\"/docs/concepts/bucketing\",\"className\":\"block rounded px-2 py-1 text-(--color-ink) no-underline hover:bg-(--color-paper-dim)\",\"children\":\"Bucketing\"}]}]\n8:[\"$\",\"li\",\"/docs/concepts/peeking\",{\"children\":[\"$\",\"$L5\",null,{\"href\":\"/docs/concepts/peeking\",\"className\":\"block rounded px-2 py-1 text-(--color-ink) no-underline hover:bg-(--color-paper-dim)\",\"children\":\"Peeking discipline\"}]}]\n9:[\"$\",\"li\",\"/docs/concepts/srm\",{\"children\":[\"$\",\"$L5\",null,{\"href\":\"/docs/concepts/srm\",\"className\":\"block rounded px-2 py-1 text-(--color-ink) no-underline hover:bg-(--color-paper-dim)\",\"children\":\"Sample Ratio Mismatch\"}]}]\na:[\"$\",\"li\",\"/docs/concepts/mutex-groups\",{\"children\":[\"$\",\"$L5\",null,{\"href\":\"/docs/concepts/mutex-groups\",\"className\":\"block rounded px-2 py-1 text-(--color-ink) no-underline hover:bg-(--color-paper-dim)\",\"children\":\"Mutex groups\"}]}]\nb:[\"$\",\"div\",\"Pair with Pennant\",{\"children\":[[\"$\",\"div\",null,{\"className\":\"text-xs font-semibold uppercase tracking-wider text-(--color-ink-dim)\",\"children\":\"Pair with Pennant\"}],[\"$\",\"ul\",null,{\"className\":\"mt-2 space-y-1.5\",\"children\":[[\"$\",\"li\",\"/with-pennant\",{\"children\":[\"$\",\"$L5\",null,{\"href\":\"/with-pennant\",\"className\":\"block rounded px-2 py-1 text-(--color-ink) no-underline hover:bg-(--color-paper-dim)\",\"children\":\"Joint quickstart\"}]}]]}]]}]\nc:[\"$\",\"article\",null,{\"className\":\"prose\",\"children\":[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]\n"])</script><script>self.__next_f.push([1,"d:[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"h1\",null,{\"className\":\"text-3xl font-bold\",\"children\":\"Splitstream docs\"}],[\"$\",\"p\",null,{\"children\":[\"Splitstream is the experimentation half of a feature-rollout pair. Pennant decides \",[\"$\",\"em\",null,{\"children\":\"whether\"}],\" a feature ships. Splitstream decides\",\" \",[\"$\",\"em\",null,{\"children\":\"which variant\"}],\" a user sees and \",[\"$\",\"em\",null,{\"children\":\"whether the variant moved the metric.\"}],\" The two ship a joint quickstart via the\",\" \",[\"$\",\"$L5\",null,{\"href\":\"/with-pennant\",\"children\":\"growth wrapper\"}],\"; the rest of this section explains the load-bearing pieces of Splitstream itself.\"]}],[\"$\",\"h2\",null,{\"children\":\"The defaults are calibrated, not asserted.\"}],[\"$\",\"p\",null,{\"children\":[\"The most important thing to read first is\",\" \",[\"$\",\"$L5\",null,{\"href\":\"/docs/concepts/bayesian-inference\",\"children\":\"/docs/concepts/bayesian-inference\"}],\". The plan's draft thresholds (\",[\"$\",\"code\",null,{\"children\":\"0.95 / 1,000 / 15 min\"}],\") delivered \",[\"$\",\"strong\",null,{\"children\":\"66% empirical false-positive rate\"}],\" in our null-effect simulation. The calibrated tuple is\",\" \",[\"$\",\"code\",null,{\"children\":\"0.995 / 20,000 / 240 min\"}],\"; that's the default every new experiment inherits. Lowering thresholds without re-running the simulation re-inflates the false-positive rate.\"]}],[\"$\",\"h2\",null,{\"children\":\"What the docs cover\"}],[\"$\",\"ul\",null,{\"children\":[[\"$\",\"li\",null,{\"children\":[[\"$\",\"$L5\",null,{\"href\":\"/docs/concepts/bayesian-inference\",\"children\":\"Bayesian inference\"}],\" \",\"— the calibration table and why your prior intuitions about peeking are wrong.\"]}],[\"$\",\"li\",null,{\"children\":[[\"$\",\"$L5\",null,{\"href\":\"/docs/concepts/sticky-assignment\",\"children\":\"Sticky assignment\"}],\" \",\"— sticky-forever, mid-experiment weight-change semantics, and the force-rebucket tombstone story.\"]}],[\"$\",\"li\",null,{\"children\":[[\"$\",\"$L5\",null,{\"href\":\"/docs/concepts/bucketing\",\"children\":\"Bucketing\"}],\" — the hash function and the cross-SDK corpus that guards drift.\"]}],[\"$\",\"li\",null,{\"children\":[[\"$\",\"$L5\",null,{\"href\":\"/docs/concepts/peeking\",\"children\":\"Peeking discipline\"}],\" — why every dashboard open is logged and how the audit log reads.\"]}],[\"$\",\"li\",null,{\"children\":[[\"$\",\"$L5\",null,{\"href\":\"/docs/concepts/srm\",\"children\":\"Sample Ratio Mismatch\"}],\" — the chi-squared monitor that catches bucket-pipeline bugs.\"]}],[\"$\",\"li\",null,{\"children\":[[\"$\",\"$L5\",null,{\"href\":\"/docs/concepts/mutex-groups\",\"children\":\"Mutex groups\"}],\" — mutually exclusive experiments, forward-only semantics, and the SELECT FOR UPDATE race protection.\"]}]]}],[\"$\",\"h2\",null,{\"children\":\"Where to start writing code\"}],[\"$\",\"p\",null,{\"children\":[\"Five-line samples per stack live on the\",\" \",[\"$\",\"$L5\",null,{\"href\":\"/\",\"children\":\"home page\"}],\". Full SDK references and install instructions are on \",[\"$\",\"$L5\",null,{\"href\":\"/sdks\",\"children\":\"/sdks\"}],\". The API surface is rendered inline at\",\" \",[\"$\",\"$L5\",null,{\"href\":\"/reference\",\"children\":\"/reference\"}],\" via Scalar.\"]}]],null,[\"$\",\"$L11\",null,{\"children\":[\"$\",\"$12\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@13\"}]}]]}]\n"])</script><script>self.__next_f.push([1,"e:[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L14\",null,{\"children\":\"$L15\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L16\",null,{\"children\":[\"$\",\"$12\",null,{\"name\":\"Next.Metadata\",\"children\":\"$L17\"}]}]}],null]}]\n10:[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/002zte3riz0h6.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]\n"])</script><script>self.__next_f.push([1,"15:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"13:null\n17:[[\"$\",\"title\",\"0\",{\"children\":\"Docs — Splitstream\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Production-shaped A/B testing platform: sticky bucketing, mutex experiment groups, Sample Ratio Mismatch detection, guardrail metrics, an Octane carve-out for the hot path, and a Bayesian stats engine whose decision rule is empirically calibrated — not asserted.\"}]]\n"])</script></body></html>