Skip to content

docs: graphics-first Nightfall integration evidence (#77/#190) - #211

Open
BrandDead wants to merge 1 commit into
main-tL2525from
feature/77-nightfall-integration-proof
Open

BrandDead wants to merge 1 commit into
main-tL2525from
feature/77-nightfall-integration-proof

Conversation

@BrandDead

@BrandDead BrandDead commented Oct 17, 2026 •

Copy link
Copy Markdown
Owner

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 9227dc67d0ce174b7960ceaa06f42f865cf84abc passes 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.

  • Four fix: render Nightfall role art and align tactical taps #205 normal/failure viewport runs: 48/48 checks; 0 uncaught page errors. Recorded baseline HTTP404 console errors are not hidden.
  • Existing fix: render Nightfall role art and align tactical taps #205 validation: 1,039 passed / 4 skipped / 92 files; focused7/7; TypeScript; 0 lint errors /200 existing warnings;112 assets at7.70MB;5 packages/4 schemas; demo build passed; published frontend/backend CI successful.
  • This independent evidence branch validation: 1,033 passed /4 skipped /91 files; TypeScript and both asset gates passed;0 lint errors /same200 warnings. Whitespace, local document links, screenshot references/hashes, QA-script syntax and reserved-file scope checks passed.

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.md gets 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 plus verification-summary.json, build/validate/CI logs for main and #205, and qa-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.

Close the final-source phone/desktop and image-failure evidence gap for PR205 without duplicating source ownership or approving unfinished member art.
@vercel

vercel Bot commented Oct 17, 2026 •

Copy link
Copy Markdown

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

Project Deployment Actions Updated
slide Ready Ready Preview Oct 17, 2026 6:03pm UTC

Request Review

@cursor

cursor Bot commented Oct 17, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot 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)

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 17, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-17T18:05:21.357841Z 54e9b38 PR opened
🔒 Security Review ✅ Completed 2026-10-17T18:05:51.182676Z 54e9b38 PR opened
ℹ️ 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" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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]))});

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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/'))});

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

Comment on lines +135 to +139
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]))});

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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')});

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

This branch was successfully deployed

1 active deployment
Preview — 54e9b381 Deployed Oct 17, 2026 by vercel[bot]
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.

Adopt canonical visual stack: 2.5D tactical diorama block scene (art bible + camera contract)

1 participant