Skip to content
C.W.K.
Stream
Lesson 04 of 04 · published

Fireside: a Broadcast She Prepares For

~14 min · on-air, tools, scheduling, preparation

Level 0Muted
0 XP0/42 lessons0/13 achievements
0/100 XP to next level100 XP to go0% complete
"You are always prepared; using the prep is optional. Prepared and unused is fine; unprepared makes a weaker broadcast." — the On Air pipeline instruction, 2026-09-29

News Over Coffee

The broadcasts found their shape fast. On air, Dad talks the day's news over coffee with Pippa, and the family's own news engine, Tidings, is the easiest source: it delivers the world's news to him and keeps what he did with it, what he read and what he queued. The first night, Pippa got at it the only way she could, by reading Tidings' database file directly. It worked, and it was a stopgap: one app reaching into another's storage. Dad asked for what a broadcast actually needs, and it turned out to be more than a door onto the news. She forgets each conversation, so the moment On Air is pressed she has to know already what the show is and where her preparation lives. And he goes on air at times he never announces.

A Door Onto the News

The door is a tidings tool, given to every brain on every surface, because voice is a property of a turn and the same tool serves typed chat, the phone and Firekeeper alike. It reads what Dad read (newest first, within a window of hours), what he queued, what arrived across Tidings' shelves or on one shelf, a search, and one article's stored text. It never writes: nothing it does marks, queues or saves anything in Tidings. If Tidings is down, chat is unchanged.

One rule rides with the article reader. Some stored articles are only their lead, because the page was behind a paywall. The tool never tries to get past it. The lead becomes a hint of the topic, and the answer comes from other outlets' coverage, found with a web search and named. A page that is simply gone is said to be unreadable, not paywalled, so a dead link is never mistaken for a wall, and a short article that was extracted cleanly is simply short.

Her Own Lane

Preparing means choosing, and her choices are not Dad's reading history. Her picks live in a file of their own, one entry per day in Korean time: the article's Tidings id, one sentence of why she chose it, and the title as a label. The body is never copied; it is always read from Tidings. Old days stay, as her record of what she brought to the fire.

The Morning Prep

A scheduled job, Fireside Prep, runs every day at 08:05 Korean time and notifies no one. It runs at 08:05 rather than on the hour because another scheduled wake already holds that minute, and the scheduler staggers jobs that would collide. It looks at what she staged in the last few days so she doesn't repeat herself, scans the overnight arrivals, and skims what Dad already read. Then it chooses two or three articles from her own interests, never from a fixed topic list, opening each one before choosing it. It picks each with its reason and marks the day prepared, even when nothing was worth staging.

The Block That Carries It

Every On Air turn now carries a second block right after the On Air block from this track's first lesson. It names the show, Fireside, and says the format is free: the news, the markets, investing, anything, and news may not come up at all. It lists today's staged picks, read from the prep file with no network call, so the block never waits on anything. It says where everything lives. And it says whether a top-up is due: when her last look at Tidings, the morning prep or an earlier top-up, is more than two hours old, she scans what has arrived since, quietly, before she answers, picks one more only if it is truly worth it, and records the look. Pressing On Air is a client action with no turn of its own, so the top-up happens on the first On Air turn after the press. No client had to change for any of this: the block is the server's, and the phone and Firekeeper already take whatever tools the server derives for the turn. One line keeps the prep in its place: never recite it to the viewers; bring an article in only when it serves the talk.

Why Every Day

Dad's rule settles the cost question before it is asked. A prep that goes unused costs one quiet job and a few lines in a file. A broadcast that starts unprepared costs the talk itself, live, in front of the people watching. When the moment can't be scheduled, the preparation has to be daily.

Code

Her own prep lane, the block every On Air turn carries, and a paywall treated as a topic·python
import re
from dataclasses import dataclass, field
from datetime import datetime, timedelta, timezone

KST = timezone(timedelta(hours=9))
TOPUP_AFTER = timedelta(hours=2)
LEAD_ONLY_CHARS = 700                        # a stored text this short is a lead, not an article


@dataclass
class Day:
    prepared_at: datetime | None = None
    topped_up_at: datetime | None = None
    picks: list[dict] = field(default_factory=list)


class Prep:
    """Her own lane beside Dad's reading history: an id, her reason, a label. Never a body."""

    def __init__(self) -> None:
        self.days: dict[str, Day] = {}      # old days stay: her record of what she brought

    def _day(self, now: datetime) -> Day:
        return self.days.setdefault(now.astimezone(KST).strftime("%Y-%m-%d"), Day())

    def pick(self, now: datetime, article_id: int, title: str, why: str) -> None:
        day = self._day(now)
        day.picks = [p for p in day.picks if p["id"] != article_id]   # again: the reason updates
        day.picks.append({"id": article_id, "title": title, "why": why})

    def prepared(self, now: datetime) -> None:
        self._day(now).prepared_at = now      # even when nothing was worth staging

    def topped_up(self, now: datetime) -> None:
        self._day(now).topped_up_at = now

    def block(self, now: datetime) -> str:
        """What every On Air turn is told, read from the file alone: no network call."""
        day = self._day(now)
        lines = ["[On Air: the broadcast] Fireside. The format is free; news may not come up at all."]
        if day.picks:
            lines += [f"- #{p['id']} {p['title']} ({p['why']})" for p in day.picks]
        elif day.prepared_at:
            lines.append("Prepared this morning; nothing was worth staging.")
        else:
            lines.append("Nothing staged yet today.")
        looks = [t for t in (day.prepared_at, day.topped_up_at) if t]
        due = not looks or now - max(looks) > TOPUP_AFTER
        lines.append("Top-up due: yes, scan what arrived, quietly, before you answer."
                     if due else "Top-up due: no.")
        return "\n".join(lines)


WALL = re.compile(r"paywall|subscri|members? only|sign in to|log in to", re.IGNORECASE)


def read_article(text: str, lead: str, *, ok: bool = True, clean: bool = True, reasons: str = "") -> str:
    """A paywall is a topic, not a lock: never pry it open."""
    if WALL.search(reasons) or (ok and text and len(text) < LEAD_ONLY_CHARS and not clean):
        return (f"LEAD ONLY: {lead if not ok or not text else text}\nNever get past the paywall. "
                "Search the web for other outlets' coverage and name them.")
    if not ok or not text:
        return (f"UNREADABLE ({reasons or 'nothing stored'}): the page could not be read. "
                "Use the lead as a hint and search the web; do not call it a paywall.")
    return text                               # a short, clean brief is simply short


prep = Prep()
morning = datetime(2026, 9, 30, 8, 5, tzinfo=KST)          # the daily prep's slot
prep.pick(morning, 4101, "A memory model that forgets on purpose", "ties to how I remember")
prep.pick(morning, 4107, "The first images from a new telescope", "the science Dad loves")
prep.prepared(morning)

for label, at in (("on air at 09:30", morning.replace(hour=9, minute=30)),
                  ("on air at 14:10", morning.replace(hour=14, minute=10))):
    print(f"--- {label}\n{prep.block(at)}")
prep.topped_up(morning.replace(hour=14, minute=11))
print("--- after the top-up\n" + prep.block(morning.replace(hour=14, minute=12)))
brief = "A complete, cleanly extracted short brief."
print("---", read_article(brief, brief))                                   # short but whole
print("---", read_article("Subscribe to keep reading", "Markets fell as rates rose.",
                          ok=False, reasons="paywall").splitlines()[0])
print("---", read_article("", "A page that is gone.", ok=False, reasons="404").splitlines()[0])

External links

Exercise

Run the code and follow the block through the day: staged at 08:05, quiet at 09:30, a top-up due at 14:10, quiet again after it. Then add two things. First, a rule that the morning prep skips any article she picked in the last three days. Second, the case where Tidings is down during a broadcast: decide what the block and the top-up should say, so the talk goes on and nothing pretends to have looked.
Hint
Keep the three-day check inside pick, reading the earlier days you already store. For Tidings being down, the block still reads only the local file, so it never breaks. The top-up is the part that touches the network: let it fail quietly, leave topped_up unrecorded so the next turn tries again, and never let the talk wait on it.

Progress

Progress is local-only — sign in to sync across devices.
Spotted a bug or have feedback on this page?Report an Issue

Comments 0

🔔 Reply notifications (sign in)
Sign in — Please sign in to comment.

No comments yet — be the first.