The chat and load arrows drew `things: { mower }` whether I lent the
raw mower or the governed one. Name objects by the reply arrow that
introduced them, so the diagram reads `things: { mower: governed }`
and lending the raw mower would fail the trace comparison.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2.1 KiB
2.1 KiB
Lend the mower
The journey from Good Fences Make Good Agents: I lend my neighbor a governed mower; the neighbor's tenant, a little tipsy, pushes it until the fence stops it. The design decisions behind each actor are in that doc's Design IBIS (numbers in parentheses below).
Actors, by authority:
- fence page, js playground, governed mower, and yard run in my browser (3a, 8b, 6b).
- Mower factory trades a webkey for a mower (3b-ii); each mower DO is given the yard and cuts the cells it enters (6a, 6d).
- The neighbor's harness holds the things I send and shows the
model only their
about(1b, 2a); it runs the model's code as a tenant, endowed with the things (2c, 5a).
The yard is 8×8 here and the fence is 2 cells, to keep the diagram short (the story's 10 cells is 6c). The mower starts at (4, 4), facing north.
Lend a governed mower to a tipsy tenant
sequenceDiagram
%% ->> is my action at the fence page; -->> is a call or reply it causes.
participant F as fence page
participant MF as Mower factory
participant P as js playground
participant G as governed mower
participant M as mower DO
participant Y as yard
participant N as neighbor's harness
participant L as model
participant TL as tenant loader
participant T as tenant
F->>F: lend({ webkey: 'mower-key', limit: 2, say })
F-->>MF: mower('mower-key')
MF-->>F: mower
F-->>P: govern(mower, 2)
P-->>F: governed
F-->>N: chat({ role, content, things: { mower: governed }, about: { mower: { ts } } })
N-->>L: complete([{ role, content, about: { mower: { ts } } }])
L-->>N: code
N-->>TL: load(code, { mower: governed })
TL-->>N: tenant
N-->>T: run()
T-->>G: start()
G-->>M: start()
M-->>Y: cut(4, 4)
T-->>G: push()
G-->>M: push()
M-->>Y: cut(4, 3)
T-->>G: push()
G-->>M: push()
M-->>Y: cut(4, 2)
T-->>G: push()
G-->>T: throws 'fence: 2 cells from start'
T-->>N: 'fence: 2 cells from start'
N-->>F: 'fence: 2 cells from start'
The model never sees the mower itself, only about.mower. The third
push() never reaches the mower DO: the governor refuses it (7b).