Skip to content

feat(lenses): add full-body reactive Vampire lens - #173

Merged
stozo04 merged 6 commits into
mainfrom
feature/spooky-lens
Sep 4, 2026
Merged

feat(lenses): add full-body reactive Vampire lens#173
stozo04 merged 6 commits into
mainfrom
feature/spooky-lens

Conversation

@stozo04

@stozo04 stozo04 commented Sep 4, 2026

Copy link
Copy Markdown
Owner

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

  • Three ordered overlays: upper-body costume on FACE, cowl/collar on FACE, and fangs on MOUTH.
  • MouthOpenSpec(restFraction = 0f) keeps fangs hidden at rest while preserving the fixed upper-root reveal.
  • Original generated sources and four shipped WebPs; the carousel chip is composed from those exact layers.
  • Deterministic border-connected backdrop removal preserves the enclosed white shirt and carries a runnable self-check.
  • Existing two-face renderer only: no pose SDK, segmentation, shader, camera rebind, or new dependency.

Installed proof

Final installed APK on the repository''s public-domain face fixture:

Vampire full-body fixture

Open-mouth reveal on an original fictional verification portrait:

Vampire open-mouth reveal

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.

  • Clean-tree pre-PR receipt: debug/release builds green with 0 compiler errors/warnings; 647 JVM tests; Android Lint 0 hard findings; 24 native libraries 16 KB-aligned; Markdown, tables, links, CSpell, JSON, harness sync, script self-checks, tracked-file hygiene, and Gitleaks all green.
  • Shipped app/art parent fedf254 connected instrumentation on a freshly cold-booted Pixel_8 API 37 AVD: 123 tests, 0 failures, 0 errors, 1 intentional Samsung-only skip. Head 205cd2c changes only the offline renderer self-check and PRD; all seven regenerated assets are byte-identical.
  • Shipped app/art parent fedf254 installed batch: PASS loops=lenses,onboarding,photo_mode,record_clip,reverse_preview_trim.
  • Focused LensAnchorTest: 87 tests, 0 failures.
  • APK integrity: all four Vampire WebPs matched repository SHA-256 bytes.
  • Runtime accessibility state: Vampire name pill present and thumbnail selected; the lens can be applied and cleared.

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

  • Owner: run Android Studio Inspect Code with the OpenLoop Tracked scope; the local receipt records Engine 2 as skipped because no GUI export was available.
  • Owner: retest the final full-body costume on a phone—front/rear placement, neck/shoulder alignment during independent head movement, two live faces, frame rate, and subjective shareability.
  • Final branch is clean and pushed.
  • Automated GitHub text gates are green.

Stacked on #172 as requested. Until #172 merges, this PR includes its 7c4034e parent commit.


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, and render_lens_art.py support 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—not origin/main or 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.

@stozo04

stozo04 commented Sep 4, 2026

Copy link
Copy Markdown
Owner Author

PR Review — Google Android Standards Compliance

Reviewer: Codex (Automated)
Date: 2026-09-03
PR: #173 — feat(lenses): add reactive Vampire lens
Standards sourced from: Architecture, DataStore, Runtime permissions, Compose performance, CameraX architecture, Camera testing, Media3, Coroutines, Testing strategy, Accessibility testing, Play target API, Android 16 changes, Android Lint and IDE inspections
Files reviewed: 27


PASS

  • Architecture The new lens is one catalogue entry using the existing data-driven renderer; no parallel state or feature-specific UI path was introduced — app/src/main/java/io/github/stozo04/openloop/camera/lens/Lens.kt:L610
  • DataStore No persistence change; the existing single top-level DataStore remains repository-wrapped and asynchronous — app/src/main/java/io/github/stozo04/openloop/data/UserPreferencesRepositoryImpl.kt:L20
  • Permissions No new permission or gated action; CAMERA remains checked before entry and denial/rationale routing is unchanged — app/src/main/java/io/github/stozo04/openloop/MainActivity.kt:L467
  • Compose The existing catalogue-driven carousel consumes Lens.entries; Vampire inherits its selection semantics and content description without a new composable — app/src/main/java/io/github/stozo04/openloop/ui/components/LensCarousel.kt:L139
  • CameraX The feature reuses the existing once-attached CameraEffect and per-layer render path; no bind, lifecycle, or use-case change — app/src/main/java/io/github/stozo04/openloop/camera/lens/LensSurfaceProcessor.kt:L325
  • Media & Audio No playback, audio, Transformer, or temporary-file behavior changed; baked-lens trim proof completed — docs/e2e/2026-09-03-vampire-lens-proof.md:L32
  • Coroutines No coroutine or Flow change; art generation is an offline deterministic Python tool — swarm/tools/render_lens_art.py:L175
  • Testing Geometry and mouth-response contracts were added; final-head sweep passed 647 JVM and 123 connected tests plus the installed Vampire loop — app/src/test/java/io/github/stozo04/openloop/camera/lens/LensAnchorTest.kt:L1171
  • Accessibility Vampire uses the existing labelled, selected carousel item and preserves the subject's face rather than adding unlabeled controls — app/src/main/java/io/github/stozo04/openloop/ui/components/LensCarousel.kt:L139
  • Play Store Target API 36 satisfies the current August 31, 2026 Play floor; listing, landing page, and README all say nine lenses — app/build.gradle.kts:L35
  • Android Version No Android 16-sensitive API or manifest behavior changed; current edge-to-edge and predictive-back handling remain intact — app/src/main/AndroidManifest.xml:L49
  • Static Analysis (Lint + IDE Inspect) Engine 1 Lint passed with 0 hard findings; Tier 3 and all three GitHub checks passed on 9242747build/sweep-receipt.json

FAIL

None.

WARNING

  • Testing Live-person behavior is not yet proven on physical hardware: front/rear mirroring, motion steadiness, two simultaneous faces, and midrange-device performance remain owner QA.

    • Standard: Google's testing strategy and CameraX camera testing guidance
    • Deadline/trigger: Before merge/release.
    • Action: Run the PR's hardware checklist with a real face on front and rear cameras, then verify two faces and a recorded clip.
    • Why this matters: Emulator fixtures prove integration, mouth response, and baked pixels, but cannot reproduce physical camera hardware, lighting, motion, or OEM behavior.
  • Static Analysis Engine 2 (Android Studio Inspect Code with the OpenLoop Tracked scope) was explicitly skipped; the repo rejects the headless substitute because it indexes zero files on this machine.

    • Standard: Android Studio's manual Inspect Code guidance
    • Deadline/trigger: Before merge.
    • Action: Run Code → Inspect Code → OpenLoop Tracked, export to build/inspect-export/, and parse it with the sweep.
    • Why this matters: The command-line lint pass does not cover every IntelliJ inspection or Grazie proofreading rule.

RECOMMENDATIONS

None beyond the two repository-required pre-merge checks above.


Summary

Category Pass Fail Warning Rec
Architecture 1 0 0 0
DataStore 1 0 0 0
Permissions 1 0 0 0
Compose 1 0 0 0
CameraX 1 0 0 0
Media & Audio 1 0 0 0
Coroutines 1 0 0 0
Testing 1 0 1 0
Accessibility 1 0 0 0
Play Store 1 0 0 0
Android Version 1 0 0 0
Static Analysis (Lint + IDE Inspect) 1 0 1 0
Total 12 0 2 0

Verdict

APPROVE

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.

@stozo04 stozo04 changed the title feat(lenses): add reactive Vampire lens feat(lenses): add full-body reactive Vampire lens Sep 4, 2026

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

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.

Comment thread swarm/tools/render_lens_art.py
@stozo04
stozo04 force-pushed the feature/spooky-lens branch from dfcb844 to 205cd2c Compare September 4, 2026 17:09
@stozo04
stozo04 merged commit 41a1e4d into main Sep 4, 2026
3 checks passed
@stozo04
stozo04 deleted the feature/spooky-lens branch September 4, 2026 19:13
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