Skip to content
HomePagesHomePages template kit

The fact vocabulary

Every fact a slot can bind and every fact a `compute()` can read, in the one vocabulary both surfaces share.

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.