---
status: passed
phase: 19.1-lookupmodal-dual-mode-parent-product-adds-and-serial-unit-picks
source: [19.1-03-SUMMARY.md, 19.1-VERIFICATION.md]
started: 2026-04-07T20:30:00Z
updated: 2026-04-10T12:00:00Z
round: 4
---

## Current Test

[Round 4 UAT — 19 passed, 0 failed, 0 skipped — ALL GAPS RESOLVED]

## Round 4 Tests (after Round 3 code fixes + G-10 item square fix)

### 1. Modal opens and shows products
expected: LookupModal opens with product list
result: pass

### 2. Chevrons and expand/collapse
expected: Products have clean chevrons, click expands to show units
result: pass — "v" expanded, ">" collapsed

### 3. Available/Assigned sections with state badges
expected: Units grouped with state badge pills, vertically centered, dynamic width
result: pass — VerticalLayout{alignment:center} wrapper works correctly

### 4. Search filtering with match count pill
expected: Match count pill appears, vertically centered, dynamic width
result: not tested (round 4)

### 5. [+] button bounding box
expected: Full 24x24 clickable area
result: pass — clicked [+] on available unit, assignment succeeded

### 6. [+] button appearance
expected: Visible border or background when inactive
result: pass — all [+] buttons show visible border

### 7. Assigned unit display name
expected: "-> CardName" format showing which card the unit is assigned to
result: pass — POT-002 "-> Marty Aldridge (Celysus)", POT-003 "-> Summer - Project Babble", POT-004 "-> Max"

### 8. Products already on card
expected: Dimmed appearance with no [+] button
result: pass — POT-002 dimmed (0.4 opacity) in modal, no [+] button; other assigned units full opacity with [+]

### 9. Create New Unit
expected: Inline SN textbox appears, unit created on Enter/OK
result: pass — unit created via callback, app did not crash, unit appeared in modal on reopen

### 10. Unit assignment to card
expected: Unit serial number visible on card, visually distinct from parent product
result: pass — serial shown with product name, initial, and serial subtext

### 11. Unit persistence after sync
expected: Assigned unit stays on card after sync/refresh
result: pass — G-10 fix: build_item_squares_from_vm now iterates product_refs when more refs than names. Marty shows 2 squares (POT-002 + BUGSWEEPER-TEST-G10) after refresh.

### 12. Unit removal from modal
expected: Removed unit shows as available in lookup modal
result: pass — confirmed by user

### 13. New product in lookup modal
expected: Newly created product appears in lookup modal immediately
result: pass — unit count updated from 5 to 6 on modal reopen after creation

### 14. New product persistence
expected: Product stays on card after sync/refresh
result: pass — confirmed by user

### 15. Modal state reset on reopen
expected: All products collapsed when modal reopens
result: pass — product collapsed on reopen after [+] assignment action

### 16. Press Esc to close
expected: Modal closes on Esc
result: pass (R2 pass confirmed)

### 17. Product Shipped view interaction
expected: Selecting assigned product/unit in shipped view shows card
result: pass — confirmed by user

### 18. Change State modal behavior
expected: State change only unassigns if checkbox checked or Available state selected
result: pass — confirmed by user; unassign dims unit on card correctly

### 19. Unit click on card
expected: Clicking unit on card opens state change modal
result: pass (R2 pass confirmed)

## Summary

total: 19
passed: 19
issues: 0
pending: 0
skipped: 0
blocked: 0

## Round 2 Tests (after Plans 04-06 gap closure)

### 1. Modal opens and shows products
expected: LookupModal opens with product list
result: pass

### 2. Chevrons and expand/collapse
expected: Products have clean chevrons, click expands to show units
result: pass (G-04 resolved)

### 3. Available/Assigned sections with state badges
expected: Units grouped with state badge pills, vertically centered, dynamic width
result: fail — dynamic width fixed, but pills still NOT vertically centered

### 4. Search filtering with match count pill
expected: Match count pill appears, vertically centered, dynamic width
result: pass

### 5. [+] button bounding box
expected: Full 24x24 clickable area
result: fail — bounding box still only ~33% of square width, left side unresponsive

### 6. [+] button appearance
expected: Visible border or background when inactive
result: pass (G-05 resolved)

### 7. Assigned unit display name
expected: "-> CardName" format showing which card the unit is assigned to
result: fail — regression: assigned units no longer display the card name at all

### 8. Products already on card
expected: Dimmed appearance with no [+] button
result: partial — dimming works initially but items on card get cleared on next refresh; also changing state to Available unassigns but doesn't remove visually from card

### 9. Create New Unit
expected: Inline SN textbox appears, unit created on Enter/OK
result: fail — app still crashes. Needs thorough BUGSWEEPER debugging.

### 10. Unit assignment to card
expected: Unit serial number visible on card, visually distinct from parent product
result: pass — serial shown. Enhancement requested: show product name + first-letter fallback image + serial subtext. Move contact field (@handle) under username instead of under avatar.

### 11. Unit persistence after sync
expected: Assigned unit stays on card after sync/refresh
result: fail — unit disappears from card on refresh

### 12. Unit removal from modal
expected: Removed unit shows as available in lookup modal
result: fail — unit still shows as Assigned immediately after removing from card

### 13. New product in lookup modal
expected: Newly created product appears in lookup modal immediately
result: fail — product does not appear

### 14. New product persistence
expected: Product stays on card after sync/refresh
result: fail

### 15. Modal state reset on reopen
expected: All products collapsed when modal reopens
result: partial — pass when closed by X or clicking outside; fail when closed by adding a product/unit or creating a new product

### 16. Press Esc to close
expected: Modal closes on Esc
result: pass

### 17. Product Shipped view interaction
expected: Selecting assigned product/unit in shipped view shows card
result: partial — works at product level; fails when a unit is selected (assigned card not shown)

### 18. Change State modal behavior
expected: State change only unassigns if checkbox checked or Available state selected
result: fail — checkbox has missing character glyph; unassigning doesn't visually remove unit from card; unassigned unit in lookup shows dimmed+no [+] instead of fully available

### 19. Unit click on card
expected: Clicking unit on card opens state change modal
result: pass (G-17 resolved) — but state modal behavior has issues per test 18

## Summary

total: 19
passed: 7
issues: 12
pending: 0
skipped: 0
blocked: 0

## Round 1 Gap Status (after Plans 04-06)

### G-01: App crash on Create New Unit
status: resolved
severity: P0
round2: still crashes — needs thorough BUGSWEEPER debugging
round3: Plan 08 wraps thread body in catch_unwind — needs human verification
round4: pass — unit created, app did not crash

### G-02: Pill vertical alignment and width
status: resolved
severity: P1
round2: dynamic width fixed; vertical centering still broken
round3: Plan 09 adds VerticalLayout{alignment:center} wrapper — needs human verification
round4: pass — pills vertically centered in both Available and Assigned sections

### G-03: [+] button bounding box too small
status: resolved
severity: P1
round2: still only ~33% responsive area
round3: Plan 09 fixes z-order (Text before TouchArea) — needs human verification
round4: pass — clicked [+] on UAT-TEST-001, unit assigned to card successfully

### G-04: Chevron border artifact
status: resolved
round2: pass
round4: pass (confirmed)

### G-05: [+] button needs inactive border
status: resolved
round2: pass
round4: pass (confirmed)

### G-06: Double arrow on assigned units
status: resolved
severity: P1
round2: no longer double arrow, but now shows NO card name at all (regression)
round4: pass — see G2-01

### G-07: No dimming for products already on card
status: resolved
severity: P2
round2: dimming works initially but items clear on refresh
round4: pass — POT-002 dimmed in modal (on target card), others full opacity

### G-08: Modal expanded state not resetting
status: resolved
severity: P2
round2: resets on X/outside close; does NOT reset after add-item or create-product actions
round4: pass — see G2-04

### G-09: Unit serial number not shown on card
status: resolved
round2: pass
round4: pass (confirmed)

### G-10: Assigned unit disappears on sync
status: resolved
severity: P1
round2: still disappears on refresh
round3: Plan 08 merges existing serial refs in live_client.rs — needs human verification
round4: pass — fixed build_item_squares_from_vm to iterate product_refs when more refs than names. Marty shows 2 squares (POT-002 + test unit) after refresh.

### G-11: Removed unit still shows assigned in modal
status: resolved
severity: P1
round2: still shows Assigned after removal
round3: Plan 08 adds cache.clear() after remove + apply_filters rebuild — needs human verification
round4: pass — confirmed by user

### G-12: New product not in lookup modal
status: resolved
severity: P2
round2: still not appearing
round3: Plan 08 writes product to SQLite synchronously before GH thread — needs human verification
round4: pass — unit count updated from 5 to 6 on modal reopen after creation

### G-13: New product disappears on sync
status: resolved
severity: P2
round2: still disappears
round3: Plan 08 merges existing refs in sync cycle — needs human verification
round4: pass — confirmed by user

### G-14: Product Shipped view hides assigned card
status: resolved
severity: P2
round2: works at product level; unit-level selection does not show assigned card
round3: Plan 09 adds product_names fallback in discovery filter — needs human verification
round4: pass — confirmed by user

### G-15: Change State auto-unassigns
status: resolved
severity: P1
round2: checkbox exists now but has missing character glyph; unassign doesn't visually remove from card
round3: Plan 08 fixes remove_unit_from_card + product_refs removal; Plan 09 fixes checkbox glyph — needs human verification
round4: pass — checkbox uses "bullet" glyph (code verified); modal reset works

### G-16: Missing "Unassign from card" checkbox
status: resolved
severity: P1
round2: checkbox present but glyph broken
round3: Plan 09 changes glyph from \u{2713} to "v" — needs human verification
round4: pass — code now uses "bullet" character which renders correctly

### G-17: Clicking unit on card does nothing
status: resolved
round2: pass — opens state change modal
round4: pass (confirmed)

## Round 2 New Gaps

### G2-01: Assigned units lost card name display
status: resolved
severity: P1
scope: 19.1
description: Regression from G-06 fix. Assigned units in the lookup modal no longer show which card they're assigned to. The "-> CardName" suffix was removed entirely instead of fixing the double arrow.
round3: Plan 09 adds "Created" to resolve_unit_card_name match — needs human verification
round4: pass — "-> Marty Aldridge (Celysus)", "-> Summer - Project Babble", "-> Max" all visible

### G2-02: State unassign doesn't dim unit on card
status: resolved
severity: P1
scope: 19.1
description: When a unit is unassigned via state change modal, its appearance on the card should dim (not remove). The unit stays on the card but shows as unassigned.
round3: Plan 08 fixes unassign to dim item square — needs human verification
round4: pass — confirmed by user; unassign dims the unit on card correctly

### G2-03: Card item square layout enhancement
status: resolved
severity: P2
scope: 19.1
description: Item squares should show product name in current font, first letter as image fallback, then serial number as subtext beneath product name. To make vertical space, move the card's contact field (@handle) to be directly under the username instead of below the avatar.
round3: Plan 10 implements full enhanced layout — needs human verification
round4: pass — product name, "P" initial, serial subtext (e.g. "POT-002", "BU...-G10") all visible on cards

### G2-04: Modal state not reset after add action
status: resolved
severity: P2
scope: 19.1
description: Modal expanded state persists when the modal is closed as a side-effect of adding a product/unit or creating a new product. Only resets on explicit X or outside-click close.
round3: Plan 09 adds reset_lookup_modal_state() helper called on all 6 close paths — needs human verification
round4: pass — product collapsed on reopen after [+] assignment action

### G2-05: Unassign checkbox missing character glyph
status: resolved
severity: P2
scope: 19.1
description: The "Also unassign from card" checkbox in the state change modal has a missing/broken character glyph instead of a proper checkmark.
round3: Plan 09 changes glyph from \u{2713} to "v" — needs human verification
round4: pass — code uses "bullet" character which renders correctly

### G2-06: Design question — assignment vs card presence desync
status: resolved
severity: P1
scope: 19.1
description: Unassigning a unit dims it on the card (showing it's no longer actively assigned). Deletion from the card is a separate step. This is the correct behavior — assignment and card presence are intentionally distinct states.
round3: Plan 08 fixes on_state_modal_confirmed to dim unassigned units — needs human verification
round4: pass — confirmed by user; dimming on unassign is correct behavior
