Tactical Action · Reference & analysis

V4 Planning-Corpus Remediation — 2026-06-12

1.

3sections9 minread

On this page

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)#

  1. §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).

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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".

  7. 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.