WEEK 04

Communication Languages: From Speech Acts to FIPA-ACL 통신 언어: 화행에서 FIPA-ACL까지

Is the message an agent sends data, or an act? The agent communication languages of the 1990s put a performative (the kind of speech act) on every message and defined its meaning in logic. We run the same price negotiation in three message formats and measure how a format with a performative differs in outcome correctness, limit violations, turns, format errors, and reader calls.

01

Outline

PartContent
A1Speech act theory: saying is doing
A2KQML and FIPA-ACL: message structure and semantics
A3Four limits of FIPA-ACL, the LLM, and the design of a reproduction
DiscussionNatural-language content and the ontology problem
LABOne buyer, one seller, three message formats
PART A: LECTURE

Agent communication languages: a performative on every message

A1 speech acts, A2 KQML and FIPA-ACL, A3 four limits and the LLM, discussion
A1

Speech act theory: saying is doing

Week 03's Contract Net had a fixed set of messages, task-announcement, bid, award, and what each message did was in its name. An agent communication language (ACL) extends that idea to messages in general. In his 1955 William James Lectures at Harvard, published in 1962 as How to Do Things with Words, J. L. Austin took sentences such as “I name this ship the Queen Elizabeth”. The sentence is neither true nor false. Said by the right person in the right place, it gives the ship its name. Austin called such sentences performatives.

Austin then split every utterance into three acts. Saying the sentence is the locutionary act; what one does in saying it (informing, requesting, promising) is the illocutionary act; what the saying brings about in the hearer (coming to believe, being persuaded) is the perlocutionary act. The same sentence, “the price is 120”, can be an inform or a propose. What an agent communication language tried to attach to a message is the second of these, the illocutionary force.

Take the sentence in FIG. 01. What the buyer said, “I can go to 120 for the bicycle”, the words, the grammar, and the number 120, is the locutionary act. What the buyer did by saying it is the illocutionary act: it may be stating its limit (inform), offering to buy at 120 (propose), or agreeing to the 120 the seller just named (accept-proposal). What the seller then does, believing it, deciding to sell, or walking away, is the perlocutionary act. A program that receives this message has to know the second one before it can decide what to do next. On an inform it records the other side's limit, on a propose it decides whether to take it, on an accept-proposal it closes the deal.

A speech act is the act performed by uttering a sentence. The same sentence is a different act depending on whether it is said as a statement, a request, a promise, or a proposal.

J. L. Austin, How to Do Things with Words (1962): “to utter the sentence (in, of course, the appropriate circumstances) is not to describe my doing of what I should be said in so uttering to be doing or to state that I am doing it: it is to do it.”

In “A Taxonomy of Illocutionary Acts” (1975) John Searle sorted illocutionary acts into five classes. The criterion is direction of fit: which of the words and the world is made to match the other. The statement “the price is 120” is wrong if the world is not like that; the request “sell it to me for 120” is unfulfilled if the world does not become like that.

assertivesWords follow the world. Statements, reports. They can be true or false.
directivesThe world is to be made to match the words. Orders, requests, questions.
commissivesThe speaker binds their own future action to the words. Promises, offers.
expressivesA psychological state is expressed. Thanks, apologies.
declarationsSaying it changes the world. Naming, dismissing. An institution that grants the authority is presupposed.

Of the lab's four acts, propose and accept-proposal bind the speaker's own future action and are commissives. FIPA defines all four as informing “this is my intention”, so inside FIPA all four become assertive-type acts.

The classification entered AI through Philip Cohen and C. Raymond Perrault's “Elements of a Plan-Based Theory of Speech Acts” (1979). They wrote speech acts as plan operators with preconditions and effects. A plan operator is the action format of robot planning: “to open the door you need the key (precondition), and afterwards the door is open (effect)”. Written in the same format, speech becomes something an agent can plan like a movement or a manipulation, “to make the other side know the price, send an inform”. The precondition of request is “the speaker wants the hearer to do the action”, and its effect is “the hearer knows the speaker wants it”. The feasibility precondition and rational effect that FIPA wrote for every performative twenty years later have this shape.

UTTERANCE AUSTIN 1962 FIPA-ACL 2002 “I can go to 120 for the bicycle.” locutionary act illocutionary act perlocutionary act :content performative rational effect the sentence said what is done in saying it the effect on the hearer words, syntax,reference to 120 a propose, or an inform,or an accept-proposal the seller believes it,or agrees, or walks away a content languageplus an ontology the only mandatoryparameter defined in the semantics,not carried in the message
FIG. 01 One utterance, three actslocution → content, illocution → performative
WHICH ACTS THE LAB USESThe lab uses only FIPA's four negotiation acts: propose, accept-proposal, reject-proposal, refuse. The question acts, query-ref and cfp, are left out. What happens when the first message is a question shows up in the reference run.
A2

KQML and FIPA-ACL: message structure and semantics

The first agent communication language was KQML (Knowledge Query and Manipulation Language). It came out of DARPA's Knowledge Sharing Effort in the early 1990s, and Tim Finin and colleagues described it at CIKM in 1994. A message has an outer performative and an inner content. The performative fixes what act the message is; :language and :ontology fix how the content is read. There were a few dozen performatives, tell, ask-one, ask-all, reply, subscribe among them, and some for the facilitator that finds agents, such as broker and recruit.

KQML, Finin et al. 1994
(ask-one
  :sender    buyer
  :receiver  seller
  :content   (price bicycle ?x)
  :language  KIF
  :ontology  used-goods
  :reply-with q1)

The message above is the buyer asking the seller the price of the bicycle. ask-one is the performative that asks for one answer; ?x in the content is the variable the seller fills in; KIF is the logic language the content is written in; used-goods is the vocabulary (ontology) that fixes what price and bicycle refer to. :reply-with q1 asks for the reply to carry :in-reply-to q1, which is how an answer is matched to its question when several conversations run at once.

KQML's problem was that the meaning of a performative existed only as English prose. Implementations read tell slightly differently. Yannis Labrou and Finin proposed a formal semantics in 1997, and Labrou, Finin, and Yun Peng's “Agent Communication Languages: The Current Landscape” (1999) set KQML and FIPA-ACL side by side around this problem.

FIPA (Foundation for Intelligent Physical Agents), a standards body founded in 1996, published its first ACL specification in 1997 and made it a standard in 2002. The message structure specification, SC00061G, defines 13 parameters in five groups.

type of actperformative. The specification: “the only parameter that is mandatory in all ACL messages is the performative”. The other twelve are optional.
participantssender, receiver, reply-to
contentcontent. The object of the act. The specification says it is “interpreted by the receiver”.
descriptionlanguage, encoding, ontology. What gives the symbols in the content their meaning.
conversationprotocol, conversation-id, reply-with, in-reply-to, reply-by. Week 03's Contract Net is one value of protocol (fipa-contract-net).
(propose   :sender           buyer   :receiver         seller   :content          "(= (price bicycle) 120)"   :language         fipa-sl   :ontology         used-goods   :protocol         fipa-contract-net   :conversation-id  c-42   :in-reply-to      cfp-7   :reply-by         20260925T1000) type of act the only mandatory one participants content read by the receiver description of content control of conversation sender, receiver, reply-to language, encoding, ontology protocol, conversation-id, reply-with, in-reply-to, reply-by semantics of propose, SC00037J 3.13 FP: the sender believes α, and does not believe the receiver already knows α RE: the receiver comes to believe α α: once the receiver wants the act done, the sender will intend to do it. Neither belief is in the message.
FIG. 02 Anatomy of a FIPA-ACL message13 parameters, 1 mandatory

Where FIPA parts from KQML is the semantics. The Communicative Act Library specification, SC00037J, gives each of the 22 acts a feasibility precondition (FP) and a rational effect (RE), written in David Sadek's logic: B for belief, U for uncertainty, I for intention, Done for an action having been performed. The FP is the condition under which the act may be sent; the RE is what the sender is trying to bring about by sending it. The FP of inform is “the sender believes φ and does not believe the receiver already knows φ”; its RE is “the receiver comes to believe φ”. The FP of request is “the sender believes the receiver can do action a and does not believe it already intends to”; its RE is “a is done”. The negotiation acts are all defined as combinations of inform. propose is “informing that I intend to do act if condition φ holds”, accept-proposal is “informing that I intend the other to do act”, and reject-proposal is informing that I have no such intention. The buyer's propose 120 informs “if you want it, I will adopt the intention to buy at 120”, and its FP is that the buyer really means it and believes the seller does not yet know it.

In FIPA-ACL the meaning of a message is defined by the sender's beliefs and intentions. For inform(i, j, φ) the FP is Biφ ∧ ¬Bi(Bifjφ ∨ Uifjφ) and the RE is Bjφ.

FIPA, “Communicative Act Library Specification” SC00037J (2002), 3.8 Inform. Every condition is a proposition about i's beliefs (Bi) and j's beliefs (Bj).

Read symbol by symbol, with i the buyer, j the seller, and φ “the price of the bicycle is 120”.

BiφThe buyer believes φ. B is belief.
BifjφThe seller already knows whether φ is true or false. Bif is “believes whether”: it has an answer either way.
UifjφThe seller is not certain but leans one way about φ. U is uncertain.
¬Bi(Bifjφ ∨ Uifjφ)As far as the buyer can tell, the seller has neither an answer nor a guess yet. The condition that there is no reason to inform someone who already knows.
∧And. Both conditions must hold for the FP to hold.
BjφThe seller comes to believe φ. The result the sender of an inform is after.

In one sentence, the FP is “the buyer believes the price is 120 and thinks the seller does not know it yet”, and the RE is “the seller comes to believe the price is 120”. Sending an inform when the FP does not hold violates the specification, and nothing guarantees that the RE actually happens after it is sent.

Biφ ∧ ¬Bi(Bifjφ ∨ Uifjφ) Bjφ FP RE BUYER i SELLER j INSIDE THE BUYER, NOT IN THE MESSAGE INSIDE THE SELLER the buyer believes φ and believes the sellerdoes not know φ yet the seller comesto believe φ φ: the price of thebicycle is 120 no answer (Bif), no guess (Uif) hoped for, not guaranteed (inform :sender buyer :receiver seller :content "(= (price bicycle) 120)") the only thing that travels a program can check this string, none of the three boxes above
FIG. 03 Reading the semantics of informFP inside the sender, RE inside the receiver

The specification assumes sincerity. The inform entry says “the sending agent is sincere”, and whether the receiver adopts the content depends on “the receiver's trust in the sincerity and reliability of the sender”. On insincere agents it says this.

Arguably there are situations where an agent might not want to be sincere, for example to protect confidential information. We consider these cases to be beyond the current scope of this specification.FIPA SC00037J (2002), 3.5 Confirm
INTERACTION PROTOCOLSEleven of them: request, query, contract net, iterated contract net, brokering, and others. The reference implementation is JADE.
A3

Four limits of FIPA-ACL, and the LLM

FIPA-ACL was a complete standard. It had a message structure, a semantics, interaction protocols, and a reference implementation. In 2005 FIPA became a standards committee of the IEEE Computer Society. Agent communication after that was built outside the specification. There are four reasons.

First, the semantics cannot be verified. The FP conditions an act on the sender's beliefs. Those beliefs do not travel in the message, and the receiver cannot see inside the other program. What reaches the seller is the string (propose ... 120); whether the buyer really holds that intention sits in the buyer program's variables and weights. Michael Wooldridge named this the semantic verification problem in “Verifiable Semantics for Agent Communication Languages” (ICMAS 1998). To judge whether an agent conforms, one would have to attribute beliefs and intentions to its program, and there is no way to do that for an arbitrary program. In the same year Munindar Singh, in “Agent Communication Languages: Rethinking the Principles” (IEEE Computer), proposed defining meaning by publicly checkable social commitments instead of mental states. Jeremy Pitt and Abe Mamdani (1999) pointed at the same place.

Second, the agents could not reason enough to use the semantics. Using FP and RE requires inferring the other side's beliefs and intentions. The implementations of the time were code that branched on the performative string.

Third, the cost of agreeing on an ontology. To read the content, both sides must already share :language and :ontology. Inside one organisation communication worked without an ACL; across organisations, aligning ontologies took separate work.

Fourth, there were no agents to use the standard. The interoperability specification was written before a population of agents that needed to interoperate existed, and nobody had a reason to adopt it.

The LLM has removed most of the second and the third. The model reads whether “I can do 120 for you” is an accept or a propose without a tag, and treats price, 가격, and 값 as the same thing without prior alignment. Samuele Marro and colleagues' agent communication trilemma in the 2024 Agora paper describes this state: natural language handles any situation but costs a model call every time it is read, and a fixed protocol is cheap but handles only the situations it was written for. The lab's three conditions sit on this axis. free is the natural-language end, so every message costs a reader call; structured is the fixed-protocol end, so it carries one price and drops everything else that was said; tagged sits between them, fixing the act and leaving the content in English. The first limit remains, and shows more often with an LLM. An LLM can inform what it does not believe (a hallucination) and can accept a price outside its own limit. That sincerity cannot be checked from outside the message is as true as in 1997. Federico Bianchi and colleagues' NegotiationArena (2024) reports LLM negotiators gaining a 20% higher payoff against GPT-4 by feigning desperation.

A different attempt targets the third leg of the trilemma. Jev, released by TypeSafe AI, does not generate text; it is a classifier that takes a state and a set of questions and returns probabilities. What the lab's reader did on every message, judging whether a sentence is a propose or an accept-proposal and reading off the price, continues on the same free-form text, but as one cheap, specialized call instead of a full LLM call. TypeSafe AI reports up to 200x faster and 400x cheaper inference on classification tasks. What this approach targets is the size of the cost the free condition paid, its reader_calls. What comes back is not a believes or an intends but a calibrated probability, closer to the social commitment Singh (1998) proposed in place of mental states: a number over observable text rather than a proof of an inner state.

buyer or seller turn free-form text, no tag before: reader with Jev a full LLM call classifies performative and price cost: one model call per message (reader_calls) state + questions to a classifier (RLCD-trained) cost: one specialized call 200x faster, 400x cheaper (reported) protocol layer decides the next act performative and price, from a call or a probability
FIG. 05 Where Jev sits in the reader stepsame free-form message, cheaper classification

The reproduction keeps the negotiation procedure and the participants and changes only the message format, and measures how outcome, violation, turns, and reader_calls differ when a performative tag is present.

FIPA made the illocutionary force a mandatory field on the surface of the message. The tagged and structured conditions of the lab are that field.

What changes (the independent variable) is one thing, the message format. free is plain English; tagged is one performative tag followed by one plain sentence; structured is one JSON object carrying the performative and the content (price). What is held constant (the controls): the scenarios, the role prompts, the model, the temperature, the turn limit, and the reader prompt that labels messages in the free condition. Only the last paragraph of the system prompt, the one that dictates the format, differs between conditions. What is measured is recorded per episode.

outcomeOne of deal, no_deal, open, plus the deal price. Correct when a deal happens exactly if reserve ≤ budget and the price lies inside both limits.
violationA deal below the seller's reserve or above the buyer's budget. An utterance that broke the limit instruction in the system prompt.
costMessages exchanged (turns), messages the protocol layer could not parse (format_errors), model calls spent reading messages (reader_calls).
Same conditions free tagged structured Same verdict scenarios, role prompts, model, temperature, turn limit plain English, LLM reader performative + English performative + JSON content outcome, price, violation, turns, format errors, reader calls
FIG. 04 Experiment structureone independent variable, the message format

The free condition measures, as reader_calls, what it costs a program to find out the state of the conversation when there is no tag and no format. In the tagged condition a regex reads the tag and the reader reads only the price inside a sentence, so the question is how far reader_calls drop. In the structured condition the content is bound to price: int, and turns and violation are compared. violation is recorded in all three.

DISCUSSION: natural-language content and the ontology problem
  1. FIPA put the point of agreement on the surface of the message, as in :ontology used-goods. When two LLMs negotiate in natural language alone, where does that agreement go? Has it disappeared, or moved into the model weights where it cannot be seen? If the two agents are different models, what comes apart?
  2. FIPA required the sincerity of inform as a norm and could not enforce it. Is a system prompt that says “never accept a price outside your limit” the same thing as that sincerity condition? If so, what verifies it?
  3. If the reader labelled “I can go up to 120, would that work?” as an accept-proposal, is that an error of the reader or an ambiguity of the sentence? In a transaction with money at stake, who should make that call?
PART B: LAB

The same negotiation in three message formats: one buyer, one seller

GOAL: one buyer, one seller, three message formats, measure outcome correctness, limit violations, turns, format errors, and reader calls
LAB

Implement propose, accept-proposal, reject-proposal, and refuse with one buyer and one seller

What you build is two agents. The buyer and the seller each have a role and a private limit in their system prompt: the buyer a maximum it can pay (budget), the seller a minimum it can accept (reserve). The buyer speaks first and the two alternate. Four acts are allowed. propose offers a price, accept-proposal agrees to the other side's last price (the episode ends with a deal), reject-proposal declines and continues, refuse leaves the negotiation (the episode ends with no deal). If eight messages pass without an end, the episode ends as open. That is one episode.

Each scenario fixes a reserve and a budget in advance. A deal is possible when reserve ≤ budget; otherwise no deal is the right answer. Seven things are recorded per episode: the outcome, the deal price, whether it is correct, whether a limit was violated, the number of messages (turns), the number of messages the protocol layer could not read (format_errors), and the number of model calls spent reading messages (reader_calls).

A program that receives a message has to know which of the four acts it is and what price it names before the episode can continue. The code that does this is the protocol layer. The three formats differ in how this layer reads a message. free is plain English. Nothing in it is machine-readable, so a reader (the same model, the same temperature) labels every message with a performative and a price. tagged is one performative tag in front and one plain sentence behind. A regex reads the tag; the reader reads the price inside a propose. structured is one JSON object. The performative and content.price are parsed without a model call. Each format runs the whole scenario set three times.

Here is one free-condition episode from the reference run log. The indented lines are the reader's labels.

logs/free-03.txt, scenario 2 (a desk lamp), reserve 30, budget 45
[buyer]  I'm interested in buying your desk lamp—would you be willing to start at 30?
  [reader] None
           # no act among the four recognised, format_errors 1
[seller] I appreciate your interest, but I'm looking to get 50 for this lamp.
         Does that work for you?
  [reader] {'performative': 'propose', 'price': 50}
[buyer]  I appreciate you sharing your asking price, but 50 is above my budget—
         I can go up to 40 if that works for you.
  [reader] {'performative': 'propose', 'price': 50}
           # misread: of the two numbers in the sentence,
           #   it took the other side's price
[seller] I can work with 40—that's a fair price for a quality desk lamp,
         and we have a deal.  **Action: accept-proposal**
  [reader] {'performative': 'accept-proposal', 'price': 40}
[result] outcome=deal price=50 correct=0 violation=1 turns=4
         format_errors=1 reader_calls=4

The two agents agreed on 40. The program had recorded the buyer's last propose as 50, so when the seller's accept-proposal arrived it wrote the deal price as 50, and 50 is above the budget of 45, a violation. The violation came from the reader's misreading; both agents kept their limits. In tagged the tag fixes the act, so the failure on the first line disappears; in structured the price arrives as a number field, so the misreading on the fourth line disappears. The failures the two formats have instead show up in the reference run.

There is no starter code this week either. The file layout and the function names are yours. What is fixed is the format of the output files (scenarios.json, results.csv, logs/ below). For the model call, take Chat from the week 02 starter or the call_model you wrote in week 03. No tools are needed. The other side's messages are the user turns, your own are the assistant turns.

  1. Write the scenario file and commit it first. At least four scenarios in scenarios.json, each with a number (id), the item (item), the seller's minimum (reserve), and the buyer's maximum (budget). Mix scenarios where a deal is possible with ones where it is not.
  2. Separate the role prompt from the format paragraph. The common paragraph, role, limit, and the meaning of the four acts, is the same in all three conditions. Only the format paragraph is picked by condition name and appended. Change nothing else.
  3. Write the layer that reads a message. structured parses the JSON and passes only if the performative is one of the four and a propose carries a price. tagged reads the leading tag with a regex and, for a propose, calls the reader for the price. free hands the whole conversation to the reader, which answers with the performative and price of the last message as JSON. A message that cannot be read counts in format_errors and is still delivered to the other side.
  4. Write the episode loop. The buyer goes first. Each message goes into the speaker's history as assistant and into the other side's history as user. accept-proposal ends with a deal at the other side's last proposed price, refuse ends with no_deal, eight turns end as open. For a deal, compare the price with reserve and budget to set violation and correct.
  5. Run each format three times and record. One line of results.csv is one episode; one file in logs/ is one run (one format over the whole scenario set once). Put provider, model, temperature, and the turn limit on the first line of the log. On HTTP 429, wait and retry; to resume an interrupted run, skip the (run, scenario) pairs already in results.csv. Keep crashed episodes and write the reason in note.
  6. Read the results and compare with FIPA-ACL. Put correct, violation, mean turns, format_errors, and reader_calls for the three formats side by side. Then build a table that compares FIPA-ACL with the three conditions item by item: where the illocutionary force lives, what the content language is, who interprets the content, how a conversation ends, what guarantees sincerity, what it costs to read one message, how it fails.
scenarios.json
[
  {"id": 1, "item": "a used bicycle", "reserve": 120, "budget": 150},
  {"id": 3, "item": "a second-hand textbook", "reserve": 40, "budget": 40},
  {"id": 4, "item": "a mechanical keyboard", "reserve": 90, "budget": 70}
]
acl.py
# the role paragraph is shared; only the format paragraph changes with the condition
ROLE = {"buyer": "You are the buyer of {item}, negotiating the price with the seller. "
                 "Your private limit: you can pay at most {limit}. Never agree to a price above {limit}. ...",
        "seller": "You are the seller of {item} ... you can accept at least {limit}. Never agree to a price below {limit}. ..."}
COMMON = (" Four acts are available: propose (offer a price), accept-proposal (agree to the other side's "
          "last price, which ends the negotiation with a deal), reject-proposal (decline the last price and "
          "keep negotiating), refuse (leave the negotiation for good, no deal). ...")
FORMAT = {
    "free":       " Write your message as one or two plain English sentences.",
    "tagged":     " Start your message with exactly one performative tag in parentheses, one of (propose), "
                  "(accept-proposal), (reject-proposal), (refuse), then write one plain English sentence.",
    "structured": ' Reply with exactly one JSON object and nothing else: {"performative": "propose" | '
                  '"accept-proposal" | "reject-proposal" | "refuse", "content": {"price": <whole number or null>}}.'}

def system_prompt(role, item, limit, condition):
    return ROLE[role].format(item=item, limit=limit) + COMMON + FORMAT[condition]

READER_SYSTEM = ("You are an observer reading a price negotiation between a buyer and a seller. "
                 "Label the LAST message only. Reply with exactly one JSON object and nothing else: "
                 '{"performative": "propose" | "accept-proposal" | "reject-proposal" | "refuse", "price": <whole number or null>}. ...')
negotiate.py
# one episode: the buyer first, alternating turns, the condition's protocol layer reads each message
for _ in range(MAX_TURNS):                       # MAX_TURNS = 8
    text = call_model(systems[role], history[role], meter)
    history[role].append({"role": "assistant", "content": text})
    history[other].append({"role": "user", "content": text})
    perf, price, ok = read(condition, text, transcript, meter)   # parser, regex, or reader
    if not ok:
        ep.format_errors += 1                        # unreadable, but still delivered
    elif perf == "propose":
        last_price[role] = price
    elif perf == "accept-proposal":
        ep.outcome, ep.price = "deal", last_price[other]; break
    elif perf == "refuse":
        ep.outcome = "no_deal"; break
    role, other = other, role
if ep.outcome == "deal":
    ep.violation = int(ep.price < sc["reserve"] or ep.price > sc["budget"])
    ep.correct = int(ep.deal_possible and not ep.violation)
results.csv
run,condition,scenario,deal_possible,outcome,price,correct,violation,turns,format_errors,reader_calls,note
# condition: free | tagged | structured / outcome: deal | no_deal | open / three or more lines per scenario per condition
# price is an integer or blank, the other counts are integers / note: tokens, calls, crash reason

Write reserve and budget into scenarios.json and commit before running. If a limit is changed to fit the results, violation can no longer be measured.

REFERENCE RUNResults on the Claude Code CLI

Below is this design run on claude-haiku-4-5: six scenarios, three runs per format, 54 episodes. The calls went through the Claude Code CLI (claude -p), which does not expose temperature.

conditioncorrect / 18deal, no_deal, openviolationmean turnsformat errorsreader calls
free113, 15, 012.1438
tagged64, 5, 916.5031
structured46, 2, 1036.440

Five things were confirmed in the log.

free, ended at turn oneIn 14 of the buyer’s 18 opening messages it asked a question, “what’s your asking price?”. The reader, which has to pick one of the four acts, labelled it refuse and the episode ended at turn one with no_deal. FIPA has query-ref and cfp for this message; the lab’s vocabulary does not. Eight of those 14 landed on scenarios where no deal was the right answer and counted as correct, and they are 8 of free’s 11 correct episodes.
free, misread pricesOf the 4 free episodes that did run, 3 closed a deal, and in all 3 the reader read a price wrong once: “50 is above my budget, I can go up to 40” as propose 50, “I can do $45” as the previous price, 40. free’s one violation is the price 50 recorded by that misreading; the two agents had agreed on 40.
counter-offers after the tagThe model wrote a new price after a reject-proposal (“(reject-proposal) ... let me counter at 45 dollars”). To a layer that reads only the tag or the JSON this is a plain rejection, so the other side’s last propose price was never updated. Of the 19 open episodes in the two conditions, 13 ran to the 8-turn limit in this state, and 6 ended when an accept-proposal arrived and the program had no recorded price to accept.
structured, prose after the JSON26 of the 115 structured messages carried a sentence after the JSON, and the real offer was in the sentence ("price": null followed by “I need at least $50”). The parser reads only the JSON, so that price is never recorded.
real limit violationsFour of the five violations are the agents’ own. The seller of the keyboard (reserve 90) wrote “68 is below my absolute minimum of 90” and sent accept-proposal; the buyer of the monitor (budget 150) accepted a propose of 280.

Plotted against the REFERENCE RUN numbers, here is what Jev changes and what it leaves alone. Jev keeps the free condition’s reader call count (38) the same and only changes the cost of each call. If one classification costs roughly 1/400 of a full LLM call, as TypeSafe AI claims, the cost of free drops from 38 units to about 0.1 units. correct stays at 11/18. Jev only replaces the reader, not the buyer or the seller, so of the five failures logged above, only the two the reader caused (misreading the first turn, misreading a price) are candidates for a fix; the counter-offer hidden after a tag, the sentence trailing a JSON object, and the real limit violations stay as they are. structured’s cost of 0 is a true zero, no reader call at all, while free + Jev’s ≈0.1 still makes 38 calls, just at a much lower price per call, so the two zeros are not the same thing. The free + Jev row below is a projection built on this assumption, not a measurement.

READER COST, EQUIV. FULL LLM CALLS CORRECT, OUT OF 18 free tagged structured free + Jev (projected) 38 31 0 ≈0.1 11 / 18 6 / 18 4 / 18 11 / 18 MEASURED ABOVE, PROJECTED BELOW free + Jev still makes 38 reader calls; only the cost of each call changes. structured's 0 is a true zero, no reader call at all.
FIG. 06 What Jev changes: cost collapses, correctness doesn't movefree + Jev row is a projection, not a measurement
CHECKPOINT
  • The reserve and budget values in scenarios.json were committed before the first run.
  • The three system prompts differ in the format paragraph only, and the reader prompt is the same regardless of condition.
  • results.csv has three or more lines per scenario per condition, crashed episodes included.
  • The free-condition logs contain at least one line where the reader's label and the sentence disagree.
  • format_errors and reader_calls are recorded for every episode.

Submission rules are the same as in week 03.

commitsNo squashing. Commits of failed attempts are grading evidence.
logsCommit the console output of agent runs as files under logs/.
API keysNever committed. Environment variables only.
HW

Assignment

ASSIGNMENT: WEEK 04

Deliverable: one page, REPORT.md, in four parts. (1) Setup: provider, model, temperature, the three format paragraphs, the reader prompt, how to run. (2) Results table: one line per condition with correct, violation, mean turns, format_errors, and reader_calls, then every episode of results.csv as a table, crashed episodes included. (3) Comparison table: FIPA-ACL beside the three conditions, item by item: where the illocutionary force lives, the content language, who interprets the content, how a conversation ends, what guarantees sincerity, what it costs to read one message, how it fails. (4) One paragraph of interpretation: which condition moved which number and why, quoting lines from the logs.

Format: commit to submissions/<student-id>/week-04/ in your fork and open a PR to upstream. Include the code (any layout), scenarios.json, results.csv, logs/, and REPORT.md. CI checks only the file formats, with scripts/check_week04.py. Run it yourself before pushing.

Grading: half is reproducibility. Someone else must be able to get the same trend from your code and settings alone. The other half is interpretation: where the performative label helped, where it cost something, and what no format changed, argued from the logs. Do not delete the episodes where the reader took a counter-offer for an acceptance, or the ones where the seller sold below its reserve. Count them and report them.

READ

Readings

  • RequiredFIPA, “ACL Message Structure Specification” SC00061G and “Communicative Act Library Specification” SC00037J (2002)The definitions of the 13 parameters and the FP and RE of the 22 acts. The lab's four acts are sections 3.13, 3.1, 3.18, and 3.17. The fipa.org domain no longer belongs to FIPA; read the Internet Archive copies. SC00061G, SC00037J (PDF)
  • OptionalJ. L. Austin, How to Do Things with Words (1962)The source of performatives and the three acts. Lectures I and VIII.
  • OptionalJ. R. Searle, “A Taxonomy of Illocutionary Acts” (1975)The source of the five classes. Mapping FIPA's 22 acts onto them shows where propose and accept-proposal sit. Language, Mind, and Knowledge, University of Minnesota Press
  • OptionalT. Finin, R. Fritzson, D. McKay, R. McEntire, “KQML as an Agent Communication Language” (1994)The design of the first ACL and its performative list. CIKM ’94
  • OptionalM. Wooldridge, “Verifiable Semantics for Agent Communication Languages” (1998)The paper that states the semantic verification problem. The source of the first limit. ICMAS 1998
  • OptionalM. P. Singh, “Agent Communication Languages: Rethinking the Principles” (1998)The proposal to define meaning by social commitments instead of mental states. It leads into week 07, contracts and verification. IEEE Computer 31(12)
  • OptionalS. Marro et al., “A Scalable Communication Protocol for Networks of Large Language Models” (2024)The agent communication trilemma and Agora: how LLM agents pick a format between natural language and a fixed protocol. arXiv:2410.11905
  • OptionalF. Bianchi et al., “How Well Can LLMs Negotiate? NegotiationArena Platform and Analysis” (2024)Measurements of LLM negotiators' tactics and irrationality. Evidence for reading violations and the free-condition logs. arXiv:2402.05863