From 4a69ecd32e41d393ca2ab780880f2da06ec0b03c Mon Sep 17 00:00:00 2001 From: Erik Date: Sat, 22 Aug 2026 18:26:02 +0200 Subject: [PATCH] docs(plans): Campaign VM carries the VM2 lesson - a branch that exists is not a branch that runs Binding rule: when retail gates a mechanism behind a capability, preference, or trysinglepass-style switch, the port is not done until the gate's live value is cdb-read on the PDB-paired client and cited with the binary GUID. Records that the owner's live 'too bright' was the pack-on gamma-space tonemap (VM3), not the detail overlay (+3% fallback / -10% real path). Co-Authored-By: Claude Fable 5 --- .../plans/2026-08-22-visualmaster-campaign.md | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/docs/plans/2026-08-22-visualmaster-campaign.md b/docs/plans/2026-08-22-visualmaster-campaign.md index 250215c5..ce2fc78a 100644 --- a/docs/plans/2026-08-22-visualmaster-campaign.md +++ b/docs/plans/2026-08-22-visualmaster-campaign.md @@ -46,6 +46,32 @@ AC-specific constants — a number without a decomp/DAT anchor gets a register row in the same commit — and the pack-off path is the oracle: any slice that moves a pack-off pixel outside its declared mask is a bug, not a tuning. +## Lesson carried into every slice — a branch that exists is not a branch that runs + +VM2 found that Campaign AR's #226 port, the 2026-08-21 findings doc it was +briefed from, and the AR review's "probably" were all describing the +**fallback** branch of retail's detail pass — the `stage == 0` framebuffer +blend that retail only takes when the adapter cannot advertise +`D3DTEXOPCAPS_PREMODULATE`. Real hardware (the owner's AMD, and anything +modern) takes the single-pass texture-stage branch, which computes a +different formula with the opposite sign of effect (darkens, not brightens). +The decomp was read correctly three times; what nobody did until VM2 was +spend two minutes reading the capability on a live client. + +Binding rule for this campaign and after: **when retail gates a mechanism +behind a capability, preference, or `trysinglepass`-style switch, the port +is not done until the gate's live value is recorded** — a cdb read on the +PDB-paired client, cited in the port's note with the binary GUID. "Grep +named → decompile → port" answers what the code *says*; only the live read +answers what it *does* on the hardware the game actually ran on. A guess +about driver caps ("rarely advertised") is not evidence and must not appear +in a review verdict. + +Corollary for brightness questions: the owner's live "too bright" (exposure +1.0 → 0.80) was the pack-on gamma-space tonemap (F4, VM3), not this. The +detail overlay's fallback brightening is +3 % on building shells only; the +single-pass path darkens by ~10 %. Neither explains a scene-wide level. + ## Slice ledger | Slice | Closes | Gate |