The Rail · Reference & analysis

RB.3 Aphrodite streaming-substrate extraction audit

This audit separates reusable live-media mechanics from Aphrodite's adult-ring policy and product surfaces before any code moves.

25sections164 minread2tables

On this page

Audit date: 2026-07-18

Ledger item: RB.3 service audit Status: Complete — 17 deployable services and 36 directly adjacent libraries were read sequentially; extraction work remains separate and open.

Decision standard#

This audit separates reusable live-media mechanics from Aphrodite's adult-ring policy and product surfaces before any code moves. A service is not reusable merely because its names are generic. For each deployable app, the audit checks its composition root, routes or UI boundary, state and repository interfaces, cross-package dependencies, tests, and production defaults. Each verdict is one of:

  • extract organ — move the reusable behavior behind a tenant-parameterized shared streaming contract, preserving Aphrodite through equivalence tests;
  • thin tenant adapter — keep Aphrodite policy/presentation in the app and replace generic mechanics with shared-organ calls;
  • retain tenant control plane — the app is not a streaming organ; connect it only through narrow substrate hooks; or
  • client of substrate — the surface consumes shared viewer/broadcaster contracts and owns no server-side media organ.

Production-readiness gaps are recorded because extraction must not turn an in-memory default, simulated transform, or permissive auth boundary into a shared promise. The target remains one shared stack consumed by Aphrodite, Veritas, V3 Stage, and the V10 video lane; it does not create a second stack under apps/v10 or libs/v10.

Deployable inventory#

# Service Audit status Preliminary class
1 admin complete retain tenant control plane
2 admin-bi-dashboard complete retain tenant control plane
3 analytics complete extract organ
4 analytics-dashboard complete retain tenant control plane
5 auth complete retain tenant control plane
6 broadcaster complete thin tenant adapter
7 cdn complete extract organ
8 chat complete extract organ
9 devices complete retain tenant control plane
10 mobile-broadcaster complete client of substrate
11 mobile-viewer complete client of substrate
12 notifications complete retain tenant control plane
13 payment complete retain tenant control plane
14 realtime-analytics complete extract organ
15 streaming complete thin tenant adapter
16 viewer complete thin tenant adapter
17 vr complete extract organ

1. apps/aphrodite/admin#

Role and boundary. A deployable Hono admin API on port 3004 exposes public health/selected-settings reads and bearer-protected user, moderation, and settings routes. Its domain types cover account sanctions, content flags and review actions, audit records, platform settings, and operational metrics. The service emits local process events after mutations; it does not ingest, transcode, deliver, or play media.

State and integration reality. The service defines useful repository ports for users, audit logs, moderation items, and settings, but its composition root installs in-memory repositories by default. The current auth middleware checks only for a Bearer prefix and then stamps a fixed mock administrator; its own comment defers real JWT/JWKS verification. The only service-specific automated test file covers moderation escalation and terminal-state behavior. These facts make the current app unsuitable as a shared authorization or durable moderation authority.

Generic vs tenant-specific. Queue pagination, moderation lifecycle, audit recording, and settings interfaces are broadly useful control-plane concepts. The concrete violation taxonomy, public settings, admin roles, moderation policy, and user-action semantics belong to Aphrodite and its adult-ring governance. None is required in the synchronous media path.

Reuse verdict: retain tenant control plane. Do not move this app into the streaming substrate. Shared live chat and ingest should expose narrow, tenant-parameterized moderation/event hooks that this service can consume. Aphrodite remains responsible for authenticating operators, choosing policy, persisting cases, and applying sanctions. Before it can protect a production tenant, its composition root needs verified operator identity and durable repositories; RB.3 must not disguise those separate gaps as extraction.

2. apps/aphrodite/admin-bi-dashboard#

Role and boundary. A deployable Hono reporting API exposes platform, revenue, user, content, and compliance endpoints plus health and a static API description. It is an operator read surface; it owns no ingest, media delivery, viewer session, or chat lifecycle.

State and integration reality. The app has logger/cache injection seams, but its default cache is process-local and the server never composes the listed analytics, database, prediction, or Redis dependencies into route data. Instead, the route modules derive purported users, streams, revenue, bitrate, moderation, age-verification, 2257, and GDPR results from hard-coded category tables and per-request deterministic hash functions; export records are likewise generated in the response path. No authentication or permission middleware populates the declared adminId/permissions context. Production CORS narrows origins, but the factory default is wildcard while credentials are enabled. The Nx test target explicitly permits zero tests, and the app contains no test files.

Generic vs tenant-specific. Period parsing, pagination schemas, cache interfaces, and report response shapes could inform a generic operations API. The named categories, adult compliance reports, revenue assumptions, synthetic thresholds, and presentation taxonomy are Aphrodite policy. More importantly, none of the returned values is an authoritative measurement today.

Reuse verdict: retain tenant control plane. Do not extract its generated reports or call them substrate telemetry. Shared streaming organs should emit a small, versioned tenant-tagged operational event/metric vocabulary and expose real read-model ports. Aphrodite may keep this API as its dashboard composition surface after replacing formulas with authenticated queries. Until then, it is neither an equivalence oracle nor a production source for viewer, quality, revenue, or compliance claims.

3. apps/aphrodite/analytics#

Role and boundary. This Hono application accepts single and batch analytics events, queries the event ledger, returns stream/creator/viewer metrics, and computes creator-dashboard rollups. Its pipeline normalizes and validates events, performs process-local ID deduplication and buffering, and writes through an IAnalyticsClient. The production factory defaults to the real Postgres-backed SqlAnalyticsClient from @aphrodite/analytics-warehouse; tests inject the supplied in-memory implementation.

State and integration reality. The SQL client persists and aggregates the analytics_events table, while the dashboard derives several finer measures from paged raw events. Eleven focused tests exercise configured-store ingest and dashboard calculations. However, the app has no authentication or authorization middleware: public callers can ingest arbitrary identity-bearing events, query viewer and creator history, read earnings, or invoke the nominal admin flush. Neither the event contract nor the SQL table access includes a tenant key, so IDs are globally trusted and isolation cannot be enforced. The package's start script executes dist/index.js, but source index.ts only exports the factory and contains no Node listener, signal handling, or initialization call. The deduplication cleanup interval is not retained or cleared on shutdown, and some SQL rollups deliberately return zero for unimplemented fields such as unique viewers, durations, and engagement. These are extraction blockers, not properties to preserve as shared production behavior.

Generic vs tenant-specific. Buffered ingestion, batch failure reporting, an append-only event-store port, bounded metric queries, and operational stream measurements are reusable mechanics. The concrete taxonomy combines generic stream/viewer events with Aphrodite monetization, private-show, device, social, and VR product events; the creator earnings and audience dashboard is likewise an Aphrodite read model. User, creator, and stream IDs without a tenant context are not a safe cross-product contract.

Reuse verdict: extract organ. Define a small versioned, tenant-required live-media telemetry envelope and durable sink/read ports in the shared substrate. Extract the validated batching/lifecycle mechanics only after adding bounded buffering, managed timers, authenticated producer/reader context, and cross-tenant denial tests. Keep the adult monetization/social taxonomy and creator-dashboard projections behind a thin Aphrodite adapter that maps to its own warehouse. The existing app and schema remain migration inputs and equivalence fixtures; they are not the final multi-tenant telemetry service.

4. apps/aphrodite/analytics-dashboard#

Role and boundary. This is a server-side Hono reporting and prediction API, not a browser dashboard. It serves revenue, viewer, engagement, trend, creator/viewer/admin/realtime dashboard, alert, segment, funnel, export, and prediction routes, and attaches a WebSocket server on port 3400. Its principal read path pages @aphrodite/analytics-warehouse events and calculates bounded rollups; Sophia models consume those real histories for selected prediction routes.

State and integration reality. The default analytics dependency is the real SQL client, with an injectable client for tests. Quick exports and the primary HTTP reports now derive values from actual events or return explicit 501 errors when a source/model is absent. The 112 route/model tests are meaningful evidence against the earlier hash-derived HTTP reports. That does not make the entire surface authoritative: alert configurations, segments, and funnels include hard-coded lists and create/update/delete handlers that only echo a response; several acknowledgement/detail paths synthesize records. Layout, export-job, and scheduled-report persistence is absent. Every WebSocket channel is generated from deterministic hash formulas rather than the warehouse, despite being advertised as real-time analytics. The default cache is process-local, and the global SQL client is neither closed nor reset during context shutdown.

Security and tenancy. No HTTP middleware authenticates a viewer, creator, or administrator or binds request-scope IDs. All reporting, mutation, prediction, WebSocket stats, and WebSocket subscription paths are public. A caller-selected clientId identifies a socket but proves no identity, and channel filters do not enforce tenancy. Like the underlying warehouse contract, all queries lack a tenant dimension. The production CORS fallback can resolve to * with credentials when CORS_ORIGINS is unset; CORS would not substitute for access control in any case.

Generic vs tenant-specific. Bounded event pagination and some stream-quality rollups demonstrate consumers of the reusable telemetry port. Creator earnings, private-show/content-sale analytics, supporter segmentation, dashboard layouts, alerts, and presentation schemas are tenant product/control-plane concerns. Prediction models are already separate packages and do not justify making this API part of the synchronous media substrate.

Reuse verdict: retain tenant control plane. Keep this deployable as an Aphrodite reporting composition surface. Point it at the extracted tenant-safe telemetry read port, then add authenticated roles, durable configuration stores, and real WebSocket sources. Do not extract its route graph, global context, synthetic socket feed, or Aphrodite dashboard schemas. Other tenants can build their own reporting projections over the same shared operational events without inheriting adult monetization policy or a second analytics service.

5. apps/aphrodite/auth#

Role and boundary. This Hono identity API implements registration/login, HS256 access tokens, opaque refresh tokens, password changes/resets, OAuth callbacks, TOTP/backup-code management, authorization middleware, and an uncomposed session service. The server listens on port 3003. Roles and permissions encode Aphrodite user, creator, moderator, administrator, content, stream, and payment policy; no media bytes or session signaling pass through it.

State and integration reality. Repository/store interfaces exist for users, refresh tokens, reset requests, OAuth links, TOTP data, and sessions, but the app and production entry point always install in-memory implementations. The listed database dependency is unused. Process-local maps also hold lockouts, rate limits, revoked access-token IDs, used backup codes, and OAuth state. Some cryptographic primitives are sound in isolation (PBKDF2, HMAC verification, CSPRNG token material, TOTP), but their composed flows are not viable:

  • refresh tokens are opaque random hex, yet refresh first calls the JWT decoder, so every issued refresh token is rejected;
  • reset tokens are stored with a freshly salted password hash and looked up by a second freshly salted hash, which cannot match;
  • the email-verification route accepts any nonempty token and marks an arbitrary supplied user ID verified;
  • enabling TOTP updates only the separate 2FA repository, never the auth user's twoFactorEnabled flag; login does not call the TOTP service and merely emits the supplied code in an event when the flag is set; and
  • configured JWT issuer and audience are neither placed in nor checked on the token, production secrets fall back to checked-in placeholder strings, and revocation is process-local.

OAuth state is process-local and based on Math.random; callback tokens can be placed in a caller-provided return URL query. The direct server bootstrap also reintroduces wildcard credentialed CORS when no environment origin is set, overriding the factory's default-deny intent. No automated tests exist for any of these security-critical paths.

Generic vs tenant-specific. Authenticated principal/tenant claims and capability checks are mandatory substrate inputs. The identity provider, credential recovery, OAuth account linking, creator/moderator role hierarchy, and payment/content permissions are tenant control-plane policy. Reusing this custom token implementation would couple every product to Aphrodite claims and inherit broken security flows.

Reuse verdict: retain tenant control plane. The substrate should accept a small verified principal contract from a configured identity adapter and enforce tenant/resource authorization at its own boundary; it should not issue end-user credentials. Keep or replace this app within Aphrodite, but do not extract its JWT, repository, OAuth, 2FA, session, or rate-limit implementation. Aphrodite must first add durable stores, secret fail-fast, issuer/audience/tenant claims, end-to-end negative security tests, and corrected refresh/reset/verification/2FA flows before its tokens can authorize shared media operations.

6. apps/aphrodite/broadcaster#

Role and boundary. This port-3100 Hono API is Aphrodite's broadcaster control surface. It manages stream records/keys/settings/lifecycle, broadcaster profiles and schedules, private/group shows and goals, interactive-device registrations, monetization settings, and broadcaster analytics. It is a server application despite the name; it does not capture a camera or encode media.

State and integration reality. The production route seams lazily compose SQL stores over @aphrodite/database, with memory stores used as boundary test doubles. Queries consistently resolve the authenticated user to an owned broadcaster row. Sixty-four focused route/integration tests cover ownership and state behavior, and unmodeled features generally return explicit 501 responses instead of invented success. The media boundary is nevertheless absent. The declared @aphrodite/streaming-core dependency is never imported. Creating a stream generates and stores a key locally; start/stop only update the streams status/timestamps; key rotation only updates the database; playback URLs are nullable values assumed to have been provisioned elsewhere. No call provisions ingest, validates that an encoder connected, starts a pipeline, receives authoritative media lifecycle events, or revokes a key at the ingest edge. The thumbnail capture and physical-device bridge correctly report gaps.

Security and tenancy. The app verifies an HS256 bearer token through an environment secret or injectable verifier and fails closed when a presented token cannot be checked. It extracts only sub; it does not validate or carry a tenant, issuer, audience, broadcaster capability, or token-to-resource tenant binding. The SQL schema is Aphrodite-global and ownership is user-based. Thus the existing boundary is useful Aphrodite authorization evidence but not the multi-tenant substrate contract.

Generic vs tenant-specific. Create/provision, rotate/revoke ingest credentials, start/stop reconciliation, playback endpoint discovery, media health, and lifecycle events are reusable streaming control-plane mechanics. Sensual/explicit flags, token earnings, private/group shows, tip goals, broadcaster KYC/profile policy, blocked users, and interactive adult-device settings are Aphrodite product behavior. The current analytics are product read models over Aphrodite tables, explicitly not wire telemetry.

Reuse verdict: thin tenant adapter. Keep this app and its adult-ring product APIs in Aphrodite, but replace direct stream/key/status mutations with calls to the shared tenant-parameterized stream-control organ. Persist the returned substrate resource ID and project authoritative lifecycle events back into the Aphrodite schema. Extraction must make ingest-key revocation effective at the edge, make start/stop reflect actual pipeline state, and add equivalence tests through this existing route/store boundary. Do not move shows, devices, profiles, earnings, or their database schema into the substrate.

7. apps/aphrodite/cdn#

Role and boundary. This port-3005 Hono API groups reusable object-upload, delivery signing, cache-control, cache invalidation/warming, and CDN metric operations. It provides S3-compatible single/multipart upload flows, CloudFront-style signed URLs/cookies, a lightweight resource token, CloudFront invalidation and CloudWatch metric adapters, plus cache-header middleware. It does not itself serve an HLS/DASH origin, select renditions, or proxy media segments.

State and integration reality. The CloudFront provider and multipart S3 paths call real AWS SDK surfaces through injectable ports. Twenty-eight tests cover CloudFront command/error/metric behavior, multipart create/part/complete/ abort behavior, and honest health responses. Production composition does not use that capability: createApp defaults to MockCDNProvider, and the server entry never supplies a CloudFront provider, so invalidation/warming reports success without touching a CDN and stats remain zero. Upload records, invalidation records, pending batches, and multipart session IDs all default to process-local memory and disappear on restart. Shutdown does not stop cache batching or close provider clients.

The direct single-object presigner is a hand-written approximation rather than the AWS presigner used for multipart parts; its canonical-request digest calls HMAC-SHA256 with an empty key instead of SHA-256, so it is not valid SigV4 proof. The lightweight token similarly hashes payload + secret rather than using HMAC and compares strings non-constantly. Neither direct presigning nor either signing service has automated coverage. publicUrl is constructed from the S3 endpoint even when the bucket is private, and a client can mark a direct upload complete without a storage HEAD/checksum confirmation.

Security and tenancy. Any header beginning with Bearer is accepted and mapped to the same fixed mock user. All protected users can request signatures, purges, and uploads as that identity; only full invalidation checks a role, which the mock never grants. Status, completion, failure, abort, progress, and delete routes accept an arbitrary upload ID without verifying its owner. Object keys contain a user ID but no tenant ID, resource policy, or media classification. The direct server also overrides default-deny CORS with wildcard credentialed CORS and defaults to well-known MinIO credentials.

Generic vs tenant-specific. Provider-neutral object keys, durable upload lifecycle, official presigning, signed playback grants, cache profiles, purge batches, and CDN health/metrics are reusable delivery mechanics. Aphrodite's content categories, user identity, authorization rules, retention/moderation decisions, and public/private entitlement policy must enter through tenant adapters. The current upload API is broader than the streaming core and should not imply that it already delivers adaptive live video.

Reuse verdict: extract organ. Extract provider ports and the verified S3/ CloudFront mechanics into a tenant-required storage/delivery organ. Replace the custom signatures with official/verifiable primitives, bind every object and operation to tenant plus resource ownership, persist resumable state, verify object completion, and make provider readiness fail closed. The shared stream pipeline can then ask this organ for origin/object locations and scoped playback grants. Keep Aphrodite routing/category/policy in a thin adapter, and retain provider integration tests as equivalence evidence; the current mock-composed app is not production delivery evidence.

8. apps/aphrodite/chat#

Role and boundary. This port-5000 Hono plus Socket.IO service provides stream-room chat, presence/typing, message history/search/deletion, live and durable moderation surfaces, and one-to-one direct messages. A chat room is defined as an Aphrodite streams row. Socket messages and DMs write through the same SQL store ports used by REST; memory implementations serve as boundary doubles.

State and integration reality. Production messages, room views, direct messages, blocks, and selected moderation history use real Aphrodite tables. Socket handshakes fail closed and derive identity/roles from a verified shared HMAC envelope rather than client-authored claims. Seventy-one tests cover REST behavior, socket auth tampering/expiry, DM persistence/authorization, moderation authorization/clearing, and content-filter edge cases. The realtime plane is single-node: connected users, rooms, broadcasts, typing, filters, duplicate/ slow-mode state, and socket mutes/timeouts live in process memory, with no Socket.IO cluster adapter or distributed presence/rate-limit store.

Moderation has two inconsistent authorities. REST bans persist to viewer_blocks but none of the socket join/send checks query that store; socket bans/mutes use a separate memory map and are not persisted. Filter configuration is public, mutable, and memory-only. Room join accepts any supplied ID without checking that the stream exists or that the principal is entitled, although the later message insert can fail for a missing stream. The content filter is called without userId, disabling its per-user duplicate-message check. A client may also label any socket message as a tip and supply any amount, which is persisted as a TIP chat row without payment evidence.

Security and tenancy. WebSocket authentication is the strongest boundary in this app, but its token contract has no tenant claim and trusts embedded global/ room role strings. The entire REST API has no authentication middleware: DMs and deletion trust a caller-controlled x-user-id, and ban/filter mutations have no identity or role check at all. SQL rows are keyed by globally assumed stream/user IDs, not tenant plus resource. Multi-node delivery, membership, and moderation therefore cannot currently preserve isolation or consistent policy.

Generic vs tenant-specific. Authenticated room membership, ordered durable messages, bounded history, presence, fan-out, rate limiting, deletion events, and moderation hook ports are reusable live-session mechanics. Direct messages, client presentation events, tip highlights, filtered-word policy, subscriber/ follower access, moderator assignment, and sanctions are tenant product policy. The substrate must never infer a payment from a chat payload.

Reuse verdict: extract organ. Extract stream-room chat behind tenant-required principal, session, membership, persistence, fan-out, and policy-provider ports. Unify REST/socket authorization and the moderation source, require a real stream session before joining, add distributed adapter/state support, and accept tip or system messages only as authenticated server events. Keep Aphrodite DMs, adult-ring filters/sanctions, and user-facing schemas in a thin adapter. Run the existing store/socket tests against both the adapter and shared organ, adding cross-tenant, reconnect/order, multi-node, and policy-denial equivalence cases.

9. apps/aphrodite/devices#

Role and boundary. This port-4003 Hono plus Socket.IO application is an intimate-device gateway. It exposes pairing metadata, device status, custom and built-in motion patterns, funscript conversion, tip-to-pattern triggers, and live commands for Lovense, Buttplug/Intiface, Kiiroo, Handy, OhMiBod, and T-Code serial devices. Media is neither ingested nor delivered; only the Handy/funscript features conceptually synchronize an external actuator with content time.

State and integration reality. Several protocol classes contain genuine HTTP, WebSocket, Intiface, and serial-port translations. The composed service does not connect REST pairing to them: devices/credentials are held in one module-level memory map, patterns and triggers in singleton memory managers, and live sessions/devices in another memory graph. The WebSocket manager constructs each shared protocol handler with an empty config, so user tokens, Handy keys, serial paths, and cloud endpoints captured by REST never reach it. Consequently most cloud discovery returns empty, while local-network/Intiface/serial discovery runs on the server host rather than the remote user's machine. The listed database dependency is unused and all pairing/trigger/custom-pattern/session state vanishes on restart. Disconnected sessions are retained indefinitely.

Sixty-six tests cover extensive REST shapes and signed WebSocket identity, but there is no vendor contract, hardware-in-loop, REST/socket composition, safety stop, reconnect, or payment-event authenticity coverage. Several protocol success responses mean only that a command was sent, not acknowledged by a device. The HTTP health surface does not probe a device bridge or durable store.

Security and tenancy. Socket identity fails closed and comes from a signed token, but carries only a global user ID/roles. REST operations trust an arbitrary x-user-id header. The Socket.IO server defaults to wildcard CORS. Most critically, the authenticated device owner can submit an arbitrary tip:process event, including its amount and recipient, and thereby activate hardware without an authoritative payment event. Shared protocol-handler maps and global tip callbacks also lack an explicit tenant/owner partition.

Generic vs tenant-specific. A generic live-media substrate may publish authenticated timecode, stream-lifecycle, or monetization-domain events through narrow hooks. Vendor pairing, intimate-hardware commands, patterns, consent and intensity limits, funscript semantics, and tip automation are a separate high- risk Aphrodite product domain. Moving them into streaming core would expand both the safety boundary and every other tenant's dependency surface.

Reuse verdict: retain tenant control plane. Do not extract this service into the streaming substrate. Aphrodite should first move hardware control to an appropriate user-local bridge, persist consent/pairing/trigger policy, replace spoofable REST identity, consume payment events only from a verified service, and prove fail-safe stop/reconnect behavior. The shared substrate should expose only optional tenant-tagged session/timecode hooks; this app remains one consumer and cannot influence ingest, playback authorization, or core session lifecycle.

10. apps/aphrodite/mobile-broadcaster#

Role and boundary. This package is a React Native creator application: it contains home, stream setup, camera/control, chat/moderation, analytics, and settings screens plus client-side portrait, face-tracking, notification, and background-image bridges. Capture and encoding necessarily run on the creator device, but this surface is not a server-side ingest, session, or delivery organ. Its adult categories, tips/revenue display, chat policy, beauty effects, and creator workflow are Aphrodite presentation and product behavior.

Execution and integration reality. The repository explicitly records the package as TypeScript-only: there is no Android or iOS project, app registry, Metro/Babel setup, Detox configuration, or end-to-end test. The declared React Native build and Detox targets therefore cannot run. More importantly, every publisher method in StreamingService is an empty native-module stub, including permissions, camera preview, encoder configuration, RTMP connection, publish/mute/stop, health collection, adaptive bitrate, effects, snapshots, and local recording. These no-ops still advance the local session to live and return constant healthy metrics, so the state machine can falsely report a successful broadcast without capturing or sending a frame.

There is no control-plane provisioning path. StreamScreen initializes both the stream key and RTMP URL to permanent null values and exposes no setter; StreamSetupScreen collects settings but neither configures the service nor passes data and only navigates backward. No route calls an API to create a stream, obtain a scoped ingest grant, acknowledge connection, discover playback, or stop the server session. The on-screen camera area is a text placeholder. The chat service similarly marks itself connected while all Socket.IO connect, send, moderation, poll, ping, and persistence hooks are no-ops. Analytics is the sole real network client, hard-coded to https://api.aphrodite.app, but its bearer token initializer is never called, so it sends Bearer null and silently falls back to empty data after failures. Several auxiliary native bridges have explicit JS fallbacks, but there is no native shell that could supply their modules.

Evidence and risk. Ninety-three tests cover only background-image, depth, face-tracking, notification, portrait-segmentation, and their service wrappers. There is no automated coverage for the publisher, stream screens, credential lifecycle, chat transport, analytics authentication, or a runnable mobile flow. The screen cleanup also captures the initial idle status in an empty-dependency effect, so unmount does not reliably end a later live session. In-memory stream keys are included in returned session objects without a modeled secure-storage or redaction boundary. These facts make this scaffold neither working- publisher evidence nor an equivalence oracle for extraction.

Generic vs tenant-specific. A reusable client contract should obtain a short-lived tenant/session-bound ingest grant, configure an actual platform publisher, report authoritative connection/health transitions, reconcile stop and reconnect with the control plane, and keep credentials out of logs and durable client state. Its platform-specific implementation may be delivered as a shared broadcaster SDK/adapter consumed by multiple apps. Screen layout, adult categories and access settings, tips, moderation controls, creator analytics, visual effects, and notification presentation remain Aphrodite-owned.

Reuse verdict: client of substrate. Do not move this React Native app or its simulated services into the server substrate. Replace StreamingService with a real, fail-closed publisher adapter behind the shared client contract and have an authenticated Aphrodite control-plane adapter provision/revoke the substrate session. Only then can native-shell builds, device/simulator automation, network interruption tests, and server-observed media/lifecycle assertions establish equivalence. The shared substrate owns the grant and authoritative session; Aphrodite continues to own this creator experience and its product policy.

11. apps/aphrodite/mobile-viewer#

Role and boundary. This package is intended to be Aphrodite's React Native viewer client, with local service abstractions for adaptive playback, chat, tipping, offline downloads/background playback, and cardboard/WebXR viewing. It contains no deployable server or server-side media mechanics. Viewer presentation, mature/subscriber labels, tips and gifts, emotes, offline UX, and VR controls are tenant product concerns; playback-session acquisition and health reporting are its potential shared-client boundary.

Execution and composition reality. Only five service classes and type files exist. There is no App.tsx, screen, navigator, app registry, native bridge, Android/iOS project, Metro/Babel configuration, or Detox configuration, even though the copied scaffolding note says that app/screens/bridges exist and the Nx targets advertise native and end-to-end builds. The package is therefore neither a runnable app nor an integration of the services it exports.

StreamingService accepts an arbitrary caller-supplied streamUrl and then implements every player operation as a no-op: load/play/pause/seek/quality, PiP/background mode, low-latency catch-up, progress, buffer, latency, and retry. It reports playing, returns successful PiP, reports zero latency, and starts timers over empty buffer/progress data without invoking react-native-video. The local ABR algorithm never receives a bandwidth sample because its update method has no caller. There is no authenticated discovery request, scoped playback grant, entitlement/age/subscriber enforcement, manifest validation, DRM license exchange, or server-observed viewer lifecycle. The mature and subscriber-only fields are descriptive booleans only.

Chat likewise "connects" using only caller-supplied user and stream IDs while all transport, status, emote, message, vote, and heartbeat methods are stubs. Tipping returns client-manufactured success, locally subtracts a zero/default balance, exposes a placeholder payment secret, and confirms payment without a processor or server. Offline download code fetches a hard-coded example segment but its file, persistence, storage, background-audio, metadata, manifest, and subtitle operations are simulated; it can register an in-memory offline item without writing media or enforcing the declared DRM key/expiry. The VR class contains standalone geometry and sensor calculations but uses browser globals (navigator, window, document, WebXR) inside a nominal React Native package and never binds a video texture or the playback service.

Evidence and risk. There are no unit, integration, component, native, or end-to-end tests; Vitest is configured to pass with zero tests while the Nx and package test commands invoke Jest without a local configuration. No flow proves authorized playback, rendition switching, interruption recovery, latency, offline bytes/DRM, commerce authenticity, chat identity, or VR rendering. As with the broadcaster scaffold, local success states must not become shared contract evidence.

Generic vs tenant-specific. A reusable viewer SDK may acquire a tenant- and session-bound playback grant, pass signed manifest/license data to a real platform player, surface native quality/buffer/latency events, report lifecycle, and fail closed on entitlement or expiry. A separate reusable renderer adapter could consume decoded frames for flat or immersive clients. Aphrodite still owns discovery, adult eligibility and subscription policy, tipping/gifts, chat presentation, downloads policy, and viewer/VR UX; authoritative commerce stays outside a media client.

Reuse verdict: client of substrate. Do not extract this package's simulated state machines into the server substrate. Define the shared playback/session client contract independently, then make an authenticated Aphrodite app consume it through a real native player and policy adapter. Equivalence requires a runnable native shell plus device automation that observes authorized manifests, decoded media, true player telemetry, revocation/expiry, reconnect, and cross- tenant denial. This package currently supplies vocabulary and risk inventory, not reusable implementation proof.

12. apps/aphrodite/notifications#

Role and boundary. This Hono notification application models in-app, FCM push, SendGrid email, and nominal SMS delivery, including preferences, quiet hours, aggregation, deduplication, retry queues, expiry cleanup, and Socket.IO fan-out. Its event taxonomy is Aphrodite product policy: follows, tips, shows, tickets, messages, subscriptions, gifts, creators going live, announcements, system notices, and moderation. It consumes lifecycle/business events after the fact; it is not part of ingest, media processing, playback, or synchronous session signaling.

State and delivery reality. The core has several genuine reusable mechanics. PostgresNotificationRepository supplies schema-backed notifications, preferences, and SKIP LOCKED queue claims; FCM and SendGrid adapters call real provider surfaces through injectable ports; transport failures are retried and are no longer fabricated as successful sends. Ninety-four tests cover the core queue, SQL generation/mapping, push batches and invalid tokens, email templates/ signatures/provider errors, app email wiring, and socket handshake identity.

The deployable composition does not use that durable path. createApp always constructs in-memory notification and push-subscription repositories and offers no repository injection option. No route registers device subscriptions. The package start command executes dist/index.js, but src/index.ts is only an export barrel: it binds no HTTP listener, constructs no Socket.IO server, calls neither initialization nor shutdown, and never installs the exported WebSocket handler. There is also no bootstrap that reads database, Firebase, SendGrid, recipient-directory, CORS, or stable unsubscribe-secret configuration. In the default graph, push sees zero process-local devices and treats that as a successful no-op, email has no address resolver/deliverer, SMS has no deliverer, and every notification/preference/queue entry disappears on restart.

Security and tenancy. Every HTTP create, batch, read, stats, read-all, dismiss, delete, and preference route is unauthenticated and accepts arbitrary user IDs; notification-by-ID responses expose the complete payload. The socket handshake correctly fails closed and derives a user from a signed envelope, but the token has no tenant claim. Its item-level mark-read, dismiss, and delete handlers call ID-only service methods and never check that the notification belongs to the authenticated user. Neither in-memory nor SQL rows carry a tenant key. Provider payload metadata and action URLs therefore cannot safely be accepted from the current public producer boundary.

Generic vs tenant-specific. Durable outbox/queue claiming, provider ports, retry/error accounting, device-subscription storage, and authenticated in-app fan-out are broadly reusable notification infrastructure, but they form a separate asynchronous messaging subsystem rather than a media organ. Notification types, templates, channel selection, quiet-hours semantics, adult-show/tip/ moderation content, recipient resolution, and audience policy belong to the tenant. The streaming substrate should only emit a versioned tenant-tagged session/lifecycle event that an authorized notification adapter may translate.

Reuse verdict: retain tenant control plane. Keep this service outside the streaming substrate and have Aphrodite consume shared stream.live, ended, or similar lifecycle events through a narrow, idempotent adapter. Before it can do so in production, add a real bootstrap, durable repository/subscription composition, authenticated producer and owner-scoped consumer routes, tenant keys and cross-tenant denial tests, stable secret/provider configuration, Socket.IO composition, and durable event/idempotency handling. Provider mechanics may later move to a general notification platform package, but RB.3 must not couple the media stack to Aphrodite's messaging policy.

13. apps/aphrodite/payment#

Role and boundary. This runnable port-4000 Hono service owns Aphrodite token purchases and balances, tips and creator goals, subscription tiers, payouts, derived transactions/earnings, and signed provider/internal webhooks. These are commerce and entitlement-source domains, not media transport. A stream ID is optional attribution on tips/show transactions; no ingest, playback, manifest, or live-session operation is performed here.

State and implementation reality. Unlike many audited scaffolds, production routes lazily compose real @aphrodite/database SQL stores. Tip debits, fee splits, creator credits, and goal updates are transactional; payout request/ cancel and purchase completion/refund move ledger state atomically; subscription stores enforce tier and lifecycle constraints; provider and internal webhook paths fail closed when signing secrets are absent. Unmodeled transfer, hold, refund, billing-history, payout-method, tax, verification, fraud-review, and report-file surfaces generally return explicit 501 responses rather than invented records.

Important money flows are still incomplete. Purchase initiation writes a pending row but does not create a checkout with CCBill, Segpay, Stripe, PayPal, or return a provider URL. PayPal verification is explicitly a shared-secret HMAC stop-gap rather than PayPal's server-side verification protocol; CCBill and Segpay similarly assume local raw-body HMAC conventions. Payout requests only reserve internal tokens; no payout-provider worker is composed. Most critically, the subscription route immediately inserts/reactivates an ACTIVE subscription and increments subscriber counts without debiting tokens, creating a provider charge/session, or waiting for a verified payment event. Such a row cannot authorize subscriber-only playback.

Security and tenancy. There is no authentication or authorization middleware anywhere in the app. The tests' x-user-id header is unused; routes instead trust path and body IDs. A public caller can spend another viewer's balance by sending a tip, create or cancel another viewer's subscription, create or mutate a creator's tiers/goals/tip menu, request or cancel a broadcaster's payout, and read balances, earnings, subscribers, payout details, and ledgers. Optional stream IDs on tips are not checked for existence, tenant, entitlement, or broadcaster ownership. No row or principal includes a tenant dimension, and the advertised idempotency header is never consumed, so duplicate client money requests are not protected by an API idempotency key.

Evidence. One hundred six route tests exercise broad behavior, honest model gaps, fee arithmetic, lifecycle guards, webhook signatures/replay tolerance, and memory-store idempotence. Despite the integration filename, the suite injects memory stores for every money domain and mocks database health. It does not execute SQL stores against Postgres, any provider sandbox/contract, payout worker, authenticated owner/capability checks, idempotency races, or cross- tenant denials. The type ratchet is clean, but that is not financial or entitlement equivalence evidence.

Generic vs tenant-specific. The substrate needs only a narrow, tenant-bound entitlement decision/grant input and may emit authenticated session facts for billing adapters. Token economics, adult private/group/spy show purchases, tips, intimate-device triggers, subscription tiers, revenue share, provider choice, payouts, tax/compliance, and dispute policy remain Aphrodite commerce. Even reusable payment-ledger/provider mechanics belong in a separate commerce platform, never in the synchronous media core.

Reuse verdict: retain tenant control plane. Keep this service outside the streaming substrate. After adding verified principals/capabilities, owner- and tenant-scoped SQL, real checkout/payout/provider verification, API idempotency, and database/provider/negative-security tests, Aphrodite may issue a short-lived entitlement assertion through the substrate's configured policy adapter. The substrate must fail closed and independently bind that assertion to tenant, principal, stream, access mode, and expiry; it must not trust today's public subscription rows or client-authored tip/stream associations.

14. apps/aphrodite/realtime-analytics#

Role and boundary. This runnable port-3450 HTTP/WebSocket service tracks live viewer sessions/counts, revenue, chat/tip/reaction engagement, trends, and dashboard snapshots. Viewer session accounting and bounded live operational metrics are close to the shared streaming plane. Revenue, top tippers, subscriber/follower signals, sentiment, and creator engagement are Aphrodite product projections layered on those session facts.

State and integration reality. All viewer sessions, unique-viewer sets, transactions, creator revenue, engagement windows, trend histories, socket clients, and IP counts live in singleton process memory. Restart loses every fact; multiple replicas compute divergent counts. Redis-capable pub/sub exists as a separate event bus, but the service classes emit only on their own EventEmitters and never publish into it. Conversely, EventBus.subscribe() never calls subscribeRedis(), and no composition code does, so the Redis subscriber joins no channels. The WebSocket forwarders therefore do not receive HTTP-ingested service events through that bus; only periodic socket snapshots read the local maps.

The HTTP ingestion routes are the sole source for viewer, transaction, chat, tip, and reaction facts, and callers supply every identity and classification. Viewer join trusts isAuthenticated, isSubscriber, tier, country, creator, stream, viewer, and session ID. Reusing a session ID can overwrite the global session while leaving a stale entry in the former stream map; heartbeat ignores the submitted viewer/stream relationship. Revenue has no transaction-ID deduplication, so retries double-count and a refund finds only the first match. No route reconciles against an actual stream/session, edge connection, payment, chat, or durable analytics ledger.

Security and accuracy. HTTP reads and event writes have no authentication, authorization, rate limit, tenant, or resource membership check. WebSocket connections likewise accept a caller-selected client ID and arbitrary stream/ creator subscriptions. The handler casts messages instead of applying the declared subscription schema, so the 100 ms minimum interval is unenforced and an attacker can create extremely tight timers. Revenue and per-creator data are public. Production CORS falls back to wildcard with credentials when the origin allowlist is empty. WebSocket stream snapshots also hard-code a healthy 4.5 Mbps, 30 fps, 1% drop rate, and 2.5-second latency plus zero duration rather than reading a media pipeline; health endpoints label every singleton healthy without probing Redis or an authoritative source.

Evidence. Twenty-five tests cover only engagement sentiment/reaction classification and provider fallback behavior. There is no automated coverage for viewer session lifecycle, duplicate/reordered events, revenue/refunds, HTTP authorization, event-bus/Redis delivery, WebSocket validation/isolation, multi-node aggregation, restart recovery, or synthetic media-health claims. The declared @aphrodite/analytics dependency is not composed into durability or reconciliation.

Generic vs tenant-specific. Authoritative join/leave/heartbeat accounting, tenant/session-tagged operational events, bounded recent windows, distributed aggregation, and scoped live-metric subscriptions are reusable streaming mechanics. Revenue sources, supporter rankings, adult commerce, chat sentiment, creator dashboards, country/tier presentation, and engagement scoring stay in Aphrodite projections. Media health must originate from ingest/packager/player telemetry, not a reporting default.

Reuse verdict: extract organ. Extract the viewer/session and operational telemetry contract, not this public singleton deployment. Require authenticated internal producers, server-issued session IDs, tenant/resource binding, idempotent sequence/event IDs, durable or reconstructable state, a real distributed aggregation design, schema-validated authorized subscriptions, and authoritative pipeline health. Bridge shared events to Aphrodite's revenue and engagement projections outside the organ. Preserve current pure calculations only where new replay, cross-tenant, multi-node, reconnect, and lifecycle equivalence tests prove them.

15. apps/aphrodite/streaming#

Role and boundary. This runnable port-3003 Hono application is named as the core streaming service, but its implemented production boundary is an Aphrodite SQL control/read API. It creates and edits streams rows, rotates and validates ingest keys, applies a stored lifecycle state machine, handles RTMP server auth/publish callbacks, reads provisioned playback/thumbnail URLs and completed recordings, and exposes Aphrodite discovery queries. It does not run an RTMP server, WebRTC SFU, encoder, packager, origin/CDN, recorder, frame capture worker, or media-observability pipeline. Those route families generally return explicit 501 gaps; the advertised gRPC and graceful media shutdown paths are TODOs. The declared @aphrodite/streaming-core dependency is unused.

State and media reality. The production route seams lazily construct real @aphrodite/database stores. The stream state machine validates the current SQL row, CSPRNG stream keys replace the earlier accept-any-key scaffold, RTMP auth joins broadcaster status, catalog queries and completed-recording reads are real, and readiness probes Postgres while marking Redis, Kafka, MediaSoup, and transcoding unprobed. Those are useful control-plane mechanics, not evidence of a media path. start, stop, and publish callbacks only mutate SQL state; no provisioning or teardown is attempted and no media observation proves a stream live. HLS, WebRTC, and thumbnail routes merely echo nullable URL columns that some external system must populate. The fixed ABR ladder has no worker behind it, while ingest selection, transport negotiation, transcoding jobs, playlist and token generation, recording/export/DVR, thumbnails, and QoE all fail loud.

The separate /metrics tree is actively misleading: it returns fabricated zero counters and labels the database, Redis, Kafka, MediaSoup, transcoding, and the service healthy without probing any of them, contradicting /health/ready and /health/stats. Stream/viewer statistics otherwise mix stored counters and view_sessions/chat rows rather than authoritative edge/player sessions.

Security and tenancy. The global middleware recognizes an internal API key only by setting isInternalCall; no route checks that flag, bearer identity, role, ownership, or capability. As a result, public callers can create streams for any broadcaster, read or edit full stream records, change lifecycle state, rotate or retrieve keys, invoke ingest publish/done callbacks, delete recordings, read storage/catalog data, and enumerate playback assets. Full stream records include the plaintext streamKey; SQL stores the key plaintext and compares it directly. Publish callbacks accept only a caller-supplied stream ID and are not bound to a successful auth decision or trusted edge. No schema, context, query, or event contains a tenant key. The process-local rate limiter keys on a spoofable service/forwarded header and cannot supply either authorization or distributed protection.

Evidence. Thirty-seven tests cover the memory-store stream state machine, exact-key matching, broadcaster-status gating, catalog and recording reads, stored asset reads, explicit infrastructure gaps, and the honest health routes. Despite the integration filename, the main suite injects memory stores and mocks database health. No test exercises Postgres, authenticated ownership or internal-callback capabilities, secret redaction/storage, tenant isolation, concurrent transitions, a media server callback contract, provisioned media, playback, recording artifacts, or real metrics. The suite also codifies returning the ingest key in ordinary create responses without testing who may receive it.

Generic vs tenant-specific. Tenant-bound ingest grants, authoritative media lifecycle events, publisher/session control, provisioned playback endpoints, rendition and artifact metadata, recorder control, health, and operational telemetry belong in the shared substrate. Aphrodite broadcaster/category/tag/ maturity discovery, catalog ranking, product stream metadata, viewer and tip rollups, completed-content policy, and database projection remain tenant control plane. A shared organ should issue hashed or otherwise safely managed, scoped, revocable ingest credentials and signed playback grants rather than expose this row model.

Reuse verdict: thin tenant adapter. Keep this app as the Aphrodite catalog and policy adapter, but replace its self-declared lifecycle/key/media route behavior with authenticated, tenant-parameterized substrate commands, queries, and events. Do not extract the current route graph or SQL status mutations as a media organ: they are a consumer-side projection with no underlying media implementation. Extraction should instead converge on the adjacent reusable media libraries and a new shared contract, then prove publisher-to-player, revocation, callback authenticity, artifact, telemetry, failure, and cross- tenant equivalence before Aphrodite delegates authority to it.

16. apps/aphrodite/viewer#

Role and boundary. This runnable port-3002 Hono service is Aphrodite's viewer-facing backend-for-frontend. It combines live catalog/search, SQL view sessions and stored playback URLs with chat/DMs, tips, follows/subscription reads, viewer settings, interactive-device commands, private/group shows, viewing history, and notifications. It composes real SQL stores lazily by default and generally returns explicit model/domain gaps instead of fabricating unsupported player, ticket, clip, push-delivery, or account behavior. It is therefore a substantive tenant application, but it neither plays nor delivers media and should not become the shared viewer service wholesale.

Viewing and state reality. join checks that a stream row is live, applies the Aphrodite sensual-tier opt-in and broadcaster ban, inserts a view_sessions row, increments denormalized viewer counters, and returns the row's nullable HLS/WebRTC URLs. leave closes the most recent matching row and updates watch time. There is no substrate/edge call, signed playback grant, entitlement or access-mode decision, session lease/heartbeat, URL expiry, license/DRM binding, media confirmation, or player telemetry. Missing URLs still produce a successful join. Session insert and counter update are separate queries rather than a transaction; repeat joins create multiple open sessions, abandoned sessions have no expiry/reconciliation path, and leave closes only one. The declared chat, payment, device-protocol, and core package dependencies are unused—the app directly duplicates database-domain logic instead of composing their authoritative services.

Identity, authorization, and tenancy. The middleware verifies an HS256 signature only when a local shared secret is configured and puts JWT sub in a variable named userId. The Aphrodite auth service signs users.id as sub. Settings correctly selects viewers.user_id, but nearly every other SQL store uses the same value directly as viewers.id/viewer_id. Production tokens therefore address the wrong identifier for sessions, chat, tips, follows, notifications, devices, history, and show participation; memory tests hide the mismatch by using one interchangeable string. The verifier does not enforce issuer, audience, role, tenant, or the auth service's process-local revocation state. No tenant key exists in request context or SQL predicates.

Even after identity mapping is corrected, join does not check viewer status, ban/age state, subscription or paid-show participation, and chat send does not require a live stream or active viewing session. Any authenticated viewer can inspect and command any broadcaster device whose global allow_viewer_control flag is set; no stream/session or tip grant is required. Tips are at least atomically debited and split, but lack API idempotency. Show request/join flows split balance deduction, request/participation insertion, and compensating refund across independent operations; failures and races can strand or duplicate funds, and extensions debit without recording the extra entitlement. These are tenant commerce/control defects, not mechanics to extract into media.

Evidence. One hundred thirty-one tests cover broad route behavior, memory store lifecycle and policy calculations, owner-scoped reads, model gaps, and database-health branching. No test instantiates a SQL store or Postgres, and the integration suite injects a token verifier plus memory stores. It does not test the real auth-token-to-viewer-row mapping, revocation/issuer/audience, tenant isolation, transactional session races, abandoned-session reconciliation, entitlement or grant expiry, signed manifests, media playback, viewer QoE, database commerce atomicity, or a device bridge. The breadth is useful product regression evidence but not publisher-to-viewer equivalence.

Generic vs tenant-specific. Authenticated tenant/principal resolution, entitlement evaluation, short-lived playback grants, server-issued leased view sessions, authoritative join/leave/reconnect events, playback endpoint and rendition metadata, and scoped viewer telemetry are reusable substrate contracts. Aphrodite's discovery ranking, sensual-tier preference, broadcaster bans, chat/DM presentation, token/tip/show economics, follows, notifications, device-control policy, schedules/VOD catalog, profiles, and history projections remain tenant control plane. Shared chat/session organs can expose narrow ports; they must not inherit this database schema or commerce coupling.

Reuse verdict: thin tenant adapter. Retain this deployable as Aphrodite's authenticated viewer API and policy composer. Replace direct playback URL and session authority with a tenant-bound substrate join/heartbeat/leave flow after resolving users.id to the tenant's viewer principal and obtaining a real entitlement decision. Project authoritative substrate events back into Aphrodite history, discovery, notifications, and commerce. Do not extract its combined route graph: only the generic viewer-session/grant contract belongs in the shared stack, proven with SQL identity, duplicate/reconnect, expiry/ revocation, cross-tenant denial, real player, and failure-path tests.

17. apps/aphrodite/vr#

Role and boundary. This runnable port-3008 Hono/Socket.IO service presents VR capture configuration, projection/stereo/spatial-audio metadata, headset capabilities, playback-session state, head tracking, interactions, settings, and adaptive-quality calculations. Its domain vocabulary is largely generic immersive media, making it the most direct candidate for a shared VR organ. The current implementation, however, is a control-plane simulation: it never opens a camera, stitches frames, encodes video/audio, publishes ingest, provisions a VR rendition, obtains a manifest, decodes/renders media, or applies tracking to viewport/foveated delivery.

State and media reality. Capture initializes a metadata record in process memory, optionally mirrors JSON to an injected Redis port, installs a spatial- audio configuration object, and accepts caller-authored encoder statistics. Its audio module performs vector/source calculations but no audio processing. Playback similarly creates memory sessions for any supplied stream ID, stores client tracking/interactions/metrics, and changes a string quality preset; no stream existence, grant, asset, rendition, player, or edge is consulted. Manual WebSocket quality selection merely echoes quality:changed without changing session state. Session statistics hard-code 90% active viewing, zero pauses and quality switches, and 60 fps. The HTTP preset routes return empty lists despite an in-package preset catalog.

Redis and database dependencies are listed but production constructs both services with only a logger, so every stream, session, setting, interaction, tracking sample, and metric is process-local and lost on restart. Even if Redis were injected, per-stream session indexes and several local histories are not reconstructed consistently across replicas. Local EventEmitter events have no durable bus. Readiness is unconditionally true; detailed health labels service objects healthy without probing their functionality.

Security and tenancy. Every HTTP capture/playback route is public. A caller can create, enumerate, mutate, or stop another claimed user's stream; read or overwrite any user's settings; start, inspect, pause, alter, or end arbitrary sessions; retrieve head tracking/device capabilities; and inject metrics, interactions, or capture statistics. This includes sensitive IPD, headset, tracking, optional location, and device data. Stream and user IDs are entirely client asserted, and there is no entitlement, ownership, resource membership, rate limit, or tenant dimension. Production HTTP and WebSocket CORS default to * while HTTP credentials are enabled, and the global error handler returns raw exception messages.

The Socket.IO boundary is better: its short-lived HMAC envelope now fails closed and derives userId from the signature instead of session:start. However, the shared envelope has no tenant, audience, issuer, or resource grant; roles are ignored here. Any signed user can start a session for an arbitrary or nonexistent stream. Socket event payloads bypass the HTTP Zod schemas and lack runtime validation/rate bounds, so tracking batches and metrics are trusted.

Evidence. Four tests cover only token round-trip/failure, rejection without a valid verifier, signed-user selection, and missing-secret fail-closed behavior using fake Socket.IO/services. There are no tests for capture/playback services, HTTP routes, Redis behavior, multi-node/restart recovery, projection/audio or quality correctness, authorization/ownership/tenancy, payload abuse, health, actual encoding, an immersive manifest, decoded frames, head-tracked rendering, comfort/latency, or hardware/WebXR. The Vitest comment still says no tests exist and permits that condition, underscoring the absence of media equivalence.

Generic vs tenant-specific. VR projection/stereo/spatial-audio descriptors, validated rendition capabilities, headset capability normalization, safe quality recommendations, viewport/tracking telemetry schemas, and immersive asset/ session negotiation are reusable substrate concerns. Preset tables and pure math can seed that organ after standards/hardware validation. Aphrodite still owns adult eligibility and entitlement, content metadata/location disclosure, viewer privacy/consent, settings presentation, interaction semantics, discovery, and product analytics. Headset detection, comfort settings, and rendering logic primarily belong in shared client SDK adapters, not a server pretending to play media.

Reuse verdict: extract organ. Extract the generic immersive media contract and independently verified pure capability/projection/quality logic, not this public memory deployment. Fold VR descriptors and rendition negotiation into the one shared ingest-to-playback substrate; require tenant-bound publisher and viewer grants, real capture/encoder/packager/player adapters, authoritative telemetry, bounded schema-validated tracking, durable/distributed session semantics, privacy controls, and honest health. Keep a thin Aphrodite adapter for policy and metadata. Equivalence must observe real 180°/360° stereo and spatial-audio playback on supported hardware or a credible automated harness, including reconnect, downgrade, revocation, failure, and cross-tenant denial.

Increment 7j implementation update (2026-07-19). The insecure deployment described above is no longer mounted: apps/aphrodite/vr now serves only an explicit 410, no-store retirement gateway with default-deny CORS and honest retired health. Its old exports remain temporarily source-compatible but its entry point constructs no simulated capture, playback, tracking, or Socket.IO authority. The reusable implementation moved into the canonical substrate: @oshun/live-media/browser now renders protected equirectangular 180°/360° mono/SBS/top-bottom video through WebGL in bounded flat/cardboard modes, uses pointer/keyboard/device-orientation input, and measures Web Audio plus non-black pixel and changed-view evidence. Aphrodite Viewer composes that client with the durable aphrodite.immersive.v1 adapter over migration 00020 and the exact succeeded browser-player/viewer/publication binding. Real FFmpeg/Chromium HLS and DASH automation covers 360° device orientation, 180° pointer orientation, two distinct non-black eye buffers on paused source frames, stereo audio, axe, mobile/reduced motion, privacy, and ordered teardown. The real PostgreSQL gate covers restart replay, expired-lease recovery, stale-worker fencing, RLS tenant denial, revocation-driven release, and durable credential/raw-tracking non-disclosure. This supersedes the earlier evidence paragraph for the deployed VR app, but it does not claim camera/stitching, cubemap/EAC, ambisonics, WebXR, OpenXR, visionOS, comfort certification, or physical headset validation.

Adjacent-library scope and method#

libs/aphrodite contains 192 top-level package directories. Reading all 192 as if they were media infrastructure would obscure the extraction boundary with payments, identity, games, ritual, compliance, production planning, rendering, and product UI. The adjacent pass therefore included each package that owns or claims one of the following responsibilities: ingest/publisher capture, composition, encoding or recording, media delivery, viewer sessions, live chat, presence, notification/telemetry hooks, media storage, content protection, or immersive-media capture/playback. That rule selected the 36 packages below.

The pass read package/build manifests, public exports, implementation files, production defaults, external-I/O use, and tests. A package with many tests or media-shaped types was not treated as a working organ unless its runtime actually moves media or durable authoritative state. Conversely, genuine browser processing and low-level codec/container code are recorded as reusable client or execution kernels even when they do not belong in a server control plane.

The remaining 156 directories are out of the initial synchronous substrate by responsibility, not silently unaudited by name. Examples include:

  • tenant control planes and policy: age-verification, compliance*, consent-engine, content-takedown, database, payment*, ppv, revenue-sharing, and safety*;
  • production and presentation: production, audience-experience, immersive-theater, virtual-rooms, auteur-camera, cinematic-camera, performer-camera, scene packages, and avatar/VFX packages;
  • post-live/VOD products: archive and vod-chaptering; and
  • peripherals and tenant experiences: device-*, haptics*, vr-haptics, games, gifts, tips, and venue packages.

Those packages may consume versioned live-media events or client frame APIs. They do not get authority over ingest, playback grants, viewer leases, media objects, or core session state merely because they react to a live stream.

Adjacent library extraction map#

Package Runtime reality Extraction decision
analytics Repository-port event/viewer/performance services; concrete persistence is external and product/revenue schemas are mixed in. Seed the minimal tenant-tagged live telemetry contract and batching behavior; keep creator/revenue projections in Aphrodite.
analytics-warehouse Real Postgres analytics_events append/query adapter, but the schema and every aggregate lack a tenant dimension. Migrate behind a tenant-required telemetry store with isolation tests; do not reuse the current schema unchanged.
cache Real wrapper over @oshun/cache, but keys/channels use a fixed aphrodite namespace. Presence joins overcount repeats, mutations are non-atomic, and presence TTL differs from count TTL. Depend on existing shared cache through atomic, tenant-scoped lease/presence ports; do not extract this wrapper.
chat Types/Zod/version facade; room, message, WebSocket, and moderation files explicitly defer implementation to service migration. Reject as a second chat stack. Migrate the deployable chat service and useful chat-core behavior into one implementation.
chat-core Feature-rich message/room/DM/moderation/presence engines entirely backed by Map/EventEmitter; no transport, durability, or tenant. Behavior/contract seed only. Fix fail-open subscription/follower checks and add durable tenant adapters before authority moves.
chat-entertainment Process-local trivia, story, voting, and minigame engines with timers and random variation; no chat transport or persistence. Keep as an optional Aphrodite product consumer of shared chat events.
chat-moderation Real third-party toxicity provider calls plus process-local rules/dashboard state; the moderator and provider error paths allow messages. Optional tenant policy hook/provider adapter after durable audit semantics; never the synchronous shared fail-open default.
cloud-recording Recording, encoding, segment, upload, checksum, and completion behavior is fabricated with timers and generated metadata; no encoder or object store. Retain vocabulary/FFmpeg argument ideas only; build recording from real pipeline/storage adapters.
drm Useful CSPRNG/HKDF/key-wrap/PSSH/CKC-shaped primitives and injectable stores, but defaults are in-memory and unscoped. Widevine returns base64 JSON and PlayReady uses simplified XML rather than vendor/CDM-compatible signed licenses. Optional hardened content-protection adapter with KMS/HSM, tenant isolation, vendor SDK/proxy, durable sessions, and conformance fixtures; not core delivery evidence.
e2e-encryption Real AES-GCM/CTR frame and segment transforms, key derivation, rotation, and insertable-stream helpers. Raw keys, sessions, and timers live in process memory; there is no tenant, durable key custody, authenticated distributor, or player/packager integration. Reuse reviewed crypto primitives behind a tenant/session key service; do not extract the current stateful service or claim DRM/SRTP interoperability from helper strings.
event-publisher Real wrapper over shared Redis event bus, but Aphrodite's event ID/timestamp/user/session envelope is discarded and reconstructed with different identity on subscribe; no tenant or outbox. Use @oshun/event-bus directly with a versioned tenant/resource envelope; keep Aphrodite taxonomy mapping in its adapter.
eye-tracking Client-side gaze acquisition/normalization/foveation analytics with injectable WebGazer/WebXR/native/simulated backends; simulation is opt-in. It owns no media/session transport. Optional privacy-bounded immersive client adapter and telemetry producer, not a server organ.
gaussian-splatting Pure/in-memory Gaussian data, math, optimization, and rendering-oriented structures; no capture source, transport, storage, or tenant boundary. Specialized immersive execution kernel only; compose after the base live path works.
highlight-clipping Clip encoding, CDN URLs, thumbnails, sizes, and signal collection are simulated; Bitly/custom shortener HTTP adapters are real. Keep domain types/detection heuristics as optional post-live inputs; build clips through real recording/encoding/storage.
multi-performer Extensive performance/scene/quality/spatial/presence math and state, but no peer connection, SFU/MCU, TURN traffic, socket, persistence, or media transport. Reuse selected pure formulas only; do not treat it as conferencing or presence infrastructure.
multi-source Real browser camera/screen/canvas capture, Web Audio mixing, layouts, transitions, and auto-switching. Declared recording/RTMP/WebRTC outputs are unused, and the OffscreenCanvas branch does not copy its rendered frames to the captured transfer canvas. Candidate shared broadcaster/composition client SDK after output wiring and browser E2E tests; not server ingest.
neural-rendering In-memory image/rendering math and enhancement/artistic pipelines; no model runtime, media transport, storage, or tenant. Optional client/GPU execution library outside the initial substrate.
notification-intelligence Timing/content/channel/learning calculators backed by local arrays, maps, timers, and random exploration; no push/email/SMS/browser delivery or queue. Expose a notification hook/event from the substrate; retain this Aphrodite decision engine outside it.
performer-compositor Layout, transitions, feed metadata, adaptive rules, and pipeline timing are real calculations, but output explicitly contains descriptors rather than composite pixels. Pure behavior seed for a broadcaster SDK; no claim of a working compositor until frames are rendered and published.
performer-presence Constellation/avatar/minimap/particle/PiP presentation and math; no WebSocket, Redis, session lease, or server presence. Keep in tenant clients; it is not the viewer-count organ.
platform-analytics In-memory formula engines for venue, audience, performer, revenue, culture, prediction, reporting, and dashboards; no authoritative store/transport/tenant. Keep tenant projections outside synchronous telemetry.
recording-prevention Browser API hooks and video-element deterrents are heuristic client code. DMCA requests are process-local, and the configured API submission method emits an event without making an HTTP call. Optional tenant client/policy layer only; never an authorization, DRM, or server media guarantee.
remote-guest Real browser WebSocket signaling client, RTCPeerConnection, ICE/data channels, capture, Web Audio mixing, layouts, and stats. There is no signaling/SFU service, tenant, or message-schema enforcement; token is placed in the socket query and reconnect timer is unmanaged. Its copied declaration file hides most runtime classes. Strong client SDK input after protocol validation, credential transport, cleanup, and a real tenant-aware signaling service.
spatial-audio Real browser Web Audio graph, audio fetch/decode, HRTF/SOFA parsing/convolution, room math, and process-local voice-zone routing. It has no voice transport/session service; the copied declaration surface exposes only a subset of runtime APIs. Optional shared immersive client renderer after public API repair; voice transport and authorization remain separate substrate ports.
storage Wrapper over existing @oshun/storage S3/MinIO signing/multipart APIs. Aphrodite metadata/events are process-local, paths encode product policy, direct-upload confirmation trusts caller metadata, and lifecycle tier changes do not change S3 storage class. Use existing shared storage behind a tenant/resource media-object port; keep Aphrodite path/visibility policy in its adapter.
stream-content-analysis Real OpenAI-compatible, Google Vision, AWS Rekognition, Azure, and custom analyzers over supplied image buffers; no frame sampler, media pipeline, tenant, or durable audit state. Optional asynchronous tenant moderation hook after ingest; not part of the lossless media path.
stream-upscaling Real browser WebGL shaders and quality math. The AI catalog is metadata only, no model loads/inference or server call occurs, and bandwidth/loss/RTT are simulated without samples. Copied declarations hide the runtime manager API. Optional client enhancement after API repair and visual/browser tests; not a transcode organ.
stream-watermarking Real DCT/audio/frame transforms and crypto-backed payload helpers with process-local sessions. Video PSNR compares the already-mutated frame with the same output buffer, so reported quality is not an oracle; there is no encoder/container integration, tenant, key custody, or durability. Optional reviewed pipeline transform after robustness/quality fixtures and tenant key management; not initial ingest/delivery.
streaming-core HLS/LL-HLS playlist/DVR text and state, RTMP key/URL/auth/FFmpeg-argument helpers, WebRTC SDP/stat helpers, and a process-local stream manager. It has no RTMP listener, FFmpeg process lifecycle, segment writer/store, packager, peer/SFU, or multi-node state; its only tests target the stream manager. Primary Aphrodite contract/helper seed, but pair it with real execution adapters and remove product policy from shared types.
thumbnail-generation Real OpenAI moderation provider; image/frame selection, processing, composition, cache, and quality behavior are largely heuristic/in-memory without Sharp/FFmpeg. Optional post-frame hook; do not place in core delivery.
video-effects Real browser canvas/WebGL effects and captureStream output; face/background detection is local heuristic code and there is no publisher or tenant/session connection. Candidate broadcaster client transform after visual and browser media-stream E2E coverage.
viewer-avatars Process-local avatar, seating, LOD, crowd, appearance, and emote simulation with an update loop; no session/presence transport. Tenant presentation client only.
viewer-interactions Process-local VR/social/proximity/follow/block/group activity state; no authoritative transport, storage, identity, or tenant. Tenant product client only.
volumetric-capture Large pure/in-memory 3DGS, renderer, container/compression, multi-camera, mocap, and editing toolset. Its headline single-/multi-camera pipelines simulate depth, segmentation, face/body inference and network delivery; the streaming format genuinely serializes/chunks/reconstructs supplied Gaussian frames but opens no transport. Reuse tested codecs/container/math as an optional immersive modality; real sensors/models/transport and tenant grants must be adapters to the common substrate.
vr-core Useful validated descriptors, tracking/controller/audio math, device tables, and ABR calculations. Playback and capture managers only mutate maps and complete via simulation timers; no WebXR/player/camera/encoder/transport. Extract pure immersive contracts/client utilities, not the simulated managers.
vr-quest Quest/WebXR hand/controller/haptic facade; support detection is real but session start comments out navigator.xr.requestSession. Optional Quest client adapter after a real WebXR session/render loop and playback integration.

Increment 7k implementation update (2026-07-19). The remote-guest row above records the pre-extraction audit and is now superseded at its production boundary. The unsafe token-in-query, tenantless, schema-free networking runtime has been removed from @aphrodite/remote-guest; that package is now a small compatibility facade over the canonical shared contracts/client plus its pure legacy layout calculations. Its generated declaration comes from the real source graph, and no copied declaration or alternate signaling authority remains.

@oshun/live-media now owns strict remote-guest registration, provision, signaling, operation, evidence, and release contracts. Its clean @oshun/live-media/browser/remote-guest entry supplies a real one-host/one-guest RTCPeerConnection runtime and a restrained full-bleed studio surface. One-use invitation and signaling capabilities never enter URLs; the ticket travels in Sec-WebSocket-Protocol, the exact same-operation path is enforced, and all bounded signaling messages are role/schema/sequence checked. SDP and ICE remain transient. Readiness requires both browsers to submit positive reciprocal RTP evidence, with the guest outbound and host inbound video flow linked by a SHA-256 of the negotiated SSRC.

Aphrodite Broadcaster is the tenant-fixed HTTP and WebSocket composition. Host authority derives from the existing authenticated stream-owner boundary; the guest receives only a scoped Guest lease. Migration 00021_live_media_remote_guests and aphrodite.remote-guest.v1 provide one active operation per exact publisher grant/stream, forced RLS, digest-only secret custody, atomic one-use exchange/consumption, database-clock invitation and lifecycle expiry, semantic idempotency, reclaimable execution leases, restart replay, stale-writer fencing, and repeat-safe release. Durable rows exclude raw secrets, SDP, ICE, addresses, codec strings, device labels, and captured media.

Single-worker Chromium automation proves actual reciprocal audio/video between two independent browser contexts, the matching SSRC link, third-participant rejection, URL/DOM/durable credential non-disclosure, invite-fragment scrubbing, explicit mic/camera/leave controls, axe, keyboard behavior, mobile fit, reduced-motion elimination, proof visibility, and ordered teardown. The real PostgreSQL/MediaMTX gate proves migration, secret rotation and one-use replay denial, durable signal/secret absence, restart replay, RLS isolation, database-clock expiry, abandoned-lease recovery, stale-fence rejection, idempotent release, and cleanup. This is a bounded direct browser peer path; it does not claim SFU/MCU, TURN availability, multi-party rooms, screen share, end-to-end media encryption, native/mobile clients, or multi-node signaling.

Increment 7l implementation update (2026-07-20). The multi-source and performer-compositor rows above remain accurate pre-extraction audits, but their missing bounded production path no longer applies to the canonical substrate. @oshun/live-media/browser now renders one to four caller-owned live sources through Canvas 2D, mixes optional audio through Web Audio, captures the derived stream, and publishes it with the already-proven WHIP client. It owns strict single, grid, and two-source picture-in-picture layouts, bounded output profiles and evidence, an accessible full-stage surface, and teardown that does not stop caller-owned tracks. Aphrodite supplies only authenticated no-store control routes and the forced-RLS aphrodite.composition.v1 lifecycle. Success is joined to the exact succeeded browser/WebRTC publisher and independently observed positive MediaMTX ingress. Chromium and PostgreSQL/MediaMTX gates prove real changing pixels, audio, RTP, durable replay/recovery/fencing, tenant isolation, privacy, and cleanup. The legacy packages were not promoted as alternate authorities, and custom/transition/GPU/native/distributed composition remains outside this bounded claim.

Existing shared stacks and canonical home#

The remote branch already contains libs/shared/streaming, published internally as @oshun/streaming. It is a Kafka/schema-registry/exactly-once event-streaming library used for data/training pipelines, backpressure, temporal correlation, and latency tiers. Renaming its semantics or mixing media session authority into its topics would create an ambiguous package and risk unrelated consumers. It remains a dependency where Kafka event streaming is appropriate; it is not the live-media substrate named by RB.3.

The repo also has active libs/neith/stream-* packages. These are not merely names: stream-encoder runs FFmpeg reference encoders and probes hardware backends, while stream-transport has live WebRTC RTP/DataChannel, SRT, QUIC, multi-path QUIC, RIST, TLS fallback, and traversal code with loopback tests. Other Neith packages cover game-stream input, QoE, security, client, and GPU/ title session orchestration. They are valuable execution kernels, but their contracts are cloud-game/domain-shaped and do not provide the tenant-scoped RTMP/SRT-to-HLS/DASH live-broadcast control plane, durable viewer leases, chat, presence, or delivery grants required here.

Canonical decision: create the consolidation boundary at libs/shared/live-media, package @oshun/live-media. This avoids collision with Kafka @oshun/streaming and makes the media meaning explicit. It owns the tenant-neutral contracts and orchestration exactly once, and depends on—not copies—@oshun/cache, @oshun/storage, @oshun/event-bus, selected Neith encoder/transport kernels, and provider adapters. Aphrodite, Veritas, V3 Stage, and the Rail may only enter through tenant adapters. No implementation belongs under apps/v10 or libs/v10.

Target substrate boundary#

Every durable resource, cache key, event, credential, request context, metric, and log correlation must carry a non-optional tenantId plus the relevant substrate resource ID. A caller-supplied product user/creator/stream ID is an external reference, not global identity. The shared boundary should be divided into the following independently replaceable organs:

  1. Contracts and authorization: verified principal/capability input, tenant/resource IDs, lifecycle state machine, typed errors, idempotency, versioned events, and cross-tenant denial before any provider call.
  2. Ingest control and edge: short-lived hashed publisher grants, effective rotation/revocation, RTMP/SRT/WebRTC adapters, authoritative connect/ disconnect health, and reconciliation with the control plane.
  3. Media pipeline and delivery: real encoder/transcoder execution, rendition/manifest packaging, media-object persistence, origin/CDN publication, signed playback grants, teardown, and honest readiness.
  4. Viewer sessions and presence: entitlement-decision input, expiring playback grants, idempotent leased join/heartbeat/leave, multi-node atomic counts, reconnect semantics, and QoE reporting.
  5. Live chat: tenant/resource rooms, schema-validated socket messages, durable history, moderation and entitlement ports, idempotency/rate limits, and distributed presence without Aphrodite product roles.
  6. Hooks and telemetry: notification, audit, moderation, operational metric, and event ports. Provider failure policy is explicit; hooks cannot silently turn media or authorization failures into success.
  7. Client and optional media adapters: browser/native publisher and player, remote guest/composition, DRM/encryption/watermarking, content analysis, and immersive descriptors/renderers. These extend the same grant/session model; they do not create alternate stacks.

The substrate deliberately does not own Aphrodite identity issuance, age or adult policy, payments/tips/shows, creator discovery, intimate devices, moderation case management, notification copy, dashboards, avatar/social presentation, or VR privacy preferences. Tenant adapters make those decisions and pass narrow authenticated results to the shared organs.

Incremental extraction and equivalence order#

  1. Establish @oshun/live-media contracts, tenant/resource ID types, dependency direction checks, and negative cross-tenant contract tests.
  2. Extract ingest credential/lifecycle behavior from the broadcaster and streaming services. Compose a real edge and Neith/FFmpeg execution adapter; prove key rotation/revocation and authoritative connect/disconnect.
  3. Add rendition packaging, shared storage/CDN delivery, signed playback grants, and a deterministic local test stream. No simulated URL is accepted as evidence.
  4. Move the viewer app to leased join/heartbeat/leave and reconcile counts through an atomic shared cache/durable ledger. Preserve Aphrodite policy in its adapter and test duplicate joins, crashes, expiry, and reconnect.
  5. Move chat room/message/presence mechanics behind the same tenant/resource identity, retaining the existing deployable service as the Aphrodite adapter and behavior oracle.
  6. Introduce tenant-tagged operational telemetry and notification/moderation hooks, migrating the warehouse schema before production reads or writes.
  7. Add immersive, encryption/DRM, watermarking, content-analysis, recording, and client composition adapters only after the flat-video path passes.
  8. Connect Veritas and V3 Stage as tenants #2/#3, then make the Rail's first-party-live class consume real HLS/DASH as tenant #4. Add the consolidation guard and run one supervised ingest-to-Rail E2E at a time.

For each move, the current Aphrodite route/store tests remain the product behavior oracle, while new substrate tests prove the generic contract. Required new evidence includes SQL identity mapping, tenant isolation, idempotency, multi-node/restart behavior, credential expiry/revocation, provider failures, real encoded bytes/manifests, decoded player media, QoE/lifecycle telemetry, and teardown. Hash-derived dashboards, memory-only success, generated URLs, timer-completed state, or helper argument arrays are explicitly insufficient.

Extraction progress (through 2026-07-22)#

  • Increment 1 is implemented at @oshun/live-media: tenant/resource contracts, capability authorization, lifecycle semantics, dependency-direction checks, publisher-grant service/store ports, and negative cross-tenant tests.
  • The credential half of increment 2 is implemented. Aphrodite has a durable RLS-protected, digest-only grant adapter and a tenant-fixed control facade; broadcaster and streaming stores issue, rotate, revoke, and authenticate the same shared grants while preserving their HTTP response shapes. The legacy streams.stream_key column contains only a constrained grant-managed:<stream UUID> compatibility sentinel.
  • MediaMTX external auth now binds a grant to the exact stream path, and connect/disconnect callbacks require a separately configured shared secret before changing lifecycle state. Route-equivalence, ownership-isolation, SQL-boundary, migration, and real PostgreSQL checks cover this increment.
  • The publisher-edge half of increment 2 is implemented. The shared substrate now owns tenant-scoped publisher observations, exact connection identity, idempotent refresh/replacement/disconnect semantics, provider-error types, and authoritative reconciliation. Aphrodite persists the current publisher in an RLS-protected table and rejects stale disconnects after replacement.
  • The MediaMTX provider consumes the paginated v3 Control API, supports current and legacy readiness/byte fields, and maps RTMP, SRT, WebRTC, and RTSP publisher sources without admitting unmanaged paths. The streaming service reconciles immediately and periodically without overlapping polls; failed snapshots are retried and never treated as empty state.
  • A gated local E2E runs a digest-pinned MediaMTX 1.19.2 container and a real FFmpeg SRT publisher. It proves forged-grant rejection, exact-stream auth, nonzero encoded-byte observation, HLS generation and decoded H.264 probing, durable control-plane restart behavior, and missed-disconnect reconciliation.
  • The encoder half of increment 2 is implemented without adding an app-owned media stack. @oshun/live-media owns a tenant/resource-scoped execution contract that authorizes live-media:stream:operate before invoking a provider. The server-only Neith provider accepts only credential-free allow-listed inputs and exact <root>/<tenant>/<stream>/<execution>.ts outputs, rejects canonical path escapes, symlink aliases, and pre-existing output, atomically reserves the execution path, removes partial media on failure/cancellation, spawns a shell-free runner argument vector, bounds process diagnostics, and exposes idempotent TERM/KILL cancellation. Success is accepted only after the output is a nonempty file and ffprobe measures the requested H.264/AAC codecs and dimensions.
  • neith-stream-transcoder is a compiled Rust runner in the existing Neith encoder crate. Its validated plan executes FFmpeg with bounded dimensions, frame rate, bitrates, and duration; low-latency H.264 High/AAC MPEG-TS; deterministic two-second GOP/CFR settings; and TCP media transport for RTSP. On Unix it replaces itself with FFmpeg so worker signals govern the real encoder rather than an orphan wrapper. Aphrodite supplies only a tenant-fixed internal worker facade.
  • The same gated E2E now reads the live MediaMTX stream over RTSP through that compiled Neith runner, produces a 640x360 rendition, and independently proves nonzero duration/bytes plus decoded H.264/AAC output. Contract/provider tests cover cross-tenant denial before execution, unsafe protocol and path denial, process failure, mismatched output, and idempotent cancellation.
  • Increment 2 is complete. Its real execution adapter feeds the durable job and publication composition completed in increment 3; no route fabricates worker or media state.
  • Increment 3's publication/delivery foundation is implemented in the same shared organ. Tenant-authorized publication contracts reserve immutable object prefixes and persist exact source measurements, rendition identity, lifecycle revision, failure state, and the verified object ledger. Aphrodite's PostgreSQL adapter uses a per-publication advisory lock and forced RLS for publishing/ready/failed/revoked transitions; its facade fixes the aphrodite substrate tenant and never accepts a caller-selected namespace.
  • The server implementation packages real Neith output into HLS MPEG-TS and DASH fragmented MP4, probes H.264/AAC and dimensions through both manifests, publishes segments before manifests to create-only local or official AWS S3/MinIO storage, and verifies stored checksums. HMAC-SHA256 bearer grants bind one entitlement decision to one publication prefix and exact object ledger; every origin authorization re-reads durable ready state, making revocation immediate across service restarts.
  • Durable transcode/publication orchestration is now part of the same shared organ. MediaPipelineJob has bounded validated requests, idempotent enqueue, cancellation, retry/backoff, expiring database-clock leases, renewal, and fencing. Its Aphrodite SQL store uses FOR UPDATE SKIP LOCKED, forced RLS, tenant/stream-scoped identities, and a composite resource foreign key from a successful job to its immutable publication. The shared worker and attempt executor connect the real Neith transcode, HLS/DASH packager, object publisher, and publication state machine without app-owned encoding logic.
  • Aphrodite streaming now composes that store, control facade, and supervised scheduler only under explicit complete production configuration. Exact INTERNAL_API_KEY authentication protects real enqueue/list/read/cancel routes; disabled or invalid runtime configuration returns an explicit 503. Restart, expired-lease recovery, retry, cancellation, concurrent claim, and stale-worker fencing are covered at the shared, SQL-adapter, route, and real PostgreSQL boundaries.
  • Aphrodite viewer now maps the authenticated JWT sub through viewers.user_id, evaluates account, age, sensual-tier, block, subscription/private-show, stream-state, and ready-publication policy in a read-only repeatable-read SQL transaction, then issues a short-lived grant. The route accepts no caller-selected tenant, publication, object prefix, entitlement decision, or key. Auth access tokens carry and verify fixed issuer/audience claims; the remaining process-local JTI revocation limitation is documented rather than presented as distributed security.
  • Streaming exposes a production authorization-subrequest endpoint for an external private-bucket origin proxy. It verifies the exact requested object against the signed ledger and re-reads durable publication and viewer-lease state on every request, so revocation, expiry, reconnect fencing, and leave remain immediate across process restarts. It does not pretend to serve S3/CDN bytes; deployment must keep the bucket private and enforce the returned authorization decision at the proxy.
  • Increment 4's viewer-session/presence organ is implemented in the shared package. Its tenant-scoped service owns entitlement-bounded idempotent join, rotating digest-only lease credentials, heartbeat, explicit leave, crash expiry, reconnect fencing, exact active-session/unique-viewer presence, and immutable bounded QoE samples. The playback-grant format now binds the viewer session and refuses both issuance and origin authorization without an active lease.
  • Aphrodite's forced-RLS PostgreSQL adapter uses database time, per-resource advisory serialization, exact token-digest checks, durable lifecycle/QoE ledgers, lazy expiry, and SQL-derived multi-node counts. Viewer identity and entitlement stay in the existing policy adapter; the Viewer app is a thin composition over canonical leased playback, heartbeat, leave, and presence routes. Its legacy direct playback-URL/counter mutation routes return 410 and no longer form a competing authority.
  • The supervised local E2E runs digest-pinned MediaMTX 1.19.2 and PostgreSQL 16 containers plus real FFmpeg/ffprobe. It applies canonical migrations 0000500010 in sequence against the existing text stream IDs; proves forged publisher denial, exact-stream auth, live encoded bytes, durable job idempotency, concurrent claiming, process reconstruction, expired-lease recovery, stale-worker fencing, retry-safe publication, forced-RLS isolation, SQL age-policy denial/allowance, idempotent session refresh, two-store presence aggregation, exact QoE persistence, lifecycle ordering, crash expiry, reconnect token fencing, and leave; then it decodes protected H.264/AAC through both HLS and DASH before proving object denial after viewer-session invalidation and durable publication revocation, followed by publisher teardown. MediaMTX is configured entirely through environment variables from an empty working directory, so this gate does not consume a host configuration-file watcher.
  • Increment 4's release evidence includes green shared (106), Aphrodite adapter (59), database/migration (207), Viewer (177), and Streaming (73) test suites; direct library/app/spec typechecks; targeted lint; both application builds; Prisma schema validation; and the separately enabled real edge E2E (1). The known Vite warnings are missing source maps for pre-existing generated shared database JavaScript and do not represent test failures.
  • Increment 4 is complete at the code and local release-gate boundary.
  • Increment 5's live-chat organ is implemented in @oshun/live-media. The tenant/resource-scoped contract owns durable memberships, leased presence, bounded history, idempotent sends, rate limits, room clears, and ordered join/leave/message/delete/clear events. Client messages are text-only; validated attributed tips and system notices are server-only capabilities.
  • Aphrodite's forced-RLS PostgreSQL adapter binds every join, heartbeat, send, and history read to the exact allowed entitlement, subject, viewer session, resource, and database-clock validity window. Composite membership/sender foreign keys and message-shape checks independently reject forged senders, client-shaped tips, invalid amounts, and attributed text. Per-resource advisory serialization makes message sequence allocation, clears, and event commits deterministic across nodes.
  • The existing Chat deployable remains the thin Aphrodite tenant composition. REST and Socket.IO share canonical UUID identity, entitlement policy, viewer-session admission, durable history, sanctions, content filters, and moderation revocation. Socket membership is joined only after the durable lease succeeds; cross-node PostgreSQL polling fans committed events out in order, while expiry, explicit leave, bans, and entitlement revocation evict the same canonical identity.
  • The digest-pinned PostgreSQL 16 gate applies migrations through 00011, exercises forced-RLS tenant isolation, restart/reconstruction, two-store fanout and presence, reconnect fencing, policy and moderation denial, invalid tip rejection, compatibility history reads, and externally held advisory-lock contention. No message or event becomes visible before commit, and committed event sequence matches serialized message order.
  • Increment 5's release evidence includes green shared live-media (126), Aphrodite adapter (76), database/migration (210), and Chat (57) test suites, plus the separately enabled real PostgreSQL E2E (1). Strict library, spec, and application typechecks; the Chat typecheck ratchet; targeted lint; Prisma validation; direct affected Nx builds; the Chat production build; and diff validation pass. The only lint diagnostics are eight existing Chat console warnings; test source-map warnings refer to pre-existing generated shared database JavaScript. A dependency-inclusive adapter build additionally reaches an unrelated pre-existing TypeScript 6 baseUrl deprecation failure in @aphrodite/core; the adapter's direct build and strict typecheck pass. The affected pre-commit typecheck likewise passes every increment-5 owner but is blocked by Aphrodite Payment's pre-existing ratchet backlog, including its own root-directory and webhook/store errors.
  • Increment 5 is complete at the code and local release-gate boundary. The parent RB.3 extraction item remains open for hooks/telemetry, increments 7–8, Veritas/V3/Rail tenant equivalence, the consolidation guard, and the final supervised ingest-to-Rail E2E.
  • Increment 6's operational-telemetry organ is implemented in @oshun/live-media. Its strict versioned envelope requires the exact tenant and stream resource, bounded attributes and finite measurements, event source, occurrence and correlation identity, and an idempotency key. Separate capabilities authorize resource-exact write, read, and hook dispatch. The substrate taxonomy covers publisher, stream, pipeline, publication, viewer, QoE, chat, and moderation lifecycle facts; it does not bless Aphrodite's unauthenticated, tenantless legacy analytics_events taxonomy as shared telemetry or move product/revenue reporting into the substrate.
  • The new 00012_live_media_operational_telemetry migration precedes production composition and creates a dedicated event ledger plus atomic hook outbox. Composite tenant identities, resource/idempotency uniqueness, bounded vocabulary and payload checks, forced RLS, claim and expired-lease indexes, and durable attempt/availability/lease/provider state make the database—not a process map—the authority. Aphrodite's tenant-fixed SQL adapter uses an advisory idempotency lock, database time, FOR UPDATE SKIP LOCKED, proposed lease tokens, and current-lease fencing. Provider errors retry with bounded backoff and become explicit dead letters; an unacknowledged final attempt also dead-letters when its lease expires instead of looping or disappearing.
  • Notification, moderation, and audit are reusable hook kinds. The shared worker dispatches only a matching registered hook and cannot change media, authorization, or telemetry success. Aphrodite supplies thin notification and moderation adapters: stream lifecycle becomes a tenant product notification seam without generic copy/audience policy, while moderation denial becomes a tenant case seam without message content. Provider references and failures are preserved in the outbox. Creator targeting, notification copy, audience resolution, sanctions, and case management remain Aphrodite-owned.
  • Aphrodite's publisher edge, Viewer runtime, and canonical Chat runtime now record production-path lifecycle events through the same tenant-fixed SQL writer. Refresh and duplicate paths replay stable semantic envelopes into the idempotent ledger without inflating counts; publisher connection/revision, viewer session/reconnect, QoE sample, stable chat membership/message, and committed clear-event identities provide exact idempotency. Durable Chat polling reprojects committed events after restart to repair any post-commit fanout gap. Chat projections contain only bounded identity/status/count metadata—never message bodies—and product moderation records durable/filter/ duplicate denial reasons without copying rejected content.
  • The digest-pinned PostgreSQL 16 Chat gate applies migrations through 00012 before starting the production composition. It proves durable chat and moderation telemetry, pending moderation outbox state, absence of filtered content, process reconstruction, two concurrent workers claiming one audit delivery exactly once, real provider failure followed by retry and terminal dead letter, persisted attempts/error detail, and forced-RLS denial to another tenant. The deterministic memory oracle additionally matches SQL behavior for an expired final-attempt lease.
  • Increment 6's release evidence includes green shared live-media (141), Aphrodite adapter (91), database/migration (213), Chat (59), Viewer (177), and Streaming (73) test suites, plus the separately enabled real PostgreSQL E2E (1). Strict library/spec/application typechecks, Chat's zero-backlog ratchet, targeted production and test lint, Prisma validation, isolated shared, adapter, and database builds, all three affected application builds, and diff validation pass. The known Vite diagnostics remain missing source maps for pre-existing generated shared-database JavaScript. The dependency-inclusive adapter build still reaches the unrelated @aphrodite/core TypeScript 6 baseUrl deprecation; the adapter's own build and strict typecheck pass. The repository pre-commit typecheck also passes every affected project before stopping on ten unrelated, pre-existing apps/aphrodite/payment ratchet errors; the commit therefore uses the documented typecheck bypass after the direct strict affected checks above.
  • Increment 6 is complete at the code and local release-gate boundary. The parent RB.3 extraction item remains open for optional adapters in increment 7, Veritas/V3/Rail tenant composition in increment 8, the consolidation guard, tenant equivalence, and the final supervised ingest-to-Rail E2E.
  • Increment 7a establishes the optional-media/client extension boundary without registering any simulated legacy package as a production provider. The shared contract enumerates immersive, segment-encryption, DRM, watermark, content-analysis, recording, publisher-client, player-client, remote-guest, and composition adapters. Every operation has an exact tenant/stream resource, semantic idempotency key, bounded adapter identity, and the relevant publication, viewer-session, playback-grant, publisher-grant, or authoritative publisher-connection references. Raw keys, ingest/playback secrets, DRM challenges, media URLs, and client/device fingerprints are not admitted.
  • The optional-adapter service denies tenant or capability mismatches before binding verification or provider access. A mandatory authority port must prove exactly the active bindings for that operation; unrelated or incomplete evidence fails closed. Readiness must be fresh, internally coherent, and declare every kind-specific media source, object store, key-custody, vendor/executable, client-runtime, or edge-observation dependency. Provider failure remains failure rather than a local success state.
  • Successful adapters must return the authorized operation identity, kind-specific conformance proofs, and the expected measured artifact. Server artifacts require a nonzero byte count and SHA-256 digest; immersive/player paths require decoded-media evidence, publisher/guest/composition paths require real edge or peer/render evidence, DRM requires vendor-license plus key-custody proof, and teardown is an explicit resource-matched operation. Strict immersive descriptors validate projection, stereo layout, geometry, codec, bounded runtime capability negotiation, and mono/stereo/binaural/ACN ambisonic channel invariants without accepting headset serial, location, gaze, or other product privacy data.
  • Increment 7a's shared library/spec typechecks, focused lint, formatting, and all 151 shared live-media tests pass. This is the reusable contract foundation, not completion of increment 7: real durable providers, pipeline/client composition, media and vendor conformance fixtures, browser/native automation, provider-failure recovery, and teardown evidence remain actionable. In particular, the audited timer/generated cloud recorder, non-conformant DRM license facades, process-keyed encryption/watermark services, and no-op mobile publisher/player managers remain excluded.
  • Increment 7b adds the first real optional provider without changing that exclusion policy: aphrodite.content-analysis.v1 is a thin Aphrodite tenant composition over the shared optional-adapter boundary. A trusted internal control fixes tenant, adapter, capability, and advisory policy; its authority verifier accepts only the exact checksum of a ready publication's MPEG-TS or fragmented-MP4 video object. Callers cannot upload a frame, choose a provider credential, supply a media URL, select another tenant, or request automatic policy action.
  • The provider reads the bounded published object through a checksum-verifying local/S3 port, extracts and measures a JPEG using the real FFmpeg executable, and calls the audited OpenAI-compatible StreamAnalyzer path. HTTPS is mandatory outside loopback. Both auto-age-gating and automatic policy action are forced off. The immutable JSON artifact keeps only bounded advisory category, age, policy, object, face-count, and text-region-count evidence; it excludes raw samples, OCR bodies, biometric identifiers, and the legacy provider's automatic-action recommendation.
  • Migration 00013_live_media_content_analysis creates a publication-FK-bound, forced-RLS operation ledger with semantic idempotency, bounded attempts, create-only result evidence, and fenced leases. PostgreSQL's clock—not request time—owns claim, renewal, expiry, and settlement. A heartbeat renews slow FFmpeg/vendor work; renewal loss prevents both success and stale failure settlement. Exact succeeded retries replay the durable result after process reconstruction without another sample or vendor call.
  • Aphrodite Streaming composes the provider only when every S3, FFmpeg, vendor, policy, worker, lease, and size setting is valid. Its probe, execute, and one-shot teardown routes require the existing internal API key plus a bounded service identity. Unit/integration coverage exercises strict binding, checksum and media-type denial, absolute readiness freshness, privacy non-disclosure, retryable provider failure, lease renewal/loss, configuration, route authorization, teardown, real FFmpeg sampling, and a real loopback OpenAI-compatible HTTP exchange.
  • The digest-pinned supervised MediaMTX/PostgreSQL gate applies migration 00013 atop the real publication pipeline, samples an actual published transport segment, verifies its immutable evidence, reconstructs the database and provider, proves exact no-reexecution replay, serializes two concurrent claims, recovers the expired lease, fences the stale writer, denies a second tenant under RLS, and tears down cleanly. Increment 7b is therefore complete at the code and local release-gate boundary. At this point increment 7 still requires the recording and remaining immersive, encryption/DRM, watermarking, publisher/player, remote-guest, and composition providers plus their applicable browser/native automation.
  • Increment 7c adds aphrodite.recording.v1 as a second real optional provider. A trusted internal control fixes tenant, adapter, capability, worker, object namespace, and retention-policy custody while accepting only a bounded asynchronous request. The exact publisher connection must agree between the forced-RLS edge-session ledger and a fresh MediaMTX Control API observation; the RTSP(S) input is derived from operator configuration, never supplied by a caller. Interactive stop, DVR, segment tracking, export, and cleanup jobs remain explicit 501 gaps rather than simulated controls.
  • The executor runs real shell-free FFmpeg stream-copy capture with a hard duration/deadline, abort-driven TERM/KILL shutdown, canonical private attempt directories, bounded diagnostics, and cleanup before terminal success. FFprobe must measure the requested MP4 or Matroska container, a decodable video stream, dimensions, duration, and optional audio. The output is hashed through an open descriptor, staged durably, uploaded create-only through the shared streaming-safe local/S3 object store, re-read by exact checksum/length, and returned with the shared recorded-media and object-persistence proofs plus a byte-bearing recording artifact.
  • Migration 00014_live_media_recording supplies a forced-RLS, stream-FK-bound queue with semantic idempotency, unique recording identity, bounded attempts/backoff, database-clock leases, heartbeat renewal, lease-token fencing, exact terminal evidence, and a staged artifact descriptor. A restarted worker settles an already-uploaded object without recapturing the publisher; an expired final-attempt lease becomes an explicit terminal failure rather than a stranded processing row. Provider, object, cleanup, or shutdown failures remain retryable only while the current lease can record that outcome.
  • Streaming composes the recording control and supervised worker only when the base durable pipeline/S3 custody plus MediaMTX control/RTSP, absolute private workspace, retention, FFmpeg/FFprobe, lease, retry, and worker settings are complete. Auth-first POST enqueue returns 202; exact operation status and readiness reads require the deployment internal key and a bounded service identity. Unit, SQL, route, configuration, scheduler, and executor coverage proves binding disagreement/freshness denial, strict request shape, restart settlement, retry/backoff, final-attempt recovery, stale-writer fencing, result-to-staged-object equality, shutdown cancellation, and tenant denial.
  • The digest-pinned supervised MediaMTX/PostgreSQL gate applies migration 00014, reconciles the real SRT publisher into SQL, captures its RTSP stream with FFmpeg, independently FFprobes the immutable MP4 as H.264/AAC, verifies exact object checksum/length, reconstructs the database/source/provider, proves result replay without a second FFmpeg call, serializes concurrent claims, recovers an expired lease, fences the stale writer, denies another tenant under RLS, and tears down the publisher and both containers. Increment 7c's release evidence includes green shared live-media (156), Aphrodite adapter (123), database/migration (219), and Streaming (87, with the separately enabled real edge E2E also green) suites; the explicit Streaming integration target adds 18 green tests. Strict source/spec typechecks, affected lint, Prisma validation, isolated and dependency-inclusive builds, formatting, and diff validation pass. The dependency graph now emits declarations for stream-content-analysis under TypeScript 6, so the previously blocked @aphrodite/core → content-analysis → adapter → Streaming Nx build chain also passes; the prerequisite core (421) and content-analysis (140) suites remain green. The affected pre-commit typecheck passes every increment-7c owner before stopping on the same ten unrelated, pre-existing Aphrodite Payment ratchet errors recorded above; the commit therefore uses the hook's documented typecheck bypass after the direct strict checks. Increment 7c is complete at the code and local release-gate boundary. Increment 7 remains open for immersive, encryption/DRM, watermarking, publisher/player, remote-guest, and composition providers plus applicable browser/native automation.
  • Increment 7d adds aphrodite.segment-encryption.v1 as the first real content-protection provider. It deliberately implements only standards-based HLS AES-128 segment protection: CENC and CBCS are rejected before binding or queue mutation, and no vendor DRM/CDM license compatibility is claimed. A tenant-fixed policy selects one public key reference/version, while callers may name only an exact ready publication and semantic operation identity.
  • The provider reads the publication ledger's complete authoritative HLS graph, accepts canonical VOD manifests and complete MPEG-TS segments only, rejects traversal/remote/range/map/i-frame/encrypted/orphan/duplicate inputs, and enforces per-object and total byte bounds. It encrypts each segment with AES-128-CBC plus PKCS#7 padding and the HLS media-sequence IV, re-reads and independently decrypts every create-only object back to the exact source bytes, writes media manifests with internal key URIs, then writes the master and a key-free checksummed descriptor last. A retry accepts an existing object only when checksum, length, and media type agree exactly.
  • Key custody composes the audited Neith PKCS#11 KMS backend with an operator-provisioned, nonextractable RSA-3072 KEK. Each operation creates one random 256-bit data key, derives its 128-bit content key under a domain-separated HMAC bound to the complete request context, wraps only the data key, and zeroes plaintext buffers. Durable custody includes public key policy, HSM object identity, wrapped bytes, context and recovery-verification digests, output namespace, and internal key URI; neither PostgreSQL nor the publication descriptor admits plaintext/content/key-byte fields. Recovery rejects wrong policy/context and tampered wrapped data before returning exactly 16 bytes.
  • Migration 00015_live_media_segment_encryption supplies the composite publication FK, forced RLS, semantic idempotency, bounded custody/artifact JSON, database-clock backoff, expiring renewable leases, lease-token fencing, staged custody/publication recovery, and exact terminal evidence. The protected-publication descriptor is staged durably before its own create-only object is committed, so a restarted provider settles the same output without minting another data key or changing ciphertext. Expired attempts are recoverable and stale workers cannot renew, stage, succeed, or release them.
  • Aphrodite Streaming composes the provider and supervised worker only when the base publication/object store, worker, fixed key policy, internal key base URI, PKCS#11 module/token/PIN/tooling, HSM KEK, lease, retry, object-count, and byte bounds are complete. Auth-first internal routes expose readiness, 202 enqueue, exact durable status, and succeeded-only raw key delivery. The key response is exactly 16 bytes with no-store, zero-age, Pragma: no-cache, octet-stream, fixed content length, and nosniff; the recovered control buffer is zeroed after the response owns a copy.
  • Unit, SQL, migration, route, configuration, and provider coverage proves policy and authority denial, authoritative graph validation, independent ciphertext round-trip, key-free descriptors, wrapped-key tamper detection, restart replay, backoff, expired-lease recovery, stale-token fencing, staged result equality, concurrent claim serialization, and tenant denial. The supervised real gate applies migration 00015 to PostgreSQL, provisions a nonextractable RSA KEK in SoftHSM, protects the FFmpeg-produced HLS, confirms no raw key material in SQL, rejects unauthenticated key delivery, and has an independent authenticated FFprobe client decode H.264/AAC through the protected manifest and key route. It then reconstructs the database, PKCS#11 custody, store, and provider for exact terminal replay; recovers an expired lease; fences the stale token; and proves forced-RLS denial to another tenant.
  • Increment 7d's release evidence includes green Aphrodite adapter (137), database/migration (222), Streaming (93, plus the separately enabled real edge E2E), Neith vault-engine/SoftHSM (40), and shared optional-media contract (11) suites. Strict source/spec/application typechecks, affected lint, Prisma validation, dependency-inclusive adapter/database builds, the Streaming production build, formatting, and diff validation pass. Increment 7d is complete at the code and local release-gate boundary. Increment 7 remains open for CENC/CBCS and vendor DRM, immersive, watermarking, publisher/player, remote-guest, composition, protected-object/key cleanup, viewer integration, and applicable browser/native conformance automation.
  • Increment 7e adds aphrodite.watermark.v1 as a real optional-media provider, while deliberately limiting its claim to a visible keyed marker. The trusted control fixes the tenant, adapter, aphrodite.visible-grid.v1 profile, public key reference/version, output namespace, and worker. Callers name only an exact operation/idempotency identity, ready publication, published video/mp2t source key/digest, and optional viewer session. The payload reference is derived from the publication or viewer session and cannot be supplied independently.
  • The binding and execution paths both require the exact ready publication and source object. A non-null viewer session must still be active, entitlement-valid, and tenant/resource exact according to database time. The source must be real H.264/AAC MPEG-TS within configured byte limits. Remote, caller-selected, mismatched, unready, released, or differently encoded inputs fail before they can become successful evidence.
  • The shell-free FFmpeg executor encodes an opaque keyed 8x8 black/white grid into the top-right picture region, preserving H.264 video and AAC audio in an MPEG-TS output. Verification decodes the actual output, samples all 64 cell centers from exact pixels, recomputes the expected bits, and measures luma PSNR against the decoded source outside the complete grid bounding box. The output is accepted only when extraction and the operator PSNR floor pass. Evidence names this visible-grid behavior and expressly makes no invisible or forensic-robustness claim.
  • Custody reuses the generic PKCS#11 media-key boundary introduced by segment encryption. Each operation creates a random 256-bit data key, wraps it under an operator-provisioned nonextractable RSA-3072 KEK, and derives the 64-bit grid token by domain-separated HMAC over the complete request context. The durable record admits only wrapped bytes, fixed policy/HSM identity, and context/data-key/token verification digests. Plaintext data-key and token buffers are zeroed and never enter PostgreSQL, output media, or evidence JSON.
  • Migration 00016_live_media_watermark adds a composite publication foreign key, optional viewer-session foreign key, forced tenant RLS, semantic idempotency, database-clock backoff, renewable expiring leases, lease-token fencing, bounded staged custody/artifact JSON, exact terminal replay, and a durable release timestamp. The provider writes create-only media before its checksummed descriptor; a restart verifies exact existing bytes and settles staged state without another encode. Teardown removes both fixed objects before release, is repeat-safe, and prevents the same operation identity from recreating deleted media.
  • Auth-first internal Streaming routes expose dependency readiness, 202 enqueue, durable status, and destructive release only when the base pipeline, fixed policy, FFmpeg/FFprobe, object store, queue, and complete PKCS#11/HSM configuration are present. Unit, SQL, migration, route, runtime, and provider coverage proves fixed policy/payload derivation, viewer denial, exact source binding, secret non-disclosure, pixel extraction and PSNR enforcement, create-only crash recovery without re-encoding, database-clock backoff, expired-lease recovery, stale-token fencing, tenant isolation, and release fencing. The separately enabled real edge gate applies migration 00016 to PostgreSQL, reuses a real nonextractable SoftHSM RSA KEK, transforms an actual FFmpeg H.264/AAC segment, inspects durable wrapped-only custody, reconstructs the store/provider for exact replay, recovers and fences an abandoned lease, proves forced-RLS denial, and deletes both artifacts before durable release.
  • The production dependency remains narrow: neith-vault-engine advertises an audited capability:kms boundary and a build/type gate, the Aphrodite adapter owns the provider-neutral PKCS#11 factory, and the Streaming app imports only that custody facade. Increment 7e's release evidence includes green Neith vault-engine (40), Aphrodite adapter (151), database/migration (225), and Streaming (98 plus the separately enabled real edge E2E) suites. Strict source/spec/application typechecks, targeted module-boundary lint, Prisma validation, the dependency-inclusive adapter/database build, the Streaming production build, frozen lockfile validation, formatting, and diff validation pass.
  • Increment 7e is complete at the code and local release-gate boundary. Increment 7 remains open for CENC/CBCS and vendor DRM, immersive, publisher/player, remote-guest, composition, segment-encryption viewer and cleanup wiring, and applicable browser/native conformance automation.
  • Increment 7f adds aphrodite.player-client.v1 as the first real client-side optional provider and deliberately limits the claim to authenticated browser HLS. Protected playback reserves one credential-free operation for the exact ready publication, active viewer session, issued playback grant, client instance, and protocol. DASH registration returns no player operation and the provider rejects non-HLS execution; native and immersive clients remain open.
  • Migration 00017_live_media_player_client adds a forced-RLS operation ledger with composite publication, viewer-session, and QoE-event foreign keys, semantic idempotency, one active operation per viewer session, database-clock lifecycle expiry, expiring reclaimable execution leases, immutable first evidence, and repeat-safe durable release. Refresh releases the superseded grant operation. A succeeded result requires a previously committed playing QoE row whose playbackGrantId, session, resource, protocol, and positive decoded-frame count all match. Evidence and result constraints reject bearer, credential, lease-token, and token fields.
  • @oshun/live-media/browser now exports the same-origin Aphrodite join, heartbeat, and leave client plus an HLS.js/MSE player. It rejects cacheable control responses and cross-origin APIs, never sends the media Bearer to the application API, opens only media URLs under the grant's exact origin and publication prefix, and has no unsafe native-HLS fallback. Readiness requires measured video dimensions, a positive decoded-frame count, durable QoE acceptance, and the exact first succeeded player-operation proof. Later heartbeats retain that immutable proof; fatal loader, authorization, decode, or heartbeat failure destroys media, clears the credential, and releases the viewer session.
  • The player surface follows the mandatory frontend workflow: decoded media is the dominant near-black stage, status and controls are compact, focus and accessible names are explicit, controls recede during playback, mobile layout remains usable, reduced motion removes transitions, and authorization or publication-boundary failure is never rendered as success. The Playwright gate generates H.264/AAC HLS with real FFmpeg and Chromium, then proves decode, repeated heartbeats, exact-prefix authorization, cross-publication blocking before bearer disclosure, revocation, durable release, axe conformance, responsive layout, and reduced motion.
  • The digest-pinned MediaMTX/PostgreSQL gate applies migration 00017, creates and refreshes real protected viewer grants, proves superseded-operation release, commits exact decoded QoE into a succeeded operation after process reconstruction, inspects the conformance proofs, confirms the Bearer is absent from SQL, denies a second tenant under forced RLS, reconnects, and durably releases on leave. Increment 7f's release evidence includes green shared live-media (174), Aphrodite adapter (162), database/migration (228), Viewer (182), and Streaming (98 plus the separately enabled real edge E2E) suites; four FFmpeg/Chromium Playwright scenarios; strict source/spec/application typechecks; all five affected lint targets; five scoped production builds; frozen lockfile, formatting, and diff validation.
  • Increment 7f is complete at the code and local release-gate boundary. At that boundary, parent increment 7 and RB.3 remained open for DASH/native players, immersive rendering, CENC/CBCS and vendor DRM, publisher-client, remote-guest, composition, protected-media viewer/cleanup wiring, remaining client conformance/recovery automation, tenant equivalence, the consolidation guard, and the complete ingest-to-Rail flow.
  • Increment 7g extends the same real aphrodite.player-client.v1 provider to authenticated browser DASH without adding a second player stack. The control registers only browser device sessions, binds persisted QoE to the exact HLS or DASH protocol, and emits aphrodite.browser-hls.v1 or aphrodite.browser-dash.v1 runtime proof accordingly. The SQL reservation and execution binding independently require device_type = 'browser'; the real PostgreSQL gate rejects a TV session even when its publication, session, client instance, and protocol otherwise match.
  • @oshun/live-media/browser now selects HLS.js or dash.js from the protocol returned by the authenticated join. Both clients attach the Bearer only after the exact publication-prefix check. DASH uses asynchronous request and response interceptors, omits ambient cookies, permits CORS to the protected media origin, maps HTTP 401/403 before dash.js reduces the response to a generic download error, reports representation/throughput/buffer/live-latency QoE, and destroys the runtime plus credential on every terminal path. The protocol-neutral surface retains the same accessible near-black stage; the HLS class and mount names remain compatibility aliases, not a duplicate UI.
  • The FFmpeg/Chromium gate now generates real H.264/AAC MPEG-TS HLS and fragmented-MP4 DASH and runs eight one-worker cases: decode, repeated durable heartbeat proof, exact-prefix credential containment, malicious cross-publication blocking before disclosure, authorization loss, release, axe conformance, mobile layout, and reduced motion for both protocols. The supervised MediaMTX/PostgreSQL gate commits exact DASH QoE and the DASH runtime proof after reconstruction, denies non-browser registration and another tenant, proves secret non-disclosure, independently decodes protected HLS and DASH, and exercises DASH expiry, reconnect, tamper, leave, and publication revocation.
  • Increment 7g's release evidence includes green shared live-media (179), Aphrodite adapter (164), Viewer (184), and Streaming (98 plus the separately enabled real edge E2E) suites; eight FFmpeg/Chromium Playwright scenarios; strict source, spec, and application typechecks; all four affected lint scopes; four scoped production builds and their declared dependencies; and filtered frozen-lockfile, formatting, and diff validation.
  • Increment 7g is complete at the code and local release-gate boundary. The parent increment 7 and RB.3 checkboxes remain open for native players, immersive rendering, CENC/CBCS and vendor DRM, publisher-client, remote-guest, composition, protected-media viewer/cleanup wiring, remaining client conformance/recovery automation, tenant equivalence, the consolidation guard, and the complete ingest-to-Rail flow.
  • Increment 7h adds the real aphrodite.publisher-client.v1 provider and limits its runtime claim to authenticated browser WHIP. Broadcaster provisioning rotates one short-lived publisher grant and reserves the grant ID as the exact operation ID for one tenant stream, browser client instance, and WebRTC protocol. The application control API and media endpoint remain separate: only the exact secure MediaMTX /whip endpoint receives the memory-only Bearer; plain HTTP is admitted solely for loopback testing.
  • MediaMTX external auth treats a WebRTC OPTIONS request as a credentialed capability probe but does not invent a source identity. The subsequent WHIP POST binds that same active grant to MediaMTX's exact source connection ID and edge. Browser heartbeats persist only monotonic outbound bytes, packets, and encoded frames; success requires positive inbound bytes independently observed on that same connected edge row. The provider emits separate client-runtime and edge-observation proofs plus a client-session artifact without receiving or persisting the Bearer, SDP, ICE addresses, or device details.
  • Migration 00018_live_media_publisher_client adds a forced-RLS operation ledger with an exact composite grant/resource foreign key, semantic idempotency, one active publisher operation per stream, database-clock expiry, expiring reclaimable execution leases, immutable success evidence, and repeat-safe release. Unknown-operation deletion is checked before grant revocation, and storage conditionally revokes only the operation's exact grant ID. A valid-but-unrelated or superseded operation therefore cannot invalidate a newer live grant. Release durably fences the requested operation.
  • @oshun/live-media/browser negotiates send-only audio/video through WHIP, validates the returned session location inside the same endpoint boundary, samples real outbound WebRTC statistics, rejects counter regression, and reports publishing only after the exact durable edge/client proof. Stop and every failed-start path attempt WHIP DELETE, peer/media shutdown, and durable release; combined cleanup failures remain explicit TEARDOWN_FAILED errors.
  • Unit, SQL migration, route, provider, and store coverage proves exact binding, monotonic evidence, connection replacement rejection, no edge-free success, restart replay, unknown-operation safety, lease fencing, tenant denial, and teardown aggregation. The digest-pinned MediaMTX/PostgreSQL gate applies migration 00018 around the existing real SRT publisher, reconciles positive edge ingress, reconstructs the provider for exact replay, inspects secret-free SQL, denies another tenant, and releases all resources. The separate real MediaMTX/Chromium gate distinguishes the WebRTC OPTIONS probe from the WHIP source ID, publishes real encoded video, validates Bearer containment and durable readiness, and exercises authorization and failed-start cleanup alongside the existing FFmpeg-backed HLS/DASH player scenarios.
  • Increment 7h's release evidence includes green shared live-media, Aphrodite adapter, database/migration, Broadcaster, and Streaming suites; the separately enabled real edge E2E; ten one-worker FFmpeg/Chromium Playwright scenarios; strict source, spec, and application typechecks; all five affected lint scopes; five scoped production builds; Prisma, filtered frozen-lockfile, formatting, and diff validation.
  • Increment 7h is complete at the code and local release-gate boundary. The parent increment 7 and RB.3 checkboxes remain open for native publisher and player clients, immersive rendering, CENC/CBCS and vendor DRM, remote-guest, composition, protected-media viewer/cleanup wiring, remaining client conformance/recovery automation, Veritas/V3/Rail tenant equivalence, the consolidation guard, and the complete ingest-to-Rail flow.
  • Increment 7i adds an explicit browser/native runtime discriminator to the player and publisher contracts, provider identities, operation fingerprints, and SQL reconstruction boundaries. Migration 00019_live_media_native_clients backfills the existing browser operations, makes the runtime columns mandatory, and constrains native publisher operations to RTMP or SRT while retaining the protocol-specific provider checks. Session-device compatibility is enforced before a player operation can be registered, and publisher provisioning rejects a runtime/protocol mismatch before rotating the active grant.
  • Broadcaster can now provision native SRT publishers. The response separates a credential-free SRT resource URL and username from the optional encryption secret, sets no-store, and requires a 10–79-character printable ASCII AES-256 passphrase whenever the endpoint is not loopback. Clear SRT therefore exists only for local integration. The native TypeScript wrapper passes the operation to an isolated Rust executable over standard input; its FFmpeg child receives no publisher credential or passphrase, and MPEG-TS is sent by an in-process, unsafe-code-denying pure-Rust SRT implementation advertising protocol version 1.4.4. Measured send counters must still be corroborated by positive MediaMTX ingress on the exact durable operation before readiness.
  • @oshun/live-media/native now supplies a Linux-native HLS/DASH playback component. A memory-only exact-publication-prefix loopback proxy holds the Bearer and gives FFmpeg or ffplay only a one-time local capability. It constrains manifest redirects and every fetch-bearing HLS/DASH reference, filters forwarded headers, streams media without buffering whole segments, bounds redacted diagnostics, and clears its credential buffer during teardown. Actual FFmpeg decode produces the QoE heartbeat evidence; the same proxy also supports an ffplay render session. External DASH XML namespace and schema identifiers remain metadata rather than being rewritten as playable media.
  • Increment 7i's release evidence includes green shared live-media, Aphrodite adapter, database/migration, Broadcaster, Viewer, and Streaming suites; a real encrypted cross-implementation SRT socket test; ten one-worker FFmpeg/Chromium Playwright scenarios; strict Rust/TypeScript checks; all six affected lint scopes; six scoped production builds; and Prisma, filtered frozen-lockfile, formatting, and diff validation. The digest-pinned MediaMTX/PostgreSQL edge gate publishes real H.264/AAC MPEG-TS through the Rust SRT client, observes edge ingress, reconstructs and replays the durable publisher operation, decodes protected HLS and DASH through the credential proxy, persists measured QoE, renders HLS with ffplay under Xvfb, and requires non-black captured pixels. The claim is a reusable Linux native execution component for application-shell integration, not a complete mobile application or Tauri UI.
  • Increment 7i is complete at the code and local release-gate boundary. The parent increment 7 and RB.3 checkboxes remain open for immersive rendering, CENC/CBCS and vendor DRM, remote-guest, composition, protected-media viewer/cleanup wiring, remaining client conformance/recovery automation, Veritas/V3/Rail tenant equivalence, the consolidation guard, and the complete ingest-to-Rail flow.
  • Increment 7j replaces the public process-local VR simulation with a fail-closed retirement gateway and adds the first real bounded immersive client path to the shared organ. @oshun/live-media/browser projects decoded protected media through WebGL for equirectangular 180°/360° flat/cardboard presentation, renders both cardboard eyes from mono/SBS/top-bottom sources, accepts pointer, keyboard, or permission-backed device orientation, and uses a Web Audio analyser plus HRTF/stereo panning. Success requires positive decoded/rendered/audio evidence, non-black readback, distinct initial/oriented frame hashes, and bounded orientation counts. Cubemap/EAC, ambisonics, native immersive clients, and WebXR without a real XR session/frame loop fail closed.
  • Aphrodite Viewer now exposes authenticated, no-store immersive register/evidence/release routes under the existing viewer lease. The aphrodite.immersive.v1 control derives its operation identity and all bindings from the exact active succeeded browser player; it never accepts a caller-authored publication, player grant, or provider reference. Migration 00020_live_media_immersive_sessions adds exact player/publication/viewer foreign keys, one active operation per viewer session, forced RLS, database-clock lifecycle and worker leases, immutable bounded evidence, restart replay, reclaim, stale-writer fencing, and explicit release. Durable rows exclude the media Bearer, URLs, raw poses, gaze, location, and headset identifiers.
  • Increment 7j's browser release evidence uses generated 1920×960 H.264/AAC stereo HLS and DASH. Single-worker Chromium automation proves real decoded media, WebGL non-black pixels in two distinct eye buffers, view changes from actual CDP device orientation and pointer input while the source is paused, positive Web Audio samples, exact origin/grant containment, axe, mobile, reduced motion, privacy, and ordered immersive/player teardown. The digest-pinned MediaMTX/PostgreSQL gate applies migration 00020, inspects durable proof/secret absence, reconstructs the adapter for replay, recovers an expired execution lease, rejects the stale fence, denies a second tenant, releases on reconnect, and tears down explicitly.
  • Increment 7j is complete at the code and local release-gate boundary. The parent increment 7 and RB.3 checkboxes remain open for physical headset/WebXR/native immersive runtimes, capture/stitching and broader projection/audio formats, CENC/CBCS and vendor DRM, remote-guest, composition, protected-media cleanup wiring, Veritas/V3/Rail tenant equivalence, the consolidation guard, and the complete ingest-to-Rail flow.
  • Increment 7k retires the unsafe legacy remote-guest network authority and installs the shared, strict one-host/one-guest browser path described above. Aphrodite Broadcaster remains a tenant adapter: it owns authentication, exact-stream authorization, no-store HTTP composition, and the single-node WebSocket gateway, while @oshun/live-media owns the portable contracts, signaling hub, browser peer runtime, bounded evidence, and accessible studio surface. The forced-RLS adapter owns durable one-use capability digests, database-clock lifecycle, reciprocal evidence, replay, fencing, and release.
  • Increment 7k's release evidence includes green shared live-media (222), Aphrodite adapter (179), Broadcaster (83), legacy compatibility (6), and migration (3) unit suites; package/spec typechecks; all five affected lint scopes; shared, adapter, compatibility, and Broadcaster production builds; two single-worker Chromium desktop/mobile scenarios; and the supervised real PostgreSQL/MediaMTX integration. The browser gate proves actual reciprocal media and matching SSRC evidence across two browser contexts. The database gate proves one-use/rotation semantics, restart replay, forced RLS, database-clock expiry, lease recovery/fencing, durable secret/signaling non-disclosure, release, and teardown.
  • Increment 7k is complete at the code and local release-gate boundary. Parent increment 7 and RB.3 remain open for SFU/TURN/multi-node or native remote-guest expansion if product requirements demand it, composition, CENC/CBCS and vendor DRM, protected-media cleanup wiring, broader immersive runtimes, Veritas/V3/Rail tenant equivalence, and the complete ingest-to-Rail flow.
  • Increment 7l adds the first real composition provider and deliberately bounds it to browser execution. @oshun/live-media/browser owns the portable Canvas 2D/Web Audio compositor, exact one-to-four-source contract, deterministic single/grid/two-source picture-in-picture layouts, 640–1920-wide 16:9 output at 15–60 fps, optional audio mixing, derived-stream capture, existing WHIP publication, and accessible full-stage surface. Caller-owned source tracks remain caller-owned during teardown. Custom layouts, scene switching and transitions, GPU/OBS/native composition, SFU/MCU mixing, and multi-node orchestration are explicit non-claims.
  • Aphrodite remains a thin tenant control plane. Broadcaster's authenticated, no-store register/evidence/release routes accept only bounded identifiers, output declarations, changed/non-black frame counts, source-region SHA-256 samples, and aggregate audio proof. aphrodite.composition.v1 derives the exact tenant/stream/grant/client binding and succeeds only after the linked browser/WebRTC publisher has succeeded and its exact MediaMTX edge connection is connected with positive ingress. Raw pixels, raw audio, source media, Bearers, SDP, and ICE never enter the durable operation. Publisher teardown cascades composition release.
  • Migration 00022_live_media_compositions installs the composite grant/publisher/resource-bound ledger with forced RLS, database-clock lifecycle, one active composition per publisher, semantic replay, reclaimable leases, stale-worker fencing, immutable proof, and repeat-safe release. The single-worker Chromium suite proves two independently changing Canvas sources, distinct non-black output regions, real oscillator evidence, real WHIP/MediaMTX RTP, exact durable binding, axe, keyboard, mobile, reduced-motion, denial, privacy, and ownership-correct teardown. The supervised PostgreSQL/MediaMTX gate applies the migration and proves exact publisher/edge joins, restart replay without attempt inflation, database-clock abandoned-lease recovery, stale-fence rejection, second-tenant denial, durable secret/raw-media absence, repeat-safe release, browser WHIP cleanup, and disconnected-edge reconciliation. All affected unit, integration, strict typecheck, lint, build, frozen-lockfile, and the complete 17-scenario browser suite pass.
  • Increment 7l is complete at the code and local release-gate boundary. Parent increment 7 and RB.3 remain open for broader composition runtimes if product requirements demand them, SFU/TURN/multi-node or native remote guests, CENC/CBCS and vendor DRM, broader immersive runtimes, Veritas/V3/Rail tenant equivalence, and the complete ingest-to-Rail flow.
  • Increment 7m completes the bounded AES-128 protected-playback and destructive cleanup path without claiming CENC/CBCS or a vendor DRM/CDM stack. Playback grant requests now carry the viewer-selected HLS/DASH protocol. A forced-RLS SQL view selects only the newest active, succeeded encryption operation for the exact ready source publication. HLS grants retain the compatible signed-grant envelope while binding an immutable operation prefix, exact HLS manifest ledger, virtual key object, operation ID, and external key URI; DASH deliberately continues to issue only the clear source grant.
  • Browser HLS.js authorizes requests only inside that protected ledger or at the exact signed key URI, including its query, and attaches the memory-only Bearer only after the check. The native loopback proxy rewrites that one key URI to a credential-free local capability and performs the upstream key request itself, keeping the Bearer out of child arguments. Aphrodite Streaming exposes the public /media-origin/segment-keys/:operationId/key boundary. It revalidates the active viewer lease, ready source publication, active protected operation, exact virtual key object, and current custody before recovering exactly 16 bytes. Missing, wrong, stale, releasing, and released requests all return an empty 401; successful responses are no-store, fixed-length octet streams and the recovered control buffer is zeroed after the response owns a copy.
  • Migration 00023_live_media_protected_playback_cleanup adds an activereleasingreleased state machine, database-clock release lease, durable exact object plan, release timestamps, custody digest, and partial active protected-publication index. The provider verifies its immutable descriptor, persists the plan and fences delivery before deletion, idempotently removes only those protected objects, and atomically shreds wrapped custody after deletion succeeds. A crashed cleaner can reclaim the expired lease without changing the plan; a completed release replays the original database time and the original encryption request cannot resurrect its objects. Source publication objects remain untouched.
  • Increment 7m's release evidence includes green shared live-media (229), Aphrodite adapter (187), database/migration (243), Viewer (191), and Streaming (108, with the separately enabled real edge E2E also green) suites; 10 focused single-worker browser-player scenarios; strict source/application typechecks; targeted lint; Prisma validation; Streaming and Viewer production bundles; formatting; and diff validation. Browser automation generates and decodes real AES-128 H.264/AAC HLS through the exact signed key URI and proves a sibling URI is blocked before Bearer disclosure. The supervised PostgreSQL/SoftHSM/FFmpeg/native gate applies migration 00023, reconstructs storage and HSM custody, decodes the protected HLS through the public key route, verifies the 16-byte key response, then proves immediate manifest/key denial, exact protected-object deletion, source preservation, custody shredding, repeat-safe release, and replay rejection. The gate now streams its migration batch over psql stdin so future schema growth is not bounded by the host's single-argument size limit.
  • Increment 7m is complete at the code and local release-gate boundary. Parent increment 7 and RB.3 remain open for CENC/CBCS and vendor DRM/CDM licensing, broader optional provider/client runtimes where product requirements demand them, Veritas/V3/Rail tenant equivalence, and the complete ingest-to-Rail flow.
  • Increment 8a starts tenant onboarding at the missing identity boundary. @oshun/live-media now owns a strict, immutable, idempotent registry between its canonical tenant/resource UUID and a product-owned external identity. Registration requires the existing stream-create capability; reads and reverse resolution require stream-operate and are tenant-authorized before store access. The memory store and tenant-fixed PostgreSQL adapter reject both resource-side and external-identity conflicts. The registry deliberately has no second stream lifecycle: grants, publications, sessions, and product stream state remain the authorities for their own revocation and teardown.
  • Migration 00024_live_media_tenant_resource_registry creates the forced-RLS registry, backfills canonical Aphrodite streams and any already-deployed tenant-tagged substrate rows, normalizes the early operational-event stream UUID to the shared TEXT contract, and replaces all 13 root shared-ledger one-column streams(id) foreign keys with composite (tenant_id, stream_id) references. The Aphrodite-owned chat-filter configuration remains directly product-bound. New Aphrodite publisher-grant issuance idempotently registers its exact stream UUID before the durable grant write.
  • Increment 8a's gated digest-pinned PostgreSQL test applies the complete 0000500024 chain and uses one identical substrate stream UUID across Aphrodite, Veritas, V3 Stage, and V10 Rail. It proves Aphrodite backfill, independent registration for the other three tenants without counterfeit Aphrodite stream rows, durable grant issuance and post-restart authentication, reverse mapping resolution, forced-RLS row visibility, mapping-conflict rejection, an unregistered-resource composite-FK failure, and the live constraint catalog's 13 composite references with no remaining shared-ledger reference to streams. The full shared live-media (232), Aphrodite adapter (190 plus the separately enabled PostgreSQL gate), database (246), and Aphrodite Streaming (108) suites pass, as do focused lint, source and database-spec typechecks, library builds, Prisma validation, formatting, and diff validation. Existing whole-spec typecheck debt outside this change remains in older protected-playback/immersive fixtures and the Streaming E2E tsconfig boundary; the new registry sources and tests report no diagnostics.
  • Increment 8a is the SQL identity and credential-equivalence prerequisite, not completion of tenant equivalence. No Veritas/V3/Rail production adapter or Rail player path is claimed yet; the broader optional-provider scopes, full four-tenant behavior suite, and supervised ingest-to-Rail flow remain open.
  • Increment 8b removes the remaining Aphrodite-only naming and adapter-ID assumptions from the canonical shared browser and native client surface. Playback, publisher, immersive, remote-guest, and composition descriptors now accept only their kind-correct {tenant}.*.vN adapter identity. Every browser control binds the adapter returned by its initial register or provision call and rejects an adapter swap during heartbeat, evidence, invite exchange, or release. Canonical functions, sessions, surfaces, mounts, and DOM roots use live-media names. The previous Aphrodite* exports remain deprecated exact aliases, so Aphrodite still executes the same tenant-#1 implementation rather than a compatibility fork.
  • Contract coverage exercises Veritas playback and immersive identities plus V3 Stage publisher, composition, remote-guest, and native-publisher identities; native playback also accepts a non-Aphrodite tenant. Negative cases reject wrong-kind IDs and mid-lifecycle adapter replacement, while exact-identity assertions prove the old Aphrodite exports alias the canonical functions and classes. The full shared live-media suite passes 243 tests, the Aphrodite adapter passes 190 with one intentional skip, Broadcaster passes 86, Viewer passes 191, and Streaming passes 108 with one intentional skip. All 19 single-worker Chromium scenarios, all 14 V10 Phase A/consolidation cases, shared source and spec typing, affected adapter/application typechecks, package lint, and the dependency-inclusive shared production build pass.
  • Increment 8b proves portable client contracts and Aphrodite compatibility; it does not create production Veritas/V3/Rail control planes, provider stores, or a Rail playback lane. Those tenant compositions, broader optional runtimes, and the supervised ingest-to-Rail equivalence gate remain open.
  • Increment 8c extracts the media-pipeline command/query façade itself into the canonical shared organ. LiveMediaTenantPipelineJobControl accepts a deployment-supplied canonical job service, fixes one validated tenant plus its operate/manage principals at construction, and exposes no caller-authored tenant or authority field. Aphrodite's previous control is now an exact thin tenant-#1 subclass, with an explicit full-result equivalence test across enqueue, semantic replay, get, list, and cancel. Veritas supplies the first production-shaped tenant-#2 subclass from its existing Rail channel package; runtime-cast Aphrodite options cannot replace its veritas tenant or principal prefix.
  • Increment 8c coverage runs Aphrodite and Veritas controls over one canonical pipeline with the same stream UUID and idempotency key, proving independent durable records plus cross-tenant get/list isolation, semantic replay, management authority, invalid-configuration rejection, and exact Veritas request scopes. The final gates pass 246 shared live-media tests, 191 Aphrodite adapter tests with one intentional skip, 86 Veritas channel tests, all 14 V10 Phase A/consolidation tests, source and spec typechecks, targeted lint, dependency-inclusive shared/adapter builds, frozen-lockfile validation, formatting, and diff checks.
  • Increment 8c is a real reusable control-plane composition, not a media-byte completion claim. The Veritas rehearsal ingest port is not yet backed by the shared publisher/transcode/publication/viewer path, the V10 first-party-live gate remains not_configured, and V3 Stage plus the Rail playback lane still need production tenant compositions and the supervised ingest-to-playback equivalence gate.
  • Increment 8d moves the complete PostgreSQL media-pipeline job state machine into the canonical server-only substrate as SqlLiveMediaPipelineJobStore. The shared store accepts an injected canonical database transaction port and one immutable tenant while preserving forced transaction-local RLS, advisory idempotency serialization, SKIP LOCKED claims, database-clock scheduling and leases, lease-token fencing, cancellation, retry recovery, and terminal settlement. Product-specific configuration and error translation remain thin wrapper responsibilities; Aphrodite's existing constructor and exact TENANT_MISMATCH error are preserved by a 37-line tenant-#1 subclass.
  • Increment 8d coverage composes Veritas's tenant-fixed control through the shared service and shared SQL store, proving exact tenant/RLS/advisory/insert bindings, and proves Aphrodite cross-tenant enqueue and list rejection before a transaction begins. The final gates pass 248 shared live-media tests, 191 Aphrodite adapter tests with one intentional skip, 86 Veritas channel tests, all 14 V10 Phase A/consolidation tests, five source/spec/standalone typechecks, targeted shared/adapter lint, dependency-inclusive shared/adapter builds, frozen-lockfile validation, and the digest-pinned real PostgreSQL plus MediaMTX persistence E2E.
  • Increment 8d establishes reusable durable control-plane persistence; it does not compose a deployed Veritas database adapter or move Veritas ingest bytes through publication into an HLS viewer. The V10 first-party-live gate remains not_configured, and V3 Stage/Rail production compositions plus the supervised ingest-to-playback equivalence gate remain open.
  • Increment 8e moves the durable tenant/resource identity map and publisher credential authority into the canonical server-only substrate as SqlLiveMediaResourceRegistryStore and SqlLiveMediaPublisherGrantStore. Both receive an injected database transaction port, validate and fix one tenant at construction, establish transaction-local forced-RLS context, and reject cross-tenant access before SQL. The registry preserves database-time immutable registration, one tenant-wide advisory lock, exact replay, and crossed-uniqueness conflict rejection. The grant store preserves per-resource advisory serialization, atomic prior-generation revocation, monotonic generation, digest-only lookup, and expected-grant revocation. Product-specific error translation remains an option; Aphrodite's prior constructors and exact TENANT_MISMATCH errors are preserved by thin tenant-#1 subclasses.
  • Increment 8e coverage issues and authenticates a deterministic Veritas grant through the shared service and shared SQL port, proves exact RLS/advisory/ insert/digest bindings, registry replay/conflict/get/resolve behavior, and pre-transaction tenant rejection. The existing digest-pinned PostgreSQL gate now directly instantiates the two canonical stores for Aphrodite, Veritas, V3 Stage, and V10 Rail; it maps the same stream UUID, issues isolated grants, proves the full composite-FK catalog and forced-RLS visibility, reconstructs both stores, reauthenticates every secret, rejects an unregistered grant, and tears down. The full affected suites pass 254 shared live-media tests and 191 Aphrodite adapter tests with one intentional skip, plus 86 Veritas channel tests and all 14 V10 Phase A/consolidation tests. Four source/spec typechecks, Nx-aware shared/adapter lint, dependency-inclusive shared/adapter builds, formatting, diff checks, and the digest-pinned real PostgreSQL gate pass.
  • Increment 8e removes the Aphrodite-named persistence dependency from the four-tenant identity/credential E2E, but it is not a deployed Veritas/V3/Rail publisher composition. Veritas rehearsal bytes still do not traverse shared edge, publication, viewer, and Rail playback, so first-party-live remains not_configured and the final tenant-equivalence gate remains open.
  • Increment 8f moves the durable publisher-edge and media-publication state machines into the canonical server-only substrate as SqlLiveMediaPublisherEdgeSessionStore and SqlLiveMediaPublicationStore. Both accept the canonical database transaction port, fix one validated tenant, establish transaction-local forced-RLS context, and reject cross-tenant work before SQL. The edge store preserves resource-local advisory serialization, exact-connection refresh without revision inflation, atomic replacement, stale-disconnect rejection, and connected-session listing. The publication store preserves publication-local advisory serialization, exact-prefix reservation, durable source metadata, compare-and-swap ready/failed/revoked transitions, and exact terminal replay. Aphrodite's prior constructors, default database, and legacy mismatch messages remain thin tenant-#1 wrappers rather than duplicate state machines.
  • Increment 8f coverage exercises the canonical stores directly as Veritas, including exact RLS, advisory-lock, SQL-value, refresh, stale-connection, transition-replay, revocation, prefix, and pre-transaction tenant behavior. Aphrodite coverage additionally proves the exact legacy error classes and messages. The digest-pinned PostgreSQL gate now creates the same stream UUID for Aphrodite, Veritas, V3 Stage, and V10 Rail, then uses the canonical stores to issue a grant, record an SRT edge connection, and reserve an isolated publication for every tenant. Forced-RLS queries expose exactly one row from each authority per tenant; reconstructed store instances reauthenticate each grant and recover the exact connected edge and publishing reservation. The full gates pass 260 shared live-media tests, 192 passing Aphrodite adapter tests with one intentional skip, 86 Veritas channel tests, and all 14 V10 Phase A/consolidation tests, plus four strict source/spec typechecks, Nx-aware shared/adapter lint, dependency-inclusive shared/adapter builds, and the real PostgreSQL gate.
  • Increment 8f advances the durable media-byte-path boundary, but the gate does not send real Veritas/V3/Rail bytes through MediaMTX or produce a ready HLS/DASH object ledger. A deployed non-Aphrodite worker/viewer composition, Rail playback, the final tenant-equivalence gate, and the first-party-live flip remain open.
  • Increment 8g moves the complete durable viewer-session, QoE, and presence state machine into the canonical server-only substrate as SqlLiveMediaViewerSessionStore. It fixes one validated tenant, establishes transaction-local forced-RLS context, serializes a resource with an advisory lock, takes lifecycle time from PostgreSQL, expires leases and entitlements before mutations, preserves join/refresh/reconnect idempotency, fences heartbeat/leave by the digest-only lease, commits ordered lifecycle events, rejects conflicting or non-monotonic QoE, and derives exact active-session and unique-viewer presence inside the same transaction.
  • The former hard dependency on Aphrodite's streams table is now an optional transaction-local presence-projection port. The canonical default owns no product table or counter; Aphrodite's thin tenant-#1 wrapper retains its default database, exact legacy mismatch error, and exact current/peak/total viewer projection. The existing eight Aphrodite SQL-behavior tests run through that wrapper unchanged, while direct Veritas coverage proves RLS/locking, exact insert values, projection delegation, QoE persistence, leave replay, database-time active authority, absence of a product-table mutation, and pre-transaction tenant rejection.
  • The digest-pinned PostgreSQL gate now creates an isolated active viewer lease and presence snapshot alongside the resource, grant, edge, and publication rows for Aphrodite, Veritas, V3 Stage, and V10 Rail. Forced-RLS queries expose exactly one viewer row per current tenant; reconstructed canonical stores recover each exact active session and a one-session/one-viewer presence snapshot. The fixture's only streams row remains the migration-managed Aphrodite product identity, and the canonical viewer store succeeds although that minimal product table has no viewer-counter columns. Final gates pass 264 shared live-media tests, 192 passing Aphrodite adapter tests with one intentional skip, 86 Veritas channel tests, and all 14 V10 Phase A/consolidation tests, plus four strict source/spec typechecks, Nx-aware shared/adapter lint, dependency-inclusive shared/adapter builds, formatting, diff checks, and the real PostgreSQL gate.
  • Increment 8g establishes reusable durable viewer authority and presence, not completed playback. The four publications remain in publishing; no real non-Aphrodite bytes, ready HLS/DASH ledger, playback grant, decoded player, or Rail lane is claimed. Deployed Veritas/V3/Rail worker/viewer compositions, the final tenant-equivalence gate, and first-party-live remain open.
  • Increment 8h moves the complete durable live-chat persistence state machine into the canonical server-only substrate as SqlLiveMediaChatStore. It fixes one validated tenant, establishes transaction-local forced-RLS context, takes lifecycle time from PostgreSQL, and serializes resource and ordered-event mutations with advisory locks. It preserves viewer-session- and entitlement-bound membership, digest-only rotating leases, join/heartbeat/ reconnect/leave/expiry/revocation, database-derived presence, bounded per-member rate limits, immutable message idempotency, moderation-bound text, server messages, deletion, room clearing, history, and the durable ordered event outbox/poll cursor.
  • Aphrodite's former store is now a thin tenant-#1 subclass that retains its default database, constructor, and exact legacy mismatch error. Its product-owned filter and policy configuration still supplies moderation decisions; it no longer owns a second SQL chat state machine. Four direct Veritas tests prove exact RLS and lock context, membership/presence/event SQL, moderated message replay without duplicate rate or event writes, database-time reads, durable event polling, and pre-transaction tenant rejection. All ten existing Aphrodite SQL behavior tests pass through the wrapper with exact error compatibility.
  • The digest-pinned four-tenant PostgreSQL gate now joins an isolated active membership and publishes a system message for Aphrodite, Veritas, V3 Stage, and V10 Rail. Forced-RLS queries expose exactly one membership, one message, and two ordered events for the current tenant. Reconstructed stores recover the exact digest-authenticated message history, one-member/one-participant presence, and ordered membership_joined then message_created cursor after database restart. The dedicated live-chat PostgreSQL concurrency/replay/ expiry/moderation/recovery gate also passes. Final gates pass 268 shared live-media tests, 192 passing Aphrodite adapter tests with one intentional skip, 59 passing Aphrodite chat tests with one intentional skip, 86 Veritas channel tests, and all 14 V10 Phase A/consolidation tests, plus five strict source/spec typechecks, shared/adapter/chat lint, dependency-inclusive shared/adapter/chat builds, formatting, diff checks, and both real PostgreSQL gates.
  • Increment 8h establishes reusable durable chat authority, not a completed non-Aphrodite broadcast. The four publications remain in publishing; no real Veritas/V3/Rail bytes, ready HLS/DASH ledger, playback grant, decoded player, or Rail lane is claimed. Operational chat hooks/telemetry remain Aphrodite-named, and deployed non-Aphrodite composition, final tenant equivalence, and first-party-live remain open.
  • Increment 8i moves the complete durable operational event ledger and hook outbox into the canonical server-only substrate as SqlLiveMediaOperationalTelemetryStore. It fixes one validated tenant, establishes transaction-local forced-RLS context, atomically persists an event and its selected configured deliveries, and preserves advisory-lock semantic idempotency, conflict fingerprints, a monotonic database sequence, exact tenant/resource queries, database-clock SKIP LOCKED claim and reclaim, final-attempt-expiry dead-lettering, and lease-fenced completion, failure, and retry transitions.
  • Aphrodite's former telemetry store is now a thin tenant-#1 subclass retaining its default database, positional constructor, and exact legacy mismatch error. Aphrodite's notification/moderation hook registrations and providers remain product-owned, but it no longer owns a second SQL state machine. The extraction also removes stale UUID stream casts left after migration 00024 normalized the registry stream key to text. Five direct Veritas tests prove exact RLS, idempotency, query, claim, lease, and pre-SQL tenant behavior, including the text-key regression; all five existing Aphrodite SQL-behavior tests pass through the wrapper with exact error compatibility.
  • The digest-pinned four-tenant PostgreSQL gate now commits one isolated publisher-connected event and one pending rail.audit delivery for Aphrodite, Veritas, V3 Stage, and V10 Rail. Forced-RLS queries expose exactly one event and one hook for the current tenant. Reconstructed canonical stores recover the exact event after restart, claim the matching delivery with a fresh lease, and complete it with its provider reference. The dedicated live-chat PostgreSQL gate also proves concurrent hook claiming, retry/dead-letter transitions, bounded body-free hook content, and cross-tenant rejection through the compatibility wrapper. Final gates pass 273 shared live-media tests, 192 passing Aphrodite adapter tests with one intentional skip, 59 passing Aphrodite chat tests with one intentional skip, 86 Veritas channel tests, and all 14 V10 Phase A/consolidation tests, plus five strict source/spec typechecks, shared/adapter/chat lint, dependency-inclusive shared/adapter/chat builds, formatting, diff checks, and both real PostgreSQL gates.
  • Increment 8i establishes reusable durable telemetry and hook authority, not deployed Veritas/V3/Rail hook providers or a completed non-Aphrodite broadcast. The four publications remain in publishing; no real Veritas/V3/Rail bytes, ready HLS/DASH ledger, playback grant, decoded player, Rail lane, final tenant-equivalence gate, or first-party-live flip is claimed.
  • Increment 8j moves the remaining viewer-session, operational-telemetry, and playback-grant authority facades into the canonical substrate as LiveMediaTenantViewerSessionControl, LiveMediaTenantOperationalTelemetryControl, and the server-only LiveMediaTenantPlaybackGrantControl. Each fixes and validates one tenant and principal at construction, mints exact request scopes internally, validates stream/publication identities, and exposes no runtime tenant or capability override. The viewer control preserves join, heartbeat/QoE, leave, active authority, presence, and semantic lifecycle telemetry over the canonical service/store ports. The operational control preserves strict event creation, configured durable hook selection, and idempotent replay. The playback control delegates only an allowed entitlement bound to the exact publication and viewer session.
  • Aphrodite's three prior controls are now constructor-compatible tenant-#1 wrappers over those shared facades. Its default SQL telemetry store, notification/moderation hook registrations, exact principals, viewer timing and random-ID seams, and playback service injection remain unchanged. Direct shared tests exercise V10 Rail viewer/QoE/telemetry and Veritas/V3/Rail grant delegation, same-stream cross-tenant isolation, idempotent hook creation, and invalid fixed authority. Existing Aphrodite operational, protected-playback, and 105-test viewer integration behavior remains green.
  • The digest-pinned four-tenant PostgreSQL gate now enters viewer joins and restart active/presence reads through tenant-fixed viewer controls, and enters operational event/hook writes through tenant-fixed telemetry controls for Aphrodite, Veritas, V3 Stage, and V10 Rail. The existing canonical stores still prove forced-RLS visibility and restart recovery, claim, and completion. Final gates pass 279 shared live-media tests, 192 passing Aphrodite adapter tests with one intentional skip, 59 passing Aphrodite chat tests with one intentional skip, 105 Aphrodite viewer integration tests, 86 Veritas channel tests, and all 14 V10 Phase A/consolidation tests. Eight strict source/spec typechecks, graph-aware shared/adapter lint, dependency-inclusive shared/adapter builds, the direct viewer production bundle, formatting/diff checks, and both real PostgreSQL gates pass.
  • Increment 8j establishes reusable tenant-fixed runtime entry points, not deployed Veritas/V3/Rail viewer, grant, or hook-provider compositions. The four publications remain publishing; no real non-Aphrodite ingest bytes, ready HLS/DASH ledger, issued real playback grant, decoded Rail player, final tenant-equivalence gate, or first-party-live flip is claimed.
  • Increment 8k moves publisher-grant issuance/registration and transcode execution authority behind the canonical server-only LiveMediaTenantPublisherGrantControl and LiveMediaTenantTranscodeExecutionControl. Each validates and fixes one tenant at composition time and exposes no runtime tenant or capability override. The publisher control also fixes the owning product and product-resource mapping, registers that immutable mapping before secret issuance, and binds authenticate/rotate/revoke to the same tenant. The transcode control fixes its worker principal and absolute operator-owned output root, then creates the operate scope, execution identity, exact tenant/resource, and tenant-namespaced file URI internally.
  • Aphrodite's publisher-grant and transcode controls are now thin constructor-compatible tenant-#1 wrappers. They retain the existing SQL defaults, optional injected registry behavior, exact owner mapping, principal, output-root error, clock, and random-ID seams used by streaming, broadcaster, and the MediaMTX release gate. Seven direct canonical tests exercise same-stream Veritas/V3 isolation, product mapping, V10 Rail management authority, invalid fixed configuration, and exact Veritas/V3/Rail transcode scope/output ownership. All existing Aphrodite compatibility, streaming, and broadcaster test targets remain green.
  • The digest-pinned four-tenant PostgreSQL gate now enters resource registration plus grant issuance and restart authentication through a tenant-fixed publisher control for Aphrodite, Veritas, V3 Stage, and V10 Rail. It still proves forced-RLS visibility, immutable mapping conflict, unregistered-resource foreign-key rejection, and recovery of every downstream authority. The digest-pinned MediaMTX/PostgreSQL gate also passes through Aphrodite's thin transcode wrapper and its real worker/output path. Final gates pass 286 shared live-media tests, 192 passing Aphrodite adapter tests with one intentional skip, the full Aphrodite streaming and broadcaster test targets, 86 Veritas channel tests, and all 14 V10 Phase A/consolidation tests. Six strict source/spec/consumer typechecks, graph-aware shared/adapter lint, dependency-inclusive shared/adapter builds, direct streaming/broadcaster production bundles, formatting/diff checks, and both real container gates pass.
  • Increment 8k completes reusable tenant-fixed publisher credential and transcode execution entry points; it does not deploy Veritas/V3/Rail ingest or workers. The four synthetic publications remain publishing; real non-Aphrodite bytes, ready HLS/DASH ledger state, issued playback grants, decoded Rail playback, deployed tenant compositions, final tenant equivalence, and the first-party-live flip remain open.
  • Increment 8l moves publisher-edge callback and reconciliation authority behind the canonical LiveMediaTenantPublisherEdgeControl. The control validates and fixes one tenant and edge principal at construction, parses every stream identity, creates operate scopes internally, and binds connect, disconnect, provider snapshot validation, and authoritative reconciliation to that tenant. Its optional telemetry writer preserves the established stable publisher/live and disconnected/ended event identities from the durable edge connection and revision.
  • Aphrodite's former publisher-edge implementation is now an exact thin tenant-#1 constructor wrapper. It retains the default forced-RLS SQL store, default operational telemetry, injected-service telemetry opt-out, principal, clock, request-ID seam, routes, and errors while inheriting all edge behavior from the shared control. Direct canonical tests prove same-stream Veritas/V3 isolation, duplicate telemetry identity, V10 Rail authoritative reconciliation, and invalid fixed authority. The four-tenant PostgreSQL gate now enters every durable publisher observation through a tenant-fixed edge control rather than calling the SQL store mutation directly.
  • Increment 8l gates pass all 289 shared live-media tests and 192 passing Aphrodite adapter tests with one intentional skip, including the unchanged publisher-edge store and operational-emission oracles. The full Aphrodite Streaming target, 86 Veritas channel tests, and all 14 V10 Phase A/ consolidation tests pass. Six strict shared/adapter/Streaming/Veritas typechecks, graph-aware shared/adapter lint, dependency-inclusive shared and adapter builds, the direct Streaming production bundle, formatting and diff checks, the digest-pinned four-tenant PostgreSQL gate, and the digest-pinned real MediaMTX/PostgreSQL gate also pass.
  • Increment 8l supplies a reusable edge-runtime entry point, not a deployed Veritas/V3/Rail edge or complete broadcast composition. The synthetic publications remain publishing; real non-Aphrodite ingress bytes, ready HLS/DASH, playback grants, decoded Rail playback, tenant equivalence, and the first-party-live flip remain open.
  • Increment 8m moves the remaining media-publication command/query authority behind the canonical LiveMediaTenantMediaPublicationControl. The control validates and fixes one tenant plus its worker, reader, and manager principals at construction, validates every stream/publication identity, generates request and publication identities internally, and binds publish, get, and revoke to that tenant. Its narrow operations port lets product compositions retain the canonical publication service without exposing a runtime tenant, resource, timestamp, or capability override.
  • AphroditeMediaPublicationControl now inherits publish/get/revoke behavior from that shared control as a tenant-#1 wrapper. Its existing constructor, deterministic clock/random seams, public method shapes, and legacy issuePlaybackGrant behavior remain compatible; that grant method is marked deprecated and retained only as a transition shim. The current protected viewer path continues to use the separate protocol-aware AphroditePlaybackGrantControl, so the extraction does not create or loosen a second modern grant authority.
  • Three direct canonical tests drive a real in-process MediaPublicationService and prove same-stream/same-publication-ID Veritas/V3 isolation through ready object ledgers and tenant-local revocation, fixed V10 Rail scopes and caller authority replacement, and invalid fixed-authority rejection. Increment 8m gates pass all 292 shared live-media tests and 192 passing Aphrodite adapter tests with one intentional skip, including the unchanged Aphrodite publication/grant compatibility oracle. The full Aphrodite Streaming target, 86 Veritas channel tests, and all 14 V10 Phase A/consolidation tests pass. Six strict shared/adapter/Streaming/Veritas typechecks, graph-aware shared/adapter lint, dependency-inclusive shared and adapter builds, the direct Streaming production bundle, formatting and diff checks, the digest-pinned four-tenant PostgreSQL gate, and the digest-pinned real MediaMTX/PostgreSQL publication gate also pass.
  • Increment 8m supplies reusable tenant-fixed publication orchestration, not a deployed Veritas/V3/Rail publication worker or a complete non-Aphrodite broadcast. Its multi-tenant unit evidence uses deterministic packaged-object metadata rather than real non-Aphrodite media bytes. Ready non-Aphrodite HLS/DASH, issued playback grants, decoded Rail playback, deployed tenant compositions, final tenant equivalence, and the first-party-live flip remain open.
  • Increment 8n moves the remaining live-chat command/query authority behind the canonical LiveMediaTenantLiveChatControl. The control validates and fixes one tenant plus its presence, system, payment-service, and fanout principals at construction; validates every stream/session/message/participant identity; creates request scopes internally; and binds join, viewer resolution, heartbeat, leave, moderation, messaging, deletion, clearing, presence, expiry, system/tip publication, and event polling to that tenant. Its operational telemetry projection preserves the established stable event identities and never includes message content.
  • AphroditeLiveChatControl is now a thin tenant-#1 compatibility wrapper. It retains the existing constructor, exact Aphrodite error class/name/codes, SQL-backed participant identity, entitlement and moderator policy, content filter, service tuning, routes, socket runtime, and operational telemetry seams. Five direct canonical tests prove same-stream/session/message-key Veritas/V3 isolation over one store, tenant-local moderation, presence and event cursors, fixed V10 Rail system/tip principals, fixed policy scopes, content-free telemetry, invalid authority rejection, and typed denials. The Aphrodite runtime compatibility test additionally proves the wrapper still emits the exact product error instance.
  • Increment 8n gates pass all 297 shared live-media tests, 192 passing Aphrodite adapter tests with one intentional skip, 60 passing Aphrodite Chat tests with one intentional skip, 86 Veritas channel tests, and all 14 V10 Phase A/ consolidation tests. Six strict shared/adapter/Chat/Veritas source, spec, and consumer typechecks, graph-aware shared/adapter/Chat lint, dependency- inclusive shared/adapter/Chat builds, formatting and diff checks, the dedicated real Chat/PostgreSQL policy-store gate, and the four-tenant durable PostgreSQL registry gate also pass.
  • Increment 8n supplies reusable tenant-fixed chat orchestration, not deployed Veritas/V3/Rail chat policies, socket runtimes, hook providers, or a complete non-Aphrodite broadcast. No real non-Aphrodite chat use or media bytes, ready HLS/DASH ledger, playback grant, decoded Rail playback, final tenant equivalence, or first-party-live flip is claimed.
  • Increment 8o moves content-analysis probe, analyze, and teardown authority behind the canonical LiveMediaTenantContentAnalysisControl. The control validates and fixes one tenant and one adapter ID at construction, validates every principal/stream/publication/object/operation input, creates the exact operate scope and tenant resource internally, and reconstructs the content-analysis request so callers cannot replace tenant, adapter, kind, capability, or resource authority. The shared input schema and operations port keep provider, binding, storage, and advisory-policy composition replaceable without duplicating command authority.
  • AphroditeContentAnalysisControl is now a thin tenant-#1 wrapper fixing aphrodite.content-analysis.v1. It retains the exact constructor, input schema/type exports, timing and request-ID seams, publication binding verifier, advisory policy, provider, forced-RLS queue, worker, and Streaming routes. The compatibility oracle supplies attempted Veritas tenant/adapter options and proves the wrapper still fixes Aphrodite before execution.
  • Three direct canonical tests drive one real LiveMediaOptionalAdapterService with independent in-process Veritas and V3 Stage providers. Equal stream, publication, operation, request, and idempotency identities reach only the fixed tenant/adapter/provider and binding, retain exact operate scopes, and tear down independently. V10 Rail caller-override attempts, unsafe principals, and malformed fixed tenant/adapter configuration fail before operations access.
  • Increment 8o gates pass all 300 shared live-media tests, 192 passing Aphrodite adapter tests with one intentional skip, 108 passing Aphrodite Streaming tests with one intentional real-edge skip, 86 Veritas channel tests, and all 14 V10 Phase A/consolidation tests. Six strict shared/adapter/Streaming/Veritas source, spec, and consumer typechecks, graph-aware shared/adapter/Streaming lint, dependency-inclusive shared (+6), adapter (+13), and Streaming (+14) builds, formatting/diff checks, and the digest-pinned real MediaMTX/ PostgreSQL/FFmpeg content-analysis gate also pass.
  • Increment 8o supplies reusable content-analysis command authority, not a deployed Veritas/V3/Rail analyzer, binding policy, durable queue, worker, or real non-Aphrodite analysis. The real gate remains Aphrodite tenant #1. No non-Aphrodite media bytes, ready HLS/DASH ledger, playback grant, decoded Rail playback, final tenant equivalence, or first-party-live flip is claimed.
  • Increment 8p moves recording admission, query, and worker execution authority behind the canonical LiveMediaTenantRecordingControl and LiveMediaTenantRecordingWorker. Both validate and fix one tenant plus one adapter ID at construction. The control owns the strict input schema, exact operate scope/resource/request, publisher-connection binding check, readiness gate, canonical semantic fingerprint, bounded retry budget, durable queue reservation, and tenant-local operation read. The worker reparses every durable request and rejects a tenant or adapter mismatch before provider execution; its service principal, request identity, clock, and shutdown seam remain composition-owned.
  • AphroditeRecordingControl and AphroditeRecordingWorker are now thin tenant-#1 wrappers fixing aphrodite.recording.v1. They retain their exact constructors, input schema/type exports, forced-RLS record validation and queue, publisher-connection binding verifier, MediaMTX source authority, retention policy, FFmpeg executor, create-only object store, scheduler, routes, timing/ID seams, and cancellation behavior. The legacy aphroditeRecordingFingerprint now delegates to the shared canonical fingerprint. Compatibility tests supply attempted Veritas tenant/adapter and parser overrides and prove Aphrodite remains fixed at admission and worker execution.
  • Three direct canonical tests drive one real LiveMediaOptionalAdapterService with independent in-process Veritas and V3 Stage recording providers and tenant views over one record map. Equal stream, operation, recording, publisher-connection, request, and idempotency identities remain isolated in queue keys, fingerprints, bindings, worker scopes, provider selection, and results. Caller authority overrides, unsafe principals, malformed fixed authority, and mismatched durable work fail before queue mutation or provider execution. The digest-pinned MediaMTX/PostgreSQL/FFmpeg gate now admits the real Aphrodite capture through the thin control and executes it through the thin worker before independently probing the resulting H.264/AAC MP4 and retaining the existing replay, lease-recovery, fencing, tenant-denial, and teardown evidence.
  • Increment 8p gates pass all 303 shared live-media tests, 192 passing Aphrodite adapter tests with one intentional skip, 108 passing Aphrodite Streaming tests with one intentional real-edge skip, 86 Veritas channel tests, and all 14 V10 Phase A/consolidation tests. Six strict shared, adapter, Streaming, and Veritas source, spec, and consumer typechecks; graph-aware shared, adapter, and Streaming lint; dependency-inclusive shared (+6), adapter (+13), and Streaming (+14) builds, formatting/diff checks, and the digest-pinned real MediaMTX/PostgreSQL/FFmpeg recording gate also pass.
  • Increment 8p establishes reusable recording command and worker authority, not deployed Veritas/V3/Rail recording sources, retention policies, durable stores, workers, or real non-Aphrodite capture. Its multi-tenant evidence uses in-process providers; the real gate remains Aphrodite tenant #1. No ready non-Aphrodite HLS/DASH, playback grant, decoded Rail playback, final tenant equivalence, or first-party-live flip is claimed.
  • Increment 8q moves segment-encryption probe/admission/query, protected-key delivery, repeat-safe release, and worker execution authority behind the canonical LiveMediaTenantSegmentEncryptionControl and LiveMediaTenantSegmentEncryptionWorker. Both validate and fix one tenant and adapter ID at construction. The control owns the strict input schema, exact operate scope/resource/request, static-policy and publication-binding checks, readiness gate, canonical semantic fingerprint, bounded retry budget, durable reservation/read, exact active-succeeded-custody key gate, and signed optional- adapter teardown. Every read and worker claim is reparsed and rejected when its operation/resource/tenant/adapter identity or durable fingerprint differs from the fixed composition, before custody recovery or provider execution.
  • AphroditeSegmentEncryptionControl and AphroditeSegmentEncryptionWorker are now thin tenant-#1 wrappers fixing aphrodite.segment-encryption.v1. They retain their exact constructors, input schema/type exports, product error class and codes, forced-RLS operation record parser/queue, static AES-128 policy, PKCS#11 custody, key-delivery and release routes, provider, scheduler, and timing/request-ID seams. The legacy aphroditeSegmentEncryptionFingerprint now delegates to the shared canonical fingerprint. Existing compatibility tests still prove policy-before-binding, exact 128-bit active-custody delivery, releasing/released denial, signed repeat-safe teardown, and tenant-fixed worker scope.
  • Three direct canonical tests drive one real LiveMediaOptionalAdapterService with independent in-process Veritas and V3 Stage providers and tenant views over one record map. Equal stream, publication, operation, request, and idempotency identities remain isolated in queue keys, fingerprints, binding checks, worker scopes, provider selection, results, key URIs/bytes, and teardown. V10 Rail caller-authority overrides, unsafe principals, mismatched policy, malformed fixed authority, cross-tenant durable records, and stale fingerprints fail before queue mutation, custody recovery, or provider access. The digest-pinned MediaMTX/PostgreSQL/SoftHSM/FFmpeg/Chromium gate now admits the real ready Aphrodite HLS publication through the thin control and executes its AES-128 transform through the thin worker before independently decoding H.264/AAC playback. It retains reconstruction replay, exact viewer/key authorization and non-disclosure, sibling denial, lease recovery, stale-writer fencing, RLS tenant denial, source-preserving destructive cleanup, custody shredding, and clean teardown.
  • Increment 8q gates pass all 306 shared live-media tests, 192 passing Aphrodite adapter tests with one intentional skip, 108 passing Aphrodite Streaming tests with one intentional real-edge skip, 86 Veritas channel tests, and all 14 V10 Phase A/consolidation tests. Six strict shared, adapter, Streaming, and Veritas source/spec/consumer typechecks; graph-aware shared, adapter, and Streaming lint; dependency-inclusive shared (+6), adapter (+13), and Streaming (+14) builds; formatting/diff checks; and the supervised real container/media/ browser gate pass.
  • Increment 8q establishes reusable segment-encryption command, key-delivery, release, and worker authority, not deployed Veritas/V3/Rail key policies, custody backends, queues, workers, or real non-Aphrodite encryption. Its multi-tenant evidence uses in-process providers; the real gate remains Aphrodite tenant #1. CENC, CBCS, external vendor DRM/CDM licensing, ready non-Aphrodite HLS/DASH, playback grants, decoded Rail playback, final tenant equivalence, and the first-party-live flip remain open.
  • Increment 8r moves visible-watermark probe/admission/query, repeat-safe release, and worker execution authority behind the canonical LiveMediaTenantWatermarkControl and LiveMediaTenantWatermarkWorker. Both validate and fix one tenant and adapter ID at construction. The control owns the strict input schema, exact operate scope/resource/request, policy-derived profile/payload/key references, publication and viewer binding checks, readiness gate, canonical semantic fingerprint, bounded retry budget, durable reservation/read, and signed optional-adapter teardown. Every returned record and worker claim is reparsed and rejected when its operation, resource, tenant, adapter, or fingerprint differs from the fixed composition, before release or provider execution.
  • AphroditeWatermarkControl and AphroditeWatermarkWorker are now thin tenant-#1 wrappers fixing aphrodite.watermark.v1. They retain their exact constructors, input schema/type exports, Aphrodite operation error class and codes, forced-RLS operation record parser/queue, visible-grid policy, PKCS#11 custody, FFmpeg transformer, binding verifier, routes, scheduler, and timing/request-ID seams. The legacy aphroditeWatermarkFingerprint delegates to the shared canonical fingerprint. Compatibility tests retain policy- derived admission, durable release timestamps, authenticated worker scope, and the exact Aphrodite invalid-release error contract.
  • Three direct canonical tests drive one real LiveMediaOptionalAdapterService with independent in-process Veritas and V3 Stage watermark providers and tenant views over one record map. Equal stream, operation, publication, viewer-session, source-object, request, and idempotency identities remain isolated in queue keys, fingerprints, binding checks, worker scopes, provider selection, results, and teardown. V10 Rail caller-authority overrides, unsafe principals, mismatched policy, malformed fixed authority, cross-tenant durable records, and stale fingerprints fail before queue mutation, release, or provider access. The supervised MediaMTX/PostgreSQL/SoftHSM/FFmpeg gate now admits the real Aphrodite source through the thin control, applies its visible watermark through the thin worker, and performs destructive release through the reconstructed control. It retains real 64-cell extraction and luma-PSNR evidence, restart replay, lease recovery, stale-writer fencing, plaintext token/key non-disclosure, RLS tenant denial, exact output deletion, resurrection denial, and clean teardown.
  • Increment 8r gates pass all 309 shared live-media tests, 193 passing Aphrodite adapter tests with one intentional skip, 108 passing Aphrodite Streaming tests with one intentional real-edge skip, 86 Veritas channel tests, and all 14 V10 Phase A/consolidation tests. Six strict shared, adapter, Streaming, and Veritas source/spec/consumer typechecks; graph-aware shared, adapter, and Streaming lint; dependency-inclusive shared (+6), adapter (+13), and Streaming (+14) builds; formatting/diff checks; and the supervised real container/media gate pass.
  • Increment 8r establishes reusable visible-watermark command, release, and worker authority, not deployed Veritas/V3/Rail watermark policies, custody backends, queues, workers, or real non-Aphrodite transforms. Its multi-tenant evidence uses in-process providers; the real gate remains Aphrodite tenant #1. The visible-grid profile is not invisible or forensically robust. Ready non-Aphrodite HLS/DASH, playback grants, decoded Rail playback, final tenant equivalence, and the first-party-live flip remain open.
  • Increment 8s moves player-grant registration, decoded-media observation, synchronous provider execution, and release authority behind the canonical LiveMediaTenantPlayerClientControl. The control validates and fixes one tenant, adapter, and service principal at construction. It reparses the playback grant, active leased viewer session, QoE sample, player request, and every durable queue result. Registration binds tenant, stream, session ID, subject, client instance, protocol, publication, grant, runtime, readiness, lease expiry, and a canonical exact-issuance fingerprint before reservation. Observation admits provider execution only after positive playing-state decoded-frame evidence is durably staged, then requires a matching succeeded record. Release likewise validates the active operation before teardown and requires its matching durable released state. Cast or unknown runtimes remain unsupported no-ops rather than fabricated clients.
  • AphroditePlayerClientControl is now a thin tenant-#1 wrapper fixing aphrodite.player-client.v1 and the aphrodite-player-client-service principal after caller options are spread. It retains its public constructor and operation alias, exact Aphrodite error factory, forced-RLS PostgreSQL operation store/parser, lease and fencing provider, positive-QoE evidence path, browser/native HLS/DASH runtime references, protected-playback composition, and routes. The legacy aphroditePlayerClientFingerprint now delegates to the shared canonical implementation. An adversarial compatibility case proves runtime-only tenant, adapter, service-principal, parser, and descriptor overrides cannot weaken that wrapper authority, while repeat registration and product error behavior remain compatible.
  • Three direct canonical tests drive one real LiveMediaOptionalAdapterService with independent in-process Veritas and V3 Stage player providers and tenant queue views over one record map. Equal stream, publication, session, grant, QoE-event, operation, and request identities remain isolated in queue keys, fingerprints, binding verification, service scopes, provider selection, results, evidence, and release. Cross-tenant grant/session resources, subject mismatches, caller-injected authority, malformed fixed IDs, unsupported cast, wrong durable tenant/adapter records, and stale fingerprints fail before queue mutation or provider execution/teardown. The supervised real MediaMTX/PostgreSQL/SoftHSM/FFmpeg/Chromium gate exercises the reconstructed Aphrodite wrapper from protected-playback grant issuance and registration through positive decoded DASH QoE, synchronous execution, replacement release, durable proof, forced-RLS sibling denial, and final release while retaining the broader real-media, custody, recovery, fencing, and cleanup assertions.
  • Increment 8s gates pass all 312 shared live-media tests, 194 passing Aphrodite adapter tests with one intentional skip, 108 passing Aphrodite Streaming tests with one intentional real-edge skip, 86 Veritas channel tests, and all 14 V10 Phase A/consolidation tests. Six strict shared, adapter, Streaming, and Veritas source/spec/consumer typechecks; graph-aware shared, adapter, and Streaming lint; dependency-inclusive shared (+6), adapter (+13), and Streaming (+14) builds; formatting/diff checks; and the supervised real container/media/browser gate pass.
  • Increment 8s establishes reusable player lifecycle authority, not deployed Veritas/V3/Rail player providers, durable stores, policies, or decoded client runtimes. Its multi-tenant evidence uses in-process providers; the real gate remains Aphrodite tenant #1. Ready non-Aphrodite HLS/DASH, non-Aphrodite playback grants, decoded Rail playback, final tenant equivalence, and the first-party-live flip remain open.
  • Increment 8t moves active publisher-grant registration, independently authenticated edge binding, positive runtime-evidence staging, synchronous provider execution, query, and repeat-safe release behind the canonical LiveMediaTenantPublisherClientControl. The control validates and fixes one tenant, adapter, and service principal at construction. It reparses the non-revoked, unexpired publisher grant before readiness access; derives the exact resource and operation/grant identity; validates the browser/native runtime/protocol pair; and owns the canonical exact-issuance fingerprint, queue reservation, and durable replay validation. Authenticated binding strictly validates edge/connection identity, exact protocol, and a timestamp that cannot predate issuance while retaining the legacy unregistered-grant no-op. Observation always passes through durable evidence staging so the queue can revalidate independent grant and edge authority even for succeeded replay, then admits execution only after two-sided evidence and requires the matching durable succeeded state. Query and teardown likewise reparse and validate the fixed tenant, stream, adapter, operation/grant identity, and fingerprint before returning or invoking a provider.
  • AphroditePublisherClientControl is now a thin tenant-#1 wrapper fixing aphrodite.publisher-client.v1, the aphrodite-publisher-client-service principal, product error factory, record parser, and descriptor after caller options are spread. It retains its public constructor and operation alias, exact Aphrodite errors, forced-RLS PostgreSQL queue, active-grant and authenticated MediaMTX edge binding, durable two-sided evidence, leasing/fencing provider, browser-WHIP and native-SRT runtime references, runtime composition, Streaming ingest routes, and Broadcaster store integration. The legacy aphroditePublisherClientFingerprint now delegates to the shared canonical implementation. An adversarial compatibility case proves runtime-only tenant, adapter, principal, parser, descriptor, and error-factory overrides cannot weaken the wrapper while repeat registration, active-grant revalidation, product errors, and repeat-safe release remain compatible.
  • Three direct canonical tests drive one real LiveMediaOptionalAdapterService with independent in-process Veritas and V3 Stage publisher providers and tenant queue views over one record map. Equal stream, grant, client, edge, connection, sample, operation, and request identities remain isolated in queue keys, fingerprints, service scopes, binding verification, provider selection, evidence, results, query, and teardown. Cross-tenant, revoked, and expired grants; malformed fixed IDs and edge input; browser/SRT mismatch; wrong durable tenant/adapter records; and stale fingerprints fail before queue mutation, binding, execution, query, or teardown. The supervised real MediaMTX/PostgreSQL/SoftHSM/FFmpeg/Chromium gate exercises the reconstructed Aphrodite wrapper through native-SRT registration, independently authenticated exact edge binding, positive client/ingress evidence, synchronous execution, process reconstruction/replay, forced-RLS sibling denial, and release. The same gate retains browser-WHIP publication and the wider encrypted/watermarked/protected-media, recovery, fencing, and cleanup assertions.
  • Increment 8t gates pass all 315 shared live-media tests, 195 passing Aphrodite adapter tests with one intentional skip, 108 passing Aphrodite Streaming tests with one intentional real-edge skip, 86 Broadcaster tests, 86 Veritas channel tests, and all 14 V10 Phase A/consolidation tests. Eight strict shared, adapter, Streaming, Broadcaster, Veritas, and Phase A source, spec, and consumer typechecks; graph-aware lint for all six projects; dependency-inclusive shared (+6), adapter (+13), Streaming (+14), and Broadcaster (+16) builds; formatting/diff checks; and the supervised real container/media/browser gate pass.
  • Increment 8t establishes reusable publisher lifecycle authority, not deployed Veritas/V3/Rail publisher providers, durable stores, grant/edge integrations, or browser/native client runtimes. Its multi-tenant evidence uses in-process providers; the real gate remains Aphrodite tenant #1. Ready non-Aphrodite HLS/DASH, playback grants, decoded Rail playback, final tenant equivalence, and the first-party-live flip remain open.
  • Increment 8u moves host registration, one-use invitation exchange, signaling authority, reciprocal transport-evidence staging, synchronous provider execution, query, and repeat-safe release behind the canonical LiveMediaTenantRemoteGuestControl. The control validates and fixes one tenant, adapter, service principal, and credential-free secure WebSocket base at construction. It generates operation/session identities and raw capabilities internally; owns the compatible canonical semantic registration and exact exchange fingerprints, readiness scope, digest-only queue boundary, role-correct two-sided evidence gate, and durable success/release validation; fixes signaling claims to its tenant; and reparses every returned record to reject a wrong tenant, stream, adapter, operation/session/grant/client identity, or fingerprint before returning a descriptor or invoking downstream authority.
  • AphroditeRemoteGuestControl is now a thin tenant-#1 wrapper fixing aphrodite.remote-guest.v1, the aphrodite-remote-guest-service principal, product error factory, record parser, and descriptor after caller options are spread. It retains its public constructor and session aliases, exact Aphrodite error class/codes, forced-RLS PostgreSQL queue, active publisher grant binding, database-clock lifecycle, one-use invitation, ticket, and guest lease digest rotation, WebSocket hub, leasing/fencing provider, Broadcaster routes, and two-browser WebRTC runtime. The legacy registration and exchange fingerprints now delegate to their shared canonical implementations. An adversarial compatibility case proves runtime-only tenant, adapter, principal, parser, descriptor, and error-factory overrides cannot weaken the wrapper while released-registration replay still emits the exact product error.
  • Three direct canonical tests drive one real LiveMediaOptionalAdapterService with independent in-process Veritas and V3 Stage remote-guest providers and tenant queue views over one record map. Equal stream, grant, operation, session, host/guest client, invitation, signaling, evidence, and request identities remain isolated in queue keys, fingerprints, service scopes, binding verification, provider selection, signaling claims/events, reciprocal proof, results, query, and teardown. Safe registration replay rotates raw provision capabilities without replacing the durable operation. Malformed fixed authority, role-mismatched evidence, cross-tenant signaling claims, wrong durable tenant/adapter records, and stale fingerprints fail before the protected access. Two single-worker Chromium scenarios independently prove reciprocal audio/video and matching SSRC evidence across two contexts, third-participant denial, credential containment, accessibility, mobile/ reduced-motion behavior, and ordered teardown. The supervised real MediaMTX/PostgreSQL/SoftHSM/FFmpeg/Chromium gate exercises the reconstructed Aphrodite wrapper through registration replay and capability rotation, invitation exchange, exact signaling, reciprocal proof, restart replay, durable SDP/ICE/raw-secret non-disclosure, forced-RLS sibling denial, lease recovery and stale fencing, and repeat-safe release while retaining the wider protected-media assertions.
  • Increment 8u gates pass all 318 shared live-media tests, 196 passing Aphrodite adapter tests with one intentional skip, 6 Aphrodite remote-guest compatibility tests, 108 passing Aphrodite Streaming tests with one intentional real-edge skip, 86 Broadcaster tests, 86 Veritas channel tests, and all 14 V10 Phase A/consolidation tests. Eight strict shared, adapter, Streaming, Broadcaster, Veritas, and Phase A source/spec/consumer typechecks; graph-aware lint for all seven affected and guard projects; dependency- inclusive shared (+6), adapter (+13), remote-guest compatibility (+7), Streaming (+14), and Broadcaster (+16) builds; formatting/diff checks; the two focused browser scenarios; and the supervised real container/media/browser gate pass.
  • Increment 8u establishes reusable remote-guest lifecycle and signaling authority, not deployed Veritas/V3/Rail remote-guest providers, durable stores, publisher-grant integrations, signaling gateways, or browser/native runtimes. Its multi-tenant evidence uses in-process providers; the real gates remain Aphrodite tenant #1. SFU/MCU, TURN availability, multi-node signaling, ready non-Aphrodite HLS/DASH, playback grants, decoded Rail playback, final tenant equivalence, and the first-party-live flip remain open.
  • Increment 8v moves protected-browser-player registration, compatible descriptor/client admission, privacy-bounded render-evidence observation, synchronous provider execution, and repeat-safe release behind the canonical LiveMediaTenantImmersiveSessionControl. The control validates and fixes one tenant, immersive adapter, and service principal at construction. It reparses the succeeded player record/request and canonical player fingerprint; binds its exact tenant, stream, viewer session, grant/operation, publication, browser client, and unexpired lifecycle; rejects non-browser immersive runtimes or descriptors outside the measured client capabilities; owns the compatible canonical immersive fingerprint and readiness scope; and reparses every reserved, staged, succeeded, and released record. Render evidence must match the registered runtime, projection, field of view, stereo layout, source geometry, and audio format before queue mutation. Provider results and teardown responses must name the fixed tenant/resource, adapter, kind, and operation before the matching durable terminal record is accepted.
  • AphroditeImmersiveSessionControl is now a thin tenant-#1 wrapper fixing aphrodite.immersive.v1 and the aphrodite-immersive-session-service principal after caller options are spread. It retains its public constructor and operation alias, exact Aphrodite error class/codes, forced-RLS PostgreSQL player and immersive stores, database-clock lifecycle, leasing/fencing provider, flat/cardboard/WebXR references, Viewer composition/routes, and timing/request-ID seams. The legacy aphroditeImmersiveSessionFingerprint delegates to the shared canonical implementation. An adversarial compatibility case proves runtime-only tenant, adapter, principal, parser, descriptor, and error-factory overrides cannot weaken the wrapper while wrong-operation and released-registration errors retain product identity.
  • Three direct canonical tests drive one real LiveMediaOptionalAdapterService with independent in-process Veritas and V3 Stage immersive providers and tenant queue views over one record map. Equal stream, publication, viewer session, grant/operation, client, evidence, and request identities remain isolated in protected-player lookup, queue keys, fingerprints, service scopes, binding verification, provider selection, proof, result, and teardown. Malformed fixed IDs, cross-tenant and stale-fingerprint player records, unsupported native runtimes, incompatible capabilities, mismatched render evidence, wrong durable adapters, and stale immersive fingerprints fail before queue mutation, execution, or teardown. Two single-worker Chromium cases independently prove real 360-degree HLS device-orientation and 180-degree DASH pointer rendering, privacy-bounded proof, accessibility, mobile/reduced-motion behavior, credential containment, and ordered release. The supervised MediaMTX/PostgreSQL/SoftHSM/FFmpeg/Chromium gate exercises the reconstructed Aphrodite wrapper from the exact succeeded protected player through registration, bounded render/audio/orientation evidence, provider proof, restart replay, recovery and stale fencing, forced-RLS sibling denial, and release while retaining the wider protected-media assertions.
  • Increment 8v gates pass all 321 shared live-media tests, 197 passing Aphrodite adapter tests with one intentional skip, the complete Aphrodite Viewer test target, 108 passing Aphrodite Streaming tests with one intentional real-edge skip, 86 Veritas channel tests, and all 14 V10 Phase A/consolidation tests. Eight strict shared, adapter, Viewer, Streaming, Veritas, and Phase A source/spec/consumer typechecks; graph-aware lint for all six affected/guard projects; dependency-inclusive shared (+6), adapter (+13), and Streaming (+14) builds; the direct Viewer production build; formatting/diff checks; the two focused browser scenarios; and the supervised real container, media, and browser gate pass.
  • Increment 8v establishes reusable immersive lifecycle authority, not deployed Veritas/V3/Rail immersive providers, durable stores, protected-player integrations, or client runtimes. Its multi-tenant evidence uses in-process providers and its real gates remain Aphrodite tenant #1. Native OpenXR/ visionOS and real-headset WebXR conformance, ready non-Aphrodite HLS/DASH, playback grants, decoded Rail playback, final tenant equivalence, and the first-party-live flip remain open.
  • Increment 8w moves exact browser-publisher composition registration, bounded render-evidence admission, synchronous provider execution, query, publisher-cascade release, and repeat-safe direct release behind the canonical LiveMediaTenantCompositionControl. The control validates and fixes one tenant, composition adapter, publisher-client adapter, and service principal at construction. It reparses the succeeded publisher record/request and canonical publisher fingerprint; binds its exact tenant, stream, grant/operation, adapter, browser/WebRTC client, and unexpired lifecycle; owns the compatible one-to-four-source browser registration schema, canonical composition fingerprint, and operate scope; and reparses every reserved, staged, queried, publisher-selected, succeeded, and released record. Render evidence must match the registered composition, client, runtime, layout, ordered sources, and output before queue mutation. Provider results and teardown responses must name the fixed tenant/resource, adapter, kind, operation, and provider reference before the matching durable terminal record is accepted.
  • AphroditeCompositionControl is now a thin tenant-#1 wrapper fixing aphrodite.composition.v1, aphrodite.publisher-client.v1, and the aphrodite-composition-service principal after caller options are spread. It retains its public constructor, registration schema/type exports, exact Aphrodite error class/codes, forced-RLS PostgreSQL composition and publisher stores, independent positive-ingress edge join, database-clock lifecycle, leasing/fencing provider, Broadcaster composition/routes, timing/request-ID seams, and Canvas/Web Audio runtime. The legacy aphroditeCompositionFingerprint delegates to the shared canonical implementation. An adversarial compatibility case proves runtime-only tenant, composition/publisher adapters, principal, parser, descriptor, and error-factory overrides cannot weaken the wrapper while released-registration replay retains product error identity.
  • Three direct canonical tests drive one real LiveMediaOptionalAdapterService with independent in-process Veritas and V3 Stage composition providers and tenant queue views over one record map. Equal stream, publisher grant, operation/composition, client, evidence, and request identities remain isolated in publisher lookup, queue keys, fingerprints, service scopes, binding verification, provider selection, proof, result, query, and teardown. Malformed fixed IDs, cross-tenant and stale-fingerprint publisher records, inactive or expired publishers, mismatched render evidence, wrong durable adapters, stale composition fingerprints, and wrong provider or teardown identities fail before protected queue mutation, execution, or durable acceptance. Three single-worker Chromium cases independently prove real two-source Canvas composition, Web Audio mixing, WHIP publication, positive MediaMTX ingress, privacy-bounded evidence, accessibility, mobile/reduced- motion behavior, authorization denial, and ownership-correct teardown. The supervised MediaMTX/PostgreSQL/SoftHSM/FFmpeg/Chromium gate exercises the reconstructed Aphrodite wrapper from the exact succeeded browser publisher through registration, independently joined edge proof, render/audio evidence, provider result, restart replay, abandoned-lease recovery, stale fencing, forced-RLS sibling denial, and repeat-safe release while retaining the wider protected-media assertions.
  • Increment 8w gates pass all 324 shared live-media tests, 198 passing Aphrodite adapter tests with one intentional skip, the complete Aphrodite Broadcaster and Streaming test targets, 86 Veritas channel tests, and all 14 V10 Phase A/consolidation tests. Eight strict shared, adapter, Broadcaster, Streaming, Veritas, and Phase A source/spec/consumer typechecks; graph-aware lint for all six affected/guard projects; dependency-inclusive shared (+6), adapter (+13), Streaming (+14), and Broadcaster (+16) builds; formatting/diff checks; the three focused browser scenarios; and the supervised real container, media, and browser gate pass.
  • Increment 8w establishes reusable browser-composition lifecycle authority, not deployed Veritas/V3/Rail composition providers, durable stores, publisher integrations, or client runtimes. Its multi-tenant evidence uses in-process providers and its real gates remain Aphrodite tenant #1. Custom layouts, transitions/switching, GPU/OBS/native or distributed mixing, ready non-Aphrodite HLS/DASH, playback grants, decoded Rail playback, final tenant equivalence, and the first-party-live flip remain open.
  • Increment 8x moves product-supplied entitlement-to-viewer-lease-to-playback- grant orchestration, authenticated heartbeat/leave/immersive mutations, optional player/immersive lifecycle sequencing, exact presence projection, and compensating joined-lease cleanup behind the canonical LiveMediaTenantProtectedPlaybackControl. The control validates and fixes one tenant, player adapter, immersive adapter, and identity-denial result at construction. It parses bounded join inputs and generic product entitlement decisions; validates the exact tenant, stream, subject, decision, timestamps, idempotency key, client, active status, lease token, and presence resource returned by viewer-session authority; and validates exact tenant, stream, publication, subject, session, lifetime ordering, and requested-protocol availability on each issued playback grant before optional client access. Player and immersive descriptors must retain fixed adapter, equal grant and operation identities, compatible runtime/protocol or render geometry, and transition-correct status. Authenticated heartbeats, terminal leaves, and presence cannot return a sibling resource. Grant or optional-lifecycle failure after a valid join triggers the compatible short-lease compensation.
  • AphroditeProtectedPlaybackControl is now a thin tenant-#1 wrapper fixing the aphrodite tenant, aphrodite.player-client.v1 and aphrodite.immersive.v1 adapters, and the compatible identity_or_stream_not_found identity denial. It retains its positional constructor; public result, input, mutation, and lifecycle types; all seven issue/session/immersive/presence methods; exact product entitlement reasons and SQL policy; external-user-to-viewer principal resolver; shared-backed viewer-session and playback-grant controls; optional player and immersive providers; Viewer routes/runtime; and Streaming real-edge composition. An adversarial compatibility case proves the positional wrapper rejects a sibling-tenant grant or player adapter before client access and still invokes the exact compensating viewer leave.
  • Three direct canonical tests compose independent Veritas and V3 Stage entitlement policies, principal resolvers, viewer-session authorities, playback issuers, and player/immersive lifecycle ports with equal user, stream, publication, decision, session, grant, QoE, and render-evidence identities. They prove isolated issue, heartbeat, immersive registration and evidence, leave, lifecycle release, and presence results. Malformed entitlement time bounds, cross-tenant session/grant authority, wrong player or immersive adapters, missing principals, mismatched heartbeat/presence, downstream-access ordering, compensation, and unconfigured immersive lifecycles fail closed. The real gate separately exercises the wrapper with its production-shaped SQL, canonical controls, optional providers, and media path.
  • Increment 8x gates pass all 327 shared live-media tests, 199 passing Aphrodite adapter tests with one intentional skip, the complete Aphrodite Viewer target, 108 passing Aphrodite Streaming tests with one intentional real-edge skip, 86 Veritas channel tests, and all 14 V10 Phase A/ consolidation tests. Strict shared, adapter, Viewer, Streaming, Veritas, and Phase A source/spec/consumer typechecks; graph-aware lint for all six affected and guard projects; dependency-inclusive shared (+6), adapter (+13), and Streaming (+14) builds; the direct Viewer production build; formatting/diff checks; 12 single-worker Chromium HLS/DASH player and immersive scenarios; and the supervised real container/media/browser gate pass. The real gate traverses SQL entitlement, the exact leased viewer session and protected grant, player registration and decoded QoE, immersive registration and render evidence, restart/recovery and forced-RLS isolation, and final release through the reconstructed Aphrodite wrapper while retaining the wider protected-media assertions.
  • Increment 8x establishes reusable protected-playback orchestration, not shared product entitlement or identity policy and not deployed Veritas/V3/Rail policies, issuers, sessions, stores, providers, or client runtimes. Its direct multi-tenant evidence uses in-process ports and its real gate remains Aphrodite tenant #1. Ready non-Aphrodite HLS/DASH, playback grants, decoded Rail playback, final tenant equivalence, and the first-party-live flip remain open.
  • Increment 8y resolves a cross-tenant edge-identity gap found while following the Veritas rehearsal seam toward a real provider. The durable shared stores consistently key authority by tenant and stream UUID, but the MediaMTX path adapter formerly accepted only a bare UUID and supplied its tenant from constructor configuration. Two tenants using the same valid stream UUID would therefore name the same edge path before SQL isolation could help. The canonical root contract now owns a versioned live-media.v1/<tenant>/<stream UUID> codec with strict parse and tenant-boundary resolution. MediaMtxEdgeProvider uses canonical paths by default, ignores unmanaged and sibling-tenant paths, and treats malformed paths inside its owned namespace as provider-protocol failure rather than guessing. Bare UUID discovery is available only through the explicit legacy-stream-id mode.
  • Aphrodite's current production, pipeline, browser-test-server, and real-edge provider compositions select legacy-stream-id explicitly, preserving tenant #1 behavior while its MediaMTX publisher URLs remain bare UUIDs. Its external authentication and publish-lifecycle callback schemas dual-read an exact canonical Aphrodite resource path and the legacy UUID, normalize both to the same stream authority, and reject a canonical Veritas path carrying the same UUID before grant lookup or publisher-edge mutation. This is a bounded migration seam, not a claim that the deployed Aphrodite edge has switched path formats.
  • The Veritas production-test stream, ingest request, and receipt contracts are versioned to .2. A product schedule source such as synthetic-bars-1 is no longer misrepresented as a shared stream ID: the stream spec carries a separate UUID resource identity, the request derives the exact veritas resource and canonical media path, and the receipt must return both bindings. The receipt also supplies a validated publication UUID, and its ordered HLS and DASH URLs must resolve to the exact canonical publication object prefix; an arbitrary test-host manifest with a plausible suffix is insufficient. Rehearsal admission rechecks program/source/resource/path/byte/time authority before returning the still-unpublishable result.
  • Adversarial tests prove canonical codec round-trip, rejection of implicit legacy and malformed owned paths, explicit legacy compatibility, equal stream UUID sibling filtering in MediaMTX discovery, and Aphrodite rejection of a canonical sibling tenant before state mutation. Veritas tests reject malformed resource IDs, cross-tenant/resource/media-path receipts, publication IDs whose URLs retain another publication prefix, and protocol/host/credential/query/ path substitutions. All 328 shared live-media tests, 108 passing Aphrodite Streaming tests with one intentional real-edge skip, 92 Veritas channel tests, and all 14 V10 Phase A/consolidation tests pass. Shared source and spec, Streaming, and Veritas typechecks; graph-aware lint for all three affected projects; dependency-inclusive shared (+6) and Streaming (+14) builds; formatting/diff and adversarial stub scans; and the supervised digest-pinned MediaMTX/PostgreSQL/SoftHSM/FFmpeg/Chromium test also pass. The supervised gate retains real ingest, protected playback, lifecycle, persistence, fencing, isolation, and teardown coverage through Aphrodite's explicit legacy mode.
  • Increment 8y establishes collision-free edge naming and exact Veritas rehearsal identity contracts. It does not deploy a Veritas, V3 Stage, or Rail MediaMTX publisher; create their ready HLS/DASH publications or playback grants; decode Veritas media in the Rail; finish tenant equivalence; migrate Aphrodite publishers to canonical paths; or flip first-party-live.
  • Increment 8z moves the durable job-to-transcode-to-package-to-publish worker assembly behind the server-only createLiveMediaPipelineRuntime boundary. A product host now supplies a fixed tenant, durable job and publication stores, execution/packaging/object-store adapters, and worker configuration; shared code alone constructs the job service, transcode execution service, publication service, attempt executor, and fenced worker. Tenant authority is parsed once and applied after caller worker options. Aphrodite's production pipeline and both real-gate process compositions use this factory while retaining Aphrodite controls and deployment adapters.
  • Direct shared tests execute the same factory for Aphrodite, Veritas, and V3 Stage over shared in-memory stores, using the same stream UUID and idempotency key. Each tenant reaches its own ready HLS/DASH publication and canonical immutable object prefix. An adversarial caller cannot replace the fixed Veritas tenant through worker options, and a relative server output root fails construction.
  • The supervised real gate publishes that same stream UUID simultaneously on Aphrodite's explicit legacy path and Veritas's canonical live-media.v1/veritas/<stream UUID> path. Independent MediaMTX providers see only their configured tenant, the canonical Veritas HLS edge output decodes, and the shared SQL registry durably binds the Veritas resource. Shared SQL job/publication stores and the generic runtime then read the live canonical RTSP source, run the real Neith/FFmpeg H.264/AAC transcode, create and publish HLS plus DASH, persist a ready publication under the Veritas tenant, and independently ffprobe both stored manifests for decoded audio, video, dimensions, and positive duration.
  • Increment 8z gates pass all 330 shared live-media tests, 108 passing Aphrodite Streaming tests with one intentional real-edge skip, 92 Veritas channel tests, and all 14 Phase A/consolidation tests. Strict source/spec and consumer typechecks, graph-aware lint, dependency-inclusive shared and Streaming builds, formatting/diff checks, and the supervised real MediaMTX/PostgreSQL/SoftHSM/FFmpeg/Chromium gate pass.
  • This proves one reusable production-shaped pipeline assembly and a real canonical Veritas ingest-to-ready-media path. It does not yet connect the Veritas rehearsal byte port to this runtime, deploy durable Veritas publisher grants, issue Veritas viewer/playback authority, decode the result in Rail, compose V3 Stage production runtime, migrate Aphrodite publishing to canonical paths, complete tenant equivalence, or flip first-party-live.
  • Increment 8aa connects the audited Veritas rehearsal byte port to that shared runtime without widening it into a product upload API. The root contract now defines a strict test MPEG-TS request/result and a 64-MiB ceiling. The server-only LiveMediaTestIngestRuntime fixes one tenant, admits only one-MiB-or-smaller non-empty chunks, writes a create-only temporary object, verifies exact declared length and SHA-256, fsyncs it, and retains one read-only content-addressed input under the canonical tenant/stream directory. Replays verify that immutable object and reuse the durable job and publication. Construction rejects a relative input root or pipeline-tenant mismatch; request tenant mismatch fails before consuming bytes; partial or corrupt input is removed; and a non-isolated tenant queue fails explicitly instead of returning another job's result.
  • VeritasProductionSharedMediaTestIngest is a thin tenant-#2 adapter over that port. It reparses the exact v2 rehearsal request, binds the canonical Veritas resource and edge path, derives a deterministic job idempotency key, fixes a bounded H.264/AAC 360p rendition, and accepts only exact ready HLS/DASH object keys beneath a credential-free HTTPS .test or localhost origin. The existing rehearsal pipeline consumes the adapter unchanged and returns a deep-frozen v2 receipt while HG-3 and first-party-live remain closed.
  • The supervised real-media gate now also generates a two-second MPEG-TS test pattern with FFmpeg, streams those actual bytes through the production rehearsal pipeline and shared SQL-backed Veritas job/publication runtime, runs the real Neith/FFmpeg transcode and HLS/DASH publication path, then independently ffprobes both durable manifests for H.264/AAC, 640x360 video, and positive duration. The simultaneous canonical Veritas RTSP publisher coverage from increment 8z remains in the same gate.
  • Increment 8aa gates pass all 332 shared live-media tests, 108 passing Aphrodite Streaming tests with one intentional real-edge skip, 94 Veritas channel tests, and all 14 Phase A/consolidation tests. Strict shared, Streaming, and Veritas typechecks; graph-aware lint for those projects and Phase A; dependency-inclusive shared and Streaming builds; a frozen-lockfile filtered install; formatting/diff and source-stub checks; and the supervised real MediaMTX/PostgreSQL/SoftHSM/FFmpeg/Chromium gate pass.
  • This closes only the rehearsal-to-runtime byte wiring. The bridge is synchronous and test-only and requires an isolated tenant queue. A deployed long-running Veritas ingest/scheduler and durable publisher-grant service, Veritas viewer session and playback grants, decoded Rail playback, V3 Stage production composition, Aphrodite canonical-path migration, final tenant equivalence, and the first-party-live flip remain open.
  • Increment 8ab exposes the injected LiveMediaTenantPublisherGrantControl contract from the canonical root while keeping its credential service and SQL stores server-only. VeritasProductionPublisherGrantControl is the tenant-#2 product composition: it fixes tenant veritas, owner product veritas, and external identity v1.veritas-live after spreading caller options. Product callers can therefore provide only an authenticated principal and stream UUID; create/manage scopes, exact resource construction, registry registration, and grant issue, authenticate, rotate, and revoke delegation stay canonical.
  • Direct Veritas tests exercise every operation and exact scope/resource/mapping projection. An adversarial caller that casts forbidden tenant, owner, or external-mapping options cannot widen the control, and malformed stream identity fails before registration or grant issuance.
  • The supervised real-media gate no longer creates the Veritas credential in a memory store. It issues through the product control into the shared forced-RLS PostgreSQL resource registry and publisher-grant store, reconstructs the control and SQL store before use, rejects an unknown valid-shaped secret, and lets MediaMTX authenticate a real FFmpeg SRT publisher only on the canonical live-media.v1/veritas/<stream UUID> path. The resulting edge HLS decodes as H.264 at the declared dimensions and continues into the existing real Veritas transcode/publication and rehearsal gates. After the database client is reconstructed, a newly composed Veritas control authenticates the same persisted grant and exact resource.
  • Increment 8ab gates pass all 332 shared live-media tests, 108 passing Aphrodite Streaming tests with one intentional real-edge skip, 96 Veritas channel tests, and all 14 V10 Phase A/consolidation tests. Strict shared, Streaming, Veritas, and Phase A typechecks; graph-aware lint; dependency- inclusive shared and Streaming builds; a frozen-lockfile filtered install; formatting/diff checks; and the supervised real MediaMTX/PostgreSQL/SoftHSM/FFmpeg/Chromium gate pass.
  • This closes durable Veritas publisher-grant composition and real canonical edge authentication at the code and local release-gate boundary. A deployed long-running Veritas publisher/scheduler host, viewer-session and playback grants, decoded Rail playback, V3 Stage production composition, Aphrodite canonical-path migration, final tenant equivalence, HG-3, and the first-party-live flip remain open.
  • Increment 8ac adds the matching Veritas tenant-fixed viewer-session, playback-grant, and protected-playback controls. Fixed tenant, service principals, veritas.player-client.v1, veritas.immersive.v1, and bounded identity denial are applied after every injected option; direct hostile-option tests and the real gate exercise the resulting authority without creating a V10-owned media stack.
  • The Rail's FirstPartyLiveVideoGate can now be constructed with one explicit shared-media authority for the exact HLS/DASH set while its exported default remains fail-closed. Channel registration, lane admission, and the web panel share that status. The panel mounts only the canonical surface from the narrow @oshun/live-media/browser/player entry and requires the playback resolver's authority ID plus returned tenant, stream, protocol, API base, and manifest to match the selected source exactly, without bringing server-only controls or unrelated browser adapters into the Rail boundary.
  • The supervised real-media gate carries generated MPEG-TS rehearsal bytes through the Veritas product pipeline into a durable SQL publication, issues a signed viewer-bound grant through the Veritas composition, and drives the actual Rail panel in Playwright-controlled Chromium for both HLS and DASH. Success requires explicit start, positive decoded frames, a successful heartbeat, persisted presence/QoE, credential-free DOM, no unexpected browser/media failures, lane release, zero presence, and immediate VIEWER_SESSION_INACTIVE denial for the former token. Browser cancellation of an obsolete adaptive segment is bounded to the exact issued publication directory and is not treated as an origin failure.
  • This closes a local product-composed Veritas ingest-to-decoded-Rail slice, not a deployment. The real gate's player lifecycle is intentionally in-memory; the default Rail composition is still closed, and no durable Veritas player adapter, playback-route host, long-running scheduler, V3 composition, Aphrodite canonical migration, final tenant-equivalence result, HG-3, or production first-party-live flip is claimed. The RB.3 parent and equivalence test checkboxes therefore remain open.
  • Increment 8ad removes Aphrodite's production legacy-stream-id edge mode. Broadcaster WHIP and native-SRT provisioning expose one exact canonical live-media.v1/aphrodite/<stream UUID> path; browser authorization is fenced to the full tenant/resource WHIP suffix, and the TypeScript/Rust native bridge validates and sends that path without putting credentials on argv. Production reconciliation, lifecycle hooks, pipeline recording authority, and RTSP source resolution now use the same namespace. The distinct legacy RTMP and lifecycle callback body shapes remain compatibility inputs, while a bare UUID MediaMTX path fails before durable grant lookup.
  • Unit and browser adversarial coverage rejects bare paths, equal-UUID sibling tenants, mismatched native paths, and escaped WHIP sessions. The supervised MediaMTX gate additionally rejects a valid Aphrodite grant presented on a bare SRT path, then carries Aphrodite and equal-UUID Veritas publishers through canonical tenant-qualified SRT/WHIP, HLS, RTSP recording/transcode, protected playback, and teardown on the same edge. Affected shared, Aphrodite adapter, Streaming, and Broadcaster tests; four strict typechecks and lints; the Rust native publisher tests/build; dependency-inclusive builds; the 19-scenario single-worker Chromium gate; formatting/diff checks; and the supervised real gate pass.
  • This completes Aphrodite's canonical edge-path migration at the code and local release-gate boundary. It does not claim a deployed scheduler, durable Veritas player host, V3 Stage production composition, final tenant equivalence, HG-3, or the production first-party-live flip. RB.3 and its equivalence-test checkbox remain open.
  • Increment 8ae adds V3 Stage's tenant-#3 production authority composition in @oshun/v10-rail-channel-stage. The product wrappers fix tenant v3-stage, pipeline/viewer/playback service principals, publisher owner and v3.stage:<stream UUID> external-resource mapping, v3-stage.player-client.v1, v3-stage.immersive.v1, and bounded identity denial after all injected options. Equal stream, job, publication, entitlement, and viewer-session identities remain isolated from a sibling Veritas composition through real shared controls; hostile tenant, principal, product, mapper, adapter, and denial options cannot weaken Stage authority.
  • The complete Stage unit suite, strict typecheck, lint, dependency-inclusive build, Streaming regression checks, frozen-lockfile validation, formatting/ diff checks, and supervised real PostgreSQL/MediaMTX gate pass. The real gate persists the equal stream UUID for V3 Stage and Veritas, resolves the exact Stage product mapping, authenticates only the Stage grant in its tenant, and proves reciprocal secret denial before revocation. This closes the missing V3 Stage tenant-fixed shared-media control composition at the code boundary. It does not create a rendered Stage artifact or catalog row, bind the existing cook to an Unreal renderer or durable catalog, or deploy a long-running scheduler, publisher, or playback host. Final tenant equivalence and the production first-party-live flip remain open.
  • Increment 8af supplies the missing Stage cook-to-immutable-delivery boundary without creating a second media stack. The shared media-object MIME schema is narrowly extended for progressive WebM, paired MP4/MP3/Ogg audio, and JPEG/PNG/WebP/AVIF artwork, while the canonical root exposes only the create-only object-store port type. V3StageImmutableDeliveryAdapter fixes keys under live-media.v1/v3-stage/catalog/v1, applies role-specific byte ceilings and immutable caching, and treats only an exact stored object as an idempotent replay. It rechecks storage, then fetches the credential-free exact HTTPS object with redirects disabled and requires matching HTTP status, content type, length, and SHA-256 before a catalog receipt can become usable. FfprobeStageStoredMediaProbe writes only to a private transient directory, invokes ffprobe without a shell, and requires a positive-duration decoded video/audio stream or positive artwork dimensions before returning.
  • Adversarial tests cover origin credentials, object-path escape, changed bytes at one immutable key, role/MIME substitution, and exact replay. A full cook contract test binds all three roles. The Streaming release gate generates real H.264/AAC MP4, AAC M4A, and PNG bytes with FFmpeg, persists them through the canonical local create-only store, retrieves their exact origin bytes, decodes all three with real ffprobe, and publishes only to an in-memory test catalog. This closes immutable storage and delivery verification, not a V3 render: no recorded V3 candidate, Unreal render, production catalog row, durable catalog writer, scheduler/publisher/player host, final tenant equivalence, or first-party-live flip is claimed.
  • Increment 8ag supplies the missing authoritative V3 release-evidence adapter for the Stage cook through the dedicated @oshun/v10-rail-channel-stage/release entry point, keeping its V3 authoring/export dependencies out of the browser-facing channel root. V3StageRecordedReleaseGateAdapter consumes the actual Saraswati authoring-editor and V3 concert-export types through an injected repository, then fixes the returned bundle to the exact Stage item, version, and concert. Recorded readiness requires every authoring gate, the published Sequencer receipt, full provenance attachment, and GA cadence to agree. A ready export must be fresh and retain a unique canonical proof plus matching proof verdict for every non-human gate; wrong subject/type, duplicate, detached, expired, future, stale, or contradictory evidence fails closed. Suites that name human signoff additionally require the exact fresh promotion and its canonical human_approval proof, bound to the artifact, content hash, signer, decision, and evidence. Declared drills always project as blocked.
  • Contract coverage uses the real recorded Saraswati editor-state builder and exercises exact mapping, drill denial, item/version/concert substitution, stale export reports, proof substitution, missing/hostile human promotion, and forged ready authoring state. This closes the release port, not its deployment: no durable candidate repository, Calliope-plan projection, Unreal renderer, production catalog row/writer, scheduler/publisher/player host, final tenant equivalence, or first-party-live flip is claimed.
  • Increment 8ah supplies the durable V3/Calliope cook source without turning either system's design state into playable media. The canonical OSHUN PostgreSQL schema now carries immutable candidate revisions with an exact projection SHA-256 and a partial unique index admitting only one current ready version. SqlV3StageCookCandidateRepository transactionally publishes increasing versions, accepts only an exact idempotent replay, supersedes the prior row, makes withdrawal terminal for that version, bounds cook reads, and rejects changed hashes or indexed/payload identity disagreement.
  • The projection reuses the owning V3 and Calliope schemas. It requires a recording-authorized concert; one exact V3 persona, setlist, duration, and track inventory; a bijective title-preserving Calliope-slot/V3-track join; matching Calliope artist/concept/setlist/camera/venue identities; and a programming anchor present in the selected setlist, camera plan, and VOD package. Energy, section, and perspective derive from those real plan values; numeric cut density requires a separately cited editorial measurement because Calliope expresses cadence only as prose. Unit/adversarial coverage and a disposable real-PostgreSQL migration/restart/supersession/withdrawal gate pass. This closes the durable candidate and Calliope projection code boundary, not content deployment: no candidate row, Unreal render, durable catalog row, scheduler/publisher/player host, final equivalence, or first-party-live flip is claimed.
  • Increment 8ai supplies the durable rendered-catalog writer and playback reader over the canonical OSHUN PostgreSQL client. Migration 20260721230000_v10_stage_rendered_catalog stores immutable versioned Stage items, their canonical SHA-256, indexed artist/concert identity, publication time, and explicit retirement evidence. Database constraints, an update trigger, and a partial unique index freeze item identity/JSON, permit only an active-to-superseded/withdrawn transition, and admit only one active revision per item.
  • SqlV3StageRenderedCatalogRepository transactionally publishes monotonically increasing versions, accepts only an exact active replay, supersedes the previous row, and treats withdrawal as terminal. Bounded due-item reads admit active rows only, rebind all indexed identities, recompute the canonical item hash, reject duplicate active ids, and clone validated payloads. Focused adversarial tests and a disposable full-migration PostgreSQL gate prove restart reads, direct hash/identity mutation rejection, concurrent exact retries, supersession, withdrawal, and resurrection denial. This closes the durable catalog code boundary only: no row is seeded and no Unreal render, rendered artifact, deployed host, final equivalence, or first-party-live flip is claimed.
  • Increment 8aj supplies the fail-closed V3 Stage Unreal render boundary and a real local UE5.5 release gate. V3/ue/StageRenderWorker is a minimal headless editor project whose strict Python commandlet loads one persisted /Game level and the exact published LevelSequence, resolves exactly one named CineCameraActor, verifies that the sequence possesses that exact camera class/name, evaluates a bounded frame range, and emits contiguous PNGs plus a SHA-256 manifest. Its tiny native module finishes asynchronous assets, submits the loaded world's material shaders, waits for shader completion, and flushes rendering commands before capture and shutdown. This rejects the earlier black-frame/shader-cancellation failure instead of treating emitted files as success.
  • The server-only V3StageUnrealRenderer rebinds the durable candidate/version, concert, export hash, and Sequencer receipt to a strict injected V3 binding; launches Unreal without a shell under bounded process-group supervision and a safe environment allowlist; and independently validates the exact manifest, file set, contiguous indices, PNG signatures/dimensions, byte sizes, SHA-256 values, and observable frame variation. It rejects symbolic-link aliases and undeclared files, enforces configured pixel-frame and scratch-capacity budgets, copies the exact digest-authorized audio bytes into the private job, runs real FFmpeg H.264/AAC encoding, and requires FFprobe to observe one exact video/audio stream set, geometry, rate, frame count, and duration. Every outcome removes the transient job.
  • Sixteen focused tests cover exact success, release/binding substitution, manifest identity/hash/geometry forgery, static frames, undeclared output, changed or symlinked audio, forged FFprobe frame/duration evidence, nonzero Unreal exit, resource exhaustion, and cross-user ownership. The complete Stage suite passes 79 tests with three environment-gated tests skipped; strict typecheck and lint pass. The explicit on-box gate builds the editor module, authors an isolated two-second engine-primitive fixture, renders 24 distinct 640x360 RGBA PNGs through UE5.5/Lavapipe with exit 0, and then passes the complete server adapter through real FFmpeg/FFprobe in 12.79 seconds. The fixture is test-only and no candidate, binding, media object, or catalog row is seeded. A production V3 binding repository/row, real first-party performance render, deployed worker, final tenant equivalence, and first-party-live flip remain open.
  • The RB.3 consolidation guard is now complete in the existing V10 Phase A invariant project. Its real-workspace scan covers both V10 ownership roots, ignores generated directories and symlinks, and rejects a new live-media/streaming/ingest/transcode package, direct Aphrodite/Neith media control, the Kafka-shaped @oshun/streaming package, direct HLS/DASH/WebRTC browser engines, canonical server/private subpaths, relative-path bypasses, and native FFmpeg/GStreamer/WebRTC/SRT crates. Package manifests and static, re-exported, import-equals, type, require, dynamic, renamed, target-specific, and Cargo table dependencies have adversarial fixtures. Only the canonical @oshun/live-media contract and browser/native client subpaths are admitted. Six focused guard cases, all fourteen Phase A tests, strict typecheck, and lint pass. This closes the guard only; it does not claim tenant equivalence or an ingest-to-Rail flow.
  • Increment 8ak closes the final local four-tenant equivalence and supervised ingest-to-Rail test requirement without changing the canonical substrate. apps/oshun/bff/src/v10/rail-live-media-controls.ts is the Rail server composition boundary: its pipeline, publisher-grant, viewer-session, playback-grant, and protected-playback controls fix tenant v10-rail, exact service principals, v10.rail:<stream UUID> product mapping, v10-rail.player-client.v1, v10-rail.immersive.v1, and the bounded identity_or_source_not_found denial after every injected option. V10-owned client/kernel packages still import no canonical server/private subpath and own no second media stack.
  • The focused cross-product suite runs Aphrodite tenant #1, Veritas tenant #2, V3 Stage tenant #3, and Rail tenant #4 against the same shared controls. Equal stream and job UUIDs produce exact tenant-local resources and service scopes; four real in-memory publisher grants authenticate only in their issuing tenant, reciprocal secret use fails closed, Rail revocation leaves the other three active, and leased viewer presence plus teardown remains isolated while a sibling lease is rejected. This product-composition evidence complements the existing forced-RLS four-tenant PostgreSQL gate rather than replacing it.
  • Release evidence is green for 333 shared live-media tests, 199 Aphrodite adapter tests (one environment-gated case skipped), 79 Stage tests (three environment-gated cases skipped), 98 Veritas tests, all 21 Phase A tests, and four new BFF equivalence tests. The focused strict TypeScript configuration, targeted ESLint, Prettier, BFF production build, and dependency/lock importer checks pass. The separately enabled supervised PostgreSQL/MediaMTX/SoftHSM/FFmpeg/Chromium gate also passes: generated Veritas MPEG-TS becomes durable HLS/DASH, the actual Rail panel decodes both protocols, and heartbeat/presence/QoE, secret containment, release, revocation, and teardown are observed. Missing generated shared-database source maps remain Vite diagnostics only.
  • This completes the RB.3 automated test checkbox and final local tenant equivalence. It does not seed a first-party Stage candidate or catalog item, deploy long-running tenant schedulers/workers/playback hosts, or flip the exported production first-party-live default. Those implementation and deployment requirements keep the parent extraction checkbox open.
  • Increment 8al removes the remaining test-fixture-only composition gap in the Rail web app without declaring an unavailable production program. Deployment may now supply one credential-free NEXT_PUBLIC_RAIL_FIRST_PARTY_LIVE_CONFIG manifest that binds an authority to exact channel/source/tenant/stream, protocol, manifest URL, and same-origin protected-playback API tuples. The actual RailApp constructs both lane admission and the browser player from that one authority; missing configuration retains not_configured, while invalid, cross-origin, credentialed, partial, duplicate, or substituted bindings fail closed. The supervised Veritas ingest-to-Rail Chromium fixture now consumes this production composition rather than constructing its own resolver. The complete V10 web suite passes 188 tests, including new direct adversarial coverage, with strict typecheck and targeted lint. A dedicated Playwright path passes in desktop and mobile Chromium, proving exact lane admission, rendered authority identity, zero autoplay, and release cleanup; it mocks the player dependency and therefore makes no decoded-media claim. The Phase A ownership/consolidation suite also remains green. The production Next/static-PWA build passes with 37 revisioned assets, and the freshly rerun supervised PostgreSQL/MediaMTX/SoftHSM/FFmpeg/Chromium gate carries real Veritas test ingest through this composition to decoded Rail HLS/DASH with teardown (one test, 45.53 seconds); only the previously documented missing generated source-map diagnostics remain. This closes deploy-time client composition only. It does not seed content, install the same-origin server host, retain a production media receipt, or make an unconfigured deployment live; those requirements keep the parent open.

Audit conclusion#

The useful reusable surface is fragmented rather than absent: Aphrodite has substantial product behavior, SQL-backed service boundaries, browser media utilities, crypto/container primitives, and many tests; shared storage/cache/ events already exist; Neith has real codec and transport kernels. What does not yet exist is the complete durable, multi-tenant live-broadcast composition that connects this now-real ingest, signed manifest, leased viewer session, presence, decoded playback, live chat, and operational hooks/telemetry path to the remaining optional-adapter depths and deployed tenant hosts.

Accordingly, the 17-service/adjacent-library audit, increments 1–6, increment 7a's extension contract, increments 7b–7m's real content-analysis, recording, AES-128 HLS protection, visible-watermark, browser/native HLS/DASH player, browser-WHIP publisher, native-SRT publisher, browser immersive, and browser remote-guest, bounded browser-composition, and protected-HLS viewer/release paths, increment 8a's tenant/resource SQL identity boundary, and increment 8b's tenant-neutral shared client surface plus increment 8c's shared tenant-fixed pipeline control and Veritas tenant-#2 composition, increment 8d's shared durable SQL pipeline store, and increment 8e's shared durable identity and publisher-grant stores plus increment 8f's shared durable publisher-edge and publication stores plus increment 8g's shared durable viewer-session/presence store plus increment 8h's shared durable live-chat store, increment 8i's shared operational telemetry/hook store, increment 8j's tenant-fixed viewer, telemetry, and playback-grant controls, and increment 8k's tenant-fixed publisher-grant and transcode controls plus increment 8l's tenant-fixed publisher-edge control and increment 8m's tenant-fixed media-publication control plus increment 8n's tenant-fixed live-chat control and increment 8o's tenant-fixed content-analysis control plus increment 8p's tenant-fixed recording control and worker and increment 8q's tenant-fixed segment-encryption control and worker plus increment 8r's tenant-fixed visible-watermark control and worker plus increment 8s's tenant-fixed player-client lifecycle control and increment 8t's tenant-fixed publisher-client lifecycle control plus increment 8u's tenant-fixed remote guest lifecycle and signaling control plus increment 8v's tenant-fixed immersive session lifecycle control plus increment 8w's tenant-fixed browser-composition lifecycle control plus increment 8x's tenant-fixed protected-playback orchestration control and increment 8y's canonical tenant/resource edge-path and Veritas rehearsal identity boundary plus increment 8z's shared production pipeline assembly and real Veritas canonical ingest-to-ready-media gate and increment 8aa's bounded Veritas rehearsal-to-runtime byte bridge plus increment 8ab's durable Veritas publisher-grant composition and canonical real-edge authentication plus increment 8ac's tenant-fixed protected-playback composition and actual local Veritas HLS/DASH decode in the Rail plus increment 8ad's Aphrodite canonical edge-path migration plus increment 8ae's V3 Stage tenant-#3 production authority composition plus increment 8af's Stage immutable rendered- delivery boundary plus increment 8ag's recorded V3 release-evidence boundary are complete at their code and local release-gate boundaries. Increment 8ah's durable candidate/Calliope projection, increment 8ai's durable rendered-catalog repository, and increment 8aj's fail-closed Unreal/FFmpeg render boundary and real local UE5.5 release gate are likewise complete at those boundaries. Increment 8ak's four-tenant product-equivalence suite and supervised local ingest-to-Rail gate are complete as well. Increment 8al's exact deployment manifest and real Rail-app composition are complete at the client boundary. The broader increment 7 scopes, remaining deployed tenant hosts, and the parent RB.3 implementation checkbox remain open. The audit does not mark any simulated package as production, conflate direct WebRTC with an SFU/TURN service, conflate HLS encryption with vendor DRM, represent a visible marker as forensic protection, conflate bounded Canvas composition with GPU/OBS/native or distributed mixing, claim a complete desktop/mobile client UI, authorize a second stack, or treat local tenant equivalence as deployed production readiness.