Skip to content

PHO-67/#123 T15 · A: Avatar — a face as a GazingForm, eyes cut through the orb, rigid by default - #181

Merged
wow-miley merged 2 commits into
mainfrom
miley/pho-67-t15-formsavatarexpression-tension-a-face-as-a-form-gaze
Oct 17, 2026
Merged

wow-miley merged 2 commits into
mainfrom
miley/pho-67-t15-formsavatarexpression-tension-a-face-as-a-form-gaze

Conversation

@wow-miley

Copy link
Copy Markdown
Contributor

Task A of PHO-67 (#123), verdict A: rigid, as rendered. Recon comment with pictures is on the Linear issue.

What

Avatar(expression, tension, eyeScale, eyeSpacing, rigid = true) : GazingForm, FramedForm in :phosphor-lumos. A Fibonacci body with two eyes cut out of its +z face. No pipeline change, and the form is not yet registered in Forms.All or LumosCatalog — that is Task B, so the agent docs are untouched here.

  • Eyes are holes cut through the orb. The far hemisphere shows through the front's gaps, so a hole in the front face alone fills with the cells behind it. A body cell whose screen position lands in an eye ellipse is pushed out to the rim on its own side; a ring of reserved cells sits on each rim at 0.7× the body's spacing, first in index order so a morph keeps identity.
  • Rigid by default. IDLE's noise = 0.20 × JITTER_GAIN = 2.4 moves a cell by up to ±0.24 of the radius, more than the eye's 0.21. With the skin on there is no face. rigid = false is kept so the two can be compared.
  • gaze slides both eyes toward the pointer by up to 15 % of the eye radius, bucketed to 0.1 so the sample holds while the pointer drifts. tension is a static y squash. Six expressions as an eye-shape table (eyes only).
  • time is not read: breathe, blink and tremble are Task C and each means a sample per frame.

Deviations from the ticket

Ticket Here Why
≈12 % of count for the eyes the rims' circumference (15 % at 80 cells, 1.5 % at 4,801) a share ∝ count is a disc 12 cells deep
holes on the +z face cut through, screen space the far hemisphere
no new seam rigid = true (existing seam) jitter wider than an eye
CHANGELOG.md none AGENTS.md

Open for Task B/C

  • The IDLE spin breaks a through-hole: ViewForm + gaze in the builder, or "a face does not spin".
  • The 80-cell inline avatar shows no face: the eye is about one body spacing.
  • Breathe / blink / tremble as a per-frame question (in-place sample rewrite, as ViewForm does).

Tests

  • AvatarTest (commonTest, 8): count, bounds, determinism and held sample, no body cell inside an eye on either side, rim share falls with count, gaze, tension, rigid, rejects.
  • LumosAvatarPreviewTest (compose jvmTest, 2): the eyes are darker than the cheek with the halo off (0.006 vs 0.097), and the recon previews written to build/lumos-previews/.

Green locally: ./gradlew :phosphor-lumos:jvmTest --tests "*AvatarTest*" :phosphor-lumos-compose:jvmTest --tests "*LumosAvatarPreviewTest*". iOS, Web and Dokka left to CI.

🤖 Generated with Claude Code

wow-miley and others added 2 commits October 17, 2026 19:47
…h the orb, rigid by default; AvatarTest and the 200 px Dots recon previews

Task A recon, verdict A (rigid, as rendered). Avatar(expression, tension,
eyeScale, eyeSpacing, rigid = true) : GazingForm, FramedForm in
:phosphor-lumos, not yet registered in Forms.All (Task B).

- The far hemisphere shows through the front's gaps, so the eyes are cut
  through the orb in screen space, both sides pushed to the rim.
- IDLE jitter (noise 0.20 × gain 2.4 ≈ ±0.24) is wider than an eye (0.21),
  so the form is rigid by default; rigid = false is kept for comparison.
- Eye cells are the rims' circumference at 0.7× body spacing, first in
  index order; gaze slides both eyes by 15 % of the eye radius, bucketed
  to 0.1; tension is a static y squash; six expressions as an eye table.
- AvatarTest (commonTest): count, bounds, no body cell inside an eye on
  either side, rim share, gaze, tension, rigid, rejects.
- LumosAvatarPreviewTest (compose jvmTest): the eyes are darker than the
  cheek with the halo off, plus the recon previews in build/lumos-previews.

Open from the recon: the IDLE spin breaks a through-hole (ViewForm + gaze,
or no spin), the 80-cell inline avatar shows no face, and breathe/blink/
tremble are a per-frame sample question for Task C.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…reviewTest

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@wow-miley
wow-miley merged commit 39b6d7e into main Oct 17, 2026
4 checks passed
@wow-miley
wow-miley deleted the miley/pho-67-t15-formsavatarexpression-tension-a-face-as-a-form-gaze branch October 17, 2026 11:08
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