Dispatch 143
Week ↗

Wrapping up the year with multistate logic and LLMs

The year ends with a lot of moving parts, mostly because I decided to tackle the multistate retirement leads pipeline and the LLM enrichment service in the same day. It is a good way to close out 2025, assum…

Commits
8
Systems
3
Read
2min
Product capture

Wealth-Ops — live product surface.

The year ends with a lot of moving parts, mostly because I decided to tackle the multistate retirement leads pipeline and the LLM enrichment service in the same day. It is a good way to close out 2025, assuming you like your codebases to be slightly more complex than they were at midnight.

The biggest chunk of energy went into the multistate-retirement-leads repo. I spent most of the morning wiring up the data ingestion services. This wasn't just about pulling data; it was about making sure the system could handle the specific quirks of New Jersey and Socrata sources. I added the ingestion routers and the specific service modules for those states. That alone was over 893 lines of new code plus some dependency updates. The goal was to have a unified ingestion layer that doesn't break when one of the upstream APIs decides to change its mind.

But the real story here is the shift in how the application handles state filtering. I built out an all-states mode that includes a dropdown for the user to select specific states. This required changes across the board, from the backend configuration and main entry point to the lead generation service and the frontend API client. I had to update the backend configuration and main entry point to the lead generation service and the frontend API client. I had to update the models, the database schema, and even the Vite config to support this new multi-state workflow. It was a structural change that touches almost every file in the project, ensuring that the lead generation logic can dynamically adapt based on the user's selection rather than being hardcoded to a single state.

I spent most of the morning wiring up the data ingestion services.

Parallel to that, I pushed the LLM enrichment service into the multistate and CA retirement repos. This is a significant addition. I added the enrichment service module and updated the scheduler to handle these new async tasks. The idea is to use large language models to add context or quality checks to the leads as they come in. It adds a layer of intelligence that wasn't there before, and getting the scheduler to play nice with this new service took some careful coordination in the docker-compose setup.

The retirement-mandate-leads repo got a lighter touch today. I mostly cleaned up the project metadata and added the CLAUDE.md file to give the AI assistants a better understanding of the project context. I also uploaded the Mandate Map icon and logo to the public folder so the branding is consistent. It is small work, but it keeps the house in order.

So, 8 commits across three repositories. I built the ingestion plumbing, reshaped the core logic to support multiple states, and added AI enrichment to the mix. It is a dense day, but the code is solid. The year ends with a system that is more flexible and more intelligent than it was yesterday. That feels like a reasonable way to sign off.

Also in the frame

Real product captures — click any to enlarge.

wealth ops