Skip to content
Structura v0.6.0 · release notes

Changelog

One entry per shipped release, newest first. Each entry is generated at build time from the release notes committed alongside the code it describes — this page cannot claim a feature the notes do not, because nobody types into it.

Entries run from v0.6 back to v0.2: a release with no notes section in the repository gets no entry here rather than an invented one.

Releases
  • v0.6 Current release
  • v0.5 FR-20 · FR-21 · FR-22 · FR-23 · FR-24 · FR-25
  • v0.4 FR-13 · FR-14 · FR-15 · FR-16 · FR-17 · FR-18 · FR-19
  • v0.3
  • v0.2
Source: HANDOFF.md · generated for v0.6.0
Release notes

What shipped, release by release

  1. v0.6

    Current release
    FR-3 FR-4 FR-6 FR-15 FR-16 FR-19

    v0.6 is a hardening release: no new PRD features, every item repairs a defect found in the v0.5 full-product sweep, docs/reports/FEATURE_REPORT_v0.5.md §4 (30 defects, D-1…D-30). An independent acceptance pass re-ran every defect's original reproduction against a rebuilt stack and reported PASS — none reproduce any more (see the report's "v0.6 addendum" for the fixed-in commit of each). The four features the v0.5 sweep graded PARTIAL — Upload (FR-3), Conversion progress (FR-4), Review queue (FR-6) and Guided pipeline state (FR-15) — were re-graded PASS.

    Defect classes fixed:

    • Upload & conversion tracker. "Start conversion" can no longer fire while sheets are still uploading — it silently converted only the sheets committed at that instant before. The ten-stage tracker now renders a failed stage with its own icon, sub-label and duration instead of going blank. A background-tab completion notification fires once per job, not twice. The header CTA no longer flashes stale immediately after a conversion auto-navigates to the workspace.
    • Review & version integrity. On the mesh route, two flagged openings sharing a host wall now render distinct evidence tiles, each localised to its own element instead of the whole host wall. The toolbar's IFC download always matches the version selected on screen, never silently the latest. A freshly flagged room's review card shows its area immediately, without waiting for a re-export. The sticky "N corrections pending" indicator survives a hard reload or a Dashboard round-trip. The "N of M reviewed" counter is server-truth and no longer resets on reload. The isometric fallback no longer lets an unfilled roof/slab outline swallow clicks meant for a space underneath.
    • Admin & usage. The Usage and Admin screens now have automated test coverage. The seat count no longer flashes a wrong number while loading (and Invite is disabled until it settles); usage/quota gauges show an honest "N over quota" instead of a misleading "0 remaining"; the run ledger defaults to 50 rows instead of the whole table; the dashboard windows its render with a "Load more" control instead of mounting every building's card at once; usage gauges follow the active project; user deletion asks for confirmation; Section/Elevation upload chips show a real titleblock descriptor where the sheet carries one.
    • Viewport legends & copy. The element-count chip follows the active storey filter; the properties header no longer collapses the building name to a zero-width sliver next to the version selector; the by-source legend lists only the sources actually present; the by-class legend gains a Space swatch; the "No selection" empty state mentions spaces; the sign-in footer reads the real app version instead of a stale hardcoded one.
    • Evaluation screen. A class a route sets no threshold for (2D Roofs) now reads "Not graded" and is excluded from the pass banner's class count, instead of a vacuous "1.00/1.00 · Pass" on a 0-of-0 measurement.
    • Shared links. GET /shared/{token}/sheet-outlines now serves the real, token-guarded outline data instead of a permanent 404 stub, so a shared link can show the FR-16 drawing ghost.
    • Mock-adapter honesty. If an uploaded sheet's content hash differs from the one recorded in its canned trace, the conversion now records a loud assumption saying so, instead of silently replaying a judgment keyed only on filename.

    Behavior changes (DECISIONS D-042 — the only intentional output drift in this release; geometry, GUIDs, fixture IFC bytes and eval metrics are otherwise byte-stable):

    • Plan-only sheet sets now convert. A sheet set with no elevation levels no longer hard-fails at stage 5 — it converts using PRD §8's documented 3000 mm storey-height default, with a building-scoped assumption recording it. (The pre-existing "neither plans nor mesh present" failure is unchanged.)
    • The slab-thickness assumption's basis is re-cited. The audit trail no longer claims "PRD §8 default" for the 250 mm value PRD §8 actually states as 150 mm; it now cites "canonical default (MODEL_SCHEMA.md, D-042)" — the deviation's real source.
    • A storey-height override (FR-19) now applies only to storeys whose height came from the default/assumption path, never to a measured one — a fully-measured building records the override but changes nothing on screen, and the panel says so.
    • The assumptions log is now insertion-ordered when timestamps tie, instead of falling back to arbitrary UUID order.
  2. v0.5

    FR-20 FR-21 FR-22 FR-23 FR-24 FR-25

    v0.5 is a rooms release (PRD §17, decisions in DECISIONS D-041/D-042): Structura now detects, models, reviews and exports IfcSpace — resolving OPEN_QUESTIONS Q-005. It is plans-route only; conversion output for buildings without spaces (every mesh-route model, every pre-v0.5 version) is untouched.

    • Space detection (plans route) (FR-20). Closed regions bounded by detected walls are polygonized into rooms, per storey, with a computed floor area. A room label drawn on the sheet (A-AREA-IDEN layer) resolves to a name and number deterministically; an unlabeled room gets name: null plus an assumption, and stays reviewable rather than being silently dropped. A mesh-route conversion instead records a single building-scoped assumption — "Spaces not reconstructed on the mesh route" — since interior walls are frequently unmodelled in asset meshes (docs/SPACE_PIPELINE.md, D-041 item 1).
    • Spaces in the viewport (FR-22). Rooms render as translucent, per-space-tinted footprints with an in-scene label chip (name/number + area m²), behind a Spaces toggle on the stage toolbar (default on, offered only when the model has any). Selecting a room shows Name, Number and Area (m²) ahead of the usual Storey/Confidence/Source/GUID rows; a space has no dimensions to edit, so Edit is disabled for it. Spaces honor the persistent shell (camera, storey filter, colour-mode repaint on theme toggle) and appear in the read-only shared view too. The isometric WebGL fallback draws them as a dashed outline, never filled — a filled room plate on an upper storey would hide the walls below it.
    • Space review (FR-23). Rooms below the confidence threshold appear in the review queue with an evidence tile that highlights the room's actual boundary, not a bounding box. A space's verbs are Accept / Rename / Reject in place of Reclassify/Edit dims — Rename is a new correction kind that sets name and/or number and replays deterministically on re-export. Renaming never changes the element's GUID (identity is the room's placement, not its label), which is proven end to end by a dedicated test.
    • Spaces in exports (FR-21, FR-24). The exported IFC4 aggregates each storey's spaces via IfcRelAggregates (spatial structure, not containment), with an extruded-footprint SweptSolid body and a Qto_SpaceBaseQuantities quantity set — verified to re-import cleanly via an IfcOpenShell round-trip. The schedule export (.xlsx/.csv) folds spaces into the same flat, storey-then-class table as every other element: three new columns (name, number, area_m2), blank on every other class's row. A hide-dimensions share link strips a space's Area the same way it strips a wall's length — Name/Number/boundary still show, since those are identity and placement, not measurements.
    • Space evaluation (FR-25). The fixture generator and its independent ground-truth IFC writer now emit rooms; make eval matches spaces by footprint IoU ≥ 0.7 and grades per-class precision/recall plus a floor-area MAE (gated at 0.5 m², reported in the metrics screen), on the 2D route only — the mesh route's spaces class is excluded from grading on both sides, same convention as roofs.

    Try it: convert fixtures/out/aster-house/A-101.dxf + A-201.dxf + A-202.dxf (or open a building that already has), and on the workspace you should see three translucent tinted rooms with label chips at L00. Toggle Spaces off and on in the stage toolbar. Open the Review queue — one room (SP-L00-003, confidence 68, no label on the sheet) sits alongside the window flags; click it, Rename it, and save. Re-export, then open Versions: the diff line reads "…, 1 renamed" and the room's GUID is unchanged from the previous version. Download Schedule (.xlsx) on the new version — your renamed room's row carries its name, number and area in m², blank on every wall/door/window row around it.

    Known limitations of v0.5

    (v0.6 fixed the mid-upload Start-conversion race, the un-rendered failed tracker stage, the mesh-route evidence-tile mislocalisation, the version-select/download mismatch, the session-scoped reviewed counter, the vacuous 2D Roofs "Pass" row, the pre-re-export space dims_label blank, and the missing legend swatch/empty-state copy that used to be listed here — see "What's new in v0.6" above. The three items below are v0.5 design decisions, not defects, and v0.6 did not change them.)

    Three residuals from the v0.6 acceptance evaluation, recorded rather than hidden (none cost a criterion):

    • The dashboard still fetches every building over the wire. D-17 was fixed by windowing the client render at 60 with Load-more; the new GET /buildings pagination works but the dashboard does not consume it yet. v0.7 candidate.
    • The Evaluation screen shows "Not graded" only for runs made on v0.6. A stack whose newest stored eval predates v0.6 shows the old vacuous Roofs "Pass" until you click Run evaluation once.
    • Iso-fallback slab selection is edge-only. Spaces are now selectable (the v0.5 defect), but slab/roof plates hit-test on their painted edges, so a click in a slab's unfilled interior selects what is underneath.
    • Plans route only (D-041 item 1). A mesh-route building never gets rooms; it records the deferral as a building-scoped assumption instead of reconstructing anything.
    • Outer ring only, no interior holes (D-041 item 2/D-042). A column or a closed interior wall island inside a room does not carve a hole in its boundary — the room is recorded per-space as an assumption when this happens, and the exported IFC's NetFloorArea quantity is omitted entirely for that room (rather than silently equal GrossFloorArea, which would overstate it).
    • No boundary authoring or editing — a space's shape comes only from detection; the review verbs are Accept/Rename/Reject, never a geometry edit (v0.4's no-geometry-authoring rule stands for spaces too).
  3. v0.4

    FR-13 FR-14 FR-15 FR-16 FR-17 FR-18 FR-19

    v0.4 is a review-loop and viewport UX release (PRD §16, decisions in DECISIONS D-040). No conversion output changed: every IFC, every model JSON and every default-mode review tile is byte-identical to v0.3.

    • One persistent 3D viewport (FR-13). Workspace, Review, Versions — and Convert once the building already has a model — are now panels docked around a single canvas. Moving between them no longer rebuilds the scene: your camera position, your selection, the storey you filtered to and the section plane all survive the hop. A slow idle auto-orbit plays once at first reveal and stops permanently the moment you touch anything.
    • Camera presets and orthographic projection (FR-13). Top / Front / Left / Right beside the existing Fit, plus an ORTHO toggle, on the stage toolbar.
    • Colour modes (FR-14). Colour the model by class (the default, unchanged from v0.3), by confidence, by storey or by source, each with its own legend and both themes.
    • A guided pipeline (FR-15). One stage-aware primary CTA everywhere — Start conversion → Review N flags → Export vN+1 — with a matching one-line banner, a sticky "N corrections pending — re-export to apply" indicator that only export clears, and a confirmation toast on every correction verb. The Convert screen now shows an honest ETA (the median of previously completed jobs on the same route, and simply nothing when there is no history), says you can close the page, and raises a browser notification if the tab is in the background when the job finishes.
    • Show drawing (FR-16). A toggle on the stage toolbar ghosts the plan sheet a storey was reconstructed from, as vectors, at that storey's own elevation — so you can see the drawing under the model it produced. It follows the storey pills, and is hidden on mesh-route buildings, which have no sheets. The data comes from a new deterministic sheet_outlines.json sidecar written at finalize; nothing that already existed changed.
    • All detections in the evidence tile (FR-16). The review crop now draws every detection it contains, class-coloured, with the flagged element emphasised in amber. On by default; the toggle in the card header turns it back to the v0.3 single-highlight crop.
    • Schedule exports (FR-17). Every version row has a format select: IFC4 SPF (.ifc), Schedule (.xlsx) or Schedule (.csv). The schedule is grouped by storey then class and carries id, class, storey, per-class dimensions, confidence and GUID in a deterministic order. Switching format re-reads the same immutable version — it never reconverts.
    • Read-only share links (FR-18). Reviewers and admins can mint a revocable link (30-day default expiry) from the Versions dock. It opens a read-only workspace — viewport and properties, no correction verbs, no export — without a login, and can optionally hide dimensions. Revocation takes effect immediately.
    • Building-wide assumption overrides (FR-19). Under the assumptions log, two defaults can now be replaced for the whole building: storey height and single-face wall thickness. An override is an event, not a setting: it reads "pending — re-export to apply" until the next re-export replays it deterministically, then names the version it landed in. The assumption it supersedes stays in the log as history.

    Try it: convert fixtures/out/aster-house/A-101.dxf + A-201.dxf + A-202.dxf, then on the workspace click Show drawing and orbit — the plan sheet sits under the model at L00. Switch the colour-mode bar bottom-left to confidence, then storey, then back to class — the legend swaps with it every time, in both themes. Now walk Workspace → Review → Versions from the nav rail and watch the camera and selection stay put, hit Re-export from Review and notice the 3D is still there beside the progress dock, pick Schedule (.xlsx) on the v01 row, then mint a share link on that same row and open it in a private window — read-only workspace, no export button, no correction verbs.

    Known limitations of v0.4

    • The drawing ghost needs a conversion run on v0.4 or later — buildings converted before this release have no sheet_outlines.json, so the toggle reports that there is no drawing and switches itself off. Re-convert to get one.
    • Only two assumptions are overridable (D-040 item 6), and on the plans route a storey-height override supersedes nothing visible: plan-route storey heights are measured, so there is no assumption row to mark. The override still applies. Separately, none of the four shipped fixtures (aster-house, birch-studio, cedar-court, dorm-house) contains a single-face wall, so the single-face-wall-thickness override has nothing to visibly change against any of them out of the box — it does apply correctly, it just needs a mesh upload of your own with a genuinely one-sided wall to see it move a number.
    • Share links serve model, storey/outline, tile and version metadata only. There is deliberately no export, no correction and no user data on that surface, so a shared link cannot be used to review.
    • Rooms/IfcSpace are still out of scope (OPEN_QUESTIONS Q-005), so colour-by-space is not one of the four colour modes.
    • A background-tab job-completion browser notification can occasionally be raised twice for a single job. It's a harmless duplicate — the CTA, the pending-corrections indicator and the job's own state are unaffected — but don't read two notifications as two conversions.
  4. v0.3

    No FR numbers recorded in this release's notes
    • The mesh→BIM route (D-031, docs/MESH_PIPELINE.md). Upload a DXF that is a 3D model export — raw 3DFACE triangles, no layers, no text, no declared units — and Structura segments it into planar regions and reconstructs a semantic building: walls (paired faces, with a single-face fallback that says so), floor slabs, roofs, and openings recovered only from genuine holes in the mesh. Storeys and units are inferred from the geometry; there is nothing in these files to read them from.
    • Routing. All-mesh upload → mesh route. Mixed plans+mesh upload → plans route, plus an assumption recording that mesh content was present and not used (v0.3 converts plans or mesh, never both fused). The v0.2.1 "no floor plan" failure now fires only when there is neither.
    • IfcRoof as a first-class element (faceted panels, RF- ids), authored into IFC as a tessellated IfcPolygonalFaceSet, rendered in the viewport, and graded in eval by footprint IoU.
    • Provenance in the UI. Mesh-derived elements carry a "Mesh" badge in the properties panel, and their review evidence tiles are rendered from the mesh itself (an isometric render with the element's own faces highlighted), served through the same endpoint as 2D sheet crops.
    • Two-route grading. make eval now converts and grades both routes and reports them separately; the mesh route has its own, deliberately looser threshold block (D-032/D-034). The 2D thresholds are untouched.
    • Storey cap raised 5 → 15 (D-036, operator decision on real-file evidence). A building above the cap fails as scope, stating its inferred storey count.

    Try it: fixtures/out/dorm-house/M-001.dxf is a mesh export of a gable-roofed building — upload it and you should get 12 elements including RF-L00-001, one flagged door, and an IFC export containing IFCROOF.

    Known limitations of the mesh route

    Read docs/demo/v0.3/README.md before judging a real conversion. In short: columns and stairs are not reconstructed at all (out of scope, stated as an assumption on every mesh conversion); openings are under-recovered because asset-pack windows are often texture-mapped rather than modelled as holes; rooftop plant and masts are not modelled; and a wall seen from one side only gets an assumed 200 mm thickness at 62% confidence. Every one of these is surfaced as an assumption or a review flag rather than being silently absorbed.

  5. v0.2

    No FR numbers recorded in this release's notes
    • Projects (D-027): buildings are grouped under projects. The breadcrumb's first segment is now a project switcher (click it — list, "All projects", inline "New project…"); the dashboard scopes to the active project; a Projects panel in the dashboard sidebar renames (reviewer+) and deletes empty projects (admin). Everything pre-existing was backfilled into the seeded "Pilot Project". Uploads create buildings in the active project.
    Abridged — notes about the internal tooling this release used are not published here.
How to read this page

A release's own "known limitations" text is reproduced here unedited, including the parts that describe what it got wrong. Nothing is rewritten: an entry marked abridged has had a note about internal tooling removed whole, never reworded. The current limits of the product — as opposed to the limits of a past release — are on the limits page, and the measurements behind each release are on the accuracy page.