feat(lenses): add full-body reactive Vampire lens - #173
Conversation
PR Review — Google Android Standards ComplianceReviewer: Codex (Automated) PASS
FAILNone. WARNING
RECOMMENDATIONSNone beyond the two repository-required pre-merge checks above. Summary
VerdictAPPROVE The Vampire implementation is small, catalogue-driven, deterministic, tested, documented, and green locally and in GitHub. No code change is required. Before merge, first merge parent PR #172 so this stacked PR collapses to the Vampire work, then complete the owner-only Android Studio Inspect Code and physical-camera QA checks recorded above. |
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.
Bugbot Autofix prepared a fix for the issue found in the latest run.
- ✅ Fixed: Cutout can fill face opening
- Added preserve_original_alpha parameter to preserve transparent face openings in the vampire frame while keeping enclosed whites opaque in the torso.
You can send follow-ups to the cloud agent here.
Reviewed by Cursor Bugbot for commit fedf254. Configure here.
dfcb844 to
205cd2c
Compare

Description
Adds Vampire, OpenLoop''s ninth live face lens: a premium romantic-goth costume that keeps the wearer''s real face visible, hides its ivory fangs while the mouth is closed, and reveals them when the mouth opens.
Hardware feedback changed the original face-sized treatment. The final design separates the raised Dracula collar from a complete upper-body layer, so the bow tie sits at the base of the neck, the pleated tuxedo shirt continues down the chest, and the cape and lapels span both shoulders instead of floating beneath the chin.
The concept remains evidence-led: vampire beauty and dark-romantic makeup are growing search themes, while vampire is a durable, recognizable Halloween costume. Research, art direction, measurements, prompts, and provenance are in PRD §17.
Implementation
FACE, cowl/collar onFACE, and fangs onMOUTH.MouthOpenSpec(restFraction = 0f)keeps fangs hidden at rest while preserving the fixed upper-root reveal.Installed proof
Final installed APK on the repository''s public-domain face fixture:
Open-mouth reveal on an original fictional verification portrait:
Full evidence and residual boundaries are recorded in the Vampire E2E proof. The owner''s personal QA photos were reviewed locally and intentionally were not committed.
Testing
Final candidate:
205cd2cd4abae3334528857eaea4a7bf2aff1903.fedf254connected instrumentation on a freshly cold-booted Pixel_8 API 37 AVD: 123 tests, 0 failures, 0 errors, 1 intentional Samsung-only skip. Head205cd2cchanges only the offline renderer self-check and PRD; all seven regenerated assets are byte-identical.fedf254installed batch:PASS loops=lenses,onboarding,photo_mode,record_clip,reverse_preview_trim.LensAnchorTest: 87 tests, 0 failures.The receipt marks connected execution skipped because two combined sweep attempts crashed the API 37 emulator''s Android
system_server(activity/package services disappeared). The unchanged connected suite then passed all 123 tests standalone on the shipped app/art commit; the renderer-only head reproduces those assets byte-identically. This is an emulator infrastructure boundary, not a weakened test or extended deadline.Before merge
Note
Medium Risk
New live camera lens and mouth-driven rendering affect capture UX on all devices; release-skill doc changes only affect agent release workflow, not app runtime.
Overview
Adds Vampire as the ninth face lens: a three-layer romantic-goth costume (torso, cowl/collar, mouth-anchored fangs) that stays hidden at rest and reveals on mouth open via
MouthOpenSpec(restFraction = 0f), with geometry tests, PRD §17, E2E proof, andrender_lens_art.pysupport for generated sources (border-connected backdrop cutout + chip compose). Play/README/store copy and test counts move to nine lenses; the lenses verification loop now defaults to Vampire and documents a passing automated drawer/pick/clear run.Separately, the cut-release agent skill (mirrored under
.claude,.codex,.cursor) is revised to resolve a build sha—the final included merge commit when PRs land after the version bump—notorigin/mainor branch names; stage detection follows version-bump history and PR state, skips re-running the pre-PR sweep post-merge, and warns when a GitHub number is an issue rather than a PR.Reviewed by Cursor Bugbot for commit dfcb844. Bugbot is set up for automated code reviews on this repo. Configure here.