\begin{figure}[tbp]
\centering
\begin{tikzpicture}[>=Latex, node distance=8mm and 12mm]
\node[draw, rounded corners, fill=blue!6, minimum width=38mm, align=left] (expr1)
  {single expression\\\texttt{transformation = ...}};
\node[draw, rounded corners, fill=blue!6, minimum width=38mm, align=left, below=of expr1] (expr2)
  {function body\\\texttt{v = ...}};
\node[draw, rounded corners, fill=blue!6, minimum width=38mm, align=left, below=of expr2] (expr3)
  {predicate body\\\texttt{filter = ...}};

\node[draw, rounded corners, fill=green!10, minimum width=34mm, minimum height=26mm, align=center, right=22mm of expr2] (eval)
  {parser and\\sandbox evaluator};

\node[draw, rounded corners, fill=orange!10, minimum width=42mm, align=left, right=24mm of eval] (base)
  {base environment\\$\bullet$ \texttt{Vector}, \texttt{Matrix}\\$\bullet$ \texttt{math}, \texttt{table}, \texttt{string}\\$\bullet$ \texttt{tau}};
\node[draw, rounded corners, fill=yellow!12, minimum width=42mm, align=left, above=of base] (objects)
  {user objects\\from \texttt{\textbackslash setobject}};
\node[draw, rounded corners, fill=teal!10, minimum width=42mm, align=left, below=of base] (bindings)
  {per-simplex bindings\\such as \texttt{A}, \texttt{B}, \texttt{C}};

\node[draw=red!70!black, dashed, rounded corners, fill=red!5, minimum width=34mm, align=left, below=16mm of eval] (blocked)
  {blocked globals\\\texttt{require}\\\texttt{load}\\\texttt{debug}};

\draw[->, thick] (expr1.east) -- (eval.west);
\draw[->, thick] (expr2.east) -- (eval.west);
\draw[->, thick] (expr3.east) -- (eval.west);
\draw[->, thick] (objects.south west) -- (eval.north east);
\draw[->, thick] (base.west) -- (eval.east);
\draw[->, thick] (bindings.north west) -- (eval.south east);
\draw[->, thick, red!70!black] (blocked.north) -- (eval.south);
\end{tikzpicture}
\caption{The sandboxed evaluation model. Each key body is interpreted against a
read-only base environment, the user object table, and any local bindings created
for filters. The blocked names highlight what the sandbox intentionally refuses to
expose.}
\end{figure}