tooling/db/ (a misnamed directory: connectors, not database work),
trellis-batch.sh and synth_ui_sounds.py become `reach assets`:
audio {health,generate,batch,post {convert,normalize,trim,pipeline}},
image {health,generate}, trellis {health,generate,batch}, and synth-ui.
The four audio bash wrappers are retired, and tooling/db/ is gone.
Parity, from baselines taken before anything moved:
- the four UI-sound WAVs and the harmonic-synth WAVs (exponential and linear
decay) are byte-identical
- the ffmpeg pipeline's decoded PCM is identical. Its .ogg bytes are not,
even between two runs of the OLD code: Ogg picks a random stream serial,
so the encoded file was never the right thing to compare
- the network success paths can't be run in a gate (Stable Audio and Trellis
are kept off, Gemini costs money), so tooling/test_assets.py stands up a
fake Gradio and pins every payload: the audio submit, Trellis's six-call
session sequence with its 9-input image_to_3d, and the Gemini body. It
failed when one Trellis value was mutated (7.5 → 7.0)
Failure classification, in endpoints.py, is the point of the port. The
services are OFF by design (VRAM on tower-of-joy, D-17), and the topology doc
warns against "fixing" one by restarting it. So a refused connection says OFF
and asks for the service to be turned on rather than restarted; a 4xx/5xx says
the request was rejected; 401/403 says credentials; 429 says quota; and an
unreachable Gemini blames the network, not VRAM.
Behaviour changes, each a failure that used to read as success or crash:
- audio batch and trellis batch exited 0 with failures in their summaries;
they now print the summary and exit 1
- trellis generate on a missing image crashed with a TypeError
(print(..., indent=2)); it now names the file, and checks it before the
service so a typo is not reported as an outage
- the ffmpeg pipeline left its intermediates behind when a step failed
Structure: the connectors called each other as subprocesses (batch spawned
the connector, which spawned audio_post) and parsed each other's stdout. They
are now function calls, and ffmpeg is the only exec, through core/process.
ensure_venv() is removed: it os.execv'd into .venv, which D-263's exec rule
forbids, and reach declares the dependencies itself. config.json moved into
the domain deliberately, and the local-services rule follows it.
Output contract: results are still JSON on stdout with the same keys, so skill
readers keep working. Failures are an exit status with a Fix line, never
{"ok": false}. The audio-gen, glb-gen and image-gen skills, Araminta's agent
file and the allow-list are updated to match. glb-gen's "trellis-batch.sh is
hardcoded to one category" caveat is gone: batch takes --input-dir or --names.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
title, description, type, status
| title | description | type | status |
|---|---|---|---|
| Asset Pipeline Index | Master index linking all asset pipelines (audio, visual, video) with structure and conventions | design | active |
Asset Pipeline Index
Centralized tracking for all production assets across pipelines. Each pipeline has its own index, palette (style bible), and per-category asset tables.
Pipelines
| Pipeline | Index | Palette | Status |
|---|---|---|---|
| Audio | audio/README.md | audio/palette.md | Active — Sprint 7 |
| Visual | visual/README.md | visual/palette.md | Active — catalog + style bible instantiated (T-1050/T-1052) |
| Video | video/README.md | video/palette.md | Stub |
Structure
docs/assets/
README.md # This file — master index
_templates/
audio.md # Row template + detailed entry template for audio
sprite.md # LEGACY object-sprite row template (D-244 retired sprites; model/texture/artwork rows are inline in each visual/*.md file, T-1050)
video.md # Row template + detailed entry template for video
asset-brief.md # One-page per-class brief template (scope/visual reference/naming/gen path/acceptance) — T-1049
briefs/ # Per-asset-class briefs gating T-961's child stories (T-1049) + deferred.md formal deferral note
audio/
README.md # Audio pipeline index — categories, status summary
palette.md # Sonic palette, aesthetic guide, generation approach
ambient.md # All ambient loops (station, planet, biome, weather)
sfx.md # All SFX (footsteps, doors, impacts, events)
ui.md # All UI sounds (cursor, chimes, insert-tech)
visual/ # 3D models + textures + flat artwork (D-244 — no per-object sprites)
README.md # Visual pipeline index
palette.md # Art direction, "the angle", color relationships
models.md # 3D objects/props (.glb via Trellis /glb-gen)
textures.md # PBR surface maps (BaseColor/Normal/Roughness) for 3D models
artwork.md # Flat 2D art — paintings, flags, billboards, signage (via /sprite-gen)
icons.md # UI icons, status indicators (UI layer)
effects.md # Shaders, particles, overlays
conventions.md # Model naming, mask sidecars, D-235-keyed texture naming, footprint metadata (T-1050)
video/
README.md # Video pipeline index
palette.md # Motion/editing style guide
trailers.md # Marketing / Steam page trailers
cutscenes.md # In-game narrative moments
Conventions
- One .md per category — asset table with one row per asset, detailed entries below for complex items
- palette.md per pipeline — the style bible. Aesthetic baseline, theme, generation approach.
- Status values:
planned|in-progress|placeholder|final - Templates:
_templates/{type}.md— row format + detailed entry format - Asset files live in
client/assets/{type}/— these docs track design and production metadata - Category splitting: When a category file grows too long, split by domain (e.g.,
furniture-station.md,furniture-colony.md)
Cross-References
- Decision files:
decisions/(D-038 audio scope, D-033 entity colors, D-019 camera angle) - Art direction workshop:
docs/workshops/art-direction-mood-board/ - Sprint briefings:
docs/sprints/sprint-N/{team}.md - Per-class asset briefs: briefs/ — station walls, rural walls, doors, floors, furniture/props, each gating a T-961 child story (T-1049); briefs/deferred.md records the formal deferral for lamp posts / TVs / billboards / barns (T-1051) + cars (Q-067).