Repository navigation
Closed
Labels
area:fullstackEnd-to-end Host and Client implementationEnd-to-end Host and Client implementationarea:ui-uxInteraction and visual experience; may accompany a code-layer areaInteraction and visual experience; may accompany a code-layer areafeature:avatarPersonaBot avatar media and activity framePersonaBot avatar media and activity frameready-for-agentFully specified, ready for an AFK agentFully specified, ready for an AFK agentscope:tracerHuman-testable implementation sliceHuman-testable implementation slice
Milestone
Description
Parent
Part of #1209.
What to build
A Human opens the Custom Part editor and draws a headpiece with front and back layers, using pencil, eraser, flood fill and mirror while watching a live 1× preview on their real Avatar. They save it to their Part Library and apply it to a PersonaBot. The part recolors when they change hair or body color, and it moves with head turns and gaze as a Window Companion. This is the first path for Custom Parts: BotPixel part data, validation and rendering → Host-owned Part Library → Avatar Appearance embedding → Client editor.
Acceptance criteria
- BotPixel defines a bounded Custom Part for the new headpiece slot with front and back layers around hair. Each cell is empty or holds a color source (appearance color slot or fixed color) plus a tone step on the rig's shade ramp.
- A Custom Part's identity is a content hash of cells, color references and slot. Name, author, origin and parent are metadata outside it, and content is immutable.
- The editor offers pencil, eraser, 4-connected flood fill and mirror locked to the Avatar centerline (mirror works with every tool). It has a slot-appearance × tone color grid with fixed colors, integer zoom with grid and slot bounds over the dimmed Avatar, a fixed 1× preview, and one-stroke-per-step undo/redo.
- Hair occlusion of the back layer is visible in the preview.
- The Part Library is Host-owned data in the current DSH Profile. It survives Client cache clears and restart, and marks parts drawn here as such.
- Applying a part embeds a copy in the Avatar Appearance. Editing the library part afterwards creates a new part and never changes the applied copy.
- The applied part follows its slot anchor through head motion, gaze and left/right turns using the slot's shift and far-side rules, in the roster and in a Window Companion.
- Recipes with Custom Parts carry the raised version and fall back to the snapshot on older Clients. Existing golden output is unchanged.
- Unit tests cover fill boundaries, the mirror axis, content-hash stability and validation bounds. Runtime acceptance on an isolated DSH Profile shows the part on a speaking Window Companion.
Blocked by
Metadata
Metadata
Assignees
Labels
area:fullstackEnd-to-end Host and Client implementationEnd-to-end Host and Client implementationarea:ui-uxInteraction and visual experience; may accompany a code-layer areaInteraction and visual experience; may accompany a code-layer areafeature:avatarPersonaBot avatar media and activity framePersonaBot avatar media and activity frameready-for-agentFully specified, ready for an AFK agentFully specified, ready for an AFK agentscope:tracerHuman-testable implementation sliceHuman-testable implementation slice
Activity
DoodleBears commentedon Oct 8, 2026
Claiming this tracer bullet. The BotPixel half (Custom Part data, content hash, validation, headpiece front/back rendering, fill and mirror algorithms) goes first in BotHarness/BotPixel; then the Host Part Library, Appearance embedding and the Client editor land here on
claude/festive-gauss-gv7xu2once #1235 merges.Agent-Task:
claude/cloud/session_01MozvQ2eMvqX1MzSqm9G2o8Generated by Claude Code
feat(avatar): Human-drawn Custom Parts in a headpiece slot (asset ver…
Draw a headpiece into the Part Library and wear it
feat(avatar): Human-drawn Custom Parts in a headpiece slot (asset ver…
Use @botharness/pixel-avatar 0.5.0
Address Part Library review findings
feat(avatar): draw a headpiece into the Part Library and wear it (#1237)
DoodleBears commentedon Oct 8, 2026
Delivered in #1237 (squash
369a325) with@botharness/pixel-avatar0.5.0 (BotHarness/BotPixel#11).avatar-part-librarymodule (Profile schema Generation 73) and keyed by content hash, with origins and parent.partLibraryListandpartLibraryAdd.bot.jsonand Bot Zips.storage-unavailable.docs/assets/pr/1211-custom-parts/. The speech in the recording is simulated.Agent-Task:
claude/cloud/session_01MozvQ2eMvqX1MzSqm9G2o8Generated by Claude Code