Repository navigation
Conversation
Close the final-source phone/desktop and image-failure evidence gap for PR205 without duplicating source ownership or approving unfinished member art.
|
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: 733526af-2092-4c22-a877-02bd5e4d3baf) |
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: 54e9b381ba
ℹ️ 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".
| const before = ledger ? JSON.parse(ledger) : null; | ||
| const after = report.ledgerAfterReload ? JSON.parse(report.ledgerAfterReload) : null; | ||
| report.checks.push({name:'Demo result receipt survives reload exactly once',pass:!!before && !!after && before.appliedEncounterKeys?.length===1 && JSON.stringify(before.appliedEncounterKeys)===JSON.stringify(after.appliedEncounterKeys)}); | ||
| report.checks.push({name:'Reload preserves booked money, heat, morale, and crew health',pass:!!before && !!after && ['money','playerHeat','blockMorale','crew'].every(k=>Object.hasOwn(before,k) && Object.hasOwn(after,k) && JSON.stringify(before[k])===JSON.stringify(after[k]))}); |
There was a problem hiding this comment.
Compare consequences against the pre-encounter ledger
If applying an encounter writes its receipt but fails to mutate cash, heat, morale, or crew health, this check still passes because it compares only the post-apply ledger with the post-reload ledger. The resulting evidence can therefore certify that consequences were “booked” without proving they were ever applied; capture the ledger before applying the result and assert the expected deltas before checking reload persistence.
AGENTS.md reference: AGENTS.md:L14-L14
Useful? React with 👍 / 👎.
| if (!state?.actors) throw new Error('Scene observer missing actors'); | ||
| await capture('encounter-entry'); | ||
| report.checks.push({name:'Named fictional opposition visible',pass:state.views.filter(v=>state.actors.find(a=>a.id===v.id)?.team==='opposition').every(v=>v.label.length>0)}); | ||
| report.checks.push({name:report.imageFailure ? 'Failed actor images have named fallback markers' : 'All opposition uses registered character Images, not circles',pass:state.views.filter(v=>state.actors.find(a=>a.id===v.id)?.team==='opposition').every(v=>report.imageFailure ? v.type === 'Arc' && v.label.length>0 : v.type==='Image' && v.texture.includes('/assets/runtime/'))}); |
There was a problem hiding this comment.
Require a view for every opposition actor
If one or all opposition actors fail to create an actorView, this assertion still passes because it filters the existing views and calls every on that possibly empty or incomplete subset. That lets the evidence certify that all opposition uses registered art while an opponent is completely absent; iterate over the opposition actors and require each one to have a matching image view.
AGENTS.md reference: AGENTS.md:L14-L14
Useful? React with 👍 / 👎.
| report.ledgerAfterReload = await page.evaluate(() => localStorage.getItem('dealt-slide-authoritative-block-loop-v1')); | ||
| const before = ledger ? JSON.parse(ledger) : null; | ||
| const after = report.ledgerAfterReload ? JSON.parse(report.ledgerAfterReload) : null; | ||
| report.checks.push({name:'Demo result receipt survives reload exactly once',pass:!!before && !!after && before.appliedEncounterKeys?.length===1 && JSON.stringify(before.appliedEncounterKeys)===JSON.stringify(after.appliedEncounterKeys)}); | ||
| report.checks.push({name:'Reload preserves booked money, heat, morale, and crew health',pass:!!before && !!after && ['money','playerHeat','blockMorale','crew'].every(k=>Object.hasOwn(before,k) && Object.hasOwn(after,k) && JSON.stringify(before[k])===JSON.stringify(after[k]))}); |
There was a problem hiding this comment.
Verify the reloaded player-facing state
When local storage survives but reload hydration or the return route is broken, these checks still pass because they only reread and compare the serialized ledger; the reloaded DOM is never asserted. This can report a successful player-path reload even if the player sees a blank, gated, or stale screen, so wait for the desktop and verify the visible receipt and persisted cash, heat, morale, and crew state after reload.
AGENTS.md reference: AGENTS.md:L14-L14
Useful? React with 👍 / 👎.
| await page.getByRole('button',{name:'Reload',exact:true}).click(); | ||
| state = await checkpoint('reload-start'); | ||
| await capture('reload-hud'); | ||
| report.checks.push({name:'Reload command emits real engine event',pass:state.events.some(e=>e.type==='reload-start')}); |
There was a problem hiding this comment.
Attribute action events to the selected crew member
If the player’s Fire or Reload command is a no-op while an AI opponent continues firing or reloading, the cumulative session.events.some(...) checks still find the same event types and report success. The captured reports confirm that opposition actors emit both weapon-fired and reload-complete, so snapshot the event IDs before each click and require new start/completion/fire events whose actorId matches the selected crew member.
AGENTS.md reference: AGENTS.md:L14-L14
Useful? React with 👍 / 👎.
Outcome
Founder-approved graphics-first coordination: reuse and verify the existing Nightfall integration instead of duplicating character/renderer work. This PR changes documentation/evidence only. PR #205 supplies the source repair; this PR supplies its fresh review evidence.
The inspected #205 commit
9227dc67d0ce174b7960ceaa06f42f865cf84abcpasses real built-demo phone/desktop checks for registered named opponent art, downed-state art, moves, firing, reload-complete and individual crew condition, retreat/apply/return, and one local demo result receipt after reload. Forced character-image failure completes the same path with named fallback markers. Protected-main negative comparison catches the two absent-art conditions.Evidence and gates
See
docs/evidence/2026-10-17-member-graphics-integration/README.md: 48 actual browser captures, six raw reports, hash-indexed summary, build/validation logs, and reusable read-only-observed QA script.Boundaries / review order
Reserved on issue #77. No source, runtime art, manifests, dependencies, game values, state/result writers, Supabase, secrets, deployment config, or existing contributor branches changed. No merge or production deployment performed. Do not auto-close #77/#190.
Read LAUNCH_READINESS.md and COLLABORATION.md from #210 before choosing this scope. The integration owner should review #205 and this evidence, reconcile #169/#210 ownership, and revalidate the eventual combined commit. #205’s draft status remains its author’s decision; this PR does not change it.
Independent visual review confirms this is not final member-art approval or game/launch completion. Repeated hooded identities, camera consistency, missing poses, small phone labels/letterboxing and Diorama phone-hit overlap remain. Reduced-motion Chromium emulation is not physical iPhone/Safari proof. Local demo receipts are not authenticated Supabase durability proof. No direct Grok connection or response is claimed.
Rollback: revert this evidence/documentation commit; no runtime behavior changes.
Note
Low Risk
Documentation and QA artifacts only; no application source, assets, persistence, or deployment configuration changes.
Overview
Adds founder-approved, evidence-only documentation for the existing Nightfall member-graphics integration (PR #205), without changing application code, assets, or runtime behavior.
docs/PROJECT_LOG.mdgets an append-only entry for 2026-10-17 (#77 / #190) describing scope, compared commits, and where the handoff lives.New
docs/evidence/2026-10-17-member-graphics-integration/packages the review artifact: a handoff README (decision, boundaries, before/#205/failure screenshots, gate tables), six raw browser reports plusverification-summary.json, build/validate/CI logs for main and #205, andqa-player-path.mjs—a read-only Playwright script that walks the demo Block Loop → Nightfall path on 390×844 and 1440×900 (normal and aborted character-image runs).The evidence documents that protected main fails the two “registered opposition/downed art” checks while #205 passes combat HUD, moves, fire/reload, retreat/apply/return, and local demo ledger persistence; it explicitly withholds final art approval, merge readiness, and launch claims.
Reviewed by Cursor Bugbot for commit 54e9b38. Bugbot is set up for automated code reviews on this repo. Configure here.