>;
+};
+
+export function withExperiment(
+Control: React.ComponentType
,
+opts: WithExperimentOpts
+): React.ComponentType
void; probat?: { trackClick: () => void } }> {
+const { proposalId, registry } = opts;
+
+function Wrapped(props: P) {
+ const [choice, setChoice] = React.useState<{ experiment_id: string; label: string } | null>(null);
+
+ React.useEffect(() => {
+ let alive = true;
+
+ const cached = readChoice(proposalId);
+ if (cached) {
+ setChoice({ experiment_id: cached.experiment_id, label: cached.label });
+ }
+
+ if (!cached) {
+ (async () => {
+ try {
+ const { experiment_id, label } = await fetchDecision(ENV_BASE, proposalId);
+ if (!alive) return;
+ setChoice({ experiment_id, label });
+ } catch (e) {
+ if (!alive) return;
+ setChoice({ experiment_id: `exp_${proposalId}`, label: "control" });
+ }
+ })();
+ }
+
+ return () => { alive = false; };
+ }, [proposalId]);
+
+ const trackClick = React.useCallback(() => {
+ const exp = choice?.experiment_id;
+ const lbl = choice?.label ?? "control";
+ void sendClickMetric(ENV_BASE, proposalId, exp, lbl);
+ }, [proposalId, choice?.experiment_id, choice?.label]);
+
+ const label = choice?.label ?? "control";
+ const Variant = registry[label] || Control;
+
+ const key = `${proposalId}:${label}`;
+ return (
+
+ {React.createElement(Variant, {
+ key,
+ ...(props as any),
+ onProbatClick: trackClick,
+ probat: { trackClick },
+ })}
+
+ );
+}
+
+(Wrapped as any).displayName = `withExperiment(${(Control as any).displayName || Control.name || "Component"})`;
+return Wrapped as any;
+}
From 84332c56b250513402785915a51490174fdaa195 Mon Sep 17 00:00:00 2001
From: "probatai[bot]" <236084945+probatai[bot]@users.noreply.github.com>
Date: Thu, 6 Nov 2025 13:30:34 +0000
Subject: [PATCH 11/14] Add probat/index.tsx
---
probat/index.tsx | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 probat/index.tsx
diff --git a/probat/index.tsx b/probat/index.tsx
new file mode 100644
index 00000000..c5493906
--- /dev/null
+++ b/probat/index.tsx
@@ -0,0 +1,4 @@
+// probat/index.tsx
+export { withExperiment } from "./runtime";
+export { PROBAT_REGISTRIES } from "./registry";
+export { PROBAT_COMPONENTS } from "./config";
From f3cc65cce10021f598ecc8071a962ebfbf663f4d Mon Sep 17 00:00:00 2001
From: "probatai[bot]" <236084945+probatai[bot]@users.noreply.github.com>
Date: Thu, 6 Nov 2025 13:30:41 +0000
Subject: [PATCH 12/14] Ensure probat/config.tsx entry
---
probat/config.tsx | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 probat/config.tsx
diff --git a/probat/config.tsx b/probat/config.tsx
new file mode 100644
index 00000000..26f57be3
--- /dev/null
+++ b/probat/config.tsx
@@ -0,0 +1,4 @@
+// probat/config.tsx
+export const PROBAT_COMPONENTS: Record = {
+ "src/components/Hero.tsx": { proposalId: "fd2cbb1a-bc48-4729-98c2-6b746d742004" }
+};
From 4cdcc27da10deda96bbeaa0befebc91416a141fd Mon Sep 17 00:00:00 2001
From: "probatai[bot]" <236084945+probatai[bot]@users.noreply.github.com>
Date: Thu, 6 Nov 2025 13:30:47 +0000
Subject: [PATCH 13/14] Ensure probat/registry.tsx entry
---
probat/registry.tsx | 24 ++++++++++++++++++++++++
1 file changed, 24 insertions(+)
create mode 100644 probat/registry.tsx
diff --git a/probat/registry.tsx b/probat/registry.tsx
new file mode 100644
index 00000000..edebdbf9
--- /dev/null
+++ b/probat/registry.tsx
@@ -0,0 +1,24 @@
+// probat/registry.tsx
+ import type React from "react";
+ import Exp_0_b from "./fd2cbb1a-bc48-4729-98c2-6b746d742004/cfb29f35-4501-4ffe-bd95-b4498eaf0d97";
+import Exp_1_c from "./fd2cbb1a-bc48-4729-98c2-6b746d742004/a3eeb671-6901-431c-9042-e5b685c0b8b4";
+import Exp_2_d from "./fd2cbb1a-bc48-4729-98c2-6b746d742004/eb3e6f3a-1807-4f31-bc98-9814819a0e8a";
+import Exp_3_e from "./fd2cbb1a-bc48-4729-98c2-6b746d742004/cd461870-5e0a-4d1a-af2a-8fdf12ad6dd8";
+import Exp_4_f from "./fd2cbb1a-bc48-4729-98c2-6b746d742004/dc22eaf7-b085-4b4f-88ab-c74a6970a7af";
+import Exp_5_g from "./fd2cbb1a-bc48-4729-98c2-6b746d742004/7a27d50c-7372-4af1-b958-6fedf692036f";
+import Exp_6_h from "./fd2cbb1a-bc48-4729-98c2-6b746d742004/8eab0fb6-e06a-4f98-b953-730648874b83";
+import Exp_7_i from "./fd2cbb1a-bc48-4729-98c2-6b746d742004/b121f38e-246f-484e-af03-b46e1a419314";
+import Exp_8_j from "./fd2cbb1a-bc48-4729-98c2-6b746d742004/8f6a9218-dc3e-46d6-9bfe-0a172143faef";
+ export const PROBAT_REGISTRIES: Record>> = {
+ "src/components/Hero.tsx": {
+ "b": Exp_0_b,
+ "c": Exp_1_c,
+ "d": Exp_2_d,
+ "e": Exp_3_e,
+ "f": Exp_4_f,
+ "g": Exp_5_g,
+ "h": Exp_6_h,
+ "i": Exp_7_i,
+ "j": Exp_8_j,
+ },
+ };
From b66f028f8e3dc13452450bc1cea6df5c2108122d Mon Sep 17 00:00:00 2001
From: "probatai[bot]" <236084945+probatai[bot]@users.noreply.github.com>
Date: Thu, 6 Nov 2025 13:31:03 +0000
Subject: [PATCH 14/14] probat: auto-edit component to integrate Probat at
src/components/Hero.tsx
---
src/components/Hero.tsx | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/src/components/Hero.tsx b/src/components/Hero.tsx
index 66d7f27c..5bcab4f7 100644
--- a/src/components/Hero.tsx
+++ b/src/components/Hero.tsx
@@ -1,6 +1,10 @@
import React from 'react'
+import { withExperiment } from "../../probat/runtime";
+import { PROBAT_COMPONENTS, PROBAT_REGISTRIES } from "../../probat/index";
import './Hero.css'
+const __PROBAT_KEY__ = "src/components/Hero.tsx";
+
const Hero: React.FC = () => {
return (
@@ -61,4 +65,11 @@ const Hero: React.FC = () => {
)
}
-export default Hero
+// Probat Generate Lines.
+export default (() => {
+ const meta = PROBAT_COMPONENTS[__PROBAT_KEY__];
+ const reg = PROBAT_REGISTRIES[__PROBAT_KEY__] as Record> | undefined;
+ return (meta?.proposalId && reg)
+ ? withExperiment(Hero as any, { proposalId: meta.proposalId, registry: reg })
+ : Hero;
+})();