How omp Runs Subagents Differently Omp, a terminal-based coding agent forked from Pi, differentiates its subagent system by allowing workers to return typed results matching a declared schema, send direct peer messages, and safely edit shared files, rejecting stale edits. This contrasts with tools like Claude Code, where subagents return free-form text that the parent must parse. omp's approach lets the parent read specific fields directly, such as `agent://ComponentsExports/files.0.path`, reducing the need to rewrite child reports. On this page How omp Runs Subagents Differently Most coding agents treat a subagent as a nested chat that returns prose. omp gives workers typed results, direct peer messages, and safer shared-file edits. I spent the weekend reading about omp https://omp.sh/ and digging into how its subagent system works. This post is about that part: what a subagent is, why most tools build them as nested chat, and how omp does it differently. I will write a fuller omp post later. This one stays on subagents. First, What Is omp? omp https://omp.sh/ Oh My Pi is a coding agent for the terminal. It started as a fork of Pi https://pi.dev/ . Pi keeps the core small. omp adds more of the IDE into that core: file edits, search, language tools, debug, plan mode, memory, and first-class subagents. That is the product pitch. I will write a fuller omp post later. This one stays on the subagent model. I already wrote about Pi as the thin layer between heavier tools /blog/2026/pi-agent-multi-tool-workflow/ . Pi skips built-in subagents on purpose. omp keeps the Pi base and then builds subagents into the product on purpose. What Most Tools Mean by “Subagent” A subagent is a second agent that the main agent starts for a piece of work. It usually gets a fresh context, its own prompt, and a smaller tool set. When it finishes, it sends a result back up. In tools like Claude Code https://code.claude.com/docs/en/sub-agents , that result is mostly free-form text. The parent reads a summary and decides what to do next. php %%{init: {"layout": "dagre"}}%% flowchart TD Parent Parent agent -- |"task"| Child Child with fresh context Child -- |"text summary"| Parent Parent -- Decide Parent reads the text and continues This works for many jobs. It keeps the parent context clean. It also has a clear limit: the return value is prose. If you start five workers, you often end up asking the parent to parse five write-ups. How omp Changes That omp still starts child agents. The difference is the contract around them. Workers can return data that matches a schema you set. Peers can message each other while they run. Outputs stay readable as paths like agent://