\documentclass[tikz,border=12pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc,arrows.meta}

% Color palette (dark mode compatible)
\definecolor{bg}{HTML}{171C1A}
\definecolor{text}{HTML}{E3E7E4}
\definecolor{textsoft}{HTML}{C8D0CC}
\definecolor{muted}{HTML}{9AA59F}
\definecolor{accent}{HTML}{7AA88A}
\definecolor{humanpink}{HTML}{B08A9A}

\begin{document}
\begin{tikzpicture}[font=\sffamily]

  % TODO: Future — use XeLaTeX with IBM Plex Sans to match site typography

  % ---------- Explicit bounding box for consistent rendering ----------
  % Design width: 14cm to match other diagrams
  \path[use as bounding box] (-7, -5.0) rectangle (7, 5.2);

  % ---------- Style definitions ----------

  % Human node: judgment-driven anchor, dashed border all around
  \tikzset{
    humannode/.style={
      draw=humanpink,
      line width=0.8pt,
      dashed,
      dash pattern=on 3pt off 2pt,
      fill=bg,
      rounded corners=7pt,
      align=center,
      text=text,
      font=\sffamily\small\bfseries,
      minimum width=3.4cm,
      minimum height=1.15cm,
      inner sep=6pt
    }
  }

  % Standard nodes: uniform sizing for perfect symmetry
  \tikzset{
    loopnode/.style={
      draw=accent!70,
      line width=0.7pt,
      fill=bg,
      rounded corners=7pt,
      align=center,
      text=text,
      font=\sffamily\small,
      minimum width=3.4cm,
      minimum height=1.15cm,
      inner sep=6pt
    }
  }

  % Annotations: no heavy fill, use transparent bg for subtle halo effect
  % Higher contrast text, slightly more spacing
  \tikzset{
    annotation/.style={
      font=\sffamily\footnotesize,
      text=textsoft,
      align=center,
      inner sep=4pt,
      outer sep=2pt
    }
  }

  % Arrows: consistent weight, clean arrowheads
  \tikzset{
    arrow/.style={
      -{Stealth[length=5pt, width=3.5pt]},
      draw=accent!55,
      line width=0.5pt
    }
  }

  % ---------- Title (top-left, research-figure nameplate style) ----------
  \node[font=\sffamily\normalsize, text=text, anchor=north west] at (-5.8, 5.0)
    {The Exploration Loop};

  % ---------- Loop nodes (5 stages, evenly spaced at 72° intervals) ----------
  \def\radius{3.3cm}

  % 1. Establish Intent: top (90°) — human-anchored node
  \node[humannode] (intent) at (90:\radius) {Establish\\[1pt]Intent};

  % 2. Explore Options: upper-right (18°)
  \node[loopnode] (explore) at (18:\radius) {Explore\\[1pt]Options};

  % 3. Generate Artifacts: lower-right (-45°)
  \node[loopnode] (generate) at (-45:\radius) {Generate\\[1pt]Artifacts};

  % 4. Apply Judgment: lower-left (-135°)
  \node[loopnode] (judgment) at (-135:\radius) {Apply\\[1pt]Judgment};

  % 5. Update State: upper-left (162°)
  \node[loopnode] (state) at (162:\radius) {Update\\[1pt]State};

  % ---------- Arrows (strict anchor routing for perfect circular geometry) ----------
  % Flow: Intent → Explore → Generate → Judgment → State → Intent
  % All arrows use exact cardinal anchors (.north, .south, .east, .west)
  % Bend angles chosen for consistent arc curvature around the loop

  % Intent (90°) → Explore (18°): exit east, enter north
  \draw[arrow] (intent.east) to[bend left=25] (explore.north);

  % Explore (18°) → Generate (-45°): exit south, enter north
  \draw[arrow] (explore.south) to[bend left=25] (generate.north);

  % Generate (-45°) → Judgment (-135°): exit west, enter east
  \draw[arrow] (generate.west) to[bend left=25] (judgment.east);

  % Judgment (-135°) → State (162°): exit north, enter south
  \draw[arrow] (judgment.north) to[bend left=25] (state.south);

  % State (162°) → Intent (90°): exit north, enter west
  \draw[arrow] (state.north) to[bend left=25] (intent.west);

  % ---------- Annotations (positioned outside loop, no arrow collisions) ----------
  % Using transparent background via positioning only (no fill)
  % Increased text contrast with textsoft color

  % 1. Intent: centered above
  \node[annotation] at ($(intent.north)+(0, 0.55)$)
    {Clarify goals, constraints,\\and current state};

  % 2. Explore: above and right
  \node[annotation, anchor=south west, align=left] at ($(explore.north)+(0.15, 0.15)$)
    {Search parallel paths\\within defined bounds};

  % 3. Generate: lower-right, outside arc
  \node[annotation, anchor=north, align=center] at ($(generate.south)+(0.4, -0.2)$)
    {Produce concrete plans,\\analyses, and prototypes};

  % 4. Judgment: lower-left, outside arc
  \node[annotation, anchor=north, align=center] at ($(judgment.south)+(-0.4, -0.2)$)
    {Select, combine,\\and direct work};

  % 5. State: above and left
  \node[annotation, anchor=south east, align=right] at ($(state.north)+(-0.15, 0.15)$)
    {Reprioritize and carry\\forward relevant state};

\end{tikzpicture}
\end{document}
