docs+fix(chargen): CC1/CC2 review closeout — R2/R3 residuals closed, ledger final

Both narrow re-reviews returned CLOSED. This closeout takes the two cheap
re-review residuals before CC3 takes references to the shared model:

R2: every array handed into the typed chargen model is now wrapped in
Array.AsReadOnly at the projection seam — a T[] behind IReadOnlyList<T>
was still downcast-mutable, and ChargenOptions is a process-shared
singleton graph.

R3: the no-Chorizite-leak guard now also walks public fields; every
current type uses properties, but a public field would have slipped
through the property-only walk.

Ledger: CC1 fix-round sha corrected to cb4703e8 (the cell previously
cited the pre-amend 459a87f2), CC1/CC2 rows flipped to REVIEW-CLOSED
with the re-review outcomes, R1 (retail refunds +1 credit on a
both-tier cost miss; port charges 0 — unreachable via retail's own
listbox, noted for CC3) and the Olthoi-locked-to-template-0 decomp fact
recorded for CC3/CC4.

Core.Tests 4736/1 skip, Content.Tests 145/0, Release.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-08-15 13:41:37 +02:00
parent 55fc51ed8c
commit f3ef7baae2
3 changed files with 37 additions and 24 deletions

View file

@ -11,10 +11,13 @@ namespace AcDream.Core.Tests.CharGen;
/// future edit from putting e.g. a <c>DatReaderWriter.Enums.SkillId</c>
/// directly on a public property. This test walks every public type in the
/// <c>AcDream.Core.CharGen</c> namespace and asserts that no public
/// property, indexer, constructor parameter, or method return/parameter
/// type — nor any of their generic type arguments, recursively — comes
/// from the <c>DatReaderWriter</c> assembly or any assembly whose name
/// starts with <c>Chorizite</c>.
/// property, field, indexer, constructor parameter, or method
/// return/parameter type — nor any of their generic type arguments,
/// recursively — comes from the <c>DatReaderWriter</c> assembly or any
/// assembly whose name starts with <c>Chorizite</c>. (The field walk
/// closes the CC1 re-review's R3 residual: every current type uses
/// properties, but <c>public SkillId Foo;</c> would otherwise slip
/// through.)
/// </summary>
public sealed class ChargenNoChoriziteLeakTests
{
@ -51,6 +54,12 @@ public sealed class ChargenNoChoriziteLeakTests
}
}
foreach (FieldInfo field in type.GetFields(
BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static))
{
CheckSite(field.FieldType, $"{type.FullName}.{field.Name} (field)", offenders);
}
foreach (ConstructorInfo ctor in type.GetConstructors(
BindingFlags.Public | BindingFlags.Instance))
{