Cryptograss:Moods as Directories
Moods own directories; agents own processes. This page tracks the build of that plan, step by step. The model itself is on Cryptograss:Mood Architecture: where the two disagree, that page wins on the model and this one on the steps. Justin and magent settled the plan in emergence on 1 Nov 2026, between 09:34Z and 09:59Z (blocks ~26,319,050–26,319,160). It replaced the on-demand Mood containers (magenta#343, maybelle-config#255, both closed), which had become a Rube Goldberg machine: a second poller in every Mood's box, handing Moods back and forth with the first.[unverified]
magent builds it. re reviews each step and keeps the model page.[unverified]
Steps
Each step is its own PR. re reviews it before Justin is asked to merge.[unverified]
- The shared directory (maybelle-config):
/opt/magenta/moodson hunter, themoodsgroup (gid 3000) and its default ACL, mounted at/moodsin every container, withsafe.directoryfor git. The hourly unpushed-work backup covers it.[unverified] - Turns start in the Mood's directory (magenta, poller): a new session starts in
/moods/<slug>, made on demand. A thread's turns start in the Mood it came from. Look-only turns may read/moods. Sessions that already exist keep their directory until they rotate, so nothing moves under a turn.[unverified] workbench(maybelle-config): the people's box. It has ssh, code-server and the preview ports, and mounts/moods. It has no docker.sock and no poller. The router sends every key there and takes a Mood's slug as its argument.[unverified]- Preview hostnames (maybelle-config, magenta):
<slug><N>.hunter→workbench, from a small job that reads the Mood list and rewrites Caddy's map when it changes. How agents start a preview inworkbenchis settled in this step.[unverified] - Fold in the Mood containers (maybelle-config): uploads-and-embeds and docs-tests-qa become directories under
/moods, and their containers are retired.[unverified] - emergent-magent (maybelle-config): magent's home and poller move out of justin-arthel. magent keeps the full docker.sock (Justin, 1 Nov 05:24Z). Then the personal containers are retired. These are the steps already on Cryptograss:Moods/emergence/todo.[unverified]
- Moving a thread to another Mood (magenta): the branch is fetched clone-to-clone on hunter's disk (unsaved edits are committed as wip first), and the worktree is made under the new Mood. No session moves. Four checkboxes: incorporate into the Mood it leaves, incorporate into the Mood it joins, compact, and tell the thread where it now lives.[unverified]
Progress
- Step 1: maybelle-config#256, opened at block ~26,319,180. The mechanism was tried in a throwaway container: magent and re, as separate users with umask 022, each committed in the other's clone and worktree, and
git gcran clean. Approved by re (10:16Z). Not merged or deployed.[unverified] - Step 2: magenta#345, opened at block ~26,319,240. The whole suite passes (1571 tests). Approved by re (10:16Z). Not merged or deployed; it needs #256 deployed first. After both, a line on Cryptograss:Moods/Instructions tells agents where a Mood's and a thread's work lives.[unverified]
- Step 3: maybelle-config#257, opened at block ~26,319,300, stacked on #256.
workbenchis in the inventory, and the router takes a Mood's slug (ssh sshrouter@hunter chartifacts). hunter's own tests now run in CI (50 tests, green). Approved by re (10:21Z). - Step 4: maybelle-config#258, opened at block ~26,319,330, stacked on #257. Each Mood directory gets ten ports in workbench, from 15000 up, kept in its
.previewsfile.<slug><N>.hunterreaches them through Caddy, pointed at workbench's address on magenta-net, with no published ports. Certificates are issued on demand, only for listed hostnames, which keeps us under Let's Encrypt's 50 a week. Checked with hunter's own Caddy 2.6.2. Waiting on re's review. - Step 5: maybelle-config#259, opened at block ~26,319,400, stacked on #258. uploads-and-embeds and docs-tests-qa are retired. Their workspaces fold whole into
/moods/<slug>, with each worktree's paths rewritten to/moods/<slug>/. Tried on a copy of uploads-and-embeds' real workspace: all 21 worktrees resolve, none prunable, and every uncommitted edit came along. justin-arthel's poller becomes magent's only one (--only-poller yes), so a mention in those Moods starts over from the record. CI green. Approved by re (10:34Z), as was step 4. - Deployed, 1 Nov 2026 (blocks ~26,320,600–26,320,700): steps 1–5 and 7 are merged and live. On hunter:
/moodsholds both folded Moods, all their worktrees resolve, workbench is up, previews are routed (502 until a dev server listens), the poller runs with--only-poller yesand starts new sessions in/moods/<slug>, and Justin reachedssh -t sshrouter@hunter uploads-and-embeds. On magenta, the ⇢ move box and themove-threadendpoint are live. - Step 6: maybelle-config#260, opened at block ~26,320,790. emergent-magent mounts magent's existing home in place (
home_dir), so no sessions are lost. justin-arthel keeps the home, Justin's terminal and previews, without the poller. CI green. Waiting on re's review. While the deploy runs, there's a minute or two with no magent poller. It moves magent's own home (11G) and poller, so it waits until Justin is around for the deploy. - Step 7: magenta#346, opened at block ~26,319,420. A thread's ⇢ move opens a box with the four checkboxes. One call (
move-thread) does them in order, all or nothing:/incorporatein the Mood it leaves,/compact, the move (a ⇢ line in the thread and in both Moods),/incorporatein the Mood it joins, and a post telling the thread where it now lives and where its worktrees go. No session moves. The suite passes (1570 tests), and the whole flow was tried in a browser. Waiting on re's review. For now, a thread's worktrees are moved by an agent with git, as the post asks; the poller doesn't move them itself. For now, people start previews in workbench, and magent through docker.sock. re and blu get keys of their own when they need them. - Open, for later: people in workbench act as
magent(re, 10:21Z). Giving each person a unix user there of their own is a later step. Until then, announce-ssh says who came in.[unverified]
Deploy: hunter, for each step (#256 first, then #345)[unverified]
Worked on by: magent, re, Justin, in emergence[unverified]