catalog: status: down for the 6 unreachable services; StatusT extended

Per althing thread 01KRCNSF0V5NDCKB34H663MXHS — the catalog declared
14 services but 6 of them aren't running on irv-ml1 (chatterbox,
index-tts, qwen3-tts, cosyvoice, voxtral, kyutai-tts; missing from
docker ps entirely). Without action, the asset-engine UI would
declare them as available and consumers would hit unreachable
endpoints.

asset-engine consumer chose option (1) of three I sketched: extend
StatusT with `down` and treat it identically to `catalog-deferred`
in the picker (greyed, non-clickable). Lightweight, declarative, no
runtime health-check machinery, easy to revert when services
return.

Changes:

- StatusT enum (in asset_engine/catalog.py — committed there
  separately) extended from
    Literal["ready", "catalog-deferred", "experimental"]
  to
    Literal["ready", "catalog-deferred", "experimental", "down"]
- 6 services flipped to status: down.
- CATALOG-CONTRACT.md: replaced the bare-enum status row with a
  four-row sub-table that names each value's meaning AND its picker
  behavior. `down` and `catalog-deferred` get the same UI treatment
  but the tooltip text differentiates ("Catalog-deferred" vs
  "Service down — temporarily unreachable on irv-ml1") so the
  semantic distinction (design state vs fleet-ops state) is
  preserved.
- CATALOG-CONTRACT.md versioning policy table: new row codifying
  "extending an existing enum (StatusT, FieldTypeT, ResponseTypeT,
  CategoryT) with a non-conflicting value, with the consumer
  updated in the same coordinated change" → no catalog_version
  bump. Explicit rule for future enum extensions.
- JSON Schema regenerated.

catalog_version stays at 1.

Operational note (not catalog-side): the down services likely got
reaped 13+ days ago per the docker timestamps when other unrelated
work was done on irv-ml1. Bringing them back is a deploy task
outside this commit's scope. Flip status: down → ready in this file
once each one's confirmed running.
This commit is contained in:
vh
2026-05-11 16:31:53 -07:00
parent a0d09edc42
commit 95f24573e4
3 changed files with 19 additions and 2 deletions
+11 -1
View File
@@ -37,7 +37,16 @@ reproducibility_audit: [Audit] # one entry per service
| `description` | string | no | one-paragraph summary |
| `category` | enum: tts, asr, sfx, music, image | yes | groups in pickers |
| `version` | int | yes | per-service schema version; bump on field changes |
| `status` | enum: ready, catalog-deferred, experimental | no | default: ready |
| `status` | enum: ready, catalog-deferred, experimental, down | no | default: ready |
**Status semantics:**
| value | meaning | picker behavior |
|---|---|---|
| `ready` | Deployed, exercised, current default | clickable, primary surface |
| `experimental` | Deployed, may break under unusual params or while a custom renderer is being built (e.g. kokoro-captioned pre-renderer) | clickable, surfaced with a "experimental" tag |
| `catalog-deferred` | By-design out of scope this catalog version (e.g. ComfyUI requires per-asset workflow templates the catalog can't express today) | greyed, non-clickable, "deferred" tooltip |
| `down` | *Temporarily* unreachable on the host fleet — deployment gap, scheduled maintenance, container reaped, etc. Distinct from `catalog-deferred` because the intent is to flip back to `ready` once redeployed; the catalog row still describes a real intended service. | greyed, non-clickable, "service down" tooltip |
| `host` | string (host alias) | yes | which fleet host serves this |
| `endpoint` | URL | yes | absolute URL of the inference endpoint |
| `method` | string | yes | HTTP method (POST common) |
@@ -97,6 +106,7 @@ Same change-management as field types.
| Add a non-required field to an existing service | service `version:` |
| Add an optional key to the `response:` schema (e.g. audio_field, timestamps_field) | nothing — additive, backward-compatible |
| Add an optional key to a Field (e.g. section) or to Service (e.g. section_groups) | nothing — additive, backward-compatible |
| Extend an existing enum (StatusT, FieldTypeT, ResponseTypeT, CategoryT) with a non-conflicting new value, with the consumer updated in the same coordinated change | nothing — older consumers don't encounter the new value; updated consumers parse it correctly |
| Change a field's type, range, or default | service `version:` |
| Remove a service | service `version:` (sentinel: removed=true), then drop in next catalog_version bump |
| Add a new entry to the field-type vocabulary | `catalog_version:` |