Audit date: 2026-07-17
Decision: V3 and Lilith provide useful generation, catalog, scoring, sync, movement, and safety building blocks, but they do not currently expose a playable adaptive work-music program. The Rail will compose a deterministic daypart-and-energy selector over an injected, rights-cleared playable catalog. It will fail closed when that catalog is empty, and the channel will use only the V10 audio-lane port for transport. Seed paths, sample libraries, generated GA inventories, and a proposed product mode are not runtime content.
Audited source map#
| Concern | Existing source | What is real today | Rail decision |
|---|---|---|---|
| Music generation | libs/v3/isis-music/src/provider-routing.ts, plus the mix/master, fingerprint, provenance, and release gates in the same package |
A governed supply-side pipeline can route generation jobs to provider adapters and block tracks that fail review or rights checks. | Generation is asynchronous catalog supply. It is never called while selecting or starting a Rail session. |
| Released V3 catalog | libs/v3/saraswati-stage/prisma/schema.prisma and discography-release-flow.ts |
Durable track/catalog shapes and release metadata exist, including duration, release state, provenance, and master artifact identity. The track shape has no playable delivery URI and no first-class BPM, energy, or work-mood metadata. | A composition-root adapter may join released records to a media-delivery service and editorial energy metadata. The Rail does not treat a master artifact id as a stream URI. |
| Lilith audio library | audio-library.ts, audio-library-seed.ts, and postgres-audio-library-repository.ts |
The service has a real Postgres-backed repository, hot cache, mood/time/intensity scoring, and audio-mix automation. Its selector is meditation-specific and randomly chooses among the top five unless a seed is supplied. Its shipped /audio/... seed paths have no corresponding tracked audio assets in this repository. |
Reuse the repository boundary and normalized metadata through an adapter, not the selector or defaults. Only rows whose delivery is independently verified playable and whose rights/provenance state is eligible enter Motion. |
| Dance playlist logic | playlist-generation.ts and beat-detection.ts |
BPM/energy progression logic exists for workout warm-up, main, intervals, and cool-down. It reads SAMPLE_MUSIC_LIBRARY and generates playlist ids with Date.now(). |
Keep its BPM/energy concepts as audit evidence only. Sample records and time-derived ids cannot become a production catalog or selector. |
| Spatial playback | libs/v3/spatial-audio/src/index.ts |
V3 has per-user music mix buses, server-timestamp-to-playback mapping, cross-tier sync validation, and a Tier-2 Web Audio runtime. The Tier-2 runtime's oscillator sources are validation/preview primitives rather than catalog playback. | A delivery adapter may use V3 clock/sync calculations behind the source. Ownership, play, pause, volume, ducking, and handoff remain exclusively in libs/v10/rail-kernel/src/audio-lane.ts. |
| Motion authoring | libs/v3/isis-motion/src/motion-brief.ts, retarget-pass.ts, and cue-export.ts |
BPM/section energy can become choreography tempo and intensity, generated or captured clips can be safety-checked, and frame-accurate UE cues can be exported. | This is concert choreography authoring, not end-user movement-break content. Motion will not label it as a guided break engine. |
| Guided movement content | types.ts, styles/aerobics.ts, styles/barre.ts, and styles/world-dance.ts |
Count-level actions, verbal cues, low-impact modifications, alignment notes, and beginner moves exist for marching, step-touch, port de bras, shoulder isolations, and stretches. The library has complete class structures, not short break timelines. | Author three short, fixed V10 timelines from these reviewed source cues. Preserve source ids and modifications; do not import an app service into the V10 library or imply that a full class was completed. |
| Posture and yoga safety | libs/v3/tara-studio/src/asana-library.ts, libs/v3/aja-pose/src/cue-generator.ts, postureService.ts, and movementDanceService.ts |
Tara has signed canonical asanas with modifications, contraindications, and Aja cue bundles. The biometric services have real session/window/summary seams, but their analyzers and coaching engines are injected and they do not ship short guided routines or audio beds. | Stretch and posture acts cite Tara/Aja sources and expose safe exits. Completion quality comes from the act's actual timer and step acknowledgements; sensor-derived quality is absent unless a real biometric adapter supplies it. |
apps/lilith/svc-daily-content/src/services/playlist-service.ts was also
reviewed. It owns user playlist CRUD, queues, sharing, bell sounds, and a static
ambient list; it is not adaptive work-music programming and is not a Motion
dependency.
The requested libs/lilith namespace was scanned separately.
Its common, event, Fastify, partner, SDK, service, and Sophia packages provide
shared infrastructure, generic audio/playlist API types, streaming clients, and
generation request schemas. They do not contain an adaptive music catalog or
program selector. The useful concrete selectors and movement catalogs are in the
app services listed above, so the V10 package will consume narrow injected ports
instead of crossing the library-to-app ownership boundary.
Adaptive program path#
The new @oshun/v10-rail-channel-motion boundary will accept a
MotionCatalogPort; it will not reach into an app package or database. A
catalog item must carry a stable track id, title, playable V10 media delivery,
duration, normalized energy, moods, optional BPM, and a positive
rights/provenance eligibility result. Invalid, unplayable, or ineligible rows
are excluded. No bundled fallback playlist is substituted when none remain.
The selector will be deterministic and input-sensitive:
- Map the current Rail phase to an explicit energy and mood target: morning activation, sustained deep work, or a higher-energy movement break.
- Adjust the target with the listener's current energy instead of treating daypart as the only signal.
- Score every eligible track by energy distance, mood overlap, BPM fit when known, continuity suitability (duration/loopability), and recent-history repetition cost.
- Order by score and then stable track id. Fill the requested session horizon from that order; there is no shuffle and no clock-derived random seed.
- Re-evaluate at a track boundary or a Rail daypart transition. Never replace a playing source by bypassing the lane arbiter.
This composes the honest useful parts of the Lilith scoring and dance pacing
work without calling a meditation track or a randomized sample playlist
"adaptive work music." AudioSourceSpec is created only from the chosen
playable item, offered through the channel-bound AudioLaneChannelPort, and
accepted, controlled, ducked, or released only by the Rail's arbiter.
Movement acts to compose#
The adapter will ship three real, timed acts rather than action labels:
- Stretch break: a short standing sequence sourced from Tara's signed foundation asanas and their modification/contraindication data, with a visible stop/skip path.
- Posture reset: a timed neutral-stance, breath, shoulder, and upper-body sequence grounded in Tara/Aja alignment cues and the beginner port-de-bras count/cue content.
- 90-second dance break: exactly 90 seconds of low-impact, beginner march-in-place, step-touch, and shoulder/arm cues from the dance library, synchronized to a break-energy audio bed selected from the real catalog.
Each timeline will declare exact offsets and durations. Its completion report will distinguish elapsed time, completed steps, skipped steps, early exit, and whether an audio bed was actually held. It will not infer pose accuracy, calories, or biometric improvement when no sensor evidence exists.
Explicit omissions#
Live classes#
LiveClassSessionSchema and the
V3LiveClassSession Prisma model define a real class data shape. However, no
non-generated runtime schedule reader was found. The schedule in
ga-inventory.ts is constructed
from named seeds as GA validation inventory, and the V3 product review calls the
launch inventory fictional. Motion therefore omits live moments until a
composition root supplies validated, future LiveClassSession records from the
durable store. It must not read the GA constant.
Mat Mode#
V3/V3_PRODUCT_REVIEW_2026-07-06.md
proposes passthrough-first Mat Mode and explicitly records it as a product
gap. Quest 3 and Vision Pro runtime profiles do enable underlying passthrough,
but there is no Mat Mode route, launch contract, or deep-link resolver in the
audited source. Motion will expose no fabricated Mat Mode link. The later
deep-link leaf must remain fail-closed until V3 publishes a canonical launch
target; the Rail will then pass that target through rather than own the
immersive experience.
Verification contract for implementation#
Implementation tests must prove that morning, deep-work, and break inputs (and different listener-energy values) select different real catalog outputs; stable inputs remain deterministic; empty/unplayable/ineligible catalogs produce no offer; only the lane port receives the selected source; daypart handoffs do not bypass the arbiter; all three act timelines have exact boundaries; completion quality reflects actual progression; live moments and Mat Mode are absent without their runtime ports; and the tile degrades to truthful text when audio or richer presentation is unavailable.