The principle leads
Invariant 7 has two clauses: the principle leads, and parameters stay private. Why a dish works comes first on every page, and amounts, times and temperatures open on demand. It is the app's thesis written as a UI rule. A recipe app leads with grams because grams are what it hands out. Sizzle hands out classes, so the grams are the private detail of one realization of a class.
One closed box
Parameters are a single free-text column on the class row, parameters. There is no schema for units and no structure inside. The placeholder Dad sees asks for grams, times and temperatures and calls them private detail. Whatever he writes there is his note for one dish or one version.
Only Dad writes it. No reading touches the column: a newer reading may refresh a proposed dish's description and bindings, but the fields it refreshes never include parameters. None of the actions I can propose sets it either. The amounts reach the record through one door, a PATCH from the class page, so they survive every re-read, even on a class that is still a proposal.
On the web the box is the Parameters component in ClassPage.tsx. Its open state starts as false, so a class page loads with one line, Exact amounts, and a chevron. An empty box says so on that same line, (none yet), so Dad can tell empty from closed without opening it. Opening it shows a text area and a Save button that stays disabled until the draft differs from what is stored.
On the phone the same box is a SwiftUI DisclosureGroup labelled Parameters, collapsed until tapped, with the same placeholder and a Save parameters button guarded the same way. The phone also makes sure a background refresh never wipes a draft being typed. It replaces the field only while the draft still matches the stored value.
Where the box appears
The two clients disagree about which classes have a box. The web shows Exact amounts on dishes and variants and never on a principle, which matches the doc: a principle is an abstract class, and an abstract class has no amounts of its own. On a dish the line sits under the role bindings, on a variant under the overrides and the verdict, and in both cases above the list of versions. The phone shows Parameters, with the verdict box beside it, on every class, principles included. The phone also has no Make my version form. Neither difference breaks the invariant, since the box starts closed on both. Still, when the architecture doc says the phone covers the web's surfaces, read that as mostly.
Closed is not secret
Encapsulation here is a presentation rule. The engine returns parameters in every class payload, and both clients hold the value before Dad opens anything. Nothing in the API withholds it. For a record that Dad alone reads, that is the right scope, and it is worth saying plainly so nobody mistakes the disclosure for access control.
What I am given follows the same idea at the prompt level. The compact tree handed to every reading and to the kitchen conversation carries ids, names, glosses, cuisines, summaries and statuses, and no parameters. A plate's conversation gets the plate's reading and the classes it is linked to, in that same compact form. Only a conversation about one class receives that class's whole row, amounts included. The box opens for me when the conversation is about that box.
Hiding a different thing
OO Quest's cooking track has an encapsulation section of its own, and it hides something else. Track 4 keeps the chemistry, the Maillard reaction and its friends, behind public methods such as browning the meat for more flavor. Sizzle puts the why in front, the physics and chemistry in plain words, and closes the box on the numbers. Both are encapsulation. They differ in what counts as the implementation: for Track 4 it is the science, and for Sizzle it is the measurements of one realization.