Turn 6 Setting money up, the missing frames

The setup flow in order: 2a the empty tab, 2b and 2j the two ways in. By document: 6c while it reads, then 2c or 4g to check it, 4e if part of it failed, 3c if none of it read, 4f if two documents disagree, and 4a and 4b to place the budget lines. By hand: 6a and 6b. Either way, 6d for the loan and 6e when it is done. Afterwards, 6f the terms, with 6g, 6m and 6n to change one and 6o for the parts. Every add, edit and remove on these lists is drawn: 6h to 6k, and 6l when the parts do not add up. 6p and 6q are Money while a contract reads and once it is ready. 6r and 6s keep a paper, and 6t is what leaving setup partway does. Manual entry now carries all four contract types the backend knows plus nothing signed, the ask-first threshold, and allowances.

6a Typing it in

The one manual-entry frame. Five contract types: the four the backend reads plus nothing signed. The first field changes its label with the type, because a cost-plus estimate is not a sum and a GMP figure is a cap. The fee only appears where there is one. Ask-first and allowances are both here and on the terms screen, and allowances can still be added from a room.

Add an allowance
You can also add one from the decision it pays for. It lands here either way.
Foundation $74,000 {{ chevronGlyph }}
Framing group $242,000 {{ chevronGlyph }}
Mechanical and HVAC $92,400 {{ chevronGlyph }}
Site work and fill $57,600 {{ chevronGlyph }}
Finishes $254,000 {{ chevronGlyph }}
General conditions $72,000 {{ chevronGlyph }}
Add another part
These six add to $792,000. Leave any of them out and the rest still work; what is missing has nothing to be over or under. {{ manualLabel }} You can change any of this later on the terms, and changing it does not touch anything you have already recorded.
6b Desktop · typing it in

6a at the desk. The terms sit on the left and the breakdowns on the right, so the sum and the parts that divide it are in one eyeline. One primary at the foot, stating what it records.

Foundation $74,000 {{ chevronGlyph }}
Framing group $242,000 {{ chevronGlyph }}
Mechanical and HVAC $92,400 {{ chevronGlyph }}
Site work and fill $57,600 {{ chevronGlyph }}
Finishes $254,000 {{ chevronGlyph }}
General conditions $72,000 {{ chevronGlyph }}
Add another part
These six add to $792,000. Leave any of them out and the rest still work; what is missing has nothing to be over or under.
Add an allowance
You can also add one from the decision it pays for. It lands here either way.
{{ manualLabel }} You can change any of this later on the terms.
6c Reading the contract

The moment between sending and 2c. It says how long, says she can leave, and lists what it is looking for so a missing item on the next screen is not a surprise. Nothing on it counts yet, so there is nothing to confirm.

Back to Money Nothing counts until you have checked what I read.
6d Setting the loan up

Reached from 6a, 6e or the terms. Two facts the homeowner actually knows: who the lender is and what the loan stops at. Draws are not typed here; they arrive as they are released, per 5b.

Record the loan · $840,000
6e Setup, done

Where both routes land. It reads back what is in, in counts rather than a percentage, and names what is still open with the route to each. Neither open item stops anything working, and it says so. "Go to Money" lands on 1a (or 1b on cost plus).

Go to Money Change any of these on the terms, under Money.
6f The terms

Where setup lives afterwards, replacing the screen with a Save under every field. It reads as a record: each term with where it came from. Tapping one opens a sheet to change that one thing (6g), so there is no form-wide save and no primary on the screen itself.

Add an allowance
You can also add one from the decision it pays for. It lands here either way.
6g Changing one term

A single-answer sheet, so its action is pinned and states the new value. The room behind stays where it was. The hint says what the change does not do, which is the question a homeowner lowering the threshold mid-build actually has.

6h Adding a part

From "Add another part" on 6a, 6b or 6o. A single-answer sheet: two fields and a pinned action that repeats what it adds. The button reads "Add a part" until both fields have something in them, and does nothing until then. On save the sheet closes and the row appears at the foot of the list.

6i Changing or removing a part

Tapping any part row opens the same sheet, filled. Save is the primary. Remove is an outline button below it, with the consequence stated above it, because a destructive action never takes the filled weight. Removing is immediate: no second confirmation, and the list note recalculates.

6j Adding an allowance

From "Add an allowance" on 6a, 6b or 6f. Three things: what it is for, how much, and which room. The room is a pick run inside a card, so the allowance also appears in that room, and one added from a decision (Decision 6d) lands in this list with that decision's room already set. "Across the house" is a real answer.

6k Changing or removing an allowance

Same shape as 6i. The extra line is what removal does to purchases already charged against it: they stay recorded and stop counting against an allowance. If nothing has been charged yet, the line says so instead.

6l When the parts do not add up

6a scrolled to the parts, with Finishes left out. The note under the list states the difference in dollars and says it is fine. Nothing is blocked and nothing turns amber: a partial breakdown is allowed. When they match, the note reads as it does on 6a.

Foundation $74,000 {{ chevronGlyph }}
Framing group $242,000 {{ chevronGlyph }}
Mechanical and HVAC $92,400 {{ chevronGlyph }}
Site work and fill $57,600 {{ chevronGlyph }}
General conditions $72,000 {{ chevronGlyph }}
Add another part
These five come to $538,000, which is $254,000 short of your $792,000. That is fine. The part that is missing has nothing to be over or under until you add it. Record what you typed
6m Changing the contract type

From the first row on 6f. The same five picks as 6a. Picking a different one adds a line saying what changes in the words the screens use, and the button names the new type. If the type came from the contract, the note says where.

6n Changing a figure the contract gave

Any term that came from a document (sum, contingency). The hint names the page it came from and says the page stays in papers. The row caption on 6f becomes "You changed this, 18 June · the contract says $792,000". Figures you typed yourself get the same sheet without that line.

6o Parts of the build

From "Six parts" on 6f. The same list and the same sheets as setup (6h, 6i), on a screen of its own because it can be long. No primary: each change saves in its sheet.

Foundation $74,000 {{ chevronGlyph }}
Framing group $242,000 {{ chevronGlyph }}
Mechanical and HVAC $92,400 {{ chevronGlyph }}
Site work and fill $57,600 {{ chevronGlyph }}
Finishes $254,000 {{ chevronGlyph }}
General conditions $72,000 {{ chevronGlyph }}
Add another part
These six add to $792,000, the sum on your contract.
6p Money, while the contract reads

Where "Back to Money" on 6c lands. The reading is one row at the top with the in-flight mark. Recording a purchase still works, and the callout says so.

A purchase you record now stays exactly as you entered it when the contract comes in. Record a purchase
6q Money, when it is ready to check

The same row, finished. It is the one primary on the screen until it is checked, and it opens 2c, or 4e or 3c if the read was partial or failed. Nothing from the contract counts until then.

Check what I read Nothing from the contract counts until you have checked it.
6r Keeping the loan agreement · where it comes from

"Add it to your papers" on 6d, 5b and 5c. The pattern is designed in Kept Things 1a; this is it with a document in mind, so a file joins the camera and the library. A routing sheet: a chevron run and nothing pinned. The same sheet serves every "keep the paper" slot on the money screens.

6s Keeping the loan agreement · just taken

The confirm step from Kept Things 1b. Each page comes back before it is kept, and a multi-page letter is added one page at a time. On keep, the sheet closes and the slot on 6d becomes a row naming the document and its page count. The close button throws the shot away.

6t Leaving setup partway

What the two controls on every setup app bar do. Back goes one step up the flow (6a to 2b) and keeps what was typed. The close leaves setup for Money and keeps it too, as a draft: nothing is recorded and nothing counts, and there is no "discard changes?" dialog. Money shows the draft as one row that reopens 6a exactly as it was left.

Pick up where you left off What you typed stays here until you record it or clear it on that screen.
Setup rules that apply to every Turn 6 frame

The states that have no frame of their own. Each follows a rule already drawn elsewhere in this file.

Offline
Setup screens stay open and keep what was typed. The primary becomes inert with the offline line, as in 3a. Sending a contract waits with the file kept on the device. No local queue and no optimistic rows.
Read-only (lapsed)
The terms (6f) and parts (6o) stay readable; chevrons, "Add" links and the setup routes are removed. The lapse line carries the date.
Validation
Only one figure is needed to record (6a). An unreadable amount holds the field with its own line: "Give me this one as a number, like 2140 or $2,140." Sheets (6h to 6n) keep their button inert until both fields have something in them.
Write refused
Every field stays as typed and the primary becomes inert, naming a person or a wait, never a code. Same copy as the 5d purchase sheet.
Success
Setup lands on 6e. A sheet closes and its list re-reads. No toasts, no animation of totals.
Mismatch
Parts that do not add to the sum are allowed and stated in dollars (6l). Nothing is blocked or coloured.
Contract and typed figures
A figure changed by hand after the contract was read keeps the document figure on record and says so in the row caption (6n). The two are never summed.
Setup routes
Reached from
Route
Frame
Kind
Money, empty or not told yet
/house/money/setup
2b / 2j
Screen
2b · Type it in myself
/house/money/setup/manual
6a / 6b
Screen, keeps a draft
2b · photo or file
/house/money/setup/reading/{intakeId}
Screen, then 2c, 4g, 4e or 3c
6a, 6e, 6f, 5f · loan
/house/money/setup/loan
Screen
Record on 6a, 2c or 4g
/house/money/setup/done
Screen
Money · the terms row
/house/money/terms
Screen
6f · a term
/house/money/terms/{term}
6g, 6m, 6n
Sheet
6f · parts
/house/money/terms/parts
Screen
Any parts list
/house/money/terms/parts/new
6h / 6i
Sheet
Any allowance list, or a room
/house/money/terms/allowances/new
6j / 6k
Sheet
Any "Add it to your papers"
/house/papers/new?against=…
6r / 6s
Sheet, existing intake
Fields to confirm with the backend

Contract kind (fixed_price, cost_plus, tm, gmp), the contract sum and named allowances are read by the existing contract extraction. The rest is drawn here and has not been checked against a served contract. Each needs a yes before its frame is built.

"Nothing signed yet" as a kind
Not one of the four extraction kinds. Needs a fifth value or a null kind.
Fee (cost plus, GMP)
Percentage or fixed amount.
Contingency
Amount, with its source: typed or read off a page.
Ask-first threshold
Shown on 1b. Needs a stored amount and a history, because 6g changes it mid-build.
Allowance → room
One room or "across the house".
Parts of the build
Name and amount per part, and whether they map to cost-code groups (4a).
Own estimate
The third baseline build health reads.
Loan
Lender name, loan total, own money going in.
Typed-over figure
The document figure and the typed figure both stored, with dates (6n).
Setup draft
Server-side draft for 6t, or device-local; decide which.
Turn 5 Five rulings, and the frames they replace

Four of the five blocked frames were promising a write or a fact the served contracts cannot hold, and they are revised to fit what is served. One is the opposite case: purchases can be created and never read back, which makes capture a hole rather than a feature, so 5a asks for the projection to return them and the contract delta below says exactly what it needs. 5b and 5c hand the draw release and the change order back to the builder seat that owns them and leave the homeowner the two things they really can do — keep the paper, and ask. 5d removes the chooser: there is one thing to record, so the plus records it. 5e stops claiming cached figures. 5f and 5g are the desk. The documentation under the frames is the implementation contract: a dossier per state, the route matrix, the one backend delta, and the final copy.

5a What she sees after she records one

Ruling A, and the only one. A purchase that can be written and never read is a hole, not a feature — so the Money projection returns what the owner recorded, and the figure and the run below it both come from the server. The client sums nothing. The note says whose money this is a count of, because a figure that silently mixes her receipts with Dave's invoices is the thing this screen exists to prevent. Blocked until the delta below ships.

Everything you have recorded since 2 June, counted by us. Dave's invoices are not in this figure, and there is no contract in here to measure it against yet. The number left to commit, a line for every allowance, and a place for a change order to land. Send it whenever you like — everything above stays exactly as you entered it. Record a purchase
5d The plus, with nothing to choose between

A chooser with one live option is a door with a corridor behind it. Draws and change orders are the builder's to raise, so the plus goes straight into the purchase sheet — same sheet, same fields, and a direct route of its own at /house/money/purchase/new for anybody arriving from outside. Nothing is hidden by removing the chooser: 5f names where the other two come from, in the run where they will appear.

Everything you have recorded since 2 June, counted by us.
5b Draws, and who releases one

Release needs the builder's seat and the Draw record has no recipient, so the homeowner never records one, and editing the schedule is not offered anywhere near this — a date is not a release. The expectation is answered rather than dimmed: the inert control names Dave and says what he does. What she can genuinely do is keep the lender's letter, which is a real document route, and ask.

Lenders sometimes release before Dave has reported it. Nothing is wrong with your record, and nothing you do here would change the figure — ask him, and it arrives with his date on it.
5c A quote nobody has put through

Agreement method, agreement date and contingency use have nowhere to be stored, and a change order is Dave's draft, so the homeowner screen stops pretending to write one. What is left is true and useful: the paper is a document, the ask is a message, and the contract has not moved. When Dave raises it, the existing change-order read and decline states take over — nothing here duplicates them.

Ask Dave to raise this Keeping the quote is not agreeing to it, and it does not move a figure. When Dave raises it, it arrives here with his number on it and you answer then.
5e Money it could not reach

Nothing is cached and the projection carries no date, so the honest screen shows no figure and no "as of" — the previous frame promised both. It says what is true instead: the figures are kept with us, they have not changed, and a number nobody can stand behind is worse than a gap. One way forward, one line about the receipt on the phone, and no cause.

They are kept with us rather than on this phone, which is why they are not here while I cannot reach them. Every document you have sent is in your papers, and that is worth a look while you wait. If you have a receipt to record, photograph it now and record it when this comes back. The photograph keeps on your phone.
5f Desktop · the recorded build, and what comes from Dave

5a and 5d at the desk, one river as 1g argues. The foot of the screen is where the removed chooser goes: two named absences at the outline rung, each saying who fills it and what arrives when they do, so a reader who came looking for "record a draw" finds the answer rather than nothing. The three things she has not told us yet keep their run: the contract opens 2b, the loan opens 6d, and contingency opens 6a with the contingency field focused.

Everything you have recorded since 2 June, counted by us. Dave's invoices are not in this figure, and there is no contract in here to measure it against yet.
Record a purchase Add your contract
5g Desktop · Money it could not reach

5e at the desk, and the reason the old stale desktop screen was removed: it drew Tuesday's figures and an as-of line from the same contract that has neither. The block sits at the top of the river at its own width rather than centred in an empty canvas, because the rail and the chrome are still working and the screen has not broken.

They are kept with us rather than on this machine, which is why they are not here while I cannot reach them. Every document you have sent is in your papers, and that is worth a look while you wait.
The five rulings

One ruling each, no alternatives left open. Four fit the served contracts. One asks for a contract expansion, and Money capture stays behind a flag until it lands.

Frame
Blocker
Ruling
What the design now does
2e → 5a
Purchases can be created; the Money projection does not return them.
A — expand
The projection returns owner_recorded_total and owner_records[], both server-computed. Capture ships with the delta, not before it.
2f → 5b
Release is builder-only under release_draw, and Draw has no recipient field.
B — fit
No homeowner draw write anywhere in the product. Draws is a read with acknowledgement; the recipient question is deleted, not moved. Schedule editing is not offered on this screen in any form.
2g → 5c
Change orders are a builder draft; agreement method, agreement date and contingency use have nowhere to be stored.
B — fit
The homeowner keeps the quote as a document and asks the builder to raise it. The four unstorable fields are gone. Accept and decline stay where they already are, on the issued record.
2k → 5d
The chooser led to both of the above.
B — fit
The chooser is deleted. The plus opens the purchase sheet directly. What the homeowner does not write is named at the foot of 5f rather than dropped.
3b → 5e
The repository is online-only and the projection has no as_of.
B — fit
No cached figure and no dated line. The unreachable state shows no figure at all, says so, and offers one route that works. AsOf is removed from every Money surface until a served timestamp exists.
State dossiers

One per revised state. 5f takes 5a's dossier and 5g takes 5e's: the desk differs in composition only, never in route, seat, fields or refusal.

5a · Money, after a purchase is recorded
Blocked on the contract delta below.
Arrival route
/house/money, on load and on return from the purchase sheet.
Return route
It is the destination. The dock leaves it; no back chevron.
Actor and seat
Homeowner, house member. No capability beyond membership. Builder seats never see this screen.
Required fields
None. It is a read.
Optional fields
None.
Source of truth
The Money projection. Figure from owner_recorded_total, run from owner_records[], opening date from owner_records_since. The client sums nothing and holds no optimistic total.
Primary action
Record a purchase → /house/money/purchase/new.
Success behavior
On create, the sheet closes and the projection is re-read. The new row appears at the head of the run with its own paid date; the figure changes because the server changed it. No toast.
Validation and refusal
Nothing to validate. A membership refusal never reaches here — the house is not in the dock.
Offline
No projection, so no figure: the screen is 5e. There is no cached copy to fall back to.
Read-only
Lapsed account: the run and the figure stay, the primary and the plus are removed, and the lapse line carries the date.
Conflict or moved
A record corrected on another device re-reads on focus. A deleted record is never silently dropped from the run: it draws as withdrawn with what it said.
5b · Draws, and who releases one
Buildable today.
Arrival route
/house/draws, from the draws card on /house/money or from a draw notification.
Return route
Back to /house/money. The dock is present; the screen is a destination of its own.
Actor and seat
Homeowner, house member, read plus acknowledge. Release requires the builder seat and release_draw, which no homeowner holds.
Required fields
None. The only write from this screen is a document upload, which requires a file.
Optional fields
The lender's release letter, as a document against the house.
Source of truth
The Draw records as the builder reported them. No recipient is shown, because none is stored.
Primary action
None on the screen. The one write is Add it to your papers → /house/papers/new?against=draw:{id}, the existing document intake.
Success behavior
The letter appears in papers against this house. No figure moves, and the copy says so.
Validation and refusal
Record a draw is drawn inert and names Dave. It is not a disabled button and it never posts. A homeowner call to the release endpoint is refused by the server and unreachable by design.
Offline
Unreachable state, same shape as 5e, titled for draws. The photograph keeps on the phone; the upload waits.
Read-only
Lapsed: schedule and history stay, the papers slot and the ask are removed.
Conflict or moved
A draw released while the screen is open appears on re-read with its own date. A draw the builder voids draws as withdrawn with its figure, never removed.
5c · A quote nobody has put through
Buildable today.
Arrival route
/house/decision/{id}/quote, from the decision it belongs to. Direct entry from a link in a message resolves to the same route.
Return route
Back chevron to the decision. Never to Money — Money did not own this.
Actor and seat
Homeowner, house member. Raising a change order needs the builder seat; accepting and declining an issued one stays with the homeowner on the issued record.
Required fields
For the ask: nothing beyond the decision it is against. For the document: a file.
Optional fields
A sentence on the ask. No amount, no agreement method, no agreement date, no contingency flag — none of the four can be stored and none is collected.
Source of truth
The document and the message thread. The quoted figure is shown as the builder's words on a document, never as a projection figure and never in a total.
Primary action
Ask Dave to raise this → the existing ask route against this decision.
Success behavior
The ask appears in the thread with the date it was sent. Nothing on the contract changes, and the screen says so. When the builder issues the change order it arrives as an issued record with accept and decline.
Validation and refusal
Record a change order is drawn inert and names the seat that owns it. No homeowner write to the change-order endpoint exists in the client.
Offline
The ask cannot be sent: the primary becomes the inert control carrying the offline sentence, and the photograph keeps on the phone.
Read-only
Lapsed: the quote and its document stay readable, the ask and the papers slot are removed.
Conflict or moved
If the builder has already raised it, this screen is replaced on re-read by the issued change order, with a line saying he raised it. If the decision moved rooms, the route follows the decision.
5d · The purchase sheet, from the plus
The write is served today; the read it returns to is 5a.
Arrival route
The plus on /house/money or /house/draws, the primary under the ledger, or direct entry at /house/money/purchase/new.
Return route
Closing returns to the screen behind it. Direct entry returns to /house/money.
Actor and seat
Homeowner, house member. The record is the owner's own and is not sent to the builder.
Required fields
Amount, and what it was for.
Optional fields
Paid date (defaults to today), who paid it (you, Dave, or a trade directly; defaults to you), receipt document, allowance it comes out of where an allowance exists. Same fields as 4h.
Source of truth
The purchase record on the server, from the moment it is accepted. Nothing is held locally.
Primary action
Record $2,140 — the button states the figure it is about to write.
Success behavior
Sheet closes, projection re-reads, the row is in the run. No success message and no animation of the total.
Validation and refusal
An empty or unparsed amount holds the sheet with the field's own line. A rejected write leaves every field as typed and the primary becomes inert with the reason named as a person or a wait, never as a code.
Offline
3a: the offline line above the fields, everything typed kept, the primary inert. No local queue and no optimistic row.
Read-only
Lapsed: the plus and the primary are not drawn, so the sheet has no route in.
Conflict or moved
A repeated submit of the same idempotency key returns the first record rather than a second one. If the allowance it charged was removed while the sheet was open, the toggle disappears on re-read and the amount is unaffected.
5e · Money it could not reach
Buildable today. Replaces the cached-figure state entirely.
Arrival route
/house/money, whenever the projection read does not return. Same route, different state — never its own URL.
Return route
The dock. Navigation is untouched, because nothing about the app has broken.
Actor and seat
Homeowner, house member. The state is independent of seat.
Required fields
None.
Optional fields
None.
Source of truth
Nothing is shown, so nothing is sourced. No figure, no date, no count, no "as of". The screen must not render a zero, a dash or a skeleton that resolves to one.
Primary action
Look again — a re-read of the same projection. The secondary way out is the papers, which are a different read.
Success behavior
A successful re-read replaces the block with the money screen. No confirmation that it came back.
Validation and refusal
Cause never surfaces: no status code, no "sync failed", no retry counter. A refusal on seat is a different state — the house is not in the dock at all.
Offline
Same block, offline wording: "You are offline" above the same statement. The distinction is drawn because the way forward differs — waiting for signal rather than looking again.
Read-only
A lapsed account that cannot be reached shows this state, not the lapse line: unreachable outranks read-only, because the lapse date itself is served.
Conflict or moved
If the house has moved or access was removed, the re-read resolves to the dead-link state rather than back to this one.
Route and state matrix

/house/money remains the only primary homeowner Money destination. Everything launched from it is a sheet with a direct-entry route of its own; nothing below is reachable only as a sheet.

Reached from
Route
Frame
State
Who can act
Dock · Money
/house/money
5a / 5f
Read: owner records returned
Homeowner
Money · plus, or the primary
/house/money/purchase/new
Sheet over Money; own route on direct entry
Homeowner
Money · draws card, or a notification
/house/draws
Read, with the release named as Dave's
Homeowner reads; builder releases
Draws · a released draw
/house/draws/{id}
Detail and acknowledgement, unchanged. Never approval
Homeowner acknowledges
Draws · lender's letter
/house/papers/new?against=draw:{id}
Existing document intake, no new surface
Homeowner
A decision, or a message link
/house/decision/{id}/quote
Keep the paper, ask the builder
Homeowner asks; builder raises
Money · an issued change order
/house/money/change/{id}
1d / 1f
Accept or decline, declined kept in place
Homeowner
Builder seat
/jobs/money
Not in this file
The action queue: draft a change order, release a draw
Builder, with release_draw
Any Money route, read fails
/house/money
5e / 5g
No figure, no date, no cached copy
Nobody
Contract delta

One expansion, for ruling A. Nothing else in turn 5 needs a backend change: 5b, 5c, 5d and 5e are built on endpoints that exist today. Purchase capture ships when this lands, and not before — a create with no read is not shippable as a homeowner feature.

Money projection · expanded
Endpoint
GET /house/{house_id}/money
Actor / capability
House member. No new capability.
Request fields
Unchanged.
New projection fields
owner_recorded_total (money, server-computed sum of the owner's own purchase records)
owner_records_since (date of the earliest one)
owner_records[] → id, amount, description, paid_on, recorded_at, receipt_document_id, allowance_id, status (recorded | corrected | withdrawn)
Immutable facts
recorded_at, recorded_by and the original amount. A correction is a new version with a link to the one it corrects; withdrawn records stay in the projection and are drawn, never dropped.
Separation
Owner records never merge into contract, draw or change-order figures, and owner_recorded_total is never added to a builder-sourced total by either side.
Client rule
The client renders these fields and computes nothing from them.
Purchase create · confirmed shape
Endpoint
POST /house/{house_id}/money/purchases
Actor / capability
House member. Builder seats cannot write an owner record.
Request fields
Required amount, description. Optional paid_on (defaults to today), receipt_document_id, allowance_id.
Response
The created record in the same shape the projection returns it, so the sheet's return needs no second call to know what it wrote.
Idempotency
Client-generated key per sheet opening. A repeat returns the first record with the same id and no second row. A retry after a timeout is therefore safe and the UI never guards it with a spinner lock.
After success
owner_recorded_total increases by the amount and the record appears in owner_records[], ordered by paid_on descending. Nothing else in the projection moves — no allowance figure, no contract sum, no draw.
Allowance
Where allowance_id is set, the remaining figure the allowance reports is recomputed by the server. The client shows the recomputed figure, never its own subtraction.
Final copy

Every user-facing string in the revised states, including the error conditions that have no frame of their own. Nothing here is a placeholder.

5a · Money
Figure label
Spent so far
Note under it
Everything you have recorded since 2 June, counted by us. Dave's invoices are not in this figure, and there is no contract in here to measure it against yet.
With a contract in
Everything you have recorded since 2 June, counted by us. It sits alongside your contract rather than inside it.
Section
Recorded by you
Row captions
Paid 14 June · receipt in your papers / Paid 9 June · no receipt
Withdrawn record
You took this one back on 18 June. It stays here with what it said.
Corrected record
Corrected on 18 June, from $2,140. Both versions keep their date.
Primary
Record a purchase
Empty run
Nothing recorded yet. Record a purchase the day it happens and it will be here a year from now.
5d · Purchase sheet
Title and support
Record a purchase / What you paid, and what it was for. Everything else is optional.
Fields
How much — The number you actually paid, tax included. / What it was for / When you paid it / Who paid it — You did · Dave did · A trade billed you directly
Primary
Record $2,140
Amount missing
I need the figure before I can record it.
Amount unreadable
Give me this one as a number, like 2140 or $2,140.
Description missing
A few words is enough — you will want to know what this was.
Write refused
Inert control, why: I could not get this one to us, and everything you typed is still here. A figure has to reach us as it happens rather than sit half-recorded on a phone.
Offline
You are offline / Everything in here still reads. What waits is adding to it. The receipt photo is on this phone and keeps.
5b · Draws
Head
Draws / The Hollis House · your lender's schedule, as Dave reports it
Due next
Drywall and interior finishes · On the June inspection. Your lender releases it when it passes, Dave reports it, and you will see it here.
Inert control
Record a draw — Dave is the only person who can release a draw, because it is his seat your lender pays against. When he does, it lands here with the date and the inspection it went out on, and you acknowledge it.
Papers slot
Keep your lender's release letter / Whatever they sent you. It goes in your papers against this house, and a dispute a year from now will ask for it. / Add it to your papers
Missing draw
If a draw has gone out and is not here — Lenders sometimes release before Dave has reported it. Nothing is wrong with your record, and nothing you do here would change the figure — ask him, and it arrives with his date on it.
Upload refused
The letter is still on your phone and I have not taken it yet.
Voided draw
Withdrawn · Dave took this one back on 3 July. It stays here with the figure it carried.
5c · Quote
Head
Kitchen · cabinet package / Dave has quoted this, and nothing is agreed. / Keep the quote here so it is not in a text message, and ask him to raise it.
Card
Plywood boxes, Reed Millwork · Not on your contract · Quoted 11 June, by text. Your contract sum has not moved.
Inert control
Record a change order — A change order goes on your contract, so Dave raises it and you accept or decline it. There is nothing you can record here that would count as the two of you agreeing.
Primary
Ask Dave to raise this
Note
Keeping the quote is not agreeing to it, and it does not move a figure. When Dave raises it, it arrives here with his number on it and you answer then.
Already raised
Somebody else acted · Dave raised this on 12 June, and it is waiting on you now. / Open the change order
Ask not sent
I have not got this to Dave yet. The quote is kept, and the ask is still here to send.
5e · Unreachable
Statement
I cannot show you your figures right now
Second line
Nothing has changed and nothing is lost. I would rather show you a gap than a number I cannot stand behind.
Way forward
Look again
Callout
Where your figures are — They are kept with us rather than on this phone, which is why they are not here while I cannot reach them. Every document you have sent is in your papers, and that is worth a look while you wait. / Open your papers
Note
If you have a receipt to record, photograph it now and record it when this comes back. The photograph keeps on your phone.
Offline variant
You are offline · I cannot show you your figures right now / They are kept with us rather than on this phone, so they come back with your signal. Nothing has changed while you were out.
Second failure
Same block, unchanged. No counter, no cause, and the way forward stays.
Turn 4 The intake queue

Build health needs a cost code on every budget line, and a 62-line budget cannot be 62 pickers. So the review inverts: 4a is the phone, and it opens on the eight we could not place rather than on the sixty-two. 4b is the same review at the desk, where the whole table fits and the builder's own code maps inline. 4c splits one receipt across several codes and 4d confirms a quoted lump against the estimate lines it covers, without splitting it. The last five extend frames that already exist: 4e gives 3c the partial read, 4f gives 3d the suppressed verdict, 4g separates an estimate from a cap in 2c, 4h makes the payer an attribute in 4h. Manual entry moved to 6a.

4a The eight I couldn't place

The inversion, and the whole reason the review is not a table on a phone. The screen never says "assign a code to 62 lines"; it says fifty-four are placed and here are the eight that are not. One line at a time, three candidates and a tap that agrees — nothing asks her to originate a code. The builder's own code maps inline, at the builder level, so the next budget Dave sends costs less than this one.

{{ codeLabel }} Leaving it unplaced is a real answer. The $12,400 counts either way; it just will not group with anything until you say where it goes. The other fifty-four matched a code I was sure about, so they went in without asking. If a queue gets long enough to put off, the forecast behind it goes stale — which is the thing this screen exists to stop.
4c One receipt, three cost codes

Propose, then confirm. The split arrives already made, with tax and delivery allocated in proportion rather than dumped on the largest line, and the reader's job is to check it. Exactly one item is genuinely ambiguous, so exactly one question is asked — and the answer is remembered against the supplier line, which is what keeps the second Builders FirstSource receipt from costing what the first one did.

The $71.30 of tax and the $75 delivery are already in those three, split in proportion to what each one came to. Nothing is sitting on the largest line.
{{ splitLabel }} One purchase, three places it counts. The receipt stays whole in your papers with its own total on it.
4d A quoted lump, against six lines

Dave quotes $70,000 for framing as one number; the estimate has six lines under it. The lump is never split — inventing six numbers inside it would be making them up — so the six are grouped and the two totals are compared whole. This is a different comparison from Decision 3c, which puts one quote beside another; here a quote is being read against a baseline.

What the two come to
Your estimate, those six lines $67,400
Dave's quote for the same work $70,000
The quote is $2,600 above the six lines it covers. That is the comparison build health makes, and it makes it on the group rather than line by line.
Confirm the grouping · six lines I will not divide the $70,000 across the six. A split I invented would look like six facts and be one guess.
4e I read most of it, not all

The state 3c did not have. A total failure to read is the rare case; on a 62-line budget the normal outcome is that most of it came through and some of it did not. What is missing is named line by line, what was read is already usable, and the two routes out are the same two the total failure offers. "Type the four in myself" opens the 6h sheet once per line, with the description already filled from the page.

Photograph page 3 again Type the four in myself
Neither is urgent. The 58 lines I did read are in, and the total on the front page is what the money screens use — not a sum of the lines.
4f A clash, and no verdict while it stands

What 3d states, carried through to its consequence. An open conflict about the contract sum sits at the root of the projection, so build health is not read at all while it is open — and the place where the verdict would be is a container-shaped absence at the outline rung, not a card apologising. Everything she recorded herself is untouched and still readable below it.

Tell me which one you signed
No verdict while these disagree Every figure in build health is measured against the contract sum, so reading one from the wrong number would be worse than reading none. It comes back the moment one of the two is the contract.
What you recorded is what you recorded. Nothing about the clash changes a purchase, a draw or a date.
4g An estimate is not a ceiling

2c on a cost-plus job, where the number on the front of the budget is an estimate and recording it as a contract sum would tell her she is capped when she is not. The second rule this frame carries: the figure confirmed is the document's own stated total, never a sum of its lines — a 62-line budget that also prints its bottom line has 63 numbers on it, and adding all of them once turned $571,128.60 into $1.2 million.

On a cost-plus job the estimate is what the work is expected to come to, not what it is allowed to come to. I record it as an estimate so the money screens never draw you headroom you do not have. Your budget lists 62 lines and then prints its own total underneath them. I take the printed total. Adding the lines and the total together is how a $571,128.60 budget once read as $1.2 million. Record it as an estimate
4h Who paid is a field, not a different screen

The purchase screen, with the payer section added, and it is the section that lets a builder's bill walk the same path as a receipt from the counter. Payer is an attribute of a purchase, so there is no second capture flow to build and no second tree for the money to land in — the cost code, the allowance and the ledger row are identical whichever answer is picked. This is the one purchase form: direct entry at /house/money/purchase/new renders it as this screen, and the plus opens it as the 5d sheet with the same fields in the same order.

{{ payerLabel }} Who paid does not change where the money lands. It is the same cost code and the same allowance either way; it only changes whether I expect to see it again on a bill.
4b Desktop · the whole budget, line by line

Not 4a widened — a different layout for the same job, because a 62-row table is the thing a desk can do and a phone cannot. The eight exceptions keep the top, each with the group I would put it in, how sure I am and one control that agrees; Dave's own code sits in its own column so the mapping is confirmed where the line is, rather than on a screen of its own. Underneath, the 54 already placed, in full, changeable.

LineAmountDave's codeI would put it in
Rough carpentry, labour only $12,400 06-110 FramingLeast sure of the eight Agree
Allowance, owner selections $46,000 09-900 FinishesCould be four different groups Agree
Temporary power and water $3,850 01-500 General conditionsOr Sitework, if you keep them apart Agree
Supervision $28,600 01-310 General conditionsSome builders carry this in the fee Agree
Unclassified, page 3 $9,120 None given Nothing I can offerIt still counts against your total Choose
Three more below, all of them under $2,000. Show the other three
Agree with all eight Dave's five codes are remembered for his next budget.
LineAmountDave's codePlaced in
Roof trusses, engineered $18,600 06-170 Framing Change
Asphalt shingles and underlayment $14,250 07-310 Roofing Change
Slab on grade, concrete and pump $31,480 03-300 Foundation Change
Fifty-one more, across eleven groups. Show all 54
An unplaced line is not a lost one. It counts against the total from the moment it is read; a group is only how it sits beside the others.
3a Offline, mid-record

Says what still works before what stopped, and never why. Money is the one thing in the product that has to reach us as it happens, so the primary cannot be a button that pretends — it becomes the inert control with the ask on it, which names who or what can act instead of dimming a button and going quiet. Everything typed stays where it is.

Take the photo now if you have it. Photographs keep on the phone; the figure is the part that waits.
3c I couldn't read what you sent

A read that fails says so rather than returning an empty document — the honest version of the failure the extractor already refuses to fake. No cause, no retry-only dead end: two real routes out, and the file stays in her papers either way. Photographing goes to 6r; typing goes to 6a.

Photograph the pages instead Type the numbers in myself
One page per photograph, flat on a table, in daylight. The pages that matter are the sum, the allowance schedule and the draw schedule — the rest can wait.
3d Two documents disagree

The case the amendments file flagged as having no drawing yet, now drawn. A genuine clash is the one place terracotta ink appears, and it appears as a mark on the card rather than as a colored panel. Both numbers keep their page, neither is preselected, and picking one does not delete the other — the loser stays in the papers with what it said.

Whichever you pick, both files stay in your papers with what they said. Nothing here overwrites a document. The signed agreement is the one that counts, and a spreadsheet is usually somebody's working copy. If the two are still apart after you look, that is worth asking Dave about before either goes in. {{ srcLabel }}
3e Not yours to acknowledge

The released draw, on the phone of somebody seated on the job who does not hold the account. Names the person rather than the permission, and the whole record stays readable — reading and asking never depend on being allowed to act. "Something looks wrong" survives, because the one thing everybody can always do is ask.

Something looks wrong
3f The amendment moved under her

She opened 1c to confirm $1,850 and Dave had already replaced it. Replaced, not superseded: the old one was not wrong, it is out of date, and the state that reads that way always points forward. It stands in for the card it replaces and the headroom figure above it is untouched, because nothing went on the contract.

Unchanged. Nothing went on your contract while this was in the air.
3g Read-only since

One line with the date, saying what stays, and no action on it — the person who can restart a subscription may not be the person holding the phone. Everything recorded is still here and still readable; what goes is the plus in the app bar and the primary at the foot. A money screen that hid its own ledger behind a paywall would be the one unforgivable version of this state.

Read-only since 30 June. Everything here stays. As it stood on 30 June, against a contract of $792,000. Every record, every date you were told, and every document behind them. None of it is going anywhere.
2a Money, before anything is in it

No contract read, no builder connected, nothing recorded. Not drawn as reassurance — an empty money tab is a gap in what we know, and the gap says what closes it. The slot is the hairline ghost of what will fill it, with exactly one action, and the callout says the contract is not a prerequisite for recording what you spend.

Record a purchase the day it happens and it stays where you put it. What the contract says can come later, and nothing you have recorded moves when it does.
2b Two ways in

Two sections rather than two options: the way in that reads a document, and the way in that never needs one. On a phone the document route takes a photo or a file; the desk frame 2j drops the camera and takes a drop area instead. Typing it in is a real button because it leads to a screen — 6a — rather than being an aside.

Take a photo of each page Upload a file
A PDF, photographs of the pages, or the spreadsheet your builder sent. Whichever is easier to get hold of.
Type it in myself
Plenty of builds run on a quote and a handshake. Type in what you have agreed and record what you spend; the ledger works the same way with no document behind it.
2j Desktop · setting money up

2b at the desk, and the camera is gone: on a machine with no camera the photo button is an offer that fails. The document route becomes a drop area with a file picker inside it, drawn at the outline rung because it is a container-shaped absence, and the typed route keeps its own block beside it so neither reads as the fallback.

{{ fileGlyphLarge }} Drop the contract here A PDF, photographs of the pages, or the spreadsheet your builder sent. I read out the contract type, the sum, the allowances and the draw schedule. Choose a file
Several pages at once is fine. Nothing counts until you have seen what I read out of them.
Type it in myself
Plenty of builds run on a quote and a handshake. Type in what you have agreed and record what you spend; the ledger works the same way with no document behind it.
2c What the contract said, before it counts

Every number carries the page it came off, which is the same provenance rule the ledger uses for a moment you were told. Nothing is recorded until she says so, and what the read missed is named rather than left out — a scan that quietly drops the draw schedule is worse than one that admits it. Recording lands on 6e. The ask-first threshold is never read off a contract; 6e lists it as still open when it was not typed.

Tap any of them to change what I read. What you record is what counts from here, not what the scan said. Record these four
1a Money · fixed price

One headline figure and it is headroom. The three layers in order: what is left to commit, what went over and when you heard, then the two pools that have a ceiling. The contract is cited to its clause in the head's meta line, because contract type is a fact about their contract rather than a setting. The terms row at the foot opens 6f.

Against a contract of $792,000. What moved it is on the list below. Every one of these carries the moment you were told, and none of those moments can be changed afterwards. Not by us, not by Dave, not by you.
An allowance fires when the pick differs from what was set aside. Nothing here is overdue.
1b The same screen, cost plus

Same three layers, different vocabulary, and one figure that does not exist on 1a: the fee. An allowance is about scope and a threshold is about authority, so the threshold gets its own block and says what it did last week. Nothing waiting on you is drawn as a sentence with a dot, not as a card apologising for being empty. The $2,500 is the ask-first threshold set in 6a and changed in 6g; the terms row opens 6f.

Against a target of $770,000, and tracking $18,900 above it. A yes to $3,300 is not a yes to $3,900, so the difference is its own line with its own moment you heard. Dave buys anything under $2,500 without asking, which is what you both agreed. Last week $51,750 moved and none of it crossed that line.
1c Agreed by text, not counted yet

The amendment sits beside the total and never inside it, so the headroom figure stays true and the confirmation is about something real. The action names its own scope. Being signed in is the proof, which is why a paid homeowner never sees a code.

Confirm CO-1 · $1,850
A text can tell Dave what you want. It can't prove it was you. Being signed in here is that proof, which is why confirming takes one tap rather than a code.
1d Draws, against the loan

The one place a denominator is permitted: the loan is a fixed pool the lender stops at, and the three segments sum to the whole so there is no empty track to read as progress. The six are dates, so they are drawn on the spine rather than as rows — paid, due, and one with no date at all.

$840,000 in total, and your lender stops there. Your lender releases each draw against an inspection and Dave reports it here. If your lender wants you to request one, that happens with them, not in here.
1e A draw that already moved

The money is gone, so nothing here pretends otherwise: what it collects is that you know. Acknowledgement, never approval — and the disagreement is a real door rather than a dead end. No "5 of 6" in the head: a position is not a count, and the last line says what is left instead.

Your lender released the money against an inspection that already happened. Saying you have seen it puts the date on the record, next to what he said and when he said it.
I have seen this Something looks wrong

One draw left after this, and it is the certificate of occupancy. Nothing about that one is scheduled yet.

1f Saying no, and where it goes

Declining is a state on the change order, not a deletion of it — the ledger is worthless if only the yeses survive. The decision returns to open with the declined amendment cited on it, nothing is pre-selected, and the forecast is recalculated against the new deadline. Pick an option and the primary says what it will settle.

Reed Millwork can't start until it's settled, and the ten-week lead now runs from whenever you do. The decision is back on Now.
{{ settleLabel }}
1g Desktop · money is one river

The same content as 1a, and deliberately not widened into columns: the widest thing on this screen is a ledger row, and side by side would put the overrun list next to the pools it has nothing to do with. The desk earns its width by holding the whole river at once instead of two of anything. The one waiting amendment from 1c sits at the foot with the sentence that says what confirming it moves.

Against a contract of $792,000. What moved it is on the list below. Every one of these carries the moment you were told, and none of those moments can be changed afterwards. Not by us, not by Dave, not by you.
Confirm CO-1 · $1,850 Confirming it adds $1,850 to your contract and takes it off what is left to commit.
1h Desktop · draws

1d at the desk, and the one screen in Money that earns two columns: the composition and the schedule are the same six facts read two ways, so they belong in an eyeline rather than a scroll. The left cell is a column of three short blocks against the spine's height, which is how the two cells come out even.

{{ backGlyph }}Money
Your lender releases each draw against an inspection and Dave reports it here. If your lender wants you to request one, that happens with them, not in here.