Skip to content

AI Face app SP1: foundation + 25 abstract-engine designs - #66

Merged
weeeha merged 14 commits into
mainfrom
claude/super-clock-ai-face-748b95
Oct 11, 2026
Merged

weeeha merged 14 commits into
mainfrom
claude/super-clock-ai-face-748b95

Conversation

@weeeha

@weeeha weeeha commented Oct 10, 2026

Copy link
Copy Markdown
Owner

TL;DR: new ai-face kiosk app, sub-project 1 of 4. It shows 25 of the 50 AI-Avatars designs full screen, driven by one shared state vocabulary (12 activities, 7 expressions). Verified in the dev kiosk at 1080 x 1080; not yet seen on a round panel.

Spec: docs/superpowers/specs/2026-10-09-ai-face-design.md · Plan: docs/superpowers/plans/2026-10-09-ai-face-sp1.md

What it does

  • npm run sync:avatars -- <AI-Avatars checkout> copies an allowlisted subset (41 files, 664 K) from a pinned SHA into public/avatars/ and fails on any unknown or missing upstream file.
  • The app loads the original design page in a same-origin iframe with pointer-events: none (shell gestures keep working), hides the gallery chrome, and drives the page's own API through a family adapter.
  • State comes from a demo or fixed source. The night window forces sleeping, and the page pauses 3 s after it falls asleep.
  • Frame guard (decision A, WebGL allowed on Pi 4): a face under 24 fps steps to half resolution, then pauses with "Paused to keep the clock cool", and retries with a fresh mount after 30 minutes. A stalled frame counter is a stall, not slowness.
  • Every call into a vendored page goes through safeController. A throwing page shows "Face unavailable" and is torn down. Before this, Assistant iris threw during unmount and blanked the whole kiosk, which has no error boundary (that boundary is a separate task).
  • Admin: app.ai-face schema (design, source, activity, expression, showTime, sleepAtNight). The face can be the home screen by putting it first in a device's screen order.

Verified

  • ./scripts/gates.sh green, 1247 tests.
  • Dev kiosk at 1080 x 1080: all 25 designs load the requested character. One design per family took all 12 activities and 7 expressions, read back from the page API. The grid overlay pauses the page. Measured from centre, the tells sit inside the 470 px arc ring (time label 431 px, Demo 408 px).

Open

  • On-glass check on fastclock (needs an AI Face screen added in the admin).
  • SP2: the other 25 designs in six families, including Fragment voice through the Fusion HAT. SP3: Pi 4 measurements and admin thumbnails. SP4: main-agent state source.
  • Half resolution only changes the two WebGL designs; the canvas2d families draw at a fixed 720 px.

🤖 Generated with Claude Code

weeeha and others added 14 commits October 9, 2026 19:13
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… pause

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A page that throws inside apply, setPaused, sample or destroy no longer
escapes into React, which has no error boundary on the kiosk and unmounts
the whole root. A faulting page shows the Face unavailable tell instead.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A hidden or throttled page stops advancing its frame counter. Zero new
frames now restarts the window like an idle sample instead of counting
as 0 fps, so only moving samples under the floor can step the face down.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…le, contract test)

Unavailable faces unmount their iframe and destroy the controller. A paused
or unavailable face is retried with a fresh mount after 30 minutes while
active. The attach deadline starts at mount. Reactivation unpauses before it
applies. A settled sleeping pose pauses the page. The guard drops settle
samples from its window. The time label refreshes on activation. The night
state keeps its identity. A contract test reads the vendored engine.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@weeeha
weeeha merged commit a88e2a7 into main Oct 11, 2026
1 check passed
@weeeha
weeeha deleted the claude/super-clock-ai-face-748b95 branch October 18, 2026 00:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant