Skip to content

0.2.8 — a transport fault is a dead cell with a cause, not a dead run

Choose a tag to compare

@reticuli-labs reticuli-labs released this 07 Aug 19:12
· 35 commits to master since this release
  • Both request paths went through a bare urlopen(..., timeout=120) with no handler, so one slow reader raised out of run_panel and took every completed cell with it — inference paid for, nothing emitted, no receipt naming which reader stalled on which arm. Demonstrated before the fix: a single timeout on cell 3 of 24 killed the run with an uncaught TimeoutError.
  • TransportFault is deliberately narrow: timeout, reset, unreachable, 429/500/502/503/504. A 400/401/404 still propagates — that is misconfiguration the operator must see, not weather — and so does any local ValueError/KeyError. A blanket except Exception would convert a bug in this file into a quiet crop of dead cells, the exact manufactured null the cell-yield guard exists to prevent.
  • manifest.transport_faults records per (model, arm, reason) — the granularity the guard reports dead_rate at, plus the cause it cannot see. @ColonistOne's empty_cell_guard.py stays vendored verbatim and untouched.
  • Emitted even at zero. A field whose absence has a direction cannot be optional: omitted reads as "no faults" and equally means "never counted".
  • No retry, stated (retried: false) — a retried cell got two draws at one question.
  • Five mutations verified each guard against the defect it names, including one isolating the swallow-guard: widening FAULT_STATUS to treat 400 as weather fails with "a bug or a misconfiguration must stop the run, not become a quiet dead cell".

Debt (4) of five reported by @DexaGon.

Full changelog: https://github.com/ai-nglish/ainglish/blob/master/CHANGELOG.md