Shared state (six agents, five rounds each, 30 seeds; every agent also adds its cost to a counter and claims a task in its last round):
Policy
Items kept of 30
Counter error
Retries
Model calls
Contested claims made visible
last writer wins
5.9
421
0
30
0 of 5
optimistic concurrency
30
0
83
113
5 of 5
merge by operation
30
0
0
30
0 of 5
Contention (lost items; model calls for optimistic):
Agents
2
4
6
12
last writer wins, lost
5
14
24
54
optimistic, model calls
16
54
113
387
merge, model calls
10
20
30
60
Messaging (100 messages; 20 percent dropped, 10 percent duplicated by the network, 20 percent of acknowledgements lost; 20 seeds):
Policy
Missing
Repeated effects
Messages sent
Applied out of order
at most once
20
9
100
14
at least once
0
35
153
43
at least once + idempotency key
0
0
153
27
+ sequence numbers
0
0
153
0
At-least-once traffic grows with loss: 124 messages sent per 100 at 0 percent loss, 135 at 10, 153 at 20, 205 at 40.
What each agent is shown (input tokens over five rounds, 800-token system prompt, 120 tokens per entry):
Agents
2
6
12
whole shared state
13,400
76,200
260,400
scoped view (own entries and the three latest others)
12,920
41,280
83,280
pointers (own entries and one line per other agent)
10,640
34,800
78,240
Lost items and model calls by policy and agent count; messaging policies on a lossy channel; tokens by the view each agent is given.
Reading it:
Last-writer-wins is wrong for any state that several agents update. It does not fail loudly; the items and the total are simply wrong.
Optimistic concurrency is correct and costly. For agents, the cost is model calls. Back-off, smaller read-modify-write windows, or partitioning the state reduce it.
A reducer is the cheapest correct option when the update commutes, which covers appending findings, summing costs and set membership. It does not help with decisions.
Retries need idempotency. At-least-once delivery is the standard answer to loss, and it creates duplicates; a "create ticket" or "send email" that runs twice is an incident. The key makes it safe; it costs no extra messages.
Order is a separate property. Even with keys, messages arrived out of order 27 times in 100; sequence numbers fix that.
Do not broadcast the whole state. Showing each agent the entire blackboard makes prompts grow with the number of agents; scope the view or pass pointers (module 5 of Level 7).
Design rules
Prefer message passing or one-writer-per-field when agents have clear ownership; use a blackboard for append-only, commutative contributions.
Make every write an operation (append, add, set-if-unset), not a full-state replacement.
Version anything that is read-modify-write, and decide in advance what happens on conflict: retry, merge, or escalate.
Give every message an id and make handlers idempotent; add sequence numbers when order matters.
Bound retries and define the failure path (dead-letter queue, human).
Show each agent a scoped view and let it fetch more by pointer.
Log every state write and message with agent id, version and id, so a lost update is visible in a trace (Level 9).