⚠ SAMPLE — FICTIONAL TEST CLIENT Priya Ashworth-Nakagawa is not a real person. No real client, contact or vendor data appears on this page. Built for Joseph’s review, 2026-08-09 14:30 CDT.
Client Portal · Cultivate + Curate

Priya Ashworth-Nakagawa

BASE TIER · past single-home buyer · with us since 2024-03 · tag [Ashworth-Nakagawa/Ashland] (BUYER-side)

7 blocks rendered 7 layers deep in total deepest block 1 of 4 📂BASE tier
Canopy (Overview)
Understory (Workflow)
Root Level (Build)

🔥 What’s happening now DEPTH 1/4

Nothing of ours is in flight for you right now — which is the right answer. So here is your home and your street instead.

1400 block of Ashland St
Houston Heights · yours since 2024-03
$750,000
Houston Heights median sale, 2026 (partial year)
Market as of 2026-07-11 · MLS-derived, tools/value_trends_build.py

🏠 Your home DEPTH 1/4

Your home 
Address1400 block of Ashland St
NeighborhoodHouston Heights
Beds / baths3 / 2
Size1,980 sq ft
Yours since2024-03
Current valueMISSINGNo AVM / home-valuation feed exists anywhere on this box. No tool, no credential, no source. (Requirements §10 item 1.) A number here would be invented.

📈 Your neighborhood DEPTH 1/4

Houston Heights 27,802 comparable sales on file

$750,000
median sale price · 2026 (partial year)
$363
avg price per sq ft · 2026
40 days
avg days on market · 2026
Houston Heights as of 2026-07-11 · MLS-derived dataset on this box

🌟 Your referral impact DEPTH 1/4

1
introductions you have made · last 24 months
#14
your private standing among 62 client households
1
of those became someone we closed for

🎯 Two more introductions reaches the top ten.

Private by default. You see your own standing and your own gap. You never see another client’s name, rank or count — and they never see yours.

📚 Resources that don’t expire DEPTH 1/4

ResourceKindContent ladder tier
What your first year of ownership actually costsHow-toEvergreen Baselines
Protest your HCAD appraisal — the 20-minute versionHow-toTimeless Insights
Storm-ready: the Houston homeowner checklist sample link target — public TPJG siteHelpful tipsAnchor Content

🔨 Our preferred people DEPTH 1/4

CategoryPreferred partnerWhen you’d need them 
HandymanFitzroy & Blunt Home Services FICTIONALafter you closeIntroduce me
LandscaperBayou Bend Grounds Co. FICTIONALafter you close · while under contractIntroduce me
Pest ControlCicada Pest Solutions FICTIONALIntroduce me
Vendor directory as of 2026-08-09 · 902 vendors on file, 85 flagged preferred

✍ A note from us DEPTH 1/4

Priya — the Heights kept moving this year, and your block moved with it. Nothing here needs anything from you. If the pecan out front finally loses the argument with a storm, the tree crew below is the one we call ourselves. And if anyone you know starts asking the questions you were asking in early 2024, send them our way — we will take it from there.

— Joseph & Keri · The Property Joes Group

🪵 The bespoke depth rule, as data

Joseph: “Depending upon the complexity and the sophistication of their portfolio will determine how deep and wide their portal will be.”

Both sample portals come out of one generator and one code path. The only thing that differs is the client record. Width = which blocks exist at all. Depth = how many layers each block goes (1 headline → 2 breakdown → 3 history → 4 method/source).

What put this client on this tier

InputValue
Transactions on file1
Roles heldbuyer
Individual or entityindividual
Properties owned1
Referrals given1
Manual override by JosephMISSING
Resolved tierBASE
Rule applied1 transaction, no entity, <2 referrals -> BASE (PROPOSED, not ruled)

These thresholds are NOT approved

Q1 in the requirements is open: Joseph has defined no tiers and no thresholds, and there is no portfolio-complexity score anywhere in the doc or on our box. The rule above is the proposed derivation (DEPTH-3), rendered here so it can be argued with rather than buried in code. The intended design is machine derives → Joseph overrides → the override always wins — our own calibration across 140 rulings says his judgement outranks our filter (his sponsor sheet 100%, our usage heuristic 28%).

📑 This record’s block manifest

BlockidDepth here (BASE)Depth on the DEEP sample
What’s happening nownow1 / 43 / 4
Your homehome1 / 43 / 4
Your neighborhoodneighborhood1 / 44 / 4
Your referral impactreferral1 / 43 / 4
Resources that don’t expireresources1 / 42 / 4
Our preferred peoplevendors1 / 43 / 4
A note from usnote1 / 41 / 4

Blocks the DEEP record earns that this one does not: local, entity, documents. They are not hidden by CSS — they are never generated, because this record does not list them.

⚖ Side by side

 BASE sampleDEEP sample
Blocks rendered (width)710
Total layers (depth)725
Deepest single block1 of 44 of 4
Properties rendered14
Neighborhood datasets13
Live dealnoyes
Generatorclient_portal_sample_build.pyclient_portal_sample_build.py
Code pathidenticalidentical

The point of the exercise. If those two columns had come out the same, the architecture would be wrong — bespoke-ness would have to be hand-built per client, which is the one thing the rule forbids (DEPTH-1: one generator; bespoke-ness is data, never a second generator). Far better to find that out on a fictional client.

🔒 What a client would never see

Held about this clientVisible to them?Why
Their transactions, documents, homeyestheirs
Their own referral count and private rankyesthis is the return engine
Another client’s name, rank or countneverprivate by default (TO-6)
Our frequency / vendor scoresneverour commercial intelligence
Our internal classification and notesneverour commercial intelligence
The persona profile we hold on themneverQ6 and Q7, both unresolved

Q6 is open: what a client is allowed to learn about how we rank them is a relationship judgement, not an engineering one. The split above is the recommendation, not the ruling.

⚠ This page is deliberately wrong in exactly one way

It is classified internal — the page type for creator-only pages — so it carries the library navigation furniture (the “Library” and “Full Index” pills, bottom left). A real client portal must never carry that furniture. It is a live route into the private library and a map of the whole estate.

We typed it internal on purpose, because that is honestly what it is — a review artifact for Joseph — and because the correct type does not exist yet. config/page-types.json has exactly three types (internal, grouped, public) and fails closed. A fourth — client-facing: private, no library furniture, not public, not indexed — must be added before a single real portal page can deploy (TREE-6). Pretending otherwise would have been the easier lie.

🔧 How this page was built

PieceWhere it comes from
Generatortools/client_portal_sample_build.py — one file, one code path, both samples
This client recorddata/client-portal-samples/base.json
Tablestools/lib_table_standard.py — the ONE shared component (sortable, filterable, row-moveable, first column frozen). Not re-implemented here.
Market figures<slug>-value-trends/data.json, built by tools/value_trends_build.py from MLS exports
Local insights + maplocal_interest_layer.py — keyless, Leaflet 1.9.4 + OpenStreetMap. No new mapping dependency was added.
Vendor categories + phasesdata/vendors/directory.json (902 vendors) — taxonomy and counts only
Brandtools/brand_gate.py — client-facing is The Curator, locked by Joseph 2026-05-15
Page furnitureCanopy / Understory / Root Level tabs, already shipped on /digital-avatar/ and /voice-digitization/
Publishing gatetools/page_type_gate.py + config/page-types.json
Change recordtools/lib_change_log.py/changes/

🎭 What is fictional, and what is real

On this pageStatusWhat a real build would need
The household, the names, the client tagINVENTEDa real client record — and Q2 (mask polarity) and Q3 (auth) resolved first
Transaction history, deal status, milestone datesINVENTEDconfig/transaction-parties/*.json plus the title company’s iCal invite as the source of truth for dates — never a hand-typed snapshot
Addresses (block-level only, never a parcel)INVENTEDthe real property record. Block-level here on purpose, so the sample points at no real household
Referral counts, private rank, next-rung gapINVENTEDa referral graph we do not currently have — RM’s surface is a “Referrals Generated YTD” counter that resets every Jan 1
The preferred-vendor businessesINVENTEDthe 902-row directory plus the RM “Preferred Partners” group (94)
Neighborhood medians, $/sq ft, days on market, yieldREALalready real — MLS-derived, on this box, dated
Vendor categories, phase tags, directory countsREALalready real
Local places, coordinates and the mapREALalready real — curated pins + OpenStreetMap
Every “current value” cellMISSINGan AVM / valuation feed. None exists anywhere on this box — no tool, no credential, no source. That is a procurement decision, not an engineering one.

🛑 What blocks a real client portal today

#BlockerWhy it stops a real build
Q3No client-facing authentication exists.Our own live /clients/ page says it plainly: “They are not password-protected — the URL is the credential.” Fine for a page only Joseph opens. Not fine for a page carrying a client’s contracts, settlement sheets and referral rank. That is why this sample client is fictional.
Q2Mask polarity inverts./clients/<slug>/ exists and is built FOR JOSEPH — which is exactly why one live file shows 11 contacts and masks 17. A client portal is built FOR THE CLIENT: same data, opposite audience. assert_no_leak() has to run once per audience.
TREE-6The client-facing page type does not exist.The publishing gate has three types and fails closed. No portal page can legally deploy until a fourth is added.
TI-7The notification transport has no consumer./api/tour-email enqueues into KV and names tools/tour_email_poller.py, which does not exist on this box. Vendor/agent auto-notification cannot be built on a promise.
§10No AVM feed.The highest-return-frequency block in the inspiration material, and we hold zero data for it.

Full requirements, the reuse inventory and all 13 open questions: exports/briefs/client-portal-requirements.md. Q1, Q2 and Q3 block any real build.

🕑 Freshness of everything on this page

DataAs ofSource
Houston Heights market data2026-07-11heights-value-trends/data.json
Vendor directory2026-08-09data/vendors/directory.json
Local-insight pins2026-06-10local_interest_layer.HEIGHTS_PINS
This page2026-08-09 14:30 CDTthis build

Every block on the Canopy tab carries its own as-of stamp. Nothing unknown is guessed — it renders MISSING with the reason.