Skip to content

feat(webchat): pass-through visitors — strangers, and a crab that is definitely a lobster#103352

Merged
steipete merged 1 commit into
mainfrom
claude/lobster-visitors-4abdbb
Jul 10, 2026
Merged

feat(webchat): pass-through visitors — strangers, and a crab that is definitely a lobster#103352
steipete merged 1 commit into
mainfrom
claude/lobster-visitors-4abdbb

Conversation

@steipete

Copy link
Copy Markdown
Contributor

Related: #102754 · Stacked on #103344 (sentience) — lands after it.

What Problem This Solves

Your lobster is the only sea life you ever see. A world with occasional other inhabitants is more alive — and funnier.

Why This Change Was Made

Roughly one page load in ten (pure per-seed plan), a pass-through visitor crosses the footer ledge once, some minutes into the session, and leaves:

  • A stranger (~8%): another lobster wearing a palette that is deliberately not your pet's. It doesn't stop, doesn't react, and hovers as just "a stranger". It does not count for your Lobsterdex — only lobsters that visit you count.
  • The crab (~1.5%): wide shell, eye stalks, side claws, walks strictly sideways across the ledge (which, for a crab, is simply walking), smug little smile. Hover says "definitely a lobster". The Lobsterdex refuses to acknowledge it. No further explanation is provided anywhere, including in this PR.

Passers are render-only walkers: no perching, no acts, no interaction; gated by the visits setting, skipped under reduced motion, timers reset with the seed and cleaned on disconnect.

User Impact

Once in a while something crosses the bottom of your sidebar. Sometimes it's a lobster you've never met. Very occasionally it is not a lobster at all, whatever its tooltip claims.

Evidence

visitors

Validation (delegated Blacksmith Testbox, exit=0):

  • pnpm test ui/src/components/lobster-pet.test.ts — 36/36: stranger crossing renders and despawns with a foreign palette that never enters the dex, the crab renders with its title while the dex only ever contains the resident's own palette, most loads plan no passer (~9.5% rate asserted over 2000 seeds), plus the full existing suite.
  • pnpm tsgo:test:ui and pnpm --dir ui build.
  • Live showcase screenshot above from the running mock UI.
  • Codex autoreview clean (passer planning/rendering scoped, reduced-motion and visits-setting gates verified, no dex recording, timers cleaned).

@openclaw-barnacle openclaw-barnacle Bot added app: web-ui App: web-ui size: M maintainer Maintainer-authored PR labels Jul 10, 2026

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 3035798102

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

// visits setting silence it like everything else.
const showShell = this.shellVisible && this.visitsEnabled && !this.dismissed;
if (!showSprites && !showShell) {
const showPasser = this.passer !== null && this.visitsEnabled;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Honor shoo dismissal for passers

When a user right-clicks the mascot, dismissed is meant to hide it for the rest of the page load (the adjacent shell path and existing test both enforce that), but pass-through visitors ignore that state here. For seeds with a planned passer, the timer can set this.passer after dismissal and this condition renders a new lobster/crab anyway, so the mascot reappears despite being explicitly shooed; include !this.dismissed (or cancel passers on dismissal) to preserve the dismissal contract.

Useful? React with 👍 / 👎.

@steipete
steipete force-pushed the claude/lobster-visitors-4abdbb branch from 3035798 to e13a02d Compare July 10, 2026 05:30
@steipete
steipete force-pushed the claude/lobster-sentience-4abdbb branch from 64ef25c to 49124b8 Compare July 10, 2026 05:30
Base automatically changed from claude/lobster-sentience-4abdbb to main July 10, 2026 05:54
Roughly one load in ten, someone else walks across the footer ledge
once and leaves: usually a stranger lobster wearing a palette the
resident pet does not (hover: 'a stranger'), and on rare loads a crab
(hover: 'definitely a lobster') - wide shell, eye stalks, walks
strictly sideways, smug about it. Passers never perch, never react,
and never count for the Lobsterdex. Planned by a pure per-seed
function, gated by the visits setting, skipped under reduced motion,
and their timers reset with the seed and clean up on disconnect.
@steipete
steipete force-pushed the claude/lobster-visitors-4abdbb branch from e13a02d to eb97cf2 Compare July 10, 2026 05:59
@steipete
steipete merged commit 20bc552 into main Jul 10, 2026
80 of 82 checks passed
@steipete
steipete deleted the claude/lobster-visitors-4abdbb branch July 10, 2026 06:22
@steipete

Copy link
Copy Markdown
Contributor Author

Landed on main as 20bc552 (squash). Validation: Blacksmith Testbox lobster suites + tsgo:test:ui + ui build green, hosted CI green at exact head eb97cf2, codex autoreview clean. (The merge-run status poll hit a GitHub API rate limit after merge-verify passed, so this completion note arrives out of band.)

github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Jul 10, 2026
…aw#103352)

Roughly one load in ten, someone else walks across the footer ledge
once and leaves: usually a stranger lobster wearing a palette the
resident pet does not (hover: 'a stranger'), and on rare loads a crab
(hover: 'definitely a lobster') - wide shell, eye stalks, walks
strictly sideways, smug about it. Passers never perch, never react,
and never count for the Lobsterdex. Planned by a pure per-seed
function, gated by the visits setting, skipped under reduced motion,
and their timers reset with the seed and clean up on disconnect.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

app: web-ui App: web-ui maintainer Maintainer-authored PR size: M

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant