>;
+};
+
+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 ace2eeaa73ba209ffc1ee32f2b97c8a12418c7ef Mon Sep 17 00:00:00 2001
From: "probatai[bot]" <236084945+probatai[bot]@users.noreply.github.com>
Date: Tue, 11 Nov 2025 08:53:14 +0000
Subject: [PATCH 08/11] 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 5bd8dc482427616c52e57494368ef243eed83ddf Mon Sep 17 00:00:00 2001
From: "probatai[bot]" <236084945+probatai[bot]@users.noreply.github.com>
Date: Tue, 11 Nov 2025 08:53:21 +0000
Subject: [PATCH 09/11] 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..bd20c22a
--- /dev/null
+++ b/probat/config.tsx
@@ -0,0 +1,4 @@
+// probat/config.tsx
+export const PROBAT_COMPONENTS: Record = {
+ "src/components/Header.tsx": { proposalId: "0724676c-cf2b-4c3b-929d-2503d4d95ba4" }
+};
From 7ec56d200d0f21ca7e3f6c608559fb0ab7e5ed35 Mon Sep 17 00:00:00 2001
From: "probatai[bot]" <236084945+probatai[bot]@users.noreply.github.com>
Date: Tue, 11 Nov 2025 08:53:28 +0000
Subject: [PATCH 10/11] Ensure probat/registry.tsx entry
---
probat/registry.tsx | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
create mode 100644 probat/registry.tsx
diff --git a/probat/registry.tsx b/probat/registry.tsx
new file mode 100644
index 00000000..34ff9785
--- /dev/null
+++ b/probat/registry.tsx
@@ -0,0 +1,18 @@
+// probat/registry.tsx
+ import type React from "react";
+ import Exp_0_b from "./0724676c-cf2b-4c3b-929d-2503d4d95ba4/12e22a6d-64a4-4a18-a592-1b34cc7afcf3";
+import Exp_1_c from "./0724676c-cf2b-4c3b-929d-2503d4d95ba4/f4f94182-2926-4c74-94e1-8cbf0c438a24";
+import Exp_2_d from "./0724676c-cf2b-4c3b-929d-2503d4d95ba4/49c1d2ed-8af1-4172-aa89-b38da3a00bb0";
+import Exp_3_f from "./0724676c-cf2b-4c3b-929d-2503d4d95ba4/c8d92df7-0138-4815-b6ed-47eb92f8facc";
+import Exp_4_h from "./0724676c-cf2b-4c3b-929d-2503d4d95ba4/427c2161-ba7d-45c4-85eb-5f9297ce1e54";
+import Exp_5_i from "./0724676c-cf2b-4c3b-929d-2503d4d95ba4/1d0e03bb-5695-4cc8-8ffc-5eecfd0f13bd";
+ export const PROBAT_REGISTRIES: Record>> = {
+ "src/components/Header.tsx": {
+ "b": Exp_0_b,
+ "c": Exp_1_c,
+ "d": Exp_2_d,
+ "f": Exp_3_f,
+ "h": Exp_4_h,
+ "i": Exp_5_i,
+ },
+ };
From 9a9c0873c810409e99f6cf15c537053797c9af59 Mon Sep 17 00:00:00 2001
From: "probatai[bot]" <236084945+probatai[bot]@users.noreply.github.com>
Date: Tue, 11 Nov 2025 08:53:44 +0000
Subject: [PATCH 11/11] probat: auto-edit component to integrate Probat at
src/components/Header.tsx
---
src/components/Header.tsx | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/src/components/Header.tsx b/src/components/Header.tsx
index be70b06a..84dd358f 100644
--- a/src/components/Header.tsx
+++ b/src/components/Header.tsx
@@ -1,6 +1,10 @@
import React, { useState } from 'react'
+import { withExperiment } from "../../probat/runtime";
+import { PROBAT_COMPONENTS, PROBAT_REGISTRIES } from "../../probat/index";
import './Header.css'
+const __PROBAT_KEY__ = "src/components/Header.tsx";
+
const Header: React.FC = () => {
const [isMenuOpen, setIsMenuOpen] = useState(false)
@@ -43,4 +47,11 @@ const Header: React.FC = () => {
)
}
-export default Header
+// 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(Header as any, { proposalId: meta.proposalId, registry: reg })
+ : Header;
+})();