The kitchen cabinet package, being chosen. Not a form with a color field on it — the room, with everything already settled in it, and the candidate painted onto it while you consider it. The question a homeowner is actually asking is never do I like this green. It is do I like this green in the room I have already half-decided, and that question has one honest answer and it is a picture.
Changing it after you sign starts the six to ten weeks again.
Reed Millwork builds these to order, and the clock starts on your signature rather than on the order.
The counter cannot be templated until the cabinets are set, and the slab yard runs two weeks behind the template.
Three ways to go. Put each one on the room before you pick one.
Nothing is chosen. Pick one and the room wears it — or send her the whole question first.
This arrangement is drawn at 1160pt and it is not squeezed below that. The relationship it draws — the picture in its own column, the options beside it — holds from 840 up, which is the app's own rail breakpoint. Below 840 it becomes frame 4's arrangement, and frame 6 draws the 600pt width where the change happens. Widen the window past 1216 to see frames 1, 2 and 3.
The two settled swatches. A color is a row in zone_memories with memory_type='color' — but only title and memory_type are columns. The hex, the free-text brand and the soft paint_id are JSON keys inside the opaque metadata text blob, unindexed and unvalidated server-side. What is properly typed is the other end: paint_colors is a real catalog with a real lrv column, which is where SW 6204 and an LRV come from. The money is not the code's — $18,000, $21,400 and CO-3 are all _ds/FICTION.md's.
The wire between a color and the part of the room it covers. kitchen.svg names eleven regions. The app's surface vocabulary names seven — wall | trim | accent | ceiling | floor | cabinet | other — it exists only inside the AI extractor's JSON schema at ai/extract_palette.go:81, it lands in an unvalidated metadata text blob, and it has no counter, no backsplash, no island, no appliance and no fixture. Five of the eleven regions this drawing needs cannot be addressed at all, and cabinet cannot tell an upper from a base. The picture itself is less missing than it looks: zone_memories already takes a url with memory_type='image', and zone_library.image_url gives every zone a default illustration. What nothing does is associate a drawing's named regions with anything, so there is no surface for a color to land on.
The counter is on the pending hatch, not on honed quartz. Mid-build it is one of the two things still open in this kitchen, and there are slabs to go and see — drawing a material on it would be the picture claiming a decision nobody has made, which is the one thing this page cannot afford to do.
Changing it after you sign starts the six to ten weeks again.
Reed Millwork builds these to order, and the clock starts on your signature rather than on the order.
The counter cannot be templated until the cabinets are set, and the slab yard runs two weeks behind the template.
Three ways to go. Put each one on the room before you pick one.
Your floor is this exact oak — Hallmark's warm oak, natural. Two of them is a choice rather than an accident, and it is worth seeing before you take the cheaper one.
Marcus Reed gets the go-ahead and the six to ten weeks begin.
Frame 2 is drawn at 1160pt. Widen the window past 1216 to see the stained oak on the room.
Both hexes. #B4915F is the floor's settled color and it is also the candidate's, and they are the same string in the same table. What the app cannot do is notice that, because nothing knows either of them is a floor or a cabinet.
A candidate that is applied but not settled. Every color the schema holds is a fact about the house. Trying one on is a fourth state — not proposed, not settled, on the screen for a minute — and it has to be able to paint the drawing without writing anything down. That is a render-time overlay on the room's region map, not a row.
There is no warning on this frame and there must not be. The card states a fact, that the floor is this same oak, and shows the two swatches touching. The picture supplies the verdict. A red banner would be the app having the opinion, and the opinion is not the app's to have — two woods at one value is a real look that some people want on purpose. The settle button says Settle the stained oak and it works.
Changing it after you sign starts the six to ten weeks again.
Reed Millwork builds these to order, and the clock starts on your signature rather than on the order.
The counter cannot be templated until the cabinets are set, and the slab yard runs two weeks behind the template.
Three ways to go. Put each one on the room before you pick one.
LRV 12 means it hands back twelve per cent of the light that lands on it. This kitchen has one window, over the sink. On a gray afternoon the room will be darker than the drawing.
Marcus Reed gets the go-ahead, the six to ten weeks begin, and CO-3 — the $3,400 cabinet upgrade — moves from a draft to your signature.
Frame 3 is drawn at 1160pt. Widen the window past 1216 to see Pewter Green on the room.
The change order's shape, and the LRV. The live table is project_change_orders — there is no change_orders table, migration 0071 dropped it — and it does carry impact_amount_cents, a co_number and a state defaulting to draft, so a $3,400 draft is a row this schema can already hold. CO-3 itself, the $21,400 and the $18,000 are _ds/FICTION.md's and not rows anybody has written. The LRV is the real one: paint_colors.lrv is a typed column with a catalog behind it.
Two things, and they are separable. A color spec-field type: the seven are text, long_text, number_with_unit, boolean, single_select, multi_select and dimensions (spec_field_registry.dart:21-29), so a settled decision cannot produce a hex — about 65 color-shaped field keys store free text nothing parses. A decision-to-region map, one to many: the cabinet package paints cabinet-upper, cabinet-lower and island. One decision, three regions, and nothing today maps a decision to a drawable surface at all, let alone to a set of them.
No clock anywhere on this frame. The What closes this card says what closes it — a signature that starts six to ten weeks, and a counter that cannot be templated until the cabinets are set. That is a condition, not a countdown, and it is the same sentence tomorrow. Worth naming what a change order cannot do here: change_type really does accept schedule_change, but the only impact columns are impact_amount and impact_amount_cents, both money. This pushes you a week is the sentence a change order cannot store.
Please not the same color as the walls. I want the kitchen to be the thing you see.
She hasn't said anything about this one. That isn't a yes.
She hasn't said anything about this one. That isn't a yes.
Changing it after you sign starts the six to ten weeks again.
Reed Millwork builds these to order, and the clock starts on your signature rather than on the order. The counter can't be templated until they are set.
The bar at the bottom. HcNavMenu is built, tested, themed and imported by nothing, so drawing it is not a proposal for a navigation, it is a drawing of the one already written.
Stance per option, and silence per option, both attributed to a person. Stance today is a property of a decision; one send returning three answers needs it on decision_options, and it needs a stored difference between said no and said nothing, which is a state and not an absent row. The seat for Nora is less missing than it looks: project_members(user_id, project_id, role) is a real table, account_members and account_invitations sit beside it, and HouseholdRole is a five-value enum in household_role.dart. What nothing does is write a second project_members row, so the seat is structurally empty rather than absent. A contacts table really is missing — the only contacts-shaped table in the schema is contact_submissions, a marketing form. Attribution must not encode the route in: a profile exists for her either way, and the note has to read and store identically whether she opened a link from a text message or opened the app.
The picture is a sibling of the scroller, not the first thing in it. That is the whole narrow arrangement: above 840 the picture holds a column and the options scroll beside it; below 840 it pins and they scroll under it. It is not the wide layout stacked, and the frame runs past the bottom of the phone rather than shrinking to end at 844.
The record's spine. The decision, its options and its specification fields are real tables, and decision_options is richer than it looks: cons, rationale, coach_take, locks and stays_flexible are all columns on it. The chips under the picture are the room as it stands after this one lands — three settled, and a counter still on the hatch.
The reason this household passed an option over. Everything decision_options carries is authored from the library — what the option is like in general, written before anybody bought a lot. There is no column for what happened in this house on 17 May, which is what both of these rows are: one is what you saw when you put it on the room, and one is Nora's, so keeping it is frame 4's requirement read a year later. The silence has to survive too — she said nothing about this one is a different fact from she was fine with it, and only one of them is true.
Nothing on this screen counts anything. No bar, no ratio, no 5 of 12. A settled decision is a fact and the two beside it are the alternatives it was chosen over, and the honest way to draw that is a swatch, a name and a sentence.
Migration 0073 and everything after it: decision_verifications, an append-only event log, a state derived from the evidence attached, and a PUT .../resolutions/{r}/verification gated on manage_decisions. The row is one line because the calm states are one line.
One control and one destination. The chevron is the only affordance, and it goes to the same place for every reader — a homeowner and the builder who attached the proof land on the same screen, and capability decides what that screen offers, never where the link goes. The repo already states this rule for draws: a release stays a readable record after acknowledgment, and only the acknowledgment is gated.
A received requirement — an engineer’s letter on file — sits in this same register and reads On file since 6 August, added by Dana Ruiz. It names the person who filed it on purpose. Holding the letter genuinely satisfies the requirement, but on file alone sits in the same calm tone as Passed and invites a reader to take a filed document for a signed-off inspection. The letter’s own author is not structured data; the person on the job who filed it is what we actually know.
0073 nor postgres_verification.go contains a statement that updates decisions or resolutions.The framing inspection failed on 6 August.
Signed by R. Alvarez. This decision is still settled. What was built against it has to be put right.
A callout is a statement, not a control. It says what happened; the card beneath it is the way into the record. The count rides the row only when there is more than one event, because 1 is noise. The calm register carries no count at all.
Failed and partial lift to amber and nothing else does. Attention is only trustworthy if it is rare, so a pending requirement and a passed one are the same one quiet line. Passed in part gets the same treatment as failed and a shorter sentence: the reader still has to do something about it.
No action on this surface in any state. Writing needs manage_decisions, which a homeowner does not hold, and a disabled control here would advertise a power they do not have.
The row is the link, and the reader goes to the record. Both are reasonable and together they open an empty screen. Neither rule is wrong; the pair was never tested against the state where there is nothing to show.
A requirement has no age. 0073 carries no due date, no deadline and no expiry, so a decision unchecked for six weeks is indistinguishable in the data from one settled yesterday. The design keys loudness to outcome, and the state that most deserves a homeowner’s question is often the one with no outcome at all. Ruled 2026-08-28 (Q130): the pending row says whether an eligible inspection is booked, which is a fact already stored, rather than asserting a deadline nobody has written. Not yet drawn: nothing can set an inspection’s evidence_kind, so the booked half could never appear and the unbooked half could never clear. That is Q131, ruled 2026-08-29 and sequenced behind Q79.
Three ways to go. Put each one on the room before you pick one.
LRV 12 means it hands back twelve per cent of the light that lands on it. This kitchen has one window, over the sink.
The breakpoint. context.usesRail is 840 in the app today and it is the same switch this arrangement turns on: it is the width at which the shell can afford a second column, which is exactly the width at which this screen can.
Nothing this frame does not already need. It is frames 1 to 3 at a width where the picture cannot hold a column, and the only thing that moves is the picture.
The swatch strip under the picture on frames 1 to 3 is the settled finishes; the try row here is the candidates. They are two different lists and they are never merged, because one is what the room already is and the other is what it might become.
Please not the same color as the walls. I want the kitchen to be the thing you see.
She hasn't said anything about this one. That isn't a yes.
She hasn't said anything about this one. That isn't a yes.
Changing it after you sign starts the six to ten weeks again.
Reed Millwork builds these to order, and the clock starts on your signature rather than on the order. The counter can't be templated until they are set.
HouseChalk is not a decision tracker. A tracker answers have I done it yet, and nobody is frightened of that. What a homeowner is frightened of is finding out too late that they should have chosen differently, when the thing is already glued, screwed and painted. That fear is visual, and so the answer has to be. The room illustration is therefore not an ornament at the top of a decision screen. It is the surface the decision is made on, and the decision screen is what sits beside it.
Everything else on these six frames follows from that. The already-settled finishes are on the screen in every state, because the question is never whether you like a green — it is whether you like it against Sea Salt walls and a warm oak floor you chose four months ago and cannot now unchoose. The candidate that saves money is shown being wrong rather than described as wrong. The window is a condition rather than a countdown. And Nora's answer is on the option it is about, not in a message you find afterward.
Nine things, and they are separable. None of them is a limitation to be worked around on this page; each is a specific piece of work with a specific reason.
spec_field_registry.dart:21-29). About 65 color-shaped field keys store free text like "Sherwin-Williams Pewter Green" in specification_fields.value and nothing parses it into a hex or matches it against paint_colors, which is sitting right there with a working nearest-match endpoint. Without this, settling a decision cannot put a color anywhere the room can see it, and frames 3 and 5 are impossible.wall | trim | accent | ceiling | floor | cabinet | other, declared once at ai/extract_palette.go:81 in the AI extractor's JSON schema and nowhere else. The drawing needs eleven: wall, ceiling, trim, cabinet-upper, cabinet-lower, island, counter, backsplash, floor, appliance and fixture. Five of them — counter, backsplash, island, appliance and fixture — have no value to be assigned to, and cabinet does not distinguish an upper from a base.zone_memories.metadata text, unvalidated and unindexed, and only the AI extraction path ever writes one — the manual color form builds its own metadata JSON with a hex, a brand and a paint_id in it and no surface at all (add_memory_sheet.dart:475-491). A drawing fed by today's data recolors from a machine's guess and never from what the homeowner said.zone_memories already takes a url alongside memory_type='image', so a photograph attaches to a zone today, and zone_library.image_url gives every zone a default illustration. What nothing does is associate a drawing's named regions with anything, so a color has no surface to land on and a picture can only ever be decoration. kitchen.svg is a file in a mockup folder, and the region contract at the top of it is the proposal.decision_options, and they need said nothing to be a stored state rather than a missing row, because on the screen an empty slot reads as agreement. The seat for the second person is nearer than it looks: project_members(user_id, project_id, role) is a real table, account_members and account_invitations sit beside it, and HouseholdRole is a five-value enum in household_role.dart. What is missing is that nothing ever writes a second project_members row, so the seat is structurally empty rather than absent. A contacts table is genuinely missing — the only contacts-shaped table in the schema is contact_submissions, a marketing form. Two constraints on the attribution, and both are design requirements rather than implementation details. It must not encode the route in — a person who opens a deep link from a text message and a person who opens the app both have a profile, and both leave a note stored the same way and drawn the same way. And it must survive into the record, because on frame 5 that note is the only surviving reason one of the two rejected options was rejected.decision_options is not empty here — cons, rationale, coach_take, locks and stays_flexible are all real columns. But every one of them is authored from the library, written before anybody bought a lot: what the option is like in general, not what happened in this house on 17 May. Frame 5's second card is the whole anti-regret move and it is one new text column plus the stance and the silence above.Two more that this page relies on and did not have to invent, both already named in _ds/FICTION.md: nothing names a delay and nothing names a visit — no delays, risks or milestones table exists, and the nearest relative is decision_library.delay_consequences, static library copy hanging off a decision. And a change order can carry schedule_change as its change_type, but its only impact columns are impact_amount and impact_amount_cents, both money, so this pushes you a week is the sentence it cannot store. Every line on that card is therefore content that has to be written and then stored, not a query.
_ds/img/kitchen.svg is inlined once at the top of the document as a <symbol> and every frame is a <use> of it. A frame's entire visual state is the region custom properties on one wrapper element, which is the same contract the app would have: eleven named regions, a hex for each one that is settled, and the undecided default for each one that is not. Recoloring works because the drawing shades with black and white at low opacity over a region rather than with a second hardcoded color, so a highlight on Pewter Green is the same shape as a highlight on stained oak.#B4915F, which is the floor's own settled hex, and the two swatches on the card touch so they read as one shape. The sentence beside them states a fact. The verdict comes from the picture, and the settle button says Settle the stained oak and works. Two woods at one value is a real look that some people want on purpose; the app's job is to make sure nobody arrives at it by accident.paint_colors rather than an opinion.--r-teardrop-lg is on the room card and on nothing else, on all six frames. Every card on this page carries the hairline — there is no other kind — no row is separated by a divider, and the hairlines inside cards run between a card's own rows and above the money line, which is --rule-ink so it follows whatever ground it lands on.Named here rather than invented quietly, because a blank cell in _ds/FICTION.md is a license for the next page to fill it in differently.
$21,400, the allowance at $18,000 and the difference at $3,400, which is CO-3. It pins nothing for the stained oak or for Sea Salt, so the money row on those two reads Under $18,000 and prints no figure. The design's central move — that the wrong choice is the cheap one — rests on that claim, so it should be pinned rather than implied.An earlier revision of this page named a second gap here: that the fiction had no second person in the household. It has one now. _ds/FICTION.md pins Sam Hollis and Nora Hollis, and pins the grammar with them — You is positional, meaning whoever is holding the phone, and everybody who is not the viewer is named. These frames are drawn from Sam's seat, so you is Sam and the person the screen talks about is Nora; on her phone it is the mirror. An earlier revision of the arbiter left the homeowner permanently unnamed, which reads fine from one seat and collapses from the other. It also pins the rule this page was already following for its own reasons: never draw how somebody authenticated.
One thing this page corrected rather than reconciled. An earlier revision drew the counter at honed quartz, arguing that the material was settled and only the slab was open. The file is explicit that mid-build the kitchen's chips show cabinets and counters on the pending hatch, and 13, 21 and 22 all draw it pending — so 20 was the page out of step and the counter is now on the hatch on every frame. The four-finish color table in that file is the as-built set, which is a different moment from 17 May.
Grounded in: Zillow's Stage this space, where a room is held large and still while named alternatives in a rail beside it swap what you are looking at, which is frame 1's arrangement exactly; Hims' Shake Selects, where the subject is pinned in its own column and the options and their consequences stack in the other; Revolut Business' card configurator, where the subject renders in the choice you are considering, its name and consequence sit directly under it, and the single commit at the bottom names what you are committing to rather than saying Continue; Alan's product page, where the image pins at the top with the variants as a swatch row immediately under it and the full option list below that, which is frame 4; Whering's shared wishlist, where somebody else's opinion attaches to the specific item it is about rather than to the board; Programa's specification schedule, where a settled selection is a record row carrying product, brand, color, finish and supplier, which is frame 5's settled card; and IKEA's room designer, where the render holds the majority of the screen and the variant tray docks under it rather than floating over it.