fix: live-API corrections — music result shapes, mesh format honesty, mesh conversion #16

Merged
steve merged 1 commits from fix/live-smoke-round2 into main 2026-07-14 16:45:58 +00:00
Owner

Round 2 from the live netherstorm smokes — three places where the real APIs contradicted their documentation:

  1. ACE-Step's result blob is an array with raw control chars. The double-encoded result string is [{...}] (not {...}) and contains literal newlines inside string values — Go's strict JSON rejected it, so every successful music job would have failed at the last step. parseMusicResult sanitizes control characters (only legal inside string values in that blob) and accepts both shapes. Regression test uses the exact live payload shape.
  2. Hunyuan3D always returns GLB. Its GenerationRequest has no output-format field at all (the type param in their API docs doesn't exist in the code) — so a format: stl request came back as GLB bytes labelled model/stl. Results are now labelled by sniffed magic (glTF / solid ), never by the request.
  3. NEW meshgen.Converter optional surface + llamaswap impl over the mediautils shim's POST /v1/convert_mesh (steveternet 12b52a2) — the GLB→STL hop that makes format: stl actually deliverable for the printer pipeline.

Tests: live-shape music parse (array+ctrl chars, docs-shape object, garbage), sniffed-GLB-despite-stl-request labelling, converter happy path. All green.

🤖 Generated with Claude Code

Round 2 from the live netherstorm smokes — three places where the real APIs contradicted their documentation: 1. **ACE-Step's `result` blob is an array with raw control chars.** The double-encoded `result` string is `[{...}]` (not `{...}`) and contains literal newlines inside string values — Go's strict JSON rejected it, so every successful music job would have failed at the last step. `parseMusicResult` sanitizes control characters (only legal inside string values in that blob) and accepts both shapes. Regression test uses the exact live payload shape. 2. **Hunyuan3D always returns GLB.** Its `GenerationRequest` has no output-format field at all (the `type` param in their API docs doesn't exist in the code) — so a `format: stl` request came back as GLB bytes labelled `model/stl`. Results are now labelled by sniffed magic (`glTF` / `solid `), never by the request. 3. **NEW `meshgen.Converter` optional surface** + llamaswap impl over the mediautils shim's `POST /v1/convert_mesh` (steveternet `12b52a2`) — the GLB→STL hop that makes `format: stl` actually deliverable for the printer pipeline. Tests: live-shape music parse (array+ctrl chars, docs-shape object, garbage), sniffed-GLB-despite-stl-request labelling, converter happy path. All green. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
steve added 1 commit 2026-07-14 16:22:28 +00:00
fix: live-API corrections — music result shapes, mesh format honesty, mesh conversion
Gadfly review (reusable) / review (pull_request) Successful in 15s
Adversarial Review (Gadfly) / review (pull_request) Successful in 15s
CI / Tidy (pull_request) Successful in 9m26s
CI / Build & Test (pull_request) Successful in 10m0s
fd8d56c3c1
Round 2 from live smokes on netherstorm (2026-07-14):

- ACE-Step result blob is an ARRAY of objects and carries RAW control
  characters inside string values (literal newlines) — strict JSON
  rejected it. parseMusicResult sanitizes control chars (only legal
  inside string values in the double-encoded blob) and accepts array or
  object shapes. Regression test uses the live payload shape.
- Hunyuan3D GenerationRequest has NO output-format field (the documented
  type param is fiction) — it always returns GLB. Results are now
  labelled by sniffed magic bytes, never by the requested format.
- NEW meshgen.Converter/ConverterProvider optional surface + llamaswap
  impl over the mediautils shim POST /v1/convert_mesh — the STL hop for
  the printer pipeline.

Co-Authored-By: Claude Fable 5 <[email protected]>
steve merged commit 19972b1864 into main 2026-07-14 16:45:58 +00:00
steve deleted branch fix/live-smoke-round2 2026-07-14 16:45:58 +00:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: steve/majordomo#16