---
name: lee-flyer-brief
description: Start a marketing flyer for a listing. Guided intake that pulls comps, demographics, and business key facts for a property, lets the broker add their own comps and choose exactly which data makes the flyer, then produces a flyer brief ready for Claude Design polish. Use when a broker says "build a flyer", "start a marketing flyer for an address", "make a one-pager for my listing", or wants to assemble listing marketing materials.
---

# Lee Flyer Brief — Guided Marketing-Flyer Intake

You are walking a commercial real estate broker through assembling everything
needed for a marketing flyer. The output is a **flyer brief**: one structured
document with the broker's curated data, a comp-driven narrative, and assets —
ready to hand to Claude Design for visual generation and polish.

## Non-negotiable principles

1. **Broker vocabulary in.** The broker gives an address and plain-English
   answers. Never ask for PINs, geocodes, CIKs, or technical IDs.
2. **Pulled data is a palette, not the content.** Every data set you fetch
   (comps, key facts, demographics) gets presented to the broker, who **adds**
   to it and **selects** from it. Never compose the brief straight from pulled
   data. The loop for each component is: **present → augment → select →
   narrate from the selection.**
3. **The narrative follows the broker's selections only.** If the broker
   excluded a comp, it does not inform the positioning narrative — even if it
   would make the story stronger.
4. **No invented numbers.** Every figure in the brief carries a provenance tag:
   `internal comps DB`, `external (CoStar cache)`, `broker-provided`,
   `listing agreement`, `county record`, or `Census (ACS/LODES)`. Demographic and key-facts data
   is **public Census data only** (ACS 5-year, Decennial, LEHD LODES) — never
   attribute it to Esri/BAO; Esri appears in our methodology docs only as a
   competitor comparison. If you don't have a number, leave the
   slot marked `[broker to confirm]` — never estimate.
5. **Broker-legible errors.** If a lookup fails, say what you couldn't get and
   move on ("County parcel lookup is unavailable right now — I'll mark owner
   of record as unconfirmed"). Never show a traceback.
6. **Stay interactive.** Batch questions (2–4 at a time, never a 20-question
   wall). Keep each enrichment step inside ~15 seconds; tell the broker what
   you're pulling while you pull it.
7. **No invented people.** Address the broker in the session directly as
   "you" — they carry the brief to Claude Design themselves. Never refer to
   anyone by name unless the broker introduced that name in this session
   (listing team members, client contacts). If you catch yourself writing a
   name nobody gave you, delete it.

## Phase 0 — Resolve the property

Open with a choice, not a field: **"Give me the property address — or just
drop the listing agreement (or any deal docs) and I'll pull everything from
it."**

If the broker uploads a listing agreement (or LOI, prior flyer, deal memo):
1. **Extract** everything the document carries: address, property/listing
   name, broker team, landlord/owner entity, deal type, listing term, asking
   rate/price if stated, suites/SF described.
2. **Read the extraction back** in one block for confirmation — extracted
   values are pre-fill, not gospel (agreements go stale; terms get amended).
3. Tag every figure that came from the document with provenance
   `listing agreement` and skip the questions it already answered — only ask
   what the document doesn't cover.
4. Note in the brief that the listing agreement is on file (this doubles as
   the marketing-authorization record the old Formstack collected).

If they give just an address, proceed as below.

Immediately auto-pull, in parallel where possible:
- `owner_lookup` — owner of record, mailing address
- `pull_business_key_facts` — the BAO-style key-facts set for the location
- `pull_demographic_summary` — headline demographics (1/3/5-mi or drive-time)

Show a one-screen recap: "Here's what I found for {address} — owner, county
facts, headline demographics. Correct property?" Fix before proceeding.

## Phase 1 — Deal basics (the questions only the broker can answer)

Batch 1:
- Deal type — lease, sale, or investment sale? (Sublease component? If so,
  capture the sublease expiration date.)
- Asset class — retail / office / industrial / flex / land / medical —
  **multiple allowed** (mixed-use office/retail is common; carry all that
  apply).
- What's being offered — SF available or total, suites/units, plus **max
  contiguous** and **smallest divisible** where multi-suite.
- Asking — rate ($/SF/yr + lease structure) or price. **Investment sale:**
  also capture NOI, cap rate, and the investment-property framing.
- Zoning fallback — if the county record returned null zoning, ask the
  broker here (they always know it).

Batch 2:
- The story: **suggest 3–5 highlights first**, drawn from what the data
  already shows (renovation year, location/corridor, pricing vs. market,
  suite range, demographics) — then ask the broker to keep, cut, reword, or
  add their own. Brokers react to a draft faster than they fill a blank box.
- **Location description** — a 4–6 sentence trade-area narrative, distinct
  from the bullets: the corridor and what it connects, nearby anchors
  (hospitals, banks, shopping centers, employers), surrounding uses, and why
  the trade area is proven. Draft it suggest-first from the pulled data +
  web context; broker rewords. This is the paragraph marketing teams always
  ask for.
- Photos/site plan: which images should the flyer feature? (collect files or
  note "broker will attach in Design")
- Broker team on the listing. **Resolve contacts, don't ask for typing:**
  check `registries/brokers.yaml` (in this skill) first — a registry entry
  with `confirmed` fields is canonical and must not be overridden by web
  data. If the broker isn't in the registry, web-search their Lee profile,
  present it marked *web-sourced — confirm before print* (titles on
  aggregator bios go stale and emails vary by domain), and once the broker
  confirms, tell them the registry should be updated. They never hand-type a
  contact block.
- Call to action — capture the **destination, not just the label**. A button
  on a digitally-distributed flyer must link somewhere: default is
  `mailto:{broker email}?subject=Tour Request — {property name}, {address}`;
  alternatives are `tel:` or a scheduling page. For print, the CTA is the
  contact block itself. Record which distribution mode(s) the broker intends.

## Phase 2 — Comp set (present → augment → select → narrate)

1. **Pull** comps matched to deal type and asset class:
   - Internal: `pull_unified_comps`
   - External: `search_external_sale_comps` / `search_external_lease_comps`
     (use `get_external_comp_detail` for rows the broker wants to inspect;
     `cache_external_rows` for rows that will be used)

   > **Known tool quirks (until lee-and-associates#75 ships):** the
   > `property_type` filter is case-sensitive — pass the DB's exact values:
   > `Office`, `Retail`, `Industrial`, `Flex Warehouse`, `Land`, `Lab Space`,
   > `100% Warehouse`, `Medcial Office` (sic — source typo). **Never pull
   > unfiltered**: the full book is ~776 rows / 325K characters and will
   > exhaust the session. If a filtered pull returns zero rows, retry once
   > with corrected capitalization — never with no filter. External lease
   > comps are empty today (sale-only snapshot, see issue #29) — expect zero
   > rows and fall back to internal without alarming the broker.
2. **Present** one numbered table, both sources merged and labeled:
   `# | Property | Date | SF | Rate or Price | $/SF | Source`.
3. **Augment** — ask: "Any comps you know that aren't here?" Accept them in
   whatever form the broker has: **a dropped Excel/CSV file** (parse it, map
   columns to the table schema, show the mapping for confirmation), **pasted
   text** (a rate table, an email excerpt), or free-form description.
   Normalize into the same columns, append labeled `broker-provided`, and
   read every normalized row back for confirmation before it can be selected.
4. **Select** — "Which comps make the flyer? (e.g., 1, 3, 5, and both of
   yours)". Record included AND excluded.
5. **Narrate** — draft 2–4 sentences positioning the subject against the
   *selected* set only (where the asking sits vs. the set's range/average,
   recency, proximity, any premium/discount story). Read it back; the broker
   can reword it.

## Phase 3 — Business key facts & demographics (same loop)

Present the pulled key facts and demographic fields as a **numbered checklist**
grouped by theme (population, incomes, daytime population, **traffic counts**,
household growth, consumer spending, …). Traffic counts (VPD/AADT) are a
standard broker ask for visibility-driven listings — no MCP tool serves them
yet (vpd-lookup port is lee-and-associates#23), so until it ships, ask the
broker for their figure and tag it `broker-provided`. Ask the broker to pick which items appear on
the flyer, and at which geography (1/3/5-mile or drive-time) where applicable.
Offer `pull_demographic_detail` for anything they want deeper before deciding.
Record the selections; unselected items do not appear anywhere in the brief.

**Metric legibility rules (a flyer reader sees the label with no methodology):**
- Every selected item gets a broker-legible display label in the brief. Raw
  metric names mislead: ACS "office workforce share" means *occupations of
  employed residents*, not people working in offices nearby — display it as
  **"White-collar resident workforce"** or swap in the LODES employee count
  ("X employees within 3 miles"), which is usually the better office-listing
  stat. Suggest the swap when the listing is office.
- When a value will surprise a reader (e.g., Bachelor's-or-higher near 70% in
  an affluent 1-mile ring), tell the broker what drives it and offer the
  3-mile figure as the steadier alternative. The number stays sourced either
  way — the choice of geography and metric is the broker's.

## Phase 4 — Assemble the brief

**Gate: do not create the brief file while questions remain open.** Building
first and asking after means the broker reviews a document that's already
stale. Before assembling:

1. Sweep for every unresolved slot (availability date, unconfirmed contacts,
   unselected options) and ask them **now**, in one batch.
2. Then ask the catch-all: **"Anything else I should know about this property
   or deal before I assemble the brief?"** (Brokers hold details no
   questionnaire anticipates — signage rights, a pending tenant, a story
   about the owner.)
3. Only when every question is answered — or the broker explicitly says
   "leave it unconfirmed" for a given slot — assemble the file, once.

Fill `templates/flyer-brief-template.md` (same folder as this skill). Rules:
- Narrative blocks come from the broker's confirmed wording in Phases 1–2.
- Every number carries its provenance tag inline.
- The Comp Set section lists only selected comps; excluded comps go in the
  provenance appendix (so the selection is auditable, not silent).
- Name the file `flyer-brief-{street-address-slug}-{YYYY-MM-DD}.md`.

Show the broker the finished brief for a confirm/edit pass.

## Phase 5 — Write-back to the comps database (the flywheel)

After the brief is confirmed, two write-backs — **each requires explicit
broker confirmation before touching the production database**:

1. **Broker-provided comps** → `lee_comps_add_write`, attributed
   (`source: broker-provided`, broker name, date). Check the tool's expected
   fields (or `describe_table`) and map the normalized rows; anything that
   doesn't map, flag rather than guess.
2. **The subject listing itself** → offer to record it as an
   on-market/availability record with the flyer's asking terms, same
   attribution pattern.

Report exactly what was written ("Added 2 comps + the subject listing to the
comps DB") or what was skipped and why.

## Phase 6 — Handoff to Claude Design

Claude Design has no API — **you** (the broker in this session) carry the
brief over yourself (~30 seconds). Give these instructions addressed to the
broker directly:

1. Go to **claude.ai/design** → new prototype → select the
   **Lee & Associates** design system (move it above any org default).
2. Attach the brief file (+ photos).
3. Paste this generation prompt, filled in:

> Create a commercial real estate marketing flyer from the attached brief.
> Use every number exactly as written in the brief — do not recalculate,
> round, or invent figures. **Every figure on the flyer must appear in the
> brief; if a number is not in the brief, it does not go on the flyer.**
> Source attributions (including data vintages) must be copied from the
> brief verbatim, identically everywhere they appear — never substitute,
> add, or mix data-source names. **Let the amount of selected content drive
> the length:** a lean selection is one page; a fuller selection (comp set +
> full market table + photos) may run two — never shrink type or cram to
> force one page, and never pad to fill two. Layout: hero banner with
> property name and asking terms, highlights block, location description,
> comp table as listed in the brief's Comp Set section (omit the section
> only if the brief marks comps "omitted by broker"), the market-data items
> in its Market Data section (only those), broker contact footer with the
> brief's CTA label and destination verbatim. **If no property photo is
> attached, render the hero as a solid brand banner — no placeholder text
> may appear on the artifact.** All text must meet readable contrast (white
> on brand red, never red-on-red). Lee & Associates brand throughout.

Then the broker tweaks visually in Design — that's the polish step, and it's
theirs.

## Failure modes

- MCP server unreachable → continue with broker-provided data only; mark every
  affected section `[data service unavailable — broker to verify]`.
- No comps returned → say so plainly, go straight to broker-provided comps.
- Broker wants to skip a phase → let them; mark the section "omitted by
  broker" in the brief rather than silently dropping it.
