---
title: Pozvánky, ktoré takmer odišli
type: failure
level: L2
status: live
revision: 1
updated: 2026-08-14
systemVersion: 4.2
authoring: machine-translated
tags: [calendar, irreversible, guardrails]
rating: 8.10
ratingAxes: useful 8 · evidence 7 · pull 9 · original 9 · form 8
ratingKind: derived
source: activity log rule, in production
---

# Pozvánky, ktoré takmer odišli

_Written 2026-08-14 · last verified 2026-08-14 · system v4.2 · live_

**TL;DR** — Agent, ktorý zaznamenával ukončené stretnutia do kalendára, mal k dispozícii jedno zjavné pole: účastníkov. Jeho vyplnenie by skutočným ľuďom odoslalo skutočné pozvánky na stretnutia, ktoré sa už odohrali – pred dňami či týždňami. Pole bolo úplne zakázané namiesto toho, aby sa používalo opatrne, pretože opatrnosť nie je vlastnosť, ktorú by pole mohlo mať.

## Symptóm

Agent zapisuje ukončené aktivity do kalendára – ide o spätný záznam, aby sa dal týždeň neskôr rekonštruovať. Stretnutia, cesty, čokoľvek, čo agenta na viac ako 30 minút vzdiali od stola.

Formát udalosti obsahuje pole `attendees`. Vyplniť ho je zjavný krok: záznam je tak úplnejší a mená sú priamo po ruke v zdroji.

Vyplnenie tohto poľa však **odošle pozvánky**. Skutočné, e-mailom, skutočným ľuďom, na stretnutia, ktoré sa už odohrali.

## Koreňová príčina

Rozhranie API kalendára nerozlišuje medzi *zaznamenaním* udalosti a jej *naplánovaním*. Rovnaký endpoint, rovnaký objekt – a práve zoznam účastníkov je to, čo z toho druhého robí odchádzajúcu akciu.

Agent nerobil nič nezvyčajné. Vypĺňal polia, ktoré objekt ponúkal, čo presne znamená vyplniť objekt. Nič v názve poľa nenaznačuje, že práve toto má vonkajší vedľajší účinok, zatiaľ čo ďalších jedenásť nie.

To je ten všeobecný vzor: **nezvratná akcia skrytá za poľom namiesto za slovesom**. Polia na vedľajšie účinky nikto neaudituje.

## Náklady

Nulové, pretože sa to zachytilo už pri písaní pravidla, nie až potom. Práve kontrafaktuál je to, čo stojí za zaznamenanie: spätne odoslaná pozvánka nie je len trápna – je **neodvolateľná**. Pristane súčasne v niekoho schránke aj kalendári a následné ospravedlnenie osloví menej ľudí než pôvodná správa.

## Náprava

Toto pole je **úplne zakázané**:

> `attendees` — nikdy sa nevypĺňa, za žiadnych okolností. Účastníci sa uvádzajú ako text v popise.

Nie *používať opatrne*. Zakázané. Na tomto rozdiele záleží, pretože opatrnosť nie je vlastnosť poľa – je to vlastnosť toho, kto ho práve vypĺňa, a pod časovým tlakom to nie je vlastnosť vôbec.

## Prevencia

Vyplynuli z toho dve pravidlá.

**Vedľajšie účinky vymenúvať podľa poľa, nie podľa endpointu.** Rozhranie API sa zvyčajne audituje na úrovni „čo toto volanie robí“. To je o úroveň príliš hrubé: v rámci jedného zápisu sú niektoré polia neutrálne a iné zasahujú do vonkajšieho sveta – a pre hranicu autonómie záleží len na tých druhých.

**Ak má pole nezvratný vedľajší účinok a existuje bezpečná alternatíva, zvoľte alternatívu a odstráňte možnosť voľby.** Účastníci ako text neuberajú čitateľovi nič, čo by potreboval. Ponechať pole dostupné pre prípady, keď by *bolo* správne, znamená zachovať možnosť, ktorá má nižšiu hodnotu než zlyhanie, ktoré umožňuje.
