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.
- 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.
AI2026 · 09 · 26 - 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.
AI2026 · 09 · 26 - 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.
AI2026 · 09 · 26 - 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.
AI2026 · 09 · 26 - 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.
AI2026 · 09 · 26 - 017
Turning concession banners into usable rent data
The promotion on the marketing page may be missing from the availability feed.
AI2026 · 09 · 15 - 018
Why I kept the existing underwriting workbooks
The existing filenames, tabs and labels turned out to be interfaces other tools depended on.
AI2026 · 09 · 15 - 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.
AI2026 · 09 · 15 - 020
Why a rent range is not a list of observed rents
Minimum and maximum prices lose the distribution a rent benchmark needs.
AI2026 · 09 · 15 - 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.
AI2026 · 09 · 15 - 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.
AI2026 · 09 · 15 - 023
Reusing scraper code across different permit portals
Shared portal software creates reusable work; each jurisdiction still has its own details.
AI2026 · 09 · 15 - 024
Showing estimated supply without making it look measured
A reported unit count, an acreage-based estimate and an unknown count carry different evidence.
AI2026 · 09 · 15 - 025
Turning supply questions into MCP tools
Named tools let an AI client ask useful questions without learning the database's table layout.
AI2026 · 09 · 15 - 026
The model maps the columns. Python reads the numbers.
Interpreting a spreadsheet layout and copying its values are different jobs.
AI2026 · 09 · 15 - 027
When three filings describe one housing project
Counting records is easy. Deciding which records refer to the same development is harder.
AI2026 · 09 · 15 - 028
Tracing an underwriting number back to its source
A review output needs to explain where a value came from and what was checked.
AI2026 · 09 · 15 - 029
Tracking model cost and failures across my systems
Consistent call records make usage comparable; different failures need different responses.
AI2026 · 09 · 15 - 030
Connecting the underwriting agent to my market-data service
The upload workflow reuses demand, supply and rent services through one report interface.
AI2026 · 09 · 15 - 031
What an AI tool should return when its data is incomplete
No matching records, missing coverage and an approximate location are different answers.
AI2026 · 09 · 15 - 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.
AI2026 · 08 · 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.
AI2026 · 08 · 19 - 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.
AI2026 · 08 · 16 - 013
Monitoring Excel when an agent runs the workbook
An earlier desktop workflow exposed a failure the agent could not see on screen.
AI2026 · 08 · 13 - 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.
AI2026 · 08 · 10 - 011
Why each AI builder gets a separate working copy
One session's cleanup erased another's edits. I changed where parallel builders work.
AI2026 · 08 · 07 - 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.
AI2026 · 08 · 04 - 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.
AI2026 · 08 · 01 - 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.
AI2026 · 07 · 29 - 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.
AI2026 · 06 · 10 - 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.
AI2026 · 06 · 08 - 005
Scoring classifier errors by their effect on the supply estimate
Equal mistakes in a headline accuracy score can have different downstream effects.
AI2026 · 06 · 05 - 004
How I built an independent test set for the supply classifier
The classifier's existing answers could not also be its answer key.
AI2026 · 06 · 02 - 003
Where I use language models in the supply pipeline
Structured fields and ambiguous document text need different kinds of processing.
AI2026 · 05 · 25 - 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.
AI2026 · 05 · 22 - 001
What this site is
An introduction to the site — who I am, what I build, and what to expect here.
2026 · 05 · 17