# RC.5 V4 Match channel integration audit

Date: 2026-07-22

This note records the current source authority for RC.5 and the independently
actionable pre-launch integration completed by this pass. It does not treat
authored JSON, `.v4asset.json` stand-ins, test fixtures, future schedules, or
policy declarations as proof that V4 has launched or that a public broadcast is
operating.

## Findings

### Launch and operations remain gated

`V4/V4_TODOS.md` fixes launch at 2026-10-01. Its §94 launch-readiness items
still record the open beta for August 2026, the 200k-player soak for 2026-09-24,
and platform certification, beta crash rate, launch-load matchmaking, live
anti-cheat roster, and launch-window support staffing as incomplete or not yet
measurable. Those are future events on this audit date. No repository source can
substitute for their receipts.

The new `V4MatchLaunchEvidenceSchema` therefore accepts only
`status: "launched"` and requires a build digest plus platform-certification,
live-ops, online-service, commentary-readiness, and `v4-match` tenant receipt
identities. A scheduled target cannot parse as launch evidence. Missing or
failing launch authority prevents manifest creation.

### Commentary has useful real enforcement, but two distinct implementations

`libs/calliope/match-commentary` is executable TypeScript. It deterministically
scores match moments, pins generated lines and analysis to those moments,
screens gender/region/playstyle findings, fails closed when the review provider
fails, and ANDs bias clearance with a deterministic/panel commentary-quality
gate before returning `airable`.

The V4 spectator plugin has a separate C++ policy surface in `V4Mode_Spectator`.
`UV4LiveAICommentaryBroadcastService` respects a player opt-out, creates two
host records, refuses incomplete bias-review records, and requires both review
and watermark state before a line is broadcast-ready. However,
`GenerateLiveCommentaryLines` currently formats two fixed template sentences
from a supplied event marker; it does not call the TypeScript Calliope generator
or a model/provider. The repository checker proves tokens, assets, and policy
fields exist, not that this boundary is deployed against a live match feed.

The new Rail gate chain consequently uses the executable Calliope broadcast
decision and a separately injected consent authority. Neither dependency has a
permissive default. Removing either configuration, throwing from either
authority, returning stale/partial participant review, recording any opt-out, or
returning contradictory gate fields holds the package off air. Personal
voice-clone mode additionally requires current receipts for the owner and each
contributing friend.

### The checked-in spectator portal is not a live source

`apps/v4/spectator/src/lib/matchData.ts` is a fixed match/camera/stat fixture.
`realtime.ts` selects browser API names but advances locally synthesized packet,
objective, latency, and bitrate values on an interval; its fallback is named
`ReplaySimulation`. It does not negotiate a remote WebTransport session and
creates a local WebRTC data channel without signaling. The recorded HLS playlist
contains headers and `#EXT-X-ENDLIST` but no media segments.

There is no registered `v4-match` tenant in the shared live-media substrate. The
activation boundary therefore accepts only an exact future projection with
tenant `v4-match`, lifecycle `live`, publication `ready`, and HTTPS HLS/DASH.
Cross-tenant, ready-only, publishing, VOD-fixture, or pre-launch projections are
invalid. The 24/7 adapter remains unchecked until that projection comes from a
real RB.3 composition and passes an ingest-to-Rail runtime gate.

### Campaign persistence is save-and-resume, not between-session simulation

`UV4SaveGameSubsystem` stores only schema, slot, active cell, and save time.
`UV4SaveGameBase` stores caller-supplied JSON slots and determines when a PvE
autosave is due. `UV4ConquestCampaignProgression` unlocks and completes missions
only when `CompleteMission` is called, then exports/imports that state as JSON.
None of these services advances a squad, simulates missions while the player is
away, persists an authoritative elapsed-offline cursor, or emits between-session
campaign results. The V4 player face therefore remains gated; fabricating a
ticker from save timestamps would violate the ledger's real-simulation rule.

## Implemented pre-launch boundary

`libs/v10/rail-channel-v4-match` now provides:

- strict launch, live-program, consent-request, and consent-decision schemas;
- `V4MatchCommentaryGateChain`, which fails closed on absent/failed consent or
  broadcast gates and validates exact participant/revocation coverage;
- production composition with Calliope's real bias + quality decision;
- `V4MatchDirectorProfileController`, directly driven by the real R0.3
  `DaypartEngine` and the owning RC.1 Uzume profile engine; and
- `V4MatchChannelActivator`, which creates a games-ring spectator manifest only
  after launch, media, consent, bias, and quality all clear.

The manifest deliberately has no player face, no watch surface, no fabricated
campaign drip, and no claimed watch-party implementation. It declares the
scheduled esports live-moment class, while concrete events and RD.2 watch
parties remain owned by their future runtime sources.

## Automated evidence

The focused suite covers ten cases:

- either required gate removed from configuration;
- consent authority failure, partial/stale participant coverage, and opt-out;
- incomplete and complete personal voice-clone consent sets;
- real Calliope bias and repetition blocks;
- contradictory/dishonest broadcast decisions;
- real R0.3 deep-work-to-lunch profile switching plus user authority;
- absent and scheduled launch evidence;
- cross-tenant, non-live, pre-verification, and match-mismatched programs; and
- absent RB.3 first-party-live playback authority; and
- successful all-gates-cleared games-ring manifest activation.

Focused test, typecheck, lint, and lockfile consistency are the release gates
for this increment. V4 UE policy automation and the existing Calliope suite are
also rerun to ensure the composed owners retain their behavior.

## Reopen criteria

The 24/7 channel may be registered only when all of these exist:

1. post-launch build/certification/live-ops/online/commentary receipts from an
   authoritative release source;
2. a real `v4-match` RB.3 tenant with a supervised live ingest-to-Rail playback
   proof and durable live/ready projections;
3. a deployed V4 telemetry-to-Calliope path rather than template lines or
   fixture match data;
4. production participant opt-out and, when applicable, voice-clone consent
   authority wired into the adapter; and
5. scheduled-event publication from the esports authority.

The player face additionally requires an authoritative, persistent campaign
simulation whose squad state demonstrably advances between sessions and emits
durable deltas suitable for tiles and drips.
