fix(collector,trainer): migrate an existing collector DB on open; trainer handlers answer 500 JSON
The reviewer host's collector.sqlite was created by an earlier build, before the `kind` column. CREATE TABLE IF NOT EXISTS shapes only a new database, so every query naming the column failed: the collector's /health (container unhealthy), every booth ingest, and the trainer's readiness — whose stdlib server printed the traceback and dropped the socket, which the collector could only render as "trainer not reachable: fetch failed". Nine days like that. - CollectorDb.#migrate(): PRAGMA table_info against the list of columns added since the first deploy; ALTER TABLE ADD COLUMN for each missing one (all nullable or defaulted). Append to that list whenever a column joins the CREATE. Test replays the original schema: health, ingest, stats, a legacy row reads back with the defaults. - Trainer Handler._guarded(): any unexpected exception → 500 JSON naming it, never a dropped connection; /health keeps answering. Test drives readiness against an old-schema DB. - The collector's training status proxy includes the trainer's error text. Wiki: the incident and the schema rule (vision-review-outbox), what the message means (bodytype-classifier-training), log. Deploy: the new collector migrates on start; nothing manual. Claude-Session: https://claude.ai/code/session_01FWncR69HgGPuei1dLrW3cU
This commit is contained in:
@@ -173,6 +173,13 @@ The CLI is still there for debugging, inside the running container:
|
||||
- **Reviewing is the bottleneck**: the Training section shows labels per class against the
|
||||
minimum and keeps Train disabled until two classes clear it.
|
||||
|
||||
**"Training — trainer not reachable: fetch failed" (2026-09-16).** Not a network problem: the
|
||||
trainer answered `/health` but its `/readiness` crashed on the collector's DB (a volume from before
|
||||
the `kind` column) and the stdlib server dropped the socket without a reply. Since the fix the
|
||||
trainer answers **500 JSON with the error** and the collector shows that text; a genuine network
|
||||
failure still reads "fetch failed" / ECONNREFUSED. See [[vision-review-outbox]] §Incident 2026-09-16.
|
||||
|
||||
|
||||
## Packaging rule (same as the vision service)
|
||||
|
||||
Core deps are light (numpy, opencv-headless, onnxruntime): `inspect`, `evaluate`, the data and
|
||||
|
||||
Reference in New Issue
Block a user