Skip to content

Sprint 15-B: Market MEMBERS tab, Most Wanted board, Get Back clock - #97

Merged
BrandDead merged 2 commits into
main-tL2525from
feat/marketplace-mostwanted-getback
Aug 6, 2026
Merged

Sprint 15-B: Market MEMBERS tab, Most Wanted board, Get Back clock#97
BrandDead merged 2 commits into
main-tL2525from
feat/marketplace-mostwanted-getback

Conversation

@BrandDead

Copy link
Copy Markdown
Owner

Priority 2 and Priority 4 from the app audit. Priority 1 and 3 are delegated to Claude/Opus 5 (see CLAUDE_SPRINT_15A_PROMPT.md).

Priority 2 — Market MEMBERS tab

Underworld hires come pre-leveled: you pay to skip the grind. Four tiers with monotonic pricing, but loyalty falls and heat rises as tier climbs, so a legend shooter is a real tradeoff rather than a straight upgrade. Baggage odds scale from 10% at street to 85% at legend and every listing states the catch openly.

Seven roles including K9, which is expensive to buy but cheap to feed and has no special people. Listings are seeded off their id so a board survives re-renders mid-purchase. Board refresh costs $250 so it cannot be rerolled for free. Roster capped at 24 active to keep payroll bounded.

Priority 4 — Most Wanted board

Post contracts on opps in your book, or on their special people. Cash somebody else's by uploading a proof screenshot; payout is automatic and public.

Three mechanics make it interesting:

  1. The payout is public record — cashing tells the target's gang who to come see.
  2. Fulfilling a contract makes you the poster's ally, which is how alliances form without a friend system.
  3. Contracts on special people crater the target member's loyalty rather than killing them — how you make somebody flip.

Verification is trust-first by design. A real referee needs a server, so instead the receipt is public and reputation does the policing.

Priority 4 — Get Back clock

NBA-style shot clock on revenge. Wall-clock derived, so backgrounding the app cannot desync it. Success doubles the morale the offender banked and strips it from them; letting it lapse costs your own gang 12 morale. Resolution is idempotent so morale can never be double-applied, and lapsed windows are swept on the component's own tick so penalties land even if the player never opens the panel.

Wiring

  • RANKINGS renamed to CLOUT; new WANTED app with a live open-bounty badge
  • most_wanted route plus GetBackClock as a global overlay
  • Market emoji purge — removed the dead icon field from ITEM_CATALOG since the UI now uses text labels

Verification

  • 565 tests passing (up from 430) — 135 new across three suites
  • Typecheck clean except three errors that pre-date this branch on main-tL2525
  • Production build succeeds

@vercel

vercel Bot commented Aug 6, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
slide Ready Ready Preview Aug 6, 2026 10:50pm

@cursor

cursor Bot commented Aug 6, 2026

Copy link
Copy Markdown

Bugbot is not enabled for your account, so this pull request was not reviewed.

Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs.

BrandDead added 2 commits August 6, 2026 22:46
Priority 2 and Priority 4 from the app audit. Priority 1 and 3 are
delegated to Claude/Opus 5 via CLAUDE_SPRINT_15A_PROMPT.md.

Market MEMBERS tab (Priority 2)
- marketMembersCatalog.ts: procedural hireable generator. Four tiers
  (street/seasoned/certified/legend) with monotonic pricing, and an
  inverse relationship between tier and loyalty — the good ones cost
  more and hold worse. Heat factor and baggage odds both rise with
  tier, so a legend shooter is a genuine tradeoff rather than a
  straight upgrade. Seven roles including k9, which is cheap to keep
  and has no special people.
- Listings are seeded off their id so a board survives re-renders
  mid-purchase and can be rebuilt without persisting every field.
- MarketMembers.tsx/.css: listing wall plus detail sheet showing stats,
  origin story, terms, special people, and the catch. Board refresh
  costs money so it cannot be rerolled for free. Roster capped at 24
  active to keep payroll bounded.

Most Wanted board (Priority 4)
- mostWantedStore.ts: post, cancel, and fulfil bounties plus an ally
  ledger. Listing fee is non-refundable on cancel, minimum reward
  scales with target level, and contracts on a member's people carry a
  premium. canFulfil blocks self-cashing and double payouts.
- MostWanted.tsx/.css + MostWantedApp.tsx/.css: aged-paper poster wall,
  post form with photo upload, proof-screenshot upload that pays out
  automatically, and an allies tab with standing meters. Fulfilling a
  contract saves the poster as an ally and opens a Get Back window
  against the hunter — the war starter.
- Proof and payout are public record by design; reputation does the
  policing rather than a server-side referee.

Get Back clock (Priority 4)
- getBackStore.ts: wall-clock-derived revenge windows so backgrounding
  the app cannot desync them. Success doubles the morale the offender
  banked and strips it from them; expiry penalises the retaliator.
  Resolution is idempotent so morale can never be applied twice.
- GetBackClock.tsx/.css: shot-clock badge above the dock with an
  expandable panel listing open debts and who is catchable. Sweeps
  lapsed windows on its own tick so penalties land even if the panel
  is never opened. Gang-wide morale is applied per active member,
  since morale lives on members not on the gang.

Wiring and cleanup
- OSShell: RANKINGS renamed to CLOUT; new WANTED app with a live
  open-bounty badge.
- App.tsx: most_wanted route plus GetBackClock as a global overlay.
- Market.tsx: emoji purge. Removed the dead `icon` field from
  ITEM_CATALOG (scripts/strip_market_icons.py) since the UI now uses
  CATEGORY_TAGS text labels.

Tests: 565 passing, up from 430. Typecheck clean except three errors
that pre-date this branch on main-tL2525. Production build succeeds.
Rebase onto main-tL2525 (post #98/#101/#96 merges):
- OSShell.tsx conflict: keep CLOUT label from #97 + shot-caller
  artwork from #96 (GPT audit recommendation)
- App.tsx: auto-merged cleanly

P0 fixes:
- Remove CLAUDE_SPRINT_15A_PROMPT.md and SPRINT_15B_NOTES.md
  (internal sprint artifacts should not be in product PRs)
- marketMembersCatalog.ts: fix invalid CityRegion 'east' -> 'miami'
- MarketMembers.tsx: replace hardcoded roster cap 24 with
  maxMembers from useGangStore (store cap is 20)
- k9/recruit/police are now in MemberRole union (from #98 merge),
  so no 'as MemberRole' cast is needed here

581 vitest tests pass (26 test files — 3 new from #97).
@BrandDead
BrandDead force-pushed the feat/marketplace-mostwanted-getback branch from bfa22a5 to 98eeca9 Compare August 6, 2026 22:48
@BrandDead
BrandDead merged commit 0e2aed0 into main-tL2525 Aug 6, 2026
2 of 3 checks passed
@BrandDead
BrandDead deleted the feat/marketplace-mostwanted-getback branch August 6, 2026 22:48
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