Back to main

Deep Dive: Agentic Control Plane

Focus: Steerability and observability in long-running AI agent systems

1. The problem: black box reasoning

In long-running agentic workflows — multi-step tool interactions, complex “computer use” tasks — models fall into reasoning loops that are hard to audit. Standard chat interfaces show a linear history for what is inherently a branching process. One bad reasoning step propagates through the entire chain, and by the time you notice, it’s buried under layers of downstream decisions.

2. The approach: a state-managed control plane

I built a control plane that treats AI agency as a navigable trace tree rather than a conversation. The goal: move from reactive prompting (waiting for failure) to proactive orchestration (steering the trajectory).

A. Trace tree

To make agentic reasoning legible, I implemented a dual-layer trace tree:

  • Hierarchical execution nodes: Each reasoning step is a NodeExecution that captures the agent’s internal monologue. A tree visualization maps nested tool calls and sub-agent invocations.
  • Thinking token auditing: The UI renders the model’s raw reasoning process before final output, letting users audit the logic behind a decision — not just the result.
  • Interactive tool chips: Tool calls within the trace (Jira tickets, Slack threads) are interactive elements providing real-time feedback on external state changes.

B. HITL inbox pattern

For high-stakes decision points, I built an asynchronous intervention system:

  • State-driven categorization: Agent runs are aggregated into an inbox categorized by state: In Progress, Input Needed (approvals), Issues (errors), Completed.
  • Context-aware pausing: The system identifies nodes with waiting_hitl status and automatically pauses execution while preserving full environment state.
  • Trajectory injection: When a user intervenes (approving a triage, correcting a query), the input is injected back into the execution node. The system re-resolves the downstream trajectory based on the new signal.

C. Observability

  • Time-travel snapshots: Each node records globalStateBefore and globalStateAfter. You can rewind to any node, modify the context, and re-execute the branch.
  • Variable referencing: A declarative syntax ({{node_id.property}}) enables deterministic data flow across non-linear branches.
  • Streaming protocol: An XML-based streaming protocol (<thought> and <json> delimiters) lets the UI parse and render complex agentic traces in real-time.

3. Why it matters

Wrapping non-deterministic reasoning in a deterministic observability layer changes the user experience from passive observation to active partnership — the human steers intent, the model handles execution. This pattern shows up across the UXR pipeline (TraceLog component), the Dubbing Studio (ActivityLog), and Trace Logic (the full graph-based reasoning verification tool).

Back to main