I want a realistic sale valuation for 68 High Hill Road. The condition of the home is average, move-in ready, and I'm weighing this as a near-term sale. Base the concluded value and range on the comparable sales, the automated estimates , and the local market read, and note the 3-year appreciation outlook so I can decide on timing.
Found the subject: property id `f64112a3c8aff7f45887c4d691d33f61`. Now pulling full residential attributes, valuation history, sales, tax, market topics, and MLS/Zillow facts in parallel.
Now pulling subject residential data and zip market data in parallel.
python3 -c "
import datetime
listings = [
(66,'High Hill Road',620000,1532,1973,0.588,1788408000000,2,3),
(372,'Bramertown Road',835000,2736,1985,4.2,1787803200000,2.5,4),
(27,'Deer Path Road',740000,2620,1965,0.623,1784174400000,2,4),
(57,'Fawn Hill Road',770000,2576,1964,1.1,1782100800000,2.5,5),
(46,'Nursery Road',615000,2050,1967,0.506,1777608000000,2.5,4),
(8,'Cardinal Court',760000,2373,1999,1.0,1777003200000,2.5,3),
(35,'Deer Path Road',690000,2805,1968,0.778,1768453200000,2.5,4),
(444,'Bramertown Road',850000,2206,1982,1.4,1767934800000,2,3),
(165,'Fawn Hill Road',599900,2555,1961,0.971,1767157200000,2.5,3),
(75,'Clubhouse Road',550000,1956,1900,0.184,1765342800000,2,3),
(152,'Fawn Hill Road',600000,2948,1968,0.484,1764133200000,3,5),
(6,'Oak Place',520000,1232,1957,0.448,1763701200000,1,3),
(63,'Fawn Hill Road',610000,1560,1969,0.520,1763096400000,2.5,3),
(71,'Fawn Hill Road',640000,2048,1966,0.705,1760587200000,3,4),
]
for street, name, price, sqft, yr, lot, ts, baths, beds in listings:
d = datetime.datetime.utcfromtimestamp(ts/1000)
print(street, name, price, sqft, yr, lot, d.date(), baths, beds, round(price/sqft))
"
cat << 'EOF' > /vercel/sandbox/comp_calc.py
import math
subject = (41.229513, -74.202949)
subject_sqft = 2600
subject_avm = 737045.42
comps = [
("66 High Hill Rd", 620000, 1532, 1973, 0.588, (41.22985,-74.20292), "2026-09-03"),
("27 Deer Path Rd", 740000, 2620, 1965, 0.623, (41.23221,-74.204), "2026-07-16"),
("57 Fawn Hill Rd", 770000, 2576, 1964, 1.1, (41.233696,-74.20772), "2026-06-22"),
("46 Nursery Rd", 615000, 2050, 1967, 0.506, (41.19366,-74.18851), "2026-05-01"),
("35 Deer Path Rd", 690000, 2805, 1968, 0.778, (41.23215,-74.20309), "2026-01-15"),
("71 Fawn Hill Rd", 640000, 2048, 1966, 0.705, (41.233562,-74.206245), "2025-10-16"),
("152 Fawn Hill Rd", 600000, 2948, 1968, 0.484, (41.235275,-74.20417), "2025-11-26"),
]
def haversine(a,b):
lat1,lon1=a; lat2,lon2=b
R=3958.8
p1,p2=math.radians(lat1),math.radians(lat2)
dphi=math.radians(lat2-lat1)
dlmb=math.radians(lon2-lon1)
x=math.sin(dphi/2)**2+math.cos(p1)*math.cos(p2)*math.sin(dlmb/2)**2
return R*2*math.atan2(math.sqrt(x),math.sqrt(1-x))
print(f"{'Comp':<18}{'Price':>10}{'Sqft':>8}{'$/sqft':>10}{'Yr':>6}{'Lot(ac)':>9}{'Dist(mi)':>10}{'Sold':>12}")
psf_list=[]
for name,price,sqft,yr,lot,loc,sold in comps:
d = haversine(subject, loc)
psf = price/sqft
psf_list.append(psf)
print(f"{name:<18}{price:>10,}{sqft:>8}{psf:>10.0f}{yr:>6}{lot:>9.2f}{d:>10.2f}{sold:>12}")
psf_list.sort()
n=len(psf_list)
median_psf = psf_list[n//2] if n%2==1 else (psf_list[n//2-1]+psf_list[n//2])/2
avg_psf = sum(psf_list)/n
print(f"\nAvg $/sqft: {avg_psf:.0f} Median $/sqft: {median_psf:.0f} n={n}")
# implied value at subject sqft using avg and median psf (average condition = interquartile baseline)
print(f"Implied value @ subject sqft ({subject_sqft}) using avg psf: {avg_psf*subject_sqft:,.0f}")
print(f"Implied value @ subject sqft using median psf: {median_psf*subject_sqft:,.0f}")
# quartiles
sorted_psf = sorted(psf_list)
import statistics
q1 = statistics.quantiles(sorted_psf, n=4)[0]
q3 = statistics.quantiles(sorted_psf, n=4)[2]
print(f"IQR $/sqft: {q1:.0f} - {q3:.0f} -> value range {q1*subject_sqft:,.0f} - {q3*subject_sqft:,.0f}")
EOF
python3 /vercel/sandbox/comp_calc.pycat << 'EOF' >> /vercel/sandbox/comp_calc.py
print("\n--- Excluding 46 Nursery Rd (2.6mi, outside 2mi pref) ---")
comps2 = [c for c in comps if c[0] != "46 Nursery Rd"]
psf2 = [p/s for _,p,s,_,_,_,_ in comps2]
avg2 = sum(psf2)/len(psf2)
med2 = sorted(psf2)[len(psf2)//2]
print(f"n={len(psf2)} avg psf={avg2:.0f} median psf={med2:.0f}")
print(f"Implied value @ subject sqft: avg={avg2*subject_sqft:,.0f} median={med2*subject_sqft:,.0f}")
q1b = statistics.quantiles(sorted(psf2), n=4)[0]
q3b = statistics.quantiles(sorted(psf2), n=4)[2]
print(f"IQR range: {q1b*subject_sqft:,.0f} - {q3b*subject_sqft:,.0f}")
EOF
python3 /vercel/sandbox/comp_calc.pycat << 'EOF' >> /vercel/sandbox/comp_calc.py
print("\n--- Core 5 comps (size within +/-30%, distance <0.5mi, vintage 1961-1981) ---")
core_names = {"27 Deer Path Rd","57 Fawn Hill Rd","35 Deer Path Rd","71 Fawn Hill Rd","152 Fawn Hill Rd"}
core = [c for c in comps if c[0] in core_names]
psf3 = [p/s for _,p,s,_,_,_,_ in core]
avg3 = sum(psf3)/len(psf3)
med3 = sorted(psf3)[len(psf3)//2]
print(f"n={len(core)} avg psf={avg3:.0f} median psf={med3:.0f}")
val_avg = avg3*subject_sqft
val_med = med3*subject_sqft
print(f"Implied value @ subject sqft: avg-psf={val_avg:,.0f} median-psf={val_med:,.0f}")
q1c = statistics.quantiles(sorted(psf3), n=4)[0]
q3c = statistics.quantiles(sorted(psf3), n=4)[2]
print(f"IQR $/sqft: {q1c:.0f}-{q3c:.0f} -> value range {q1c*subject_sqft:,.0f} - {q3c*subject_sqft:,.0f}")
# time adjustment: comps sold 2025-10 to 2026-07, zip median value roughly flat (T12 +0.49%) over that stretch, immaterial - skip material adjustment
# reconcile with AVM 737045 and comp psf midpoint
comp_point_estimate = (val_avg+val_med)/2
print(f"\nComp point estimate (avg of avg/median-psf method): {comp_point_estimate:,.0f}")
print(f"Datamart AVM: {subject_avm:,.0f} (conf 93.2, n=12 estimates)")
blended = (comp_point_estimate + subject_avm)/2
print(f"Blended comp+AVM midpoint: {blended:,.0f}")
EOF
python3 /vercel/sandbox/comp_calc.pyNow running the forecasting engine for the 3-year appreciation outlook.
python skills/forecasting/scripts/forecast.py --version
sed -n '1,400p' skills/forecasting/references/request.md | grep -n -A 15 "structural_ceiling"
cat << 'EOF' > /vercel/sandbox/build_payload.py
import json
zip_ts = [
("2026-07-01",745190.50),("2026-06-01",723586.00),("2026-05-01",727262.00),
("2026-04-01",715627.00),("2026-03-01",691874.00),("2026-02-01",698758.00),
("2026-01-01",674843.00),("2025-12-01",690297.00),("2025-11-01",708359.50),
("2025-10-01",694670.50),("2025-09-01",734921.50),("2025-08-01",678905.50),
("2025-07-01",704733.00),("2025-06-01",695581.00),("2025-05-01",682066.50),
("2025-04-01",757421.00),("2025-03-01",754046.00),("2025-02-01",741955.00),
("2025-01-01",749014.00),("2024-12-01",744022.00),("2024-11-01",688042.50),
("2024-10-01",685991.50),("2024-09-01",668135.00),("2024-08-01",665415.00),
("2024-07-01",645594.50),("2024-06-01",664359.00),("2024-05-01",608427.00),
("2024-04-01",632567.50),("2024-03-01",605863.00),("2024-02-01",615305.50),
]
county_ts = [
("2026-07-01",475075.00),("2026-06-01",473073.00),("2026-05-01",470574.00),
("2026-04-01",464511.00),("2026-03-01",460659.50),("2026-02-01",464310.00),
("2026-01-01",462300.00),("2025-12-01",462882.00),("2025-11-01",465000.00),
("2025-10-01",463188.00),("2025-09-01",469435.00),("2025-08-01",454951.50),
("2025-07-01",452402.00),("2025-06-01",447000.00),("2025-05-01",433909.00),
("2025-04-01",451362.00),("2025-03-01",448704.00),("2025-02-01",442509.00),
("2025-01-01",449560.00),("2024-12-01",448107.00),("2024-11-01",441649.00),
("2024-10-01",446833.00),("2024-09-01",444428.00),("2024-08-01",446091.00),
("2024-07-01",434500.00),("2024-06-01",437914.00),("2024-05-01",404153.00),
("2024-04-01",417611.00),("2024-03-01",402629.50),("2024-02-01",401321.00),
]
zip_ts_sorted = sorted(zip_ts, key=lambda x: x[0])
county_ts_sorted = sorted(county_ts, key=lambda x: x[0])
history = [{"period": p, "value": v, "source": "datamart"} for p,v in zip_ts_sorted]
peer_history = [{"period": p, "value": v, "source": "datamart"} for p,v in county_ts_sorted]
payload = {
"metric": {"name": "median home value for zip 10987, Tuxedo Park NY", "units": "$", "family": "generic"},
"subject": {"entity_type": "zipcode", "entity_id": "10987", "label": "Tuxedo Park, NY (10987)"},
"horizon": {"years": 3, "intervals": "annual"},
"history": history,
"peer_history": peer_history,
"history_check": {"count": len(zip_ts_sorted), "last_value": zip_ts_sorted[-1][1], "sum": round(sum(v for _,v in zip_ts_sorted),2)},
"peer_history_check": {"count": len(county_ts_sorted), "last_value": county_ts_sorted[-1][1], "sum": round(sum(v for _,v in county_ts_sorted),2)},
"scenarios": ["base","upside","downside"],
"caller_disclosures": {
"peer_selection_basis": "Orange County NY (parent county of zip 10987); county median value ~$465-475K vs zip's ~$690-745K premium tier, same rate/lock-in cycle, used for peer mean-reversion reference only",
"signals_omitted": "structural_ceiling omitted - no defended numeric value-to-income ceiling sourced from datamart; zip value-to-income ratio is 4.32 (about-average nationally, 71st pctile), noted in narrative instead"
}
}
with open("/vercel/sandbox/payload.json","w") as f:
json.dump(payload, f)
print("history n=", len(history), "peer n=", len(peer_history))
EOF
python3 /vercel/sandbox/build_payload.py
python skills/forecasting/scripts/forecast.py --file /vercel/sandbox/payload.jsoncat << 'EOF' > /vercel/sandbox/final_calc.py
concluded_value = 725000
base_rates = [0.0599, 0.0475, 0.0315]
upside_rates = [0.1009, 0.0946, 0.0856]
downside_rates = [0.019, 0.0005, -0.0226]
def compound(v0, rates):
v = v0
path = []
for r in rates:
v = v * (1+r)
path.append(v)
return path
base_path = compound(concluded_value, base_rates)
upside_path = compound(concluded_value, upside_rates)
downside_path = compound(concluded_value, downside_rates)
print("Base case 3yr path:", [round(x) for x in base_path], " cumulative %:", round((base_path[-1]/concluded_value-1)*100,1))
print("Upside case 3yr path:", [round(x) for x in upside_path], " cumulative %:", round((upside_path[-1]/concluded_value-1)*100,1))
print("Downside case 3yr path:", [round(x) for x in downside_path], " cumulative %:", round((downside_path[-1]/concluded_value-1)*100,1))
# CAGR base case
cagr_base = (base_path[-1]/concluded_value)**(1/3)-1
print("Base CAGR:", round(cagr_base*100,2),"%")
# Return since purchase (owner aside)
last_sale = 535000
import datetime
last_sale_date = datetime.date(2021,7,8)
today = datetime.date(2026,9,15)
years = (today-last_sale_date).days/365.25
total_appr = concluded_value/last_sale - 1
cagr_since_purchase = (concluded_value/last_sale)**(1/years)-1
print(f"Years since purchase: {years:.1f}")
print(f"Total appreciation since 2021 purchase: {total_appr*100:.1f}% CAGR: {cagr_since_purchase*100:.1f}%")
EOF
python3 /vercel/sandbox/final_calc.pycat << 'EOF' > /vercel/sandbox/final_calc2.py
concluded_value = 735000
base_rates = [0.0599, 0.0475, 0.0315]
upside_rates = [0.1009, 0.0946, 0.0856]
downside_rates = [0.019, 0.0005, -0.0226]
def compound(v0, rates):
v = v0
path = []
for r in rates:
v = v * (1+r)
path.append(v)
return path
base_path = compound(concluded_value, base_rates)
upside_path = compound(concluded_value, upside_rates)
downside_path = compound(concluded_value, downside_rates)
print("Base case 3yr path:", [round(x) for x in base_path], " cumulative %:", round((base_path[-1]/concluded_value-1)*100,1))
print("Upside case 3yr path:", [round(x) for x in upside_path], " cumulative %:", round((upside_path[-1]/concluded_value-1)*100,1))
print("Downside case 3yr path:", [round(x) for x in downside_path], " cumulative %:", round((downside_path[-1]/concluded_value-1)*100,1))
cagr_base = (base_path[-1]/concluded_value)**(1/3)-1
print("Base CAGR:", round(cagr_base*100,2),"%")
last_sale = 535000
import datetime
last_sale_date = datetime.date(2021,7,8)
today = datetime.date(2026,9,15)
years = (today-last_sale_date).days/365.25
total_appr = concluded_value/last_sale - 1
cagr_since_purchase = (concluded_value/last_sale)**(1/years)-1
print(f"Years since purchase: {years:.1f}")
print(f"Total appreciation since 2021 purchase: {total_appr*100:.1f}% CAGR: {cagr_since_purchase*100:.1f}%")
# comp core-5 avg sqft/vintage/lot vs subject
core = [
("27 Deer Path Rd", 740000, 2620, 1965, 0.623),
("57 Fawn Hill Rd", 770000, 2576, 1964, 1.1),
("35 Deer Path Rd", 690000, 2805, 1968, 0.778),
("71 Fawn Hill Rd", 640000, 2048, 1966, 0.705),
("152 Fawn Hill Rd", 600000, 2948, 1968, 0.484),
]
n=len(core)
avg_sqft = sum(c[2] for c in core)/n
avg_yr = sum(c[3] for c in core)/n
avg_lot = sum(c[4] for c in core)/n
print(f"Core-5 avg sqft={avg_sqft:.0f} avg yr={avg_yr:.0f} avg lot={avg_lot:.2f}")
psf = sorted([c[1]/c[2] for c in core])
print("psf sorted:", [round(p) for p in psf])
median_psf = psf[len(psf)//2]
print("median psf:", round(median_psf), " -> value at subject 2600sf:", round(median_psf*2600))
EOF
python3 /vercel/sandbox/final_calc2.pyNow composing the final deliverable.
<a>Comps property collection</a>
echo done
68 High Hill Road values at $735,000, with sold comps, the AVM, and market data all landing within a tight band — and the sale-timing math favors moving now rather than waiting out the next three years.
| Metric | Value |
|---|---|
| Current value (concluded) | $735,000 |
| Value range | $700,000 – $770,000 |
| 3-year projected appreciation (base case) | 4.6%/yr (14.5% cumulative) |
| Appreciation since 2021 purchase | +37.4% ($535,000 → $735,000, 6.3%/yr)1 |
Executive summary. Three independent reads converge tightly: five closely-matched sold comps within 0.4 miles imply $734,000 (median price-per-square-foot method), the platform AVM reads $737,000 (93% confidence, 12 estimates), and the local market's own trajectory supports both. That agreement is the headline — this isn't a case where methods fight each other. A Zestimate wasn't disclosed for this address, so it isn't part of the triangulation. The market read is modestly positive but decelerating: Tuxedo's zip has run hot since 2024 (+49% over 5 years) , and the forecast engine flags that pace as unsustainable — its base case still shows +4.6%/year, but tags the projection "boom extrapolation suspected" since recent growth outruns the structural long-run rate . For a near-term sale, that argues for listing now rather than banking on further near-term lift: the upside case (rates easing) gets you to 8.6%/yr by year three, but the downside case (rates holding or drifting up) is flat-to-negative by year three. Two risks worth flagging: (1) the town's median sale price fell 16.5% over the trailing 12 months on a thin sample (37 sales) — likely noise given the value series kept climbing, but it means individual transactions here are lumpy and a buyer could anchor low; (2) the area's mortgage-rate lock-in is severe (median 3.6% vs. today's market) , which keeps competing inventory scarce — a tailwind for your list price, not a headwind.
This home. A 4-bed/3-bath, 2,600 sqft colonial built in 1971 on a 0.71-acre lot in Tuxedo Park's Laurel Ridge subdivision , with a 750-sqft garage. MLS-reported bed/bath counts match the assessor record — no discrepancy to flag. Last sold July 2021 for $535,000 ; at $735,000 today that's +37.4% (6.3%/yr) over 5.2 years, a useful data point if you're the owner but not load-bearing for the valuation.
What the comparable sales say. Five sold comps within 0.4 miles, all built 1964–1968 (vs. subject's 1971) and averaging 2,599 sqft — essentially identical footprint to the subject — sold between October 2025 and July 2026 for $600,000–$770,000 ($204–$312/sqft) . The spread in price-per-square-foot reflects condition dispersion in this comp set (one comp likely below-average, pulling the low end); median $/sqft ($282) applied to the subject's 2,600 sqft implies $734,000, right in line with the AVM. A sixth data point — 66 High Hill Road, literally next door — sold this month for $620,000, but at just 1,532 sqft it's 41% smaller and priced at a much higher $405/sqft, consistent with smaller homes commanding a premium rate; it's useful as a locational proof point, not a size-comparable. Subject sits mid-pack: matched on size and lot, slightly newer than the comp set, with condition (average, move-in ready) placing it near the interquartile baseline rather than either tail.
Valuation and how I got there. Sales comparison drove the estimate: the five core comps are so closely matched on size (2,599 sqft avg vs. subject's 2,600), lot (0.74 acres avg vs. 0.71), and vintage (1966 avg vs. 1971) that no material size, lot, or vintage adjustment was needed — comparable selection did the adjusting.
| Factor | Subject | Comps (avg) | Adjustment |
|---|---|---|---|
| Size | 2,600 sqft | 2,599 sqft | None |
| Lot | 0.71 acres | 0.74 acres | None |
| Vintage | 1971 | 1966 | None |
| Location | Laurel Ridge | Fawn Hill / Deer Path, 0.2–0.4 mi | None |
| Condition | Average, move-in ready | Mixed (median = average) | Use median $/sqft |
Median comp $/sqft ($282) × subject sqft = $734,000 , the datamart AVM reads $737,000 , and the two converge within 0.4% of each other — a stronger tie-out than most valuations get. I concluded $735,000, the midpoint. No Zestimate anchor was available for this address, so it plays no role in the reconciliation.
Market outlook. Tuxedo Park's zip has run well ahead of its own history — median value +49% over 5 years, though only +0.5% in the trailing 12 months, meaning the run has already cooled . Three forward drivers: rates/affordability — the area's value-to-income ratio (4.3x) sits at the 71st national percentile, "about average," so there's no ceiling constraint pressing down on prices ; supply — Orange County's single-family permit pace has been flat-to-declining (422 units trailing-12mo vs. 471 the prior year) , and the severe rate lock-in (median 3.6% vs. today's market) keeps existing owners from listing, both scarcity tailwinds; local economy — net migration is barely positive (+17 households) but the households moving in earn $22,900/year more than those leaving, a modest wealth-upgrade signal, not a growth engine . The forecast carries medium confidence: the engine's boom-extrapolation guard fired because recent growth (5.4%/yr) runs well above its structural terminal rate, so it damped the trajectory rather than carrying the recent pace forward; a peer-mismatch flag also fired because Orange County overall (median $465–475K) sits in a different price tier than this premium enclave and isn't a clean reversion anchor . Both flags reduce confidence in the outlook, not in the current point value.
| Scenario | Annual % (Yr1/Yr2/Yr3) | Value in 3 years | What it assumes |
|---|---|---|---|
| Base | 6.0% / 4.8% / 3.2% | $842,000 | Growth decelerates toward trend as the recent boom cools |
| Upside | 10.1% / 9.5% / 8.6% | $962,000 | Rates ease, lock-in loosens, demand re-accelerates |
| Downside | 1.9% / 0.1% / -2.3% | $732,000 | Rates hold or drift up, the recent run partly unwinds |
Conclusion. $735,000 is well-supported by comps that need almost no adjustment and an AVM that lands within half a percent of it — this is a high-confidence point value. The 3-year outlook is where the real decision lives: the base case is a modest, decelerating climb (+14.5% cumulative), but the range between upside and downside is wide ($962K vs. $732K) and hinges almost entirely on mortgage rates easing. Given severe rate lock-in is currently supporting your price by keeping competing listings off the market, a rate-easing scenario that helps buyers also unfreezes more sellers — a wash you can't count on. For a near-term sale, the market backs a listing now, price near $735,000–$750,000 to reflect the home's average-but-move-in-ready condition against a comp set with some below-average outliers dragging the low end, and don't bank on holding for upside that's conditional on a rate move outside your control.
This valuation is for informational purposes only and is not a formal appraisal. Actual condition, inspection findings, and market timing can move the figure; a licensed appraiser is required for lending, tax, estate, or legal purposes.
This is a read-only snapshot of a RealAI analysis.