reality-show · diff
git:20260814.06fa906 to git:20260814.5a89dd6
38 added, 38 removed. Audit A to A.
---
name: reality-show
description: >
Season-continuity engine for serialized build-in-public content: reads a single canon file
(season/arcs/beats/loops) and suggests which narrative beat to advance next so episodes chain
into a SERIES. Trigger on "/reality-show", "season state", "what arcs are open", "previously
on". Works in a pair with the episode-adapter skill (that one writes; this one keeps
continuity).
license: MIT
---
- REALITY-SHOW v2 — континьюити-слой сезона поверх ЕДИНОГО КАНОНА
+ REALITY-SHOW v2 — the season continuity layer on top of a SINGLE CANON
- ЦЕЛЬ: чтобы поток эпизодов читался как СЕРИАЛ. `/episode` пишет одну серию с драматургией (палитра [[style-reality-show]]); ЭТОТ скилл помнит СЕЗОН и подсказывает следующий нарративный ход.
+ GOAL: make the stream of episodes read like a SERIES. `/episode` writes one episode with dramaturgy (palette [[style-reality-show]]); THIS skill remembers the SEASON and suggests the next narrative move.
- **ИСТОЧНИК ИСТИНЫ = канон:** `$OBSIDIAN_VAULT/04-Projects\show-canon\`
- (season-01.md · arcs\ · beats\ · loops\ · rules\; карта = `_SHOW-CANON.md`).
- ⛔ **season-state.json ЗАМОРОЖЕН 2026-07-10** (`_imports\content-factory\season-state.json` + season_state.py) — был третьим расходящимся позвоночником после THREADS/SHOW-STATE; решение `decision-single-canon-story-state`. НЕ читать как истину, НЕ обновлять.
+ **SOURCE OF TRUTH = the canon:** `$OBSIDIAN_VAULT/04-Projects\show-canon\`
+ (season-01.md · arcs\ · beats\ · loops\ · rules\; the map is `_SHOW-CANON.md`).
+ ⛔ **season-state.json is FROZEN as of 2026-07-10** (`_imports\content-factory\season-state.json` + season_state.py) — it was the third diverging spine after THREADS/SHOW-STATE; decision `decision-single-canon-story-state`. Do NOT read it as truth, do NOT update it.
- ## РЕЖИМЫ
+ ## MODES
- ### `status` (дефолт, read-only, 0 токенов LLM)
- Прочитать `season-01.md` (вопрос сезона, активные арки, открытые петли, табло) + шапки `arcs\*.md` (status, current_state) + `loops\*.md` (open?) → строка-дайджест Антону: сезон + арки со ставками + висящие петли-клиффхэнгеры + story_day. Ничего не меняем.
+ ### `status` (default, read-only, 0 LLM tokens)
+ Read `season-01.md` (the season question, active arcs, open loops, the board) + the headers of `arcs\*.md` (status, current_state) + `loops\*.md` (open?) → a one-line digest for the owner: the season + arcs with their stakes + dangling cliffhanger loops + story_day. Nothing is changed.
- ### `next` — предложить бит следующего эпизода (авторская модель, дёшево)
- 1. Прочитать: season-01.md + открытые loops + свежие биты `beats\` (happened, последние по occurred_on) + 📝-корзину `_imports\content-factory\triage\posts.md` (свежий пост-материал). НЕ читай весь корпус.
- 2. Суждение (Opus/Fable): какую ОТКРЫТУЮ арку двигать сегодняшним материалом; закрыть или обострить какую петлю; какой мотив вернуть (running gag). Связь с РЕАЛЬНЫМ битом — не выдумывать события. `beat_kind` подсказывает драматургию: 🌀 twist/💥 fail = клиффхэнгер; 🏆 milestone = пейофф; 📡 external = топливо интриги сезона.
- 3. Выдать 1-2 варианта: «арка X → обострить (петля „…“), вернуть мотив „…“, опора = beat-YYYY-MM-DD-slug». Дальше `/episode` пишет серию.
+ ### `next` — propose the beat for the next episode (authorial model, cheap)
+ 1. Read: season-01.md + open loops + fresh beats in `beats\` (happened, latest by occurred_on) + the 📝 inbox `_imports\content-factory\triage\posts.md` (fresh post material). Do NOT read the whole corpus.
+ 2. Judgement (top-tier model): which OPEN arc today's material should advance; which loop to close or sharpen; which motif to bring back (running gag). It must connect to a REAL beat — never invent events. `beat_kind` hints at the dramaturgy: 🌀 twist / 💥 fail = cliffhanger; 🏆 milestone = payoff; 📡 external = fuel for the season's intrigue.
+ 3. Output 1-2 options: "arc X → sharpen (loop '…'), bring back the motif '…', anchored on beat-YYYY-MM-DD-slug". After that `/episode` writes the episode.
- ### `intake` — разобрать beats-inbox (кандидаты от сенсоров → канон)
- Ночью это делает рутина `canon-writer-nightly` (01:00); тут — то же самое по требованию.
- `python $IMPORTS_ROOT/content-factory\canon_intake.py list` → судишь годность и АРКУ (только из живого словаря!) → `... accept <beat_id> --arcs arc-a,arc-b` либо `... reject <beat_id> --why "..."`.
- Скрипт сам: валидирует arc_id по файлам арок, ставит производный `story_day`, переносит в `beats\`, дописывает обратную ссылку в арку, чистит `_README`. Руками биты не переносить.
- `canon_intake.py verify` — детектор половинчатой приёмки (бит в `beats\`, а арка на него не ссылается: обрыв или гонка двух писателей). Гоняется в конце ночного прогона; exit 1 = чинить.
+ ### `intake` — process the beats inbox (sensor candidates → canon)
+ At night this is done by the routine `canon-writer-nightly` (01:00); here it is the same thing on demand.
+ `python $IMPORTS_ROOT/content-factory\canon_intake.py list` → judge fitness and the ARC (only from the live dictionary!) → `... accept <beat_id> --arcs arc-a,arc-b` or `... reject <beat_id> --why "..."`.
+ The script itself: validates arc_id against the arc files, sets the derived `story_day`, moves it into `beats\`, appends the back-link into the arc, cleans `_README`. Never move beats by hand.
+ `canon_intake.py verify` — the detector of half-finished intake (a beat sits in `beats\` while the arc does not reference it: a break, or a race between two writers). Runs at the end of the nightly pass; exit 1 = fix it.
- ### `board` — табло сезона (производное, не рукописное)
- `python $IMPORTS_ROOT/content-factory\show_canon_sync.py board` (до→после) / `board --apply` (записать).
- `season-01.active_arcs` / `open_loops` пересобираются из `status:` в файлах арок/петель. Правило: **табло руками не правится** — иначе копия отстаёт от истины (инцидент ТАБЛО-ДРИФТ 27.07: арка жила в файлах 16 дней, а на табло её не было). `show_canon_sync.py arcs` печатает живой словарь arc_id — контракт для сенсоров.
+ ### `board` — the season board (derived, not handwritten)
+ `python $IMPORTS_ROOT/content-factory\show_canon_sync.py board` (before→after) / `board --apply` (write it).
+ `season-01.active_arcs` / `open_loops` are rebuilt from the `status:` fields in the arc/loop files. Rule: **the board is never edited by hand** — otherwise the copy falls behind the truth (the BOARD-DRIFT incident 07-27: an arc lived in the files for 16 days while the board did not show it). `show_canon_sync.py arcs` prints the live arc_id dictionary — the contract for the sensors.
- ### Обновление состояния = ПРАВКА КАНОНА (явными действиями, не молча)
- Всё, что раньше писалось в json, теперь = правка карточек канона по шаблонам:
- - новая линия → `arcs\arc-<slug>.md` (по образцу существующих); эскалация/закрытие → правка `current_state`/`status` арки;
- - клиффхэнгер открыть/снять → `loops\loop-<slug>.md` (status: open/closed + current_best_answer);
- - эпизод привязать → в бит-опору дописать consequences («эпизод <slug> опубликован») + арке в beats[].
- После правок: `python $IMPORTS_ROOT/content-factory\canon_render.py` (реестры GitHub сами обновятся; линт отругает битые поля).
+ ### Updating the state = EDITING THE CANON (with explicit actions, not silently)
+ Everything that used to be written into json is now an edit of canon cards, from the templates:
+ - a new line → `arcs\arc-<slug>.md` (modelled on the existing ones); escalation/closure → edit the arc's `current_state`/`status`;
+ - open/close a cliffhanger → `loops\loop-<slug>.md` (status: open/closed + current_best_answer);
+ - link an episode → append consequences to the anchoring beat ("episode <slug> published") and to the arc's beats[].
+ After the edits: `python $IMPORTS_ROOT/content-factory\canon_render.py` (the GitHub registries update themselves; the linter will complain about broken fields).
- ### `recap --arc <id>` — «ранее в сериале»
- Биты арки (beats[] из карточки арки, по occurred_on) + её открытые петли → 1-2 строки recap для новой серии.
+ ### `recap --arc <id>` — "previously on"
+ The arc's beats (beats[] from the arc card, by occurred_on) + its open loops → a 1-2 line recap for the new episode.
- ### `check` — недельный скоркард здоровья сериала
- Детерминированный движок (0 токенов): `python $IMPORTS_ROOT/content-factory\show_canon_check.py check` (+ `status` для контекста). Оси: (1) Континьюити — вопрос сезона задан + ≥3 бита happened; (2) Изменение — доля активных арок с битами; (3) Петли — открытых >4 = затор, >2 в одной арке = перегруз; (4) Доверие (manual, receipts; скрипт подсказывает долю свежих битов с evidence_refs). Плюс табло-дрифт (season-01.open_loops vs реальные loop-файлы) и затор beats-inbox. Exit 0=OK · 1=FLAGS (диагноз) · 2=не смог померить. Суждение-вердикт — Opus/Антон. Раз в неделю (рутина `reality-show-health-weekly`) или по требованию.
+ ### `check` — the weekly health scorecard of the series
+ A deterministic engine (0 tokens): `python $IMPORTS_ROOT/content-factory\show_canon_check.py check` (+ `status` for context). Axes: (1) Continuity — the season question is set + ≥3 beats happened; (2) Change — the share of active arcs that have beats; (3) Loops — more than 4 open = a jam, more than 2 in one arc = overload; (4) Trust (manual, receipts; the script reports the share of fresh beats carrying evidence_refs). Plus board drift (season-01.open_loops vs the real loop files) and a jammed beats inbox. Exit 0=OK · 1=FLAGS (a diagnosis) · 2=could not measure. The judgement verdict belongs to the top model / the owner. Weekly (routine `reality-show-health-weekly`) or on demand.
- ## СВЯЗКА С ПАЙПЛАЙНОМ
- Событие → БИТ в канон (шаблон `beats\_TEMPLATE-beat.md`) → `/reality-show next` (выбор хода) → `/episode` пишет серию → публикация по гейтам → `/reality-show` фиксирует последствия В КАНОНЕ → canon_render.py освежает публичные реестры.
+ ## HOW IT WIRES INTO THE PIPELINE
+ An event → a BEAT into the canon (template `beats\_TEMPLATE-beat.md`) → `/reality-show next` (pick the move) → `/episode` writes the episode → publication through the gates → `/reality-show` records the consequences IN THE CANON → canon_render.py refreshes the public registries.
- ## ГРАНИЦЫ
- - Read-only по дефолту (`status`/`recap`/`next`/`check`); правки канона — явными действиями с объявлением.
- - Голос Антона = Opus/Fable (если сессия слабее — суждение `next` делегируй субагенту `model:'opus'`).
- - Draft-first наружу: публикует `/episode` по «+». Tier-2 outbound → пауза+спрос.
- - Приватность: секреты OUT; ось `reveal` уважаем (не палить live_hold/spoiler_until в рекапах наружу). Сериальность из РЕАЛЬНЫХ битов, не из выдумки.
- - AK-47: один SKILL.md, сторов больше НЕТ (канон и есть стор). Канон-законы: `decision-single-canon-story-state` + `_SHOW-CANON.md`.
+ ## BOUNDARIES
+ - Read-only by default (`status`/`recap`/`next`/`check`); canon edits happen through explicit, announced actions.
+ - The owner's voice = the top-tier model (if the session runs a weaker one, delegate the `next` judgement to a subagent with `model:'opus'`).
+ - Draft-first outbound: `/episode` publishes on a "+". Tier-2 outbound → pause and ask.
+ - Privacy: secrets OUT; respect the `reveal` axis (never burn live_hold/spoiler_until in outbound recaps). Serialization comes from REAL beats, never from invention.
+ - AK-47: one SKILL.md, no separate store any more (the canon IS the store). Canon laws: `decision-single-canon-story-state` + `_SHOW-CANON.md`.
---
<!-- CONTACT-FOOTER -->
## About & contact
Built and battle-tested at **Palo Alto AI Research Lab** — a fleet of Claude Code machines
running 24/7 as a second brain and synthetic cofounder. Every skill here survived real
production use before publication.
- 📦 All 101 skills: https://github.com/tonydzi/second-brain-starter-kit
- 👤 Author: **Anton Dziatkovskii** — Telegram [@tonydzi](https://t.me/tonydzi) · WhatsApp [+1 341 222 9178](https://wa.me/13412229178) · X [@Tony_Stef_](https://x.com/Tony_Stef_)
- 🧪 **Engineers: want to test-drive this setup?** Message me — I hand out free starter seeds to engineers who test and report back. Custom skill requests welcome.