Version3.22.0 · 📋 RECORDS + A REAL PORT CHECK — closing the last of the element-sweep findings. (1) No more silent data loss: ~20 inspector fields that were set but dropped from the as-built GeoJSON — building use (residential/commercial), phase, pole/mount/riser heights, guy lead, ground-rod length, OLT Tx, ONT Rx window, closure through-fibres / entry-ports / slack loop / operating-temp / bend radius, chamber racks, slack-coil stored length — are now written to the export, so what you set is what the records keep. (2) The closure "Entry ports" field was a promise with no check; now a real DRC (IEC 61753-1 / GR-771): declare N cable-entry ports and if more cables enter than fit, the Design Advisor flags it. (3) Corrected the mount-height tooltip that implied an automatic clearance check (it records the height for the make-ready/NESC review). · 3.21.0 · 🔬 ONT SENSITIVITY IS NOW REAL — a pinned ONT grades against ITS receiver window, not just the generic PON class. Before, the ONT model picker set a receiver window (e.g. an XGS-PON ONT's −30 dBm sensitivity) that the inspector displayed but the loss verdict ignored — it always tested against the PON class floor (B+ = −27), so a drop delivering −28/−29 dBm (fine for that ONT) was wrongly stamped FAIL, and a weak ONT could read PASS. Now the optical budget engine accepts a per-hardware receiver window: an ONT element carrying a datasheet window grades against it; a plain home with no pinned ONT still uses the standard PON-class window (so nothing changes for existing designs — verified). Wired end-to-end (optical_budget.evaluate_link + /api/sim/budget/evaluate + the server DRC + the client live grader, with full parity). Note: the OLT Tx figure is deliberately still taken from the PON class — the node's Tx is class-seeded and not yet class-tracking, so auto-applying it would wrongly cap higher-class designs; that cleanup is a follow-up. · 3.20.0 · 💵 DEFAULT CURRENCY USD — the platform now works in US Dollars by default. USD is the base currency (rate 1.00), so the reference rate card and every BOM / BoQ / business-case / report figure reads in $ with the round numbers unchanged (a $285 pole stays $285, not a converted €→$ figure). The multi-currency engine is intact: switch the project's display to € or IQD under Settings ▸ Financial & currency (defaults USD→EUR 0.92, USD→IQD 1310, all editable to your booking rate), and every money string — including the Operations workspace valuation/billing, the portfolio dashboard and the AI Quick Estimate — follows it. All hardcoded € display was routed through the one currency formatter so nothing is left showing the wrong symbol. · 3.19.0 · 🧹 ELEMENT SWEEP FIXES — after the splitter fix, a systematic audit of every element found the same class of bug elsewhere; these are the confirmed, high-impact ones. (1) €0 PRICING: FDH, ODF, pedestal, grounding and building-entry elements were absent from the cost engine's node map — they added €0 to the BOM and no line to the BoQ. Now priced + a labour takeoff line each. (2) OLT DUAL VOCABULARY: the inspector Model picker ("OLT 7-slot") and the device-GUI chassis picker ("7-slot") named the same chassis differently and never reconciled — so the device GUI ignored the picked model (always fell back to a 7-slot chassis), the BOM under-costed a device-GUI chassis pick to the 2-slot price (€5,800), and the DRC/capacity used a stale port count while the device view showed something else (an OLT could "fail port capacity" AND "show free ports" at once). Now both pickers reconcile on the chassis, OLT capacity = service-slots × 16-port cards (2-slot 32 · 7-slot 112 · 17-slot 272), and the BOM prices by chassis size regardless of which picker named it. (3) MDU BASEMENT SPLIT: a freshly-placed 4×4 MDU had no basement splitter until you happened to nudge floors/apartments — so its feed cable was over-sized and its worst-apartment Rx read ~17 dB too optimistic. Now seeded on placement. (4) SPLITTER-OVERFLOW DRC: the "N outputs but must feed M subscribers" check only covered FDT/FAT/ATB/closure — an over-split FDH, ODF, pedestal or standalone splitter passed silently. Now covered. (5) SCTE-77 LABEL: the closure direct-burial tier picker still said "Tier 22 — HS-20", conflating the SCTE-77 crush tier with the separate AASHTO wheel-load cover — corrected to match the chamber picker. · 3.18.0 · 🔧 SPLITTER FIX — one coherent split ratio. A splitter had TWO independent ratio controls that could silently contradict each other: the Model picker at the top (Generic · PLC 1:8 / 1:16 / 1:32, which set only n.ports + the label) and the cassette ratio below (1:2…1:64 + 2:N). The optical/loss/capacity/occupancy engine ONLY reads the cassette ratio — so picking "PLC 1:32 module (32 port)" changed the label but the splitter still split 1:8 (still 10.5 dB, still overflowed at 8 subscribers): the Model picker was a silent no-op, and the "32 port" was a lie. Now the two are ONE property, synced both ways: choosing a module drives the actual split (and ports), and changing the cassette updates the module label + ports — so Model, Specs, ports, cassette, schematic loss and the engine always agree. The model catalogue now covers the full 1×N range (1:2/1:4/1:8/1:16/1:32/1:64), and a standalone splitter is a single module (no more confusing "cassette 1 / 2"). 2:N protection ratios show an honest synthesised label. Engine unchanged (it was always cassette-driven); the labels no longer mislead. · 3.17.0 · 🗂 EXPLORER DETAILS — the element tree is now a working inventory, not a flat list. Every element row shows an at-a-glance summary inline (a pole's ANSI class + material, a FAT's split ratio + ports, an MDU's floors×apartments, an ONT's serial…), and selecting one opens an inline DETAIL CARD right in the tree: its identity + status/phase, model, the standards attributes that are set (material, class, height, load tier, cover, IEC enclosure category, IP, fire rating…), its LIVE connectivity (every cable in/out with the other end's name, tier and length — each a link that jumps to that element), and its structural hosting (what it's mounted on / what it hosts, also as links), plus ⌖ Zoom-to and ✎ Properties actions. Fixed a real annoyance: expanding a type group no longer collapses the moment you click anything (group open-state now survives the redraw). The full editable Inspector still lives in the right-hand panel; the Explorer is now the fast way to understand and navigate the whole design. · 3.16.0 · ⚡ AI QUICK ESTIMATE (closes the ML/automation gap — a LEARNED model, not another rule) — instant napkin-stage feasibility from a machine-learning SURROGATE of the design engine. We generated hundreds of synthetic towns, had the REAL auto-design engine design each, and fitted a log-linear ridge model (backend/sim/mapper_predict.py) mapping just homes + area → the plant it takes: trench km, cable km, FATs, FDTs, PON ports (held-out accuracy: FATs 3%, cable 9%, PON 10%, trench 19%, FDTs 26%). Analyze ▸ ⚡ Quick estimate (AI) turns those into a costed CAPEX range (with an overridable reference rate card) the instant you type two numbers — before drawing anything — so you can price a bid or sanity-check a district in seconds. It's genuinely learned (fitted by least squares on the engine's own output, not a hand-written formula) and clearly framed as an ESTIMATE: the full auto-design + cost engine remains the authority. Exposed at /api/sim/mapper/predict and on the public Open-API (/api/v1/mapper/predict). This closes the LAST of the structural gaps found in the world-leader comparison (brownfield, open API, mature solver, versioning/branches, portfolio, construction billing, NMS assurance, and now AI). · 3.15.0 · 📡 SERVICE ASSURANCE & NMS BRIDGE (closes the activation/NMS gap vs Nokia Altiplano/Calix) — the platform now closes the loop from design to LIVE network. Subscribers already carried the DESIGNED optical budget (per-drop designed Rx + the ONT Rx window, checked once at activation); this adds the ongoing loop: a northbound ingest (POST /api/sim/nms/telemetry, authenticated with the Open-API key or the first-party token) that an OLT / NMS / ACS pushes live ONT telemetry into — Rx/Tx power, temperature, oper-state, alarms — keyed by optical serial, latest-wins. Each reading is matched back to its subscriber by serial and graded against that subscriber's designed link budget: down (LOS / dying-gasp / offline), degraded (Rx outside the ONT window), marginal (drifting >3 dB below the designed Rx but still in window), or ok. The Operations workspace ▸ 📡 Network health view rolls it up (subscribers · monitored · healthy % · needing attention) and lists every subscriber worst-first with design-vs-live Rx, alarm/state, verdict and the reason — so budget drift shows up before it becomes an outage. Telemetry is stored by serial and only surfaces where the serial is YOUR subscriber (no cross-tenant leak). Server-side sim/assurance.py. · 3.14.0 · 💰 CONSTRUCTION VALUATION & MILESTONE BILLING (closes the milestone-billing gap vs Sitetracker/Render) — the build can now be PAID. Work-order execution already turned the issued design into cost-coded tasks (trench/pull/splice/install/drop/test) with quantities and a lifecycle; this values them and issues interim payment certificates (IPCs) — the instrument a fibre contractor actually invoices against. Every task is valued qty × rate from a construction rate card (€/m trench, €/m cable, €/splice cassette, €/node, €/drop, €/test); done work counts in full, in-progress at a configurable credit; tasks roll up into billing milestones (civil / cabling / splicing / structures / drops / testing). The Operations workspace ▸ 💰 Valuation & billing shows the milestone table + earned-value progress and a payment certificate that nets retention and everything previously certified, leaving the amount due this period. Issuing an IPC persists a numbered, cumulative claim so the next certificate starts from it — a real progress-billing ledger. Server-side (sim/billing.py + /projects/{id}/valuation, /valuation/certify, /claims), the certify guarded by the manager (wo.dispatch) capability. · 3.13.0 · 📊 PORTFOLIO DASHBOARD (closes the multi-project / portfolio gap) — the Operations workspace landing is now a real cross-project KPI roll-up, not just a project picker. A new server endpoint (/api/sim/projects/portfolio) aggregates, from each project's LATEST revision, the design KPIs that already live in the stored records — homes passed, CAPEX (BOM grand), cable km, build progress % — and rolls them into tenant-wide totals, scoped exactly like the project list (root: all tenants; staff: whole tenant; designers: own ∪ shared). The landing shows a totals strip (projects · homes passed · portfolio CAPEX · cable · avg build %) and every project card gains a design line (🏠 homes · 💶 CAPEX · 🧵 km). Pure roll-up of stored numbers, so the portfolio can never drift from the designs. Scale: the capacitated districting solver handles thousands of terminals in seconds, and a ~1,900-home town auto-designs end-to-end in ~14 s (the FAT-siting street-search is the next stage to optimise for larger towns). · 3.12.0 · 🌿 DESIGN VARIANTS + NAMED REVISIONS (closes the enterprise-inventory gap vs Smallworld/IQGeo) — the linear revision chain can now hold ALTERNATIVES. File ▸ Design variants saves the current design as a named branch — "all-buried" vs "aerial feeders", a value-engineered option — off the bound server project, WITHOUT touching the issued/as-built baseline. List them, COMPARE any variant against your latest revision (or another variant) with the same diff engine that powers revision diffs (added/removed/modified entities + BOM € delta), RESTORE the one you want into the editor, and delete the rest. Revisions also grow an optional human LABEL ("permit submission", "Phase 2") alongside the number. Server-side (sim/projects.py design_variants table + /projects/{id}/variants CRUD + /variants/{id}/diff), tenant- and write-permission-guarded like every project resource; variants live outside the contractual chain so exploring an option can never corrupt the construction baseline. · 3.11.0 · ⚡ MATURE OPTIMISER (closes the solver-scale gap vs Comsof/Setics) — the auto-design districting is no longer a single greedy pass. A new server-side capacitated solver (sim/mapper_solver.py) ships two textbook telecom optimisation primitives: the Esau-Williams capacitated minimum-spanning-tree (the classic concentrator/feeder aggregator — benchmarked at 80–83% shorter trunk than home-run stars on shared corridors) and a capacitated k-means districting (farthest-point seed → Lloyd relocation under capacity → nearest-neighbour swap/move local-search). Turn on Auto-Design ▸ ⚙ ▸ High-quality solver and the FDT districting uses it: tighter districts, shorter distribution + feeder cable (−4% / −7% on a uniform grid town, more on irregular demand), for ~2% extra compute. Deterministic (fixed seeds + stable tie-breaks, so a design recomputes identically) and it SCALES — the local search only examines each district's nearest neighbours, so 2000-terminal districting runs in a few seconds and full auto-design stays sub-linear-feeling on 1000+ home towns. Fast single-pass remains the default; the quality path is opt-in. · 3.10.0 · 🔌 OPEN API (closes the integration gap vs the world leaders) — the design engine is now programmable from OUTSIDE the app. A stable, versioned public surface at /api/v1/mapper/* exposes the SAME server-side engines the app uses — auto-design, topology/strand, DRC/standards, build-readiness, PON capacity, protection, duct-fit, device-view, BOM, BoQ and the DCF business case — so a partner's OSS/BSS, GIS, contractor portal or the customer's own tooling can drive planning/compliance/costing programmatically: post a design snapshot, get computed results back. Auth is by API key (X-API-Key or Authorization: Bearer), constant-time verified from a server-held key list — the first-party app keeps working unchanged behind its internal token, and one handler body serves both so the two faces can never drift. Self-documenting: GET /api/v1 is a machine-readable catalog of every operation, GET /api/v1/openapi.json is a full OpenAPI 3.0 spec BUILT FROM THE LIVE request models (so it always matches what the endpoints accept), and GET /api/v1/docs (Help ▸ Developer API) is a human reference. Crucially, only the input→output CONTRACT is published — the optimiser, rule and costing IP still runs server-side and is never returned or shipped to the browser. · 3.9.0 · 🏗 BROWNFIELD IMPORT (closes the #1 structural gap vs the world leaders) — you can now INGEST an existing network, not just export one. File ▸ Import existing plant (GeoJSON) reads a GeoJSON FeatureCollection of existing plant and materialises it: Point features → nodes (poles, manholes, hand-holes, closures, FDT/FDH/FAT cabinets, splitters, grounding, entry…) mapped by their kind/type property, WITH their standards attributes reconstructed (material, ANSI class, SCTE-77 tier, IEC closure category/IP, cover rating, depth, vendor/model/serial…); LineStrings → cables (endpoints auto-resolved to the nearest node, with fibre count, tier, cable_type, fire-rating…), ducts and trenches. It round-trips our own records-grade as-built faithfully and makes a best effort on generic GeoJSON (Esri / QGIS exports, kind→type aliases like cabinet→FDT, vault→manhole). It auto-establishes the map projection from the data's lon/lat bounds (or reads local-metre coords), tags every imported item as EXISTING + locked (a grey dashed ring on the map) so Auto-Design keeps it and DIG-ONCE reuses the imported ducts/trenches. An incumbent operator can now onboard their plant and extend it — the thing that previously made the tool greenfield-only. · 3.8.0 · 🔤 CABLE MODEL DESIGNATIONS (Chinese YD/T + international) — you can now pick the REAL cable type when running a cable, from a standards-accurate catalogue. Chinese GB/T 7424 / YD/T 901 outdoor codes — GYTA, GYTS, GYTA53, GYTA33, GYXTW, GYXTC8S, GYFTY, GYFTCY (ADSS), GYDTA… — the FTTH drop codes GJXH, GJXFH, GJYXCH, GJYXFCH, GJYXFHA, and international/ICEA structure names (loose-tube, central-tube, ribbon, rollable-ribbon, micro, flat-drop, figure-8, ADSS, SJSA-armoured, OPGW, MST). Pick one in the cable Inspector and it shows the LETTER-BY-LETTER decode + application + armoured / self-supporting flags. Every decode was researched against the standards and adversarially verified — e.g. GYXTW's W is correctly a STEEL-PE (钢-PE) sheath sandwiching two steel wires ("steel-PE-steel"), NOT aluminium; T = jelly-filled; A = APL moisture laminate (not armour — armour is the trailing numeric code 53/33); ADSS = Telcordia GR-3421; the light-armoured duct bow-drop is GJYXFHA (not the common mis-spelling GJXFA). The designation travels with the cable into the GeoJSON as-built (cable_type). · 3.7.0 · 🧵 OPTIONAL AUTO-DESIGN DUCTING (direct-burial stays the default) — a new ⚙ next to Auto-Design opens options: cables are direct-buried in the trenches by default (no conduit — the correct, common method), but you can now opt IN to duct where it matters. "🧵 Duct the feeders" pulls each feeder through a Ø50 mm conduit (future capacity + re-pull, and the per-cable duct-fit check then runs on the feeders — the cable is tagged in-duct). "🛣 Duct road-crossing segments" detects where a buried cable actually crosses a street and lays a short Ø110 mm bore there (road protection), leaving the rest of the run direct-buried. The toggles persist with the design; re-running Auto-Design replaces the auto ducts (DUCT-Auto-*) like the auto trenches, and the completion summary says what it laid. Both stay OFF unless you ask — so nothing forces conduit onto a cable that should just be direct-buried. · 3.6.0 · 🧭 DESIGN HEALTH + ONE-CLICK CLEANUP (the Advisor, closed-loop) — the Violations panel now leads with a DESIGN HEALTH score (0–100 + letter grade) that rolls up every rule fail and warning into one glance: a green 90+ means buildable, a red score means work to do. Next to it, when the DRC found issues the platform can fix unambiguously, a single ✨ Auto-fix N button applies EVERY safe fix at once — upsize the over-full cables, set ports to what's actually served, add the mid-span poles, IP68 the buried closures, 2:N-or-bond where needed — then re-runs the server DRC so you watch the score climb in real time (the banner shows the before score). This turns the per-item Advisor into a whole-design optimiser and makes auto-design closed-loop: design → check → auto-repair → re-check. Judgement calls it won't touch on its own (the ones with no unambiguous fix) stay in the list for you to decide. So "is this design buildable, and what's the fastest path to green?" is now one number and one button. · 3.5.0 · 🛡 TRUE PROTECTION DIVERSITY (SRLG across backups) — the protection planner's "fully diverse" claim is now honest. Before, each backup route only avoided its OWN primary — so two standby feeders could quietly share the same street, and every Type A/B backup silently shared the single egress out of the backup OLT. Now the SRLG mask ACCUMULATES: as each backup is routed, it must avoid its primary AND every backup already placed, so the standby feeders spread onto separate streets. Each backup reports how much path it shares with its SIBLINGS (not just its primary), and a backup that overlaps a sibling is downgraded from "diverse". And the shared BACKUP-OLT EGRESS is now flagged as the single-risk point it is — a new ⚠ Shared-risk advisories block in Reports ▸ Protection says "all N backups share the egress from OLT-Backup-1 — for true N+1 add a second backup OLT at a separate site." The overall verdict can no longer read fully-green while a single fault point or a backup-on-backup overlap remains. · 3.4.0 · 🧱 AUTO-DESIGN NOW LAYS CIVIL — the biggest coherence gap closed. Auto-Design used to return bare cable polylines with no excavation, so dig-once reuse, the BoQ trench takeoff and trench-sharing had nothing to work with. Now the planner emits DIG-ONCE TRENCHES: it collapses every buried (feeder + distribution) cable path into unique undirected street segments — so two cables sharing a street are dug ONCE — chains the contiguous segments into tidy trench runs, and materialises them as TR-Auto-N (0.4 m × 0.8 m soil, editable). Feeder/distribution already run buried via the tier civil-method defaults, so the trenches immediately drive the civil BoQ takeoff, dig-once reuse (route later cables through them) and the trench-congestion / sharing checks; re-running Auto-Design replaces the auto civil rather than stacking it. (Next: assigning ducts inside the trenches so the per-cable duct-fit check runs on auto output too.) · 3.3.0 · 🛡 TYPE C — REAL FULL DUPLICATION (fixes a modelling bug) — Type C protection was wrongly reusing Type B's 2:N first-stage change; per ITU-T G.984.1 that's not what Type C is. Type C now does proper FULL PATH DUPLICATION: it drops a SEPARATE protection splitter (role = protection, locked, a violet dashed ring on the map) beside each first-stage splitter — a parallel 1:N fed by the diverse protection path, NOT a 2:N combiner — and marks every served ONU DUAL-INTERFACE (a second receiver that switches on a working-path failure; shown as 🛡 in the home Inspector). The step tells you exactly how many splitters + ONUs it will add. The protection splitters are priced ONCE — in the Protection BOM category (the working equipment count now excludes role='protection' so there's no double charge) — and clearing the protection plan removes them again. Type B still correctly does the 2:N dual-input change. So each ITU-T G.984.1 type now lands as the RIGHT physical topology: A = shared port + diverse feeder; B = one 2:N splitter + standby port; C = a full parallel splitter + dual ONUs. · 3.2.0 · 🛡 PROTECTION THAT BUILDS ITSELF — the backup-plan flow now instantiates the real redundancy hardware and applies the standards-mandated splitter change, instead of just listing them. After you pick a Type (A/B/C), for Type B/C it asks WHERE the standby PON port lives — a 🛡 SEPARATE BACKUP OLT (recommended: adds OLT-Backup-1 with role=backup beside the CO, so the diverse feeders originate from it and the design survives a whole-OLT failure) or a 🖥 BACKUP CARD IN THE MAIN OLT (adds a standby PON line-card to a free chassis slot — cheaper, protects the feeder + port but not an OLT failure; warns if the chassis is full). Then it PROMPTS about the splitter change: per ITU-T G.984.1, the first-stage (PON-port) splitter must become 2:N — a dual-input PLC splitter, input 1 = working feeder, input 2 = the diverse protection feeder. It lists exactly which splitters change (1:8 → 2:8, 1:32 → 2:32, …) and, on Apply, converts every first-stage splitter to 2:N before planning the diverse routes. Type A shares the working port (no standby hardware, no splitter change). So a redundancy plan now lands as real, priced, standards-correct hardware — backup source, 2:N splitters and diverse routes — not a to-do list. · 3.1.0 · 🤖 SMARTER AUTO-DESIGN — Auto-Design now does two more things for you. (1) 🏢 IT SITES THE CO ITSELF — you no longer have to place an OLT first: if none exists, the planner puts the central office at the DEMAND-WEIGHTED CENTROID (a 1-median approximation that minimises total feeder reach) snapped to the nearest street vertex, and materialises it as OLT-Auto-1 (move it later if you have a real site). (2) 🛡 IT OFFERS A BACKUP PLAN — the moment the working tree is built it asks "Add a backup / protection plan?" and lets you pick the ITU-T G.984.1 type: Type A (diverse backup feeder), Type B (standby OLT PON port + diverse feeder into a 2:N splitter — the 1:1 ~50 ms scheme), or Type C (full duplication to a dual-interface ONU); pick one and it computes a physically diverse backup route for every feeder and prices it into the BOM. And thanks to the v3.0 Design Advisor, any aerial span that ends up too long now shows a one-click "✚ Add a mid-span pole" so you can keep every NESC span legal without hunting. · 3.0.0 · 🧭 DESIGN ADVISOR — every rule violation now NAMES the standard it breaks and, where the fix is unambiguous, offers a ONE-CLICK repair that recomputes the whole design. The Violations panel (and a new ⚠ strip right on the selected element in the Inspector — "show what standards we're violating" on the canvas) tags each issue with its clause — IEEE C2 NESC Rule 232/235C/261, ITU-T G.984 1:64/1:128 split, IEC 61753-1 / 60529 closure category & IP, ANSI/TIA-598 fibre & tray, NEC 770.48, BICSI OSP-DRM, TIA-758/569 — and shows a green ✚ button with the exact remedy: "Upsize this cable", "Set ports to N", "Add a mid-span pole", "Add a down-guy", "Upgrade to IP68", "Set category to S", "Add trays → N", "Add OFNR transition", "Bond & earth", "Add a splitter cassette". Click it and the platform mutates just that item and re-runs the server DRC, so you watch the design get better in real time. The suggested fix is computed server-side (mapper_rules) alongside the violation, so the advice is authoritative, not a guess. Next (v3.1): Auto-Design will place the CO itself, prompt for a backup plan + type, and auto-suggest the poles that keep aerial spans legal. · 2.99.0 · 🔀 DRAG-TO-PORT REROUTE + SLACK/SNOWSHOE (Wave 4c — COMPLETES the standards-completeness program) — your original ask, made granular. A splice closure (or any joint carrying two or more cables) now shows a 🔀 Reroute fibres button in its inside view that opens the splice matrix, and the matrix's fibre cells are now fully DRAGGABLE: grab a free fibre on one cable and drop it onto a free fibre of the other to splice it through (the click-to-select path still works too). Each splice writes a REAL range record — the same model the A-Z light-path trace, splice sheet, BoQ splice count and taper report already read — so a manual reroute is a first-class, persisted, traceable splice, not just a drawing; a delete control cuts it. Plus a new 🔁 Slack / snowshoe element: a stored cable loop with a live BICSI bend-radius check (loop radius vs 10× cable-OD unloaded / 20× loaded — ✓ OK / ⚠ unloaded-only / ✗ too tight). With this, the platform now covers the full 41-requirement OSP/ISP standards register from the IEEE/BICSI/TIA/ITU/IEC/ANSI-SCTE sweep: elements → attributes → enforcement (DRC) → certification (acceptance tests) → as-built (TIA-606/GIS) → hands-on fibre management. · 2.98.0 · 🗺 RECORDS-GRADE AS-BUILT (Wave 4b · TIA-606 + GIS) — the GeoJSON GIS hand-off is now a full as-built record. Every feature carries a TIA-606 IDENTIFIER (a stable, normalised id per pole / chamber / closure / cabinet / cable / grounding / entrance) plus its COMPLETE standards attribution: pole material · ANSI class · grade · loading district · guy strand · anchor; chamber load-tier · AASHTO cover · size · depth · duct-entries; closure environmental category · IP · sealing · form · tray count · bonding; FDH capacity · NEMA; grounding role · conductor · rods · resistance; building-entry role · transition; vendor · model · serial · lifecycle status; and — folding in Wave 4a — the fibre ACCEPTANCE TEST (measured IL, ORL, OTDR ref, tester, date) with a computed PASS/FAIL against the design budget. Cables export their placement · fire rating · pathway · aerial attachment · messenger · lashing · duct · tracer. This is the BICSI OSP-DRM benchmark for a maintainable as-built — one export now reconciles the design, the standards spec and the field certification per feature, ready for a GIS / asset system. (Final Wave-4 item: per-fibre drag-to-port reroute + slack/snowshoe.) · 2.97.0 · 🧪 ACCEPTANCE-TEST RECORDS (Wave 4a) — every subscriber link can now carry its ANSI/TIA-568.3-D turn-up certification, right on the home / ONT / MDU: test tier (Tier-1 OLTS insertion loss required · Tier-2 OTDR supplemental), method (bidirectional 1310/1550), the measured end-to-end insertion loss, the ORL, an OTDR trace reference, and tester / date. The record is graded LIVE against the design's own link budget from the strand engine — the panel shows the computed design loss and the maximum loss the link may measure and still reach the ONT, then a ✓ PASS / ✗ FAIL verdict: the measured IL must sit within the budget headroom and the ORL must be ≥ 55 dB (single-mode APC). This is the must-have that closes out a build — a design that was only modelled can now be proven as-built, per fibre. Records persist with the design. (Next in Wave 4: TIA-606 label coverage + GIS as-built, then drag-to-port reroute.) · 2.96.0 · ✅ STANDARDS DRC ENGINE (Wave 3) — the fields from Waves 1–2 are now ENFORCED. Seven new server-side (IP-protected) compliance checks join the ~25 existing ones, so the browser can neither read the rule nor fake a clean design: (1) 📶 per-PON split capacity — a PON port fanning out past 1:64 (physical) warns and past 1:128 (logical) fails, INDEPENDENT of the optical budget, so a physically un-buildable design no longer reads "ok" (closes the top adversarial-review gap); (2) 🔵 closure environment-vs-mount — a Cat A (aerial) closure mounted inside a manhole fails (a subterranean chamber floods; use Cat G/S IP68, IEC 61753-1); (3) closure IP-vs-category — a buried / vault (Cat G/S) closure rated below IP67 warns (IEC 60529); (4) splice-tray over-fill — a closure whose declared trays × fibres/tray can't hold the incoming cable's fibres warns (TIA-598 12-fibre groups); (5) metallic-armour bonding — an armoured cable entering a closure with no bond kit warns (ITU-T L.201 / NESC); (6) chamber duct-entry reconciliation — a manhole/hand-hole declaring fewer end-bells than the cables actually terminating there warns; (7) building-entry NEC 770.48 — unlisted OSP cable running > 15.24 m inside with no OFNR/OFNP transition warns. Every check consumes the exact fields shipped in v2.91–v2.95 and refreshes live as you edit them. Backed by 8 new server tests + an end-to-end browser test. Next: Wave 4 — records (acceptance tests · TIA-606 labels · drag-to-port · GIS as-built). · 2.95.0 · 🧩 FIVE NEW OSP/ISP ELEMENTS (Wave 2) — the palette gains the elements the standards sweep said were missing. 🗄️ FDH — Fibre Distribution Hub, the feeder↔distribution cross-connect cabinet (GR-3125/GR-487) with a 144/288/432/576-port capacity + NEMA 3R/4/4X rating, distinct from the FDT splitter cabinet. 🗃️ ODF — indoor Optical Distribution Frame / patch panel (19/23-in rack or wall box, port capacity, SC/LC APC-UPC adapter type, TIA-568.3) for the CO / head-end / building riser. 🚰 Pedestal — buried-plant drop terminal (GR-13), the buried counterpart of a FAT. ⚡ Grounding & bonding — a real asset: TMGB / TGB busbar, ground rod (count × length + NEC-250.53 resistance target), messenger-to-neutral bond or anchor-guy bond, with the ANSI/TIA-607 conductor size (#6 AWG min … #1/0 TBB) — the mandatory NESC 215C2 / TIA-607 element that was absent everywhere. 🚪 Building entry — the ISP entrance chain: entrance point / entrance facility / protected entrance terminal (MPOE · demarc) / MDF / IDF, the NEC-770 OSP→listed transition (→OFNR riser / OFNP plenum) with the ≤15 m unlisted-OSP allowance (live 770.48 warning), firestop and TMGB-bond flags. FDH / ODF / pedestal open as device faceplates and (FDH/pedestal) carry the Wave-1 enclosure fields; all five persist. Next: Wave 3 — the server DRC engine that validates every field shipped in Waves 1–2. · 2.94.0 · 🧵 AERIAL HARDWARE + CABLE FIRE-RATING (Wave 1d — completes the Wave-1 attribute foundation) — the CABLE (route) inspector gains two standards sections. Aerial hardware (NESC, shown when the cable is on a pole line): attachment type (strand-and-lash / figure-8 self-messenger / ADSS all-dielectric / over-lash), and — for a lashed build — the EHS messenger strand (6.6M ¼″ 6,650 lbf / 10M 5⁄16″ 11,200 / 16M 3⁄8″ 15,400, sized to the loaded span per NESC Rule 261H: ≤35% initial / 25% final / 60% max) + lashing (single / double / spinner rings). Fire rating (NEC Article 770): the cable listing (OSP-unlisted / OFN / OFNG / OFNR riser / OFNP plenum, NEC 770.179 ranks), an "enters a building" flag that reveals the in-building pathway (outdoor / horizontal / riser ≥OFNR / plenum OFNP per 770.113) and the in-building run length — with a live 770.48 warning when unlisted OSP cable runs > 15.24 m (50 ft) inside before transitioning to a listed cable. All persist on the route. (The microduct 3–16 mm catalog + NEC-40% blown-fill DRC are server-side, coming in Wave 3.) — WAVE 1 (the standards attribute layer: closure · chamber · pole · aerial/cable) IS NOW COMPLETE. Next: Wave 2 new elements (FDH · ODF · pedestal · grounding · building-entry). · 2.93.0 · 🗼 POLE ENGINEERING (Wave 1c) — the pole becomes a real structural object. Structure: full ANSI O5.1-2022 class table with the designated groundline transverse load on every option (H6 = 11,400 lbf … Class 10 = 370 lbf), a wood-species picker (conditional on Material = wood; Southern Pine / Douglas-Fir 8,000 psi … Western Larch 8,400) driving the class→circumference lookup, NESC construction grade (C general / B crossings, with the Table 253-1 overload factors), and the NESC Rule 250B loading district (Heavy ½″ ice / Medium ¼″ / Light no-ice). Setting (RUS 1724E): a soil class that derives the embedment + total pole length live from the above-ground height (set depth = 10% of length + 2 ft, ±soil). Riser now expands into a guard type (PVC / steel / HDPE) + top height. Aerial (NESC): joint-use reveals a supply-voltage class (the 40 in / 1.02 m comm-worker safety zone; >22 kV = engineered), and "Guyed" expands into the real down-guy detail — lead distance (≈1:1 lead-to-height), EHS guy strand (¼″ 6,650 lbf … 7⁄16″ 20,800 lbf), anchor type (screw / plate / rock / swamp / deadman) and a guy-guard marker. A FAT / closure mounted on a pole gains its mount method (band-and-clamp no-drill vs through-bolt) + mount height. All persist; the NESC clearance / worker-zone / guy-required DRC that consumes these lands in Wave 3. (Aerial cable messenger/sag + microduct + fire-rating are Wave 1d, next.) · 2.92.0 · ⛓️ CHAMBER STANDARDS (Wave 1b) — manholes & hand-holes gain the rest of their standards attributes. The SCTE-77 tier now shows its live DESIGN / TEST load (test = 1.5× rated: Tier 5 = 5,000/7,500 · 8 = 8,000/12,000 · 15 = 15,000/22,500 · 22 = 22,500/33,750 lbf) and — IMPORTANT correction — the tier labels no longer claim "Tier 22 = HS-20 highway"; SCTE-77 rates only occasional NON-deliberate traffic. Deliberate roadway traffic is now a SEPARATE "Cover & frame" axis: AASHTO H-20 / HS-20 cover rating (16,000 lbf wheel — a metal/RC cover+frame that a chamber in the travelled way legally requires regardless of tier), plus cover security (bolt-down / pentagon / locking) and the TIA-606-C cast legend ("FIBER OPTIC"). New Access & racking section: person-entry (confined-space, OSHA — defaults from manhole vs hand-hole type) drives a cable-racking model (racks/wall × arms → slack-coil capacity, TIA-569/BICSI). New Drainage & bonding (open-gravel / sump / sealed + NEC-250 racking bond) and Duct-entries (end-bell count, reconciles with the duct-bank). All persist; the tier-vs-traffic + duct-reconciliation DRC lands in Wave 3. · 2.91.0 · 🔵 CLOSURE ENCLOSURE STANDARDS (Wave 1a of the OSP/ISP standards-completeness program) — every splice-closure-family element (closure · FAT · FDT · ATB) gains a standards "Enclosure" block in the Inspector: IEC 61753-1 environmental category (Cat A aerial / G ground / S subterranean — a closure rated for the wrong mounting is now a settable, checkable fact), Telcordia GR-771 sealing method (one-shot heat-shrink vs re-enterable gel / mechanical / encapsulant) + IEC 60529 IP rating (IP54…IP68), form factor (dome butt vs inline both-ends), TIA-598 splice-tray fill (trays × fibres/tray, 12-fibre groups), splice ROLE (express loop-through with uncut through-fibres vs branch/butt vs terminal drop — feeds A-Z trace accuracy), ITU-T L.201 / NESC metallic bonding & earthing (single-point vs both-ends), GR-771 stored-slack radius (30/20/15 mm) + slack-loop length, cable-entry port count + shape, operating-temperature range, and — for a loose direct-buried closure — its ANSI/SCTE-77 crush tier (a hosted closure inherits its manhole/hand-hole's tier instead). Hosted closures auto-seed their category from the host (pole → aerial, chamber → subterranean). All fields persist with the design; the server DRC that validates them (category-vs-mount, tray over-fill, unbonded armour, tier-vs-traffic) lands in Wave 3. This is the first of 41 verified requirements from the IEEE/BICSI/TIA/ITU/IEC/ANSI-SCTE standards sweep. · 2.90.0 · 🏗 STRUCTURAL HOSTING — poles & chambers now CONTAIN equipment. Double-click a pole, manhole or hand-hole and it opens a HOST view instead of a bare property list: it shows what's mounted inside, and lets you add more. A pole can carry a 📦 FAT + splitter, a 🔀 standalone splitter, a 🔵 dome closure or a 🟦 in-line closure; a manhole / hand-hole holds one or more splice closures to reroute the cables running through it. Each mounted item is a real device — click 🔍 Open to drop into its faceplate (closure splice-trays / splitter LED grid), and 🔗 Connect to wire the cables at the structure INTO it: feed an arriving cable onto the item (re-points its end onto the closure/splitter so the strand engine splices the fibres through), or route a new cable out to any destination. Mounted items fan out around the host on the map and the structure shows a cyan badge with its mount count; removing a host removes its mounted gear. Hosting travels with the design (hostId persists). This is the OSP reality — a chamber isn't a node, it's a room full of closures — and it's grounded in a full IEEE/NESC · BICSI · TIA · ITU-L · FOA · ISO/IEC · ANSI/SCTE standards sweep (49 ranked requirements; the pole/chamber structure fields in 2.89 were the first tranche). · 2.89.0 · POLE + CHAMBER TYPE / MATERIAL / DIMENSIONS — you can now specify what a pole or chamber actually IS. A pole gains a Structure section: Material (wood ANSI O5.1 · spun or hexagonal concrete · galvanised steel · FRP composite), ANSI O5.1 strength Class (H2..7), and a Riser (u-guard) flag — on top of the existing NESC aerial fields. A manhole / hand-hole gains a Chamber section: Material (precast / polymer concrete · HDPE · fibreglass composite · brick), Size class, ANSI/SCTE-77 Load-rating tier (5 pedestrian / 8 driveway / 15 off-roadway / 22 HS-20 traffic) and Depth. All persist with the design. (Structural hosting — chambers holding closures, poles holding a FAT/splitter/closure — is being designed from a full OSP/ISP standards sweep, coming next.) · 2.88.0 · SPLICE-CLOSURE INSIDE VIEW — a splice closure is a fibre JOINT, not a splitter host, and its inside view now says so: it draws real 12-splice organiser TRAYS sized to the closure fibre capacity (e.g. 48F → 4 trays), each fibre passing through shown in its slot colour-coded by where it goes. Tiles read Feed-in · Splices (used/capacity) · Trays instead of the splitter Ports/Spare. An empty closure shows its empty trays + the right guidance ("wire a cable to it, or right-click a cable ▸ Insert mid-span closure") — no more misleading "add a splitter below" on an element that has no splitter control. · 2.87.0 · RENDERER CRASH-PROOFING — an adversarial review of the 1000-house E2E build found the colour-less-area crash was one of a whole CLASS: drawZones / drawTrenches / drawDucts / drawRoutes and routeLengthM() all read .points / .polyline unguarded, so ONE malformed element (from a programmatic add, or an imported / hand-edited design file) threw inside redraw and blacked out the entire map every frame. All are now guarded — a bad element is skipped, never fatal. The map can no longer be taken down by one stray object. · 2.86.0 · MAIN/BACKUP OLT + E2E HARDENING — OLTs now have a ROLE: 🟢 Main (working) or 🛡 Backup (hot-standby), set in the Inspector and shown on the device chassis. The protection planner now originates Type A/B diverse backup feeders FROM the backup OLT (the real ITU-T G.984.1 standby-port scheme) when one is present. Also hardened the map renderer: a hand-built / imported project Area without a colour no longer crashes the canvas (defaults the colour, skips malformed polygons). Shipped alongside a full CO→ONT 1000-house Type-B reference design (scenarios/scenario-1000house-typeB.json). · 2.85.0 · SPLITTER FACEPLATE FIXES — (1) "+ Add splitter" now has an explicit ratio picker and adds the RATIO YOU CHOSE (it used to always add 1:8 regardless); it defaults to the module model's ratio. (2) Output ports now lay out 8 PER ROW like a real splitter face. (3) The INPUT is now drawn — an IN port on the left of each module (with the working feed fibre). (4) 2:N (dual-input, protection) ratios are now selectable everywhere — a 2:N module shows two inputs (working + protection). · 2.84.0 · UI/UX — DRAGGABLE MODALS + DIALOG/INSPECTOR POLISH — (1) the device modal, the Reports window and the small dialogs (Add-card, placement, containment) can now be DRAGGED anywhere by their title bar, and remember where you put them. (2) FIXED: the "+ Add card" picker was rendering unstyled at the bottom of the page and behind the device modal — its dialog CSS is now always injected and its z-index sits above every modal, so it opens on top where you clicked. (3) The item Inspector popover got a proper polish: aligned rows with focus rings, real toggle switches instead of raw browser checkboxes, styled section headers (accent bar + uppercase), and a slightly wider panel so labels stop wrapping. · 2.83.0 · VENDOR-NEUTRAL — the OLT device GUI is now brand-free: the chassis picker offers generic sizes (2 / 4 / 7 / 15 / 17-slot) instead of named vendor models, and the card / capacity hints read “16-port GPON line card”. No third-party brand names anywhere in the design tooling. · 2.82.0 · 🖥 DEVICE TWINS GO PRO — the interactive element twins gain three things: (1) PER-PORT OPTICAL — every subscriber port shows its Rx power + budget margin (click a port), computed by the server link-budget engine; ports with a thin amber/red ring are warn/fail on optical, and an OLT PON shows its worst-case downstream margin. (2) DRAG-TO-RE-PATCH — drag a subscriber from its port onto a spare port on the same splitter to change its physical patch; the pin persists (n.patch) and the server honours it in the port assignment. (3) 🏷 LABEL SHEET — one click prints an ANSI/TIA-606 port-label sheet (device → bay/slot → port → destination → fibre → Rx/margin) for the OLT and every passive element. Server: sim/mapper_device.py now returns per-output optical + honours port patches. · 2.81.0 · 🖥 EVERY ELEMENT IS NOW A DIGITAL TWIN — double-click any element and it opens as an interactive device, not a static diagram. FAT / FDT / splitter / ATB draw a real faceplate: the feed-in, each splitter cassette as a module with its output ports as a live LED grid (green → subscriber drop · purple → MDU · amber → a downstream splitter · grey = spare) — click any port for its destination. A bare splice closure opens as its pass-through fibre tray. Add or remove splitter cassettes and change the split ratio right on the device, and swap the model. Backed by the server device engine (sim/mapper_device.py) — the ports map to the strand engine's real fibre allocation. Joins the OLT chassis GUI (v2.80) so now every clickable element is a live twin. · 2.80.0 · 🖥 REAL OLT DEVICE GUI + element views — double-click an OLT (or Inspector ▸ Open device GUI) and it opens a real chassis: pick the chassis size (2 / 4 / 7 / 15 / 17-slot, vendor-neutral) and the chassis draws its slots — control, uplink, power and the service slots. Each service slot holds a line CARD of a technology (GPON / XGS-PON / combo, 8 or 16 PON ports); every PON port is a live LED (green in-use · grey free · amber near-limit · red over-subscribed) mapped to the splitter it feeds — click one to see its subscribers, split, Mbps and oversubscription. + Add a card (choose the technology) into any empty slot, or hit ⚡ Auto-distribute to pack the active PONs onto cards and add cards as they fill up. Overflow (more PONs than the chassis can seat) is flagged so you upsize the model. The chassis dimensioning + PON→port assignment is server-side (sim/mapper_device.py). FAT / FDT / splitter / closure / MDU keep their strand-engine inside view (real fibre-by-fibre ports + editable cassettes). · 2.79.0 · 🔌 CABLE PLACEMENT + DUCT-FIT — click a cable and it now asks how it's installed: 🟫 Buried or 🗼 Aerial. Aerial → reuse-pole vs new-pole-line. Buried → direct-buried or in a duct; pick the duct and get a LIVE fit verdict computed to the standards: pulled conduit uses NEC Chapter 9 area fill (53% one cable / 31% two / 40% three+), blown microduct uses the 0.6–0.7 cable-OD-to-bore diameter ratio, and an over-size cable (e.g. a Ø18.8 mm 144F cable in a Ø10 bore) is rejected outright — with the slimmest duct that WOULD fit suggested one click away. Cable OD comes from fibre count + structure; both the fit maths and the duct catalog are server-side (sim/mapper_ductfit.py). The Inspector shows the placement + a Change… button. · 2.78.0 · 🛡 PROTECTION NOW PRICED IN THE BOM — the diverse backup routes from the protection planner now fold into the Bill of Materials as a dedicated “Protection” category: the NEW (unshared — that's the whole point) diverse civil at full trench rate + the protection cable mirroring each primary's fibre count + the type equipment deltas (standby OLT port, 2:N cassette, second splitter, dual ONUs). It carries overhead like any CAPEX and is toggleable (BOM category checkbox “🛡 Protection”); excluded from per-phase breakdowns (redundancy is design-wide). Backups still live in state.protection as a decoupled overlay — zero impact on the network/DRC/capacity engines. · 2.77.0 · 🛡 PROTECTION / BACKUP-ROUTE PLANNER (standards-based redundancy, ITU-T G.984.1) — pick a protection Type (A = backup feeder fibre · B = standby OLT PON port + a DIVERSE second feeder into a 2:N first-stage splitter, the common 1:1 ~50 ms scheme · C = full duplication down to a dual-interface ONU) and a scope (feeder / distribution / last-mile), and the planner computes a physically DIVERSE backup route for every primary route in scope. Diversity is real: the server re-runs the street-graph A* on a residual graph with the primary's own street edges EXCLUDED (Shared-Risk-Link-Group avoidance, endpoints exempt), so the backup shares no trench/duct/pole — the report proves it (per-route "shared m", target 0, + diverse %). NEW Reports ▸ 🛡 Protection tab: type/scope/shared-risk-band knobs, the equipment delta to add (standby port, 2:N splitter, second splitter, dual ONUs) and the per-route diversity verdict. Backups draw dashed on the map (Analyze ▸ 🛡 Protection routes), colour-coded by verdict. Server-side engine (sim/mapper_protection.py); backups are a planning overlay that travels with the design. · 2.76.0 · 📶 CAPACITY & BANDWIDTH ENGINE (the "ratio game") — every premise now knows what it actually gets: per-home Mbps = usable PON line rate (ITU-T G.984 2.488G / G.9807.1 XGS 9.953G × usable-rate factor) ÷ the total split on that home's exact splitter chain (from the strand engine). NEW Reports ▸ 📶 Capacity tab: per-home average tiles, per-PON-port table (which premises are on which PON, units, split, committed Mbps, oversubscription verdict vs your contention target) and per-OLT dimensioning (active PON ports → line cards needed, 16-port card norm). Editable knobs: package Mbps, contention N:1, ports/card, efficiency %. NEW Analyze ▸ 📶 Bandwidth-per-home map overlay (green ≥300 · light ≥100 · yellow ≥50 · orange ≥25 · red below). Server-side engine (sim/mapper_capacity.py). · 2.75.0 · DETECT NOW WORKS RELIABLY (server-side Overpass) — object detection was silently importing 0 streets / 0 homes in dense areas (esp. Iraq): the browser can only reach a couple of CORS-enabled Overpass mirrors and couldn't tell a busy 504 from a regional mirror that answers 200 with an empty result (a Swiss mirror returned nothing for Baghdad). The Overpass fetch now runs SERVER-SIDE (sim/mapper_detect.py): a curated pool of GLOBAL mirrors (overpass-api.de / kumi / mail.ru) is queried IN PARALLEL, the first with actual data wins (an empty answer never poisons it), with a real User-Agent + retry. Baghdad’s Al-Salam district now imports ~645 streets and, with the frontage fill, ~6,000+ estimated homes in seconds. The browser no longer calls Overpass at all. · 2.74.0 · DETECT RELIABILITY (superseded) — client-side Overpass mirror fallover. ·2.73.0 · MAP UX FIXES — (1) cables are now a clean, screen-constant 2–4 px at every zoom (vector-effect: non-scaling-stroke) instead of ballooning into thick ribbons when you zoom in; (2) hover/click now hits the item you're actually pointing at — nodeAt's hit target matches the DRAWN icon size (was a world-unit blob that grew to ~150 px at high zoom and grabbed a neighbouring FAT/closure), and the CLOSEST node wins so a house next to infrastructure resolves to the house. · 2.72.0 · IP-PROTECTION P3d-ii (OSM detection classification cutover) — the OpenStreetMap→demand classification (building footprints → home vs MDU by real shoelace area + building:levels + apartments tag; residential/commercial/public use split; garage/shed skip-list; address-point gap-fill homes; poles/manholes/cabinets; metre-based dedup) now runs SERVER-SIDE (sim/mapper_detect.py, POST /api/sim/mapper/detect); the classify loop is DELETED from the browser (−86 lines). The client keeps only the public Overpass fetch, the geo-referencing and node creation. Proven at 6/6 byte-exact parity + 10/10 end-to-end. THE DETECT + FRONTAGE IP IS NOW SERVER-SIDE. · 2.71.0 · IP-PROTECTION P3d-i (frontage synthesis cutover) — the Iraq gap-fill heuristic (estimate homes along street frontage where OSM has roads but few building outlines: spacing/offset/both-kerbs with spatial-hash dedup against real premises) now runs SERVER-SIDE (POST /api/sim/mapper/frontage); planFrontageHomes() is DELETED from the browser. Proven at 5/5 byte-exact position parity. · 2.70.0 · IP-PROTECTION P3a (DCF cutover) — the discounted-cash-flow business case (CAPEX-by-year phasing, subscriber ramp, NPV / IRR / payback / profitability-index) now runs SERVER-SIDE (sim/mapper_dcf.py, POST /api/sim/mapper/dcf); computeDcf() is DELETED from the browser. Also FIXES a latent bug: bomByPhase() (the per-phase BOM breakdown) had been returning zeros for phased designs since the BOM cutover made computeBom async — it is now a correct server-backed accessor. Proven at 5/5 parity. · 2.69.0 · IP-PROTECTION P2d (build-readiness cutover) — the buildability/utilisation dashboard (DRC roll-up, home reachability + optical-verdict split, port/splitter/FAT utilisation, conduit fill, fibre headroom, take-rate, overall verdict) now runs SERVER-SIDE (POST /api/sim/mapper/readiness — a pure assembly of the network + occupancy + violations + per-home optical, all already server-side); computeBuildReadiness() is DELETED from the browser. Proven at 3/3 parity. THIS COMPLETES THE DESIGN-ENGINE BUNDLE — auto-design, cost/BOM, strand engine, DRC rules, BoQ and build-readiness all run server-side now. · 2.68.0 · IP-PROTECTION P2c (BoQ cutover) — the Bill of Quantities / deliverables takeoff (civil dig by ground, duct laying by product, cable install by tier, fusion/termination/OTDR from strand records, structures, activation) now runs SERVER-SIDE (sim/mapper_boq.py, POST /api/sim/mapper/boq); computeBoq() is DELETED from the browser (takeoff + civil pricing catalogs no longer in View-Source). Proven at 3/3 parity. · 2.67.0 · IP-PROTECTION P2b (DRC engine cutover) — the design-rule engine (the ~25 topology/optical/civil/BICSI-OSP/NESC-aerial checks) + per-node capacity occupancy now run SERVER-SIDE (sim/mapper_rules.py, POST /api/sim/mapper/rules → {violations, occ}); evaluateRules() + computeOccupancy() are DELETED from the browser — the compliance logic is no longer in View-Source and the client can't fake a clean design. Proven at 4/4 structural parity. · 2.66.0 · IP-PROTECTION P2a (strand-engine cutover) — the network topology + strand-continuity engine (OLT→home tree, per-node loss accumulation, fibre demand + auto cable sizing, and the deterministic per-fibre strand map: route layouts, cassette feed fibres, OLT ODF frames) now runs SERVER-SIDE (sim/mapper_network.py, POST /api/sim/mapper/network); computeNetwork() + assignFibers() are DELETED from the browser — the client fetches the network and hydrates it onto live objects. Proven at exact parity (5/5, incl. a 173-node design). · 2.65.0 · IP-PROTECTION P1 (auto-design cutover) — the Auto-Design planning optimiser (street-cost serving areas, greedy max-coverage FAT siting, capacity districting, trench-minimising FDT placement) now runs SERVER-SIDE (sim/mapper_autodesign.py, POST /api/sim/mapper/autodesign, auth-gated + kill-switched); the browser sends only the demand snapshot and materialises the returned FAT/FDT/cable plan — the algorithm is no longer in View-Source. Follows the cost/BOM cutover (v2.64). · P5 — THE AERIAL / NESC PACK (the last structural gap): poles carry real attachment engineering (height, comms attach, joint-use supply height, guyed, make-ready); NESC rules check comms↔supply separation (40 in), midspan ground clearance with sag (18 ft over road crossings — detected against the street network), and guys at line-angle AND dead-end poles; guys & make-ready count in the BoQ; and File ▸ Export ▸ SPIDAcalc hands the pole line to a loading engineer in SPIDA’s open JSON exchange format. Plus v2.55–59: strand model · deliverables · optimizer v2 · field loop.
ModuleLive map · Detect · Strand trace · DCF · AI Assist · P2P
StandardsITU-T G.984.2 · G.9807.1 · G.989.2
PlatformEOS · Engineering Orchestration System