diff --git a/.DS_Store b/.DS_Store
index 8903b5a..0e69b9c 100644
Binary files a/.DS_Store and b/.DS_Store differ
diff --git a/2026/Pruebas.ipynb b/2026/Pruebas.ipynb
new file mode 100644
index 0000000..d657b8e
--- /dev/null
+++ b/2026/Pruebas.ipynb
@@ -0,0 +1,3371 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "60c83d5b",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "θ=1.00e-04 rad | kept=4080/5000 | err=25 | rate=2.04e-03\n",
+ "θ=1.00e-03 rad | kept=4040/5000 | err=19 | rate=1.57e-03\n",
+ "θ=1.00e-02 rad | kept=3766/5000 | err=25 | rate=2.21e-03\n",
+ "θ=1.00e-01 rad | kept=2843/5000 | err=13 | rate=1.52e-03\n",
+ "θ=1.00e+00 rad | kept=1145/5000 | err=30 | rate=8.73e-03\n"
+ ]
+ },
+ {
+ "data": {
+ "image/svg+xml": [
+ "\n",
+ "\n",
+ "\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "import re\n",
+ "import numpy as np\n",
+ "import matplotlib.pyplot as plt\n",
+ "from tsim import Circuit\n",
+ "import pymatching\n",
+ "\n",
+ "def physical_angle(logical_angle_in_pi: float, num_physical_rotations: int) -> float:\n",
+ " \"\"\"\n",
+ " Compute the physical rotation angle needed to achieve a logical rotation of\n",
+ " angle `logical_angle_in_pi` on `num_physical_rotations` physical rotations.\n",
+ "\n",
+ " Args:\n",
+ " logical_angle_in_pi (float): The logical rotation angle in units of pi.\n",
+ " num_physical_rotations (int): The number of physical rotations that are applied.\n",
+ " Returns:\n",
+ " float: The physical rotation angle in units of pi.\n",
+ " \"\"\"\n",
+ "\n",
+ " assert (\n",
+ " num_physical_rotations % 2 == 1 and num_physical_rotations > 0\n",
+ " ), \"k must be a positive odd integer\"\n",
+ " sign = -1 if (num_physical_rotations + 1) % 4 == 0 else 1\n",
+ " logical_angle_in_rad = logical_angle_in_pi * np.pi\n",
+ " x = np.tan(logical_angle_in_rad / 2) ** (1 / num_physical_rotations)\n",
+ " theta_phys = 2 * np.arctan(x)\n",
+ " return float(sign * theta_phys / np.pi)\n",
+ "\n",
+ "def load_stim_with_angle(path, d, logical_angle_in_pi):\n",
+ " phys = physical_angle(logical_angle_in_pi, d) # ya en π-units\n",
+ " with open(path) as f: circ_str = f.read()\n",
+ " matches = list(re.finditer(r'R_Z\\([^)]+\\)', circ_str))\n",
+ " # Último primero para no invalidar índices\n",
+ " last = matches[-1]\n",
+ " circ_str = circ_str[:last.start()] + f'R_Z({-logical_angle_in_pi:.10f})' + circ_str[last.end():]\n",
+ " first = matches[0]\n",
+ " circ_str = circ_str[:first.start()] + f'R_Z({phys:.10f})' + circ_str[first.end():]\n",
+ " return Circuit(circ_str)\n",
+ "\n",
+ "# ── Solo d=3 ─────────────────────────────────────────────────────────────────\n",
+ "d = 3\n",
+ "shots = 5_000\n",
+ "num_postselect = 3 * (d**2 - 1) # 24\n",
+ "angle_vals_rad = np.logspace(-4, 0, 5) # θ en radianes\n",
+ "rates = []\n",
+ "\n",
+ "for theta_rad in angle_vals_rad:\n",
+ " logical_angle_in_pi = theta_rad / np.pi # convertir rad → π-units\n",
+ "\n",
+ " circ = load_stim_with_angle(f\"assets/star_circuits/star_d={d}.stim\", d=d, logical_angle_in_pi=logical_angle_in_pi)\n",
+ " dem = circ.detector_error_model()\n",
+ " matcher = pymatching.Matching.from_detector_error_model(dem)\n",
+ " sampler = circ.compile_detector_sampler()\n",
+ "\n",
+ " detections, observations = sampler.sample(shots, separate_observables=True)\n",
+ " predictions = matcher.decode_batch(detections)\n",
+ "\n",
+ " postselected = [i for i in range(len(detections)) if not any(detections[i][:num_postselect])]\n",
+ " num_errors = sum(1 for idx in postselected if not np.array_equal(observations[idx], predictions[idx]))\n",
+ " n_kept = len(postselected)\n",
+ " rate = (num_errors / n_kept / d) if n_kept > 0 else np.nan\n",
+ " rates.append(rate if rate and rate > 0 else np.nan)\n",
+ " print(f\"θ={theta_rad:.2e} rad | kept={n_kept}/{shots} | err={num_errors} | rate={rate:.2e}\")\n",
+ "\n",
+ "fig, ax = plt.subplots(figsize=(8, 5))\n",
+ "vals = [(t, r) for t, r in zip(angle_vals_rad, rates) if not np.isnan(r)]\n",
+ "if vals: ax.plot(*zip(*vals), \"o-\", color=\"royalblue\", label=\"d=3 (17 qubits)\")\n",
+ "ax.set_xscale(\"log\"); ax.set_yscale(\"log\")\n",
+ "ax.set_xlabel(\"Rotation angle θ (rad)\")\n",
+ "ax.set_ylabel(\"Logical error rate / distance\")\n",
+ "ax.legend(); ax.set_title(\"STAR Fidelity — d=3\")\n",
+ "plt.tight_layout(); plt.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "4e27eda1",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "d=3...\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "E0510 11:10:28.901973 1414027 slow_operation_alarm.cc:73] Constant folding an instruction is taking > 1s:\n",
+ "\n",
+ " %gather.41 = s32[4100041,1,4]{2,1,0} gather(%constant.719, %broadcast.722), offset_dims={1,2}, collapsed_slice_dims={}, start_index_map={0}, index_vector_dim=1, slice_sizes={1,4}, metadata={op_name=\"jit(_sample_component_jit)/jit(evaluate)/gather\" stack_frame_id=274}\n",
+ "\n",
+ "This isn't necessarily a bug; constant-folding is inherently a trade-off between compilation time and speed at runtime. XLA has some guards that attempt to keep constant folding from taking too long, but fundamentally you'll always be able to come up with an input program that takes a long time.\n",
+ "\n",
+ "If you'd like to file a bug, run with envvar XLA_FLAGS=--xla_dump_to=/tmp/foo and attach the results.\n",
+ "E0510 11:10:29.394895 1414008 slow_operation_alarm.cc:140] The operation took 1.497965s\n",
+ "Constant folding an instruction is taking > 1s:\n",
+ "\n",
+ " %gather.41 = s32[4100041,1,4]{2,1,0} gather(%constant.719, %broadcast.722), offset_dims={1,2}, collapsed_slice_dims={}, start_index_map={0}, index_vector_dim=1, slice_sizes={1,4}, metadata={op_name=\"jit(_sample_component_jit)/jit(evaluate)/gather\" stack_frame_id=274}\n",
+ "\n",
+ "This isn't necessarily a bug; constant-folding is inherently a trade-off between compilation time and speed at runtime. XLA has some guards that attempt to keep constant folding from taking too long, but fundamentally you'll always be able to come up with an input program that takes a long time.\n",
+ "\n",
+ "If you'd like to file a bug, run with envvar XLA_FLAGS=--xla_dump_to=/tmp/foo and attach the results.\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " θ=1.00e-04 | kept=81624/100000 | err=501 | rate=2.05e-03\n",
+ " θ=1.00e-03 | kept=80069/100000 | err=478 | rate=1.99e-03\n",
+ " θ=1.00e-02 | kept=75082/100000 | err=504 | rate=2.24e-03\n",
+ " θ=1.00e-01 | kept=56116/100000 | err=371 | rate=2.20e-03\n",
+ " θ=1.00e+00 | kept=23070/100000 | err=499 | rate=7.21e-03\n",
+ "\n",
+ "d=5...\n",
+ " θ=1.00e-04 | kept=51633/100000 | err=12 | rate=4.65e-05\n",
+ " θ=1.00e-03 | kept=45355/100000 | err=4 | rate=1.76e-05\n",
+ " θ=1.00e-02 | kept=32460/100000 | err=7 | rate=4.31e-05\n",
+ " θ=1.00e-01 | kept=15328/100000 | err=16 | rate=2.09e-04\n",
+ " θ=1.00e+00 | kept=4059/100000 | err=188 | rate=9.26e-03\n",
+ "\n",
+ "d=7...\n",
+ " θ=1.00e-04 → AssertionError, skipping\n",
+ " θ=1.00e-03 | kept=15828/100000 | err=1 | rate=9.03e-06\n",
+ " θ=1.00e-02 | kept=8533/100000 | err=1 | rate=1.67e-05\n",
+ " θ=1.00e-01 | kept=2865/100000 | err=1 | rate=4.99e-05\n",
+ " θ=1.00e+00 | kept=645/100000 | err=58 | rate=1.28e-02\n"
+ ]
+ },
+ {
+ "data": {
+ "image/svg+xml": [
+ "\n",
+ "\n",
+ "\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "distances = [3, 5, 7]\n",
+ "shots = 100_000\n",
+ "angle_vals_rad = np.logspace(-4, 0, 5)\n",
+ "results = {d: [] for d in distances}\n",
+ "\n",
+ "for d in distances:\n",
+ " print(f\"\\nd={d}...\")\n",
+ " num_postselect = 3 * (d**2 - 1)\n",
+ " for theta_rad in angle_vals_rad:\n",
+ " logical_angle_in_pi = theta_rad / np.pi\n",
+ " circ = load_stim_with_angle(f\"assets/star_circuits/star_d={d}.stim\", d=d, logical_angle_in_pi=logical_angle_in_pi)\n",
+ " dem = circ.detector_error_model()\n",
+ " matcher = pymatching.Matching.from_detector_error_model(dem)\n",
+ " sampler = circ.compile_detector_sampler()\n",
+ "\n",
+ " try:\n",
+ " detections, observations = sampler.sample(shots, separate_observables=True)\n",
+ " except AssertionError:\n",
+ " print(f\" θ={theta_rad:.2e} → AssertionError, skipping\")\n",
+ " results[d].append(np.nan)\n",
+ " continue\n",
+ "\n",
+ " predictions = matcher.decode_batch(detections)\n",
+ " postselected = [i for i in range(len(detections)) if not any(detections[i][:num_postselect])]\n",
+ " num_errors = sum(1 for idx in postselected if not np.array_equal(observations[idx], predictions[idx]))\n",
+ " n_kept = len(postselected)\n",
+ " rate = (num_errors / n_kept / d) if n_kept > 0 else np.nan\n",
+ " results[d].append(rate if rate and rate > 0 else np.nan)\n",
+ " print(f\" θ={theta_rad:.2e} | kept={n_kept}/{shots} | err={num_errors} | rate={rate:.2e}\")\n",
+ "fig, ax = plt.subplots(figsize=(8, 5))\n",
+ "for d, col, mk, lbl in [(3,\"royalblue\",\"o\",\"d=3 (17 qubits)\"),\n",
+ " (5,\"darkorange\",\"s\",\"d=5 (49 qubits)\"),\n",
+ " (7,\"green\",\"^\",\"d=7 (97 qubits)\")]:\n",
+ " vals = [(t, r) for t, r in zip(angle_vals_rad, results[d]) if r and not np.isnan(r)]\n",
+ " if vals: ax.plot(*zip(*vals), color=col, marker=mk, label=lbl, linewidth=1.5)\n",
+ "ax.set_xscale(\"log\"); ax.set_yscale(\"log\")\n",
+ "ax.set_xlabel(\"Rotation angle θ (rad)\")\n",
+ "ax.set_ylabel(\"Logical error rate / distance\")\n",
+ "ax.legend(); ax.set_title(\"STAR Fidelities — Surface Code d=3,5,7\")\n",
+ "plt.tight_layout(); plt.show()"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "eth-quantum-hackathon-2026-challenge",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.12.1"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/2026/STAR demos/circuits/msc_3.stim b/2026/STAR demos/circuits/msc_3.stim
new file mode 100644
index 0000000..d98d2db
--- /dev/null
+++ b/2026/STAR demos/circuits/msc_3.stim
@@ -0,0 +1,224 @@
+QUBIT_COORDS(0, 0) 0
+QUBIT_COORDS(0, 1) 1
+QUBIT_COORDS(1, 0) 2
+QUBIT_COORDS(1, 1) 3
+QUBIT_COORDS(1, 2) 4
+QUBIT_COORDS(2, 0) 5
+QUBIT_COORDS(2, 1) 6
+QUBIT_COORDS(2, 2) 7
+QUBIT_COORDS(2, 3) 8
+QUBIT_COORDS(3, 0) 9
+QUBIT_COORDS(3, 1) 10
+QUBIT_COORDS(3, 2) 11
+QUBIT_COORDS(3, 3) 12
+QUBIT_COORDS(3, 4) 13
+QUBIT_COORDS(4, 0) 14
+QUBIT_COORDS(4, 1) 15
+QUBIT_COORDS(4, 2) 16
+QUBIT_COORDS(4, 3) 17
+R 1 14
+RX 4 2 10 12
+R 0 9 16 11 6 3 13 8 7 5 17 15
+X_ERROR(0.001) 1 14 0 9 16 11 6 3 13 8 7 5 17 15
+Z_ERROR(0.001) 4 2 10 12
+TICK
+CX 2 5 4 7 10 15 12 17
+DEPOLARIZE2(0.001) 2 5 4 7 10 15 12 17
+DEPOLARIZE1(0.001) 0 1 3 6 8 9 11 13 14 16
+TICK
+CX 2 3 5 6 7 8 10 11 12 13 15 16
+DEPOLARIZE2(0.001) 2 3 5 6 7 8 10 11 12 13 15 16
+DEPOLARIZE1(0.001) 0 1 4 9 14 17
+TICK
+CX 2 0 5 9 7 11 10 6 12 8
+DEPOLARIZE2(0.001) 2 0 5 9 7 11 10 6 12 8
+DEPOLARIZE1(0.001) 1 3 4 13 14 15 16 17
+TICK
+CX 4 3 7 6 10 9 12 11 17 16
+DEPOLARIZE2(0.001) 4 3 7 6 10 9 12 11 17 16
+DEPOLARIZE1(0.001) 0 1 2 5 8 13 14 15
+TICK
+CX 2 5 4 7 10 15 12 17
+DEPOLARIZE2(0.001) 2 5 4 7 10 15 12 17
+DEPOLARIZE1(0.001) 0 1 3 6 8 9 11 13 14 16
+TICK
+M(0.001) 7 5 17 15
+MX(0.001) 4 2 10 12
+DETECTOR(2, 2, 0) rec[-8]
+DETECTOR(2, 0, 0) rec[-7]
+DETECTOR(4, 3, 0) rec[-6]
+DETECTOR(4, 1, 0) rec[-5]
+DEPOLARIZE1(0.001) 7 5 17 15 4 2 10 12 0 1 3 6 8 9 11 13 14 16
+TICK
+RX 4 2 10 12 15 14
+R 7 5 17
+X_ERROR(0.001) 7 5 17
+Z_ERROR(0.001) 4 2 10 12 15 14
+DEPOLARIZE1(0.001) 0 1 3 6 8 9 11 13 16
+TICK
+CX 2 5 4 7 10 6 12 17 15 16
+DEPOLARIZE2(0.001) 2 5 4 7 10 6 12 17 15 16
+DEPOLARIZE1(0.001) 0 1 3 8 9 11 13 14
+TICK
+CX 4 3 7 6 10 9 12 11 14 15 17 16
+DEPOLARIZE2(0.001) 4 3 7 6 10 9 12 11 14 15 17 16
+DEPOLARIZE1(0.001) 0 1 2 5 8 13
+TICK
+CX 2 3 5 6 7 8 10 11 12 13 16 15
+DEPOLARIZE2(0.001) 2 3 5 6 7 8 10 11 12 13 16 15
+DEPOLARIZE1(0.001) 0 1 4 9 14 17
+TICK
+CX 2 0 5 9 7 11 10 15 12 8
+DEPOLARIZE2(0.001) 2 0 5 9 7 11 10 15 12 8
+DEPOLARIZE1(0.001) 1 3 4 6 13 14 16 17
+TICK
+CX 2 5 4 7 12 17 15 14
+DEPOLARIZE2(0.001) 2 5 4 7 12 17 15 14
+DEPOLARIZE1(0.001) 0 1 3 6 8 9 10 11 13 16
+TICK
+T_DAG 13
+DEPOLARIZE1(0.001) 13 0 1 2 3 4 5 6 7 8 9 10 11 12 14 15 16 17
+TICK
+M(0.001) 17 5 7
+MX(0.001) 15 10 16 13 2 4 12
+DETECTOR(4, 3, 1) rec[-10]
+DETECTOR(2, 0, 1) rec[-9]
+DETECTOR(2, 2, 1) rec[-8]
+DETECTOR(4, 1, 1) rec[-7]
+DETECTOR(4, 2, 1) rec[-5]
+DETECTOR(3, 1, 1) rec[-5] rec[-6] rec[-12]
+DETECTOR(1, 0, 1) rec[-3] rec[-13]
+DETECTOR(1, 2, 1) rec[-2] rec[-14]
+DETECTOR(3, 3, 1) rec[-1] rec[-11]
+DEPOLARIZE1(0.001) 17 5 7 15 10 16 13 2 4 12 0 1 3 6 8 9 11 14
+TICK
+RX 2 4 10
+R 5 7 15
+X_ERROR(0.001) 5 7 15
+Z_ERROR(0.001) 2 4 10
+DEPOLARIZE1(0.001) 0 1 3 6 8 9 11 12 13 14 16 17
+TICK
+CX 2 5 4 7 10 15
+DEPOLARIZE2(0.001) 2 5 4 7 10 15
+DEPOLARIZE1(0.001) 0 1 3 6 8 9 11 12 13 14 16 17
+TICK
+CX 2 0 5 9 7 11 10 6
+DEPOLARIZE2(0.001) 2 0 5 9 7 11 10 6
+DEPOLARIZE1(0.001) 1 3 4 8 12 13 14 15 16 17
+TICK
+CX 2 3 5 6 7 8 10 11
+DEPOLARIZE2(0.001) 2 3 5 6 7 8 10 11
+DEPOLARIZE1(0.001) 0 1 4 9 12 13 14 15 16 17
+TICK
+CX 4 3 7 6 10 9 15 14
+DEPOLARIZE2(0.001) 4 3 7 6 10 9 15 14
+DEPOLARIZE1(0.001) 0 1 2 5 8 11 12 13 16 17
+TICK
+CX 0 2 6 10 9 5 11 7
+DEPOLARIZE2(0.001) 0 2 6 10 9 5 11 7
+DEPOLARIZE1(0.001) 1 3 4 8 12 13 14 15 16 17
+TICK
+CX 3 2 6 5 8 7 11 10
+DEPOLARIZE2(0.001) 3 2 6 5 8 7 11 10
+DEPOLARIZE1(0.001) 0 1 4 9 12 13 14 15 16 17
+TICK
+CX 3 4 6 7 9 10 14 15
+DEPOLARIZE2(0.001) 3 4 6 7 9 10 14 15
+DEPOLARIZE1(0.001) 0 1 2 5 8 11 12 13 16 17
+TICK
+CX 2 5 4 7 10 15
+DEPOLARIZE2(0.001) 2 5 4 7 10 15
+DEPOLARIZE1(0.001) 0 1 3 6 8 9 11 12 13 14 16 17
+TICK
+MX(0.001) 2 4 10
+M(0.001) 5 7 15
+DETECTOR(1.25, 0.25, 2, -1, -9) rec[-9] rec[-6]
+DETECTOR(1.5, 1.875, 2, -1, -9) rec[-8] rec[-5]
+DETECTOR(1.75, 0.25, 2, -1, -9) rec[-3]
+DETECTOR(2, 1.875, 2, -1, -9) rec[-2]
+DETECTOR(3, 0.875, 2, -1, -9) rec[-13] rec[-12] rec[-4]
+DETECTOR(3.5, 0.875, 2, -1, -9) rec[-1]
+DEPOLARIZE1(0.001) 2 4 10 5 7 15 0 1 3 6 8 9 11 12 13 14 16 17
+TICK
+RX 15 10 5 2 7 1
+Z_ERROR(0.001) 15 10 5 2 7 1
+DEPOLARIZE1(0.001) 0 3 4 6 8 9 11 12 13 14 16 17
+TICK
+T_DAG 0 3 6 8 9 11 14
+DEPOLARIZE1(0.001) 0 3 6 8 9 11 14 1 2 4 5 7 10 12 13 15 16 17
+TICK
+CX 1 0 2 3 5 6 7 8 10 9 15 14
+DEPOLARIZE2(0.001) 1 0 2 3 5 6 7 8 10 9 15 14
+DEPOLARIZE1(0.001) 4 11 12 13 16 17
+TICK
+CX 3 1 6 7 10 15
+DEPOLARIZE2(0.001) 3 1 6 7 10 15
+DEPOLARIZE1(0.001) 0 2 4 5 8 9 11 12 13 14 16 17
+TICK
+CX 6 3 10 11
+DEPOLARIZE2(0.001) 6 3 10 11
+DEPOLARIZE1(0.001) 0 1 2 4 5 7 8 9 12 13 14 15 16 17
+TICK
+CX 6 10
+DEPOLARIZE2(0.001) 6 10
+DEPOLARIZE1(0.001) 0 1 2 3 4 5 7 8 9 11 12 13 14 15 16 17
+TICK
+MX(0.001) 6
+DEPOLARIZE1(0.001) 6 0 1 2 3 4 5 7 8 9 10 11 12 13 14 15 16 17
+TICK
+RX 6
+Z_ERROR(0.001) 6
+DEPOLARIZE1(0.001) 0 1 2 3 4 5 7 8 9 10 11 12 13 14 15 16 17
+TICK
+CX 6 10
+DEPOLARIZE2(0.001) 6 10
+DEPOLARIZE1(0.001) 0 1 2 3 4 5 7 8 9 11 12 13 14 15 16 17
+TICK
+CX 6 3 10 11
+DEPOLARIZE2(0.001) 6 3 10 11
+DEPOLARIZE1(0.001) 0 1 2 4 5 7 8 9 12 13 14 15 16 17
+TICK
+CX 3 1 6 7 10 15
+DEPOLARIZE2(0.001) 3 1 6 7 10 15
+DEPOLARIZE1(0.001) 0 2 4 5 8 9 11 12 13 14 16 17
+TICK
+CX 1 0 2 3 5 6 7 8 10 9 15 14
+DEPOLARIZE2(0.001) 1 0 2 3 5 6 7 8 10 9 15 14
+DEPOLARIZE1(0.001) 4 11 12 13 16 17
+TICK
+T 0 3 6 8 9 11 14
+DEPOLARIZE1(0.001) 0 3 6 8 9 11 14 1 2 4 5 7 10 12 13 15 16 17
+TICK
+MX(0.001) 15 10 5 2 7 1
+DETECTOR(1.60714, 0.75, 3, -1, -9) rec[-29] rec[-28] rec[-26] rec[-24] rec[-23] rec[-21] rec[-20] rec[-18] rec[-17] rec[-12] rec[-11] rec[-7]
+DETECTOR(4, 1, 4) rec[-6]
+DETECTOR(3, 1, 4) rec[-5]
+DETECTOR(2, 1, 4) rec[-4] rec[-7]
+DETECTOR(1, 0, 4) rec[-3]
+DETECTOR(2, 2, 4) rec[-2]
+DETECTOR(0, 1, 4) rec[-1]
+DEPOLARIZE1(0.001) 15 10 5 2 7 1 0 3 4 6 8 9 11 12 13 14 16 17
+TICK
+TICK
+CX 8 3 11 6 0 9
+TICK
+CX 8 14 11 9 0 3
+TICK
+CX 11 14 8 9 0 6
+TICK
+CX 6 14
+TICK
+CX 6 3
+TICK
+T 6
+TICK
+MX 0 11 8
+M 9 3 14
+MX 6
+DETECTOR(0.625, 0.125, 0, -1, -9) rec[-20] rec[-19] rec[-14] rec[-7]
+DETECTOR(0.875, 0.125, 0, -1, -9) rec[-17] rec[-4]
+DETECTOR(1.25, 1.4375, 0, -1, -9) rec[-20] rec[-14] rec[-6] rec[-5]
+DETECTOR(1.5, 1.4375, 0, -1, -9) rec[-16] rec[-3]
+DETECTOR(2.5, 0.9375, 0, -1, -9) rec[-14] rec[-6]
+DETECTOR(2.75, 0.9375, 0, -1, -9) rec[-15] rec[-2]
+OBSERVABLE_INCLUDE(0) rec[-34] rec[-1]
\ No newline at end of file
diff --git a/2026/STAR demos/circuits/msd_5.stim b/2026/STAR demos/circuits/msd_5.stim
new file mode 100644
index 0000000..6bab6b0
--- /dev/null
+++ b/2026/STAR demos/circuits/msd_5.stim
@@ -0,0 +1,407 @@
+QUBIT_COORDS(0, 0) 0
+QUBIT_COORDS(1, 0) 1
+QUBIT_COORDS(2, 0) 2
+QUBIT_COORDS(3, 0) 3
+QUBIT_COORDS(4, 0) 4
+QUBIT_COORDS(5, 0) 5
+QUBIT_COORDS(6, 0) 6
+QUBIT_COORDS(7, 0) 7
+QUBIT_COORDS(8, 0) 8
+QUBIT_COORDS(9, 0) 9
+QUBIT_COORDS(10, 0) 10
+QUBIT_COORDS(11, 0) 11
+QUBIT_COORDS(12, 0) 12
+QUBIT_COORDS(13, 0) 13
+QUBIT_COORDS(14, 0) 14
+QUBIT_COORDS(15, 0) 15
+QUBIT_COORDS(16, 0) 16
+QUBIT_COORDS(0, 1) 17
+QUBIT_COORDS(1, 1) 18
+QUBIT_COORDS(2, 1) 19
+QUBIT_COORDS(3, 1) 20
+QUBIT_COORDS(4, 1) 21
+QUBIT_COORDS(5, 1) 22
+QUBIT_COORDS(6, 1) 23
+QUBIT_COORDS(7, 1) 24
+QUBIT_COORDS(8, 1) 25
+QUBIT_COORDS(9, 1) 26
+QUBIT_COORDS(10, 1) 27
+QUBIT_COORDS(11, 1) 28
+QUBIT_COORDS(12, 1) 29
+QUBIT_COORDS(13, 1) 30
+QUBIT_COORDS(14, 1) 31
+QUBIT_COORDS(15, 1) 32
+QUBIT_COORDS(16, 1) 33
+QUBIT_COORDS(0, 2) 34
+QUBIT_COORDS(1, 2) 35
+QUBIT_COORDS(2, 2) 36
+QUBIT_COORDS(3, 2) 37
+QUBIT_COORDS(4, 2) 38
+QUBIT_COORDS(5, 2) 39
+QUBIT_COORDS(6, 2) 40
+QUBIT_COORDS(7, 2) 41
+QUBIT_COORDS(8, 2) 42
+QUBIT_COORDS(9, 2) 43
+QUBIT_COORDS(10, 2) 44
+QUBIT_COORDS(11, 2) 45
+QUBIT_COORDS(12, 2) 46
+QUBIT_COORDS(13, 2) 47
+QUBIT_COORDS(14, 2) 48
+QUBIT_COORDS(15, 2) 49
+QUBIT_COORDS(16, 2) 50
+QUBIT_COORDS(0, 3) 51
+QUBIT_COORDS(1, 3) 52
+QUBIT_COORDS(2, 3) 53
+QUBIT_COORDS(3, 3) 54
+QUBIT_COORDS(4, 3) 55
+QUBIT_COORDS(5, 3) 56
+QUBIT_COORDS(6, 3) 57
+QUBIT_COORDS(7, 3) 58
+QUBIT_COORDS(8, 3) 59
+QUBIT_COORDS(9, 3) 60
+QUBIT_COORDS(10, 3) 61
+QUBIT_COORDS(11, 3) 62
+QUBIT_COORDS(12, 3) 63
+QUBIT_COORDS(13, 3) 64
+QUBIT_COORDS(14, 3) 65
+QUBIT_COORDS(15, 3) 66
+QUBIT_COORDS(16, 3) 67
+QUBIT_COORDS(0, 4) 68
+QUBIT_COORDS(1, 4) 69
+QUBIT_COORDS(2, 4) 70
+QUBIT_COORDS(3, 4) 71
+QUBIT_COORDS(4, 4) 72
+QUBIT_COORDS(5, 4) 73
+QUBIT_COORDS(6, 4) 74
+QUBIT_COORDS(7, 4) 75
+QUBIT_COORDS(8, 4) 76
+QUBIT_COORDS(9, 4) 77
+QUBIT_COORDS(10, 4) 78
+QUBIT_COORDS(11, 4) 79
+QUBIT_COORDS(12, 4) 80
+QUBIT_COORDS(13, 4) 81
+QUBIT_COORDS(14, 4) 82
+QUBIT_COORDS(15, 4) 83
+QUBIT_COORDS(16, 4) 84
+
+R 0 17 34 51 68 1 18 35 52 69 2 19 36 53 70 3 20 37 54 71 4 21 38 55 72 5 22 39 56 73 6 23 40 57 74 8 25 42 59 76 9 26 43 60 77 10 27 44 61 78 11 28 45 62 79 12 29 46 63 80 13 30 47 64 81 14 31 48 65 82 15 32 49 66 83 16 33 50 67 84
+R 7 24 41 58 75
+DEPOLARIZE1(0.01) 0 17 34 51 68 1 18 35 52 69 2 19 36 53 70 3 20 37 54 71 4 21 38 55 72 5 22 39 56 73 6 23 40 57 74 8 25 42 59 76 9 26 43 60 77 10 27 44 61 78 11 28 45 62 79 12 29 46 63 80 13 30 47 64 81 14 31 48 65 82 15 32 49 66 83 16 33 50 67 84
+DEPOLARIZE1(0.01) 7 24 41 58 75
+TICK
+R_X(-0.3040867239846964) 7 24 41 58 75
+DEPOLARIZE1(0.01) 7 24 41 58 75
+TICK
+T_DAG 7 24 41 58 75
+DEPOLARIZE1(0.05) 7 24 41 58 75
+TICK
+SQRT_Y 0 17 34 51 68 1 18 35 52 69 2 19 36 53 70 3 20 37 54 71 4 21 38 55 72 5 22 39 56 73 6 23 40 57 74 8 25 42 59 76 9 26 43 60 77 10 27 44 61 78 11 28 45 62 79 12 29 46 63 80 13 30 47 64 81 14 31 48 65 82 15 32 49 66 83 16 33 50 67 84
+DEPOLARIZE1(0.01) 0 17 34 51 68 1 18 35 52 69 2 19 36 53 70 3 20 37 54 71 4 21 38 55 72 5 22 39 56 73 6 23 40 57 74 8 25 42 59 76 9 26 43 60 77 10 27 44 61 78 11 28 45 62 79 12 29 46 63 80 13 30 47 64 81 14 31 48 65 82 15 32 49 66 83 16 33 50 67 84
+TICK
+CZ 1 3 18 20 35 37 52 54 69 71 7 10 24 27 41 44 58 61 75 78 12 14 29 31 46 48 63 65 80 82 13 16 30 33 47 50 64 67 81 84
+DEPOLARIZE2(0.01) 1 3 18 20 35 37 52 54 69 71 7 10 24 27 41 44 58 61 75 78 12 14 29 31 46 48 63 65 80 82 13 16 30 33 47 50 64 67 81 84
+TICK
+SQRT_Y_DAG 7 24 41 58 75 16 33 50 67 84
+DEPOLARIZE1(0.01) 7 24 41 58 75 16 33 50 67 84
+TICK
+CZ 4 7 21 24 38 41 55 58 72 75 8 10 25 27 42 44 59 61 76 78 11 14 28 31 45 48 62 65 79 82 15 16 32 33 49 50 66 67 83 84
+DEPOLARIZE2(0.01) 4 7 21 24 38 41 55 58 72 75 8 10 25 27 42 44 59 61 76 78 11 14 28 31 45 48 62 65 79 82 15 16 32 33 49 50 66 67 83 84
+TICK
+SQRT_Y_DAG 4 21 38 55 72 10 27 44 61 78 14 31 48 65 82 16 33 50 67 84
+DEPOLARIZE1(0.01) 4 21 38 55 72 10 27 44 61 78 14 31 48 65 82 16 33 50 67 84
+TICK
+CZ 2 4 19 21 36 38 53 55 70 72 6 8 23 25 40 42 57 59 74 76 7 9 24 26 41 43 58 60 75 77 10 13 27 30 44 47 61 64 78 81
+DEPOLARIZE2(0.01) 2 4 19 21 36 38 53 55 70 72 6 8 23 25 40 42 57 59 74 76 7 9 24 26 41 43 58 60 75 77 10 13 27 30 44 47 61 64 78 81
+CZ 14 16 31 33 48 50 65 67 82 84
+DEPOLARIZE2(0.01) 14 16 31 33 48 50 65 67 82 84
+TICK
+SQRT_Y 3 20 37 54 71 6 23 40 57 74 9 26 43 60 77 10 27 44 61 78 12 29 46 63 80 13 30 47 64 81
+DEPOLARIZE1(0.01) 3 20 37 54 71 6 23 40 57 74 9 26 43 60 77 10 27 44 61 78 12 29 46 63 80 13 30 47 64 81
+TICK
+CZ 0 2 17 19 34 36 51 53 68 70 3 6 20 23 37 40 54 57 71 74 5 8 22 25 39 42 56 59 73 76 10 12 27 29 44 46 61 63 78 80 11 13 28 30 45 47 62 64 79 81
+DEPOLARIZE2(0.01) 0 2 17 19 34 36 51 53 68 70 3 6 20 23 37 40 54 57 71 74 5 8 22 25 39 42 56 59 73 76 10 12 27 29 44 46 61 63 78 80 11 13 28 30 45 47 62 64 79 81
+TICK
+SQRT_Y 1 18 35 52 69 2 19 36 53 70 3 20 37 54 71 4 21 38 55 72 6 23 40 57 74 7 24 41 58 75 8 25 42 59 76 9 26 43 60 77 11 28 45 62 79 12 29 46 63 80 14 31 48 65 82
+DEPOLARIZE1(0.01) 1 18 35 52 69 2 19 36 53 70 3 20 37 54 71 4 21 38 55 72 6 23 40 57 74 7 24 41 58 75 8 25 42 59 76 9 26 43 60 77 11 28 45 62 79 12 29 46 63 80 14 31 48 65 82
+TICK
+CZ 0 1 17 18 34 35 51 52 68 69 2 3 19 20 36 37 53 54 70 71 4 5 21 22 38 39 55 56 72 73 6 7 23 24 40 41 57 58 74 75 8 9 25 26 42 43 59 60 76 77 12 15 29 32 46 49 63 66 80 83
+DEPOLARIZE2(0.01) 0 1 17 18 34 35 51 52 68 69 2 3 19 20 36 37 53 54 70 71 4 5 21 22 38 39 55 56 72 73 6 7 23 24 40 41 57 58 74 75 8 9 25 26 42 43 59 60 76 77 12 15 29 32 46 49 63 66 80 83
+TICK
+SQRT_Y_DAG 0 17 34 51 68 2 19 36 53 70 5 22 39 56 73 6 23 40 57 74 8 25 42 59 76 10 27 44 61 78 12 29 46 63 80
+DEPOLARIZE1(0.01) 0 17 34 51 68 2 19 36 53 70 5 22 39 56 73 6 23 40 57 74 8 25 42 59 76 10 27 44 61 78 12 29 46 63 80
+TICK
+X 14 31 48 65 82 7 24 41 58 75 5 22 39 56 73 2 19 36 53 70 1 18 35 52 69 4 21 38 55 72
+DEPOLARIZE1(0.01) 14 31 48 65 82 7 24 41 58 75 5 22 39 56 73 2 19 36 53 70 1 18 35 52 69 4 21 38 55 72
+TICK
+Z 11 28 45 62 79 6 23 40 57 74 4 21 38 55 72 2 19 36 53 70
+DEPOLARIZE1(0.01) 11 28 45 62 79 6 23 40 57 74 4 21 38 55 72 2 19 36 53 70
+TICK
+SQRT_X 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
+DEPOLARIZE1(0.01) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
+TICK
+# begin transversal circuit
+CZ 0 17
+CZ 1 18
+CZ 2 19
+CZ 3 20
+CZ 4 21
+CZ 5 22
+CZ 6 23
+CZ 7 24
+CZ 8 25
+CZ 9 26
+CZ 10 27
+CZ 11 28
+CZ 12 29
+CZ 13 30
+CZ 14 31
+CZ 15 32
+CZ 16 33
+DEPOLARIZE2(0.01) 0 17
+DEPOLARIZE2(0.01) 1 18
+DEPOLARIZE2(0.01) 2 19
+DEPOLARIZE2(0.01) 3 20
+DEPOLARIZE2(0.01) 4 21
+DEPOLARIZE2(0.01) 5 22
+DEPOLARIZE2(0.01) 6 23
+DEPOLARIZE2(0.01) 7 24
+DEPOLARIZE2(0.01) 8 25
+DEPOLARIZE2(0.01) 9 26
+DEPOLARIZE2(0.01) 10 27
+DEPOLARIZE2(0.01) 11 28
+DEPOLARIZE2(0.01) 12 29
+DEPOLARIZE2(0.01) 13 30
+DEPOLARIZE2(0.01) 14 31
+DEPOLARIZE2(0.01) 15 32
+DEPOLARIZE2(0.01) 16 33
+
+CZ 34 51
+CZ 35 52
+CZ 36 53
+CZ 37 54
+CZ 38 55
+CZ 39 56
+CZ 40 57
+CZ 41 58
+CZ 42 59
+CZ 43 60
+CZ 44 61
+CZ 45 62
+CZ 46 63
+CZ 47 64
+CZ 48 65
+CZ 49 66
+CZ 50 67
+DEPOLARIZE2(0.01) 34 51
+DEPOLARIZE2(0.01) 35 52
+DEPOLARIZE2(0.01) 36 53
+DEPOLARIZE2(0.01) 37 54
+DEPOLARIZE2(0.01) 38 55
+DEPOLARIZE2(0.01) 39 56
+DEPOLARIZE2(0.01) 40 57
+DEPOLARIZE2(0.01) 41 58
+DEPOLARIZE2(0.01) 42 59
+DEPOLARIZE2(0.01) 43 60
+DEPOLARIZE2(0.01) 44 61
+DEPOLARIZE2(0.01) 45 62
+DEPOLARIZE2(0.01) 46 63
+DEPOLARIZE2(0.01) 47 64
+DEPOLARIZE2(0.01) 48 65
+DEPOLARIZE2(0.01) 49 66
+DEPOLARIZE2(0.01) 50 67
+TICK
+SQRT_Y 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
+DEPOLARIZE1(0.01) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
+TICK
+CZ 0 34
+CZ 1 35
+CZ 2 36
+CZ 3 37
+CZ 4 38
+CZ 5 39
+CZ 6 40
+CZ 7 41
+CZ 8 42
+CZ 9 43
+CZ 10 44
+CZ 11 45
+CZ 12 46
+CZ 13 47
+CZ 14 48
+CZ 15 49
+CZ 16 50
+DEPOLARIZE2(0.01) 0 34
+DEPOLARIZE2(0.01) 1 35
+DEPOLARIZE2(0.01) 2 36
+DEPOLARIZE2(0.01) 3 37
+DEPOLARIZE2(0.01) 4 38
+DEPOLARIZE2(0.01) 5 39
+DEPOLARIZE2(0.01) 6 40
+DEPOLARIZE2(0.01) 7 41
+DEPOLARIZE2(0.01) 8 42
+DEPOLARIZE2(0.01) 9 43
+DEPOLARIZE2(0.01) 10 44
+DEPOLARIZE2(0.01) 11 45
+DEPOLARIZE2(0.01) 12 46
+DEPOLARIZE2(0.01) 13 47
+DEPOLARIZE2(0.01) 14 48
+DEPOLARIZE2(0.01) 15 49
+DEPOLARIZE2(0.01) 16 50
+
+CZ 51 68
+CZ 52 69
+CZ 53 70
+CZ 54 71
+CZ 55 72
+CZ 56 73
+CZ 57 74
+CZ 58 75
+CZ 59 76
+CZ 60 77
+CZ 61 78
+CZ 62 79
+CZ 63 80
+CZ 64 81
+CZ 65 82
+CZ 66 83
+CZ 67 84
+DEPOLARIZE2(0.01) 51 68
+DEPOLARIZE2(0.01) 52 69
+DEPOLARIZE2(0.01) 53 70
+DEPOLARIZE2(0.01) 54 71
+DEPOLARIZE2(0.01) 55 72
+DEPOLARIZE2(0.01) 56 73
+DEPOLARIZE2(0.01) 57 74
+DEPOLARIZE2(0.01) 58 75
+DEPOLARIZE2(0.01) 59 76
+DEPOLARIZE2(0.01) 60 77
+DEPOLARIZE2(0.01) 61 78
+DEPOLARIZE2(0.01) 62 79
+DEPOLARIZE2(0.01) 63 80
+DEPOLARIZE2(0.01) 64 81
+DEPOLARIZE2(0.01) 65 82
+DEPOLARIZE2(0.01) 66 83
+DEPOLARIZE2(0.01) 67 84
+TICK
+SQRT_X_DAG 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
+DEPOLARIZE1(0.01) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
+TICK
+CZ 0 68
+CZ 1 69
+CZ 2 70
+CZ 3 71
+CZ 4 72
+CZ 5 73
+CZ 6 74
+CZ 7 75
+CZ 8 76
+CZ 9 77
+CZ 10 78
+CZ 11 79
+CZ 12 80
+CZ 13 81
+CZ 14 82
+CZ 15 83
+CZ 16 84
+DEPOLARIZE2(0.01) 0 68
+DEPOLARIZE2(0.01) 1 69
+DEPOLARIZE2(0.01) 2 70
+DEPOLARIZE2(0.01) 3 71
+DEPOLARIZE2(0.01) 4 72
+DEPOLARIZE2(0.01) 5 73
+DEPOLARIZE2(0.01) 6 74
+DEPOLARIZE2(0.01) 7 75
+DEPOLARIZE2(0.01) 8 76
+DEPOLARIZE2(0.01) 9 77
+DEPOLARIZE2(0.01) 10 78
+DEPOLARIZE2(0.01) 11 79
+DEPOLARIZE2(0.01) 12 80
+DEPOLARIZE2(0.01) 13 81
+DEPOLARIZE2(0.01) 14 82
+DEPOLARIZE2(0.01) 15 83
+DEPOLARIZE2(0.01) 16 84
+
+CZ 17 51
+CZ 18 52
+CZ 19 53
+CZ 20 54
+CZ 21 55
+CZ 22 56
+CZ 23 57
+CZ 24 58
+CZ 25 59
+CZ 26 60
+CZ 27 61
+CZ 28 62
+CZ 29 63
+CZ 30 64
+CZ 31 65
+CZ 32 66
+CZ 33 67
+DEPOLARIZE2(0.01) 17 51
+DEPOLARIZE2(0.01) 18 52
+DEPOLARIZE2(0.01) 19 53
+DEPOLARIZE2(0.01) 20 54
+DEPOLARIZE2(0.01) 21 55
+DEPOLARIZE2(0.01) 22 56
+DEPOLARIZE2(0.01) 23 57
+DEPOLARIZE2(0.01) 24 58
+DEPOLARIZE2(0.01) 25 59
+DEPOLARIZE2(0.01) 26 60
+DEPOLARIZE2(0.01) 27 61
+DEPOLARIZE2(0.01) 28 62
+DEPOLARIZE2(0.01) 29 63
+DEPOLARIZE2(0.01) 30 64
+DEPOLARIZE2(0.01) 31 65
+DEPOLARIZE2(0.01) 32 66
+DEPOLARIZE2(0.01) 33 67
+TICK
+SQRT_X_DAG 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
+DEPOLARIZE1(0.01) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
+TICK
+M 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
+DETECTOR rec[-85] rec[-84] rec[-83] rec[-82]
+DETECTOR rec[-85] rec[-83] rec[-81] rec[-80]
+DETECTOR rec[-81] rec[-80] rec[-79] rec[-78]
+DETECTOR rec[-79] rec[-78] rec[-77] rec[-76]
+DETECTOR rec[-74] rec[-72] rec[-71] rec[-69]
+DETECTOR rec[-75] rec[-74] rec[-73] rec[-71]
+DETECTOR rec[-73] rec[-71] rec[-70] rec[-69]
+DETECTOR rec[-83] rec[-82] rec[-80] rec[-79] rec[-77] rec[-75] rec[-74] rec[-72]
+DETECTOR rec[-68] rec[-67] rec[-66] rec[-65]
+DETECTOR rec[-68] rec[-66] rec[-64] rec[-63]
+DETECTOR rec[-64] rec[-63] rec[-62] rec[-61]
+DETECTOR rec[-62] rec[-61] rec[-60] rec[-59]
+DETECTOR rec[-57] rec[-55] rec[-54] rec[-52]
+DETECTOR rec[-58] rec[-57] rec[-56] rec[-54]
+DETECTOR rec[-56] rec[-54] rec[-53] rec[-52]
+DETECTOR rec[-66] rec[-65] rec[-63] rec[-62] rec[-60] rec[-58] rec[-57] rec[-55]
+DETECTOR rec[-51] rec[-50] rec[-49] rec[-48]
+DETECTOR rec[-51] rec[-49] rec[-47] rec[-46]
+DETECTOR rec[-47] rec[-46] rec[-45] rec[-44]
+DETECTOR rec[-45] rec[-44] rec[-43] rec[-42]
+DETECTOR rec[-40] rec[-38] rec[-37] rec[-35]
+DETECTOR rec[-41] rec[-40] rec[-39] rec[-37]
+DETECTOR rec[-39] rec[-37] rec[-36] rec[-35]
+DETECTOR rec[-49] rec[-48] rec[-46] rec[-45] rec[-43] rec[-41] rec[-40] rec[-38]
+DETECTOR rec[-34] rec[-33] rec[-32] rec[-31]
+DETECTOR rec[-34] rec[-32] rec[-30] rec[-29]
+DETECTOR rec[-30] rec[-29] rec[-28] rec[-27]
+DETECTOR rec[-28] rec[-27] rec[-26] rec[-25]
+DETECTOR rec[-23] rec[-21] rec[-20] rec[-18]
+DETECTOR rec[-24] rec[-23] rec[-22] rec[-20]
+DETECTOR rec[-22] rec[-20] rec[-19] rec[-18]
+DETECTOR rec[-32] rec[-31] rec[-29] rec[-28] rec[-26] rec[-24] rec[-23] rec[-21]
+DETECTOR rec[-17] rec[-16] rec[-15] rec[-14]
+DETECTOR rec[-17] rec[-15] rec[-13] rec[-12]
+DETECTOR rec[-13] rec[-12] rec[-11] rec[-10]
+DETECTOR rec[-11] rec[-10] rec[-9] rec[-8]
+DETECTOR rec[-6] rec[-4] rec[-3] rec[-1]
+DETECTOR rec[-7] rec[-6] rec[-5] rec[-3]
+DETECTOR rec[-5] rec[-3] rec[-2] rec[-1]
+DETECTOR rec[-15] rec[-14] rec[-12] rec[-11] rec[-9] rec[-7] rec[-6] rec[-4]
+OBSERVABLE_INCLUDE(0) rec[-84] rec[-82] rec[-75] rec[-73] rec[-70]
+OBSERVABLE_INCLUDE(1) rec[-67] rec[-65] rec[-58] rec[-56] rec[-53]
+OBSERVABLE_INCLUDE(2) rec[-50] rec[-48] rec[-41] rec[-39] rec[-36]
+OBSERVABLE_INCLUDE(3) rec[-33] rec[-31] rec[-24] rec[-22] rec[-19]
+OBSERVABLE_INCLUDE(4) rec[-16] rec[-14] rec[-7] rec[-5] rec[-2]
\ No newline at end of file
diff --git a/2026/STAR demos/demos/bloqade_integration.ipynb b/2026/STAR demos/demos/bloqade_integration.ipynb
new file mode 100644
index 0000000..cdc29c2
--- /dev/null
+++ b/2026/STAR demos/demos/bloqade_integration.ipynb
@@ -0,0 +1,616 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "da6f55ef",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from bloqade.tsim import Circuit\n",
+ "from bloqade import squin"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "ccf856f8",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "@squin.kernel\n",
+ "def main():\n",
+ " q = squin.qalloc(6)\n",
+ " squin.reset(q[0])\n",
+ " squin.h(q[0])\n",
+ " squin.t(q[0])\n",
+ " squin.h(q[0])\n",
+ " for i in range(5):\n",
+ " if i % 2 == 0:\n",
+ " squin.cx(q[0], q[i + 1])\n",
+ " else:\n",
+ " squin.cx(q[i + 1], q[0])\n",
+ " squin.broadcast.measure(q)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "26fa0ef1",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "circuit = Circuit(main)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "50bfbe8b",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "circuit.diagram(height=200)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "3f2b64b1",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "circuit.diagram(\"pyzx\", scale=32);"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "0f19b234",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[False, False, False, False, False, False],\n",
+ " [False, False, False, False, False, False],\n",
+ " [False, False, False, False, False, False],\n",
+ " ...,\n",
+ " [False, False, False, False, False, False],\n",
+ " [False, False, False, False, False, False],\n",
+ " [ True, True, False, True, False, True]], shape=(100000, 6))"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "sampler = circuit.compile_sampler()\n",
+ "sampler.sample(shots=100_000)"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "eth-quantum-hackathon-2026-challenge",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.12.1"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/2026/STAR demos/demos/clifford_sampling.ipynb b/2026/STAR demos/demos/clifford_sampling.ipynb
new file mode 100644
index 0000000..4b1d35e
--- /dev/null
+++ b/2026/STAR demos/demos/clifford_sampling.ipynb
@@ -0,0 +1,561 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "77a88da3",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import stim\n",
+ "from tsim import Circuit"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "37eb6de4",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "p = 0.0001\n",
+ "stim_circuit = stim.Circuit.generated(\n",
+ " \"surface_code:rotated_memory_z\",\n",
+ " rounds=3,\n",
+ " distance=11,\n",
+ " before_round_data_depolarization=p,\n",
+ " before_measure_flip_probability=p,\n",
+ " after_clifford_depolarization=p,\n",
+ " after_reset_flip_probability=p,\n",
+ ")\n",
+ "circuit = Circuit.from_stim_program(stim_circuit)\n",
+ "sampler = circuit.compile_detector_sampler()\n",
+ "\n",
+ "stim_sampler = stim_circuit.compile_detector_sampler()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "de6a1114",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/plain": [
+ "Graph(722 vertices, 361 edges)"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "circuit.diagram(\"pyzx-dets\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "86a9b2af",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "n = 1_000_000"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "837ce8de",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[False, False, False, ..., False, False, False],\n",
+ " [False, False, False, ..., False, False, False],\n",
+ " [False, False, False, ..., False, False, False],\n",
+ " ...,\n",
+ " [False, False, False, ..., False, False, False],\n",
+ " [False, False, False, ..., False, False, False],\n",
+ " [False, False, False, ..., False, False, False]],\n",
+ " shape=(1000000, 360))"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "samples = sampler.sample(n)\n",
+ "samples"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "c3384933",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[False, False, False, ..., False, False, False],\n",
+ " [False, False, False, ..., False, False, False],\n",
+ " [False, False, False, ..., False, False, False],\n",
+ " ...,\n",
+ " [False, False, False, ..., False, False, False],\n",
+ " [False, False, False, ..., False, False, False],\n",
+ " [False, False, False, ..., False, False, False]],\n",
+ " shape=(1000000, 360))"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "stim_samples = stim_sampler.sample(n)\n",
+ "stim_samples"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "eth-quantum-hackathon-2026-challenge",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.12.1"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/2026/STAR demos/demos/intro.ipynb b/2026/STAR demos/demos/intro.ipynb
new file mode 100644
index 0000000..a4e3f3a
--- /dev/null
+++ b/2026/STAR demos/demos/intro.ipynb
@@ -0,0 +1,648 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "ba2beac9",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from tsim import Circuit"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "e360b566",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "c = Circuit(\"\"\"\n",
+ " R 0 1\n",
+ " H 0\n",
+ " T 0\n",
+ " H 0\n",
+ " CNOT 0 1\n",
+ " M 0 1\n",
+ " DETECTOR rec[-1] rec[-2]\n",
+ " OBSERVABLE_INCLUDE(0) rec[-1]\n",
+ " \"\"\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "46d19d2c",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "c.diagram(height=150)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "9c37202c",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "c.diagram(\"pyzx\");"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "be40cc74",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "sampler = c.compile_sampler()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "dd398b16",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[False, False],\n",
+ " [False, False],\n",
+ " [False, False],\n",
+ " ...,\n",
+ " [False, False],\n",
+ " [False, False],\n",
+ " [ True, True]], shape=(100000, 2))"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "sampler.sample(shots=100_000)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "04321054",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "detector_sampler = c.compile_detector_sampler()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "f0d49aad",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[False, False],\n",
+ " [False, False],\n",
+ " [False, False],\n",
+ " [False, False],\n",
+ " [False, True],\n",
+ " [False, True],\n",
+ " [False, False],\n",
+ " [False, False],\n",
+ " [False, False],\n",
+ " [False, False]])"
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "detector_sampler.sample(shots=10, append_observables=True)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "85310dc3",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[False],\n",
+ " [False],\n",
+ " [False],\n",
+ " ...,\n",
+ " [False],\n",
+ " [False],\n",
+ " [False]], shape=(100000, 1))"
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "detector_bits, observable_bits = detector_sampler.sample(\n",
+ " shots=100_000, separate_observables=True\n",
+ ")\n",
+ "assert not detector_bits.any()\n",
+ "observable_bits"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "eth-quantum-hackathon-2026-challenge",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.12.1"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/2026/STAR demos/demos/msc.py b/2026/STAR demos/demos/msc.py
new file mode 100644
index 0000000..c618d46
--- /dev/null
+++ b/2026/STAR demos/demos/msc.py
@@ -0,0 +1,14 @@
+import tsim
+import time
+
+c = tsim.Circuit.from_file("../circuits/msc_3.stim")
+
+
+# Compilation step, takes about 3s
+sampler = c.compile_detector_sampler(strategy="cutting")
+
+start_time = time.perf_counter()
+n = 10_000 # On GPU, increase batch size to fully utilize VRAM
+sampler.sample(shots=n, batch_size=n)
+end_time = time.perf_counter()
+print(f"Time per shot: {(end_time - start_time) / n * 1e6:.2f} microseconds")
diff --git a/2026/STAR demos/demos/msd.ipynb b/2026/STAR demos/demos/msd.ipynb
new file mode 100644
index 0000000..4e8ce4b
--- /dev/null
+++ b/2026/STAR demos/demos/msd.ipynb
@@ -0,0 +1,6562 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "99ee97b4",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from tsim import Circuit"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "3d32b46a",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "c = Circuit.from_file(\"../circuits/msd_5.stim\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "86f489c6",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ "
\n",
+ "