arthur/js
Olive Vaughn 35ef150b48 Give features stable identity, eye pairs and per-feature presence
Step 8's data model, ahead of its controls. Nothing here is a UI.

domain/params holds every knob's definition once — default, applicable area,
value constraints and the areas a change would force to regenerate. flow/take's
literal knob map becomes a view of it, so the take's defaults and the future
parameter panel cannot drift apart.

domain/feature adds subjects, features and groups as document data the renderer
never reads. A feature ID is stable for the whole clip, across occlusion: a run
of visible frames is not a new identity. An eye pair is an explicit group of one
or two eyes of the same subject, so a profile view with one identified eye needs
no invented partner. Settings resolve area -> subject -> group -> feature, and
dropping an eye from a pair materialises its effective values first so playback
does not jump. scene/problems now validates all of it.

Presence becomes per-feature rather than per-subject. freeze's :absent predicate
takes a track as well as a frame, so one occluded eye can be absent while its
partner still has a value; a full-face miss still marks everything absent. A
manifest may annotate known gaps as one-based inclusive intervals, which ingest
expands into observation tracks before measurement. An unobserved eye then gets
no vote in the iris pairing and cannot steer the shared gaze — gaze falls back to
whichever eye is visible. Temporal filters still see a sample on every frame,
held from the last observed one, because the numbers are a rectangular buffer;
the state mask, not the buffer, is what says the frame has no value.

js/app.js gets the same occlusion lesson: leading nulls from a face that starts
occluded used to throw away the whole take, and the neutral frame could be chosen
from a held duplicate pose.

Parameter editing, scoped regeneration and a feature-level detector remain. Until
one exists, footage without annotations falls back to the full-face mask rather
than claiming occlusions it cannot see.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B87NVmiU36qQmN9gmFYnJ9
2026-09-27 22:44:36 -04:00
..
app.js Give features stable identity, eye pairs and per-feature presence 2026-09-27 22:44:36 -04:00
interior.js Become arthur: a standalone suite, not an Animator Pro front-end 2026-09-24 15:47:41 -04:00
landmarks.js Brows: traced ring, quantised raise 2026-09-24 18:11:25 -04:00
mathutil.js Eyes: lids, blinking, line of sight 2026-09-24 18:06:04 -04:00
paint.js Paint: vector background cels on the kept frames 2026-09-24 19:08:07 -04:00
pipeline.js Brows: traced ring, quantised raise 2026-09-24 18:11:25 -04:00
raster.js Eyes: lids, blinking, line of sight 2026-09-24 18:06:04 -04:00
selftest.js Brows: traced ring, quantised raise 2026-09-24 18:11:25 -04:00
synth.js Brows: traced ring, quantised raise 2026-09-24 18:11:25 -04:00
take.js Eyes: lids, blinking, line of sight 2026-09-24 18:06:04 -04:00
underlay.js Fix horizontal stretch from MediaPipe's anisotropic normalised space 2026-09-24 15:03:12 -04:00