docs(vm3): closeout - owner gate brief with the measured curve table; #422 filed; tests pin the shipped defaults

Opus narrow re-review of 51178f7c: APPROVE. Residuals closed: the AR plan
no longer says '<=1 LSB' unqualified (99.99% of pixels; 95 foliage-
silhouette pixels up to 73 LSB, 58 isolated); the campaign doc says the
same; AtmosphericColorPipelineTests now read the SHIPPED exposure/vignette
defaults from BuiltInAtmosphericRenderPack.Descriptor and the graph's named
DefaultVignetteStrengthFallback instead of literals.

Measured for the gate (offline Holtburg hillside, High defaults vs pack
off): mean luminance -17% noon, -44% dusk, p95 unchanged, clip 0.06% both;
neutral High vs pack off: 110,561 px at |d|=1, 95 at >=5 (foliage edges).
Evidence images under docs/research/evidence/vm3/.

#422 filed: one High-default offline capture exited with
STATUS_HEAP_CORRUPTION after a clean managed shutdown; 1 in 8 runs, never
under validation layers. VM7 gate item.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-08-22 23:53:26 +02:00
parent 51178f7c77
commit a0157693ec
7 changed files with 111 additions and 8 deletions

View file

@ -151,10 +151,34 @@ public sealed class AtmosphericColorPipelineTests
// strength of 0.12 would now produce. See the "vignette-strength"
// comment in BuiltInAtmosphericRenderPack.cs for the full
// derivation.
const float VignetteStrengthDefault = 0.245f;
// Read the SHIPPED declaration so the test pins the product, not a copy.
float VignetteStrengthDefault = ShippedDefault("vignette-strength");
Assert.Equal(0.245f, VignetteStrengthDefault, 3);
float cornerMultiplier = 1f - VignetteStrengthDefault;
Vector3 displayed = AtmosphericColorPipeline.Encode(
new Vector3(cornerMultiplier, cornerMultiplier, cornerMultiplier));
Assert.InRange(displayed.X, 0.88f - 0.005f, 0.88f + 0.005f);
}
private static float ShippedDefault(string settingId)
{
AcDream.Plugin.Abstractions.Rendering.RenderSettingDeclaration declaration =
Assert.Single(
AcDream.App.Rendering.Packs.BuiltInAtmosphericRenderPack.Descriptor.Settings,
s => s.Id == settingId);
return float.Parse(
declaration.DefaultValue,
System.Globalization.CultureInfo.InvariantCulture);
}
[Fact]
public void ShippedExposureDefaultIsTheDerivedMidtoneValue()
{
// 0.80 is the value whose linear-light result reproduces the accepted
// mid-grey (see BuiltInAtmosphericRenderPack "exposure" derivation).
Assert.Equal(0.80f, ShippedDefault("exposure"), 3);
Assert.Equal(
0.245f,
AcDream.App.Rendering.Packs.AtmosphericPostProcessGraph.DefaultVignetteStrengthFallback, 3);
}
}