Choosing is not answering. Picking an island with seating leaves four things unsaid that a cabinet maker cannot build without, and picking no island leaves none — so the questions belong to the option and they do not exist until one is chosen.
Island design
Nothing on this screen is a specification yet. An island you have not chosen has no dimensions to give.
They are answers rows at grain intent and dimension, written by 07-one-question-at-a-time.html against the kitchen zone, and they reach this screen through decision_evidence with relation='opened'. The aisle is the one 07 frame B draws by name.
Because a decision that cannot show its own inputs asks the homeowner to remember them. Six feet and under four feet were measured by hand and _ds/FICTION.md pins both, so neither may appear without its noun: the length is named as length before the width is asked for.
What kitchen island configuration will you include?
No island
Locks the kitchen layout. Nothing further to specify.
Basic island, prep only
Locks island size and location, and the electrical for its outlets.
Island with seating
Locks overhang depth and counter height. Four things to specify.
Full-featured, sink or cooktop
Locks plumbing rough-in, the ventilation path and the electrical circuits.
Every one is the option's locks array, which is content rather than copy written here: Overhang depth and Counter height (36" or 42") are the two rows island_with_seating carries. no_island locks the kitchen layout and holds no specification_fields at all, which is why frame 3 has nothing to draw for it.
The library holds impact_assessments for each option — seating scores resale_value +1, warmth_character +1, budget_control -1 — and none of it is drawn as a rank. Same refusal as 18: make the differences impossible to miss and then get out of the way.
Island with seating
Two of these lock at design. Overhang depth and counter height are what your architect draws the stools against, so they are the two Dave will ask for first.
The decision is settled the moment the option is chosen — a resolutions row, which is the only source for settledness. The four unanswered specs do not hold it open, and the ghost action says as much in words. A product that made the island go back to open because nobody had typed an overhang yet would be lying about what was decided.
No 0 of 4, no bar. 07's rule holds wherever these questions are drawn: answering one can add another, so a denominator is a claim the flow cannot make. Four rows, and the reader can see there are four.
Counter height
36", counter height
Level with the run behind it, and your chairs are ordinary chairs.
42", bar height
Hides the prep from the great room, and the stools get taller.
Two tiers
Both, with a step in the slab. A second fabrication charge.
It is counter_height's help_text, verbatim. Three choices, keyed value_36_counter_height, value_42_bar_height and two_tier. 07's finding is the whole reason a spec looks like this: the help text is the product, which is why library_questions.help_text is NOT NULL.
An answers row, field_key='counter_height', grain='sku', source='stated', via='stepper', keyed to this decision. The same table the aisle answer is in. There is no separate specifications table and there should not be one — a spec that lives somewhere else is a spec the room cannot show.
Island dimensions
You measured six feet of counter in daily use on 2 April.
6 ft 0 in
What you measured. Three seats along the long side.
5 ft 6 in
Six inches back to the walkway. Still three seats, tighter.
7 ft 0 in
A foot more counter, and it takes that foot out of the aisle.
You said under four feet to reach across, on 2 April.
3 ft 0 in
Reaches easily. No room for a seated overhang on the far side.
3 ft 10 in
What you measured, and it carries the fifteen-inch overhang.
4 ft 0 in
Past what you said you could reach across.
You asked for a forty-eight inch aisle, room for two. Every inch this island gains comes off that, and the plan is what says whether it still fits.
An earlier draft of this frame was one field reading 6'-0" x 3'-10", which asks somebody to type a measurement they had already given and formats it for the machine while they do it. Two choosers, each already ticked, is the same data with the work taken off the reader. Nothing here is a new component: it is pick_row, the shape 07 uses for every question where each answer costs something different.
Both ticks are carried from the tape measure in April and both card heads say so by name and date. A default with no provenance is the product putting a number in somebody's mouth, and G4 — no figure on a screen without its source — applies to a measurement exactly as it applies to a price. The tick can be moved; nothing is saved until the primary.
The field is authored input_key: "text", so 6'-0" x 3'-10" is a string and nothing parses it. Give it the schema's dimensions renderer and it becomes two numbers and a unit, which is what lets the options be generated around what somebody measured and lets every line on the next frame be a DIFFERENCE from it. What it does not buy is a clearance: the forty-eight inches is an aisle the homeowner ASKED FOR on 07, not a room measurement, and nothing in the binder holds the distance from the island to the run behind it. So this frame states the aisle and says the plan settles it. An earlier draft of this callout said six by three ten leaves forty-eight inches on both sides, which the product cannot know.
Your own size
You asked for a forty-eight inch aisle. This is four inches longer than the island you measured against it, so somebody with the plan has to say it still fits.
There is no minimum, no red border and no disabled primary. The product does not hold the plan, so it cannot know that six foot four is wrong, and a validation error that fires on a guess teaches the reader to stop believing the ones that matter. What it does instead is say the difference out loud and name who can settle it, which is the same refusal 43 frame 2 makes when it declines to call an option a mistake.
Saving here writes the same answers row the chooser writes, and going back to frame 5 finds a fourth row — 6 ft 4 in, yours — ticked, above the three common ones. A custom value that does not appear in the list it escaped from is a value the reader has to remember they set.
Each figure is a field in its select posture, so the units are the screen's problem rather than the reader's: there is no way to type 6'4", 76 in or 6.33 ft and no parser guessing which was meant. That is the second thing the dimensions renderer buys, and the reason the escape is still not a text box.
Fifteen inches is still your answer
Answered 2 April, when you set the depth.
Three depths, none of them fifteen inches.
10 in
Perching depth. Knees stay outside the counter.
12 in
Three inches less than yours, and the stools tuck further under.
18 in
Three inches more than yours, and it needs a bracket under the slab.
Nothing here needs doing. Fifteen inches is what goes on the spec sheet and what Dave was sent. Tick one of these only if you have changed your mind about the overhang.
The obvious draft pre-selects the nearest offer — twelve inches, three away — and asks the reader to confirm. That is the product changing somebody’s answer and calling it a confirmation. D9 says a content edit never invalidates a stored answer, so the stored row stays exactly as it was written and the three offers arrive unticked. There is no primary on this screen because there is nothing to save.
No red, no warning triangle, no “no longer valid”. The list changed; the island did not. 43 frame 2 makes the same refusal when it declines to call an option a mistake, and frame 6 makes it one screen earlier when it declines to refuse a number. A screen that calls a recorded measurement invalid is the product holding an opinion it has no standing to hold.
Because they opened the field, not because anything summoned them. There is no badge on the spec sheet and no digest line: an answer that is still the answer is not an outstanding item, and putting it in a to-do list is how a reader learns to clear things that did not need clearing. Frame 8 draws Overhang — 15" with no mark on it whatsoever, and frames 5 and 6 go on measuring depth against the fifteen inches, because nothing about the island moved.
Because a size is the one field on this page where a stored value NOT in the list is ordinary rather than exceptional: frame 6’s escape writes one deliberately, and its own annotation says the custom row joins the list above the three common ones. Drawing this frame on the length would show a value the deck has already said is offered. The overhang has no escape and no custom row — it is a closed list somebody re-authored, which is the only way a stored answer falls out of one.
The stored answers row matches none of the question’s current choices. Both halves come from the same read: the row’s value and created_at for the top card, the question’s choices for the bottom one. Nothing compares them to produce a verdict — the two are drawn side by side and the reader is the one who decides whether anything has changed.
Island with seating
Dave holds a builder seat and Marcus is a contact on one. There is no architect seat: seats.role is owner, builder or viewer, and responsible_trade_key: "architect" on this decision is a label on library content rather than a person anybody can send to. What the chip should resolve to is a spec link, and today links_subject will not carry one for a decision — type='spec' is keyed to a zone_id, so the smallest thing that can be sent is the whole kitchen.
Nothing here carries a price. The island's money is on its options and its change orders, and a specification that also priced itself would be two documents that can disagree. 17 owns the price and its provenance; this owns what gets built.
Island
A year from now the useful line is not that you chose an island. It is that the overhang is fifteen inches, and that the third stool was dropped in September and you agreed to it.
The facts are answers. The moved line is a substitutions row, which keeps chosen_value and installed_value apart and holds the reason verbatim, with the acknowledgment as its own column because fine by me is a fact about the homeowner rather than about Marcus. The two saved things are memories with zone_id on the kitchen.
Nothing joins the note to the field it fed. memories.decision_id can point a saved thing at this decision, and there is no column pointing one at dimensions. That is a smaller ask than it looks and it is not made here; 44 owns the board and would own the join.
kitchen_island_design's options carry their own specification_fields, and no_island carries none. So the four questions in frame 3 are not a form the app decided to show — they are the consequence of the answer, and choosing differently produces a different set. Drawing them before the choice would ask somebody for an overhang depth on an island they may not build.resolutions is written when the option is chosen. The unanswered specs do not hold the decision open, do not turn it amber, and do not count down. Frame 3's ghost action says so in words, because the alternative is a product that reopens a settled decision to chase a field.07 collects — field_key, grain, source, via, attributed_to. This page adds no table and asks for none. A specification stored apart from the answers is a specification the room cannot draw and the conversation cannot fill in.select, 325 text, 69 boolean, 44 color, 9 number, 4 multi_select and 4 single_select. Two of the 1,188 are required, and applies_to_option_keys is empty on every one of them — the per-option scoping is carried entirely by which option holds the array.library_questions.input admits text, long_text, number_with_unit, boolean, single_select, multi_select, dimensions and color. The corpus is written in select and number. Either the bundle build maps them or the import fails on the check constraint; this page cannot tell which, and it is the first thing to establish before any of these frames are built.dimensions is authored as free text on all four options, and the schema has a dimensions renderer that would give it numbers and a unit. With numbers, frame 5's aisle stops being a sentence the homeowner has to act on and becomes something the product can work out. That is one content change and one renderer, not a feature.24 already argued against for subs — a class of person acquires its own screens — or a decision-scoped spec link, which is a links_subject amendment and nothing else. The second is smaller and matches what the trade actually is here: somebody who reads a sheet and never signs in.keep, which is a specified component with fourteen instances — and .keep and .th are declared in 44's own <style> block rather than in any _ds sheet, so no second page can draw one without copying the rule. The two rows here are rows with a chip, which is honest but is not the component the frame wants. .q, .q-hint and .strip are the same shape of problem on 07, and this page hit that one first: it used all three, they are owned by no sheet, and the frames rendered as unstyled prose. deck:styles did not catch it, because it only flags a class some sheet DOES own that the page failed to link — a class no sheet owns is invisible to it. Raised, not fixed here.44 puts everything else the room collects.cta-outline: a committing action stays visibly a button, and the boundary rather than a second fill is what keeps one primary on the screen.screen_head, field, pickrow, opt, row, fact, chip, callout and cta, all out of the sheet. Setting a specification is not a new kind of screen and the page should not need one to say so.