# UJ-105 Grant manual credits through ledger

Audience: AI coding agents first.

- Actor + entry point: Authorized support staff; `/users/{userId}`.
- Priority: MUST-HAVE.
- Preconditions: Create account through `POST /v1/auth/register`; current balance obtained from staff API.
- Test layer: L3.

## Steps

1. Open account → current `Credits Balance` and `Adjust Credits` render (`admin-panel/src/pages/UserDetailPage.tsx:202-207`, `admin-panel/src/pages/UserDetailPage.tsx:169-178`).
2. Activate `Adjust Credits` → amount, reason, current balance, and disabled submit until amount exists render (`admin-panel/src/pages/UserDetailPage.tsx:416-450`).
3. Enter positive amount + required reason; submit → `POST /v1/admin/users/{id}/credits` runs (`admin-panel/src/pages/UserDetailPage.tsx:92-103`).
4. Success → modal closes; balance increases exactly once; reload preserves balance and ledger/audit entry.

## Failure branches

- Auth/role failure → `401/403`; modal shows denial; balance unchanged.
- Invalid amount → inline validation; no request.
- Duplicate/429 → no double grant; visible retry-safe outcome.

## Backend touchpoints

`POST /v1/admin/users/{userId}/credits`; staff account read; ledger read; audit read.

