Repository navigation
fix(contacts): photo recruit review fixes + clearable rival banner (#184 follow-up) - #185
Conversation
- Generate reads the current name (was a stale closure when typed last) - Replacing the photo no longer cancels a queued job's polling - Add to Roster revalidates the name and guards against double taps - Photo recruits are complete GangMember records (no 'as any') - Status/approve fallbacks no longer erase generated image URLs Regression tests fail on #184 and pass here. Refs #183, #184.
A single dismissedId brought the previous alert back as soon as the next was dismissed, so with two or more open threats the banner never cleared and covered the Contacts header on phones. Newer threats still show. Pre-existing on main. Refs #183.
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_d96ef001-44cc-4131-891d-0044efafc975) |
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 89e6242636
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_702fd96c-712c-4f15-8a54-c934831b8f5a) |
|
Addressed Codex review 4138611208 in b8af027. The typed GangMember.backstory remains a string; Contact Detail now renders that string visibly while preserving the existing structured-object path. Evidence:
No roster/store/data-model, backend, Supabase, deployment, or gameplay changes. |
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_722d5249-bf0f-4030-a885-fee04b3e9b27) |
Summary
Follow-up to #184 (stacked on
feature/183-personal-crew-contacts). It fixes the confirmed review findings in the photo-recruit flow, plus a pre-existing rival-banner bug the browser playtest found blocking the Contacts header on phones.Merge order: #180 → #181 → #182 → #184 → this PR.
What changed
handleGenerateleftmemberNameout of its dependencies. Typing the name last, as the on-screen order suggests, made Generate do nothing (Codex P1).addMember({...} as any)created members with no stats, morale, gangId, experience or health.buildPhotoMember()fills a completeGangMemberwith the same neutral starting line as the other recruit paths.GhostThreatBannerkept onedismissedId. With two or more open threats, dismissing one brought the other back, so the banner could never be cleared. On phones it covered Contacts' Back, + Add, and tabs. This predates #180 (already onmain).Validation
PhotoMemberCreatortests all fail on the feat(contacts): personal custom crew recruiting for single-player launch (#183) #184 head for the expected reasons and pass here. The new banner test fails on the old logic and passes here.npm run validate: 82 files, 979 passed / 4 skipped, lint 0 errors / 200 warnings (the baseline; feat(contacts): personal custom crew recruiting for single-player launch (#183) #184 had 201 because of the missing dependency).npm run build: passes.VITE_DEMO_MODE=1, backend offline, fictional test image), at 390×844 and 1440×900:gangId: demo-gang, contact avatar).Still open (not in this PR)
useGangStore.removeMemberdrops the member but leaves its contact card, anddemoSeedruns remove-then-add on every load. A fresh demo shows "ACTIVE (9)" with duplicate Dre/Rome/lookout cards and React duplicate-key warnings. The fix belongs ingameStore.ts, which the upcoming heat/territory rewiring is likely to touch, so I left it for whoever owns that file.docs/AI_CONTRIBUTOR_START_HERE.mdneeds an owner decision (Codex P1 on feat(contacts): personal custom crew recruiting for single-player launch (#183) #184).blockLoopFixture.Coordination note
Another agent is planning ecosystem changes: one connected heat, a core-loop-only home screen, Ghost Crews only, and Drive-By as the flagship fight. This PR only touches
PhotoMemberCreator.tsx,GhostThreatBanner.tsx, their tests, anddocs/PROJECT_LOG.md. The open stack (#180–#182) touchesOSShell.tsx,blockLoopStore.ts,ghostCrewStore.ts,CityBriefing*,UnifiedEncounter.tsx,prepareEncounter.tsandthreatHandoff.ts. Work in those areas should branch from the top of the merged stack.Refs #183, #184.
Note
Low Risk
Presentation-only Contacts backstory branching and local banner dismiss state; no auth, persistence, or gameplay authority changes in this diff.
Overview
Contacts contact-detail Backstory now supports photo recruits’ string
backstory(e.g. “Joined the crew from your Contacts.”) while keeping the legacy origin/reason object layout. A focused Contacts regression opens a photo recruit profile and asserts that text is visible.GhostThreatBanner no longer tracks a single dismissed event id. Dismiss (✕) adds every currently open attack/claim to a dismissed set so stacked threats don’t reappear one-by-one and block the phone Contacts header; newer feed events can still surface. A GhostThreatBanner test covers dismiss-all and a later threat.
docs/PROJECT_LOG.md records the #185 backstory fix, #184 banner behavior, and integration notes.
Reviewed by Cursor Bugbot for commit fba73bf. Bugbot is set up for automated code reviews on this repo. Configure here.