I work at the intersection of human-computer interaction and AI. AI systems are becoming agents that act on their own initiative, which relocates human effort rather than removing it: someone still has to notice what an agent did, judge whether it matched what they meant, and redirect it before its assumptions spread. I design systems around that cost — when an agent engages you, what of its work it exposes, and where your direction applies — treating human attention and judgment, not compute, as the scarce resource.
News
Selected Work
When AI should act
Deciding when an AI system should interrupt, and what that costs.
class SchedulingSystemAPI:
def __init__(self):
self.events = []
def get_sorted_events(self):
# TODO: sort events by start time
pass
Live reconstruction — message Cody, edit the code, or move your pointer into Cody’s caret.
- A chat panel sits beside a Python editor holding a SchedulingSystemAPI class whose get_sorted_events method is an empty stub.
- Cody, the proactive agent, moves its own caret to the stub and selects the two lines that make up its body.
- Cody replaces those lines, typing the implementation in as you watch. A provenance band marks the line as AI-authored and fades after five seconds, as it does in the paper.
- Cody then opens a breakout conversation anchored to that line, explaining what it wrote and asking whether to continue.
- You can send Cody a message from the side chat, and it answers in the breakout beside the code rather than away from it.
- Every line of code is editable, and moving your pointer into Cody’s caret makes it move aside.
What the glasses see and hear
There’s gonna be four of us for dinner…
Working memory estimated from what is seen and heard
-
Banana Visuospatial“more utensils” Phonological
- Cup Visuospatial
- Plate Visuospatial
- Fork Visuospatial
- “four for dinner” Phonological
Visual and audio signals are encoded and stored as working memory items.
When to speak
hover the message to see why
Hover a memory item to see where it came from, or the message to see why it was said then.
- A wearer of smart glasses looks across a dinner table. Their field of view reaches a cup on the left, a plate in the middle, a fork on the right, and a banana further back.
- They also overhear someone say “There’s gonna be four of us for dinner”.
- Each signal is encoded into a vector and placed in an estimated working memory: four visuospatial items for the objects, one phonological item for what was said. The estimate is built from what the glasses can observe, not from any direct reading of the wearer.
- The user picks up the plate and the fork.
- Assistance is generated: “You might need more utensils for four guests.”
- The moment is then evaluated. The plate, the fork and the overheard guest count are all highly relevant, and the least relevant item in memory is cheap to displace, so the glasses speak now rather than earlier.
- The line is spoken aloud, and what was said takes the displaced item’s place in working memory.
- Hovering any memory item highlights the object or phrase it came from. Hovering the message draws its reasoning back to the items that justified it, and shows the banana card dropping out to make room.
Too Long to Watch, Too Short to Leave: Designing for Agent Micro-Waits
Build a potluck dashboard that assigns dishes to guests
- reading project files…
- choosing an allocation strategy…
- writing assign_dishes()…
- running tests…
def assign_dishes(people, dishes):
random.shuffle(dishes)
return zip(people, dishes)
# no dietary check
214 lines of code changed
Add an allergen check to every dish card: flag a conflict when a dish’s ingredients match a guest’s restriction.
Open a decision or a thread, visualise one, or ask the panel for a prompt — the main agent keeps running either way.
- A prompt goes to a coding agent: build a potluck dashboard that assigns dishes to guests. The agent starts working, and its trace keeps ticking over — reading files, choosing a strategy, writing code — for as long as the run lasts.
- Sidecar floats beside it. While the agent works, it reads the run and fills two stacks: decisions worth reviewing, and threads worth exploring.
- Opening the decision — the agent chose random assignment — shows the agent’s own reasoning, the line of code it rests on, and a box to ask why or what instead. It can be marked reviewed, flagged, or dismissed.
- Opening the thread to explore — dietary restrictions and allergen tracking — shows what the plan leaves out, with prompts to take it further.
- Visualising that thread draws a UI concept in the panel: a dish card that flags an allergen conflict when a dish’s ingredients match a guest’s restriction.
- Asking the panel for a prompt drafts one. It is queued rather than sent, because the main agent is still busy, and can be staged into the main agent when it is ready.
- Everything here happens in the panel. The main agent is never interrupted, and the run continues throughout.
- This is an illustrative reconstruction of the interface. It reports no result from the study.
What it should show you
Making an agent's plans and decisions into things you can edit.
Collected papers
- Social Dynamics of AI Support in Creative Writing 3 excerpts
- AI as an Active Writer: Interaction Strategies with Generated Text in Human-AI Collaborative Fiction Writing 2 excerpts
- +6 more in library
Ask your library
Idea canvas
Using AI to generate interesting fictional characters
What kind of feedback helps a writer develop a character?
Could you specify what kind of feedback mechanism you have in mind?
Social Dynamics of AI Support in Creative WritingBalancing AI creativity and authorship
Interactive AI-driven Character Editor
Writers revise the AI’s characters inline.
Rate each suggestion as you revise it
AI as an Active Writer (2023)AI-driven Character Complexity Enhancement
Multi-modal AI-driven Character Generator
Select a node and open the tab on its right to drag out a new one, or open a connection to see how well two facets fit.
- A canvas holds the facets of one research idea. Two research questions sit on the upper layer: using AI to generate interesting fictional characters, and balancing AI creativity with authorship.
- Three proposed designs sit below them: an interactive AI-driven character editor, AI-driven character complexity enhancement, and a multi-modal AI-driven character generator.
- One node in each layer carries an AI suggestion grounded in a paper from the collected library, shown with the paper it draws on.
- Edges run from each question down to the designs that answer it. Every scripted edge carries an indicator that expands to say how well the two facets fit: strong, partial or weak, and why.
- Selecting a node with suggestions reveals a tab on its right edge. Opening it lists two further facets to add.
- A suggestion can be dragged onto the canvas to become a new node, or placed with the keyboard. New nodes can then be connected to any other node.
- A rail on the left lists the collected papers, with a question box that answers from them.
- This is an illustrative reconstruction of the interface. It reports no result from the study.
1. What are new ways for AI agents to interactively elicit human feedback?
-
Generate topics relevant to eliciting human feedback
Edited 10 topics, including HCI and adaptive control…
-
Identify papers that seed exploration in mixed-initiative systems
Edited 7 papers, re-sorted by relevance…
-
Suggest connections between feedback mechanisms and AI agents, grounded in literature
Edited User guidance requested
No steps. Update and run to rebuild the plan.
Flip a step between the agent and yourself, open one to see its output, or answer the step that is asking for guidance.
- A research question — what are new ways for AI agents to interactively elicit human feedback? — is followed by a plan of steps that run like cells in a notebook, with controls to update and run the plan, collapse it, or delete every step.
- The first step is assigned to the agent: generate topics relevant to eliciting human feedback. It returns ten topics, and the sidebar shows the topics alongside the papers they are grounded in.
- The second step is assigned to the researcher instead. They rewrite it to seed exploration in mixed-initiative systems rather than in interactive feedback generally, and the step is marked as edited.
- The third step is assigned to the agent, which hands it back: rather than guess, it turns amber and asks the researcher for guidance.
- Every step’s toggle is live: a step can be reassigned between the agent and the researcher at any time. Selecting a step opens its output in the sidebar.
- The sidebar is editable. A paper the agent did not find can be searched for and added to the step’s output, then kept or discarded.
- The step asking for guidance takes an answer, and records it as its output.
- This is an illustrative reconstruction of the interface. It reports no result from the study.
All Publications
2026

2025




2024


2023

2022
Workshop Papers











