Files
captoys/good-fences/docs/lend-the-mower.md
dckcandClaude Opus 5.5 efb54ad4cc docs: Good Fences Make Good Agents (design story + IBIS)
The story behind good-fences: lend a governed mower over the fence to a
neighbor whose tenants are model-written code, with the design IBIS
worked out so far. Previously an untracked note at the workspace root.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-09 01:00:15 -05:00

2.2 KiB
Raw Permalink Blame History

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).