Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ FutolStructure is a browser-based structural engineering workbench for reinforce
<a href="SECURITY.md">Security</a>
</p>

[![Build](https://img.shields.io/badge/build-v3.16.117-2563eb)](https://futolstructure.vercel.app)
[![Build](https://img.shields.io/badge/build-v3.16.118-2563eb)](https://futolstructure.vercel.app)
[![Validation](https://github.com/michaelfutol/futolstructure/actions/workflows/validate.yml/badge.svg)](https://github.com/michaelfutol/futolstructure/actions/workflows/validate.yml)
![Platform](https://img.shields.io/badge/platform-browser-0f766e)
![Maturity](https://img.shields.io/badge/maturity-technical%20preview-f59e0b)
Expand Down Expand Up @@ -53,7 +53,7 @@ flowchart LR
- Tributary area and gravity load distribution from slabs to beams, columns, footings, and base reactions.
- Plan drafting aids including coordinated member tags, grid bubbles, dimensions, ortho measurement, snapping, and lock indicators.
- 3D review with display schemes, member colors and opacity controls, foundation geometry, slab transparency, and stair geometry.
- `.fstr` project save/load with guarded autosave, recovery diagnostics, floor deletion warnings, and persisted member locks.
- `.fstr` project save/load with guarded autosave, immutable pre-overwrite revisions, destructive-change review, recovery diagnostics, floor deletion warnings, and persisted member locks.
- Stair Builder geometry with destination slab openings, DXF footprint output, and 3D review.
- Reports and schedules for columns, beams, slabs, footings/base reactions, and preliminary design summaries.
- Coordinated multi-floor DXF drawing packages, IFC2x3, STAAD.Pro, ETABS 22 OAPI, and ETABS-to-SAFE handoff paths.
Expand Down Expand Up @@ -99,7 +99,7 @@ python -m pip install -r v3/tools/requirements-dxf.txt
node v3/tools/check-fs.js
```

The browser smoke covers initialization, plan geometry, slab ownership, cantilever behavior, persistence and recovery guards, member locking, measurement tools, stair persistence, 3D rendering, coordinated DXF completeness, strict DXF open/audit/save/reopen validation, and export payload parity.
The browser smoke covers initialization, plan geometry, slab ownership, cantilever behavior, persistence and recovery guards, protected-revision restore/download, the 50-revision retention limit, historical `.fstr` migration, member locking, measurement tools, stair persistence, 3D rendering, coordinated DXF completeness, strict DXF open/audit/save/reopen validation, and export payload parity.

Where AutoCAD 2025 is installed, run the native read gate against a generated package without modifying it:

Expand All @@ -116,6 +116,7 @@ futolstructure/
|-- v3/
| |-- assets/ Product identity and screenshots
| |-- engine/ Extracted structural calculation helpers
| |-- persistence/ Protected project revision storage
| |-- tools/ Regression smoke runner
| `-- index.html Current application
|-- index.html Hosted root entry
Expand Down
45 changes: 45 additions & 0 deletions docs/FS-118_RELEASE_NOTES.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# FS-118 Protected Project Revisions

- **Release:** FutolStructure v3.16.118
- **Build:** FS-118
- **Date:** 2026-07-14

## Purpose

FS-118 protects user-authored structural intent before an existing `.fstr` file is overwritten. It builds on the production FS-117 R12 DXF baseline without changing the DXF envelope, structural analysis formulas, solver exporters, or active-model geometry rules.

## Included

- Immutable IndexedDB revision records containing a cloned project payload, source identity, schema/build provenance, structural summary, health assessment, and model delta.
- Automatic pre-overwrite capture for browser file-handle saves.
- A guarded save review when floors, members, locks, offsets, cantilevers, or corner slabs are removed, or when void/deletion counts increase.
- A health gate that quarantines implausible autosaves and can restore the last known healthy browser snapshot.
- Recovery UI for revision history, restore, and `.fstr` download.
- Per-project retention of the newest 50 protected revisions.
- Project and source-revision identity embedded in new `.fstr` saves and report provenance.
- A legacy v2.8 two-floor fixture proving hidden geometry, member locks, and beam offsets survive migration and repeated round trips.

## Storage Boundary

Protected revisions are local to the browser profile and device through IndexedDB. They are not cloud backups and do not replace dated external `.fstr` files. Clearing site data or using another browser/profile removes access to that local revision history.

## Acceptance Gates

- Inline and external JavaScript syntax checks.
- Full Chrome/Edge browser regression.
- Pre-overwrite capture, destructive-delta detection, invalid-health blocking, restore, and revision download.
- Exact retention of revisions 5 through 54 after 55 ordered writes, proving a 50-record cap.
- Legacy v2.8 `.fstr` load, migration, and two successive round trips.
- Current Olango three-floor project smoke.
- Unchanged FS-117 strict AutoCAD R12 parser round trip and native AutoCAD read gate.

## Excluded

- Cloud synchronization, user accounts, shared project history, and server-side backup.
- Historical helper scripts and unrelated workspace edits.
- Structural solver, stair, IFC, STAAD, ETABS, SAFE, or broad UI changes.
- Changes to the FS-117 DXF R12 writer.

## Rollback

If FS-118 fails in production, revert only the FS-118 merge commit. FS-117 remains the known-good DXF production baseline.
3 changes: 3 additions & 0 deletions docs/RELEASE_HYGIENE.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ Use this checklist before pushing a public FutolStructure update.
- `v3/assets/futolstructure-icon.png`
- `v3/assets/screenshots/`
- `v3/engine/`
- `v3/persistence/`
- `v3/dxf-export.js`
- `v3/tools/check-fs.js`
- `v3/tools/check-dxf-autocad.ps1`
Expand All @@ -43,6 +44,8 @@ python -m pip install -r v3/tools/requirements-dxf.txt
node v3/tools/check-fs.js
```

For persistence releases, the browser gate must also prove pre-overwrite capture, destructive-delta review, health blocking, restore/download behavior, exact 50-revision retention, and legacy `.fstr` round-trip compatibility.

For a DXF release on a workstation with AutoCAD 2025:

```powershell
Expand Down
8 changes: 5 additions & 3 deletions v3/dxf-export.js
Original file line number Diff line number Diff line change
Expand Up @@ -724,7 +724,7 @@
stackY = indexTable.bottomY - 1;

const modelRows = [
{ item: 'Build', value: DXF_PACKAGE_BUILD },
{ item: 'Build', value: `${audit.build} / DXF ${audit.writerBuild}` },
{ item: 'FSTR schema', value: window.getProjectProvenance?.().fstrSchemaVersion || 'unknown' },
{ item: 'Source revision', value: window.getProjectProvenance?.().sourceRevisionId || 'unsaved working state' },
{ item: 'Floors', value: state.floors?.length || 0 },
Expand Down Expand Up @@ -848,8 +848,10 @@
const floorGeometryById = collect3DFloorGeometry();
const planBounds = calculatePlanBounds(floorGeometryById);
const writer = new DxfWriter();
const releaseBuild = window.getReleaseManifest?.().buildId || DXF_PACKAGE_BUILD;
const audit = {
build: DXF_PACKAGE_BUILD,
build: releaseBuild,
writerBuild: DXF_PACKAGE_BUILD,
layerSource: 'FT_LayerMap.xlsx structural mapping embedded in FutolStructure',
floorIds: state.floors.map(floor => floor.id),
plans: { layouts: 0, tributary: 0, foundation: 0 },
Expand All @@ -861,7 +863,7 @@
const cellHeight = planBounds.height + 5.2;
const packageTop = 0;
writer.text(0, packageTop + 4.1, 'FUTOLSTRUCTURE - COORDINATED DXF DRAWING PACKAGE', DXF_LAYER.TEXT, 0.48);
writer.text(0, packageTop + 3.45, `${DXF_PACKAGE_BUILD} | UNITS: METERS | GENERATED ${localDateStamp()}`, DXF_LAYER.TEXT, 0.2);
writer.text(0, packageTop + 3.45, `${releaseBuild} | DXF WRITER ${DXF_PACKAGE_BUILD} | UNITS: METERS | GENERATED ${localDateStamp()}`, DXF_LAYER.TEXT, 0.2);
writer.text(0, packageTop + 3.05, 'Plans, schedules, load summary, and preliminary BOQ use FT structural layer mapping.', DXF_LAYER.TEXT, 0.18);

(state.floors || []).forEach((floor, rowIndex) => {
Expand Down
Loading
Loading