Open functions and tasks
State 24.10.2026. Open functions, known gaps and tasks, one section per sub-project; the order within a section is the order of work.
Kind: Function a new capability, Gap a known weakness of an existing one, Task testing, decisions and upkeep. Value 1 to 5 (5 = most useful). Effort with an estimate of the active working time (the lead and the agents together) and the new tokens (input, cache writes, output): S about 1 h and 0.5 M tokens, M about 2.5 h and 1.5 M, L about 6 h and 4 M. Calibrated on the measured requests of 15.-25.10.2026 (features page, tools/effort.py); Revit runs count only while someone works on them, the user's own review time is not in it.
Pointcloud2Revit
Scans (E57, PLY, LAS) to levels, walls, openings, floors, stairs and rooms. Code scan2revit/pointcloud/.
| Kind | Item | Value | Effort | Next step |
|---|---|---|---|---|
| Gap | Apartment scan with floor plan (test 25.10.2026, public sample of a scanner vendor, one storey, 8.9 M points): the outline and the large room fit (58.75 m2 against 60.5 m2 of the vendor's floor plan), but most interior walls are missed although the scan shows them: 2814 wall-face pairs rejected for floor or ceiling points between the faces; the floor spreads 7.8 cm (tilt or scans not aligned), the floor and ceiling bands reach into the walls. In Revit 22 of 25 checks: the rooms are placed but not enclosed | 5 | M (~2.5 h, ~1.5 M tokens) | partly done (25.10.2026): the rule 'no floor between the faces' now compares with the floor beside the pair for pairs up to 25 cm (noise at a thin wall's foot); apartment 27 -> 43 walls; a real storey against its IFC: wall length found 24.1 % -> 28.5 %, walls without counterpart 13 % -> 15 %, axis median 50 -> 56 mm. Open: rooms still from the free space; floor bands following a tilt showed no effect and were left out |
| Gap | Car parks and halls (test 25.10.2026 on a public car park scan, one scan position, 28 M points, 125 x 130 m): the slice route finds wall fragments only (46 pieces, 39 under 1 m), no columns, the room follows the scanner's line of sight; the floor falls 35 cm and comes out as five levels; outer walls 30-40 m from the scanner are thin in points | 4 | L (~6 h, ~4 M tokens) | columns from scans (with F8), a sloping floor as one level (F12), walls from sparse far points, rooms from the wall and column outline instead of the free space |
| Function | LAS / LAZ scans: laspy[lazrs] installed, a chunked reader with the 2 cm voxel thinning (as for E57), input report and slice route on LAS; first test file the Kladno station (6.5 GB, CC BY, test-data-sources.md) | 3 | S (~1 h, ~0.5 M tokens) | postponed by the user (25.10.2026): LAS ignored for the moment |
| Task | Two more test scans (a house, one scan station; an office floor, two stations) are Trimble RealWorks projects (.rwp, scans .rwcx, a closed format): no reader here; needs an E57 export from Trimble RealWorks (Create tzf Scan, then Export E57 structured) | 3 | S (~1 h, ~0.5 M tokens) | postponed by the user (25.10.2026) |
| Function | A4 Scan coverage per storey: share of every wall and of the outline seen, coverage image | 4 | M (~2.5 h, ~1.5 M tokens) | done (24.10.2026, pointcloud/coverage.py) real project data (details private); open: external scans not counted, arc walls not checked, write the share back into plan.json |
| Function | F1 Wall detection on densely partitioned real floors: real project data (details private) | 5 | L (~6 h, ~4 M tokens) | build on the slice route real project data (details private) |
| Function | F16 External parts of the point cloud (pointcloud/facade.py): exterior walls measured, slab outline from the facade ring (closed stepwise), edge on the walls' outer face, courtyards as voids | 5 | M (~2.5 h, ~1.5 M tokens) | done (24.10.2026), in Revit with the stacked storeys; open: rings where no facade is seen, storeys under the roof and below ground |
| Function | F3 Room separation lines where the slice route's rooms have no wall | 4 | M (~2.5 h, ~1.5 M tokens) | done (25.10.2026): free-space rooms closed by separation lines along their shared edges and the floor outline (shapely coverage_simplify); in Revit an apartment 11 of 11 rooms enclosed (was 0), a real storey 63 of 64 (was about 1); room areas as Revit bounds them. Open: where a face holds two rooms the line between them is missing; areas take in scan shadows (median error against the IFC 27 -> 34 %) |
| Function | F13 Stairs and ramps in the voids of the slab regions (steps in thin horizontal slices) | 4 | M (~2.5 h, ~1.5 M tokens) | – |
| Function | F12 Sloped elements: sloped roofs and ceilings, knee walls from the scan; slice route: measured opening heights, one wall from its upper and lower face | 4 | M (~2.5 h, ~1.5 M tokens) | a third slice or the top of each gap; sloped surfaces from the vertical sections |
| Function | F14 Slab outlines with straight, square edges instead of the 10 cm raster (fewer Revit warnings) | 3 | S (~1 h, ~0.5 M tokens) | done with F16 where an external scan closes the ring; without one still the 10 cm raster |
| Gap | Galleries: missed at 3 m section spacing, not built as their own Revit level yet | 3 | M (~2.5 h, ~1.5 M tokens) | – |
| Gap | Doors and windows: few found on real floors | 3 | M (~2.5 h, ~1.5 M tokens) | after F1 |
| Gap | Stairs: straight runs only; curved walls: circular arcs only | 2 | L (~6 h, ~4 M tokens) | stairs with landings: F5 |
| Gap | Memory: large real storeys still take much memory on the full route real project data (details private) | 2 | M (~2.5 h, ~1.5 M tokens) | slice route by default |
| Gap | Slab voids under 5 m2 are not cut | 2 | S (~1 h, ~0.5 M tokens) | – |
IFC2Revit
IFC storeys to native Revit elements, all storeys in one model. Code scan2revit/ifc/ and core/merge.py.
| Kind | Item | Value | Effort | Next step |
|---|---|---|---|---|
| Gap | IFC wall pieces assigned to a storey they do not stand in (base offsets of a whole storey up or down): built at their true height they no longer bound that level's rooms | 4 | S (~1 h, ~0.5 M tokens) | move such pieces to the level they stand on before the build (merge) |
| Function | A3 IFC pre-check: what Revit will refuse (degenerate arcs, short pieces, duplicates), fixed where safe, reported | 4 | S (~1 h, ~0.5 M tokens) | done (24.10.2026, ifc/precheck.py, in the storey route; pieces stacked by base offset, which the Revit side now applies) real project data (details private); open: a few doors Revit refuses with very narrow jambs, partitions under 40 mm reported only |
| Task | Revit test of the whole real IFC building through pyRevit (0.7) | 5 | S (~1 h, ~0.5 M tokens) | done (24.10.2026) real project data (details private) ; 25.10.2026 with pre-check, base offsets, slab holes: real project data (details private) |
| Gap | IFC: a few walls and their openings Revit refuses ("Wand kann nicht erstellt werden"), doors in curved walls | 3 | M (~2.5 h, ~1.5 M tokens) | real project data (details private); doors in curved walls placed since 25.10.2026 |
| Gap | Doors on locked (fire-rated) families keep their size real project data (details private) | 4 | S (~1 h, ~0.5 M tokens) | F2 (a door family with free size) |
| Function | F5 Stairs with landings (IFC flights; also for scans) | 3 | L (~6 h, ~4 M tokens) | – |
| Function | F6 Wall types by the IFC type name | 3 | M (~2.5 h, ~1.5 M tokens) | – |
| Function | F7 Slab holes and openings from the IFC | 3 | M (~2.5 h, ~1.5 M tokens) | done (24.10.2026): IfcOpeningElement in slabs and inner loops of slab outlines real project data (details private); in Revit: next run of the whole building |
| Function | F8 Columns and beams | 3 | M (~2.5 h, ~1.5 M tokens) | – |
| Function | F9 Curtain walls with their doors and windows | 3 | L (~6 h, ~4 M tokens) | – |
| Gap | Rooms without IfcSpace: areas off where walls overlap | 2 | M (~2.5 h, ~1.5 M tokens) | – |
| Function | F10 Door swing from the IFC: single-swing doors from the placement (opens towards local +Y) and the operation type (hinge side) | 2 | S (~1 h, ~0.5 M tokens) | done (24.10.2026) real project data (details private); double doors without swing |
Plans2Revit
2D plans to Revit: DXF and vector PDF, raster plans through plan-extract results. Code scan2revit/plans/.
| Kind | Item | Value | Effort | Next step |
|---|---|---|---|---|
| Gap | Knee walls under a sloping roof built as wide as the drawn band (thickness and height flagged assumed) | 3 | S (~1 h, ~0.5 M tokens) | decision D-18 |
| Function | Plan sheets with several storeys (plans/sheet.py): drawings split, storey labels, ordered bottom first, aligned | 5 | M (~2.5 h, ~1.5 M tokens) | done on one real CAD sheet (four storeys); a test needs example sheets from the user |
| Function | Orientation and scale from the sheet: scale from the title block ("1 : 100") done; turning a sheet whose text is not upright not built yet | 5 | S (~1 h, ~0.5 M tokens) | a turned sheet as example |
| Function | Rooms with the data of their stamps: name, unit (Revit "Abteilung"), number storey.unit.nn; a room at every stamp | 5 | M (~2.5 h, ~1.5 M tokens) | done; in Revit on a real sheet, every check passes (23.10.2026) |
| Function | Clutter filter: built-in units, sanitary, text masks, annotation; list in the modelling guideline, machine list plans/filters.json | 4 | M (~2.5 h, ~1.5 M tokens) | done; furniture only implicitly (no wall pairs) |
| Function | Walls drawn as filled areas in vector PDFs: wall rectangles, openings where the rendered wall colour is absent, swings from chains of short lines | 4 | S (~1 h, ~0.5 M tokens) | done |
| Gap | Rooms on a real sheet not all closed by walls: real project data (details private) after the corner joins, stub and jog fixes and knee walls (24.10.2026) | 3 | S (~1 h, ~0.5 M tokens) | the open balcony is correct as drawn; in Revit: next run |
| Gap | Plan sheets: small symbols drawn in wall colour outside the building became wall stubs; a door beside a window in one gap got only the window | 3 | S (~1 h, ~0.5 M tokens) | done (24.10.2026): loose groups under 1.5 m outside the outline left out and listed; a window gap with a swing at one end split into door and window |
| Function | Storey heights from the elevations sheet (levels and heights instead of the assumed storey height) | 4 | M (~2.5 h, ~1.5 M tokens) | built (24.10.2026, plans/sheet.py --elevations): level marks of vector elevations or sections; real project data (details private), needs a vector sheet with level texts |
| Function | F4 Raster PDF (scanned plan) into Revit: postponed (22.10.2026) | 4 | S to L (1-6 h, 0.5-4 M tokens) | own reader for filled walls preferred; OCR of room stamps; scale from stamps or dimensions |
| Function | Handwritten measurements on a scanned plan (other ink) as checks, kept out of the geometry | 3 | M (~2.5 h, ~1.5 M tokens) | with F4 |
| Gap | plan-extract run locally: blocked, the segmenter model is not public | 2 | – | only needed for thin-line or sketched plans |
| Gap | plan-extract results: one room the walls do not close; never run on a real result | 2 | S (~1 h, ~0.5 M tokens) | a real result |
| Function | F11 Own raster reader instead of plan-extract | 3 | L (~6 h, ~4 M tokens) | part of F4 |
Shared: core, Revit side, agent team
The plan schema, wall geometry, merge, the Revit side through pyRevit 7, the modelling guideline and the agent team. Code scan2revit/core/, tools/, .claude/.
| Kind | Item | Value | Effort | Next step |
|---|---|---|---|---|
| Function | Room tags (Raumstempel) with the area in every floor plan of a room's level, room data of the input (name, number, unit, use, finishes), the rooms' interior fill shown in the floor plans (rule G-9.6) | 4 | S (~1 h, ~0.5 M tokens) | done (25.10.2026): nine examples 312 of 312 in Revit; the fill is Revit's pale blue on screen, not in prints or image exports |
| Function | Point clouds from Autodesk ReCap (RCP / RCS): link into the Revit copy, read the slices with point cloud filters through pyRevit, on into the slice route | 3 | M (~2.5 h, ~1.5 M tokens) | needs a test RCP with its RCS from the user |
| Function | F25 Deviation analysis: the built model against the scan, per element (signed median, 95 %, LOA share, coverage, verdict pass / fail / not verifiable), missed-element candidates, bias per class, coloured images per storey (deviation-and-review.md 1) | 5 | L (~6 h, ~4 M tokens) | first: which points to verify against (held-out bands, independent scans, element surface only with normals, clutter out, even thinning, minimum evidence, visible face only, noise baseline) |
| Function | F26 Review and correction as one loop: flagged items shown with scan and deviation, a person accepts, moves, changes, deletes or adds, the plan is edited, the stages and checks run again, every decision on the scoreboard (deviation-and-review.md 2); planned agent: review man | 5 | L (~6 h, ~4 M tokens) | after F25 and the review page F18 |
| Function | F27 Browser viewer with That Open Company libraries (ifc.js: @thatopen/components, web-ifc): model, scan slices and deviation colours on localhost, for the review loop and the fact review | 4 | M (~2.5 h, ~1.5 M tokens) | done (25.10.2026, first version): scan2revit/tools/viewer.py serves scan2revit/viewer/ on 127.0.0.1 only: plan (walls, openings, floors, rooms, stairs) per level, scan points in the plan frame with a height band, an IFC through web-ifc (three.js 0.186.1, web-ifc 0.0.78, pinned; MIT / MPL-2.0), colours by kind or measured / assumed, element records on click; open: deviation colours (F25), review cards (F26), IFC properties panel |
| Task | F28 Meshing: not in the modelling routes (research 25.10.2026, deviation-and-review.md 3); possibly for the viewer and as reference surface of non-planar elements | 2 | S (~1 h, ~0.5 M tokens) | decision D-24 |
| Function | F17 Facts from drawings: catalogue of 29 information types from plans, sections, elevations, build-up legends, schedules, site plans into facts.json per project (drawings-and-scans.md) | 5 | L (~6 h, ~4 M tokens) | the types half built first (scale, storeys, levels, walls, openings, swings, stamps), then sections and labels |
| Function | F18 Review page: a person accepts, corrects or rejects every fact at gate 1, crops of the drawing beside each value | 5 | M (~2.5 h, ~1.5 M tokens) | after F17; decision D-15 (local server) |
| Function | F19 Drawings aligned to the scan frame per storey (2D fit of wall axes, person confirms) | 5 | M (~2.5 h, ~1.5 M tokens) | needs drawings and a scan of the same building from the user; D-14 |
| Function | F20 Drawn facts as priors in modelling: levels, thickness of one-sided walls, slab thickness, opening heights, room names on scan rooms, drawn walls as hypotheses for the slice route | 5 | L (~6 h, ~4 M tokens) | after F18, F19; D-4, D-16 |
| Function | F21 Checker: drawn vs measured for every accepted fact, unused facts listed | 4 | M (~2.5 h, ~1.5 M tokens) | after F20 |
| Function | F22 Local LLM helper (local-llm.md): text classification, build-up parsing, raster reading; always proposed facts, checked by code | 3 | M (~2.5 h, ~1.5 M tokens) | measure speed on this machine, pilot on the plan sheets; D-7 |
| Function | F23 Build-ups (floor, wall, roof) parsed into layers and thicknesses; slab thickness from them | 4 | M (~2.5 h, ~1.5 M tokens) | with F17; D-5 (generic types stay) |
| Task | F24 Agent team phases updated for drawings first (phase 2a, alignment 2c, review at gate 1, drawn vs measured in the check) | 4 | S (~1 h, ~0.5 M tokens) | planned phases described in agent-team.md (24.10.2026); the agent files follow with F17 to F21 |
| Task | GitHub sources: licence and security check before any skill or code is taken; pinned and listed (github-sources.md) | 3 | S (~1 h, ~0.5 M tokens) | rule in place; third_party/README.md with the first copied file |
| Function | S1 Agent scoreboard: actions, findings, defects found and fixed, gate verdicts and check scores per agent and project, summed up over projects | 5 | M (~2.5 h, ~1.5 M tokens) | done (24.10.2026, tools/scoreboard.py; every phase records its entry; summary documentation/agent-scoreboard.md, site page agents.html); first real use: the team's next test build |
| Function | V1 Rule ids in the modelling guideline, each rule with its Revit check; R2 table rule -> check | 4 | M (~2.5 h, ~1.5 M tokens) | done (24.10.2026): ids G-0.1 to G-13.4, checks prefixed with their id, new checks G-1.2, G-4.2, G-11.2, G-11.3, table in section 14; open: checks for G-5.2 (wall base and top), G-5.4 (room bounding), G-11.1, G-11.5 (names); decision D-20 for G-11.4 |
| Function | R1 Rule proposals: agents propose guideline changes in their handover, the project manager collects them, the user approves | 4 | S (~1 h, ~0.5 M tokens) | done (24.10.2026): handover section, rule-proposals.md, approval by the user |
| Function | V2 Comparison with a reference (an IFC of the same building) as a standard checker step, LOA tolerances | 4 | M (~2.5 h, ~1.5 M tokens) | done (24.10.2026, core/compare.py, in phase check) real project data (details private); open: arcs, stairs, opening heights; IFC linings as walls (--min-thickness) |
| Function | V3 Each Revit run compared with the previous one: checks gained, lost, still failing | 3 | S (~1 h, ~0.5 M tokens) | done (24.10.2026): e2e runs and project checks say what changed since the last run |
| Function | A1 Machine-readable input reports for every route (verdict per item) | 4 | M (~2.5 h, ~1.5 M tokens) | done (24.10.2026, core/inputs.py: pointcloud, ifc with the pre-check, plans); limits are start values (D-21) |
| Task | Unattended runs: check that the pyRevit agent host answers Revit's failure dialogs like the old add-in | 4 | S (~1 h, ~0.5 M tokens) | done (24.10.2026) real project data (details private) |
| Function | F2 A door and a window family with free size in the blank project (the template) | 4 | S (~1 h, ~0.5 M tokens) | you: load the families into the template |
| Task | Agent team: first model built in Revit, phase by phase with its gates | 4 | M (~2.5 h, ~1.5 M tokens) | the synthetic project first, then a real building |
| Function | F15 Modelling guideline: phase "Existing" for every element, a parameter measured / assumed on walls, floors, doors and windows | 3 | S (~1 h, ~0.5 M tokens) | done (24.10.2026): stage existing, shared parameter scan2revit source; checked by the runner |