> ## Documentation Index
> Fetch the complete documentation index at: https://docs.nudj.cx/llms.txt
> Use this file to discover all available pages before exploring further.

# v2.454.0

> Released July 21, 2026

## 🟠 Release v2.454.0

⭐⭐ Moderate Complexity • 17 commits • 87 files changed

<Note>
  **Reward fulfilment tracking, game score stability, and platform polish.** Admins can now see every reward redemption with the delivery details members submitted, while members see reward allocation states correctly. Game scores are bounded to prevent invalid states, and emoji avatars preserve their full code points.
</Note>

## What's New

* **See who redeemed each reward and their delivery details** — admins now have a dedicated Fulfilment table showing every redemption with member info, redemption timestamp, and all delivery details they provided at redemption
* **Correctly display unallocated rewards** — members no longer see unallocated rewards marked as "Missed Out"; they're now properly shown as unavailable
* **Prevent invalid game scores** — games now enforce score caps at both the API route and the scoring engine to prevent out-of-bounds values
* **Fix emoji avatar display** — emoji avatars now preserve full Unicode code points instead of truncating multi-byte characters
* **Polish admin UI** — improved image picker behavior, sharper scratch-game win-rate display, cleaner post creation flow

## Apps Updated

<CardGroup cols={3}>
  <Card title="User App" icon="mobile">
    ✓ Updated - 3 fixes
  </Card>

  <Card title="API" icon="server">
    ✓ Updated - 3 fixes + 1 feature
  </Card>

  <Card title="Admin" icon="gear">
    ✓ Updated - 4 features + 2 fixes
  </Card>

  <Card title="MCP Server" icon="robot">
    ✓ Updated - 1 fix
  </Card>

  <Card title="Design System" icon="palette">
    ✓ Updated - Banner rendering improvements
  </Card>

  <Card title="Games" icon="gamepad">
    — No changes
  </Card>
</CardGroup>

## Detailed Changes

<AccordionGroup>
  <Accordion title="Admin Panel" icon="gear">
    **New Features**

    * **Reward Fulfilment Tracker** — A new "Fulfilment" section in each reward's analytics page shows a paginated table of every redemption with member avatars, names, redemption timestamps, and all delivery details (shipping address, order info, etc.) the member submitted at redemption time. Empty state messaging clarifies whether the reward collects delivery details and shows "No one has redeemed this reward yet" if there are no redemptions
    * **Better reward copying** — When copying a reward, all redemption codes are now properly reset so the new reward starts with fresh codes
    * **Improved clarity on community duplication** — The "Copy existing community" flow UI is now clearer about what gets copied

    **Bug Fixes**

    * **Image picker overflow fixed** — The AI image generator in the image picker no longer overflows its container in the admin form
    * **Win-rate display precision** — Scratch game win-rate display now rounds to avoid floating-point noise (e.g., 66.666666% now displays as 67%)
    * **Removed broken Dark Mode section** — Deleted the non-functional "Custom Dark Mode Images" section from the post studio
  </Accordion>

  <Accordion title="User App" icon="mobile">
    **Bug Fixes**

    * **Correct reward allocation display** — Unallocated rewards no longer incorrectly show as "Missed Out". The reward state logic now properly distinguishes between allocations awaiting completion, completed allocations, and truly missed opportunities
    * **Emoji avatar preservation** — User avatars using emoji characters now display correctly without truncating multi-byte Unicode code points
    * **Cleaner post creation UX** — The "compose prompt" copy in the no-image state has been replaced with a subtle Nudj brand mark, creating a cleaner visual experience
  </Accordion>

  <Accordion title="API" icon="server">
    **New Features**

    * **Game score clamping** — Game scores are now strictly bounded at the API route handler and enforced within the game scoring engine to prevent out-of-bounds values that could corrupt game state

    **Bug Fixes**

    * **Reject disconnected setup challenges** — The API now properly rejects challenge setup requests when the underlying setup challenge is not properly connected to the action
    * **Setup writes observability** — Setup mutations now emit structured logs for better debugging and monitoring when setup flows encounter issues
  </Accordion>

  <Accordion title="MCP Server" icon="robot">
    **Observability**

    * **Setup operation logging** — Setup write operations now generate structured observability data for tracing and debugging agent-driven setup flows
  </Accordion>

  <Accordion title="Design System" icon="palette">
    **Improvements**

    * **Banner image rendering** — Enhanced the `get-banner-src.ts` utility with more robust image source resolution and fallback handling
  </Accordion>
</AccordionGroup>

## Reward Fulfilment Analytics

The new Fulfilment feature gives admins complete visibility into reward redemption outcomes:

### What admins see

Each reward's stats page now includes a "Fulfilment" card showing:

* **Member profile** — Name, email, and avatar of who redeemed
* **Redemption timestamp** — Exact date and time of redemption
* **Delivery details** — All custom fields the member provided (e.g., shipping address, t-shirt size, delivery instructions)

### Member context

The delivery details shown are exactly what members entered at redemption time. If a reward doesn't collect delivery details, the UI clarifies that ("This reward doesn't collect delivery details"). If no one has redeemed yet, a helpful empty state guides admins to share the reward.

### Use cases

* **Physical rewards** — Admins can track shipping addresses and see fulfilment status in one place
* **Contest entries** — View all participant details (phone, email, preferences) submitted with entries
* **Survey campaigns** — See all responses members provided during redemption
* **Personalized rewards** — Track which variants members selected at redemption

## Game Score Boundaries

Games now prevent invalid score states:

* **Route-level clamping** — The game completion endpoint (`/admin/game/[gameConfigId]/complete`) validates and bounds scores before processing
* **Engine-level enforcement** — The game scoring engine enforces the same caps internally to catch any edge cases
* **Prevention of data corruption** — Out-of-bounds scores that previously could corrupt leaderboards are now impossible

## Contributors

<CardGroup cols={4}>
  <Card>
    <img src="https://github.com/dch@wenudj.com.png" alt="dch@wenudj.com" style={{borderRadius: '50%', width: 48}} />

    **[dch@wenudj.com](mailto:dch@wenudj.com)**

    8 commits • +2,296/-321 lines
  </Card>

  <Card>
    <img src="https://github.com/solicshop@gmail.com.png" alt="solicshop@gmail.com" style={{borderRadius: '50%', width: 48}} />

    **[solicshop@gmail.com](mailto:solicshop@gmail.com)**

    5 commits • +1,771/-273 lines
  </Card>

  <Card>
    <img src="https://github.com/erek_d@me.com.png" alt="erek_d@me.com" style={{borderRadius: '50%', width: 48}} />

    **[erek\_d@me.com](mailto:erek_d@me.com)**

    3 commits • +4,011/-9 lines
  </Card>
</CardGroup>

## Release Stats

| Metric        | Value    |
| ------------- | -------- |
| Total Commits | 17       |
| Lines Added   | +8,229   |
| Lines Removed | -604     |
| Files Changed | 87       |
| Release Size  | Large    |
| Complexity    | Moderate |

***

*v2.454.0 deployed on July 21, 2026*
