The construction and real estate work

Ronald Wacker

Fourteen years as a real estate investor and construction project manager: more than thirty residential projects across four states, run from a New York base.

Now also building working software systems, which run on the judgment the physical work built.

  • Real estate
  • Construction
  • Investing
  • Product
  • Sales
  • Operations

New Yorkronald@wackermanagement.com

  1. 01Assemblage OSSingle-tenant operating system · NYC real estateprivate
  2. 02Impossible To NameConsumer platform · regulated document domainimpossibletoname.com
  3. 03The skills libraryReusable skills and agents · removing the founder from the loopprivate
  4. 04The Screening SimulatorMulti-agent system · reverse-engineered from live AI screeningprivate
  5. 05The Creator Deal DeskSingle-operator back office · brand and agency inboundprivate

How to read the diagrams

  • a component that was built
  • an external system, or a person
  • where a language model operates
  • data flow
  • control, decision
  • optional, conditional
  • leak point
01

Assemblage OS

Single-tenant operating system · NYC real estate

A single-tenant AI operating system for one NYC real estate broker. Built solo in roughly one week, as a non-engineer.

Built in
~1 week, solo
Architecture
Ten rules every feature obeys
Status
Working system, single tenant

The system as it works

The broker's day before software.

The broker's day before software
The broker's day before software

Why existing tools fail

The broker's product is relationship knowledge, but every tool in the category stores transactions. And real estate decisions do not happen on a schedule: they happen at life transition moments.

Explicitly not a CRM. The stated goal is that the system answers one question every day: what should I do right now, and why.

Read the full case study3 more diagrams · 8 decisions · stack

Architecture

The architecture contract: ten rules every feature obeys.

  1. 01

    Event-first. Every input becomes an immutable record before anything updates.

  2. 02

    Two memories. Structured queryable facts alongside a narrative summary per person. Raw logs are never shown without a synthesized summary.

  3. 03

    Signals to Decisions to Actions. No recommendation may exist without the stored signal that produced it.

  4. 04

    AI holds fixed roles and never replaces data.

  5. 05

    Every inferred fact, task and score carries confidence, evidence, and a one-sentence explanation.

  6. 06

    BBL is the truth for property. Not address, not BIN.

  7. 07

    A feature is not done unless it flows Event to Memory to Signal to Recommendation to one-tap Action.

  8. 08

    Ambiguous matches require human approval.

  9. 09

    Push, do not pull. The system initiates.

  10. 10

    Outcomes, dismissals and corrections are stored as feedback, not discarded.

The intelligence pipeline

The model touches the two ends, never the middle.

The intelligence pipeline: the model touches the two ends, never the middle
The intelligence pipeline: the model touches the two ends, never the middle

Data boundaries

Three concentric data rings, from raw public staging inward to private user-owned records.

  1. 03Raw public-record stagingunowned, replaceable
  2. 02Shared property graphkeyed on BBL
  3. 01Private user-owned recordsrow-level security
Three concentric data rings

Decisions

Scoring uses no language model
Deterministic and auditable. Intent, urgency, engagement, quality and recency each return their own score and reasons, persisted per dimension. A score that cannot be explained in one sentence violates the explainability law. Recency can go negative: silence actively decays a lead.
Pressure stacking over single signals
Signals bucket into financial, family, work, housing, active search, property-specific and behavioral, with weights. A transition moment fires only when two or more categories stack, because stacked pressure is qualitatively different from any single signal.
Person ID is nullable on the event log
An unknown inbound call still becomes a record, flagged for review, and lands in an unassigned inbox. Data is never dropped for lack of identity.
Ambiguous matches go to a human queue
Name similarity plus address corroboration on an explicit confidence ladder: high confidence auto-links, the middle band routes to an approval queue, low confidence is discarded. False positives corrupt memory permanently; missing links are cheap to fix.
Task rules as data, not branching code
An ordered table of condition, action, reason, priority, timing and channel. Adding a trigger is one entry, and every task ships with the sentence explaining why it exists.
A deterministic formatter overrides the model
Building facts bypass the model's prose entirely and render through tested formatting code. Those facts are too important to let a model paraphrase.
Source priority baked into tool names
The model sees primary source, official records and supplemental context as labels rather than as a policy it might ignore.
Detectors written ahead of their data
Opportunity detection probes which data sources actually have rows, then runs only those detectors. Detectors for future sources are already written and lie dormant.

Stack

Assemblage OS stack
Assemblage OS stack

Result: a working system with a specification of roughly 3,400 lines behind it, built solo in about one week.

02

Impossible To Name

Consumer platform · regulated document domain

impossibletoname.com

A consumer platform that prepares European visa applications end to end. Researched, scoped, architected, built, priced and shipped by one person, six weeks from idea to a live working product.

Idea to live
6 weeks, solo
Live coverage
3 countries · 9 consulates · 35+ document types
Monitoring
91 government sources, checked daily
Surface
55 API routes · 135 task definitions

The system as it works

An applicant preparing a European visa. The output is a stack of documents that must be internally consistent with each other.

Preparing a European visa application without software
Preparing a European visa application without software

The core problem

The domain is unforgiving about facts. Generative models are unreliable about facts. Most products in this space either avoid the technology entirely or point it at precisely the thing it is worst at.

Read the full case study4 more diagrams · 14 decisions · stack

The three rules that follow

One home per fact
Every visa fact has exactly one home, wrapped with its source and its verification date. Nothing else may hardcode a threshold.
AI narrates, never decides
The model writes prose on top of computed facts. It makes no determination.
Validation informs, never blocks
After payment the user can always generate. A missing field produces a warning, not a wall.

Architecture

A hard boundary between deterministic and generative. Every visa fact has one home, and values derive rather than duplicate: change the base figure and every consumer moves. Where official sources conflict, the platform uses the higher figure because it is safer for the applicant.

A hard boundary between deterministic and generative
A hard boundary between deterministic and generative

Retrieval runs in two passes, scoped to the user's pathway first and then unfiltered, with a tag-based pass alongside as a gap-filler, everything filtered to recently verified articles. The verified-facts block computes this specific family's thresholds at request time, including per-country dependent age rules, so the answer names the actual person and the actual number.

Where the difficulty actually is

“A Spanish visa” is not one procedure. Spain is served by nine US consulates, each with its own forms, appointment method, fees, accepted payment types and submission rules, and jurisdiction follows where the applicant lives rather than where they are going. The platform detects the office and generates against it.

One visa, nine consulates
One visa, nine consulates

Requirements that move, documents that block

The supporting documents are not a list, they are a graph. An FBI identity history summary has to exist before it can be apostilled, and the apostille has to exist before it can be sworn-translated, a chain that takes weeks and that no checklist without dependencies can warn you about in time.

Documents that depend on documents
Documents that depend on documents
Requirements move on their own schedule
Income thresholds update on a calendar (Spain's every January) and consulate procedure changes without announcement. Every fact carries a verification date, and the policy monitor watches 91 government sources for changes rather than waiting for a user to hit one.
The checklist models dependencies, not steps
44+ tasks per application, each with blocked and ready states, processing times, and the critical path flagged. Knowing a document is needed is worthless without knowing it cannot be started yet.
Employment type forks the requirements
W-2, freelance and business owner take different Social Security paths: a W-2 employee has to request a Certificate of Coverage from the SSA, the others do not. The wizard branches rather than asking everyone for everything.
The unit is a household, not an applicant
Individual pre-filled forms for every person (visa applications, NIE forms, responsible declarations, parental authorizations) with thresholds adjusted for family size, all generated from one session.
Complex cases are turned away before payment
Prior rejections, deportation history, complex custody, a criminal record: the free assessment flags these and says so, rather than taking the money and discovering it in the wizard.

Decisions

A claimed quote must exist in the source
The policy monitor reads 91 government sources for rule changes. A claimed verbatim quote must be found in the source text or the alert is rejected, and a null quote is accepted as the model declining to claim one.
Prompt-injection defense at the boundary
User-controlled strings enter the system prompt inside structured tags, and standard escaping does not escape a closing tag, so angle brackets are escaped recursively and the output is scanned for breakout artifacts.
Sensitive fields are tiered
Ordinary personal data in plaintext, identifiers encrypted with a masked display copy, financial and biometric data never stored at all. Encrypted values are read only through resolvers that never return a masked string, and generated supporting documents carry a placeholder rather than the real identifier.
Guidance is now entirely deterministic
The feature was AI and was rebuilt to derive its content from the knowledge hub instead, because the deterministic version was better. Removing the model was the improvement.
The eligibility invariant
Every income-based elimination in the free assessment must use the same threshold function and exchange-rate buffer as the later evaluation. If the later stage hard-stops at a number, the first stage must eliminate at that same number. No exceptions. The anti-refund business rule expressed as a code contract.
Date math was deleted
Backward scheduling and computed start and end dates were removed in favor of human-readable timeline prose that never feeds a calculation, plus a red, amber, green urgency signal. The model is forbidden from emitting calendar dates. Do not manufacture precision you do not have. The same instinct governs currency conversion, buffered conservatively in both directions.
Never flatten the generated forms
Fields stay editable because the user's review pass is the final accuracy checkpoint. The target is high accuracy with a human check, not the illusion of perfection.
The agent exposes its own gaps
Confidence is detected on every turn, and anything short of full confidence writes to an unanswered-questions table that drives knowledge-base priorities.
Financial gates before the paywall
The largest refund risk is paying and then discovering you miss a threshold, so elimination happens in the free assessment. Lower top-of-funnel conversion, deliberately, in exchange for removing the refund case.
Two independent payment paths
Webhooks get lost or arrive late, so a direct verification path exists alongside the webhook, both idempotent. On a metadata validation failure the system records the raw payload and the customer email for manual resolution rather than failing silently.
Verify then retry, temperature high
Generated documents are checked by a deterministic verifier asserting required names, phrases, placeholders and length. Failure retries once, then falls back to a template. Temperature stays high because the verifier catches drift and variety stops every applicant's letter reading identically.
Wizard state as flexible documents
Not typed columns. Adding a country requires zero migrations. The cost is paid at every read edge, where each country nests its data differently, and that cost was accepted knowingly.
The support agent never dead-ends
Automatic escalation was removed. It answers what it can, names the gap honestly, offers to flag it, and the chat stays open. Announcing that a question has been forwarded to the team is a banned phrase.
Buffered, not streamed
You cannot validate, strip formatting, or measure confidence on text already sent to the user. Safety over perceived latency, with an animation covering the wait.

Stack

Impossible To Name stack
Impossible To Name stack

One application, no separate services: a deliberate solo-operator constraint. Also running: a policy-monitoring system watching 91 government sources for rule changes.

Result: idea to live working product in six weeks, built solo. Three pathways live end to end, two more in assessment. Fifty-five API routes, 135 task definitions, 79 knowledge-base articles, 54 published guides.

03

The skills library

Reusable skills and agents · removing the founder from the loop

Roughly fifteen reusable skills and agents that run the recurring work of a solo operation.

Skills and agents
~15, reusable
Functions removed
Research · writing · spec · support · inbound
Shared layer
One voice and brand layer, inherited

The system as it works

One person running content production, domain research, specification writing, form field mapping, knowledge-base maintenance and inbound analysis by hand. Recurring work plotted against the operator's week, with the compounding items marked.

The operator load map
The operator load map

The binding constraint

A solo operation's binding constraint is not capability, it is the operator's attention. So the highest-value work is the work that removes the operator from the loop.

Read the full case study1 more diagram · 3 decisions

Architecture

The skills library as a map, grouped by the function each one removes, with trigger and output for each. Research passes chain into specification, specification into support coverage, and every output inherits the voice layer.

The skills library, grouped by the function each one removes
The skills library, grouped by the function each one removes

Decisions

Skills, not prompts
Codified procedures as reusable skills rather than one-off prompts. Repeatability over cleverness.
Research separated from composition
A research pass can be verified before anything is written from it.
Voice as its own layer
Voice and brand rules live in one place, so every output inherits them instead of restating them.

A chained run

Adding a visa pathway to the platform has automated steps and manual ones. This is not end to end.

The chained portion runs pathway research into a verified fact sheet, the fact sheet into a specification, and the specification into requirement lists and knowledge-base articles. Each output feeds the next.

That chain produced the preparation packages for the Greece and Italy retirement pathways, the two the Impossible To Name section lists as in assessment. The chained preparation ran in roughly half the time the same work took by hand for the first pathway. The build itself stays manual.

04

The Screening Simulator

Multi-agent system · reverse-engineered from live AI screening

A multi-agent system that measures an application before it is sent, against a reconstruction of the AI screening tier built by reverse-engineering how current AI-powered applicant tracking systems actually generate criteria and score against them. No service, no database, no runtime: markdown files and Claude Code.

Built by
Reverse-engineering live AI-powered ATS screening
Reconstructions
3, scored independently
Applications run
4, 13 to 17 artifacts each
Agents
4, each with an opposed incentive
Gates
2: truth, then effectiveness
Runtime
None. Markdown and Claude Code

The system as it works

The modern hiring screen. Several hundred applicants per role.

The modern hiring screen
The modern hiring screen

Why the screen can be reconstructed

Candidates treat the screen as a black box, but the vendors publish how it works. Ashby documents how criteria are generated from the posting text and publishes the rules for writing them, and its own audit reports that 11.4 percent of real evaluations land on UNCERTAIN.

A failure that appears only against the unwritten gates is a channel signal, not a document signal. Pedigree and industry gates are what a warm introduction overrides and a résumé cannot.

Read the full case study4 more diagrams · 8 decisions · weaknesses · stack

Architecture

Agent topology with isolation boundaries drawn explicitly. Model tiering is part of the design: composition and research on the larger model, both gates on the small one.

Agent topology, with isolation boundaries drawn explicitly
Agent topology, with isolation boundaries drawn explicitly

The two-gate flow

The truth gate runs first; the effectiveness gate only ever sees text that has already passed it.

The two-gate flow
The two-gate flow

Reverse-engineering the screen

The screening tier is a black box to candidates, but it is not an unknowable one. The reconstruction is built from Ashby's published rules and audit data: how criteria are generated from the posting text, the rules for writing them, and an audit reporting that 11.4 percent of real evaluations land on UNCERTAIN. Ashby's credit economics, where one credit covers one candidate against up to fifty criteria, imply the screening tier runs on small, efficient models. The pipeline reconstructs that screen three ways and scores against all three, because a single reconstruction would be a guess presented as a number.

Three reconstructions of the screen
Three reconstructions of the screen

The reconstruction is what makes the rest of the system possible: the evaluator is pinned to a small model precisely because that is the tier the reconstruction says is doing the screening, and the three-valued verdict exists because that is what the screen returns.

Decisions

The evaluator must stay small
The decision most likely to be “fixed” by someone optimizing for quality. It is not trying to be a good judge. It is simulating the deployed screening tier, and the vendor's credit economics, one credit per candidate against up to fifty criteria, imply that tier runs on a small model. A larger model resolves ambiguity in the candidate's favor, performs inference a junior screener will not, and returns false passes. Upgrading it makes the numbers prettier and the signal worse.
Three-valued output
Meets, does not meet, and uncertain, because uncertain is the point. For a non-standard background the dominant failure mode is not rejection, it is a screener who cannot tell. So the test for every sentence is whether a literal reader could be unsure, never whether it is impressive.
Two gates, opposed incentives
The auditor pressures toward provable claims, the evaluator toward stronger ones. A line ships only if it satisfies both. Truth precedes effectiveness, because scoring an unshippable draft produces pressure to keep whatever earned the score.
A third state for untraceable claims
Traced or deleted is the naive design, and deletion silently destroys true but unrecorded facts. The third state routes the claim to the human who can rule on it.
Confirmed negatives outrank criteria
The dangerous claim is not the false one, it is the adjacent-true one that is ninety percent accurate and collapses under a reference check. A plain fact base cannot express “this is almost true and the almost is fatal.” Entries are dated rulings with explicit carve-outs, not rules.
Refusing to ship is a first-class output
If an application cannot be won honestly, the system says so and stops, and routes to a different channel instead. A skip is an instruction, not a judgment.
No agent without an opposed incentive
A constraint on the architecture itself: never add an agent unless isolation buys a genuinely opposed incentive. Each agent exists because it needs to not know something, or to want something different from the writer. Anything else is an instruction inside an existing prompt.
Nondeterminism is measured, not smoothed
Verdicts that move across runs on unchanged text are labeled unstable and must not be read as earned improvements. Instability clusters in the speculative gates, which depend on the model's outside knowledge rather than the text, so they are coin flips by construction. A pipeline reporting a clean deterministic number would be lying about the thing it simulates.

Stack

Application pipeline stack
Application pipeline stack

Result: every application produces a tailored résumé, audited form answers, and a verdict sheet carrying quoted evidence per criterion across three reconstructions of the screen, plus a routing decision.

Weaknesses

Isolation by discipline
Evaluator isolation is enforced by prompt discipline rather than by the tooling. Revoking the read grant would make it structural.
Honest stubs
One per-ATS playbook, Ashby, is fully researched. The others (Greenhouse, Workday, LinkedIn) are honest stubs that halt rather than improvise.
No ground truth
Criteria reconstruction is a model of what the screen generates, grounded in the vendor's published rules, with no ground truth available to score it against.
Small outcome data
Outcome data is small, and everything about calibration is provisional until more accumulates.
05

The Creator Deal Desk

Single-operator back office · brand and agency inbound

A single-operator back office for one creator's brand and agency inbound: triage, research, rates, contracts, accounting, relationships. Content strategy is deliberately out of scope: this runs the business behind the feed, not the feed.

Agents
8 defined, each pinned to a model. A typical inbound fires 4
Stored
2 records. Every view is generated
Escalates to Opus
Attached contracts, novel terms, a missing comp
Human-only
Sending, and marking paid

The system as it works

Two things are stored: a record per deal and a record per contact. Every view (the contact list, the pipeline, obligations, comps, the accounting workbook, one list per deal type) is generated from them on request.

Two stores, everything else generated
Two stores, everything else generated

The drift problem

Every view is generated on request rather than maintained, so there is no stored list that can fall out of date.

Contacts are people, not deals, which is what lets the record survive an agency change: the person stays, the deal folder closes.

Read the full case study1 more diagram · 5 decisions · weaknesses · stack

Architecture

00-canon/
Rates, framework, red flags, voice, profile. The decision-time reads.
00-canon/CONFLICTS.md
Inherited contradictions, left unresolved on purpose, for the operator to arbitrate.
.claude/agents/
Eight agent definitions, each pinned to a model.
deals/
One folder per inbound: raw.md, record.yaml, research.md, analysis.md, reply-draft.md.
contacts/
People, not deals. Survives an agency change.
views/
Generated: CONTACTS, PIPELINE, obligations, comps.csv, accounting.xlsx, and one list per deal type. Never hand-edited.
fixtures/
Known-outcome cases. Run after every canon edit.
scripts/hooks/
Floor gate and auto-rollup.
log/
decisions.jsonl, learnings.md.

Model routing

Eight agents, each pinned to a model in its own frontmatter. Cost is a design parameter here, not an afterthought.

AgentModelFires
filerhaikuevery paste
researchersonnetanything not ignored
ratessonnetanything getting a reply
draftersonnetanything getting a reply
contractopusonly when a document is attached
adversaryopusonly above a value threshold, novel terms, or a missing comp
accountinghaikuscheduled
archivisthaiku (sonnet quarterly)scheduled

A typical inbound fires four agents, not eight. Each subagent costs roughly 25–35k tokens just to initialize, so fanning out on every deal would erase the savings from routing the cheap work to Haiku.

Leave CLAUDE_CODE_SUBAGENT_MODEL unset. It overrides the per-agent frontmatter and silently collapses this whole table to one model.

Scheduling

0 8 * * 1  cd /path/to/repo && claude -p "Run archivist. Report only what needs attention." >> log/weekly.txt

Headless claude -p survives a reboot and does not need the desktop app open. Each run is a full session and counts against usage limits.

Decisions

Enforcement, not judgment. Every rule below is a check a script can run; none of them require an agent to have taste.

Every draft declares itself
A reply-draft.md opens with a machine-read declaration: <!-- QUOTE: none --> or <!-- QUOTE: <rate-card-key> <amount> -->. The gate validates the declaration against canon floors, checks that the declared amount actually appears in the body, and, when quoting, requires the usage-window and exclusivity asks. Declines that mention the other side's lowball number pass cleanly.
Floors live in one place
The frontmatter of 00-canon/rates.md, parsed at gate time. Unreadable canon fails closed for quotes.
Absence is a value
validate() flags a signed deal with no usage_window_end, because an absent end date defaults to perpetual.
Category collisions
exclusivity_check.py catches them before a quote goes out, not after.
Nothing sends
Nothing is marked paid by an agent either. Both irreversible actions stay with the operator.

Stack

Creator deal desk stack
Creator deal desk stack

Weaknesses

Canon contradicts itself
Seven inherited contradictions sit unresolved in CONFLICTS.md, parked there deliberately rather than papered over. Two are material: until they are arbitrated, every rate recommendation downstream of them rests on a default the system picked rather than a decision the operator made.
Gates enforce, they do not judge
The floor gate checks that a quote declares itself, matches canon, and appears in the body. Whether the number is right for this particular deal is not a thing a gate can check.

The software systems are built on judgment the construction and real estate work produced. Assemblage encodes brokerage and NYC property knowledge, down to using BBL rather than address as the unit of truth. Impossible To Name encodes regulated-document and jurisdictional-process work, which is the same problem shape as pulling permits and running inspections across separate county authorities.

The construction and real estate work