feat(whimsy): a potato mascot on the human-facing surfaces (#185) - #209
Merged
Conversation
agent-box gets a mascot: a potato wired to an aperture optic, per Lio's
call for the Portal potato. It lands only where a human looks.
- docs/potato.svg is the ONE source of the mark. The landing page uses it
as its favicon and its logo (replacing the generic square glyph), and
the settings daemon embeds those same bytes at assemble time — so the
website and a live box cannot drift to two different marks.
- The workspace and settings pages had NO favicon at all, which left the
tab blank and made several open boxes indistinguishable. They now carry
the mark as an inline data: URI, so the page stays self-contained and
the tab icon costs no second request. The same mark heads the settings
page, aria-hidden so the accessible heading name is unchanged.
- The two attach dead ends ("no session named 'x'", "no live sessions
yet") print an ASCII potato. Both are full-screen "nothing to attach
to" moments, so the art costs nothing and softens a failure.
- `agent-box-session add` stamps a small one on success — the closest
thing this CLI has to "an agent just started". Nothing parses those
lines.
Deliberately NOT in the session spawn preamble: art there would cost
tokens on every spawn and read as an instruction the agent has to decide
whether to obey. Whimsy is for humans.
Since the mark is a module source as well as a website asset, the
generated-module drift check and CI's path filter now include it.
Checks run (x86_64-linux): module-generated-up-to-date, golden-snapshot,
multi-user, module-single-file, download-route, webhook-route. Golden
fixture regenerated with `nix run .#update-golden` — the diff is the four
touched payloads and nothing else. Settings page and landing page
rendered locally; the attach dead ends run against a scratch tmux socket.
Closes #185
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01T3WmpdY3zc555sNdkY9dzQ
|
Bahaha, I love it 😂 🥔 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #185. @lionello asked for the Portal potato, so: a potato wired to an
aperture optic. Drawn from scratch — no Valve assets, no Aperture logo, no game
text — and it still reads as "potato with a glowing eye" to anyone who has never
played the game.
Where it lands
1. Favicon — there was none.
HEAD_TPLshipped no<link rel="icon">, sothe workspace tab was blank and several open boxes were indistinguishable. Both
the workspace and the settings page now carry the mark as an inline
data:URI:the page stays self-contained and the tab icon costs no second request.
2. One mark on all three surfaces.
docs/potato.svgis the single source.The landing page uses it as favicon and logo, replacing the generic
▣square; the settings daemon embeds those same bytes at assemble time, so the
website and a live box cannot drift to two different marks. It is
aria-hidden,so the accessible heading name stays
Settings for <user>(the PlaywrightgetByRole('heading')assertions still match).3. ASCII potato on the two attach dead ends — "no session named 'x'" and "no
live sessions yet". Both are full-screen, already-a-dead-end moments, so the art
costs nothing and softens a failure. Real output from the generated script,
run against a scratch tmux socket:
4.
agent-box-session addstamps a small one on success — the closest thingthis CLI has to "an agent just started":
Nothing parses those lines (checked: no test, no caller, and the web UI uses the
HTTP route, not this output).
What it deliberately does NOT touch
The session spawn preamble. Art there is prepended to the agent's prompt on
every spawn, so it would cost tokens forever and read as an instruction the
agent has to decide whether to obey. Whimsy targets humans on human surfaces.
Notes for the reviewer
module-generated-up-to-datecheck materializes it and CI's path filterwatches
docs/potato.svg.printfper line rather than a heredoc: these scripts areembedded in Nix indented strings, where a heredoc terminator would ride on the
dedent and break the moment issue Portability: native Ubuntu/RHEL support (Nix-without-NixOS) — refactor tracker #154 Phase 2 unindents them.
the tab bar and the session editor markup, so it should not fight that work.
nix run .#update-golden; the diff is thefour touched payloads and nothing else.
Checks run locally (x86_64-linux):
module-generated-up-to-date,golden-snapshot,multi-user,module-single-file,download-route,webhook-route. The KVM-only VM tests are left to CI (no/dev/kvmon thisbox).
No AWS cost, IAM, networking or migration impact.
🤖 Generated with Claude Code
https://claude.ai/code/session_01T3WmpdY3zc555sNdkY9dzQ