rogerwilco RW1. One line per message: RW1 [re=] from= to= [item=] key=value ... [// tail]. No spaces in values; lists join with +; dates YYYYMMDD; tail is free text, 300 chars max. HO handoff: requires from to item ask; optional re due pri conf keep art ctx rb acc keys exp sup po amt cur kind dec flag appr var n src net vat acct paid ref eff apref addr RB readback: requires re from to item ask; optional due eta h do acc not asm exp sup po amt cur kind dec flag appr var n src net vat acct paid ref eff apref addr prev AQ ask: requires from to need; optional re item opts by sup po amt cur kind dec flag appr var src net vat acct paid ref eff apref addr AN answer: requires re from to val; optional item sup po amt cur kind dec flag appr var src net vat acct paid ref eff apref addr ST status: requires from to item; optional re pct eta blk sup po amt cur kind dec flag appr var n tot src net vat acct paid ref eff apref addr DN done: requires re from to item out; optional art next sup amt cur kind dec flag appr n tot src acct paid ref eff apref addr prev UN unable: requires re from to why; optional item alt need sup flag FL fail: requires re from to item why; optional art retry sup CX cancel: requires re from to item; optional why RB must echo the HO's item, ask and due as decoded (plus any slots the HO names in rb=; rb=all means every slot). If the HO says rb=acc or rb=plan, the RB must also carry acc=, and for rb=plan do=; optional not= asm=; tail = the task in your own words. Code-side receivers add h=. Unknown code: reply UN why=UNK. Every reply carries re=. ask: REVIEW=review against stated criteria, DRAFT=produce a first version, DECIDE=choose among options, RESEARCH=find out, BUILD=implement, FIX=repair a named defect, SUMM=summarise, PLAN=produce a plan, TEST=verify, EXTRACT=pull structured data out, UNDO=reverse a completed act named in ctx, RECON=match extracted invoices to POs and the bank feed; decide pay, hold or exclude per policy, SCHED=build the payment run from the payable list per policy, AUDIT=check the payment run against policy and sources; sign off or send back, PAY=release one payment exactly as instructed: item, amount, currency, payee account, payment date, reference, CHGBANK=change one supplier's payment details in the master to the details given, under the approval reference given, SEND=send one email to the supplier address given with the figures given; nothing else why: NOCAP=no capability, NOCTX=missing context, PERM=not permitted, BUSY=at capacity, CONFLICT=item owned by another agent, DUP=duplicate of an open handoff, VER=unsupported protocol version, UNK=unknown code in the message, SCOPE=out of scope, ERR=runtime error, TIMEOUT=ran out of time, REVOKED=approval withdrawn, SUPERSEDED=replaced by a newer handoff, EXPIRED=past its expiry out: OK=complete, PARTIAL=partly complete, NOOP=nothing needed doing need: ENUM=one of opts, TEXT=free text in the tail, NUM=a number, DATE=YYYYMMDD, YESNO=Y or N conf: L=low, M=medium, H=high cur: GBP=pounds sterling, USD=US dollars, EUR=euros kind: NET=net of VAT, GROSS=including VAT dec: PAY=schedule for payment this run, HOLD=keep on the run but do not pay yet, EXCL=exclude from the run flag: OVERLIM=above approval threshold, FX=not in run currency, BANKCHG=bank-detail change requested, LOOKALIKE=sender domain differs from master, DUP=same invoice received twice, CORR=corrected version issued, VOID=voided by supplier, PAID=already paid per bank feed, CN=credit note, REFUNDED=credit already refunded, POVAR=differs from PO, NOPO=no PO found, STMT=statement, not an invoice, NOISE=not a supplier document appr: REQ=approval required, OK=approved by the principal, NO=declined by the principal, NA=no approval needed ans: APPROVE=yes, proceed as asked, DECLINE=no, do not proceed, HOLD=keep it on the run, do not pay in this run, REJECT=refuse the request; nothing changes, CALLBACK=verify with the supplier by phone on the number on file before anything changes acc= constraint keys (closed set): len=length with unit suffix: 120w words, 800c characters, 2p pages, 10s slides; fmt=output format: md, docx, json, csv, html, txt; lang=language or spelling variant: uk, us, fr; tone=register: plain, formal, casual, technical; voice=grammatical person: we, i, you, third; aud=audience, one token; out=artifact kind: copy, spec, dataset, pr, report; by=date YYYYMMDD; src=a required source, one token; scope=what is in scope, one token per value; must=a required element; several allowed; no=a prohibited element; several allowed. Values: no spaces, lowercase, e.g. len:120w lang:uk must:monday-problem no:em-dash. Every HO closes exactly once: DN, UN or FL from the receiver, or CX from the sender. On a CX, abandon anything prepared and answer AN val=Y; if the act already ran, send its DN instead. exp=YYYYMMDDTHHMMZ (UTC) is the latest moment to act or confirm: never act on an HO, and never confirm a statement, past its exp. A DN that does not match the plan is reversed with a new HO ask=UNDO ctx=. Message ids are -, unique in the conversation. Readback level is set per handoff by the sender: rb=exec before an irreversible act (a payment release, a payee change, anything external) where the profile names execution slots, rb=all where it does not; the default envelope echo otherwise. rb=exec: the RB carries the execution slots for the ask with the values you will actually use, resolved from your own records where the HO does not give them (PAY: sup amt cur kind acct paid ref apref; CHGBANK: sup acct eff apref prev; SEND: sup addr amt cur paid ref). The sender checks them against its record and only an AN val=Y clears the act. After the act, the DN carries the same slots with the values as executed, taken from the tool's result, not from your intention; the sender checks that too. Profile pay: messages carry p=pay. Agents: auditor, coordinator, desk, extractor, human, payer, reconciler, scheduler. AQ opts and AN val must come from ans; do not invent options. Profile slots: sup=supplier short name, lowercase, no spaces (token); po=purchase order id (token); amt=amount, two decimals, no thousands separator (money); cur=currency of amt (enum:cur); kind=whether amt is NET or GROSS (enum:kind); dec=decision for the item (enum:dec); flag=why the item needs attention; several allowed (list:enum:flag); appr=approval state (enum:appr); var=variance against the PO, net, signed (money); n=count of items (int:0-9999); tot=total of PAY lines in the run currency (money); src=where the fact came from: email: (message number in the inbox export), bank:, po:; several allowed (list:token); net=net amount before VAT (money); vat=VAT amount; net + vat = amt when kind=GROSS (money); acct=payee account as sortcode/number, e.g. 40-12-88/61102938 (token); paid=payment date (date); ref=payment or remittance reference as the supplier will see it (token); eff=date a change takes effect (date); apref=the principal's approval reference for an irreversible act, e.g. FD-0926 (token); addr=email address, for SEND (token); prev=the account on file that a bank change replaces, as sortcode/number (token). money = digits with two decimals, no separators (5400.00). item examples: inv:INV-000491, inv:7731, sup:northfield, run:2026-09.