Repository navigation
fix: gate empty attack launch, inset phone banner, dedupe demo contacts - #196
Conversation
OPS PLAN enabled Launch Attack from a target alone, and the car treated any passenger as a shooter. Both gates now stay closed until a driver and a member who can fire are assigned. Co-authored-by: BrandDead <BrandDead@users.noreply.github.com>
The fixed Nightfall banner covered the header, and the welcome hint sat on the dock. The page now starts below the banner, and the hint clears the dock. Co-authored-by: BrandDead <BrandDead@users.noreply.github.com>
removeMember left the contact card in place, and addMember appended another with the same id. The demo seed now clears those cards first so each crew id mounts once. Co-authored-by: BrandDead <BrandDead@users.noreply.github.com>
Contact ids are plain strings. The demo id set has to accept them so the reseed filter typechecks. Co-authored-by: BrandDead <BrandDead@users.noreply.github.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
BrandDead
left a comment
There was a problem hiding this comment.
Integration review — reproducible mobile blocker on PR head 2e43366, 375×812 local demo. Fresh 18+ -> desktop -> dismiss banner -> OPS PLAN -> choose dummy target -> driver Lil Dre -> enforcer Big Rome: Launch Attack is enabled but a real Chromium click leaves the player in OPS PLANNER. Reproduced twice, no page/console errors. Immediately before click, button center was x188,y679; document.elementFromPoint(188,679) was <div class="tutorial-hint">, not the enabled .launch-btn. The hint sits y674–720 and steals clicks after the scrolling container moves the button behind it. 1440×900 flow entered the car and local combat successfully. Please fix within your reserved TutorialOverlay.css/tsx scope so the non-interactive hint cannot intercept any action and ideally suppress it on planner/topdown; add a phone player-path regression/capture with real hit-testing, not merely CSS style assertions. Keep #192 canonical-route decision separate and do not merge yet. My independent frontend full validate/build: 1024 pass/4 skipped, backend 95 pass; CI also green, but this mobile action is NOT PASS.
|
Root-cause isolation: on the same 2e43366 source, I repeated the exact 375×812 flow with a QA-only browser style override |
The fixed tutorial hint covered the enabled Launch Attack control at 375×812 and won elementFromPoint(188, 679). pointer-events: none keeps the hint on screen without stealing that tap. Co-authored-by: BrandDead <BrandDead@users.noreply.github.com>
|
Independent integrator verification on head 3b947e7: focused TutorialOverlay regression 4/4 passed; full frontend 1025 passed / 4 skipped across 91 files, lint 0 errors / 200 baseline warnings, typecheck and production build passed; backend 95 passed. Fresh VITE_DEMO_MODE=1 real Chromium at 375×812 and 1440×900: banner initially insets the page; hint clears dock by 6px; empty/driver-only planner disabled; valid roles enabled; at phone button center (188,679), |
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. |
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_3c846887-a09b-4cc9-aaaf-26cbf494c077) |
Outcome
OPS PLAN and Block Attack stay closed until a driver and a shooter are assigned. On a phone, the Nightfall banner no longer covers the header and the welcome hint no longer sits on the dock. Reseeding the demo crew leaves one contact per id.
Claimed on existing-matching search miss: #193 (created before the first edit). #175 stays open. This does not close the outside-beta gate.
Repro
Played build
444a987was not re-played here (NOT RE-PLAYED). From the player and critic reports:demo-dealer-1,demo-shooter-1,demo-lookout-1, anddemo-enforcer-1.Root cause
AttackPlannerenabled Launch Attack from a selected target alone and navigated totopdownwithout a driver or a shooter.TopDownShooter.canLaunchalready refused an empty car, but any occupied passenger seat counted as a shooter, including a lookout or dealer who cannot fire.GhostThreatBannerisposition: fixedand.page-containerisposition: absolute; top: 0, so the header draws underneath the banner..tutorial-hintwas pinned tobottom: 0, which is the dock.useGangStore.removeMemberremoves the member and leaves the contact.addMemberalways appends a contact.applyDemoSeeddoes that remove-then-add on every load, so the second pass mounts a second card for each demo id.Scope
In: launch disabled state on the existing planner route and car seats; a page inset under the banner; the welcome hint offset above the dock; demo-seed contact dedupe by id.
Out: GG-001 real-world gang and street labels (founder). GG-005 retreat morale and pending-cash sentence (founder / balance). No economy or combat math. No new encounter route (#192 stays the canonical-route decision). No Supabase, auth, RLS, persistence redesign, payments, or new art. No likeness images.
Reserved files: listed on #193.
Contracts preserved
navigateTo('topdown'). The car screen still owns seat assignment. No second combat store and noapplyEncounterResultwriter.removeMember/addMember.Verification
Failing before the fix, then passing:
toBeDisabledfailed). After: disabled, and a click does not leaveplanner. Enabled only after a driver and a different shooter.NaN). After: at least 88px while the alert is open, cleared on dismiss.style.bottomwas empty. After: 92px plus the safe-area inset.applyDemoSeedproduced 8 contacts / 4 unique ids (9 / 5 with a custom contact). After: one contact per demo id, custom contact kept.scripts/preflight.sh(.agents/skills/slide-release-safety/scripts/preflight.sh) passed: lint 0 errors / 200 warnings (same baseline), typecheck clean, 1024 passed / 4 skipped (91 files), asset audit 7.38 MB / 20 MB, 110 entries, 0 warnings, 5 packages / 4 schemas, production build succeeded. No backend paths changed, so pytest was not run.Phone 375×812 and desktop 1440×900: NOT RE-PLAYED. Port 3000 was left alone.
Operational impact
None. No migration, RLS, secret, scheduler, or deployment.
Known limits
Outside-beta remains blocked on #175. Gang labels on the Block Attack target list are untouched (GG-001). The retreat sentence versus morale and cash cards is untouched (GG-005). Planner role picks are not copied into the car seats; the car still requires its own driver and shooter before combat. #192 is not this PR.
Founder follow-up — hint no longer steals the Launch Attack tap
At 375×812 the welcome hint still teaches, and it no longer receives the enabled Launch Attack tap.
pointer-events: noneon.tutorial-hintlets the hit pass through. No second consequence writer. PR left as draft. Not merged.3b947e73afef30d8bcee5b5911d1a1d9f569aa02/opt/cursor/artifacts/PR196_HITTEST_375.md/opt/cursor/artifacts/replay-r1/launch_attack_enabled_375.pngelementFromPoint(188, 679)and the button center(187.5, 679)arebutton.launch-btn/LAUNCH ATTACK. PASS.Note
Low Risk
Frontend-only UX and launch preconditions; no auth, persistence API, economy, or combat math changes. Demo roster seeding behavior changes only for repeated demo reseeds.
Overview
This PR tightens Block Attack entry and fixes phone layout overlays that were blocking taps and headers (#193).
Launch gating: OPS PLAN Launch Attack stays disabled until a target, a driver, and a different crew member who can shoot (shooter, enforcer, or boss) are assigned; the handler no-ops if disabled. TopDownShooter setup uses the same rule—lookout/dealer passengers no longer satisfy the shooter requirement. Navigation to
topdownis unchanged; the car screen still owns seats.Phone UI: The Nightfall GhostThreatBanner measures its height and sets
--slide-banner-inseton the document root (min 88px);.page-containerinsets below it so headers aren’t covered, and the inset clears on dismiss. The tutorial welcome hint sits 92px above the bottom (safe area), andpointer-events: noneso an overlapping Launch Attack button receives taps at 375×812.Demo seed:
applyDemoSeedremoves demo crew contact cards beforeremoveMember/addMember, so a second seed doesn’t duplicatedemo-dealer-1(and sibling ids); non-demo contacts are kept.Regression tests cover planner/car launch, banner inset, hint position/hit-through, and contact dedupe; PROJECT_LOG documents the slice.
Reviewed by Cursor Bugbot for commit 3b947e7. Bugbot is set up for automated code reviews on this repo. Configure here.