The ruling
일단 다른 앱에 의존하지 말고 자체적으로 구현하는 쪽으로 가.
"For now, don't depend on other apps. Go with building it on its own." Ruling 2 spells out what that rules out for version 1: no Waystone or Vesta crumbs, no photos borrowed from the Photos library by reference, nothing from Spark or Forge. Sizzle captures and keeps its own photos and its own records. Links to siblings come after v1, each as a pointer its owner resolves.
The same paragraph draws the line that keeps the ruling sensible. cwkPippa and the vendored cwkSiblingKit plumbing are the family foundation, and the doc refuses to count them as app dependencies. I'm the one who reads the plate, so Sizzle can't stand without me. The kit is code copied into the repository and drift-checked, so it isn't a runtime service at all. sibling-kit-quest explains why the family vendors its shared code instead of packaging it.
What the engine is allowed to dial
You can check a ruling like this against the code. Every family address the engine dials is set in backend/settings.py from the family registry, and only two members appear there. cwkPippa is reached on loopback for readings and conversations. Firelink's facade, also on loopback, is where the brain slots live. Neither one hands Sizzle a plate, a photo or a dish. There is no Forge origin, no Spark origin and no Waystone origin, and the vendored kit modules take their addresses from these settings instead of carrying their own.
Designs that wait
Ruling 2 didn't stop siblings from proposing links. It decided what happens to the proposals. Two are written into the design in detail, and neither is built.
- The Spark handoff (coop request #264). Spark, the family's interpreter app, proposed a contract on the day Sizzle was designed. It rests on the family item reference from cwkSiblingKit,
{app, kind, id, parent}: the owner answers for its item, and the app that links to it never copies it. Spark named two directions. From a translated menu line in Spark, open the dish's principle in Sizzle. From Sizzle, an "order this" action hands Spark a sentence that becomes an interpretation card. - Forge links. In the starting material, a meal Dad actually ate would become a cwkForge intake crumb by reference, and Forge state would flow back as constraints. Rulings 2 and 3 narrowed that to nothing for v1.
Sizzle's answer to Spark is a careful middle. It takes the contract in principle, writes counter-notes, and builds nothing until ruling 2 is revisited with Dad. The counter-notes are good design work on their own:
- Two owned kinds. A
class(principle, dish or variant) and aplate(an encounter). The one-item reads already exist, so taking the contract means adding a display label to them and no new route. - A menu line lands as a question. A plate needs a photo, so a line from Spark would open a Sizzle thread with its text and a pointer back to the Spark moment, kept as a reference and never copied. That needs Sizzle deep links, a web route and a
cwksizzle://scheme, and neither exists. - "Order this" is accepted as proposed, with Dad confirming before Pippa writes the card.
Checking that held means held
"Not built" is a claim about code, so check it. Searching the repository for the deep-link scheme, the kit's item-reference module and Spark's link parameters finds only the architecture doc. The iOS project declares no URL scheme. Of the twelve kit_* modules the engine vendors, none is kit_item_ref. Go looking for these features in the app and you won't find them, and no lesson in this quest teaches them as features.
Why wait
Every link is one more way to fail. While Sizzle stands alone, a missing Spark or a sleeping Forge can't break a capture or a reading. The doc's system table says what happens when the one real dependency is away: if cwkPippa is unavailable, capture and browsing keep working, and readings and replies wait and show as pending. The code keeps the first half and is blunter about the second. A reading that can't reach me records reading.failed, and the plate shows the failure with a Read again button. A reply that can't reach me records turn.failed, and the thread offers Ask again. Nothing waits on its own, and nothing is lost either: the plate, its photos and the question stay where they were. That is a short list of what can go wrong, and Dad chose to keep it short until the core worked.
The held contract earns its place while it waits. When the ruling is revisited, the conversation starts from a contract that already exists on Spark's side and counter-notes that already exist on Sizzle's.