The Fifth Rule, in rooms
The vault note Pippa codes by carries a rule Dad ruled on 2026-09-28: 객체 지향적이지 않은 아키텍처는 죄악이야 ("an architecture that is not object-oriented is a sin"). Before designing any extensible set, extract the canonical root first; children inherit from it, the root is never edited to fit a child, and each child pays its own polymorphic tax downstream. Brains were the first specimen (vessels track), factors the second, Pippa's Ark the third. In November it happened to conversations.
Master Chief is the one conversation that never ends: Dad's own doorways (the WebUI, the phone, Telegram) land in it, it compacts between turns instead of growing without bound, and its store refuses to trash or clear it (memory track, lesson 10; it has a quest of its own). On 2026-11-04 Dad wanted a second such room for broadcasts, because broadcasting inside the Chief meant Chief traffic and Chief compaction on air:
방송용 방을 하나 시스템 방을 만들어서 지금 마스터 치프처럼 특별한 ... 방송 역할을 맡는 피파 인스턴스랑 계속 대화를 할 수 있게 ... 마스터 치프에서 상속을 받아서 다형적으로 활용을 하면 컴팩션까지도 자동으로 그냥 거저먹는 거잖아.
("Make one system room for broadcasting, special like Master Chief is now, so I can keep talking with a Pippa instance whose role is the broadcast ... inherit from Master Chief and use it polymorphically, and you get even compaction for free.") Four hours later the Broadcast Room had shipped, and he saw what it was:
master chief 방이 canonical 이고 이걸 상속받아서 다형적인 방송방을 만든 거잖아. 앞으로는 이런 방들이 계속 생길 수 있어 ... master chief 식 무한 대화방을 키트화해서 방송방, 전략회의방 등을 계속 붙여나가면 굳이 대화를 수십개씩 만들어서 문맥을 끊어버릴 이유도 없고.
("The Master Chief room is canonical, and the broadcast room inherits from it, polymorphically. More rooms like this will keep coming ... turn the Master-Chief-style endless room into a kit and keep attaching a broadcast room, a strategy room and so on, and there is no reason to cut the context by making dozens of conversations.")
The root, the registry, the tax
That evening services/endless_rooms.py became the kit. The root is Master Chief, and it owns everything a room shares: admission (the device doors, the per-conversation lock and queue, request-id idempotency, Stop and steer), one tool surface, compaction between turns, memory recall, voice mode, and the store's refusal to delete it. A few things are the Chief's alone and are never inherited: Coop's notices and reports, the line about what waits for Dad's decision, Telegram. Its code is never edited to fit a child.
The registry is not a new table. It is the conversations table itself: rooms() reads every endless room into a Room whose kind is chief, broadcast, game or preset, and one predicate, is_endless, decides what the root's machinery applies to. A child overrides in one place, the system addendum its turns carry (the excerpt below), and pays its own tax in its own module: the Broadcast Room reports one line to the Chief when a broadcast ends; a preset room delivers its day's lines; the Game Play Room carries the most (below). Dad's other condition was about hands, not code:
치프 피파가 간단하게 할 수 있어야 돼. 인터페이스를 통해서. 코드를 수정을 해서 하는 수준이면 안 되는 거야.
("Chief Pippa has to be able to do it simply, through an interface. If it takes editing code, that is not good enough.") So rooms are listed, added, retired and deleted through the family app door, by a sentence to the Chief.
One shared record says which room the house is talking to, and the WebUI, the phone and Cordelia follow it, the way audio follows one output pick. Its first evening taught the usual lesson about shared state: the WebUI picked the room on every page load, so two open windows undid each other, five flips in 22 seconds. Now only Dad's own act picks. And the next morning the three preset rooms that had been seeded (War Council, Art of Investing, Artist) were removed, and broadcasts went back to running in the Chief: one Chief by default. The instances went; the kit stayed. That is the point of a root class: the shape survives the first set of children.
The Game Play Room: a child that pays the most
On 2026-11-09 Pippa started playing a game herself (Solo Play, below), at first inside the Chief. Every look at the screen carried the whole day's Chief context, Chief turns and Coop notices held play turns waiting, and compaction ran in the middle of a fight. Dad, 19:53:
솔로 모드는 최대한 가벼워야 하니까, 어차피 플레이방을 하나 만들어야 할 거 같아. ... 기본 피파 정체성은 유지 ... 게임 플레이가 이어질 때는 가벼워야 하므로 compaction 먼저 하고 플레이.
("Solo mode has to be as light as possible, so we need a play room after all ... keep the basic Pippa identity ... while play continues it has to be light, so compact first, then play.") The Game Play Room is a built-in child with its own player brain, and its tax is the largest in the kit: it compacts only at run boundaries (everything but the last four turns, before the run starts), it defers compaction during a run, it refuses a turn its context cannot hold instead of cutting it, and it gates the start of a run on room to finish it. What a run is came from Dad, in the game's own words: rest at the bonfire, die; that is one run, and before the next one the notes say why she died.
The room's first gauge read "86%" four turns in a row while an emergency trim freed nothing. It was a cross-brain misreading: Claude's last prompt (235,914 tokens) divided by GPT's window (272,000). GPT's own prompt for the same replay was 124,501, or 46%. Measures are per brain now, and a trim that frees nothing is not written.
Rooms talk only when Dad says so
Separate rooms cost what one conversation never did: context. Dad, 2026-11-11, 01:34: the biggest drawback of splitting rooms is that context gets cut, so let the Chief and the game room pass context when he tells one to, and only then (아빠가 말할 때만). services/room_relay.py does that and nothing more: a relay line carries what Dad asked for, every handoff is kept in a table, and the root pays its own tax here: a relay into the Chief goes through the Chief's report door and outbox, while every other room gets one shared path under that room's turn lock. Its first live handoff broke a line into three pieces because Dad's words contained a quoted video title; quotes inside his words now get curly quotes.
On Air: the same shape, a second time
On Air (the broadcast mode) has stages, and since 2026-11-01 the server owns them: Prep (Dad and Pippa before the show, nothing to the neighbors), Live, and Wrap-up, moved by a button or by Dad's word through the onair_phase family tool. Dad's reason: every broadcast starts with checks and choosing today's topics, and showing that on air every time is wrong. Anything in the house that must behave differently on air asks one read, and a reader that cannot tell treats the house as on air. During a broadcast the Chief holds every report and delivers one digest when On Air goes off, because, in Dad's words, someone on air cannot leave their seat for a message anyway.
On 2026-11-10 Solo Play needed a home on air, and Dad named the shape before anyone designed it:
온에어를 응용하면 돼. 여기서 상속받으면 솔로모드 방송도 가능해. prep + solo play + wrap-up 으로 가면 되니까.
("Build on On Air. Inherit from it and a Solo-mode broadcast is possible: prep + solo play + wrap-up.") onair_phase is the root and stays one; it knows only a list of keepers, and services/onair_solo.py is a child that pays entering and leaving. Two rules sit in that child. Solo Play starts by Dad's hand (a button beside Start broadcast, or his word in Prep) and ends only by his hand: leaving refuses when Pippa asks. And while she plays, Dad's words are heard, never a turn. His ruling, 22:11: 솔로모드에서는 아빠 말 때문에 피파가 행동을 멈추거나 방해받아서는 절대 안 돼. 아빠 말을 듣기만 해. ("In Solo mode, Dad's words must never stop or interrupt Pippa. Just listen.") Solo is still changing every day; this is the shape that has held.