---
title: Pripravenosť, ktorá patrila včerajšku
type: failure
level: L2
status: live
revision: 1
updated: 2026-08-25
systemVersion: 4.2
authoring: machine-translated
tags: [data, time-series, verification, silent-failure, failure]
rating: 8.65
ratingAxes: useful 9 · evidence 9 · pull 8 · original 8 · form 9
ratingKind: derived
source: scheduled-job logs and daily store, 2026-08-20 to 2026-08-24
---

# Pripravenosť, ktorá patrila včerajšku

_Written 2026-08-25 · last verified 2026-08-25 · system v4.2 · live_

**TL;DR** — API nositeľného zariadenia vracia denné metriky pre deň D, spánok za noc, ktorá sa začala v deň D, ale je zaevidovaná pod D+1, a skóre pripravenosti vypočítané pre ráno dňa D. Pri naivnom spojení do jedného riadku na deň je pripravenosť posunutá o jeden deň mimo synchronizácie. Prezradila to korelácia −0,229 voči spánku v tom istom riadku a +0,792 voči predchádzajúcemu riadku, n = 29. Ten istý subsystém tiež skončil s kódom 0 pri poloprázdnej odpovedi s veľkosťou 78 KB namiesto 230 KB.

## Príznak

Skóre rannej pripravenosti 12 zo 100 sa objavilo v tom istom riadku tabuľky ako noc, ktorú tá istá tabuľka označovala ako dostatočnú. Agent riadok prečítal presne tak, ako bol zapísaný, usúdil, že daná osoba nemá dostatok spánku, a odporučil zrušiť plánovanú tréningovú progresiu.

Odporúčanie bolo náhodou správne. Uvedený dôvod bol nesprávny — a to je z tých dvoch chýb tá drahšia.

## Príčina

Dodávateľ nezaznamenáva všetky polia voči rovnakému dňu. Tri rodiny polí, tri konvencie:

> denné metriky (kroky, pokojová srdcová frekvencia, stres, batéria) → **deň D**
> spánok → noc, ktorá sa *začala* v deň D, ale dodávateľ ju eviduje pod **D+1**
> pripravenosť → vypočítaná pre **ráno dňa D**, z predchádzajúcej noci

Po spojení do jedného riadku na kalendárny deň — čo je zrejmý a zároveň tvar, aký chce každý dashboard — sa pripravenosť ocitne posunutá o jeden deň voči spánku. Každý riadok je sám osebe hodnoverný. Nič nie je null, nič nie je mimo rozsahu a nevyvolá sa žiadna chyba. Spojenie jednoducho v jednom riadku opisuje dve rôzne noci.

Zostávalo to neviditeľné, pretože každý riadok dával zmysel aj sám osebe. Viditeľným sa to stane až vtedy, keď prestanete čítať riadky a začnete korelovať stĺpce:

> Korelácia pripravenosti so spánkom v **tom istom** riadku: **−0,229**
> Korelácia pripravenosti so spánkom v **predchádzajúcom** riadku: **+0,792** (n = 29)

Záporná korelácia medzi spánkom a pripravenosťou na nasledujúce ráno nie je zistenie o fyziológii. Je to chyba v zarovnaní prezlečená za zistenie — a presne taký druh zistenia, o ktorom agent ochotne napíše tri sebavedomé odseky.

## Cena

Jedno nesprávne priradenie príčiny a jedno odporúčanie podané so sfabrikovaným dôvodom. Samo osebe je to malá vec — ale keď sa zarovnanie opravilo, ukázalo sa, že skutočným faktorom bolo 31 hodín nahromadeného regeneračného času z dvoch tréningov predchádzajúceho dňa, nie spánkový dlh. Tieto dve veci majú opačné riešenia: spánkový dlh sa rieši odpočinkom, regeneračný sklz časom a ľahkým pohybom.

**Správna rada, no z nesprávneho dôvodu, je najdrahšia trieda chýb, akú agent produkuje**, pretože nič ďalej v reťazci jej neodporuje. Prežije revíziu, opakuje sa a potichu učí čitateľa akceptovať aj ďalšie vysvetlenie od toho istého zdroja.

Ten istý subsystém v tom istom týždni spôsobil druhé, tichšie zlyhanie. Naplánované sťahovanie dát prebehlo o 07:00, skôr než sa hodinky cez noc stihli synchronizovať. API vrátilo prázdnu kostru namiesto chyby. Úloha skončila s kódom **0**, zaznamenala úspešný beh a zapísala deň, v ktorom boli prítomné kroky, ale chýbal spánok. O krok ďalej v spracovaní jediné chýbajúce pole spánku potlačilo celý blok v rannom prehľade — jedna chýbajúca hodnota, celý panel preč, nikde žiadne upozornenie. Jediným spoľahlivým signálom bola veľkosť odpovede: **78 KB namiesto približne 230 KB**.

## Náprava

**Zarovnanie odvoďte, nečítajte ho z dokumentácie.** Dve korelácie voči susedným riadkom, vypočítané raz, to vyriešia spôsobom, aký nedokáže žiadny názov poľa. Trvalo to jeden riadok kódu a dnes je to prvá vec, ktorá sa spustí proti akémukoľvek novému dátovému kanálu dodávateľa.

**Nikdy neoznačujte deň za kompletný na základe čiastočných dát.** Deň sa počíta za zapísaný, len ak obsahuje *aj* počet krokov, *aj* záznam o spánku. Čokoľvek menej zostáva otvorené a zachytí to nasledujúce spätné doplnenie, takže diera sa nikdy nestane trvalou.

**Spustite sťahovanie dvakrát.** Druhá úloha neskôr ráno v dobrý deň nestojí nič — pravidlo úplnosti z nej urobí no-op — a v zlý deň opraví pretekanie procesov (race condition).

**Overujte veľkosť odpovede.** Odpoveď o rád menšia ako bežne je zlyhanie bez ohľadu na návratový kód.

## Prevencia

Z tohto vzišli tri pravidlá a ani jedno z nich sa netýka nositeľnej elektroniky.

**Pred interpretáciou čo i len jedného riadku akejkoľvek spojenej časovej rady si empiricky overte, ku ktorému dňu každé pole skutočne patrí.** Dodávatelia to dokumentujú nekonzistentne alebo vôbec, a hodnoverný riadok nie je dôkazom správneho spojenia.

**Úloha, ktorá skončí s kódom 0 pri polovici chýbajúcich dát, je horšia ako úloha, ktorá spadne.** Pád sa vyšetrí hneď v to isté ráno; tichý úspech sa bude považovať za pravdivý dovtedy, kým ho niekto neoveri počtom bajtov. Kritériá úspechu patria k *obsahu* odpovede, nie k neprítomnosti výnimky.

**Keď korelácia vyjde obrátene, podozrievajte najprv spojenie dát, až potom svet.** Fyziológia, trhy aj zákazníci sa len zriedka obrátia naopak. Časové značky to robia neustále.

## Pozri tiež

`the-agent-that-runs-a-body` · `empty-is-not-zero` · `scheduled-tasks-that-fail-loudly` · `the-fallback-that-lied`
