@hypersoniclabs/helix-mcp 0.2.4 → 0.2.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +81 -11
- package/dist/continuumCanary.d.ts +17 -0
- package/dist/continuumCanary.js +17 -0
- package/dist/continuumCanary.js.map +1 -0
- package/dist/server.d.ts +14 -1
- package/dist/server.js +4058 -162
- package/dist/server.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/vehicleTools.d.ts +86 -0
- package/dist/vehicleTools.js +229 -0
- package/dist/vehicleTools.js.map +1 -0
- package/docs/avatar-face.md +115 -0
- package/docs/bridge.md +98 -0
- package/docs/bring-your-world.md +117 -0
- package/docs/catalog.md +69 -1
- package/docs/character-animation.md +442 -0
- package/docs/character-attachments.md +166 -0
- package/docs/character-world.md +785 -130
- package/docs/continuum.md +153 -0
- package/docs/items.md +73 -0
- package/docs/lighting-world.md +667 -0
- package/docs/locomotion-clip-spec.md +294 -0
- package/docs/manifest.md +31 -6
- package/docs/multiplayer-logic.md +460 -17
- package/docs/multiplayer-templates/chrono-orchard.md +36 -22
- package/docs/multiplayer-templates/collect-a-thon.md +28 -38
- package/docs/multiplayer-templates/collections.md +24 -24
- package/docs/multiplayer-templates/hangout.md +124 -111
- package/docs/multiplayer-templates/npc-wave.md +310 -0
- package/docs/multiplayer-templates/obby.md +13 -16
- package/docs/multiplayer-templates/persistent-progress.md +218 -0
- package/docs/multiplayer-templates/physics-bumper.md +27 -9
- package/docs/multiplayer-templates/physics-football.md +22 -8
- package/docs/multiplayer-templates/relic-bearers.md +12 -15
- package/docs/multiplayer-templates/server-motion.md +16 -19
- package/docs/multiplayer-templates/shooter-range.md +275 -0
- package/docs/multiplayer-templates/team-control.md +28 -15
- package/docs/multiplayer-templates/turn-arena.md +31 -22
- package/docs/multiplayer-templates/voice-radio.md +166 -0
- package/docs/multiplayer-templates/wave-survival.md +7 -8
- package/docs/multiplayer-templates/world-shop.md +240 -0
- package/docs/multiplayer-world.md +222 -129
- package/docs/npc-world.md +623 -0
- package/docs/publishing.md +108 -28
- package/docs/purchases.md +223 -0
- package/docs/scene-performance.md +64 -0
- package/docs/screenshots.md +140 -0
- package/docs/sdk.md +324 -5
- package/docs/shooter-worlds.md +537 -0
- package/docs/terrain.md +173 -0
- package/docs/upgrades.md +324 -0
- package/docs/vehicles.md +727 -0
- package/docs/world-inspect.md +156 -0
- package/docs/world-look.md +241 -0
- package/docs/world-recipe.md +65 -6
- package/package.json +15 -4
- package/skills/README.md +91 -0
- package/skills/helix-assets/SKILL.md +491 -0
- package/skills/helix-assets/references/asset-sources.md +143 -0
- package/skills/helix-assets/references/vault-api.md +105 -0
- package/skills/helix-avatar-qa/SKILL.md +85 -0
- package/skills/helix-avatars/SKILL.md +206 -0
- package/skills/helix-avatars/references/contract.md +166 -0
- package/skills/helix-avatars/references/dynamics.md +367 -0
- package/skills/helix-avatars/references/face.md +50 -0
- package/skills/helix-avatars/references/publish.md +76 -0
- package/skills/helix-avatars/references/qa.md +251 -0
- package/skills/helix-avatars/references/rigging.md +88 -0
- package/skills/helix-avatars/references/source-generated.md +190 -0
- package/skills/helix-avatars/references/source-model.md +90 -0
- package/skills/helix-avatars/references/source-rigid.md +90 -0
- package/skills/helix-avatars/references/source-vrm.md +61 -0
- package/skills/helix-gauntlet/SKILL.md +128 -0
- package/skills/helix-multiplayer/SKILL.md +150 -0
- package/skills/helix-multiplayer/references/dsl-capability-map.md +107 -0
- package/skills/helix-vehicles/SKILL.md +218 -0
- package/skills/helix-vehicles/references/addons.md +212 -0
- package/skills/helix-vehicles/references/appearance.md +339 -0
- package/skills/helix-vehicles/references/audio-import.md +138 -0
- package/skills/helix-vehicles/references/audio.md +580 -0
- package/skills/helix-vehicles/references/cabin.md +225 -0
- package/skills/helix-vehicles/references/host-manifest.md +174 -0
- package/skills/helix-vehicles/references/physics-from-specs.md +463 -0
- package/skills/helix-vehicles/references/publish.md +214 -0
- package/skills/helix-vehicles/references/qa.md +177 -0
- package/skills/helix-vehicles/references/reference-package.json +3481 -0
- package/skills/helix-vehicles/references/reference-package.md +69 -0
- package/skills/helix-vehicles/references/source-beamng.md +167 -0
- package/skills/helix-vehicles/references/source-concept.md +38 -0
- package/skills/helix-vehicles/references/source-model.md +100 -0
- package/skills/helix-vehicles/references/source-scratch.md +60 -0
- package/skills/helix-world-build/SKILL.md +376 -0
- package/skills/helix-world-build/references/config-gates.md +104 -0
- package/skills/helix-world-director/SKILL.md +210 -0
- package/skills/helix-world-qa/SKILL.md +371 -0
- package/skills/helix-world-qa/references/perf-budgets.md +240 -0
- package/skills/helix-world-qa/references/perf-handle.md +125 -0
- package/skills/helix-world-qa/references/visual-scorecard.md +85 -0
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# CC0 asset sources — query recipes and traps
|
|
2
|
+
|
|
3
|
+
The five sources the skill body lists, in enough detail to fetch from without a round of
|
|
4
|
+
trial and error. Every endpoint and count here was re-verified against the live service; if
|
|
5
|
+
one starts 404ing, say so in the report rather than inventing a replacement.
|
|
6
|
+
|
|
7
|
+
## Poly Haven — `https://api.polyhaven.com`
|
|
8
|
+
|
|
9
|
+
Free, no key, CORS-open, **CC0**. HDRIs, textures and models by a small paid-in-house team,
|
|
10
|
+
which is why the licence is uniform rather than per asset.
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
curl -s https://api.polyhaven.com/types # ["hdris","textures","models"]
|
|
14
|
+
curl -s https://api.polyhaven.com/categories/models # 45 categories
|
|
15
|
+
curl -s "https://api.polyhaven.com/assets?type=models&categories=furniture" # 85 records
|
|
16
|
+
curl -s https://api.polyhaven.com/info/wooden_table_02 # one record
|
|
17
|
+
curl -s https://api.polyhaven.com/files/wooden_table_02 # download URLs, per format/res
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
There is **no free-text search**. Filter by `categories=` (comma-separated, AND-ed) and match
|
|
21
|
+
`tags` yourself from the list response — it already contains every field you need, so this
|
|
22
|
+
costs one request, not one per asset.
|
|
23
|
+
|
|
24
|
+
**Budget before you download.** All 521 model records carry `polycount` and
|
|
25
|
+
`max_resolution`; texture and HDRI records carry `max_resolution`. Nothing else in this list
|
|
26
|
+
lets you reject an asset on triangle count without fetching it first. Filter the list
|
|
27
|
+
response, *then* hit `/files`.
|
|
28
|
+
|
|
29
|
+
```js
|
|
30
|
+
const models = await (await fetch('https://api.polyhaven.com/assets?type=models')).json();
|
|
31
|
+
const affordable = Object.entries(models)
|
|
32
|
+
.filter(([, m]) => m.polycount < 8000) // ArmChair_01 is 5,626; wooden_table_02 is 196
|
|
33
|
+
.map(([slug]) => slug);
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
`/files/<slug>` returns a nested `format → resolution → { url, size, md5 }`. For models take
|
|
37
|
+
`gltf.1k.gltf` (or `2k`) — an object with a `url` plus an `include` map of every sibling file
|
|
38
|
+
(`.bin`, `textures/*.jpg`) with its own URL and size. **Download the `include` map too**; the
|
|
39
|
+
`.gltf` alone is a manifest pointing at files you did not fetch, and it fails at load with a
|
|
40
|
+
404 per texture, not a clear error.
|
|
41
|
+
|
|
42
|
+
Pick resolution by what the surface does: `1k` textures are ~120–180 KB each as JPEG,
|
|
43
|
+
`4k` is ~10× that against a 50 MB bundle cap.
|
|
44
|
+
|
|
45
|
+
**Container form:** `.gltf` + `.bin` + `textures/` — the second form `helix assets check-loaders`
|
|
46
|
+
reads. One provenance row on the containing **directory** covers the whole set.
|
|
47
|
+
|
|
48
|
+
**Attribution:** CC0 needs none, but `authors` is in every record (`{"Serhii Khromov":
|
|
49
|
+
"All"}`) and `helix assets credits` will render it if you put it in the row's `attribution`.
|
|
50
|
+
Crediting a CC0 author is free and correct.
|
|
51
|
+
|
|
52
|
+
## ambientCG — `https://ambientcg.com/api/v2/full_json`
|
|
53
|
+
|
|
54
|
+
Free, no key, **CC0**. 2,004 PBR materials (`numberOfResults` on an unfiltered
|
|
55
|
+
`type=Material` query), plus 3D models, decals and HDRIs under other `type=` values.
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
curl -s "https://ambientcg.com/api/v2/full_json?type=Material&q=asphalt&limit=3" # 78 hits
|
|
59
|
+
curl -s "https://ambientcg.com/api/v2/full_json?type=Material&q=asphalt&limit=1&include=downloadData"
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
`q` is real full-text search over the asset's tags — this is the source to reach for when
|
|
63
|
+
you know the surface by name ("asphalt", "paving stones", "rusted metal") and want maps that
|
|
64
|
+
tile.
|
|
65
|
+
|
|
66
|
+
Downloads live under `include=downloadData` →
|
|
67
|
+
`foundAssets[].downloadFolders.default.downloadFiletypeCategories.zip.downloads[]`, one entry
|
|
68
|
+
per resolution with a `fileName`, an `attribute` (`1K-JPG`, `2K-JPG`, …) and a **`size` in
|
|
69
|
+
bytes**. Read `size` before you fetch:
|
|
70
|
+
|
|
71
|
+
| attribute | example size (`PavingStones151`) |
|
|
72
|
+
| --- | --- |
|
|
73
|
+
| `1K-JPG` | 8.7 MB |
|
|
74
|
+
| `2K-JPG` | 28.8 MB |
|
|
75
|
+
| `4K-JPG` | 111 MB |
|
|
76
|
+
| `8K-JPG` | 431 MB |
|
|
77
|
+
|
|
78
|
+
**The bundle cap is 50 MB total.** A single 4K material blows it and an 8K material is 8× it.
|
|
79
|
+
(The same restraint applies one rung up: the platform pack's `--resolution` lets you ask for 2K,
|
|
80
|
+
which is for hero surfaces the camera gets close to — not a default to apply across a scene.)
|
|
81
|
+
Take `1K-JPG`, `2K-JPG` only for a hero surface, and keep only the maps you actually bind
|
|
82
|
+
(`_Color`, `_NormalGL`, `_Roughness`; skip `_Displacement` unless you are tessellating).
|
|
83
|
+
The zips also carry `_NormalDX` — that is the flipped-green convention; three.js wants the
|
|
84
|
+
**GL** one, and picking wrong reads as lighting that comes from the wrong side.
|
|
85
|
+
|
|
86
|
+
One provenance row with a `*` covers the set: `assets/materials/asphalt_*.jpg`.
|
|
87
|
+
|
|
88
|
+
## Kenney — `kenney.nl`
|
|
89
|
+
|
|
90
|
+
No API. Per-pack ZIPs from the pack page, **CC0**, one named author. Low-poly modular kits
|
|
91
|
+
(city, nature, dungeon, space), UI sprite sheets, and the SFX packs that **rung 2 of the
|
|
92
|
+
audio chain** depends on — this is the "curated allowlist pack, licensor demonstrably the
|
|
93
|
+
author" the audio section names.
|
|
94
|
+
|
|
95
|
+
Packs ship `.obj` + `.mtl` alongside `.glb`/`.gltf` — take the glTF; the runtime loader
|
|
96
|
+
allowlist has no OBJLoader. Kits are grid-aligned and share one palette texture, so pieces
|
|
97
|
+
snap together and the whole kit is a handful of draw calls when instanced.
|
|
98
|
+
|
|
99
|
+
## Quaternius — `quaternius.com`
|
|
100
|
+
|
|
101
|
+
No API. Per-pack ZIPs, **CC0**, one named author. Stylized low-poly kits — characters,
|
|
102
|
+
nature, vehicles, modular buildings — **atlas-textured**: an entire pack shares one small
|
|
103
|
+
texture, which is the cheapest thing in this document against the texture budget. Some
|
|
104
|
+
character packs ship rigged; check the skeleton against the 75-bone character budget before
|
|
105
|
+
committing to one as a hero.
|
|
106
|
+
|
|
107
|
+
## Poly Pizza — `https://api.poly.pizza/v1`
|
|
108
|
+
|
|
109
|
+
**Free key required**, and it fails loudly and unhelpfully without one:
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
curl -s "https://api.poly.pizza/v1/search/chair"
|
|
113
|
+
# 401 {"error":"You need an API key to do that dingus"}
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
That is a missing header, **not** a dead source — read it that way. Request a key at
|
|
117
|
+
poly.pizza and send it as `x-auth-token`. 10,600+ low-poly models, including the rescued
|
|
118
|
+
Google Poly archive, which is the reason to bother: it is the largest low-poly corpus in this
|
|
119
|
+
list by an order of magnitude.
|
|
120
|
+
|
|
121
|
+
**Licence is per asset, in a `licence` field: CC-BY 3.0 or CC0.** Do not assume the pile is
|
|
122
|
+
CC0 — read the field on every asset you take, and record the exact value in the provenance
|
|
123
|
+
row.
|
|
124
|
+
|
|
125
|
+
A CC-BY row obliges attribution **that reaches the player** — in an in-world credits panel or
|
|
126
|
+
a screen the player can open, not only in `ASSET-CREDITS.md` in the repo. And CC-BY **3.0**
|
|
127
|
+
has no cure period: 4.0 lets you fix a breach within 30 days and reinstates automatically,
|
|
128
|
+
3.0 does not. So a rendering bug that hides the credits panel is not a lapse you patch — it
|
|
129
|
+
terminates the licence for that asset. If a world's credits surface is not built yet, take
|
|
130
|
+
the CC0 rows and leave the CC-BY ones.
|
|
131
|
+
|
|
132
|
+
## Not these
|
|
133
|
+
|
|
134
|
+
| Source | Why not |
|
|
135
|
+
| --- | --- |
|
|
136
|
+
| Sketchfab | Mixed licence, with **NonCommercial and NoDerivs** in the pile. Per-asset checking at scale, and two of the licences in it are unusable to us at any price. |
|
|
137
|
+
| Objaverse / Objaverse-XL | Largely GitHub and web scrapes with **no licence filtering** applied. Provenance you cannot record honestly is provenance you do not have. |
|
|
138
|
+
| Freesound, OpenGameArt | **User-upload.** A "CC0" tag is an unverified assertion by an anonymous uploader — the same distinction the audio chain draws at rung 2. |
|
|
139
|
+
| Anything a search engine handed you | No licence, no author, no record. |
|
|
140
|
+
|
|
141
|
+
The line is not "free" versus "paid". It is **whether the licensor is demonstrably the
|
|
142
|
+
author**. Poly Haven, ambientCG, Kenney and Quaternius publish their own work. A
|
|
143
|
+
user-upload platform republishes a claim.
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# Vault — the asset library API
|
|
2
|
+
|
|
3
|
+
The Vault is HELIX's shared asset library: a GIN-indexed full-text search over title,
|
|
4
|
+
description and tags, plus structured filters. It is the step between "the catalog has no
|
|
5
|
+
ability for this" and "generate something".
|
|
6
|
+
|
|
7
|
+
An agent does not browse. It asks a precise question — *a humanoid-rigged character I can
|
|
8
|
+
use in a web world* — and needs a small, correct answer. That is why every filter is
|
|
9
|
+
structured; free text alone cannot express "rigged to the skeleton my world already uses".
|
|
10
|
+
|
|
11
|
+
## Probe before you rely on it
|
|
12
|
+
|
|
13
|
+
These endpoints may not be deployed on the lane you are running against. Probe, and degrade
|
|
14
|
+
honestly — a 404 means "this capability is not here", not "there are no assets".
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
curl -sS -o /dev/null -w '%{http_code}\n' "$HELIX_API/api/v1/vault/assets?limit=1"
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
- `200` → Vault is available; use it.
|
|
21
|
+
- `404`/`501` → unavailable on this lane. Record the probe output in the ledger as the skip
|
|
22
|
+
reason, drop to the next rung of the source order, and say so in the report.
|
|
23
|
+
- Anything else → a real error. Record the status and the body; do not infer.
|
|
24
|
+
|
|
25
|
+
Never write "Vault had nothing" when what happened was a 404. Those are different facts and
|
|
26
|
+
only one of them is about the library.
|
|
27
|
+
|
|
28
|
+
## Endpoints
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
GET /api/v1/vault/assets @Public
|
|
32
|
+
GET /api/v1/vault/assets/:assetId @Public
|
|
33
|
+
GET /api/v1/vault/assets/:assetId/versions @Public
|
|
34
|
+
GET /api/v1/vault/assets/:assetId/download @Public — 302 redirect. THE ONLY download route.
|
|
35
|
+
GET /api/v1/vault/artifacts/*key @Public — local-disk serve, dev only
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Search parameters
|
|
39
|
+
|
|
40
|
+
| Param | Values | Notes |
|
|
41
|
+
| --- | --- | --- |
|
|
42
|
+
| `q` | free text ≤200 chars | matched against title, description **and** tags |
|
|
43
|
+
| `kind` | `prop` · `character` · `animation` · `audio` · `texture` · `material` · `environment` · `terrain` · `vfx` · `decal` · `sky` · `gaussian_splat` · `scene` · `interactive_item` · `unreal_package` | repeatable or comma-separated |
|
|
44
|
+
| `subtype` | typed subtype such as `emote` | use `kind=interactive_item&subtype=emote` for executable/ownable emotes |
|
|
45
|
+
| `engine` | `web` · `unreal` | **reach for `engine=web` by default** |
|
|
46
|
+
| `skeleton` | `humanoid` · `quadruped` | meaningful for characters and animations |
|
|
47
|
+
| `origin` | `generated` · `uploaded` | see the audio rung in the skill body |
|
|
48
|
+
| `license` | licence enum | |
|
|
49
|
+
| `source` | publish-source enum | `world_generation` isolates agent-produced assets |
|
|
50
|
+
| `creatorId` | uuid | |
|
|
51
|
+
| `page` / `limit` | limit ≤100, default 20 | |
|
|
52
|
+
|
|
53
|
+
`kind` is a **builder's** taxonomy — what you can do with the asset — deliberately
|
|
54
|
+
orthogonal to the shopper-facing item kinds (wear / place / hold). An audio loop is neither
|
|
55
|
+
worn nor placed nor held, which is exactly why this axis exists.
|
|
56
|
+
|
|
57
|
+
An emote spans three layers without collapsing them: its reusable clip is
|
|
58
|
+
`kind=animation`; its validated executable wrapper is `kind=interactive_item,
|
|
59
|
+
subtype=emote`; the player-facing product is a Universal Item of kind `emote`.
|
|
60
|
+
Generic worlds search/install the animation. Global inventory emotes use the
|
|
61
|
+
wrapper and product pipeline rather than manually installing bytes.
|
|
62
|
+
|
|
63
|
+
## Skeleton gating
|
|
64
|
+
|
|
65
|
+
`character` and `animation` must declare a standard skeleton to be published: `humanoid`
|
|
66
|
+
(maps onto `helix-humanoid@1`, verified by parsing the GLB's joint names) or `quadruped`
|
|
67
|
+
(`helix-quadruped@1`, one generic rig — dog, horse and big cat all retarget onto it). A rig
|
|
68
|
+
declaring a skeleton it does not conform to is refused publication.
|
|
69
|
+
|
|
70
|
+
For a world running the `humanoid-character` system, `skeleton=humanoid` is the filter that
|
|
71
|
+
makes a character result actually drivable by the platform's locomotion clips. A character
|
|
72
|
+
that is not on the canonical skeleton renders but does not animate.
|
|
73
|
+
|
|
74
|
+
`GET /api/v1/vault/skeletons/spec-gaps` returns the standard specs as data — the bone list
|
|
75
|
+
to author against — rather than leaving a refused creator to guess.
|
|
76
|
+
|
|
77
|
+
## Downloading — the rule, and the reason
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
GET /api/v1/vault/assets/:assetId/download[?version=N] → 302 → artifact
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Always this route. Never a CDN URL lifted from a search result, even though one is right
|
|
84
|
+
there and would work today. The redirect is where entitlement resolution and paid-asset
|
|
85
|
+
gating land; it is unconditional *now* precisely so no caller has to change later. Code
|
|
86
|
+
that bypasses it works until the day it silently serves a paid asset to someone who has not
|
|
87
|
+
bought it — and the failure lands on the creator, not on the agent that wrote the shortcut.
|
|
88
|
+
|
|
89
|
+
`/artifacts/*key` is a dev-only local-disk serve, used when storage is not R2. Never build
|
|
90
|
+
a world against it.
|
|
91
|
+
|
|
92
|
+
## After download — record it
|
|
93
|
+
|
|
94
|
+
`helix assets install` writes `public/helix.assets.json` with one row per asset
|
|
95
|
+
(`assetId`, `version`, `kind`, `artifactKey`, `integrity`). Whole-file writes only; absence
|
|
96
|
+
means unknown, never empty. Full reasoning in the skill body — it is about payouts, not
|
|
97
|
+
tidiness, and it is the reason the rows do not live in `helix.lock.json`.
|
|
98
|
+
|
|
99
|
+
For `material` assets, installation defaults to `--material-renditions runtime`: the lean KTX2
|
|
100
|
+
map family only. Choose `source` for editable PNG maps or `all` for both; reinstalling with another
|
|
101
|
+
selection removes the stale opposite family. The selector does not change non-material assets.
|
|
102
|
+
|
|
103
|
+
If `helix assets install` is not available on this lane, probe it the same way, and record the
|
|
104
|
+
downloads in the same schema by hand — noting in the ledger that the file was hand-written,
|
|
105
|
+
so a reviewer knows which artifact they are trusting.
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: helix-avatar-qa
|
|
3
|
+
description: Publish a HELIX avatar (a whole character Package) that renders with its real textures and deforms cleanly when it walks, in the world and on the Marketplace page, and know exactly what the visual-QA gate measured. Use whenever you publish, republish or version an avatar, when an avatar is "held for visual QA", when visual QA fails an avatar, or when an avatar looks white, grey, glowing, untextured, twisted, "not rigged properly", walks with its arms inside the body, tears open at the side, or has hair standing off as a slab.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# HELIX Avatar QA
|
|
7
|
+
|
|
8
|
+
**Mandatory before any publish, new version, listing or "done": the `helix-gauntlet` loop** (`read_skill({ name: "helix-gauntlet" })`). The passing visual-QA verdict below is necessary, not sufficient: look at every frame yourself beside the reference images, and get a fresh blind critic's verdict where you can spawn one. Ship only on its PASS.
|
|
9
|
+
|
|
10
|
+
An avatar is **not visible to anyone but its creator until a visual-QA run of its current Package version passes.**
|
|
11
|
+
Publishing creates it *held* (`publicationDeferred.reason = visual_qa_required`); a passing run releases it to Published.
|
|
12
|
+
There is no admin override for avatars. "Published", "uploaded", "the CLI exited 0" and "the thumbnail looks fine" are
|
|
13
|
+
not evidence that an avatar works: the only evidence is a passing `helix item visual-qa` verdict, recorded by the backend.
|
|
14
|
+
|
|
15
|
+
## The loop
|
|
16
|
+
|
|
17
|
+
1. Seal the avatar's Continuum Package Version through the Creator's approved Publications workflow.
|
|
18
|
+
Add an Item and public offer only when explicitly requested. Expect the avatar to remain held
|
|
19
|
+
until its current version passes visual QA.
|
|
20
|
+
2. Judge it: `visual_qa_item` (local, `--submit`) or `visual_qa_item_hosted`; follow a hostedRun with
|
|
21
|
+
`visual_qa_item_status`. Exit 0 = pass, 1 = fail, 2 = harness error (never a pass).
|
|
22
|
+
3. On a fail, read **every** reason and open the contact sheet. Fix the avatar's FILE, publish a new version, re-run.
|
|
23
|
+
Never re-run hoping for a different answer, and never ask an admin to override — the route refuses it for avatars.
|
|
24
|
+
|
|
25
|
+
## What the route (avatar@3) measures — all blocking
|
|
26
|
+
|
|
27
|
+
Stage 1 is the Try Now world walk (the `avatar@2` asserts); stage 2 is the production Marketplace item page's own walk.
|
|
28
|
+
|
|
29
|
+
| Assert | What fails it | Usual cause, and the fix |
|
|
30
|
+
| --- | --- | --- |
|
|
31
|
+
| `avatar.materials_resolved` | a drawn primitive with no material, a texture bound but never decoded, base-colour textures the GLB declares that never reached the renderer, the model request failing | broken/unsupported KTX2, a material slot dropped by an import step — re-export with valid textures |
|
|
32
|
+
| `avatar.no_emissive_washout` | > 25 % of the surface emitting a flat colour (emissive >= 0.5 with **no emissive map**) | Meshy/AI exports carry `emissiveFactor [1,1,1]` with an emissive map; if the map is lost the body glows white. Remove the emissive factor or keep its map |
|
|
33
|
+
| `avatar.colour_matches_albedo` | the lit render is washed out (much brighter than its own base colour while losing its colour or contrast), black, or flat | the same wash-out, metalness 1 with no metalness map, missing base-colour maps |
|
|
34
|
+
| `avatar.limbs_untwisted` | a limb bone twists about its own axis past 50-55 deg while walking, or a knee bends away from forward | bone roll / rest orientation that disagrees with the HELIX humanoid skeleton — re-rig to the canonical skeleton |
|
|
35
|
+
| `avatar.skin_intact` | skinned triangles collapsing, stretching or tearing at the joints while walking | bad skin weights (vertices bound to the wrong bone), candy-wrapper joints |
|
|
36
|
+
| `avatar.skinned`, `avatar.grounded`, common four | not skinned, sinking/floating, NaN/invisible, untextured placeholder, wrong scale | — |
|
|
37
|
+
|
|
38
|
+
### Stage 2: the Marketplace walk (new in `avatar@3`)
|
|
39
|
+
|
|
40
|
+
The item page is where buyers look, and it plays the walk differently from Try Now: the shared walk clip is retargeted
|
|
41
|
+
onto your skeleton, and the arms swing **from the clip's A-pose**, which is about 24 deg more adducted than a bind of 36.
|
|
42
|
+
The gate pauses that real walk at 16 phases and reads the vertices the page draws. Cream Hoodie Anime Girl 1.0.6 passed
|
|
43
|
+
`avatar@2` and was broken there: forearms inside the hoodie, the side torn open as an arm swung back, a strand at the
|
|
44
|
+
waist, the back hair a rigid slab.
|
|
45
|
+
|
|
46
|
+
| Assert | What fails it | Usual cause, and the fix |
|
|
47
|
+
| --- | --- | --- |
|
|
48
|
+
| `avatar.bind_pose` | an upper arm bound less than 17 deg from straight down (Base Female 36), or another canonical bone far outside its envelope of Base Female's bind direction | Meshy/auto-rig arms bound nearly at the sides (the hoodie: 13-15 deg). **Re-bind the arms near the standard A-pose**: the hoodie rework re-bound them to Base Female's A-pose + 6 deg (oversized sleeves) and walked clean. Rotation-only re-bind of upperarm/lowerarm, baked into POSITION/NORMAL/TANGENT, with IBMs and node rotations rewritten on every LOD |
|
|
49
|
+
| `avatar.preview.arms_clear` | on average over the walk cycle, more than 13 % of the forearm/hand surface lies 3 cm or more inside the torso/hips (good avatars <= 8.5 %, Pastel Cyberpunk with arms bound at 20 deg; 1.0.6: 18 %) | the same low bind; also sleeves weighted to the torso. Fix the bind first |
|
|
50
|
+
| `avatar.preview.surface_closed` | two sides of one surface that touch at rest part by more than 5 cm in the walk (a slit opening: good <= 0.8 cm, 1.0.6: 36 cm) | **Never cut fused sleeve-to-torso (or cuff-to-hip) triangles.** That surface is real cloth and the cut leaves a hole the arm swing opens. Keep the triangles and fix the weights so the cloth follows its own part (re-weight hem and inner-sleeve vertices; no forearm weight on the hem) |
|
|
51
|
+
| `avatar.preview.silhouette` | hair, ears, capes or anything hung from the head or a non-skeleton bone stands more than 35 cm (at 1.70 m) behind or beside the torso's outline (good avatars <= 28 cm: Kemonomimi's flaring hair and cape) | hair chains with a wide cone, a collider that pushes the sheet off the hood. Tighten cones and drop the offending collider. This catches only gross outliers: a slab like 1.0.6's is below it, so **the critic judges that on the side frames** |
|
|
52
|
+
| `avatar.mesh.no_strands` | a thin fragment (over 5 cm long) floating more than 2 cm clear of every other surface | stray generation debris. Delete the loose piece from the mesh before import |
|
|
53
|
+
| `avatar.preview.posture` | neck or torso lean through the walk more than 25 / 15 deg from Base Female's | neck/head bind that differs from canonical, so the head pitches forward or droops with the walk delta. Bind neck and head at the canonical orientation |
|
|
54
|
+
|
|
55
|
+
Hair rule behind the slab: **hair weights belong on the head and the hair chains only.** Meshy leaves arm and clavicle
|
|
56
|
+
weights in the hair, and a heavy share of the mesh on a few stiff hair joints reads as a rigid sheet. Zero the arm and
|
|
57
|
+
clavicle weights in the hair, spread it over more chains with real cones, and let shoulder strands that are bound to an
|
|
58
|
+
arm stay rigid rather than swinging.
|
|
59
|
+
|
|
60
|
+
Frames for the critic: `motion.preview.{left,right,back}.{a,b}`, the walk paused with the left (`a`) and right (`b`) arm
|
|
61
|
+
swung furthest back, from the avatar's true left side, true right side and back. The critic is shown each next to the
|
|
62
|
+
height-matched Base body and a clothed control from the same phase and camera, and fails hair, hood, cloth or a strand
|
|
63
|
+
standing stiffly away from the body, a forearm or hand sunk in the torso, hips or a pocket, a hole or see-through gap, and
|
|
64
|
+
a head hanging forward. Stylised proportions, wide skirts, capes and swaying hair are not defects.
|
|
65
|
+
|
|
66
|
+
**`not measured` is a failure.** If the harness could not read one of these (the preview walk never played, the page did
|
|
67
|
+
not draw the avatar), the run fails with `not measured`, never a quiet pass. Find out why it could not be read (an
|
|
68
|
+
avatar the page will not draw or animate is as much a defect as one that tears) and fix that before re-running. The one exception: `wear.walk.no_holes` / `wear.walk.no_poke_through` on a
|
|
69
|
+
single-surface avatar (no separate outfit to measure) now report `not measured` as a warning, not a pass, and do not
|
|
70
|
+
block: the stage-2 asserts measure tears and buried limbs on the avatar's own surface.
|
|
71
|
+
|
|
72
|
+
The backend's vision critic also answers `avatar.textures` (lit frames vs the unlit **Reference: unlit base colour**
|
|
73
|
+
frame), `avatar.rig_distortion` (the **stride** frames: the walk paused mid-step, from the side, three-quarter and at the
|
|
74
|
+
legs) and `avatar.preview_walk` (the Marketplace frames above). Every check must pass.
|
|
75
|
+
|
|
76
|
+
## Reading a result honestly
|
|
77
|
+
|
|
78
|
+
- The `reference.albedo` frame is a diagnostic render with lighting off. It is supposed to look flat; compare the lit
|
|
79
|
+
frames against it.
|
|
80
|
+
- A harness error (exit 2) is not a verdict about the avatar. Fix the harness cause (sign-in, Try Now refusal) and
|
|
81
|
+
re-run; it never counts as a pass and cannot be overridden.
|
|
82
|
+
- A run with `HELIX_VQA_FIXTURE_MODEL` set is a proof harness for the asserts themselves and is always an error.
|
|
83
|
+
- A pass is a floor, not a verdict on quality. Open the `motion.preview.*` frames and look at the side and back views
|
|
84
|
+
yourself: a hair slab, a pinched sleeve or a stiff cape can sit inside every threshold.
|
|
85
|
+
- Re-judge after every new version: a pass binds to one exact Package version and manifest CID.
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: helix-avatars
|
|
3
|
+
description: Turn any character source — a VRM, a Dreamer/Meshy image-to-3D character, a rigged game model or rip, a CAD robot or scanned kit — into a published HELIX avatar that moves, looks right and passes visual QA on the first publish, including physics bones (helix/dynamics@1) for hair, tails, ears, cloth and soft tissue. Use for any request to make, import, convert, rig, fix, republish or add hair/cloth physics to an avatar or playable character body.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# HELIX Avatars
|
|
7
|
+
|
|
8
|
+
**Mandatory before any publish, new version, listing or "done": the `helix-gauntlet` loop** (`read_skill({ name: "helix-gauntlet" })`). Bar: the reference sheet or photos of the character; renders: the visual-QA turnaround, walk and Marketplace preview walk; your own look at every frame beside the bar, then a fresh blind critic. Ship only on its PASS.
|
|
9
|
+
|
|
10
|
+
An avatar is a Character Package, optionally projected as an Item, not a world. You ship one GLB:
|
|
11
|
+
- on the `helix-humanoid@1` skeleton;
|
|
12
|
+
- normally with three LOD scenes;
|
|
13
|
+
- carrying its face and dynamics manifests in scene extras.
|
|
14
|
+
|
|
15
|
+
It is validated, sealed into a Character Package, visually verified, then offered when requested. The rules are
|
|
16
|
+
in `read_skill({ name: "helix-avatars", reference: "contract" })`. Read that once before step 3. This
|
|
17
|
+
file is the order of work and its gates.
|
|
18
|
+
|
|
19
|
+
**The default failure** is an avatar that passes every gate and is still broken the moment it moves.
|
|
20
|
+
Cream Hoodie 1.0.0 passed the backend verifier, the engine bind check and visual QA, and at the same
|
|
21
|
+
time:
|
|
22
|
+
- its chest dented with every arm swing;
|
|
23
|
+
- one edge stretched into a 16 cm spike at the hip;
|
|
24
|
+
- a dozen Dreamer drafts around it rendered flat glowing white.
|
|
25
|
+
|
|
26
|
+
The rest pose hides all of it. So every gate below reads an artifact, and the last ones are your own
|
|
27
|
+
eyes on the avatar walking and running, close up, in the real runtime.
|
|
28
|
+
|
|
29
|
+
## The workflow
|
|
30
|
+
|
|
31
|
+
Keep a ledger file. For each step, record the artifact that proves it passed.
|
|
32
|
+
|
|
33
|
+
1. **Collect the reference.** Use whichever applies:
|
|
34
|
+
- photographs of the real robot, actor or costume;
|
|
35
|
+
- the source game's own renders;
|
|
36
|
+
- the concept art or turnaround.
|
|
37
|
+
|
|
38
|
+
Record the real height, and decide what must move: hair, tail, ears, skirt, coat, soft tissue.
|
|
39
|
+
**Gate:** a reference folder, the height, and a list of the moving parts.
|
|
40
|
+
|
|
41
|
+
2. **Acquire the source and pick its bridge.**
|
|
42
|
+
|
|
43
|
+
| You have | Reference |
|
|
44
|
+
| --- | --- |
|
|
45
|
+
| A `.vrm` (VRoid or VRM 0.x/1.0) | `source-vrm`: spring bones and face convert automatically |
|
|
46
|
+
| Only an image or concept, or a Dreamer/Meshy GLB | `source-generated` |
|
|
47
|
+
| A rigged game model, rip, mod or downloaded FBX/GLB | `source-model` |
|
|
48
|
+
| A robot, CAD or URDF, an untextured scan, armour | `source-rigid` |
|
|
49
|
+
|
|
50
|
+
Score the candidate sources before committing:
|
|
51
|
+
- real skinning;
|
|
52
|
+
- textures;
|
|
53
|
+
- the right variant;
|
|
54
|
+
- triangle headroom;
|
|
55
|
+
- separable hair or cloth if they must move.
|
|
56
|
+
|
|
57
|
+
Record what the source lacks, and do not invent it. Prefer a VRM whenever one exists. A VRoid
|
|
58
|
+
model exported as GLB loses its face and physics.
|
|
59
|
+
**Gate:** the source is on disk, with an inventory: nodes, skins, joints, materials, triangles,
|
|
60
|
+
morph names, and what is absent.
|
|
61
|
+
|
|
62
|
+
3. **Rig onto `helix-humanoid@1`.** Read `rigging`. Choose:
|
|
63
|
+
- rigid 1:1 binding for mechanical parts;
|
|
64
|
+
- kept and folded game weights for a clean skinned rig;
|
|
65
|
+
- repaired weights for auto-rigs.
|
|
66
|
+
|
|
67
|
+
Then pose to the canonical A-pose and check the short-body gate.
|
|
68
|
+
**Gate:** a JSON readback, per LOD after import, of which joint **names** carry weight on each
|
|
69
|
+
region, and of how far each influencing bone sits from its vertex. A T-pose render is not
|
|
70
|
+
evidence.
|
|
71
|
+
|
|
72
|
+
4. **Import, materials and budgets.** Run `import_character` (CLI `helix character import`) with:
|
|
73
|
+
- `--fit source`;
|
|
74
|
+
- `--lod-tris` set to use the budget;
|
|
75
|
+
- `--no-bake` when the source has its own UVs.
|
|
76
|
+
|
|
77
|
+
Then check the budget, **counted across every LOD**:
|
|
78
|
+
- ≤ 60,000 triangles and ≤ 12 draws;
|
|
79
|
+
- ≤ 10 MiB, ≤ 8 materials, ≤ 2048 px;
|
|
80
|
+
- each LOD scene with its own skeleton;
|
|
81
|
+
- no emissive factor without its map.
|
|
82
|
+
|
|
83
|
+
**Gate:** the import receipt (`*.avatar-import.json`) plus the structure, budget and motion checks in `qa`.
|
|
84
|
+
|
|
85
|
+
5. **Dynamics, if anything should move.** Read `dynamics`.
|
|
86
|
+
- A VRM arrives with chains. Audit its `center` chains, which come in at inertia 0.6.
|
|
87
|
+
- Anything else needs auxiliary joints and a `helix/dynamics@1` manifest on every LOD scene, added
|
|
88
|
+
**after** import.
|
|
89
|
+
|
|
90
|
+
**Gate:**
|
|
91
|
+
- the manifest obeys the strict-parse rules;
|
|
92
|
+
- every chain root exists in every skin;
|
|
93
|
+
- cost is within caps;
|
|
94
|
+
- a walk-and-**run** measurement of swing and body gap (`qa` step 3).
|
|
95
|
+
|
|
96
|
+
6. **Face.** Read `face` and `read_doc({ name: "avatar-face" })`. The face is either:
|
|
97
|
+
- VRM-automatic;
|
|
98
|
+
- detected by exact morph names;
|
|
99
|
+
- mapped with `faceMap`;
|
|
100
|
+
- or honestly `none`, said in the listing.
|
|
101
|
+
|
|
102
|
+
List everything in front of the eyes in `helixAvatar.firstPersonHide`.
|
|
103
|
+
**Gate:** the importer's `face:` line, and the first-person hide list.
|
|
104
|
+
|
|
105
|
+
7. **Check before upload.** Run `qa` steps 1–3:
|
|
106
|
+
- structure;
|
|
107
|
+
- static renders against the reference;
|
|
108
|
+
- the offline motion probe against the stock body, on the platform's own clips and the engine's
|
|
109
|
+
own dynamics solver.
|
|
110
|
+
|
|
111
|
+
A throwaway `helix init` + `helix install` world supplies all three. No GPU is needed.
|
|
112
|
+
**Gate:** a structure report, a contact sheet you have looked at, and limb-rotation, sole and
|
|
113
|
+
stretch numbers against the control.
|
|
114
|
+
|
|
115
|
+
8. **Upload and run visual QA.** Read `publish`. Steps 0–3 there:
|
|
116
|
+
- render a thumbnail. The upload requires one; `item_thumbnail` can re-render or replace it later;
|
|
117
|
+
- seal the Character Package Version through the Creator's approved Publications workflow;
|
|
118
|
+
- `visual_qa_item_hosted`, or `visual_qa_item` with `--submit`.
|
|
119
|
+
|
|
120
|
+
The avatar stays held, visible only to you, until a run passes. The gate's asserts and fixes are
|
|
121
|
+
in `read_skill({ name: "helix-avatar-qa" })`. **No admin overrides.** Route `avatar@3` also walks
|
|
122
|
+
the avatar on the Marketplace item page and judges it from the side and back; a `not measured`
|
|
123
|
+
assert fails the run.
|
|
124
|
+
**Gate:** a PASS record, and the contact sheet opened, `motion.preview.*` side and back frames
|
|
125
|
+
included. A pass is not proof the avatar looks right.
|
|
126
|
+
|
|
127
|
+
9. **Live close-ups and the critic.** Run `qa` steps 5–6:
|
|
128
|
+
- Marketplace preview **and** in-world Try Now;
|
|
129
|
+
- face, hands, feet, and hair or tail at idle, walking and running;
|
|
130
|
+
- LODs at distance;
|
|
131
|
+
- then a blind critic against the reference.
|
|
132
|
+
|
|
133
|
+
**Gate:** live captures, and a critic ledger that names the exit taken (win or plateau). Anything
|
|
134
|
+
that fails goes back to the step that owns it, as a new Package Version.
|
|
135
|
+
|
|
136
|
+
10. **Offer when requested.** Use the Creator's approved Publications workflow to create an optional
|
|
137
|
+
Item and Marketplace or World offer from the sealed Package Version. Package publication alone
|
|
138
|
+
creates no Item or creator copy.
|
|
139
|
+
|
|
140
|
+
**Gate:** verify the published Package Version and, when an offer was requested, verify the
|
|
141
|
+
offer and an owner-style claim with a QA account that ends with the avatar worn in a world.
|
|
142
|
+
|
|
143
|
+
## Hard rules (each prevents a failure that already shipped)
|
|
144
|
+
|
|
145
|
+
- **Judge it moving, against a control body.** A rest pose hides wrong skin indices and bad weights,
|
|
146
|
+
and no platform gate checks the weights themselves.
|
|
147
|
+
- **Bind the arms near the canonical A-pose and never cut fused sleeve/torso triangles.** The Marketplace
|
|
148
|
+
walk adducts the arms ~24°; arms bound under 17° from straight down walk into the body, and a cut
|
|
149
|
+
sleeve opens as a hole. Fix weights, keep hair weights on the head and hair chains only. See `rigging`
|
|
150
|
+
and `source-generated`.
|
|
151
|
+
- **Every edit after import is made on every LOD.** That covers joints, weights, manifests and
|
|
152
|
+
first-person hide. Each LOD scene keeps its own skeleton copy.
|
|
153
|
+
- **Budgets count every LOD.** 60k triangles and 12 draws are totals for the file, not per level.
|
|
154
|
+
- **Strip a generated source's emissive factor together with its map.** Otherwise the avatar glows
|
|
155
|
+
flat white.
|
|
156
|
+
- **Count arm<->leg triangles on a generated character before you trust it.** A hand fused to the
|
|
157
|
+
thigh tears into a sheet in the walk. The importer cuts it (`--limb-bridges repair`, the default),
|
|
158
|
+
but a draft built before that step needs a re-import. See `source-generated`.
|
|
159
|
+
- **Never let the importer rebake a source that has its own good UVs.** Pass `--no-bake`. The rebake
|
|
160
|
+
smeared a mouth into a chin.
|
|
161
|
+
- **A malformed dynamics manifest silently kills all physics.** The only signal is one console line,
|
|
162
|
+
and nothing validates the manifest offline.
|
|
163
|
+
- **Tune dynamics for the run, not the idle.** Every smear into a hood or collar appeared at a run.
|
|
164
|
+
- **Under 1.35 m, check (pelvis − foot) / 0.877 < 0.65,** or the feet sink.
|
|
165
|
+
- **Set the dynamics values before the first publish.** After it, changing inertia or limits needs a
|
|
166
|
+
new Package Version.
|
|
167
|
+
- **Write endpoints and collider offsets in the bone's own axes.** On `helix-humanoid@1`, a spine or
|
|
168
|
+
head bone's local +X points up, so "straight down" is `[-L, 0, 0]`, not `[0, -L, 0]`. The parser
|
|
169
|
+
accepts the wrong axis silently. See `dynamics`.
|
|
170
|
+
|
|
171
|
+
## Tools you will use
|
|
172
|
+
|
|
173
|
+
| Purpose | Tools |
|
|
174
|
+
| --- | --- |
|
|
175
|
+
| Discovery | `search_items({ kind: "avatar" })` for published avatars and their thumbnails. `search_items({ hostKind: "character" })` for character add-ons. |
|
|
176
|
+
| Import | `bridge_import`, for VRM. `import_character`, for everything else. |
|
|
177
|
+
| Generation | `generate_asset({ kind: "character", referenceSheetPath })` |
|
|
178
|
+
| Validation | Structure, budget and motion checks in `qa`; the Creator publication workflow validates the Package Version |
|
|
179
|
+
| Publishing | `publish_continuum_package`, `publish_owned_item`, `visual_qa_item`, `visual_qa_item_hosted`, `visual_qa_item_status`, `item_thumbnail`, `disable_item_distribution`, `delist_item` |
|
|
180
|
+
|
|
181
|
+
Some steps are CLI-only:
|
|
182
|
+
- `helix continuum publish-package --stage`;
|
|
183
|
+
- `helix item set-version`;
|
|
184
|
+
- `helix character repair-lod-skeletons`.
|
|
185
|
+
|
|
186
|
+
Mesh, pose and weight work happens in headless Blender and `@gltf-transform/core`. If either is
|
|
187
|
+
missing, install it. Dynamics authoring has no CLI step yet (`helix-creator-cli` #295), so script it
|
|
188
|
+
against the contract. Validate it with the engine's own parser, and measure it with the probe in
|
|
189
|
+
`qa`. Both run from a throwaway world that `helix init --kind character` and `helix install` create. Everything the platform executes is a `helix …` command. Run it; never re-implement it.
|
|
190
|
+
|
|
191
|
+
## References
|
|
192
|
+
|
|
193
|
+
`read_skill({ name: "helix-avatars", reference: "<name>" })`:
|
|
194
|
+
|
|
195
|
+
| Reference | Covers |
|
|
196
|
+
| --- | --- |
|
|
197
|
+
| `contract` | Skeleton, frame, A-pose, LOD scenes with their own skeletons, budgets over all LODs, the preflight, short-body gate, feet, first-person hide, the import receipt. |
|
|
198
|
+
| `rigging` | Bone maps, the canonical rest, rigid vs skinned binding, helper folding, weight sanity, why a T-pose hides skin-index bugs. |
|
|
199
|
+
| `dynamics` | The `helix/dynamics@1` schema and strict parse, authoring chains on non-VRM sources, parameters that shipped, failure modes (smearing, clipping, LOD drift). |
|
|
200
|
+
| `face` | What each source gets, the capability ladder, adding a jaw, first-person. |
|
|
201
|
+
| `source-vrm` | The bridge route, what converts, auditing `center` chains and damping. |
|
|
202
|
+
| `source-generated` | Dreamer and Meshy: sheet layout, visibility, emissive, `--no-bake`, auto-rig weight repair, hands fused to thighs, fused-shell hair, pale/glossy outfits. |
|
|
203
|
+
| `source-model` | Game rips and downloads: acquisition, posing, material conversion, UASTC normals, hard-surface LODs. |
|
|
204
|
+
| `source-rigid` | Robots, CAD and scans: 1:1 binding, pistons, segmentation, palette atlas, the short-body gate. |
|
|
205
|
+
| `publish` | Thumbnail, preflight, upload, visual QA, seal and pin, distribute, new versions, pausing. |
|
|
206
|
+
| `qa` | Structure checks, motion against a control body, live close-ups in both surfaces, the blind critic, and what eyes caught. |
|