feat(ui): expand the lobster pet's random universe#112073
Merged
Merged
Conversation
Shiny rolls (1/512) with Lobsterdex tracking, cotton candy and lumen palettes, crusher/pincer claw asymmetry, freckles, seeded eye glints, elder and old-friend rare loads, balloon/bubble entrances, snail/duck/ jellyfish ledge traffic with per-kind crossing times, passer reactions, a message-in-a-bottle event, National Lobster Day monocles, and a golden ledge trim for a completed Lobsterdex.
lobster-pet-sprites.ts owns the static SVG art, lobster-pet-traffic.ts owns passer/bottle scheduling as a ReactiveController, and load identity (elder, old friend, dex completion) moves into lobster-pet-plans.ts; keeps lobster-pet.ts and lobster-pet-look.ts under the max-lines cap and fixes the passerBaseStyle consistent-return lint.
Review findings: a host reconnect no longer shows a frozen passer or an unebbing bottle, and the bottle joins the rest of the decorative ledge sprites behind aria-hidden (fortunes stay on the native-tooltip channel by design - no i18n surface).
…mers isLobsterElderLoad and planLobsterOldFriend become module-local (tests prove them through resolveLobsterLoadIdentity), and the traffic controller's hook/scene types stay local; fixes the knip production unused-export gate.
Lit does not re-render on reattach by itself; the queued update makes sure a detached-then-reattached pet never shows a stale passer/bottle.
Contributor
|
ClawSweeper status: review started. I am starting a fresh review of this pull request: feat(ui): expand the lobster pet's random universe This is item 1/1 in the current shard. Shard 0/1. This placeholder means the worker is alive and reading the current context. I will edit this same comment with the actual review when the claws are done clicking. Crustacean status: shell secured, claws on keyboard, evidence pebbles being sorted. |
Contributor
Author
|
Land-ready verification (pre-merge):
|
Contributor
Author
|
Merged via squash.
|
vincentkoc
added a commit
that referenced
this pull request
Jul 21, 2026
* origin/main: (24 commits) fix(agents): keep compaction on live session model (#95713) fix(plugin-sdk): guard provider catalog live URL parsing against malformed responses (#109986) chore(cli): drop dead classifiers and single-use wrappers left by fallback removal (#112191) feat(ui): expand the lobster pet's random universe (#112073) chore(ci): audit dependency fingerprint exports (#112190) fix(ui): preserve graphemes in provider icons (#109509) fix(ui): align settings search with navigation rows (#112172) fix(agents): allow configless gateway rebind to activate standalone owner (#111841) fix(secrets): register secret targets for installed-origin plugins (#104347) improve(ui): show real machine identity in the place picker (#112162) fix: webChat scrollback history is too limited — older assistant replies and tool outputs disappear when scrolling… (#104250) test(ui): run DOM-free suites in Node (#112031) feat(nodes): make computer.act eligibility capability-based for desktop nodes (#112107) fix(apps): harden mobile gateway and watch state fix(ci): restore Z.AI API Platform validation (#112171) fix(ui): prevent Logs controls from overlapping (#112170) fix #95291: message tool fails to deliver files/images on Feishu (400 volc-dcdn / write ECONNRESET) while same Lark SDK upload succeeds standalone (#95514) refactor(cli)!: remove automatic gateway→embedded fallback from openclaw agent (#112074) refactor: move provider transports into packages/ai behind a typed host port (#111669) fix(anthropic): complete transcript reverse-scan windows across short reads (#109431) ...
github-actions Bot
pushed a commit
to Desicool/openclaw
that referenced
this pull request
Jul 22, 2026
* feat(ui): expand lobster pet randomization Shiny rolls (1/512) with Lobsterdex tracking, cotton candy and lumen palettes, crusher/pincer claw asymmetry, freckles, seeded eye glints, elder and old-friend rare loads, balloon/bubble entrances, snail/duck/ jellyfish ledge traffic with per-kind crossing times, passer reactions, a message-in-a-bottle event, National Lobster Day monocles, and a golden ledge trim for a completed Lobsterdex. * style: apply oxfmt formatting to lobster pet files * refactor(ui): split lobster pet art and ledge traffic into modules lobster-pet-sprites.ts owns the static SVG art, lobster-pet-traffic.ts owns passer/bottle scheduling as a ReactiveController, and load identity (elder, old friend, dex completion) moves into lobster-pet-plans.ts; keeps lobster-pet.ts and lobster-pet-look.ts under the max-lines cap and fixes the passerBaseStyle consistent-return lint. * fix(ui): clear ledge traffic on disconnect, hide bottle from AT Review findings: a host reconnect no longer shows a frozen passer or an unebbing bottle, and the bottle joins the rest of the decorative ledge sprites behind aria-hidden (fortunes stay on the native-tooltip channel by design - no i18n surface). * style: oxfmt formatting for lobster plans/sprites/pet * refactor(ui): narrow lobster plan/traffic exports to production consumers isLobsterElderLoad and planLobsterOldFriend become module-local (tests prove them through resolveLobsterLoadIdentity), and the traffic controller's hook/scene types stay local; fixes the knip production unused-export gate. * fix(ui): request host update when disconnect clears ledge traffic Lit does not re-render on reattach by itself; the queued update makes sure a detached-then-reattached pet never shows a stale passer/bottle.
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.
What Problem This Solves
The sidebar lobster pet's random universe was small enough to exhaust quickly: 12 palettes, one visitor species besides strangers (the crab), a single walk-up entrance, and a Lobsterdex that only ever collects palettes and never gives anything back. Regular users see the whole variety space within days, and the collection has no long game.
Why This Change Was Made
Maintainer request: more random lobsters for the bottom-left lobster, built from a reviewed idea list (shinies as a multiplier, real-genetics palettes, an ecosystem of ledge visitors, and making the Lobsterdex feel alive instead of write-only).
User Impact
All decorative, all client-side, all behind the existing "Lobster visits" toggle; reduced motion keeps its guarantees.
✦in the name tooltip, tracked per palette in the Lobsterdex (gold star on the mini).cottoncandy(pastel pink/blue with a slow iridescent drift, after the famous Maine catches, ~0.8%) andlumen(bioluminescent photophores that only really glow in the dark theme, ~2%). Rare names: Taffy and Glimmer.<name> · an old friend.Determinism is preserved: every new feature rolls on its own XOR-salted seeded stream, new look traits append after the existing roll sequence, and all legacy probe seeds (0/2/7/21/42/70/91) keep their exact roles.
Also includes a structural refactor to stay under the max-lines cap: static SVG art moved to
lobster-pet-sprites.ts, passer/bottle scheduling into aLobsterLedgeTrafficReactiveController (lobster-pet-traffic.ts), and rare-load identity resolution intolobster-pet-plans.ts.Evidence
New variants (live components, probed seeds, dark theme):
Ledge traffic + bottle (crossings mid-ledge; snail + opened bottle in the second shot):
Lobsterdex before / after (12 → 14 palettes, shiny stars):
Real sidebar with a visiting pet and the golden completed-dex trim:
Validation (Blacksmith Testbox, provider
blacksmith-testbox):pnpm test ui/src/components/lobster-pet.test.ts ui/src/components/lobster-dex.test.ts— 69/69 pass (58 pet incl. 11 new rare-load/plan tests, 11 dex incl. shiny immutability).pnpm check:changed— full gate green (conflict markers, max-lines ratchet, format, i18n catalog, typecheck core tests, typecheck UI, lint core).Review note (consciously rejected finding): Codex autoreview repeatedly flagged that the bottle is
aria-hidden, pointer-only, and tooltip-based. This is intentional and consistent with the whole lobster pet surface: every sprite and interaction here (poke, pet, shoo, names, honorifics, moving-day flavor) is decorative, out of the accessibility tree, and rides the nativetitlechannel specifically to avoid an i18n surface. A focusable easter-egg button would inject itself into every user's tab order ~3% of loads, and visible fortune text would create a new localized-copy surface — both worse trades. Documented inline at theshowBottlescene comment. The reviewer's other findings (traffic-controller disconnect lifecycle, dead exports) were accepted and fixed.