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)#
-
Five-vs-six launch cells.
V4_ARCHITECTURE.mdsaid "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". -
Cinematic minutes.
V4_features.mdcontent inventory claimed "~180 pre-rendered minutes — §17.6" whileV4_TODOS.md§17.6 budgets 30 minutes across 12 missions. The inventory row now reads ~30, matching the budget the citation points at. -
Esports calendars canonicalized.
V4/esports/pro-circuit/pro-circuit-2026.jsonpreviously 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.jsonwas 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 inapps/v4/spectator/e2e/spectator-portal.spec.ts, thev4-esports-pro-circuit-check.mjsgate, and theV4_ARCHITECTURE.mdservice-inventory paragraph. Stage 2 verified coherence: identical ID sets, all dates inside the season window, event months align across both files. -
Repository-surfaces table and feel-test paths. The features surfaces table listed
V4/tools/{missions,rts-maps,arcade-art,release}/andV4/ue/Build/as if they existed; they are now annotated "(planned — not yet created)" andV4/release/is named as the build tooling that exists today. Feel-test paths inV4_features.mdand theV4_ARCHITECTURE.mdautomation section now point at the actual layoutV4/ue/Source/V4Tests/Private/V4Mode*Tests/*Spec.cppinstead of the never-createdV4Tests/Source/{Unit,FeelTests,Functional,Gauntlet}/tree. -
Map-row count and lore-card honesty. Features said "98 launch map rows"; the canonical
V4/maps/map-lore.jsoncovers 102 (mapCodexSourceCount), so features now says 102. Only 5 of ~102 lore cards are actually authored:authoredLoreCardCount: 5plus an honestauthoringStatusNotewere added to the JSON,V4_TODOS.md§107.1 "Author 200-300 word lore cards" was re-marked[x]→[ ], and thev4-map-lore-check.mjsgate now requires the honest unchecked mark. -
Press fact-sheet platforms.
V4/press/epk/fact-sheet.mdlisted 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 inV4_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). -
Dependency-registry staleness.
V4_DEPENDENCIES.mdgained 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 — 56v4-*.ymlworkflows exist — plus Jenkins + BuildGraph for the UE build/cook/patch farm underV4/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.ymlexists;V4_ARCHITECTURE.mdlocalization 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 withV4_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). -
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).
-
§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 thev4-launch-readiness-check.mjsgate now requires the honest[~]marks, so re-checking them without evidence fails CI.
Stage 2 (this session)#
-
§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/healthonly, 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/batchroute). Newly re-marked beyond the router issue: §56.1 "refresh-token rotation" (a real, testedrotate_refresh_tokenmethod exists but no HTTP route exposes refresh-grant exchange) and §56.7 "batched write to ClickHouse" (accept_batchbuilds the INSERT statement and returns it to the caller; nothing writes to ClickHouse). -
Mode runtime registration (audit item b). §3.15 "Implement per-mode
UGameFeatureActionfor asset activation" re-marked[x]→[ ]:V4GameFeatureAction_ActivateModeAssetsonly flips booleans and copies an asset list; it loads nothing and never callsUV4ModeSubsystem::RegisterMode(), which is invoked only fromV4ModesTests/ModeSpec.cpp. A note at §3.15 records the consequence for §15–§41: the per-mode plugins,.upluginfiles, 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. -
Crossplay/contract attestations (audit item c). §58.1 "Implement EOSShared, PSN, XBL, NN, Apple, Google integrations" re-marked
[x]→[ ]:V4CrossplaySubsystem::V4MakeIntegrationreturns all-true identity/entitlements/friends/parties/sessions flags unconditionally andV4OnlineContractSubsystemvalidates 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. -
Fabricated community baselines (audit item d).
V4HitmanPersistentWorldSubsystemhardcodes +86,980 community kills (line 362), +2,385,000 raid damage (line 404), and +62,000 relics into "community" progress totals, andResetQuickMissionRuntimeStateis a no-op returningtrue(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 spectatormatchData.tstouch 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. -
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 atwiki.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. -
Attestation banner. A banner block near the top of
V4_TODOS.mdnow defines what a[x]attests (in-repo code/data/JSON artifacts only), that the 770*.v4asset.jsonfiles (529.uasset+ 241.umapstand-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.jsonstand-in convention was added toV4_ARCHITECTURE.md§ "Content Pipeline & Source Control → Asset Pipeline". -
Lapsed roadmap cadence.
V4/roadmap/public-roadmap.jsonstill promisednextUpdateUtc2026-05-29 — two weekly cycles had been missed. Honest update: aRoadmap.2026-W24update entry (2026-06-12) records the lapse and re-baselines the cadence (lastUpdatedUtc2026-06-12,nextUpdateUtc2026-06-19), and acadenceLapsesrecord names the two missed dates.v4-public-roadmap-check.mjsnow 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/*.mjschecks pass (the arg-requiring ones run with their preflight arguments) exceptv4-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.