Skip to content
Field Notes

Agent UX

The Future of Agent UX Will Not Be Chat-First. It Will Be Intent-First.

NL-native, not chat-only.

Language is the default shell. GUI is a surface the agent renders when complexity, density, or risk demands it — inline, in one session, with a reason.

Language is the runtime. GUI is a rendered consequence of complexity — invoked by the agent, not chosen by the user from a menu of product philosophies.

The agent UX pattern

There is a lazy version of the agent UX debate: chat is the future, traditional UI is dead. I don't buy it. NL-native is not chat-only — it is a shell where the agent decides when prose is enough and when the job needs a rendered surface. Bolt a chat sidebar onto every dashboard and you get the same laziness in reverse.

The right pattern is simpler and harder to build: NL-native shell, with the agent invoking GUI artifacts inline — tables, dashboards, confirmation surfaces — based on what the job requires.

GUI is not deprecated. It is demoted from default and promoted to tool. The agent calls render_table when prose stops being honest. It calls render_confirmation when the commit boundary is irreversible. One thread. Zero mode switches.

Agentic UX pattern
1
NL-native shell
Single entry point — every session starts in language
2
Agent render policy
Agent evaluates alignment, density, comparison, risk — decides whether to invoke a GUI artifact
3
Rendered GUI artifacts
Tables, dashboards, confirmation surfaces — inline tools, not separate product modes
Language is the runtime. GUI is a rendered consequence of complexity — not a separate philosophy.
Single Bruce NL-native session scroll showing Turn 1 NL alignment, Turn 3 inline variance table, and Turn 7 batch payment confirmation surface
One session, three surfaces — NL alignment, rendered table, rendered confirmation. The agent escalates; the user never switches modes.

Tuesday, 4:47 PM — Rachel Kim, Controller

Month-end close. Rachel opens Bruce — not an AP dashboard, not a report builder. One NL-native session. She starts with what she has: “Our freight accruals don't match carrier invoices this month — help me figure out why before close.”

Turn 1 — stay in NL. Intent is ambiguous: cutoff timing, misclassified GL, duplicate blanket PO, mid-cycle carrier billing change. The agent asks clarifying questions. No GUI yet. Convergence before commit to a view.

Turn 3 — render_table. Forty-seven variance rows across carriers and GL accounts. Comparison cardinality exceeded threshold. The agent renders an inline table with a legible chip: “Rendering variance table — 47 rows, parallel comparison needed.” Rachel refines in language — “Group by root cause.” “Show only variances over $50K.” Language steers; GUI holds state.

Turn 7 — render_confirmation. Corrections identified. Batch payment ready: $847,000 to twenty-three vendors. Rachel says “Approve the corrected batch.” Risk threshold crossed. The agent renders an inline confirmation surface — amounts, recipients, audit trail, explicit Cancel and Approve. The agent proposes. Rachel commits.

One session · agent-driven escalation
Month-end close — freight accrual investigation
Turn 1
Signal Intent ambiguous
Turn 3
Signal 47 rows · parallel compare
Turn 4
Signal User refines in NL
Turn 7
Signal Irreversible · $847K
The agent escalates surface complexity inside one NL-native session — the user never switches modes.

The agent render policy

This is not vibes-driven UI. Elite agentic products encode an explicit render policy — Alignment · Awareness · Action · Risk — as agent decision logic, not user education:

Alignment — intent ambiguous → stay in NL. Awareness — state density or comparison cardinality exceeds threshold → render table, timeline, or dashboard inline. Action — simple, reversible, low-risk → execute in NL. Risk — irreversible or permission-sensitive → render confirmation surface; never chat-only commit.

The policy must be legible. Users trust agents that explain why the experience changed — not agents that spam widgets every turn or dump four hundred rows as markdown.

Agent render policy
Alignment · Awareness · Action · Risk
Alignment
Signal: Intent ambiguous — convergence needed
→ Stay in NL
e.g. Why don't accruals match invoices?
Awareness
Signal: State density or comparison cardinality exceeds threshold
→ Render table / dashboard / timeline
e.g. 47 variance rows — parallel compare
Action
Signal: Simple, fast, low-risk, reversible
→ Execute in NL
e.g. Flag this vendor for review
Risk
Signal: Irreversible, permission-sensitive, external-facing
→ Render confirmation surface
e.g. Approve $847K batch payment
The agent decides when to render GUI. The human always decides when to commit.
A-A-A-R is the agent's render policy — not a UX taxonomy the user has to learn.

Wednesday, 9:00 AM — Elena Vasquez, VP Procurement

Same NL-native shell. Different domain. Elena opens Bruce before Q4 peak planning — not Ariba, not a BI dashboard. “Find suppliers most likely to miss lead times before Q4 and explain why.”

Turn 1 — stay in NL. The agent clarifies scope: packaging vs freight vs raw materials, which plants, what lead-time threshold counts as at-risk. Elena narrows to packaging and freight across the Midwest plants.

Turn 3 — render_table. Thirty-four suppliers. Parallel comparison needed. The agent renders an inline risk table — supplier, category, lead time, Q4 exposure, risk score — with the decision chip visible. Elena groups by root cause, drafts escalation emails for the top five, all in the same thread.

Elena Vasquez purchasing session with agent rendering inline supplier risk table and Q4 exposure scores
Turn 3 — Elena's session. Agent invokes render_table when supplier comparison outgrows prose.

Turn 8 — render_confirmation. Elena says “Send to category managers.” External-facing. Five recipients. The agent does not confirm in a chat bubble — it renders a send confirmation surface: recipients, preview snippets, timing, permissions. Elena reviews. Then commits.

Agent rendering inline send confirmation surface for Elena Vasquez before external escalation emails
Turn 8 — render_confirmation at the commit boundary. Same session, same render policy.

Finance close and purchasing command share one architecture. The domain changes. The render policy does not.

Thursday, 8:30 AM — Morgan Reyes, Enterprise AE

The pattern holds in GTM. Morgan opens Bruce before pipeline review — not a CRM export, not a spreadsheet she rebuilds every Monday. “Which open deals are single-threaded with no economic buyer engaged?”

Turn 2 — render_table. Twenty-three deals match. Comparison needed across account, stage, value, champion, and EB status. The agent renders an inline pipeline table — Harbor Goods flagged, three other six-figure opportunities single-threaded. Morgan sees the pattern in seconds, not after twenty minutes of CRM archaeology.

Morgan Reyes GTM session with agent rendering inline pipeline table of single-threaded deals missing economic buyer
GTM — render_table when pipeline comparison outgrows a paragraph. Same policy as finance and purchasing.

Turn 5 — render_confirmation. Morgan says “Draft multi-thread outreach for the top eight.” The agent generates champion memos — but before anything sends, it renders a bulk outreach confirmation: eight drafts, external-facing, guardrail note that economic buyers are not yet engaged. Morgan queues sends from the surface, not from a chat bubble. Same commit boundary as Rachel's batch payment and Elena's escalation emails.

Agent rendering bulk outreach confirmation surface for Morgan Reyes before queueing eight external Gmail drafts
Turn 5 — render_confirmation before bulk outbound. Champion-only messaging, EB not yet engaged.

This is the same agent UX pattern that runs through deal execution, revenue leadership, and every workflow where ambiguity and accountability coexist. NL-native entry. Agent-driven escalation. Human commit at the boundary.

What separates elite from reckless

Three failure modes kill agent UX:

GUI spam — the agent renders a table on every turn because it can. Surfaces should escalate, not accumulate.

Markdown masquerading as GUI — four hundred vendor rows as a chat code block is not agent UX. It is laziness.

Chat-only commit — approving a batch payment, blanket PO, or bulk outreach through conversational confirmation. The agent must render explicit state at the commit boundary. Every time.

Elite agents also support collapse: “Actually, just summarize the top three issues.” The GUI artifact compresses back to NL when the job simplifies. The session breathes in both directions.

Chat is not the product. Intent is.

A lot of agent products mistake the chat box for the innovation. The innovation is that an agent can understand intent, reason over context, invoke tools, and synthesize the right experience for the moment.

Chat-only products force dense state and high-stakes decisions through a narrow window. Dashboard-first products force ambiguous intent through rigid forms. Agentic products do neither. They start in language and render GUI when the job demands it.

Building Bruce taught us this: users do not want to pick a UX mode. They want an agent that knows when prose is enough and when the job needs a table, a timeline, or a confirmation screen — and renders it inline, with a reason, in one session.

Build NL-native. Let the agent render complexity. Never let it commit without a surface.

Field Notes

Continue