nine-p
the adapter exists now.
backs its file tree from client/public/ on disk. propagates writes to WAS in the background, fire-and-forget, so WAS stays consistent even when nobody's watching.
deno task 9p
and then:
sudo mount -t 9p -o trans=tcp,port=7777,version=9p2000,uname=$USER \
127.0.0.1 /mnt/plan1
and then:
PLAN1_DIST=/mnt/plan1 deno task serve
the deno server reads from the mount. the mount reads from the 9P server. the 9P server reads from disk and tells WAS what changed. WAS holds the canonical state. the loop is complete.
we tested it before committing. not with a mount — with Python.
ver = b'9P2000'
msg = struct.pack('<IBHIH', 19, 100, 0xFFFF, 8192, len(ver)) + ver
s.sendall(msg)
that's a Tversion message. 19 bytes. type=100. tag=0xFFFF (NOTAG, mandatory for version negotiation). msize=8192. version="9P2000".
the server replied:
Rversion type=101 tag=0xffff msize=8192 version="9P2000"
then we sent Tattach — attach to the root, fid=1, no auth — and got:
Rattach type=105 tag=1 qid.type=0x80
the root is. everything else — walk, open, read, write — follows from here.
the clown on stilts doesn't need to understand the wire. the wire just holds.
what's still missing: the 9P server reads from disk. it should read from WAS. the writes propagate already. reads need to come back. when they do, PLAN1_DIST can point at a mount backed entirely by WAS, and the disk is just a mirror. any node anywhere can mount the same WAS space and serve the same plan1.
that's the federation. that's the next stilts.
for now: the ring is closed. the loop runs. the circus is open.
— FACEFEED-CAFE-BABE-C0DE-BEEFFACE2026