Building Agent — Update 2

10 Minutes of Typing, A Structural Rewrite

Robert Asher · April 8, 2026 · Follows Version 13.91

Last week I posted about this building agent — a cluster of algorithms interacting to design a building as a complete system of systems.

This week I iterated on it. I had a few outstanding issues:

No transfer structures were considered, nor did columns consider their 'slenderness' or the total weight of built form above them. The services routing was poor. The louvres on the facades were also slightly too crude for realism.

The report of how the LLM solved these issues is below. I type ~100wpm, especially with the low fidelity input that the LLM requires.

This update represents about 10 minutes of typing — roughly 1000 words of prompt. There is a lot of spinning and waiting, but normally I am doing multiple tasks simultaneously (pace the flow state).

You'll notice that the scope 'crept' — I ended up tweaking the rendering and UI logic to make it nicer to use.

Another update in a few weeks.

Live building agent — interactive. Drag to orbit, scroll to zoom.

Services — Complete Rewrite

  • Weighted orthogonal routing with full cost model: Dijkstra with direction-aware bend penalties, trunk detection, Steiner merging, congestion
  • 6 service systems (supply air, return air, exhaust, electrical, hydraulic, sprinkler) routed independently with shared congestion
  • Two-pass algorithm: greedy pass identifies trunk corridors, Dijkstra pass optimizes with trunk bonus + Steiner + congestion
  • Demand-based sizing: width = k × sqrt(downstream_demand), not length-based
  • Edge classification: main/submain/branch with different heights and material shades
  • Rich reasoning panel: section headings with icons, bar charts (system demand, hierarchy), ASCII demand heatmap, quality metrics

Note: demand-based sizing seems logical, but MEP engineers will be able to tell me whether it actually works.

Structure — Transfer Structure + V-Columns + Per-Level Sizing

  • Transfer zones: draw polygon with transfer: true — eliminates columns, thickens beams as steel I-beams sized for point loads from columns above
  • V-columns: groundSupport: "v-columns" option — perimeter-only V-shaped supports with concrete pads, properly sized for axial + slenderness
  • Per-level column sizing: columns get thicker toward the bottom (more floors above = more load). Three checks: axial compression, slenderness (L/d), Euler buckling (with SF=3). Ground floor accounts for taller height.
  • Column sizing display: per-level breakdown in UI with bar charts, load values, governing condition badges (Euler/L-d/Axial)
  • Transfer beam UI: color picker + depth multiplier parameter
  • I-beam geometry for transfer beams (flanges + web)

Facade — Louver Split + Spandrel

  • Spandrel panels: solid opaque panels above transom, separate color from glazing
  • Louver agent split into its own module (louver.ts) with own agent card
  • Adaptive louvers: auto-detect N/S/E/W facade orientation. North = horizontal, East/West = vertical, South = none. Per-orientation height params.
  • Independent louver height (not tied to transom height)

Rendering Fixes

  • Glass panels use depthWrite: false + DoubleSide — ducts/services visible through windows
  • Spandrel panels use DoubleSide — visible from both sides
  • Scene order: interior objects render before facade (services, lighting before glass)

Performance — Regeneration Optimization

  • Geometry fingerprint: color/visibility changes don't trigger full regeneration
  • Baked data fingerprint: Giraffe layer toggles, color changes, and feature selection don't trigger regeneration — only actual geometry data changes do
  • Color debounce: color-only changes trigger 800ms debounce (vs 300ms for geometry)
  • Auto-run on load: fires once when both origin and baked data are available

Defaults Tuned

  • Transom height: 2.7m, service zone depth: 0.6m, lighting drop: 1.0m
  • Warm timber palette (200 George St style): sandy mullions, champagne spandrels, white louvers/ducts
  • Transfer: 2× depth multiple, #B5B5B5 color
  • Louver: adaptive on, 0.3m spacing, 0.22m depth, 0.1m height, white