Skip to content

M9-S8: seller-obligation e2e + M9 close housekeeping#113

Merged
erikshafer merged 1 commit into
mainfrom
m9-s8-end-to-end-housekeeping
Jun 17, 2026
Merged

M9-S8: seller-obligation e2e + M9 close housekeeping#113
erikshafer merged 1 commit into
mainfrom
m9-s8-end-to-end-housekeeping

Conversation

@erikshafer

Copy link
Copy Markdown
Owner

Closes the M9 Seller Console milestone — the slice plan's close (renumbered from S7 to S8 after the CatalogListingView cross-queue race fix took S7 mid-milestone).

What's in this PR

Seller-perspective Playwright e2e (client/e2e/tests/seller-obligation.spec.ts) — the milestone's last owed artifact and the full obligation-lifecycle e2e M9-S6 deferred here. From the seller console's vantage: a seeded listing sells (forced via the dev Buy-It-Now trigger), the console surfaces the post-sale obligation, the seller provides tracking through the react-hook-form dialog, and the obligation auto-confirms to Fulfilled / "Completed". Two consecutive green runs against the live Aspire stack (17.6s, 13.3s).

Sanctioned dev-host config — the AppHost now sets Obligations__DemoMode=true. Reading the lived host config (frontend-slice-discipline Rule 1) surfaced that ObligationsOptions.DemoMode defaulted to false in the dev run, so the post-sale lifecycle ran on production timers (auto-confirm 3 days out) — making it un-demoable live and the e2e terminal unreachable. Enabling demo mode is the documented conference-demo posture; production binds DemoMode=false by default. (Escalated and user-confirmed mid-session, since it exceeded the "no backend change" envelope.)

Identity bridge = seed-then-inject (OQ-1) — the dev seed-flash endpoint already creates a registered seller + open listing; the e2e injects that sellerId into the console's session storage so the console adopts the seeded identity. No backend change; operator session management stays out of the seller console (milestone §3 non-goal).

Housekeeping

  • bounded-contexts.md: three SPAs + shared + e2e (was two SPAs).
  • STATUS.md: regenerated to v0.7 — M9 ✅ Complete, final slice ledger, 328 backend / 189 Vitest / 2 e2e, deferred ledger re-derived.
  • Milestone doc: status ✅ Complete, §7 slice table corrected (S7 = race fix, S8 = close), §1 exit criteria ticked with honest annotations.
  • CLAUDE.md §Frontend: verified current (no edit needed).
  • CI frontend matrix: verified it already covers seller (build-test) + shared/e2e (typecheck) — coverage landed at M9-S1, restructured at fix: remove shouldUnregister bug + CI pipeline restructure #111. No matrix edit.

Pre-M10 skills audit (per the m9-skills-review carry-forward)

  • Applied in-PR: frontend-slice-discipline extended to all SPAs + the e2e harness, and a Rule 1 note that host runtime config is part of the lived surface (the DemoMode lesson).
  • Carry-forwards to M10: a signalr-skill refresh (seller + the createSignalRProvider factory + the obligation push channel), the FakeHubConnection shared test-util extraction.

Retros: the M9-S8 slice retro + the M9 milestone retrospective.

Verification

  • dotnet build clean (0 errors; held NU1903 + CS0108 baseline warnings only).
  • dotnet test CritterBids.slnx: 328/328 green (Auctions 77, Api 46, Selling 45, Relay 45, Operations 38, Settlement 30, Listings 24, Obligations 16, Participants 6, Contracts 1).
  • SPA Vitest: bidder 25, ops 47, seller 117 (189) green; @critterbids/e2e type-checks clean.
  • Seller e2e: two consecutive green runs against the live Aspire stack.

Notes for review

  • Only domain-adjacent .cs change is one line in src/CritterBids.AppHost/Program.cs (the DemoMode dev-host env var). No CritterBids.Contracts change, no new domain events/sagas/BCs.
  • The e2e is local-only by recorded decision (M8-D2); the e2e member is type-checked in CI, not executed.

Closes the M9 Seller Console milestone (the slice plan's close, renumbered
from S7 to S8 after the cross-queue race fix took S7).

- Seller-perspective Playwright e2e (client/e2e/tests/seller-obligation.spec.ts):
  a seeded listing sells via the dev Buy-It-Now trigger, the seller console
  surfaces the post-sale obligation, the seller provides tracking through the
  console UI, and the obligation auto-confirms to Fulfilled. Identity bridge =
  seed-then-inject the seeded sellerId into the console session (no backend
  change). Two consecutive green runs against the live Aspire stack.
- AppHost sets Obligations__DemoMode=true so the post-sale lifecycle runs live
  in demo seconds (the documented conference-demo posture; production defaults
  to false). The dev host previously ran production timers (days), making the
  lifecycle un-demoable and the e2e terminal unreachable.
- Docs: bounded-contexts.md (three SPAs + shared + e2e), STATUS.md regenerated
  to v0.7 (M9 complete, 328 backend / 189 Vitest / 2 e2e), milestone doc closed
  + §7 renumbered + §1 ticked, narrative 006 e2e-coverage row.
- CI frontend coverage verified (seller+shared already covered since M9-S1).
- Pre-M10 skills audit: frontend-slice-discipline extended (all SPAs + e2e;
  host runtime config is part of the lived surface); signalr refresh +
  FakeHubConnection extraction recorded as M10 carry-forwards.
- M9-S8 slice retro + M9 milestone retrospective.

Backend 328/328 green; SPA Vitest 189 green; e2e member type-checks clean.
@erikshafer erikshafer self-assigned this Jun 17, 2026
@erikshafer erikshafer merged commit 482324f into main Jun 17, 2026
18 checks passed
@erikshafer erikshafer deleted the m9-s8-end-to-end-housekeeping branch June 17, 2026 13:55
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