Skip to content
The Liberation Engine

Real deals: real estate / Lesson 2 of 5 · Decide

The daylight question inside 25 Water Street

One vast office building promises thousands of homes, but its floor plate and financing headline cannot tell you how many bedrooms receive legal light or whether the conversion breaks even. Build a transparent bounded model, then open the city's later light-and-air ruling.

What the agent made

Ran it for real with Claude Code 2.1.300 and OMP 18.11.0 on 2026-10-15. The first session started with no saved memory; each later session was a new one that kept only the files in the folder. Your result will differ.

1 · Draw a boundary around the conversion story

Then a brand-new session used what it saved on new input: see the proof.

The same prompts in OMP made their own versions, every session recorded and checked: Draw a boundary around the conversion story · The window ruling and the city's retrospective analysis.

Make your own

  1. Get the files

    Download the practice folder (ZIP)

    Unzip it: you get a folder called cli-practice with 2 practice files. The original December 22, 2022 Newmark financing announcement with its published dimensions and planned homes, plus a dated source ledger. There is no public project test fit, contractor budget, actual rent roll or loan coupon in this frozen packet. It also has a for-later folder with the new files for the fresh sessions.

  2. Open your agent in that folder

    Open a terminal in cli-practice and type claude or omp --approval-mode always-ask. First time? Set up in about five minutes, with steps for Mac, Windows, and Linux.

  3. Paste this prompt

    Work only inside this practice folder. Its December 2022 frozen record is newmark-2022.txt and SOURCES.csv, with attributed excerpts from a real public announcement. Read both and leave them byte-for-byte unchanged. No network, no installs, no reading or writing outside this folder (including /tmp), no questions. Python 3 standard library only. No em dashes or en dashes. This is a historical teaching case, not investment or legal advice.
    
    You are evaluating 25 Water Street only with what an analyst could have seen on December 22, 2022. Distinguish published office gross area, the cited size of a representative floor plate, announced approximate homes, and acquisition-plus-redevelopment loan from an architect's test fit, dwelling permit, purchase price or construction budget. A single quoted floor plate cannot be multiplied by the number of stories to invent the entire floor-area plan. The announced home count is an issuer plan, not a certified occupancy limit. Treat daylight/window exposure, usable depth, cores, dwelling mix and minimum unit size as unknown until measured plans and code review arrive. No 2024 law, variance or retrofit subsidy can appear in this dated baseline.
    
    Write only feasibility.py, deal.json, check.py, deal.html. feasibility.py reads both source files and writes a machine-readable input ledger and conditional floor-plate scenario into deal.json. Use the published floor-plate figure only as an example one-floor denominator; user-chosen percentages for usable daylight-served area and user-chosen unit area are explicitly hypothetical, not site measurements or a project unit-count estimate. Display floor-plate conditional area and floor(conditional area / hypothetical average unit area), not a claim about actual permitted apartments or a whole-building test fit. Any scenario control must keep its assumption in view and label the result hypothetical. State that without measured window schedules even the usable-area assumption cannot be validated.
    
    Model a break-even purchase ceiling as an explicit equation, for example net sale proceeds plus lease-up cash minus hard, soft, contingency, carrying and other project costs. Report each missing signed or sourced variable, including construction draw dates, lender interest terms, full resident income/rent mix, taxes, operating expenses, time to occupancy and exit assumption. A loan commitment is not net sale proceeds or a bid. In deal.json store break_even_purchase_price: null and decision_status: blocked until the actual inputs are provided; never fill a blank with zero, a made-up market assumption, a hypothetical illustrative price or a later retrospective number. Include the source ID, date, unit and status of each known number. Show the unsolved equation and the next five specific diligence requests.
    
    check.py independently reopens both sources without importing or invoking feasibility.py. Recompute cited dimensions, announced approximate units, and loan amount, independently recompute the conditional example and test the amount shown in deal.html, assert the decision remains blocked/null because the required cost, income, loan and entitlement inputs are absent, verify IDs/URLs/dates and every printed material baseline number, and fail on fabricated sourced inputs or a claimed break-even. --self-test must mutate at least three distinct in-memory values including the blocked decision, demonstrating failures without modifying inputs or outputs. Support independently checking reveal.json and reveal.html when those files are added later.
    
    deal.html is a compelling offline, self-contained feasibility evidence room, not a generic dashboard. Begin with the 2022 finding that the project-specific bid cannot yet be priced. A source-linked floor-plate area diagram gives the floor plate one unit and a visible unknown window/core region; pair with a plainly labeled conditional one-floor area and unit-size scenario control that recalculates its hypothetical result from the original sourced floor plate. Keep the announced homes as a separate future plan, not a denominator. Put the complete baseline figures, blocked break-even equation, source links and unanswered inputs in ordinary HTML without JavaScript. No unlabeled price or whole-project apartment count. No pie or chart with two units on one axis; zero baselines and direct labels. At 360 pixels wide and wider, including tablet widths from 600 to 1000 pixels, the page fits the screen and nothing scrolls sideways, not even inside a table, chart, timeline or code box; charts and timelines scale to the width; no word, field name or amount ever breaks mid-word or runs past the edge, so never print long code identifiers or URLs as page text; narrow tables become stacked cards. Inline CSS and JS only, no external assets, fonts or network fetches. Touch and keyboard friendly, visible focus, reduced-motion friendly.
    
    Run python3 feasibility.py, python3 check.py and python3 check.py --self-test, and report only the real exit statuses.

    The prompt asks the agent to stay in this folder; it cannot enforce that. Read each file change and command before you approve it.

  4. Check it yourself

    Open cli-practice/deal.html in your web browser (double-click it), then:

    Human check: Locate every published number in W1 and independently divide a hypothetical usable portion of the cited representative floor plate by the explicitly assumed unit area. It is NOT the permitted total. Confirm the original plan is approximate, the loan covers acquisition AND redevelopment, and deal.json has a null break-even and blocked status. Change the hypothetical floor-plate inputs: result and explanation must change while published figures remain fixed. Run check.py and --self-test; ensure no 2024 fact has leaked.

    When we checked the recording above: Re-recorded with the 360-and-tablet layout prompt. Clean-folder rebuild: lesson checks and self-tests exit 0, no inputs changed; key figures match human_check; sweep at 360/375/390/800/1024/1280 after every control shows no overflow, inner scroller or printed URL; resize 400-1300 in 4px steps fits.

Then prove it: fresh sessions

Each run below is a brand-new session, recorded for real in Claude Code. It remembers nothing from the run before except the files saved in the folder, so the short prompt is the whole instruction.

2 · The window ruling and the city's retrospective analysis

Before this run, copy the files from for-later/reveal in the ZIP into cli-practice: REVEAL_SOURCES.csv, bsa-2024.txt, comptroller-2025.txt.

Quit the agent, start it again in cli-practice, and paste only this:

A fresh session begins. Read the original December 2022 packet and your original deal.json and deal.html, then the newly added bsa-2024.txt, comptroller-2025.txt and REVEAL_SOURCES.csv. Preserve every source input and the original baseline files unchanged. No external reading or writing, network, installs, prompts for user input or nonstandard Python packages. No em dashes or en dashes. Write only reveal.py, reveal.json, reveal.html and necessary changes to check.py.
Build an interactive dated before-versus-after page comparing the initial financing announcement with the May 2024 Board decision and July 2025 city report. Independently cite and distinguish approximate proposed 2022 apartment count, later represented total dwelling units, the east-facing bedrooms discussed by the applicant, the Board's actual limited window relief and conditions, the 2024-enacted retroactive tax program and its income-restricted homes, and the later retrospective purchase figure. Critically: the waiver affected bedrooms and ventilation, NOT the number of dwelling units. The Comptroller's citywide stylized costs, rents or efficiency are NOT actual 25 Water Street bids or December 2022 knowledge. Keep the 2022 break-even null and blocked even after the reveal, because the private budget, measured unit plan, cash flow and debt terms remain unavailable.
Extend the independent check.py to re-read the added sources, recalculate the restricted-units fraction from sourced later counts, check every displayed later number/date and the null break-even, reject a tampered bedroom count or retroactive eligibility date and refuse cross-date source contamination. --self-test still mutates three independent fields and verifies rejection. The reveal.html comparison must show ordinary HTML evidence and cited numerical findings with JS disabled, plus an accessible clickable/keyboard date or window-evidence switch that reveals the exact later excerpt and visibly changes the interpretation. An inline timeline with dates in order and a distinct housing/bedroom comparison must not misrepresent units as lost. At 360 pixels wide and wider, including tablet widths from 600 to 1000 pixels, the page fits the screen and nothing scrolls sideways, not even inside a table, chart, timeline or code box; charts and timelines scale to the width; no word, field name or amount ever breaks mid-word or runs past the edge, so never print long code identifiers or URLs as page text; narrow tables become stacked cards. No external network or assets.
Run python3 reveal.py, python3 check.py, python3 check.py --self-test; report real exits only.

Human check: Read W2 pp.1, 3-5, 7 and W3's 25 Water case study: validate the later dwelling-unit count, applicant's approximate bedroom exposure, zero unit-count change from the waiver, income-restricted homes, and tax-program enactment after the 2022 decision. The retrospectively reported purchase price must not become an original bid. Open the ruling evidence control, then run check.py and --self-test with both scripts on and off. Break-even stays blocked.

When we checked the recording: Re-recorded with the 360-and-tablet layout prompt. Clean-folder rebuild: lesson checks and self-tests exit 0, no inputs changed; key figures match human_check; sweep at 360/375/390/800/1024/1280 after every control shows no overflow, inner scroller or printed URL; resize 400-1300 in 4px steps fits.

Do it for real

For a real conversion, obtain measured facade exposures, core and circulation plans, architect's signed unit test fit, code/entitlement review, resident affordability obligations, contractor bids, loan draws and terms, leasing comps and taxes. Remove personal or confidential information before uploading documents to any model provider. Get licensed architect and lender review before pricing anything. This case is historical teaching, not investment or legal advice.

Why an agent, not a chat window

A skilled agent keeps each dated claim and missing measurement in a reproducible input ledger, tests conditional floor-plate scenarios without pretending they are architect's drawings, and writes an independent checker that refuses to print a break-even offer until real income, costs and terms exist. A fresh session can then reveal what the Board decided without rewriting the 2022 view.

Go deeper

Why the prompt is written this way

The recorded runs

ToolModelFirst run tookFiles madeSessions
Claude Code 2.1.300claude-opus-5-55 min 03 s4first session + 1 later
OMP 18.11.0not logged by this tool11 min 43 s4first session + 1 later

Both kept the 2022 break-even null and the decision blocked, and both let a reader set a hypothetical usable share and average unit size, by slider or typed number, to recalculate one floor's homes from the sourced 40,330 square-foot plate. Claude Code's usable share runs from 10 to 100 percent, OMP's from 30 to 90. Both reveals switch among the December 22, 2022 announcement, the May 6, 2024 Board decision and the July 17, 2025 city report, and both say the window waiver affected bedrooms and ventilation, not the number of dwelling units.

Push it further