Spun out of #454 (Q1 = option b): Equipment becomes a first-class ArtAssetType with a bespoke pipeline, not a Prop-shaped clone. This is a pipeline-design epic — spec before code.
Product intent
Equipment assets are meant to be used by characters: weapons, tools, wearables. The differentiator vs Prop is attachability/wieldability — which is exactly what makes the plan bespoke instead of Prop-shaped.
Design questions to settle (spec phase)
Stage plan: which ordered stages does Equipment run (see ArtAssetStagePlans)? Likely concept → modeling → texturing → attachment/socket definition → export → enrichment; rigging in the character sense probably wrong, but grip/socket metadata is the whole point.
Attachment model: how are sockets/grips represented (bone? empty/locator? named socket convention) and how do they survive export (GLB extras? separate sidecar)?
art_pipe capabilities: what new worker capabilities/actions are needed (e.g. socket placement, scale normalization against a reference character rig)? Manifest + capability→action resolution per #346 conventions.
Method defaults: per-stage method allow-list entries for Equipment (ArtStudioStageMethodOptions), incl. whether text→3D (shap_e) makes sense for equipment.
GameServer consumption: how does the equip/attach side consume the metadata (this is where the existing GameServer "Equipment" code intersects — verified in #454 as currently unrelated)?
Implementation (after spec)
Backend: ArtAssetType.Equipment (SpikerSoft.Data/Mongos/ArtStudio/ArtAsset.cs) + Equipment entry in ArtAssetStagePlans + validation/tests
Worker: new/extended art_pipe stage capabilities per spec
Frontend: composer asset-type toggle (Character / Prop / Equipment) + 10-prompt kid-safe Equipment corpus (art-studio.example-prompts.ts) — trivial follow-ons per #454
ArtAssetStagePlans, ArtStudioStageMethodOptions (stage/method machinery), #378 W1/W1.5 for the allow-list + failover conventions
Child issues (per-repo, auto-close on merge)
No open child issues were produced by the migration — either this epic's
work was already complete, or its scope needs to be broken down into
per-repo issues before it can progress.
Checklist generated by the umbrella-tracker migration, 2026-08-07 — Opus 5 Agent
Spun out of #454 (Q1 = option b): Equipment becomes a first-class ArtAssetType with a **bespoke pipeline**, not a Prop-shaped clone. This is a pipeline-design epic — spec before code.
## Product intent
Equipment assets are meant to be **used by characters**: weapons, tools, wearables. The differentiator vs Prop is attachability/wieldability — which is exactly what makes the plan bespoke instead of Prop-shaped.
## Design questions to settle (spec phase)
- [ ] **Stage plan**: which ordered stages does Equipment run (see `ArtAssetStagePlans`)? Likely concept → modeling → texturing → **attachment/socket definition** → export → enrichment; rigging in the character sense probably wrong, but grip/socket metadata is the whole point.
- [ ] **Attachment model**: how are sockets/grips represented (bone? empty/locator? named socket convention) and how do they survive export (GLB extras? separate sidecar)?
- [ ] **art_pipe capabilities**: what new worker capabilities/actions are needed (e.g. socket placement, scale normalization against a reference character rig)? Manifest + capability→action resolution per #346 conventions.
- [ ] **Method defaults**: per-stage method allow-list entries for Equipment (`ArtStudioStageMethodOptions`), incl. whether text→3D (shap_e) makes sense for equipment.
- [ ] **GameServer consumption**: how does the equip/attach side consume the metadata (this is where the existing GameServer "Equipment" code intersects — verified in #454 as currently unrelated)?
## Implementation (after spec)
- [ ] Backend: `ArtAssetType.Equipment` (SpikerSoft.Data/Mongos/ArtStudio/ArtAsset.cs) + Equipment entry in `ArtAssetStagePlans` + validation/tests
- [ ] Worker: new/extended art_pipe stage capabilities per spec
- [ ] Frontend: composer asset-type toggle (Character / Prop / Equipment) + 10-prompt kid-safe Equipment corpus (`art-studio.example-prompts.ts`) — trivial follow-ons per #454
- [ ] Catalog/gallery filtering by the new type
## References
- #454 (parity ticket; Q1 decision recorded there) · epic #446 (Eric's Generate-drawer parity)
- `ArtAssetStagePlans`, `ArtStudioStageMethodOptions` (stage/method machinery), #378 W1/W1.5 for the allow-list + failover conventions
<!-- BEGIN MIGRATED-CHILDREN -->
---
## Child issues (per-repo, auto-close on merge)
_No open child issues were produced by the migration — either this epic's
work was already complete, or its scope needs to be broken down into
per-repo issues before it can progress._
<sub>Checklist generated by the umbrella-tracker migration, 2026-08-07 — Opus 5 Agent</sub>
<!-- END MIGRATED-CHILDREN -->
Dissolved into per-repo issues as part of the umbrella-tracker breakup. This epic held
implementation work that could never auto-close from a merge; it now lives where the code is.
This epic was nine unanswered checkboxes, five of them pure design questions. Rather than
manufacture implementation tickets on top of undecided design, three of the four children are
explicit decision issues — each states the concrete, code-grounded options and what has to be
settled, and each is closeable by merging the recorded decision in the repo that will host the
answer.
ArtPipe (decision): spikerj/spikersoft-artpipe#61 — socket/grip representation and how it
survives GLB export. Options are grounded in real code: (a) armature bones extending CANONICAL_PROP_HIERARCHY (src/artpipe/bones.py:207-209), which already survives export via export_skins; (b) empties + artpipe_socket_* custom props (precedent: blender/headless/rigging_cmds.py:669-740), which needs export_extras=True and a wider export
selection; (c) an enrichment sidecar JSON with the GLB untouched.
Backend — stage plan (decision + landing): spikerj/spikersoft-backend#617 — which stages
Equipment runs, the per-stage method allow-list, and landing ArtAssetType.Equipment itself.
Decision and landing are one issue because ArtAssetStagePlans.GetPlan does a bare Plans[assetType] (ArtAssetStagePlans.cs:54) — a new enum member with no plan entry is a KeyNotFoundException on every submit.
Backend — games manifest (decision): spikerj/spikersoft-backend#618 — how the equip/attach side
consumes the metadata, i.e. whether ArtAssetManifest
(Queries/GetArtAssetManifest/GetArtAssetManifestQuery.cs:38-62) gains an attachment block,
where socket data is persisted, and whether a character-side target-slot contract is needed
alongside GameArtSlotRegistry.
Angular (implementation): spikerj/spikersoft-angular#719 — the one genuinely-decided piece:
composer asset-type toggle, 10-prompt kid-safe corpus, i18n, library/gallery filter.
Already shipped, no issue filed — the "art_pipe capabilities" checkbox is largely done.
Verified against spikersoft-artpipe@7082d26 (main): equipment is already a first-class asset
type in art_pipe, end to end — ASSET_TYPE_STAGES["equipment"] = [concept, modeling, texturing, rigging, export, enrichment]
(src/artpipe/config.py:562-567), poly-budget/topology/UV/thin-feature gates
(config.py:221, 226-228, 278, 285, 292, 307), node-graph stage gates
(batch/node_registry.py:133, 152, 200), prop/equipment rig scoring (batch/rig_scoring.py:41, 103),
concept prompt shaping and template mapping (batch/stages/modeling.py:640-641, 678; config.py:628), a batch prompt corpus (batch/generator.py:266-466), a committed graph
(pipelines/equipment.json, rig_profile: PROP, target_faces: 2000), and a rig_mesh action
that already accepts asset_type: character | prop | equipment
(models/Blender/artpipe.json). The ONLY missing art_pipe capability is socket placement, which
is spikerj/spikersoft-artpipe#61.
Two findings worth carrying forward, both recorded in the children:
The two stage-plan registries have already drifted: art_pipe runs rigging for prop
(config.py:563), the backend's Prop plan does not (ArtAssetStagePlans.cs:32-39). Deciding
Equipment means deciding which side is authoritative.
Every rigging option in ArtStudioStageMethodOptions.CreateDefault() hardcodes Params["asset_type"] = "character" (ArtStudioStageMethodOptions.cs:236, 241, 246, 251, 256),
mirroring the worker's shipped ArtPipe:StageSettings. If Equipment ran rigging with today's
allow-list it would get a character rig — precisely the wrong outcome. The allow-list is
keyed by stage only (_byStage, line 51) and has no asset-type dimension, which is the
structural question behind "method defaults per asset type".
Nothing Equipment-shaped exists on the backend (spikersoft-backend@9810202: ArtAssetType is {Character, Prop, PhotoStack}, ArtAsset.cs:558-570) or in the frontend
(spikersoft-angular@8e5a404: art-studio.models.ts:10-15; the composer offers exactly two types, art-prompt-composer.component.html:38, 42). GET https://api.spikersoft.com/healthz → Healthy;
the ArtStudio endpoints are auth-gated (/api/artstudio/method-options → 401) and no Equipment
asset can exist yet, so there is nothing further runtime-observable to probe.
The unit is tracked by the shared [Equipment] title prefix and by sibling cross-links in each
issue. Closing here — the umbrella tracker is being emptied.
— Opus 5 Agent
Dissolved into per-repo issues as part of the umbrella-tracker breakup. This epic held
implementation work that could never auto-close from a merge; it now lives where the code is.
**This epic was nine unanswered checkboxes, five of them pure design questions.** Rather than
manufacture implementation tickets on top of undecided design, three of the four children are
explicit **decision issues** — each states the concrete, code-grounded options and what has to be
settled, and each is closeable by merging the recorded decision in the repo that will host the
answer.
- ArtPipe (decision): spikerj/spikersoft-artpipe#61 — socket/grip representation and how it
survives GLB export. Options are grounded in real code: (a) armature bones extending
`CANONICAL_PROP_HIERARCHY` (`src/artpipe/bones.py:207-209`), which already survives export via
`export_skins`; (b) empties + `artpipe_socket_*` custom props (precedent:
`blender/headless/rigging_cmds.py:669-740`), which needs `export_extras=True` and a wider export
selection; (c) an enrichment sidecar JSON with the GLB untouched.
- Backend — stage plan (decision + landing): spikerj/spikersoft-backend#617 — which stages
Equipment runs, the per-stage method allow-list, and landing `ArtAssetType.Equipment` itself.
Decision and landing are one issue because `ArtAssetStagePlans.GetPlan` does a bare
`Plans[assetType]` (`ArtAssetStagePlans.cs:54`) — a new enum member with no plan entry is a
`KeyNotFoundException` on every submit.
- Backend — games manifest (decision): spikerj/spikersoft-backend#618 — how the equip/attach side
consumes the metadata, i.e. whether `ArtAssetManifest`
(`Queries/GetArtAssetManifest/GetArtAssetManifestQuery.cs:38-62`) gains an attachment block,
where socket data is persisted, and whether a character-side target-slot contract is needed
alongside `GameArtSlotRegistry`.
- Angular (implementation): spikerj/spikersoft-angular#719 — the one genuinely-decided piece:
composer asset-type toggle, 10-prompt kid-safe corpus, i18n, library/gallery filter.
**Already shipped, no issue filed — the "art_pipe capabilities" checkbox is largely done.**
Verified against `spikersoft-artpipe@7082d26` (main): `equipment` is already a first-class asset
type in art_pipe, end to end —
`ASSET_TYPE_STAGES["equipment"] = [concept, modeling, texturing, rigging, export, enrichment]`
(`src/artpipe/config.py:562-567`), poly-budget/topology/UV/thin-feature gates
(`config.py:221, 226-228, 278, 285, 292, 307`), node-graph stage gates
(`batch/node_registry.py:133, 152, 200`), prop/equipment rig scoring (`batch/rig_scoring.py:41, 103`),
concept prompt shaping and template mapping (`batch/stages/modeling.py:640-641, 678`;
`config.py:628`), a batch prompt corpus (`batch/generator.py:266-466`), a committed graph
(`pipelines/equipment.json`, `rig_profile: PROP`, `target_faces: 2000`), and a `rig_mesh` action
that already accepts `asset_type: character | prop | equipment`
(`models/Blender/artpipe.json`). The ONLY missing art_pipe capability is socket placement, which
is spikerj/spikersoft-artpipe#61.
**Two findings worth carrying forward, both recorded in the children:**
1. The two stage-plan registries have **already drifted**: art_pipe runs `rigging` for `prop`
(`config.py:563`), the backend's Prop plan does not (`ArtAssetStagePlans.cs:32-39`). Deciding
Equipment means deciding which side is authoritative.
2. Every rigging option in `ArtStudioStageMethodOptions.CreateDefault()` hardcodes
`Params["asset_type"] = "character"` (`ArtStudioStageMethodOptions.cs:236, 241, 246, 251, 256`),
mirroring the worker's shipped `ArtPipe:StageSettings`. If Equipment ran rigging with today's
allow-list it would get a **character** rig — precisely the wrong outcome. The allow-list is
keyed by stage only (`_byStage`, line 51) and has no asset-type dimension, which is the
structural question behind "method defaults per asset type".
Nothing Equipment-shaped exists on the backend (`spikersoft-backend@9810202`: `ArtAssetType` is
`{Character, Prop, PhotoStack}`, `ArtAsset.cs:558-570`) or in the frontend
(`spikersoft-angular@8e5a404`: `art-studio.models.ts:10-15`; the composer offers exactly two types,
`art-prompt-composer.component.html:38, 42`). `GET https://api.spikersoft.com/healthz` → `Healthy`;
the ArtStudio endpoints are auth-gated (`/api/artstudio/method-options` → 401) and no Equipment
asset can exist yet, so there is nothing further runtime-observable to probe.
The unit is tracked by the shared `[Equipment]` title prefix and by sibling cross-links in each
issue. Closing here — the umbrella tracker is being emptied.
— Opus 5 Agent
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Spun out of #454 (Q1 = option b): Equipment becomes a first-class ArtAssetType with a bespoke pipeline, not a Prop-shaped clone. This is a pipeline-design epic — spec before code.
Product intent
Equipment assets are meant to be used by characters: weapons, tools, wearables. The differentiator vs Prop is attachability/wieldability — which is exactly what makes the plan bespoke instead of Prop-shaped.
Design questions to settle (spec phase)
ArtAssetStagePlans)? Likely concept → modeling → texturing → attachment/socket definition → export → enrichment; rigging in the character sense probably wrong, but grip/socket metadata is the whole point.ArtStudioStageMethodOptions), incl. whether text→3D (shap_e) makes sense for equipment.Implementation (after spec)
ArtAssetType.Equipment(SpikerSoft.Data/Mongos/ArtStudio/ArtAsset.cs) + Equipment entry inArtAssetStagePlans+ validation/testsart-studio.example-prompts.ts) — trivial follow-ons per #454References
ArtAssetStagePlans,ArtStudioStageMethodOptions(stage/method machinery), #378 W1/W1.5 for the allow-list + failover conventionsChild issues (per-repo, auto-close on merge)
No open child issues were produced by the migration — either this epic's
work was already complete, or its scope needs to be broken down into
per-repo issues before it can progress.
Checklist generated by the umbrella-tracker migration, 2026-08-07 — Opus 5 Agent
Dissolved into per-repo issues as part of the umbrella-tracker breakup. This epic held
implementation work that could never auto-close from a merge; it now lives where the code is.
This epic was nine unanswered checkboxes, five of them pure design questions. Rather than
manufacture implementation tickets on top of undecided design, three of the four children are
explicit decision issues — each states the concrete, code-grounded options and what has to be
settled, and each is closeable by merging the recorded decision in the repo that will host the
answer.
survives GLB export. Options are grounded in real code: (a) armature bones extending
CANONICAL_PROP_HIERARCHY(src/artpipe/bones.py:207-209), which already survives export viaexport_skins; (b) empties +artpipe_socket_*custom props (precedent:blender/headless/rigging_cmds.py:669-740), which needsexport_extras=Trueand a wider exportselection; (c) an enrichment sidecar JSON with the GLB untouched.
Equipment runs, the per-stage method allow-list, and landing
ArtAssetType.Equipmentitself.Decision and landing are one issue because
ArtAssetStagePlans.GetPlandoes a barePlans[assetType](ArtAssetStagePlans.cs:54) — a new enum member with no plan entry is aKeyNotFoundExceptionon every submit.consumes the metadata, i.e. whether
ArtAssetManifest(
Queries/GetArtAssetManifest/GetArtAssetManifestQuery.cs:38-62) gains an attachment block,where socket data is persisted, and whether a character-side target-slot contract is needed
alongside
GameArtSlotRegistry.composer asset-type toggle, 10-prompt kid-safe corpus, i18n, library/gallery filter.
Already shipped, no issue filed — the "art_pipe capabilities" checkbox is largely done.
Verified against
spikersoft-artpipe@7082d26(main):equipmentis already a first-class assettype in art_pipe, end to end —
ASSET_TYPE_STAGES["equipment"] = [concept, modeling, texturing, rigging, export, enrichment](
src/artpipe/config.py:562-567), poly-budget/topology/UV/thin-feature gates(
config.py:221, 226-228, 278, 285, 292, 307), node-graph stage gates(
batch/node_registry.py:133, 152, 200), prop/equipment rig scoring (batch/rig_scoring.py:41, 103),concept prompt shaping and template mapping (
batch/stages/modeling.py:640-641, 678;config.py:628), a batch prompt corpus (batch/generator.py:266-466), a committed graph(
pipelines/equipment.json,rig_profile: PROP,target_faces: 2000), and arig_meshactionthat already accepts
asset_type: character | prop | equipment(
models/Blender/artpipe.json). The ONLY missing art_pipe capability is socket placement, whichis spikerj/spikersoft-artpipe#61.
Two findings worth carrying forward, both recorded in the children:
riggingforprop(
config.py:563), the backend's Prop plan does not (ArtAssetStagePlans.cs:32-39). DecidingEquipment means deciding which side is authoritative.
ArtStudioStageMethodOptions.CreateDefault()hardcodesParams["asset_type"] = "character"(ArtStudioStageMethodOptions.cs:236, 241, 246, 251, 256),mirroring the worker's shipped
ArtPipe:StageSettings. If Equipment ran rigging with today'sallow-list it would get a character rig — precisely the wrong outcome. The allow-list is
keyed by stage only (
_byStage, line 51) and has no asset-type dimension, which is thestructural question behind "method defaults per asset type".
Nothing Equipment-shaped exists on the backend (
spikersoft-backend@9810202:ArtAssetTypeis{Character, Prop, PhotoStack},ArtAsset.cs:558-570) or in the frontend(
spikersoft-angular@8e5a404:art-studio.models.ts:10-15; the composer offers exactly two types,art-prompt-composer.component.html:38, 42).GET https://api.spikersoft.com/healthz→Healthy;the ArtStudio endpoints are auth-gated (
/api/artstudio/method-options→ 401) and no Equipmentasset can exist yet, so there is nothing further runtime-observable to probe.
The unit is tracked by the shared
[Equipment]title prefix and by sibling cross-links in eachissue. Closing here — the umbrella tracker is being emptied.
— Opus 5 Agent