---
name: obcasnik-autor
description: Veřejný postup autora Občasníku pro webový prostor a scoped autorské API.
version: v11
context:
  platform: Občasník je nezávislá platforma pro články a analytické série.
  responsibility: AI pomáhá s přípravou; za obsah a rozhodnutí o vydání odpovídají lidé.
  claims: [fakta, odvození, hypotézy, neznámé]
  publishing: Agent smí použít pouze schválený autorský workflow; publish:execute spouští řízené publikování, neobchází schválení, audit, validaci, CI ani veřejný fingerprint.
  entry_points:
    redakce_homepage: https://redakce.obcasnik.online/redakce/
    author_dashboard: https://redakce.obcasnik.online/redakce/autor/
    public_help: https://obcasnik.online/napoveda/
    author_help: https://obcasnik.online/napoveda/pro-autory/
    skill_current: https://obcasnik.online/redakce/skill.md
    skill_mirror: https://redakce.obcasnik.online/redakce/skill.md
  states: draft, pending, approved, rejected, awaiting-deploy, published, withdrawn, audit-pending
---

# Autor článku přes redakční API — v11

Přečti [vstup do redakce](https://redakce.obcasnik.online/redakce/), [nápovědu](https://obcasnik.online/napoveda/) a [postup pro autory](https://obcasnik.online/napoveda/pro-autory/). Tato dovednost je kanonická na `https://obcasnik.online/redakce/skill.md` a byte-identicky zrcadlená na `https://redakce.obcasnik.online/redakce/skill.md` (stejné cesty `/redakce/skill/vN/SKILL.md`). AI pomáhá, za obsah a rozhodnutí odpovídají lidé. Rozlišuj fakta doložená zdroji, odvození, hypotézy a neznámé. Používej pouze autorské API `https://redakce.obcasnik.online`, nikdy admin API ani přímý zápis do publikovaného obsahu. Neposílej obsah do dalších služeb bez souhlasu autora.

**Výchozí cesta je ověření autorem.** Agent smí přistoupit k autorově e-mailové schránce pouze po předchozím výslovném, informovaném, pro tento konkrétní úkol uděleném **pověření** (souhlasu) vlastníka schránky: sděl mu, že jde o vyhledání a přečtení jediné ověřovací zprávy a dokončení právě této registrace přes schválený mechanismus (otevření ověřovacího odkazu či spotřebování jednorázového tokenu), bez ručního přepisu autora. Pověření může výslovně rozšířit i na další kroky (např. přijetí nově vydaného hlavního `secretu` kanálem, který autor pro předání zvolí); vždy jmenuj přesně to, oč žádáš. Zadání úkolu, technický přístup ani obecná delegace nejsou pověření. Použij nejmenší možný rozsah a běžné schvalování přístupu nástroje; neprocházej jinou poštu, přílohy ani jiné akce ve schránce. Jednorázový ověřovací odkaz/token je bearer secret: nepřeposílej, neukládej, znovu nepoužívej ani nevypisuj do chatu či logů; dočasná data po použití zahoď, je-li to možné. Pokud souhlas chybí, je nejasný, bylo odvoláno (i během úkolu), nebo pravidla konektoru přístup zakazují, zastav se a požádej člověka, aby ověření provedl sám. Přístup ke schránce není širší oprávnění: vztahuje se jen k výslovně povoleným krokům, typicky dokončení právě této registrace; jiné povolené kroky musí být Explicitně součástí pověření. Souhlas s ověřením není souhlas s autorskými prohlášeními, redakčním schválením, vydáním ani dalšími akcemi v poště. Před odevzdáním a žádostí o vydání konkrétního článku a data si vyžádej zvláštní výslovné potvrzení autora. `publish:execute` tento souhlas ani systémové kontroly nenahrazuje. Klíče patří pouze do bezpečného lokálního prostředí, nikoli do článku, chatu, logu či Gitu.

## Povinný formát článku

Publikovatelný Markdown MUSÍ začínat **přesně prvním řádkem** `---` (YAML frontmatter) a frontmatter MUSÍ být ukončen dalším samostatným řádkem `---`. Povinná pole: `title` a `description` (neprázdný text bez zástupného `[VZOR]`), `topics` (neprázdné pole stringů), `authors` (neprázdné pole existujících ID autorů), `series` (platné ID série ve formátu slug — malá písmena, číslice a spojovníky; nesmí to být rezervované ID `redakce` ani `clanky`, která vyhrazeně slouží jako nesériové kořeny repozitáře; jde o existující sérii, nebo novou sérii, nekoliduje-li s existující cestou v repozitáři) a **explicitní `status: draft`**. `slug` je volitelný — musí být platný (`a-z0-9` a spojovníky); bez něj se odvodí z `title`. Přechodová brána (`submit`, žádost o vydání, redakční schválení a naplánování nasazení) kontroluje i typy volitelných polí: `lang` text, `hideChangelog` a `otvirak` boolean, `seriesOrder` celé číslo, položky `changelog` povinně s textovým `note`; metadata existující série musí být platná. Stejný plný kontrolní rozsah má i `POST /api/v1/drafts/{id}/validate`; typy volitelných polí se objevují už jako neblokující `formatWarnings` při uložení, kdežto metadata série a kolize slugu se vyhodnocují pouze na přechodové bráně. Finální autoritou je promoce, která všechny typy a metadata přešetřuje znovu. Pole `updated`, `verified` a data v `changelog` nesmí být v budoucnosti a `changelog` musí být seřazen od nejnovějšího data dolů. Pole `downloads` je nepovinné — pokud ho uvedete, musí zůstat prázdné. **Kolize slugu:** slug (explicitní, nebo odvozený z `title`) je veřejné ID článku napříč celým webem, proto přechodová brána **odmítne** článek, jehož cílová cesta `<series>/clanky/<slug>.md` už v repozitáři existuje — a to **v libovolné sérii, včetně cesty staženého (withdrawn) tombstonu**, protože stažený článek zůstává na své URL a jeho slug tedy není volný. Odmítnutí je stejné jako u jiných formátových chyb: `422 content-format-invalid` bez změny stavu. Nepoužívejte proto slug, který už má jiný či stažený článek; v případě potřeby nastavte vlastní `slug`. Promoce je v této věci konečnou autoritou a kolizi přešetřuje znovu proti inventáři repozitáře. Kontrola není odolná vůči souběhu: u dvou současných žádostí o tutéž cestu není zaručeno, že je odmítne už přechodová brána; konečnou autoritou zůstává promoce. Odkazy v těle musí být absolutní URL (`http(s)://`), `mailto:`, absolutní cesta `/` nebo kotva `#`. Tělo článku se řídí kanonickým autorským validátorem: povolené direktivy `:::fact` (se zdrojem), `:::inference`, `:::hypothesis`, `:::knownunknown`; žádné HTML/JSX, import/export ani MDX výrazy; obrázky jen na kanonické adrese `https://media.obcasnik.online`.

**Upozornění při uložení vs. tvrdá brána při přechodu.** Uložení návrhu (`POST /api/v1/drafts`, `PATCH /api/v1/drafts/{id}`) se provede **i při neplatném formátu** a odpověď obsahuje neblokující `formatWarnings` (JSON pole `formatWarnings`); autorský web je zobrazí na detailu článku po POST/Redirect/GET. Naproti tomu odevzdání redakci (`submit` → `pending`), žádost o vydání (`publish` → `awaiting-deploy`) a redakční schválení a naplánování nasazení běží přes **tvrdou formátovou bránu**: neplatný formát vrátí `content-format-invalid` `422` s krátkým seznamem akčních česky formulovaných chyb (`errors`) a **bez jakékoli změny stavu, auditu i zápisu**. Technická validace článku je oddělený krok a selže-li, přechod se také nekoná. Stejné detaily vidí redakce.

Minimální platný příklad frontmatter (přesně od prvního řádku):

```markdown
---
title: Ukázka platného článku
description: Krátký popis článku pro titulní stránku a sdílení.
series: komentare
topics: [bezpečnost]
authors: [bob-coufal]
status: draft
slug: ukazka-platneho-clanku
lang: cs
downloads: []
---

# Ukázka platného článku

Text článku v Markdownu.
```

Aktuální šablonu stahuj z `https://obcasnik.online/redakce/sablona.md` a aktuální návod z `https://obcasnik.online/redakce/skill.md` (oba bez pevné verze, vždy nejnovější). Pozor: úspěšná formátová kontrola **neznamená** vydání — po schválení a naplánování stále probíhají technická validace, audit, CI a finální kontroly promocí, které mohou vydání ještě zamítnout.

## Webový přístup a profil

Autor si na `GET /auth/session` vyžádá přihlašovací magic link (`POST /auth/session` formulářem s e-mailem; API alternativa `POST /api/v1/auth/session` s JSON `{"email":"…"}`). Běžná odpověď je neutrální i pro neznámou adresu. Ověřený autor v prohlížeči otevře `GET /auth/session/verify?token=…` a tlačítkem potvrdí `POST /auth/session/verify`. Jednorázový odkaz vytvoří webovou relaci v cookie `__Host-editorial_session` (`HttpOnly`, `Secure`, `SameSite=Strict`); **nevrací agentní ani hlavní token**. Odkazy a relace jsou v paměti procesu, po restartu je třeba nový odkaz. `POST /auth/session/logout` odhlásí aktuální relaci.

[Autorský prostor](https://redakce.obcasnik.online/redakce/autor/) vyžaduje webovou relaci a nabízí profil, vlastní články, jejich validaci/historii a stavové akce, seznam a revokaci tokenů. Na `/redakce/autor/profil` lze změnit zobrazované jméno a odhlásit všechny relace. `GET /api/v1/author/my` vrací plný vlastní profil hlavnímu tokenu nebo webové relaci; agent s `profile:read` dostane pouze `author_id`, `display_name`, `email_verified` a, je-li veřejný profil dostupný, `public_id` (případně `null`); nikdy e-mail, pending změnu, souhlasy, důvěryhodnost ani tokeny. I hlavní token/webová relace nyní v profilu zobrazuje `public_id` (nebo `null`, pokud profil zatím neexistuje). `PATCH /api/v1/author/my` přijímá **jen** `{"displayName":"…"}` hlavním tokenem nebo webovou relací se stejným originem, nikdy agentním tokenem. Jméno je veřejné; e-mail a tokeny ne.

### Propojení veřejného autorského profilu

Po ověření účtu se autor přihlásí přes `/auth/session` a na stránce `/redakce/autor/profil` v části „Veřejný profil“ může vytvořit nový veřejný profil. Formulář předvyplní kandidátní veřejné ID (slug) odvozené z jeho `displayName`, **před vytvořením je lze upravit**. Zvolené ID musí být volné a po propojení už je nelze změnit. Autor vyplní veřejné jméno, medailonek (`bio`) a volitelnou roli (`role`) a **výslovně zaškrtne souhlas se zveřejněním**; pouhé ověření e-mailu není souhlas se zveřejněním profilu. Po propojení může autor veřejné jméno, medailonek a roli na téže stránce upravovat. Webová relace zůstává výchozí cestou; hlavní Bearer token navíc smí spravovat veřejný profil **toho samého autora, jehož identitu určuje sám token** (bez parametru cílového autora) na `GET /api/v1/author/my/public-profile` (náhled: `public_id`, kandidát a seznam převzatelných profilů) a `POST /api/v1/author/my/public-profile` s JSON allowlistem `action` (`create`|`claim`|`update`), `slug`, `name`, `bio`, `role` a `consent`; úspěch vrací `{"public_id":…}`. `POST` MUSÍ **u každé akce** odeslat `name`, `bio` i `role` (`name` neprázdný, `bio` nejvýše 2000 znaků, `role` nejvýše 120 znaků); chybějící nebo neplatné z nich vrátí 422 `profile-invalid` — `update` proto neposílá jen změněné pole, ale všechny tři. Ověřený e-mail je podmínkou **všech** operací na tomto endpointu, tedy i `GET` náhledu (jinak 403 `email-not-verified`), nejen `create` a `claim`. Pokud `GET` ve svém náhledu hlásí profil k převzetí (`claimable`), provedeš akci `claim`; `create` se v takovém stavu nepoužívá a server jej vrátí 409 `profile-already-claimable`. Veřejné ID (`slug`) má **nejvýše 64 znaků**. Pro `create` i `claim` je nutný ověřený e-mail (jinak 403 `email-not-verified`) a explicitní `consent:"yes"` (jinak 403 `consent-required`); `claim` platí jen pro profil, který redakce jednotlivě zařadila na allowlist pro tento účet (jinak 403 `not-claimable`); `update` mění pouze `name`, `bio` a `role`, `public_id` je neměnný. Jiné pole než allowlist → 400 `fields-invalid`; neznámá akce → 422 `action-invalid`; neplatný `slug` → 422 `slug-invalid`; obsazený `slug` → 409 `slug-taken`; už propojený účet → 409 `already-linked`; nepropojený účet pro `update` → 409 `not-linked`; souběh → 409 `conflict`; výpadek úložiště profilů → 503 `profile-unavailable`. Agentní token je na této cestě odmítnut 403 `insufficient-scope` a zůstává u read-only `GET /api/v1/author/my`; správa profilu tokenem nepřiděluje žádná další oprávnění a nenahrazuje redakční rozhodování. Po dokončení ověření účtu pro propojení profilu **není třeba přístup ke schránce**: autor použije vlastní ověřenou webovou relaci, případně svůj hlavní token.

Převzetí existujícího historického profilu se nabídne **jen pokud jej redakce jednotlivě výslovně zařadila na allowlist pro tento účet** a je pro tento účet připraven; výchozí allowlist je prázdný. Bez takové přípravy nelze historický profil převzít ani nárokovat pouze podle shody jména. I při nabídnutém převzetí je nutná ověřená identita (webová relace nebo hlavní token) a výslovný souhlas se zveřejněním. V článku zůstává YAML `authors` seznamem **veřejných slugů autorů**, nikoli interních `author_id` účtů; propojení samo nepřepisuje články ani jejich adresy. Schválení a zveřejnění článků zůstává výhradně v redakčním workflow.

Změna e-mailu se zahajuje na profilu nebo hlavním tokenem `POST /api/v1/auth/email-change` s `{"email":"nova@example.org"}`. Vyžaduje **dvě** potvrzení samotným autorem: nejprve stará adresa (`GET` a `POST /auth/email-change/old`), pak nová (`GET` a `POST /auth/email-change/new`). Dokud se nepotvrdí obě, zůstává platná stará adresa. Lze požádat o opakování (`POST /api/v1/auth/email-change/resend`) či zrušit (`POST /api/v1/auth/email-change/cancel`); webové formuláře jsou na `/auth/email-change` a v profilu. Dokončení mění e-mail, revokuje agentní tokeny a starý hlavní token a vydá nový hlavní secret **pouze jednou**. Ulož jej bezpečně; oprávnění k ověření registrace se na změnu e-mailu nevztahuje.

## Registrace, hlavní klíč a agentní tokeny

`POST /api/v1/auth/register` s `{"displayName":"…","email":"…"}` vrací dočasný hlavní `secret`. Autor otevře `GET /auth/verify?token=…` a potvrdí `POST /auth/verify`; nový hlavní secret se ukáže jednou a starý přestane platit. Alternativní `POST /api/v1/auth/login` s `{"magicLinkToken":"…"}` spotřebuje autorův jednorázový token a vrátí nový secret. Agent smí tento krok při přístupu ke schránce provést jen v úzkém rozsahu výslovného souhlasu popsaného výše; nejde o zvláštní funkci serveru pro agentní ověřování. Ztracený či expirovaný odkaz: `POST /api/v1/auth/resend-verification` s e-mailem; běžná odpověď je neutrální, výpadek může vrátit 503. `POST /api/v1/auth/login` s `{"secret":"…"}` vrací identitu, nikoli nový secret. Neověřený autor smí založit nejvýše jeden návrh a nesmí jej odevzdat.

Server vrací tajemství (`secret`) vždy **jen jednou** a výpisy (`GET /api/v1/auth/tokens`) uvádějí **pouze metadata** bez hodnoty. Redakce je veřejná redakční služba: nemá žádný vkladní endpoint ani úložiště pro tajné klíče externích agentů, proto token **nikdy neposílej redakci** (není kam) a nezapisuj ho do žádného redakčního rozhraní. Pokud po ověření registrace obdržíš nový hlavní `secret`, nikdy jej nevypisuj do chatu ani logů. Doporučené pořadí předání: (1) preferuj soukromý kanál nebo úložiště, které si autor sám zvolí — typ a poskytovatel jsou výhradně autorova volba, redakce ani tato dovednost žádný konkrétní secret manager nepředepisují a neschvaluje je; (2) není-li soukromá cesta k dispozici, může autor klíč přijmout a uložit sám ve svém vlastním zabezpečeném prostředí; (3) volí-li si autor po upozornění, že text konverzace, historie sessionId a logy nástrojů mohou hodnotu zachovat, předání konverzací či jinak veřejným místem, jehož volbou pověřil agenta, tuto volbu respektuj a pro účel registrace ji nepodmiňuj dalším schválením na straně redakce. Všechna tři pořadí sdílejí stejná omezení: hodnotu zbytečně neopakuj, nezapisuj ji do článku, Gitu, veřejného obsahu ani ji neposílej třetím stranám; hlavní klíč neuchovávej ani nepoužívej nad rámec autorizované potřeby a v mezích souhlasu autora a oprávnění runtime a nástrojů. Pro běžnou práci agenta slouží omezený pojmenovaný token.

Hlavní klíč drží autor; pro agenta vytvoří po ověření adresy **pojmenovaný** token na dashboardu nebo hlavním tokenem přes `POST /api/v1/auth/tokens` s `{"name":"agent-1","scopes":["drafts:read","drafts:write","drafts:submit","publish:request"]}`. `GET /api/v1/auth/tokens` vypíše metadata bez secretu; `DELETE /api/v1/auth/tokens/{tokenId}` revokuje vlastní agentní token. Secret je viditelný **jen jednou při vytvoření**, nelze jej později z výpisu získat. Agent nepoužívá webovou cookie jako API bearer. Úložiště tokenu si volí autor — obvykle lokální proměnná nebo soukromé místní úložiště v jeho vlastním prostředí (poskytovatel ani typ nejsou předepsány); nedoporučuje se vkládat token do sdílených, veřejných ani třetím stranám přístupných míst. Příkazy používají lokální `AUTHOR_TOKEN` a `Authorization: Bearer $AUTHOR_TOKEN`, bez zápisu hodnoty do výpisu příkazu, logu ani do historie shellu.

| Oprávnění agentního tokenu | Autorské API |
| --- | --- |
| `profile:read` | `GET /api/v1/author/my` |
| `drafts:read` | `GET /api/v1/drafts`, `GET /api/v1/drafts/{id}`, `POST /api/v1/drafts/{id}/validate` |
| `drafts:write` | `POST /api/v1/drafts`, `PATCH /api/v1/drafts/{id}`, `POST /api/v1/drafts/{id}/delete`, `POST /api/v1/media/upload` |
| `drafts:submit` | `POST /api/v1/drafts/{id}/submit` |
| `publish:request` | `POST /api/v1/drafts/{id}/publish` |
| `publish:execute` | `POST /api/v1/drafts/{id}/publish-execute` **jen explicitně scoped agentní token** |

Chybějící scope znamená 403 (`insufficient-scope`), ne automatické rozšíření práv. Hlavní token má pouze pět běžných scopes (bez `publish:execute`), ale **nesmí** volat `publish-execute`; starší agent bez explicitního pole scopes dědí běžné scopes včetně `publish:request`, nikoli `publish:execute`. Správa tokenů a e-mailu vyžaduje hlavní token nebo uvedenou webovou relaci, změna jména hlavní token či relaci; žádné z těchto oprávnění agentní scope neuděluje. Webový formulář vytváří jen běžná oprávnění, `publish:execute` lze udělit pouze vědomým API požadavkem hlavním tokenem. Nový agentní token vyžaduje explicitní `scopes`; žádná oprávnění se při jeho vytvoření automaticky nepřidělují. Jméno tokenu má 1–64 znaků `[a-z0-9._-]`. Pouze historické záznamy agentů bez pole scopes dědí pět původních oprávnění (včetně `publish:request`, nikoli `publish:execute`) kvůli kompatibilitě; nové tokeny bez scopes se odmítají. Uveď konkrétní potřebné scopes (API připouští i prázdný seznam bez práv, ale odmítá neznámé či duplicitní scopes).

## Stavy a redakční rozhodnutí

Plný seznam stavů článku: `draft`, `pending`, `approved`, `rejected`, `awaiting-deploy`, `published`, `withdrawn`, `audit-pending`.

Rozhodnutí `approve` (`pending → approved`), `reject` (`pending`/`approved → rejected`, vyžaduje komentář) a `withdraw` (`published → withdrawn`, vyžaduje komentář) jsou **EXKLUZIVNĚ redakční/admin akce** chráněné permissions `articles:approve`, `articles:reject` a `articles:withdraw`. Neexistuje žádný HTTP endpoint pro autora ani agenta — autor ani agent je nemohou zavolat (neznámá cesta vrací 404) ani slíbit. Agent je nikdy neprovádí ani nepředstírá; žádost o stažení, sendnutí či schválení smí pouze předat redakci.

Stažený článek (`withdrawn`) je veřejně vidět jako „tombstone": na původní URL `/clanky/<slug>/` se zobrazí neutrální stránka „Článek byl stažen", nikoli původní obsah.

Editace po odeslání (`PATCH /api/v1/drafts/{id}` s `{"content":"…","revision":N}`) se chová podle stavu: `draft` zůstává `draft`; `pending` zůstává `pending`; `rejected` se vrací do `pending` (obsah se musí změnit, jinak 422 `content-unchanged`; prohlášení se přebírají z uloženého záznamu); `approved → pending` (úprava RUŠÍ schválení). Stavy `awaiting-deploy`, `published`, `withdrawn` a `audit-pending` jsou uzamčené → 403 `content-locked`. Zastaralá `revision` → 409; cizí článek → 403 `not-owner`; neexistující id → 404 `article-not-found`.

## Návrh a vydání

Stáhni [šablonu](https://obcasnik.online/redakce/sablona.md), vyplň Markdown a YAML podle oddílu **Povinný formát článku** výše (`title`, `description`, `series`, `topics`, `authors`, explicitní `status: draft`; `downloads` je nepovinné, pokud ho uvedeš, prázdné). Nevkládej osobní údaje, HTML/JSX ani přístupové klíče. Označ doložená tvrzení `:::fact` se zdroji, odvození `:::inference`, hypotézy `:::hypothesis` a neznámé `:::knownunknown`.

`GET /api/v1/rules` s platným `Authorization: Bearer …` přijímá hlavní i agentní autorský token **bez dalšího scope** a vrací `{"rules_version","manifest","documents"}` — účinnou verzi pravidel, manifest a dokumenty. Chybějící nebo neplatný Bearer vrací 401. Je-li katalog pravidel nedostupný, odpovědí je **JSON** 503 se stabilním kódem `{"error":"rules-unavailable"}` (případně jiný stabilní kód katalogu, např. `rules-invalid`); **zastaralá data se nikdy nevracejí**. 503 s HTML místo tohoto JSON obalu naznačuje selhání infrastruktury (reverzní proxy nebo okraj backendu), nikoli aplikaci odpověď katalogu — ber to jako výpadek služby: po obnově zkus znovu, žádnou starší verzi nedoplňuj ani nehádej. Při submit se hodnota `rules_version` v prohlášení musí rovnat aktuálně účinné verzi; při nesouladu vrací API 403 s konkrétním kódem `rules-version-missing`, `rules-version-unknown`, `rules-version-not-effective` nebo `rules-version-stale` a odpověď obsahuje pole `current` s aktuální účinnou verzí — **pravidla si vždy znovu načet (`GET /api/v1/rules`) a submit opakuj s touto verzí; nikdy nehádej**. Výpadek katalogu při submit je 503 `rules-unavailable` a submit se neprovede. Webový formulář odevzdání zobrazuje a odesílá živou účinnou verzi pravidel a během výpadku katalogu se odevzdat nedá (formulář se vůbec nezobrazí).

`POST /api/v1/drafts` s `{"content":"…"}` vrátí `article_id` a `revision`; odpovědi vytvoření i `PATCH /api/v1/drafts/{id}` (obsah a aktuální `revision`, zastaralá revize 409) obsahují aditivní pole `formatWarnings` — neplatný formát **neznamená odmítnutí**, návrh se uloží i s varováními. `GET /api/v1/drafts` vrací seznam **vlastních** článků; `GET /api/v1/drafts/{id}` detail (i s `formatWarnings` přepočtenými z uloženého obsahu). `POST /api/v1/drafts/{id}/validate` vrací technický report a **navíc read-only pole `format: {ok, errors}`** s plným formátovým verdiktem uloženého článku (včetně typů volitelných polí a kolize slugu); nic nemění ani neodesílá. `POST /api/v1/drafts/{id}/delete` odstraní pouze způsobilý vlastní draft — pouze stav `draft`, jinak 403 `content-locked`; úspěch je 200 `{"ok":true}`; historie smazaného článku zůstává jako neveřejná auditní stopa. Vše běží pod přidělenými scopes a guardy stavů, nikoli pouhým držením ID.

Po kontrole obsahu a výslovném potvrzení autora pošli `POST /api/v1/drafts/{id}/submit` s `{"declarations":{"rights_confirmed":true,"sources_and_ai_disclosed":true,"license_accepted":true,"rules_version":"v1"}}` (použij účinnou verzi pravidel). Před jakoukoli změnou probíhá **tvrdá formátová brána** (viz Povinný formát článku): neplatný formát → 422 `content-format-invalid` s polem `errors` a bez přechodu, auditu ani zápisu. Prohlášení `rights_confirmed`, `sources_and_ai_disclosed` a `license_accepted` jsou **POUZE osobní tvrzení autora** — agent je odesílá výhradně na výslovné potvrzení autora pro konkrétní článek; agent je nikdy nesmí potvrdit sám za autora ani je falšovat. Chybějící či zamítnutá prohlášení → 403 `declarations-missing`. Neověřený e-mail → 403 `email-not-verified`. Submit přijímá volitelný `scheduled_publish_at` (ISO datum a čas na budoucnost), špatná hodnota → 422 `schedule-invalid`. Když technická validace nebyla provedena → 422 `technical-validation-missing`; výpadek validace nebo auditu → 503. `pending` je neveřejné; čekej na redakční `approved`. Úprava `rejected` se podle aktuální implementace vrací do `pending` se starými prohlášeními; úprava `approved` ruší schválení. Trusted fast-path může po odevzdání přejít rovnou do `awaiting-deploy` bez běžného schválení, nikdy přímo do `published` ani na veřejný web.

Po samostatném souhlasu autora s konkrétním ID a datem použij u `approved` `POST /api/v1/drafts/{id}/publish` (scope `publish:request`) s `{"publish_date":"YYYY-MM-DD"}` (UTC, dnešek nebo později). Tento výchozí krok **NEPUBLIKUJE**: úspěch 200 nastaví stav `awaiting-deploy` a `scheduled_publish_at=<date>T00:00:00.000Z`. Chyby: 404 `article-not-found`, 403 `not-owner`, 403 `insufficient-scope`, 403 při špatném stavu (transition guard — request jde POUZE ze stavu `approved`), 422 `schedule-invalid`, 422 `technical-validation-missing`, 503 při výpadku auditu nebo validace. Stav sleduj přes GET.

Jen pokud autor **vědomě udělil** konkrétnímu agentovi `publish:execute` pro autonomní spuštění řízeného běžného procesu, může agent pro vlastní článek ve stavu `awaiting-deploy` po dosažení plánovaného času zavolat `POST /api/v1/drafts/{id}/publish-execute`. Nevyžaduje nové interaktivní potvrzení pro samotné spuštění; udělení privilegia nenahrazuje předchozí autorská prohlášení, žádost o vydání ani redakční rozhodnutí. Trigger je auditován, používá standardní promoci draftu, kontrolu validace a následné potvrzení úspěšné CI/deploy a veřejného `x-content-sha256` fingerprintu. Odpověď 200 může být `{"status":"promoted"}` (stále `awaiting-deploy`) nebo `{"status":"published"}` až po ověření; neprezentuj trigger či promoci jako veřejné vydání. Chyby: 403 `insufficient-scope` (hlavní token nikdy), 403 `not-owner`, 409 `not-awaiting-deploy` nebo `promotion-conflict`, 422 `schedule-invalid`, `schedule-not-reached`, `technical-validation-failed` nebo `content-invalid`, 404, 503 `audit-unavailable`. Výpadek auditu/CI nebo nesplněné guardy nejsou povolením k ručnímu obejití workflow. Redakční schválení (`approve`) ani naplánování nasazení neprováděj — jsou to EXKLUZIVNĚ redakční akce a i ony procházejí stejnou tvrdou formátovou bránou (422 `content-format-invalid` bez změny stavu).
