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>
64 lines
2.1 KiB
Markdown
64 lines
2.1 KiB
Markdown
# Lend the mower
|
||
|
||
The journey from [Good Fences Make Good Agents](../../../a2030.md): 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
|
||
|
||
```mermaid
|
||
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).
|