diff --git a/docs/plans/2026-08-21-contract-tracker-campaign.md b/docs/plans/2026-08-21-contract-tracker-campaign.md index 986c553b..7fa6bbe2 100644 --- a/docs/plans/2026-08-21-contract-tracker-campaign.md +++ b/docs/plans/2026-08-21-contract-tracker-campaign.md @@ -1,7 +1,7 @@ # Campaign QT — the contract tracker (H.3's client half) -**Status:** CODE-COMPLETE 2026-08-21. All six slices landed; the connected -user gate is owed. +**Status:** CLOSED USER-ACCEPTED 2026-08-21. All six slices landed and the +connected gate passed, together with Campaign QJ's two tabs. **Why now.** M4's demo scenario is "talk to an NPC, accept a quest, ... complete the quest." Everything in that sentence works today EXCEPT the player's ability diff --git a/docs/plans/2026-08-21-journal-campaign.md b/docs/plans/2026-08-21-journal-campaign.md index 413130c2..0f1d9ddd 100644 --- a/docs/plans/2026-08-21-journal-campaign.md +++ b/docs/plans/2026-08-21-journal-campaign.md @@ -1,9 +1,28 @@ # Campaign QJ — the Journal and Page List tabs -**Status:** CODE-COMPLETE 2026-08-21. All five slices landed, plus the first -connected round's three fixes (button property `0x0D`, the location readout's -widget type, refresh-at-the-click). Abandon is now wired too — it turned out to -have a real wire action after all. The connected re-gate is owed. Completes the panel Campaign QT mounted: QT +**Status:** CLOSED USER-ACCEPTED 2026-08-21. All five slices landed and the +connected gate passed. + +The gate took four rounds, and every defect it found was the same mistake in a +different place — an element bound as the wrong thing, or a binding never +tested: + +1. **Button property `0x0D`** read as "starts disabled", which killed every + button on the panel (register QJ-2). +2. **The location readout** is authored EDITABLE, so it is a `UiField`; bound + as `UiText` it silently discarded every write — the value reached the model + and the file and never the screen. +3. **Handlers deferred their redraw** to the next frame's `Tick` where retail + redraws at the click. +4. **The timer's unit labels** stayed visible behind the running readout, + because retail's `ShowEditableTimer` toggles each box AND its label. + +Round 3's "Record does nothing" turned out not to be a defect at all: the +character was indoors, where retail's own `gid_to_lcoord` fails and nothing is +recorded. Faithful, and now commented so it does not read as a gap. + +The durable outcome is `JournalPanelLiveBindTests` — see +`claude-memory/feedback_test_the_binding_seam.md`. Completes the panel Campaign QT mounted: QT shipped the Contracts tab and left the other two inert by design. **Scope:** retail's `gmJournalUI` (element type `0x10000048`, page