Shared vocabulary for agent work
Agent Work Model
Precise names for the projects, work episodes, agents, attempts, conversations, and artifacts that different systems need to discuss together.
Agentic software has a language problem
Agent systems are becoming more capable every month. The language used to connect them is not keeping pace.
Teams routinely use the same words for different things. A session might mean a conversation, a graph checkpoint namespace, a network connection, one agent assignment, or the whole span of work. A run might mean one model loop, one retry, one workflow, or everything that happened after a user clicked “start.”
This sounds like a documentation problem. It becomes an architecture problem the moment two systems exchange data. If “resume the session” is not precise, developers cannot know which history to load, which process to restart, which permissions still apply, or whether the work is already complete.
The confusion is already visible
LangGraph uses a thread for checkpointed graph state. The OpenAI Agents SDK uses a session for conversation history across runs. MCP now defines a stateless context-exchange protocol, although developers still encounter older transport-level “session” identifiers.
Each meaning is reasonable inside its own system. They are not interchangeable. At the boundary, adapters grow special cases, database columns acquire misleading names, lifecycle events cannot be compared, and specifications depend on tribal knowledge. The mapping guide compares more systems without claiming false equivalence.
Clear language changes the work
Agent Work Model starts with one primary distinction: a WorkSession is the bounded episode of work, while an AgentRun is one agent’s assignment inside it.
The remaining terms make that distinction operational. A RunAttempt is one infrastructure try at the assignment. A Turn is one input-to-output cycle. A HostConversation is chat history that may attach to the work, but is not the work itself.
Now a specification can say exactly what survives a crash, what is retried, what owns mutable state, and what completion means. APIs become easier to review. Events become easier to join. Tests can assert real invariants instead of guessing what a field named session_id was intended to mean.
The joy is practical: fewer translation meetings, fewer “which run?” questions, and more time spent building the behavior the team actually agreed on.