TRACEBUILD3.161
What's new

Every version of TRACEBUILD, newest first.

Currently 3.161 — released 2026-08-15. Written for the estimator, not the compiler.

3.161 #

A room's name can no longer hide its doubt

  • Sticky review flags. When detection doubts a room's SHAPE — its boundary barely follows walls, it claims an outsized share of the sheet, it leaks toward the exterior, or two different room labels sit inside it — that doubt now sticks to the room. Finding a printed name still labels it, but the room stays a dashed proposal until you accept it. Previously a confident-looking label could silently promote a doubtful shape into a hard quantity — the most expensive kind of wrong. Accepting a room in review is now the one action that clears the flag.
  • Same-named areas always stay separate. The last merge path that could glue two same-named areas (they touched across a paper-thin gap) is removed entirely, so results no longer depend on render resolution. Three PHARM WAIT areas are three areas; rollups by name still sum the same.

Door swings and open-plan areas (from the hero-image review)

  • Door-swing floor now heals almost everywhere. The wedge repair used to give up on a whole room whenever its walls-only flood also swept an open neighbor; the enclosure filter now does that policing per pocket instead. On the demo clinic sheet, healed rooms went from 1 to 20 of 23.
  • Waiting areas split correctly. The colonnade band that committed as one 218 SF blob is now CENTRAL WAITING, two LAB WAIT areas, PHARM WAIT, and FORMS WRITING — each named from the drawing.
  • Two-line labels read as one. "TRICARE" over "OFFICE" now names the room TRICARE OFFICE (five of them on the clinic sheet); "CENTRAL" over "WAIT." seeds the central waiting area. A modifier line joins its room-word line even when the modifier itself is not a room word.
  • Benchmark check commands are now read-only: verifying results no longer rewrites the results files (regeneration is an explicit separate step).

3.160 #

Detection stops reading spaces that aren't rooms

  • No more exterior "rooms." A hatched planting strip or walkway used to survive every filter and commit as a 750+ SF room — worse, a printed dimension figure ("250") inside it could become its *name*, which locked it in as confident. Three layers now stop this: a bare number can never name a room on a scanned/flattened sheet (a room name must contain a real room word); a new structural veto measures how much of a region's boundary actually follows wall vectors (site features are bounded by thin score lines, rooms by walls) — low coverage plus sparse ink drops the region, structural doubt alone demotes it to a dashed proposal you can keep or discard in one click.
  • Merged-room blobs get flagged, split, and shrunk. One detected "room" swallowing several real rooms (storage cells + corridor as one 400 SF "STOR 1") is the under-seeding symptom — the detector now: knows more label vocabulary (CORR, LATRINE, TLT, WAIT + prefix matching, so SUPERVISOR and RECEIVING count); reads stacked two-line labels ("PATIENT" over "ADMIN") as one name and one room; demotes any room claiming over 2.5x the sheet's median room to a reviewable proposal; and flags a room still holding two separated room-name labels the split missed. On the demo clinic sheet the storage blob split into its real rooms and every residual doubt is a dashed proposal.
  • Stairs stay stairs. Erasing stair treads (so the stairwell fills as one space) used to open the stair mouth into the corridor — the STAIR room then claimed the corridor too. The eraser now reseals each flight end where the drawing actually had ink, so the stairwell fills alone. The clinic stair shrank 33% back to its true walls.
  • Your corrections stay yours, twice over. Re-running detection already preserved edited rooms; now a fresh find that overlaps one of your edited rooms is skipped entirely (no double-counted floor), and the naming passes never rename or recolor an edited room.

3.159 #

Space labels that stay out of your way

  • No more black boxes. Space and area labels are now light chips — white with the room's own color as a border and dark text — instead of near-solid dark boxes that hid the drawing under them. A label that genuinely cannot fit its room renders as a small colored dot instead of spilling over the neighbours. Exports match the screen.
  • A visible Clear button. Once a sheet has detected or click-filled spaces, a chip appears bottom-center: *"N spaces on this sheet — Clear"*. One click sweeps them (undoable; your edited detections are kept). No more hunting the Measure menu.

Room Fill can't flood the sheet anymore

  • A click in a not-quite-enclosed room used to paint the entire page and commit a page-sized square-footage figure. The fill now recognizes a leak — it reaches the sheet border, spans the whole sheet inside the printed border frame, or covers an implausible fraction of the page — and tells you the room isn't enclosed instead of committing a phantom area.

Door swings finally count as floor

  • Detected rooms now include the floor under each door swing. The door glyph (leaf + arc) walls that wedge off from the room flood; a per-room reclaim pass reopens it — and only it: a reclaimed pocket must be fully enclosed by walls, the room, or a doorway, so the fix can never grow a room into a corridor.
  • Room Fill gets the same treatment: the door leaf no longer masquerades as a wall (real walls form a connected network; a leaf's swing tip floats free), so the swing wedge fills with the room.

Re-run detection now preserves your edits

  • The invariant. A detected markup you have edited — moved, renamed, re-costed, changed the trade or tag on — is never removed or overwritten by re-running the detector. The old behaviour swept every detected:true markup in the region regardless. If you correct 8 rooms and re-run Detect Spaces to catch a missed one, your 8 corrections survive.
  • Sweep predicates on Detect Spaces, Detect Runs (every trade variant), and Trace Walls all now skip a userEdited:true markup. The detector naming its own finds does not count as your edit, so Clear still sweeps pristine detections.
  • **Measure ▸ Clear detected** also preserves edited items and reports the count kept, so a sledgehammer on this sheet cannot wipe your corrections.
  • Rejection tombstones are wired in the store (per-page, persist through save/reload/tab-swap/page-reorder). The UI that creates them — a sidebar Review section with bulk accept/reject/reassign and a [Review] button on the symbol bar — ships next release.

3.158 #

What's new page + Help ▸ What's New in the app

  • New What's new page on the marketing site (/whats-new), linked from the header pill and the footer's Company column. Every shipped version, newest first, written for the estimator.
  • Help ▸ What's new in the app opens a reading modal with the latest four versions. A small ! dot appears on the version chip in the header when there's something you haven't read yet — click the chip (or Help ▸ What's new) to open, and the dot clears.
  • Single source of truth: repo-root CHANGELOG.md (Keep a Changelog format). scripts/build-changelog.mjs regenerates the marketing page + the app data on every web build, so a version bump plus a changelog entry updates both surfaces together.

3.157 #

Civil / sitework — rebar, polish, and a hardening pass

  • Rebar (concrete reinforcing) is now a first-class trade. ASTM #3 through #18 bar weights, per-ton pricing, and a slab-mat area (#4 @ 12" EW etc.) that explodes straight into fabricated-steel tonnage. New Measure ▸ Civil ▸ Rebar weight readout: pick a bar size and the selected runs report LF + tons on the spot.
  • Earthwork results panel replaced the terse status line — Average-end-area and grid/borrow-pit each open a cut / fill / net table with a surplus-or-import hint and a one-click Export CSV of the summary.
  • Flexible profile calibration — the H/V picker now has a Custom — 1 in = … ft entry per axis, so profile verticals like 1"=5' (not in the preset list) work without a workaround.

Correctness — 20 defects fixed from an adversarial review of my own recent work

  • Bid-schedule pay quantity no longer includes earthwork swell/shrink (loose CY stays in the loaded unit price, plan quantity is bank neat-line).
  • A per-ton item paired with a measured geometry that has no density (volume) or weight-per-foot (length) contributes zero and shows a wrong unit — not billed chip, instead of silently billing the raw ft³ or LF as tons.
  • Rotating a profile sheet ±90° now swaps the horizontal and vertical scales along with the geometry — every length on the rotated profile reads the right axis.
  • Report-area-in ▸ Apply to all pages patches only the display unit; other pages' calibrations are left alone (a mixed-scale set no longer gets rescaled).
  • Cross-section station field accepts station notation ("10+50") — not just plain feet.
  • Trench shoring / trench box now bids for a 5-ft trench, matching OSHA (previously strictly greater than 5).
  • Grid earthwork paste rejects ragged or non-numeric input instead of silently mis-placing nodes.
  • Station labels like "10+100.00" (the carry overflowing) can no longer be produced.
  • Sheet-extents label on a profile page reads per-axis (was the geomean, ~3× off in the reported width and height).

3.156 #

  • Civil delivery tools wired: Measure ▸ Civil menu with Bid schedule (CSV), Average-end-area earthwork, Grid cut/fill, Stationing, plus a Profile scale (H/V) calibrator and a Detect sitework one-click bundle.
  • New Cross-section property (Cut/Fill + station) on Area markups so the AEA report can roll them up.
  • The full civil roadmap (Tiers 1, 2, 3) is now user-facing.

3.155 #

  • Grid / borrow-pit earthwork core (gridVolume — the classic (a/4)(Σh₁+2Σh₂+4Σh₄) with cut and fill kept separate).
  • Stationing module: parse & format 10+50 notation, station values along an alignment by real arc length, station-equation-aware physical length.

3.154 #

  • Trench assembly — a buried pipe run explodes into trench excavation, bedding, and backfill CY based on width × depth.
  • Bid-schedule export (DOT pay-item schedule with plan quantities, agency pay-item codes, and per-line provenance back to the source markups).
  • Structure base + additional depth per vertical foot for manholes / inlets.
  • Average-end-area earthwork core (cut/fill CY between stations, kept separate — no netting at the section).

3.153 #

  • Civil area units: report area in acres, hectares, SY, or the default square units of your calibration — the priced quantity stays canonical.
  • Div 31 / 32 / 33 site-work cost seed: excavation, structural fill, riprap (per ton), asphalt lifts, concrete curb & gutter, a paving assembly, and the civil symbol pack (drop inlet, utility pole, sign, valve box).
  • Tons-via-density on volume takeoffs (riprap and similar).
  • Bank / loose / compacted volume state with swell or shrink percent, on the property bar for any volume markup.

3.152 #

  • Metric georeference reports the sheet unit correctly (previously an mm-calibrated sheet reporting metres was scaled 1000× by the georef).
  • Share and account rate-limiter hardening (fail-closed timing, per-IP + per-account buckets on the auth endpoints).

3.151 #

  • Georeferenced coordinate placement now reconciles the page scale to the georeference it derived, so a real-length measurement equals the real length you typed.

3.150 #

  • Room Fill / Detect Spaces reclaims the floor area under door swings and wall-mounted fixtures (toilets, sinks, water closets) — the gross-area rooms report matches the built floor SF instead of subtracting the swing arc.

3.149 #

  • Self-service account management: Profile page (change your name and email), Change password, and Delete account with confirmation (soft-delete for 30 days, then purged).

3.148 #

  • Detect a fixture button in the symbol picker — pick a symbol from the plan, auto-detect every match on the current sheet.
  • Set wall height now works per wall-type or all-walls in one gesture, from the wall property bar.

3.147 #

  • On-device vision AI: the bundled Qwen3-VL-4B lets the estimator ask the drawing natural-language questions ("what's on this sheet?") without shipping any pixels off the device.
  • Symbol bounding boxes are tighter (fewer over-wide false positives on dense trade sheets).
  • Rotated vertex editing on measurement polygons (was previously flipped on rotated pages).
  • 23-item punch list from an external design review — reworked and shipped.