acdream/docs/plans/2026-08-25-assess-window-parity-campaign.md
Erik 0332466fdc docs: Campaign AS plan + AS1 ground-truth synthesis (assess window, player targets)
Owner report 2026-08-25: the examination window on an assessed PLAYER is
missing retail's identity block (gender/heritage, title, PK), the three
per-bodypart armor-level rows, allegiance/faction lines, and the
target-configurable extras. Three-lens research (our pipeline, ACE wire,
named retail decomp) established: the 0x00C9 parse is already complete
(ArmorLevels 0x4000 parsed and dead), everything arrives from ACE, and
the core defect is an element mis-mapping in the Character subview vs
CharExamineUI @0x004AD3C0 (heritage slot fed a raw string prop, title
slot fed AllegianceName, PK slot fed MonarchsName, allegiance slot fed
an invented "Assessment incomplete" literal). Zero Character-subview
tests existed, which is how it survived the Slice 3 gate.

Slices AS2-AS5 (serial, coupled files) + AS6 gate script; ground truth
doc carries the binding line-composition tables, gap ledger G1-G10, and
rulings R1-R8.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-25 08:19:38 +02:00

7.4 KiB
Raw Blame History

Campaign AS — assess/examination window retail parity (player targets)

Status: EXECUTING — AS1 research synthesis complete 2026-08-25; slices final.

Owner report (2026-08-25, side-by-side screenshots, acdream vs retail, both assessing the player "Dww"): acdream's examination window on a PLAYER target is missing retail's identity block and body/config sections.

Missing vs retail:

  1. Identity block under the title bar: gender + heritage ("Female Aluvian"), current display title ("War Mage"), PK status ("Non-Player Killer") — none of it rendered by acdream.
  2. Per-bodypart armor levels: retail shows three grouped rows — "Head/Chest/Groin AL: x/y/z", "Bicep/Wrist/Hand AL: x/y/z", "Thigh/Shin/Foot AL: x/y/z". Absent in acdream.
  3. Target-configurable extras: retail only shows what the assessed player configured to show (date of birth, age, number of deaths, chess rank, fishing skill, damage/crit ratings, …). acdream shows a "Dmg/CritDmg Rating:" line but not the rest of the family.
  4. Allegiance/faction lines: allegiance name/patron/faction shown when the target has them. Absent in acdream.

Explicit owner rulings:

  • The animated 3D paperdoll is an INTENTIONAL acdream deviation (retail shows a static tinted preview; its colors are buggy in retail). Keep it. Register row required (added in the first slice that touches the window).
  • Retail comparison is the oracle for text composition; all strings come from DAT StringTables per the decomp — never hardcoded English literals.
  • All UI work goes through the standard GUI classes (UiLabel / UiPanel / UiScrollablePanel / retail chrome) — no bespoke widgets, no quick fixes.

Execution model (set by owner)

  • Fable plans and coordinates (this doc + slice contracts + synthesis).
  • Sonnet implements each slice against a pinned contract.
  • Opus runs the dual-lens review per slice — retail-faithfulness lens + architecture lens — followed by a fix round; slice is REVIEW-CLOSED only after the re-review accepts the fixes.
  • Commit to the worktree branch (claude/windmill-seam-and-solid-polys) as slices land, full hermetic suite green each time (Lane!=InstalledDat&Lane!=PreparedPackage&Lane!=Live&Lane!=Manual&Lane!=Timing&Lane!=Windows&Lane!=Linux&Lane!=SystemFont&Purpose!=Diagnostic&Status!=KnownFailure).
  • Do NOT push to gitea until the owner says so.
  • Campaign stops when all slices are REVIEW-CLOSED and the connected-gate script is written and waiting on the owner's drive.

Ground truth sources

  • docs/research/named-retail/acclient_2013_pseudo_c.txt — the retail examination window class, line composition, StringTable keys, 0x00C9 client-side parse.
  • references/ACE/ — what our live server actually sends per flag, and the target-option gating rules.
  • references/Chorizite.ACProtocol/ — field-order cross-check.
  • Campaign CT sealed verdicts (claude-memory/project_character_panel_campaign.md) — the heritage/title composition and PK bitfield rules already ported for the character panel; REUSE, do not re-derive.
  • Research synthesis doc (AS1 output): docs/research/2026-08-25-campaign-as-ground-truth.md.

Slices (FINAL — re-cut at AS1: the 0x00C9 parse is already complete and

the appraisal profile is session-scoped UI presentation state flowing through the established router seam, so the skeleton's wire and runtime-owner slices are unnecessary; all work is App-side composition)

Oracle for every slice: docs/research/2026-08-25-campaign-as-ground-truth.md (AS1 synthesis) — its §2 line-composition tables, §3 wire truth, §4 gap ledger G1G10, and §5 rulings R1R8 are BINDING on implementers and reviewers. Deviating from a ruling requires a plan-doc amendment, not an implementer judgment call.

  • AS1 — ground truth synthesis (DONE, Fable). Three research lenses merged; gap ledger G1G10; rulings R1R8.
  • AS2 — header identity block (Sonnet). Fix the element mis-mapping in AppraisalUiController.ApplyCreature(character: true) per ground truth §2a: 0x10000150 ← composed gender+heritage (reuse CharacterIdentityText, including retail's heritage-id overrides and the creature fallback when heritage==0); 0x10000151 ← current display title via CharacterTitleResolver (Int 261, fallback String 5 Template); 0x10000152 ← PK line from the assessed ClientObject's PWD bits (PlayerKillerStatusBitfield, ruling R7); 0x1000053A ← String 47 AllegianceName gated on Int 30 ≥ 1, DELETING the invented "Assessment incomplete" literal. First-ever AppraisalView.Character controller tests (G10). Register: file the animated-paperdoll AD row (owner-ruled intentional deviation 2026-08-25) in this commit.
  • AS3 — armor-level rows + extras-list plumbing (Sonnet). Plumb Parsed.ArmorLevels into the extras composer (signature change from bare PropertyBundle); emit the spacer + three grouped AL rows before the rating rows per ground truth §2b rows 37, including the *%d ≥9999 unenchantable rendering, retail's per-row rating gates (307|313|314 · 308|315|316 · 350|351), spacer discipline per ruling R4, and the * = Unenchantable legend per ruling R3 (unconditional, gate-verified). Ordering pinned by tests.
  • AS4 — society/allegiance/fellowship + configurable extras (Sonnet). Ground truth §2b rows 12 and 814: the Society row with rank bands and the local-vs-target faction color rule; the Monarch/Patron/Followers cascade; Fellowship; Arrived in Dereth; Time in Dereth (locate or port ClientUISystem::DeltaTimeToString — grep for an existing port first); Chess Rank; Fishing Skill; Deaths ("Has never died" at ≤0); Titles Earned. Register: narrow AP-110 ("exhaustive character detail regions" clause retires) in this commit.
  • AS5 — allegiance rank-title table (Sonnet). Port the 17-function heritage×gender AllegianceSystem::GetTitle @0x005B8DD0 table (census per AP-109's corrected 2026-08-25 text: 11 heritages → 17 functions, ~170 strings; Gearknight/Tumerok male-only reused, Lugian female-only reused, Penumbraen aliases Shadowbound, Olthoi excluded by the unsigned range check) + AllegianceData::GetFullName @0x005B6950; wire the examination title bar (rank from props.GetInt(0x1E), ruling R8) AND the character panel's name line (closing AP-109's residual). Register: retire AP-109 in this commit.
  • AS6 — connected gate script (Fable). User-driven script docs/research/2026-08-25-campaign-as-test-script.md; two-client where needed (allegiance/fellowship/PK lines, deception-failure rendering); includes the R3 legend retail-side-by-side check and the owner's configurable-extras toggle matrix.

Slices AS2→AS3→AS4 are SERIAL (all touch AppraisalUiController / CreatureAppraisalRows — coupled-file rule); AS5 may run after AS4's review closes. Each slice: Sonnet implements → full hermetic suite green → commit → Opus dual-lens review (retail-faithfulness + architecture) → fix round → narrow re-review → REVIEW-CLOSED.

Ledger

Slice State Land / fix commits Notes
AS1 DONE 2026-08-25 (docs commit) 3-agent research; ground-truth doc committed
AS2 ready to dispatch
AS3 pending AS2 review-close
AS4 pending AS3 review-close
AS5 pending AS4 review-close
AS6 pending AS5 review-close