[{"data":1,"prerenderedAt":426},["ShallowReactive",2],{"home":3,"mdc--5tc9y2-key":145,"mdc-e9vkas-key":166,"mdc--srulao-key":220,"mdc-k170jb-key":241,"mdc--8z3tyw-key":250,"mdc--oyu1oj-key":275,"mdc--si7of5-key":316,"mdc--ycfasd-key":348,"mdc--u3l6b2-key":373,"mdc-3cndo5-key":398,"mdc-u1nlps-key":407},{"id":4,"title":5,"body":6,"cta":13,"description":10,"extension":16,"footer":17,"header":23,"hero":29,"meta":33,"navigation":34,"path":35,"sections":36,"seo":140,"stem":143,"__hash__":144},"home\u002Fhome.md","Home",{"type":7,"value":8,"toc":9},"minimark",[],{"title":10,"searchDepth":11,"depth":11,"links":12},"",2,[],{"label":14,"to":15},"Read the specification","\u002Fspec\u002Fdraft-arcp-1.1","md",{"line1":18,"line2":19,"contact":20},"Agent Runtime Control Protocol — v1.1 (draft)","Standards Track · Expires November 13, 2026",{"label":21,"href":22},"Nick Ficano","mailto:nficano@gmail.com",{"name":24,"tags":25},"ARCP",[26,27,28],"Internet-Draft","Standards Track","v1.1",{"eyebrow":30,"headline":31,"lede":32},"Agent Runtime Control Protocol","The durable envelope around long-running agent work.","ARCP is a transport-agnostic wire protocol for **submitting, observing, and controlling long-running AI agent jobs** — and nothing more.",{},true,"\u002Fhome",[37,57,76,100],{"id":38,"number":39,"kicker":40,"kind":41,"body":42,"diagram":43},"what","01","What it is","prose","ARCP defines the execution envelope around AI agent work: **sessions, jobs,\nresumable event streams, capability-bounded leases, and delegation**. It\nspecifies how a job is submitted, how its events flow back, who is allowed to\ndo what, and how the whole thing survives a dropped connection.\n\nIt is deliberately narrow. ARCP wraps the agent function — it does not implement\nthe agent, expose its tools, or export its telemetry. Tool exposure is the concern\nof [MCP](https:\u002F\u002Fmodelcontextprotocol.io\u002F). Telemetry export is the concern of\n[OpenTelemetry](https:\u002F\u002Fopentelemetry.io\u002F). ARCP composes with them rather than\nabsorbing them.\n\nA job submitted over ARCP keeps running when the client disconnects, can be\nresumed or watched live from another machine, and cannot exceed the `lease` it\nwas granted — a bound on what it may read, write, call, spend, and for how long.\n",{"outer":44,"inner":51,"aside":56},{"label":45,"tags":46},"ARCP · durable envelope",[47,48,49,50],"session","job","event stream","lease",{"label":52,"tags":53},"agent function",[54,55],"LLM SDK · reasoning","MCP · tools","OpenTelemetry · telemetry export",{"id":58,"number":59,"kicker":60,"kind":61,"body":62,"items":63},"why","02","Why it exists","grid","Long-running agent jobs break the assumptions of a request\u002Fresponse API. They\noutlive the connection that started them, act with real spending and filesystem\nauthority, and frequently need to be watched by more than one observer at once.\nARCP exists to make that envelope **explicit and enforceable at the wire level**,\nso any client and any runtime can interoperate.\n\nThe protocol organizes every message under four concerns. Everything it\nspecifies is in service of one of them.\n",[64,67,70,73],{"title":65,"description":66},"Identity","Who is acting. Authenticated sessions and a per-job submitting principal.",{"title":68,"description":69},"Durability","Work survives disconnects. Sequenced events, resume after a drop, subscribe from elsewhere.",{"title":71,"description":72},"Authority","What an agent may do, bounded by capability, budget, and an expiring lease.",{"title":74,"description":75},"Observability","Structured progress, logs, metrics, and streamed results — plus W3C trace context.",{"id":77,"number":78,"kicker":79,"kind":80,"body":81,"items":82,"code":95},"how","03","How it works","list","An interaction is a session that carries one or more jobs. The wire format is a\nsingle JSON envelope; the transport is WebSocket for the network and stdio for\nin-process children.\n",[83,85,87,89,92],{"index":39,"description":84},"Open a transport and exchange `session.hello` → `session.welcome`. The client declares identity and supported features; the runtime returns a session, a resume token, and an agent inventory with versions.",{"index":59,"description":86},"Send `job.submit` carrying a `lease_request` — what the agent may read, write, call, spend, and until when. The runtime replies `job.accepted` with the effective lease.",{"index":78,"description":88},"Consume the `job.event` stream: logs, thoughts, tool calls, structured `progress`, cost `metric`s, and chunked `result_chunk`s for large outputs.",{"index":90,"description":91},"04","Reconnect with `session.resume` after a network drop, or `job.subscribe` from another session to watch a job live — without the authority to cancel it.",{"index":93,"description":94},"05","The job terminates with `job.result` or `job.error`. Leases that expire or budgets that run out fail closed.",{"title":96,"lang":97,"caption":98,"source":99},"job.submit","json","A job bounded in space, money, model, and time. The runtime enforces it on every operation.","{\n  \"type\": \"job.submit\",\n  \"payload\": {\n    \"agent\": \"code-refactor@2.0.0\",\n    \"lease_request\": {\n      \"fs.read\":     [\"\u002Fworkspace\u002Fapp\u002F**\"],\n      \"fs.write\":    [\"\u002Fworkspace\u002Fapp\u002Fsrc\u002F**\"],\n      \"cost.budget\": [\"USD:5.00\"],\n      \"model.use\":   [\"tier-fast\u002F*\"]\n    },\n    \"lease_constraints\": { \"expires_at\": \"2026-05-13T23:42:00Z\" }\n  }\n}\n",{"id":101,"number":90,"kicker":102,"kind":103,"body":104,"columns":105},"scope","Scope","columns","The clearest way to understand a protocol is to know where it stops. ARCP draws\na hard line and stays behind it.\n",[106,122],{"heading":107,"tone":108,"items":109},"Specifies","positive",[110,112,114,116,118,120],{"label":111},"The wire format for client–runtime communication",{"label":113},"The lifecycle of sessions, jobs, and event streams",{"label":115},"The authority model — leases with time and budget bounds",{"label":117},"Delegation, subscription, and job introspection",{"label":119},"Lease-bound provisioned credentials",{"label":121},"Trace context propagation",{"heading":123,"tone":124,"items":125},"Does not specify","neutral",[126,128,131,134,136,138],{"label":127},"How agents are implemented",{"label":129,"note":130},"How tools are exposed","→ MCP",{"label":132,"note":133},"Telemetry export formats","→ OTel",{"label":135},"Scheduling, priority, or pause\u002Fresume of running jobs",{"label":137},"How agent state persists across restarts",{"label":139},"Auth beyond bearer tokens",{"title":141,"description":142},"ARCP — Agent Runtime Control Protocol","A transport-agnostic wire protocol for submitting, observing, and controlling long-running AI agent jobs.","home","4YxdrOf2bMmwtHYMs3Hn4NrILGaDydF1WfuKbGgaNLI",{"data":146,"body":147},{},{"type":148,"children":149},"root",[150],{"type":151,"tag":152,"props":153,"children":154},"element","p",{},[155,158,164],{"type":156,"value":157},"text","ARCP is a transport-agnostic wire protocol for ",{"type":151,"tag":159,"props":160,"children":161},"strong",{},[162],{"type":156,"value":163},"submitting, observing, and controlling long-running AI agent jobs",{"type":156,"value":165}," — and nothing more.",{"data":167,"body":168},{},{"type":148,"children":169},[170,182,207],{"type":151,"tag":152,"props":171,"children":172},{},[173,175,180],{"type":156,"value":174},"ARCP defines the execution envelope around AI agent work: ",{"type":151,"tag":159,"props":176,"children":177},{},[178],{"type":156,"value":179},"sessions, jobs,\nresumable event streams, capability-bounded leases, and delegation",{"type":156,"value":181},". It\nspecifies how a job is submitted, how its events flow back, who is allowed to\ndo what, and how the whole thing survives a dropped connection.",{"type":151,"tag":152,"props":183,"children":184},{},[185,187,196,198,205],{"type":156,"value":186},"It is deliberately narrow. ARCP wraps the agent function — it does not implement\nthe agent, expose its tools, or export its telemetry. Tool exposure is the concern\nof ",{"type":151,"tag":188,"props":189,"children":193},"a",{"href":190,"rel":191},"https:\u002F\u002Fmodelcontextprotocol.io\u002F",[192],"nofollow",[194],{"type":156,"value":195},"MCP",{"type":156,"value":197},". Telemetry export is the concern of\n",{"type":151,"tag":188,"props":199,"children":202},{"href":200,"rel":201},"https:\u002F\u002Fopentelemetry.io\u002F",[192],[203],{"type":156,"value":204},"OpenTelemetry",{"type":156,"value":206},". ARCP composes with them rather than\nabsorbing them.",{"type":151,"tag":152,"props":208,"children":209},{},[210,212,218],{"type":156,"value":211},"A job submitted over ARCP keeps running when the client disconnects, can be\nresumed or watched live from another machine, and cannot exceed the ",{"type":151,"tag":213,"props":214,"children":216},"code",{"className":215},[],[217],{"type":156,"value":50},{"type":156,"value":219}," it\nwas granted — a bound on what it may read, write, call, spend, and for how long.",{"data":221,"body":222},{},{"type":148,"children":223},[224,236],{"type":151,"tag":152,"props":225,"children":226},{},[227,229,234],{"type":156,"value":228},"Long-running agent jobs break the assumptions of a request\u002Fresponse API. They\noutlive the connection that started them, act with real spending and filesystem\nauthority, and frequently need to be watched by more than one observer at once.\nARCP exists to make that envelope ",{"type":151,"tag":159,"props":230,"children":231},{},[232],{"type":156,"value":233},"explicit and enforceable at the wire level",{"type":156,"value":235},",\nso any client and any runtime can interoperate.",{"type":151,"tag":152,"props":237,"children":238},{},[239],{"type":156,"value":240},"The protocol organizes every message under four concerns. Everything it\nspecifies is in service of one of them.",{"data":242,"body":243},{},{"type":148,"children":244},[245],{"type":151,"tag":152,"props":246,"children":247},{},[248],{"type":156,"value":249},"An interaction is a session that carries one or more jobs. The wire format is a\nsingle JSON envelope; the transport is WebSocket for the network and stdio for\nin-process children.",{"data":251,"body":252},{},{"type":148,"children":253},[254],{"type":151,"tag":152,"props":255,"children":256},{},[257,259,265,267,273],{"type":156,"value":258},"Open a transport and exchange ",{"type":151,"tag":213,"props":260,"children":262},{"className":261},[],[263],{"type":156,"value":264},"session.hello",{"type":156,"value":266}," → ",{"type":151,"tag":213,"props":268,"children":270},{"className":269},[],[271],{"type":156,"value":272},"session.welcome",{"type":156,"value":274},". The client declares identity and supported features; the runtime returns a session, a resume token, and an agent inventory with versions.",{"data":276,"body":277},{},{"type":148,"children":278},[279],{"type":151,"tag":152,"props":280,"children":281},{},[282,284,290,292,298,300,306,308,314],{"type":156,"value":283},"Consume the ",{"type":151,"tag":213,"props":285,"children":287},{"className":286},[],[288],{"type":156,"value":289},"job.event",{"type":156,"value":291}," stream: logs, thoughts, tool calls, structured ",{"type":151,"tag":213,"props":293,"children":295},{"className":294},[],[296],{"type":156,"value":297},"progress",{"type":156,"value":299},", cost ",{"type":151,"tag":213,"props":301,"children":303},{"className":302},[],[304],{"type":156,"value":305},"metric",{"type":156,"value":307},"s, and chunked ",{"type":151,"tag":213,"props":309,"children":311},{"className":310},[],[312],{"type":156,"value":313},"result_chunk",{"type":156,"value":315},"s for large outputs.",{"data":317,"body":318},{},{"type":148,"children":319},[320],{"type":151,"tag":152,"props":321,"children":322},{},[323,325,330,332,338,340,346],{"type":156,"value":324},"Send ",{"type":151,"tag":213,"props":326,"children":328},{"className":327},[],[329],{"type":156,"value":96},{"type":156,"value":331}," carrying a ",{"type":151,"tag":213,"props":333,"children":335},{"className":334},[],[336],{"type":156,"value":337},"lease_request",{"type":156,"value":339}," — what the agent may read, write, call, spend, and until when. The runtime replies ",{"type":151,"tag":213,"props":341,"children":343},{"className":342},[],[344],{"type":156,"value":345},"job.accepted",{"type":156,"value":347}," with the effective lease.",{"data":349,"body":350},{},{"type":148,"children":351},[352],{"type":151,"tag":152,"props":353,"children":354},{},[355,357,363,365,371],{"type":156,"value":356},"Reconnect with ",{"type":151,"tag":213,"props":358,"children":360},{"className":359},[],[361],{"type":156,"value":362},"session.resume",{"type":156,"value":364}," after a network drop, or ",{"type":151,"tag":213,"props":366,"children":368},{"className":367},[],[369],{"type":156,"value":370},"job.subscribe",{"type":156,"value":372}," from another session to watch a job live — without the authority to cancel it.",{"data":374,"body":375},{},{"type":148,"children":376},[377],{"type":151,"tag":152,"props":378,"children":379},{},[380,382,388,390,396],{"type":156,"value":381},"The job terminates with ",{"type":151,"tag":213,"props":383,"children":385},{"className":384},[],[386],{"type":156,"value":387},"job.result",{"type":156,"value":389}," or ",{"type":151,"tag":213,"props":391,"children":393},{"className":392},[],[394],{"type":156,"value":395},"job.error",{"type":156,"value":397},". Leases that expire or budgets that run out fail closed.",{"data":399,"body":400},{},{"type":148,"children":401},[402],{"type":151,"tag":152,"props":403,"children":404},{},[405],{"type":156,"value":406},"The clearest way to understand a protocol is to know where it stops. ARCP draws\na hard line and stays behind it.",{"data":408,"body":409},{},{"type":148,"children":410},[411,421],{"type":151,"tag":412,"props":413,"children":416},"pre",{"className":414,"code":99,"language":97,"meta":10,"style":415},"language-json","undefined",[417],{"type":151,"tag":213,"props":418,"children":419},{"__ignoreMap":10},[420],{"type":156,"value":99},{"type":151,"tag":422,"props":423,"children":424},"style",{},[425],{"type":156,"value":10},1780002613951]