A property’s facts reach a section two ways, and both name the same graph. fact is everything a slot can bind verbatim, addressed as fact.<container>.<field>; f is the derive-time view a compute() callback reads, which adds the pools no single slot can bind. Learn a name on one surface and you have it on the other.
The container is the resolution rule: fact.property.* reads the property root, fact.unit.* the primary unit, and fact.contact.* the primary contact card — or, inside a record list bound to fact.property.units or fact.property.contacts, the current row.
A name outside the vocabulary is a compile error at the call site. A writable field draws the editor’s “Update everywhere” toggle, offering to push the edit back onto the property record itself; everything else is read-only in the section.
| binding |
editing |
what it resolves to |
fact.property.address |
read-only |
Street address, resolved to its display form. Read-only. |
fact.property.address_street |
read-only |
Street line of the property address (“123 Main St”). Read-only. |
fact.property.address_unit |
read-only |
Secondary line of the property address — the apartment, suite or unit designator (“Apt 4”). Read-only. Unrelated to the unit container, which holds a priced listing unit. |
fact.property.address_city |
read-only |
City of the property address (“Springfield”). Read-only. |
fact.property.address_state |
read-only |
State of the property address (“IL”). Read-only. |
fact.property.address_postal |
read-only |
Postal code of the property address (“62704”). Read-only. |
fact.property.listing_intent |
writable |
Whether the property is for sale or for rent. Writable — the editor offers “Update everywhere”. Also supplies a select slot’s option vocabulary. |
fact.property.property_type |
read-only |
Property type (single family, condo, multi-family, …). Read-only. |
fact.property.lat |
read-only |
Property latitude, projected from the geocode. Read-only; null until the property is geocoded. Reachable as fact.property.latitude. |
fact.property.lon |
read-only |
Property longitude, projected from the geocode. Read-only; null until the property is geocoded. Reachable as fact.property.longitude. |
fact.property.units |
read-only |
Every unit, baked verbatim as a record list. Read-only as a whole; the per-row fields under fact.unit stay writable. |
fact.property.comparables |
read-only |
Every comparable property — recently sold or currently listed homes similar to the subject — baked verbatim as a record list, in display order. The array itself is read-only (every market number a slide shows is a compute() over these rows), but the members marked writable below are edited on the canvas like a unit’s. |
fact.property.contacts |
read-only |
Every contact card, baked verbatim as a record list. Read-only as a whole; the per-row fields under fact.contact stay writable. |
fact.property.latitude |
read-only |
Property latitude, projected from the geocode. Read-only; null until the property is geocoded. |
fact.property.longitude |
read-only |
Property longitude, projected from the geocode. Read-only; null until the property is geocoded. |
| binding |
editing |
what it resolves to |
fact.unit.unit_label |
writable |
Unit label, resolved against the primary unit (or the current row of a record list). Writable — the editor offers “Update everywhere”. |
fact.unit.beds |
writable |
Bedroom count, resolved against the primary unit (or the current row of a record list). Writable — the editor offers “Update everywhere”. |
fact.unit.baths |
writable |
Bathroom count, resolved against the primary unit (or the current row of a record list). Writable — the editor offers “Update everywhere”. |
fact.unit.sqft |
writable |
Interior square footage, resolved against the primary unit (or the current row of a record list). Writable — the editor offers “Update everywhere”. |
fact.unit.price |
writable |
Price as a flex value (digits or a text override such as “Sold”), resolved against the primary unit (or the current row of a record list). Writable — the editor offers “Update everywhere”. |
| binding |
editing |
what it resolves to |
fact.contact.name |
writable |
Contact name, resolved against the primary contact card (or the current row of a record list). Writable — the editor offers “Update everywhere”. |
fact.contact.title |
writable |
Contact job title, resolved against the primary contact card (or the current row of a record list). Writable — the editor offers “Update everywhere”. |
fact.contact.org_name |
writable |
The organization the contact belongs to — the brokerage a branded deliverable paints as its wordmark. Resolved against the primary contact card (or the current row of a record list). Writable — the editor offers “Update everywhere”. |
fact.contact.bio |
writable |
Contact biography, resolved against the primary contact card (or the current row of a record list). Writable — the editor offers “Update everywhere”. |
fact.contact.contact_address |
writable |
The contact’s address exactly as entered, on one line. Writable — the editor offers “Update everywhere”. Reachable as fact.contact.address — the key is prefixed because this catalog is one FLAT name space shared by all three containers, and the property already owns address. |
fact.contact.email |
writable |
Contact email address, resolved against the primary contact card (or the current row of a record list). Writable — the editor offers “Update everywhere”. |
fact.contact.phone |
writable |
Contact phone number, resolved against the primary contact card (or the current row of a record list). Writable — the editor offers “Update everywhere”. |
fact.contact.website |
writable |
Contact website URL, resolved against the primary contact card (or the current row of a record list). Writable — the editor offers “Update everywhere”. |
fact.contact.instagram |
writable |
Contact Instagram URL, resolved against the primary contact card (or the current row of a record list). Writable — the editor offers “Update everywhere”. |
fact.contact.linkedin |
writable |
Contact LinkedIn URL, resolved against the primary contact card (or the current row of a record list). Writable — the editor offers “Update everywhere”. |
fact.contact.x |
writable |
Contact X URL, resolved against the primary contact card (or the current row of a record list). Writable — the editor offers “Update everywhere”. |
fact.contact.facebook |
writable |
Contact Facebook URL, resolved against the primary contact card (or the current row of a record list). Writable — the editor offers “Update everywhere”. |
fact.contact.headshot |
read-only |
Contact headshot, resolved against the primary contact card (or the current row of a record list). Read-only; belongs on an image slot. |
fact.contact.logo_dark |
read-only |
Contact logo for dark backgrounds, falling back to a silhouette of the light logo. Read-only; belongs on an image slot. |
fact.contact.logo_light |
read-only |
Contact logo for light backgrounds, falling back to a silhouette of the dark logo. Read-only; belongs on an image slot. |
fact.contact.address |
writable |
The primary contact’s address exactly as entered, on one line. Writable — the editor offers “Update everywhere”. |
A compute() callback and a reconcile rule read the whole graph, not just the bindable half of it — and they read it in the same vocabulary. A fact on both surfaces keeps its container and its name: fact.unit.beds reads as f.unit.beds, fact.property.latitude as f.property.latitude, fact.contact.website as f.contact.website.
f.property.* carries every fact.property.* binding above, under the same name.
f.unit and f.contact are the primary unit and the primary contact card themselves — whole rows, nullable, where a fact.unit.* or fact.contact.* binding resolves one member of one.
- The rest are readable-only: a
compute() reads them, no slot binds them. A pool is a whole candidate set, so binding one to a single slot value has no meaning — what a section wants from it is a count, a filter or a pick, which is a computation.
Every fact the platform holds about a property is reachable here by construction. The only thing held back is internal plumbing — a storage key, an id tying a derived row back to the upload it came from — which describes where a value is kept rather than anything about the property, and which a section has no use for.
Scalars are nullable, because whether a property carries a given fact varies from one to the next. A list never is: an empty pool arrives as [].
| reads as |
value |
what it is |
f.property.address |
an object (display, street, street_no_type, city, state, postal, unit) |
Street address, resolved to its display form. Read-only. |
f.property.units |
a list of units rows |
Every unit, baked verbatim as a record list. Read-only as a whole; the per-row fields under fact.unit stay writable. |
f.property.comparables |
a list of comparables rows |
Every comparable property — recently sold or currently listed homes similar to the subject — baked verbatim as a record list, in display order. The array itself is read-only (every market number a slide shows is a compute() over these rows), but the members marked writable below are edited on the canvas like a unit’s. |
f.property.contacts |
a list of contacts rows |
Every contact card, baked verbatim as a record list. Read-only as a whole; the per-row fields under fact.contact stay writable. |
f.narrative |
an object (description) |
The property’s always-on prose description, the substrate every text decision is grounded in. |
f.photos |
a list of photos rows |
Every property photo, in candidate order. |
f.videos |
a list of videos rows |
Every video on the property — hosted uploads and pasted provider links alike, in the order they were added. |
f.tours |
a list of tours rows |
Every 3D tour on the property, in a stable order. |
f.floor_plans |
a list of floor_plans rows |
Every floor-plan image on the property, whichever units it was assigned to. |
f.documents |
a list of documents rows |
Every attachable document on the property — the files a visitor opens or downloads. |
f.document_notes |
a list of document_notes rows |
The prose distilled from uploaded documents, one entry per document — always-on grounding, where documents is the files themselves. |
f.unit |
one units row, or null |
The primary unit — the lowest-positioned one — or null when the property has no units. |
f.contact |
one contacts row, or null |
The primary contact card, or null when the property has no contacts. |
f.year |
number |
The current calendar year. Ambient — read at derive time, not from any fact. |
One row of each pool, exactly as the view carries it. Where a binding above resolves one member of a row, the member takes that binding’s own name — f.contact.website and contacts rows’ website are the same field, spelled once.
| member |
value |
what it is |
unit_id |
string | null |
Durable unit identity, stable across edits — what a baked row is addressed by. |
unit_label |
string | null |
The unit’s label, or null when the listing never asked for one. |
beds |
number | null |
Bedroom count. |
baths |
number | null |
Bathroom count. |
sqft |
number | null |
Interior square footage. |
price |
string | null |
Price as a flex value — digits when numeric, the verbatim text override otherwise. |
position |
number | null |
Display order within the property. |
floor_plans |
a list of rows (id, floor_label, position) |
The floor plans assigned to this unit, in display order. |
| member |
value |
what it is |
id |
string | null |
Durable row identity, stable across edits — what a baked row is addressed by. |
address_street |
string | null |
Street line of the comparable’s address (“12 Oak St”). Part of what makes a row complete. |
address_city |
string | null |
City of the comparable’s address. |
address_state |
string | null |
State of the comparable’s address. |
address_postal |
string | null |
Postal code of the comparable’s address. |
address |
string | null |
The comparable’s address as one display line, assembled at projection. |
lat |
number | null |
Latitude of the comparable. Part of what makes a row complete — the comps map pins on it. |
lng |
number | null |
Longitude of the comparable. Part of what makes a row complete. |
distance_m |
number | null |
Great-circle distance from the subject property in meters, computed at projection; null while either side lacks coordinates. |
status |
string | null |
Where the comparable stands on the market: "sold" when the row carries a sale date, "active" when it does not. Derived rather than answered, which is why it is not a completeness member; it is what disambiguates price. |
price |
number | null |
One integer in dollars. It takes two members to read: status says sale price versus list price, and price_period says total versus monthly rent. Part of what makes a row complete. Writable from the canvas. |
price_period |
string | null |
What price is denominated in: "monthly" on a for_rent property (a rent per month), "total" on any other listing intent. Derived at projection from the SUBJECT’s listing intent rather than stored per row, and never null — print a comp’s price through it or a $2,400 rent renders as a sale. |
sale_date |
string | null |
The closing date (ISO YYYY-MM-DD) when sold; null otherwise. The one market fact the user answers — status is read off it. Writable from the canvas, and the write moves status with it. |
beds |
number | null |
Bedroom count. Writable from the canvas. |
baths |
number | null |
Bathroom count. Writable from the canvas. |
sqft |
number | null |
Interior square footage. Writable from the canvas. |
photo_url |
string | null |
A photo of the comparable, as an absolute URL rather than an upload id — comparables are not property uploads. |
source_url |
string | null |
Where the row’s facts were read from — the listing’s detail page. |
source_name |
string | null |
The name of that source (“Redfin”, an MLS). |
| member |
value |
what it is |
id |
string | null |
Stable identity of the contact card. |
primary |
boolean |
Whether this is the property’s primary contact — the one lead routing and the brand marks resolve from. |
name |
string | null |
Contact name. |
title |
string | null |
Contact job title. |
org_name |
string | null |
The organization the contact belongs to. |
bio |
string | null |
Contact biography. |
email |
string | null |
Contact email address. |
phone |
string | null |
Contact phone number. |
address |
string | null |
The contact’s address exactly as entered, on one line. |
website |
string | null |
Contact website URL. |
headshot |
string | null |
The contact’s headshot, as an upload id rather than a URL. |
logo_dark |
string | null |
The contact’s logo for dark backgrounds, as an upload id rather than a URL. |
logo_light |
string | null |
The contact’s logo for light backgrounds, as an upload id rather than a URL. |
instagram |
string | null |
Contact Instagram URL. |
linkedin |
string | null |
Contact LinkedIn URL. |
x |
string | null |
Contact X URL. |
facebook |
string | null |
Contact Facebook URL. |
| member |
value |
what it is |
id |
string | null |
Identity of the photo. |
tags |
string[] |
What the classifier recognized in the photo — the vocabulary image decisions rank on. |
caption |
string | null |
The photo’s caption, where it has one. |
| member |
value |
what it is |
id |
string | null |
Identity of the video. |
source |
string | null |
Where the bytes live: "upload" for a rendition served directly, "link" for a provider embed. |
tags |
string[] |
What the classifier recognized in the video. Always empty for a link — no classifier runs on one. |
caption |
string | null |
The video’s caption; for a link, the provider’s title until someone corrects it. |
description |
string | null |
The provider’s own description, where it publishes one. Null for an upload. |
duration_ms |
number | null |
Length in milliseconds. Null means UNKNOWN, never short. |
url |
string | null |
The pasted link, exactly as it was given. Null for an upload. |
provider |
string | null |
Which provider hosts the link (“youtube”, “vimeo”). Null for an upload. |
| member |
value |
what it is |
id |
string | null |
Identity of the tour. |
url |
string | null |
The tour link, exactly as it was given. |
provider |
string | null |
Which provider hosts the tour (“matterport”, “biganto”). |
| member |
value |
what it is |
id |
string | null |
Identity of the floor-plan image (its upload id). |
unit_assignments |
a list of rows (unit_label, floor_label, position) |
Which units this plan was assigned to — empty when it is building-wide. |
| member |
value |
what it is |
id |
string | null |
Identity of the document. |
filename |
string | null |
The name it was uploaded under, and the name delivery serves it as. |
mime |
string | null |
The file’s media type — the format, which a filename may not carry. |
notes |
string | null |
Prose distilled out of the file, empty where there is none. |
| member |
value |
what it is |
upload_id |
string | null |
Which upload the notes were distilled from. |
notes |
string | null |
The distilled notes. |