Skip to content

M9-S5: seller live auction observation#109

Merged
erikshafer merged 3 commits into
mainfrom
m9-s5-seller-live-auction-observation
Jun 13, 2026
Merged

M9-S5: seller live auction observation#109
erikshafer merged 3 commits into
mainfrom
m9-s5-seller-live-auction-observation

Conversation

@erikshafer

Copy link
Copy Markdown
Owner

Summary

  • Wire the seller SPA's BiddingHub SignalR connection: message parsing (3-kind discriminated union via Zod structural discrimination), cache bridge (re-query on push per ADR 026), per-page listing-group joins via useWatchListing
  • Build the listing detail page at /listings/$id with live auction panel: current bid, bid count, close time, confidential reserve-crossing indicator (cross-BC join of CatalogListingView + SellerListingSummary via route search params), extended-bidding banner, and terminal outcomes (sold/passed/withdrawn)
  • Observer-protagonist experience — the seller watches but has no action controls (no bid panel), matching narrative 005's "he has no commands to send"

Details

SignalR activation: SellerSignalRProvider rewritten from null-stub (parseMessage returning null) to full provider using createSignalRProvider<HubMessage>. Seller-local message parser is a narrower copy of the bidder's — drops SettlementCompletedNotification and BidderGroupNotification.

Cross-BC data join: The reserve indicator compares currentHighBid (Listings BC's CatalogListingView) against reservePrice (Selling BC's SellerListingSummary), passed via Zod-validated route search params from the dashboard.

Tests: Seller 55 → 84 (+29 tests). Bidder 25 and ops 47 baselines preserved. All three SPAs build clean, TypeScript strict.

Backend: Zero .cs files touched.

Test plan

  • Seller Vitest: 84 passing (11 test files)
  • Bidder baseline: 25 passing
  • Ops baseline: 47 passing
  • tsc --noEmit clean
  • vite build clean
  • HTTP smoke: session → register → create Flash draft → submit → verify Published + CatalogListingView
  • SPA proxy: all three endpoints (listings, listing detail, SPA index) return 200 through Vite dev-server proxy
  • Full live-observation smoke (requires operator session start + bidders — documented in retro as expected limitation of Flash format)

Narrative 005 Moments 1-4 from the seller's vantage: wire
BiddingHub message parsing, cache bridge, listing detail page
with reserve indicator, extended-bidding banner, gavel-fall,
and transient activity feed.
… detail page

Wire the seller SPA's BiddingHub connection to parse auction-lifecycle messages
and build the listing detail page at /listings/$id. The seller observes live bid
activity, a confidential reserve-crossing indicator (cross-BC join of
CatalogListingView + SellerListingSummary), extended-bidding status, and
terminal outcomes (sold/passed/withdrawn) — the observer-protagonist experience
narrative 005 dramatises.

SignalR: message parsing (3-kind discriminated union), cache bridge (re-query
on push), per-page listing-group joins via useWatchListing.

Tests: 55 → 84 (+29). Bidder 25 and ops 47 baselines preserved.
@erikshafer erikshafer self-assigned this Jun 13, 2026
The unit-tests job had hard-coded test-class filters that were never updated
as the project grew: Selling covered 3 of 13 test classes, Participants
covered 1 of 3. Every test class was already run unfiltered by the
integration-tests matrix, making the unit-tests job redundant for everything
except Contracts.Tests (which was only there).

Fix: drop unit-tests entirely, add Contracts.Tests to the integration matrix,
remove unit-tests from the CI aggregator's needs + verification loop.
@erikshafer erikshafer merged commit 0fdfcd6 into main Jun 13, 2026
14 checks passed
@erikshafer erikshafer deleted the m9-s5-seller-live-auction-observation branch June 13, 2026 18:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant