Skip to content

feat: add RigPanel UI to drive a retarget (clip picker, diagnostic preview, write handoff) - #6139

Merged
atomantic merged 2 commits into
atomantic:mainfrom
Bryandero98:fix/rigpanel-retarget-ui
Sep 4, 2026
Merged

feat: add RigPanel UI to drive a retarget (clip picker, diagnostic preview, write handoff)#6139
atomantic merged 2 commits into
atomantic:mainfrom
Bryandero98:fix/rigpanel-retarget-ui

Conversation

@Bryandero98

Copy link
Copy Markdown
Contributor

Summary

  • The retarget lane shipped server-side in Retarget clips onto rigged GLB records with motion proof #5893 (POST /api/rigging/models/:id/retarget, GET /api/rigging/clips) but had no UI — the only way to animate a rigged character was to call the endpoint by hand.
  • apiRigging.js: adds listRiggingClips() and retargetImageTo3dModel(), mirroring the existing getRiggingReadiness() / rigImageTo3dModel() contract.
  • RigPanel.jsx: once a rig is ready, fetches the clip library (an empty roster gets an explaining line, not a dead picker), runs a diagnostic preview showing the proposed head-zone cleanup vs its cap and the motion numbers, and offers an explicit "Apply cleanup" write action.
  • The write action is only reachable after a diagnostic run, and is refused-with-reason (no button offered) rather than attempted when the proposal is over cap.
  • A gate refusal renders the server's own sentence verbatim (RIGGING_SKELETON_INCOMPATIBLE, RIGGING_RETARGET_GATE_FAILED, …), same contract as the existing rig section.
  • The published animation's download link appears once a write run lands, reading record.retarget the way the panel already reads record.rig.

Test plan

  • RigPanel.test.jsx — new tests: empty clip library explains itself, diagnostic preview shows proposed cleanup with nothing written yet, over-cap proposal refuses the write action with a reason instead of offering it, write handoff from a diagnostic result publishes and shows the download link, gate refusal renders the server's sentence verbatim.
  • npx vitest run src/components/media/RigPanel.test.jsx — 9/9 passing.
  • npx vitest run src/services/index.test.js — barrel/README parity check passes.
  • biome lint clean on all four changed files.

Closes #6065

🤖 Generated with Claude Code

…eview, write handoff)

The retarget lane shipped server-side in atomantic#5893 (POST /api/rigging/models/:id/retarget,
GET /api/rigging/clips) but had no UI — the only way to animate a rigged character was
to call the endpoint by hand.

- apiRigging.js: adds listRiggingClips() and retargetImageTo3dModel(), mirroring the
  existing getRiggingReadiness()/rigImageTo3dModel() contract (updated model record on
  success, the server's measured sentence surfaced verbatim on refusal).
- RigPanel.jsx: once a rig is ready, fetches the clip library (explaining an empty
  roster rather than rendering a dead picker), runs a diagnostic preview showing the
  proposed head-zone cleanup vs its cap and the motion numbers, and offers an explicit
  "Apply cleanup" write action — refused-with-reason instead of offered when the
  proposal is over cap. The published animation's download link appears once a write
  run lands, same pattern as the existing rig section.

Refs atomantic#6065
@atomantic
atomantic merged commit 7a584ec into atomantic:main Sep 4, 2026
7 checks passed
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.

RigPanel has no control to run a retarget: pick a clip, choose diagnostic vs write, read the measured proposal

2 participants