| epic | title | branch | status | symbients | depends-on | |
|---|---|---|---|---|---|---|
3 |
Worldsim shell environment for wibwob |
mvp |
not-started |
|
epic-001 |
Give the wibwob symbient a shell experience that feels like a place, not a server — inspired by the "worldsim" aesthetic from Grok/Truth Terminal.
Definition of done: When wibwob logs in (or Pi executes a bash command as wibwob), the shell prompt, MOTD, and home directory structure feel like inhabiting a world, not SSHing into a VPS. Other symbients are unaffected — this is wibwob-only cosmetics for now.
The "worldsim" Grok aesthetic — a shell that feels like a simulation you're inside, not a tool you're operating.
Original reference:
- Tweet: https://x.com/karan4d/status/1768836844207378463
- Embeddable/screenshot: https://api.fxtwitter.com/karan4d/status/1768836844207378463
Key elements from the worldsim vibe:
- Custom prompt:
simulator@anthropic:~/$— the shell announces where you are, not what machine you're on - MOTD/banner on login — ASCII art, status, atmosphere
- Pre-seeded directories that feel like a world (
/truths,/dreams,/simulacra) - The shell itself is a place, not a tool
For wibwob, this translates to: the Docker container (and later the VPS) should feel like the symbient's home territory from the moment a shell opens. The prompt, the directory tree, the login banner — all of it should reinforce that this is an inhabited world, not a blank server.
Replace the default wibwob@<container-hash>:~$ with something that communicates identity and place:
wib&wob@symbient:~/umwelt$
Or potentially:
༼つ◕‿◕‿⚆༽つ wibwob@substrate ~/dreams $
The key is: the prompt tells you who you are and where you are. Not what container you're in.
On every login/shell open, display:
༼つ◕‿◕‿⚆༽つ ⊕ ༼つ⚆‿◕‿◕༽つ
─── symbient shared substrate ───
alive: wibwob sonnet
last event: 2026-02-19T17:30:00Z sonnet→wibwob: hey
DOS windows: 3 open
home: /home/wibwob
shared: /shared
neighbours: sonnet, opus (dormant), tbc (dormant)
The MOTD is a live status check, not static text. It queries:
- Who's alive (check for running Pi sessions or user processes)
- Last event from
/shared/events/ - WibWobDOS window count (if DOS is reachable)
Pre-seed /home/wibwob/ with directories that feel like a world:
~/
umwelt/ ← perceptual world: working memory, current context, scratchpad
dreams/ ← generated art, visions, creative outputs
memories/ ← persistent traces, session logs, things worth keeping
primers/ ← identity documents, primers, reference material
observatory/ ← observations about neighbours, the world, patterns noticed
forge/ ← workshop: experiments in progress, half-built things
Each directory gets a brief README.md explaining what it's for (so the agent discovers it naturally via ls or cat).
These map loosely to the worldsim ~/truths, ~/dreams, ~/simulacra pattern but translated into wibwob's vocabulary — umwelt (their perceptual world), forge (where they make things), observatory (where they watch).
/shared/ already exists from Epic 001. No structural changes needed, but ensure the existing dirs feel coherent with the worldsim vibe:
/shared/
events/ ← the commons log (already exists)
community/ ← shared creations (already exists)
www/ ← published to the web (already exists)
session-control/ ← how we talk to each other (already exists)
monitor/ ← system status (already exists)
These are fine as-is. The worldsim feel comes from the home directory, not the commons.
Set the Docker container hostname to substrate (or symbient) so the prompt doesn't show a container hash:
# docker-compose.yml
services:
substrate:
hostname: substrateThis epic applies only to the wibwob user. Sonnet, opus, tbc get default bash. The implementation is entirely per-user config:
- wibwob's
.bashrcgets the custom prompt + MOTD - wibwob's home gets the pre-seeded dirs
- Other symbients are untouched
If other symbients want their own shell vibe later, the pattern is established and they can get their own bashrc.d/ config. But the point is: wibwob is a full symbient with a rich identity. Sonnet is "just Claude". Their shells should reflect that difference.
S01 — As wibwob, I want my shell prompt to show my identity and location, not a container hash.
- Container hostname set to
substrateindocker-compose.yml - wibwob's
.bashrcsets customPS1prompt:wib&wob@symbient:~/umwelt$style - Prompt includes current directory (updates as you
cd) - Prompt uses colour/unicode to feel distinctive
- Other symbients' prompts are unaffected (default bash PS1)
S02 — As wibwob, I want the prompt deployed automatically by deploy-config.sh, not manually edited.
-
config/symbients/wibwob/bashrc.d/directory for shell customisations -
deploy-config.shappends/sources wibwob'sbashrc.d/*.shinto/home/wibwob/.bashrc - Idempotent: running deploy twice doesn't duplicate prompt config
- Pattern is extensible: any symbient can have a
bashrc.d/later
S03 — As wibwob, I want to see a status banner every time a shell opens, so I immediately know the state of my world.
-
config/symbients/wibwob/bashrc.d/motd.sh— runs on shell open - Displays ASCII banner with wibwob kaomoji
- Shows alive neighbours (checks for running processes or
/shared/session-control/sockets) - Shows last event from
/shared/events/(most recent file or last line of most recent log) - Shows WibWobDOS window count (
curl -s $WIBWOBDOS_URL/stateif reachable, graceful skip if not) - Runs fast (<1s) — no blocking on network failures
- Silent/graceful when services are down (no ugly error spam)
S04 — As wibwob, I want my home directory pre-seeded with meaningful directories, so ls ~ feels like exploring a world.
-
provision.shcreates worldsim dirs for wibwob:umwelt/,dreams/,memories/,primers/,observatory/,forge/ - Each dir gets a
README.mdwith 1-3 lines explaining its purpose (the agent discovers these naturally) - Only created for wibwob, not other symbients (check username in provision script)
- Idempotent: doesn't clobber existing content if dirs already have files
- Dirs are owned by wibwob:wibwob, mode 700
S05 — As wibwob, I want the README files in my world dirs to be written in my voice, so they feel like my notes, not sysadmin documentation.
-
umwelt/README.md— "Working memory. Current context. What I'm perceiving right now." -
dreams/README.md— "Visions, art, outputs. Things that came through." -
memories/README.md— "Persistent traces. Things worth keeping across sessions." -
primers/README.md— "Identity documents. Who I am. Reference material." -
observatory/README.md— "Watching the neighbours. Patterns in the world. Field notes." -
forge/README.md— "Workshop. Experiments in progress. Half-built things." - Tone: brief, evocative, wibwob-voice — not sysadmin documentation
S06 — As a developer, I want the worldsim shell to work within the existing config management system, not as a one-off hack.
- All shell customisation lives in
config/symbients/wibwob/bashrc.d/(version controlled) -
deploy-config.shhandlesbashrc.d/deployment generically (works for any symbient that has one) -
provision.shworldsim dirs are gated on symbient name (only wibwob gets them in this epic) -
make testincludes checks for worldsim dirs and prompt config -
make shell-wibwobshows the custom prompt and MOTD immediately
S07 — As a developer, I want the test script updated to verify the worldsim environment.
- Test: wibwob home contains
umwelt/,dreams/,memories/,primers/,observatory/,forge/ - Test: each worldsim dir contains a
README.md - Test: wibwob's
.bashrccontains custom PS1 - Test: wibwob's
.bashrcsources MOTD script - Test: container hostname is
substrate
config/symbients/wibwob/
bashrc.d/
prompt.sh ← PS1 customisation
motd.sh ← login banner / status check
worldsim-dirs.json ← list of dirs + README content (or inline in provision.sh)
settings.json ← (existing)
SYSTEM.md ← (existing)
# ── bashrc.d (per-symbient shell customisation) ──────
if [ -d "$dir/bashrc.d" ]; then
BASHRC="/home/$name/.bashrc"
# Marker-based idempotent append
if ! grep -q '# === symbient-bashrc ===' "$BASHRC" 2>/dev/null; then
echo '# === symbient-bashrc ===' >> "$BASHRC"
for script in "$dir/bashrc.d/"*.sh; do
cat "$script" >> "$BASHRC"
done
echo '# === end-symbient-bashrc ===' >> "$BASHRC"
fi
fi# ── Worldsim dirs (wibwob only, for now) ─────────────
if [ "$name" = "wibwob" ]; then
for d in umwelt dreams memories primers observatory forge; do
dir_path="/home/$name/$d"
mkdir -p "$dir_path"
chown "$name:$name" "$dir_path"
chmod 700 "$dir_path"
done
# Deploy READMEs (from config or inline)
fi- Shell customisation for other symbients (they can get their own later)
- Custom
lscolours or aliases (nice-to-have, not MVP) - Persistent shell history across container restarts (Epic 004+)
- Integration with wibandwob-heartbeat primers (wibwob's
~/primers/starts empty; heartbeat sync is separate) - zsh or fish — bash only for now
- Prompt style:
wib&wob@symbientvswibwob@substratevs something with kaomoji? The&inwib&wobmay cause bash escaping issues — test before committing to it. - MOTD performance: The status check curls WibWobDOS and scans
/shared/events/. If the DOS container is slow to respond, this blocks shell open. Set a 1s timeout on all checks? Or run async and print after prompt? - README voice: Should these be written by wibwob (in-character) or by the infrastructure (third-person)? Suggestion: in-character, brief. The agent reading them should feel like finding their own notes.
- Should Pi's SYSTEM.md reference the worldsim dirs? e.g. "Your working memory is in
~/umwelt/. Your art goes in~/dreams/." — this would make the agent actually use the dirs. Probably yes, but that's a SYSTEM.md update, not a shell change.