# V4 Planning-Corpus Remediation — 2026-06-12

Scope: contradiction and honesty fixes across the V4 planning corpus
(`V4_ARCHITECTURE.md`, `V4_DEPENDENCIES.md`, `V4_features.md`, `V4_TODOS.md`)
and the data/check artifacts they cite. This pass was executed in two stages by
two sessions on the same day; this document covers **both**. It builds on the
2026-05-31 audit recorded at the top of `V4_TODOS.md` and does not repeat it.

Unrelated, separately-completed work in `V4/docs/planning/*` and
`V4/docs/decisions/0011-*` is **not** part of this remediation.

Marking convention used throughout: `[x]` = verified against in-repo artifacts;
`[~]` = real-world operations claim that cannot be verified from the repo (and,
with launch on 2026-10-01, mostly cannot have occurred yet); `[ ]` = open work,
including previously-checked tasks whose implementations were found
contradicted. Every re-mark carries an inline dated reason at the task.

---

## Stage 1 (first session)

1. **Five-vs-six launch cells.** `V4_ARCHITECTURE.md` said "five cells" in the
   product promise, the nightly Gauntlet release gate, and the launch-readiness
   gate while the corpus ships six launch cells. All three now read "six launch
   cells".

2. **Cinematic minutes.** `V4_features.md` content inventory claimed "~180
   pre-rendered minutes — §17.6" while `V4_TODOS.md` §17.6 budgets 30 minutes
   across 12 missions. The inventory row now reads ~30, matching the budget the
   citation points at.

3. **Esports calendars canonicalized.**
   `V4/esports/pro-circuit/pro-circuit-2026.json` previously ran 2026-06-01 →
   2027-05-31 — starting four months **before** the 2026-10-01 launch. The
   season now runs 2026-10-01 → 2027-09-30 with 12 events (2 Majors / 4 Minors /
   6 Opens on the $500k / $125k / $25k tier structure).
   `V4/esports/calendar/first-12-months.json` was rebuilt to mirror the same 12
   event IDs month-by-month and now names the pro-circuit file as its source.
   Downstream surfaces were updated coherently:
   `apps/v4/spectator/src/lib/matchData.ts`, the e2e expectation in
   `apps/v4/spectator/e2e/spectator-portal.spec.ts`, the
   `v4-esports-pro-circuit-check.mjs` gate, and the `V4_ARCHITECTURE.md`
   service-inventory paragraph. Stage 2 verified coherence: identical ID sets,
   all dates inside the season window, event months align across both files.

4. **Repository-surfaces table and feel-test paths.** The features surfaces
   table listed `V4/tools/{missions,rts-maps,arcade-art,release}/` and
   `V4/ue/Build/` as if they existed; they are now annotated "(planned — not yet
   created)" and `V4/release/` is named as the build tooling that exists today.
   Feel-test paths in `V4_features.md` and the `V4_ARCHITECTURE.md` automation
   section now point at the actual layout
   `V4/ue/Source/V4Tests/Private/V4Mode*Tests/*Spec.cpp` instead of the
   never-created `V4Tests/Source/{Unit,FeelTests,Functional,Gauntlet}/` tree.

5. **Map-row count and lore-card honesty.** Features said "98 launch map rows";
   the canonical `V4/maps/map-lore.json` covers 102 (`mapCodexSourceCount`), so
   features now says 102. Only 5 of ~102 lore cards are actually authored:
   `authoredLoreCardCount: 5` plus an honest `authoringStatusNote` were added to
   the JSON, `V4_TODOS.md` §107.1 "Author 200-300 word lore cards" was re-marked
   `[x]→[ ]`, and the `v4-map-lore-check.mjs` gate now requires the honest
   unchecked mark.

6. **Press fact-sheet platforms.** `V4/press/epk/fact-sheet.md` listed an
   8-platform set that omitted Linux/Steam Deck, conflated iOS with the
   iPad-Pro-only commitment, and overstated Android. It now matches the
   9-platform day-one list in `V4_features.md` (Windows PC ×3 storefronts, PS5,
   PS5 Pro, XSX|S, Switch 2 scaled, macOS Apple Silicon, Linux/Steam Deck
   Proton-verified, iPad Pro M-series, Android high-end tablets).

7. **Dependency-registry staleness.** `V4_DEPENDENCIES.md` gained an "Updated:
   2026-06-12" header; the Wwise decision pointer was fixed from a dangling "§22
   launch readiness" to §94; the five-way CI option stack was resolved into a
   recorded decision (GitHub Actions for repo CI — 56 `v4-*.yml` workflows exist
   — plus Jenkins + BuildGraph for the UE build/cook/patch farm under
   `V4/release/`); hosting dropped Unity Multiplay (service shut down
   December 2025) and names i3D.net as primary; the localization CAT tool is
   decided as Crowdin (`V4/loc/crowdin.yml` exists; `V4_ARCHITECTURE.md`
   localization section updated to match); Looker/Tableau resolved as
   evaluated-not-selected. `V4_ARCHITECTURE.md`'s 25-service inventory gained a
   backlog-mapping annotation reconciling it with `V4_TODOS.md` §56's 18
   subsections — every service row maps to at least one TODOS section
   (§82/§84/§85/§86/§88 for P1 surfaces; §98/§105/§112/§114 for P2 expansions),
   so no new coverage tasks were required (Stage 2 verified those sections exist
   and cover the named services).

8. **Zero-backlog launch campaigns.** The features Campaign Modes table promises
   three campaigns that had no authoring tasks anywhere: Conquest (StarCraft, 30
   missions), Civilization (AoE, 12 branches × 6 missions), and Crossover: The
   Shadow War (6 multi-cell missions). New unchecked subsections were added:
   §28.9, §29.8, and §141 (append-only numbering; all P1 because the features
   table positions them as launch game modes, not post-launch content).

9. **§94 launch-readiness ops claims.** Closed Alpha (5,000 players), Closed
   Beta (50k), Open Beta, the 200k-player soak, 24/7 watchtower staffing, the
   60-minute hotfix SLA, day-one cert on 9 platforms, crash-rate-over-Open-Beta,
   matchmaking p99 under 5× concurrency, the live anti-cheat ban roster, and
   24/7 12-language support staffing were all `[x]` — none can have occurred
   (launch-minus-2-months is August 2026) and none are verifiable from repo
   artifacts. All re-marked `[x]→[~]` individually with dated reasons, and the
   `v4-launch-readiness-check.mjs` gate now **requires** the honest `[~]` marks,
   so re-checking them without evidence fails CI.

## Stage 2 (this session)

10. **§56 Online Services Backend re-marked.** Audit item (b): only the login
    router mounts real routes; the other 12 routers in `service_router()`
    (`apps/v4/online-services/src/lib.rs:91-140`) expose `/health` only, several
    claimed services (workshop, contract-author, voice-sfu, support, esports,
    roadmap, balance-ledger) have no router at all, and the unit-tested service
    structs are never mounted. Every §56.2–§56.18 task was re-marked `[x]→[ ]`
    individually (≈40 tasks) with a section-level explanation. Kept checked:
    §56.1 login + OAuth (audit-verified, re-implemented 2026-05-31) and §56.7
    "Implement Rust + Axum telemetry-ingest" (real separate crate with a mounted
    `/v1/telemetry/batch` route). Newly re-marked beyond the router issue: §56.1
    "refresh-token rotation" (a real, tested `rotate_refresh_token` method
    exists but no HTTP route exposes refresh-grant exchange) and §56.7 "batched
    write to ClickHouse" (`accept_batch` builds the INSERT statement and returns
    it to the caller; nothing writes to ClickHouse).

11. **Mode runtime registration (audit item b).** §3.15 "Implement per-mode
    `UGameFeatureAction` for asset activation" re-marked `[x]→[ ]`:
    `V4GameFeatureAction_ActivateModeAssets` only flips booleans and copies an
    asset list; it loads nothing and never calls
    `UV4ModeSubsystem::RegisterMode()`, which is invoked only from
    `V4ModesTests/ModeSpec.cpp`. A note at §3.15 records the consequence for
    §15–§41: the per-mode plugins, `.uplugin` files, and content roots are real
    (those scaffold marks stand — there are no per-mode "register at runtime"
    checkboxes in §15–§41 to re-mark), but no mode is reachable in a running
    client until a production registration path exists.

12. **Crossplay/contract attestations (audit item c).** §58.1 "Implement
    EOSShared, PSN, XBL, NN, Apple, Google integrations" re-marked `[x]→[ ]`:
    `V4CrossplaySubsystem::V4MakeIntegration` returns all-true
    identity/entitlements/friends/parties/sessions flags unconditionally and
    `V4OnlineContractSubsystem` validates that same all-true case; no SDK is
    probed. §58.2–§58.4 (account-link logic, currency rules, crossplay defaults)
    were left checked as real in-repo data/logic.

13. **Fabricated community baselines (audit item d).**
    `V4HitmanPersistentWorldSubsystem` hardcodes +86,980 community kills (line
    362), +2,385,000 raid damage (line 404), and +62,000 relics into "community"
    progress totals, and `ResetQuickMissionRuntimeState` is a no-op returning
    `true` (line 180). Re-marked `[x]→[ ]`: §91.1 "Story mode persistent-deaths"
    (the Story/Quick-Mission split rests on the no-op), §132.2 "community-driven
    event", §136.1 "seasonal world-boss raid event", §136.2 "community-progress
    async events". The fabrications referenced by the fix list against "§58"
    live in these persistence sections; the spectator `matchData.ts` touch in
    Stage 1 was the esports-calendar fix and contains no kill/damage hardcodes
    (verified by grep). Four gate scripts (`v4-persistent-world-check.mjs`,
    `v4-persistent-world-economy-deep-check.mjs`,
    `v4-world-boss-community-raid-check.mjs`) now require the honest marks.

14. **Remaining unverifiable ops claims** (grep scope: cert / alpha / beta /
    soak / 24-7 / staffed / approved / submitted / ESRB / PEGI / union / mocap;
    plus stand-up/hosting claims surfaced by the same sweep). Re-marked
    `[x]→[~]` individually: §5.4 MetaHuman Animator facial-mocap setup, §42.1
    operators "with mocap'd intros + 120 voice lines" (data rows are real;
    performances are stand-ins), §70.1–§70.5 all six platform-certification
    passes (Sony/Microsoft/Nintendo/Valve/Apple/Google adjudicate; cannot have
    occurred pre-launch), §78.1 mocap-volume booking, §81.3 stunt-coordinator
    engagement, §84.1 wiki hosting at `wiki.v4.game`, §85.1 weekly roadmap
    updates (cadence demonstrably lapsed — see item 16), §86.1 12-language
    support staffing, §86.2 ambassador recruiting, §99.1 studio-ops bookings,
    §110.3 fan-favorite mocap-actor recordings, §112.1 partnership-curation
    board, §114.4 regional support staffing, §133.2 NIL interview recordings.
    Gate scripts asserting the old `[x]` text were updated to require the honest
    marks: `v4-studio-ops-check.mjs`,
    `v4-director-commentary-expansion-check.mjs`,
    `v4-director-commentary-extended-check.mjs`,
    `v4-partnership-curation-check.mjs`, `v4-support-deep-check.mjs`. Notable
    absences: no ESRB/PEGI/union-keyword tasks exist in the backlog
    (region-rating tasks in §61.4 are build variants, i.e. code). **Documented
    residual** (left `[x]`, same claim class, outside the prescribed grep scope
    — candidates for a future pass): §61.2/§61.5 VO recording sessions,
    §78.2-adjacent capture-plan claims, §80.1 sensitivity reviews, §81.1/§81.2
    legal clearances, §88 partnership negotiations, §110.1/§110.2 commentary
    recordings, §133.1 quarterly developer streams.

15. **Attestation banner.** A banner block near the top of `V4_TODOS.md` now
    defines what a `[x]` attests (in-repo code/data/JSON artifacts only), that
    the 770 `*.v4asset.json` files (529 `.uasset` + 241 `.umap` stand-ins; the
    previously circulated figure of 504 was stale) are textual stand-ins rather
    than cooked content, and that ops claims were re-marked `[~]` on 2026-06-12.
    A matching paragraph defining the `.v4asset.json` stand-in convention was
    added to `V4_ARCHITECTURE.md` § "Content Pipeline & Source Control → Asset
    Pipeline".

16. **Lapsed roadmap cadence.** `V4/roadmap/public-roadmap.json` still promised
    `nextUpdateUtc` 2026-05-29 — two weekly cycles had been missed. Honest
    update: a `Roadmap.2026-W24` update entry (2026-06-12) records the lapse and
    re-baselines the cadence (`lastUpdatedUtc` 2026-06-12, `nextUpdateUtc`
    2026-06-19), and a `cadenceLapses` record names the two missed dates.
    `v4-public-roadmap-check.mjs` now accepts a cadence gap **only** when an
    exactly-matching documented lapse exists (undocumented gaps still fail), and
    the features "refreshed weekly" promise was softened to a target cadence
    with the lapse noted. `V4_TODOS.md` §85.1 "Update weekly" carries the
    matching `[~]`.

## Validation (Stage 2)

- All touched JSON files parse (`python3 json.load`): both esports calendars,
  `map-lore.json`, `public-roadmap.json`.
- Esports coherence: identical 12-event ID sets across both calendar files, 2
  Major / 4 Minor / 6 Open, all dates within 2026-10-01 → 2027-09-30, per-event
  months align.
- Check scripts run with plain node (vanilla `node:` imports only):
  `v4-esports-pro-circuit-check.mjs`, `v4-launch-readiness-check.mjs`,
  `v4-map-lore-check.mjs`, plus the gates edited in this stage (results in the
  session log).
- Full gate sweep: all 69 runnable `apps/v4/scripts/src/*.mjs` checks pass (the
  arg-requiring ones run with their preflight arguments) **except**
  `v4-final-polish-check`, a zero-open-items gate that was already failing at
  the pre-remediation HEAD (the 2026-05-31 audit left 9 tasks honestly
  unchecked) and now reports the larger honest open-task count. That gate is
  deliberately left red: it should only go green when the open work is actually
  done.
