Currently Shipping AI into a real-estate acquisitions workflow Location San Mateo, CA Updated 2026-10-20
§ · Writing

Builder notes on the AI tools I run on real deals.

One idea per post. Architecture decisions, things I tried first and abandoned, what I'd do differently.

  1. 032

    A missing total is not a zero

    A formula without a saved calculated answer became zero, and the underwriting model treated it as actual income.

    AI
    2026 · 09 · 26
  2. 033

    A skipped test counted as a pass

    A release record now distinguishes passing checks from required checks that never ran, on each code revision and platform.

    AI
    2026 · 09 · 26
  3. 034

    My tests passed. The next tool still read the wrong number.

    A passing parser test could not tell me whether the saved workbook supplied the right number to the next tool.

    AI
    2026 · 09 · 26
  4. 035

    A passing test wrote to my production database

    The test checked its result, but nothing stopped it from writing fake rows into the live bug queue.

    AI
    2026 · 09 · 26
  5. 036

    Every source request failed. The loader reported success.

    Zero rows can mean no new records, or that the loader never reached its source. My tests needed to tell those apart.

    AI
    2026 · 09 · 26
  6. 017

    Turning concession banners into usable rent data

    The promotion on the marketing page may be missing from the availability feed.

    AI
    2026 · 09 · 15
  7. 018

    Why I kept the existing underwriting workbooks

    The existing filenames, tabs and labels turned out to be interfaces other tools depended on.

    AI
    2026 · 09 · 15
  8. 019

    Adding sign-in and revocation to my MCP server

    Remote access needs a way to grant permission, recognize a caller and withdraw that permission.

    AI
    2026 · 09 · 15
  9. 020

    Why a rent range is not a list of observed rents

    Minimum and maximum prices lose the distribution a rent benchmark needs.

    AI
    2026 · 09 · 15
  10. 021

    Making the rent schedule and freshness checks agree

    A market that is not due this week should not look like a failed collection run.

    AI
    2026 · 09 · 15
  11. 022

    Why the rent scraper tries more than one platform reader

    A platform signal on a leasing page does not guarantee its reader can retrieve the rents.

    AI
    2026 · 09 · 15
  12. 023

    Reusing scraper code across different permit portals

    Shared portal software creates reusable work; each jurisdiction still has its own details.

    AI
    2026 · 09 · 15
  13. 024

    Showing estimated supply without making it look measured

    A reported unit count, an acreage-based estimate and an unknown count carry different evidence.

    AI
    2026 · 09 · 15
  14. 025

    Turning supply questions into MCP tools

    Named tools let an AI client ask useful questions without learning the database's table layout.

    AI
    2026 · 09 · 15
  15. 026

    The model maps the columns. Python reads the numbers.

    Interpreting a spreadsheet layout and copying its values are different jobs.

    AI
    2026 · 09 · 15
  16. 027

    When three filings describe one housing project

    Counting records is easy. Deciding which records refer to the same development is harder.

    AI
    2026 · 09 · 15
  17. 028

    Tracing an underwriting number back to its source

    A review output needs to explain where a value came from and what was checked.

    AI
    2026 · 09 · 15
  18. 029

    Tracking model cost and failures across my systems

    Consistent call records make usage comparable; different failures need different responses.

    AI
    2026 · 09 · 15
  19. 030

    Connecting the underwriting agent to my market-data service

    The upload workflow reuses demand, supply and rent services through one report interface.

    AI
    2026 · 09 · 15
  20. 031

    What an AI tool should return when its data is incomplete

    No matching records, missing coverage and an approximate location are different answers.

    AI
    2026 · 09 · 15
  21. 016

    Deployed is not redeployable

    A service can run healthy for weeks while quietly losing the ability to come back. None of my monitoring asked the second question.

    AI
    2026 · 08 · 22
  22. 015

    The deploy was live. My browser was running last week's code.

    The server said the new version shipped. The page in front of me disagreed. It took a while to learn they were both right.

    AI
    2026 · 08 · 19
  23. 014

    The container ran fine. The folder it read was empty.

    Getting Docker running without a system-level install was the easy part. The failure it produced was the quiet kind.

    AI
    2026 · 08 · 16
  24. 013

    Monitoring Excel when an agent runs the workbook

    An earlier desktop workflow exposed a failure the agent could not see on screen.

    AI
    2026 · 08 · 13
  25. 012

    Two copies of one behavior will drift apart

    My analysis scripts exist twice — a Windows version and a Mac twin. A bug fixed in one stayed alive in the other for seven months.

    AI
    2026 · 08 · 10
  26. 011

    Why each AI builder gets a separate working copy

    One session's cleanup erased another's edits. I changed where parallel builders work.

    AI
    2026 · 08 · 07
  27. 010

    Writing the failing test before an AI fixes the bug

    A passing test once repeated the code's mistake. The expected answer needed its own source.

    AI
    2026 · 08 · 04
  28. 009

    The reviewer can't be the author

    A postal-code bug sailed past the model that wrote it and got caught in minutes by a model that didn't.

    AI
    2026 · 08 · 01
  29. 008

    How I split planning, building and review between AI models

    A task brief, a small change and a separate reviewer give me something concrete to judge.

    AI
    2026 · 07 · 29
  30. 007

    The dashboard was wrong for two weeks. Every health check was green.

    Successful ingestion and scheduled jobs concealed a query refreshing its own stale snapshot.

    AI
    2026 · 06 · 10
  31. 006

    The feature that tested seven points better and changed almost nothing

    How the eval caught a leaked metric — and then told me how to make the feature actually useful.

    AI
    2026 · 06 · 08
  32. 005

    Scoring classifier errors by their effect on the supply estimate

    Equal mistakes in a headline accuracy score can have different downstream effects.

    AI
    2026 · 06 · 05
  33. 004

    How I built an independent test set for the supply classifier

    The classifier's existing answers could not also be its answer key.

    AI
    2026 · 06 · 02
  34. 003

    Where I use language models in the supply pipeline

    Structured fields and ambiguous document text need different kinds of processing.

    AI
    2026 · 05 · 25
  35. 002

    Turning an underwriting workflow into a reusable AI skill

    Moving the rules out of a conversation so the next run follows the same specification.

    AI
    2026 · 05 · 22
  36. 001

    What this site is

    An introduction to the site — who I am, what I build, and what to expect here.

    2026 · 05 · 17