51 — cv-cad Dialog Data-Entry Map

Snapshot: 2026-05-18 Owner: 47-gtm-plan Track D Related: 50-blueprint-extraction-architecture.cvextract.json schema v0.1 lives there Ship gate: v11.1 NLT 2026-07-09 (informs CV-336 schema and CV-337 cv-cad import)

Why this document exists

The Track D AI blueprint-extraction pipeline emits .cvextract.json documents that the cv-cad import path (CV-337) reads to populate panel/project/site state on a reference drawing. For that round-trip to work, every field the extraction can produce must land in a global the cv-cad dialogs already read — otherwise the import has nowhere to write. This doc inventories every interactive data-entry tile across cv-cad’s five dialog clusters, joins each tile to its .cvextract.json v0.1 schema field where one exists, and aggregates everything else into a schema v0.2 candidates appendix.

The document is also the bridge spec for cv-web (webpage/Simplestruct/cv-web/), the React-based authoring environment where humans design the same data the AI is trying to extract. Cluster 6 below cross-walks every cv-cad dialog cluster to its cv-web *Var TypeScript type and its .cvp / .cvpanel / .cvsite envelope position, so an AI-fill implementer can target either surface without re-deriving the mapping. Cluster 7 records the protobuf-vs-JSON decision for the post-v11.1 horizon.

Cluster 8 documents the pick-and-brace simulation, a downstream consumer of the same data tree that turns the cluster inventory above from “fields the AI fills” into “fields that drive automated panel-form layout and a 3D pick dress rehearsal.” Today the simulation runs entirely in cv-web (src/utils/castLayout.ts, src/utils/pickSimulation.ts, src/workers/pickSimWorker.ts); the cv-cad port follows after CV-337. This pipeline — every-candidate-position layout search, multi-criteria scoring, Monte Carlo ranking, and 6-phase animated rehearsal — is novel enough to be the core patent-evidence story alongside the extraction round-trip.

Source-mode (src/x64/TB11-01x64/) is the authoritative target on the cv-cad side. VLX-mode dialogs reach the same globals via different keys (Bug 18 territory); VLX-only divergences are out of scope.

Schema-mapping conventions

The “schema field” column uses this short legend:

Notation

Meaning

panels[].<field>

Top-level panel attribute (schema v0.1 if listed; gap otherwise)

panels[].<sub>[].<field>

Per-panel feature list — most are schema gaps in v0.1

openings[].<field>

Schema v0.1 already models this (limited to width/height/bbox/type)

source.scale.<field>

Schema v0.1 source.scale block

project.<field>

Gap — no project block in v0.1

site.<field>

Gap — no site block in v0.1

Not data-entry (routing button, view command, calc helper)

(gap)

Maps conceptually but no v0.1 field exists yet; collected in appendix

Globals follow a generic (set (read $key) $value) pattern in most cv-cad dialogs, so the global name equals the key. When a global is the same as the key, the table shows =key.

Cluster 1 — Project Details (projdet)

Reachable from mp_dlg “Details” button → (projdet_edit) (existing project) or (projdet) (new project). Flat dialog, no sub-dialogs. Data persists to NOD XRecord project_list via (csv_write-project-xrecord).

Key

Type

Label

Global

Schema field

pjname

edit

Project Name

pjname

project.name (gap)

bldgname

edit

Building Name/Number

csv_bldgname

project.building (gap)

concpsi

edit

Concrete Compressive Strength

concpsi

project.concrete.psi (gap)

concpcf

edit

Concrete Weight

concpcf

project.concrete.pcf (gap)

projloc

edit

Project Location

csv_projloc

project.location (gap)

contractor

edit

Contractor

csv_contractor

project.contractor (gap)

super

edit

Superintendent

csv_super

project.superintendent (gap)

addr1

edit

Address line 1

csv_addr1

project.address.line1 (gap)

addr2

edit

Address line 2

csv_addr2

project.address.line2 (gap)

city

edit

City

csv_city

project.address.city (gap)

state

edit

State

csv_state

project.address.state (gap)

zip

edit

ZIP

csv_zip

project.address.zip (gap)

phsite

edit

Phone (Site)

csv_phsite

project.contact.phone_site (gap)

phoffice

edit

Phone (Office)

csv_phoffice

project.contact.phone_office (gap)

fxsite

edit

FAX (Site)

csv_fxsite

project.contact.fax_site (gap)

fxoffice

edit

FAX (Office)

csv_fxoffice

project.contact.fax_office (gap)

email

edit

E-Mail

csv_email

project.contact.email (gap)

schedule

edit

Schedule / Delivery

csv_schedule

project.schedule (gap)

notes

edit

Special Instructions

csv_notes

project.notes (gap)

estimator

edit

Estimator

csv_estimator

project.estimator (gap)

imperial / metric

radio

Measurement System

csv_msys

project.units.system (gap)

p8 / p16

radio

Display Precision

csv_dprec

project.units.precision (gap)

english / espanol

radio

Language

csv_lang

project.language (gap)

s8x11 / s8x14 / s11x17

radio

Plot Sheet Size

csv_ppsize

project.plot.sheet_size (gap)

Title-block fallback: (csv_read-title-block) reads INSERT title ATTRIB tags (CON→csv_contractor, LO→csv_projloc, ADD1→csv_addr1, ADD2→parsed city/state/zip) when globals are unset.

Cluster 2 — Panel Options router (md_dlg)

Source-mode router opened by (c:csv). Buttons set pnl and done_dialog; the caller dispatches based on pnl. Not a data-entry surface — included as the navigation map an AI agent needs when chaining tool calls.

Key

Label

Routes to

new / old

Create / Edit Panel

New panel flow / mp_dlg

val / pal

View / Print All Layers

layer ops

vgp / pgp

View / Print Greenplate

greenplate layer ops

vcn / pcn

View / Print Connections

connection layer ops

vpp / ppp

View / Print Pick/Brace Points

pick/brace layer ops

vfs / pfs

View / Print Feature Strip

feature-strip layer ops

vpo / ppo

View / Print Perimeter

perimeter layer ops

vso / pso

View / Print Solid

solid view ops

su

Site Options

site_dlg (Cluster 5)

pbt

Batch Utilities

btch_dlg (Cluster 5)

calc

Calc

inline (calc_dlg) (shared helper)

Cluster 3 — Main Panel Details (mp_dlg)

Reached from md_dlg new/old or from a panel-edit command. The data-entry hub for an individual panel. Twelve checkbox toggles route to per-feature subdialogs (Cluster 4). Most globals follow the =key convention.

3a — Project Information row

Key

Type

Label

Global

Schema field

mpco

edit

Contractor

=key

project.contractor (gap)

mppn

edit (RO)

Project Name

=key

project.name (gap)

mpbn

edit

Building Name

=key

project.building (gap)

det

button

Details

projdet (Cluster 1)

3b — Drawing Details

Key

Type

Label

Global

Schema field

mpp#

edit

Panel Number

=key

panels[].id

mpdb

edit

Drawn by

=key

provenance.drawn_by (gap)

mpsc

popup

Drawing Scale

=key

source.scale.value (partial)

mpcf

radio (of/if)

Casting Face Down

=key

panels[].casting_face (gap)

mped

radio (ep/ow/iw)

Distances Specified From

=key

panels[].dim_reference (gap)

mppr

radio (au/po/la)

Printing Layout

=key

panels[].print.layout (gap)

mpsv

toggle

Shaded View

=key

panels[].print.shaded (gap)

3c — Panel Details (geometry)

Each key has a paired <key>s slider (omitted from table — same global).

Key

Type

Label

Global

Schema field

mpx1

edit

Thickness

=key

panels[].thickness (gap)

mpw1

edit

Width

=key

panels[].width (gap — v0.1 only has bbox)

mpe1

edit

Bottom Elevation

=key

panels[].elevation.bottom (gap)

mpl1

edit

Top Left Elevation

=key

panels[].elevation.top_left (gap)

mpr1

edit

Top Right Elevation

=key

panels[].elevation.top_right (gap)

mpd1

edit

Top Peak Distance

=key

panels[].peak.distance (gap)

mpp1

edit

Top Peak Elevation

=key

panels[].peak.elevation (gap)

mpa1

edit

Top Arch Radius

=key

panels[].arch_radius (gap)

3d — Edge miters, expansion gaps, radius panel

Key

Type

Label

Global

Schema field

mpm1 / mpm3

edit

Left miter (\ / /)

=key

panels[].miter.left.{back,front} (gap)

mpzl

edit

Left Z Offset

=key

panels[].miter.left.z (gap)

mpul

image

Left Up-Face indicator

=key

(display only)

mpm2 / mpm4

edit

Right miter (\ / /)

=key

panels[].miter.right.{back,front} (gap)

mpzr

edit

Right Z Offset

=key

panels[].miter.right.z (gap)

mpur

image

Right Up-Face indicator

=key

(display only)

mpgl

edit

Left Expansion Gap

=key

panels[].expansion_gap.left (gap)

mpgr

edit

Right Expansion Gap

=key

panels[].expansion_gap.right (gap)

mprp

edit

Radius Panel

=key

panels[].radius_panel (gap)

3e — Feature toggles (route to Cluster 4 subdialogs)

When a toggle = 1, generic handler at mp_dlg.lsp:640 fires (<key-stem>_dlg).

Toggle

Key

Subdialog

Schema landing

Standard Opening

mpwd

wd_dlg

openings[] (v0.1 ✓ partial)

Man Door

mpdr

dr_dlg

openings[].type=door (v0.1 ✓ partial)

Pilaster/Lintel

mppl

pl_dlg

panels[].pilasters[] (gap)

Chamfer

mpch

ch_dlg

panels[].chamfer (gap)

Slab Dowels

mpsd

sd_dlg

panels[].slab_dowels[] (gap)

Pick Points

mppp

pp_dlg

panels[].pick_points[] (gap)

Recess/Blockout

mprb

rb_dlg

panels[].recesses[] (gap)

Dock Leveler

mpdl

dl_dlg

panels[].dock_levelers[] (gap)

Ledger/Top Plate

mplb

lb_dlg

panels[].ledgers[] (gap)

Feature Strip

mpfh

fh_dlg

panels[].feature_strips[] (gap)

Weld Connections

mpwc

wc_dlg

panels[].weld_connections[] (gap)

Brace Points

mpbp

bp_dlg

panels[].brace_points[] (gap)

3f — Action buttons

Key

Label

Action

ophand

Op hand?

mirror panel

rev

Revisions

revision.lsp

undo

Undo

revert last edits

global

Global Changes

→ global-changes dialog

accept / cancel / help

OK / Cancel / Help

standard

Cluster 4 — Per-feature subdialogs

All 12 use pattern-row tables: index N is the slot number. Pair sliders (<key>Ns) share the global with their edit. All globals are =key<N> unless noted.

4a — wd_dlg (Standard Openings; up to 12)

Captures rectangular opening: x-from-edge, elevation, width, height, optional arch, flags (drip/future/trim/notch).

Key pattern

Type

Label

Schema field

wdt1..12

toggle

Enable

openings[].present

wdq1..12

radio (L/R)

From

openings[].x_reference (gap)

wdd1..12

edit

Distance

openings[].x_offset (gap)

wde1..12

edit

Elevation

openings[].y_offset (gap)

wdw1..12

edit

Width

openings[].width

wdh1..12

edit

Height

openings[].height

wda1..12

edit

Arch Radius

openings[].arch_radius (gap)

wdp1..12

toggle

Drip

openings[].flags.drip (gap)

wdx1..12

toggle

Future

openings[].flags.future (gap)

wdo1..12

toggle

Trim

openings[].flags.trim (gap)

wdi1..12

toggle

Notch

openings[].flags.notch (gap)

4b — dr_dlg (Man Doors; up to 4)

Key pattern

Type

Label

Schema field

drt1..4

toggle

Enable

openings[].present (type=door)

drq1..4

radio (L/R)

From

openings[].x_reference (gap)

drd1..4

edit

Distance

openings[].x_offset (gap)

dre1..4

edit

Elevation

openings[].y_offset (gap)

drw1..4

edit

Width

openings[].width

drh1..4

edit

Height

openings[].height

drs1..4

radio (L/R)

Opens

openings[].swing (gap)

drx1..4

toggle

Future

openings[].flags.future (gap)

4c — pl_dlg (Pilaster/Lintel; up to 3)

Key pattern

Type

Label

Schema field

plt1..3

toggle

Enable

panels[].pilasters[].present (gap)

plq1..3

radio (L/R)

From

panels[].pilasters[].x_reference (gap)

pld1..3

edit

Distance

panels[].pilasters[].x_offset (gap)

plw1..3

edit

Width

panels[].pilasters[].width (gap)

plh1..3

edit

Height

panels[].pilasters[].height (gap)

plx1..3

edit

Thickness

panels[].pilasters[].thickness (gap)

4d — ch_dlg (Chamfer; one spec per feature type)

Key pattern

Type

Label

Schema field

chto

toggle

Text Only

panels[].chamfer.text_only (gap)

cht1..4

toggle

Enable on Panel/Std-Opening/Man-Door/Dock-Leveler

panels[].chamfer.targets[] (gap)

chd1..4

radio

Direction (Up/Down/Both)

panels[].chamfer.direction (gap)

chs1..4

radio

Size (1/2”, 3/4”, 1”)

panels[].chamfer.size (gap)

4e — sd_dlg (Slab Dowels; up to 3 rows)

Key pattern

Type

Label

Schema field

sdt1..3

toggle

Enable

panels[].slab_dowels[].present (gap)

sde1..3

edit

Elevation

panels[].slab_dowels[].elevation (gap)

sda1..3

edit

Spacing

panels[].slab_dowels[].spacing (gap)

sdo1..3

edit

Length

panels[].slab_dowels[].length (gap)

sdi1..3

edit

Inset

panels[].slab_dowels[].inset (gap)

4f — pp_dlg (Pick Points; auto or grid up to 4×4)

Key pattern

Type

Label

Schema field

ppa

toggle

Auto place

panels[].pick_points.auto (gap)

ppc

radio (1..4)

Columns

panels[].pick_points.columns (gap)

ppr

radio (1..4)

Rows

panels[].pick_points.rows (gap)

ppt1..4

toggle

Enable (column N)

panels[].pick_points.cols[].present (gap)

ppq1..4

radio (L/R)

From

panels[].pick_points.cols[].x_reference (gap)

ppd1..4

edit

Distance

panels[].pick_points.cols[].x_offset (gap)

ppt5..8

toggle

Enable (row N)

panels[].pick_points.rows[].present (gap)

ppe5..8

edit

Elevation

panels[].pick_points.rows[].y_offset (gap)

Pick-point count and spread are direct inputs to the pick-and-brace simulation: a per-panel pickCount + pickSpread drives the rigChangeCount metric in computeMetrics (pickSimulation.ts:54-62) — when the next panel’s count or spread changes, the simulation flags a rigging changeover. See Cluster 8 for the full architecture.

4g — rb_dlg (Recess/Blockout; up to 6 circular)

Key pattern

Type

Label

Schema field

rbt1..6

toggle

Enable

panels[].recesses[].present (gap)

rbq1..6

radio (L/R)

From

panels[].recesses[].x_reference (gap)

rbd1..6

edit

Distance

panels[].recesses[].x_offset (gap)

rbe1..6

edit

Elevation

panels[].recesses[].y_offset (gap)

rbw1..6

edit

Diameter

panels[].recesses[].diameter (gap)

4h — dl_dlg (Dock Leveler; up to 3)

Key pattern

Type

Label

Schema field

dlt1..3

toggle

Enable

panels[].dock_levelers[].present (gap)

dlq1..3

radio (L/R)

From

panels[].dock_levelers[].x_reference (gap)

dld1..3

edit

Distance

panels[].dock_levelers[].x_offset (gap)

dle1..3

edit

Dock Elevation

panels[].dock_levelers[].dock_elevation (gap)

dlw1..3

edit

Dock Width

panels[].dock_levelers[].dock_width (gap)

dlh1..3

edit

Dock Height

panels[].dock_levelers[].dock_height (gap)

dlx1..3

edit

Leveler Width

panels[].dock_levelers[].leveler_width (gap)

dly1..3

edit

Leveler Elevation

panels[].dock_levelers[].leveler_elevation (gap)

dlp1..3

toggle

Drip

panels[].dock_levelers[].flags.drip (gap)

4i — lb_dlg (Ledger/Top Plate; up to 4)

Key pattern

Type

Label

Schema field

lbt1..4

toggle

Enable

panels[].ledgers[].present (gap)

lbl1..4

edit

Left Elevation

panels[].ledgers[].left.elevation (gap)

lbd1..4

edit

Left Inset

panels[].ledgers[].left.inset (gap)

lbr1..4

edit

Right Elevation

panels[].ledgers[].right.elevation (gap)

lbw1..4

edit

Right Inset

panels[].ledgers[].right.inset (gap)

lbx1..4

popup

Bolt Size

panels[].ledgers[].bolt.size (gap)

lbs1..4

radio (V/H)

Bolt Orientation

panels[].ledgers[].bolt.orientation (gap)

lby1..4

popup

Placement

panels[].ledgers[].placement (gap)

lbz1..4

popup

Spacing

panels[].ledgers[].bolt.spacing (gap)

lbh1..4

toggle

Offset/Double

panels[].ledgers[].double (gap)

lba1..4

edit

Offset value

panels[].ledgers[].offset (gap)

lbo1..4

edit

Inset (min)

panels[].ledgers[].inset_min (gap)

lbi1..4

edit

Inset value

panels[].ledgers[].inset_value (gap)

4j — fh_dlg (Feature Strip; up to 4 per page)

Key pattern

Type

Label

Schema field

fht1..N

toggle

Enable

panels[].feature_strips[].present (gap)

fhq1..N

radio (L/R)

From

panels[].feature_strips[].x_reference (gap)

fhd1..N

edit

Distance

panels[].feature_strips[].x_offset (gap)

fhl1..N

edit

Left Elevation

panels[].feature_strips[].left_elevation (gap)

fhr1..N

edit

Right Elevation

panels[].feature_strips[].right_elevation (gap)

fhw1..N

edit

Strip Width

panels[].feature_strips[].width (gap)

fha1..N

edit

Arch Radius

panels[].feature_strips[].arch_radius (gap)

fhy1..N

edit

Thickness

panels[].feature_strips[].thickness (gap)

fhx1..N

popup

Placement (Inside/Opening)

panels[].feature_strips[].placement (gap)

fhz1..N

popup

Edge (Panel/Edge)

panels[].feature_strips[].edge (gap)

fhi1..N

radio (Y/N)

Inside Opening

panels[].feature_strips[].inside_opening (gap)

u/d/l/r1..N

toggle

Place Up/Down/Left/Right

panels[].feature_strips[].place.* (gap)

fhp1..N

toggle

Dimension

panels[].feature_strips[].dimension (gap)

fhc1..N

toggle

Chop

panels[].feature_strips[].chop (gap)

4k — wc_dlg (Weld Connections; up to ~20 across pages)

Key pattern

Type

Label

Schema field

wct1..N

toggle

Enable

panels[].weld_connections[].present (gap)

wcz1..N

popup

Type

panels[].weld_connections[].type (gap)

e/s1..N

toggle

Edit/Store Details

panels[].weld_connections[].detail_mode (gap)

l/r/t/b1..N

toggle

Snap to Edge (L/R/T/B)

panels[].weld_connections[].snap.* (gap)

wcq1..N

radio (L/R)

From

panels[].weld_connections[].x_reference (gap)

wcd1..N

edit

Distance

panels[].weld_connections[].x_offset (gap)

wce1..N

edit

Elevation

panels[].weld_connections[].y_offset (gap)

wco1..N

edit

Offset

panels[].weld_connections[].offset (gap)

wcp1..N

radio (U/D)

From Face

panels[].weld_connections[].from_face (gap)

wci1..N

radio (Y/N)

Notch Top Plate

panels[].weld_connections[].notch_top_plate (gap)

4l — bp_dlg (Brace Points; up to 4, auto or manual)

Key pattern

Type

Label

Schema field

bpa

toggle

Auto place

panels[].brace_points.auto (gap)

bpn

radio (1..4)

Number

panels[].brace_points.count (gap)

bpt1..4

toggle

Enable

panels[].brace_points.items[].present (gap)

bpq1..4

radio (L/R)

From

panels[].brace_points.items[].x_reference (gap)

bpd1..4

edit

Distance

panels[].brace_points.items[].x_offset (gap)

bpe1..4

edit

Elevation

panels[].brace_points.items[].y_offset (gap)

Per-panel brace count drives both the Phase 5 “Set & brace” step duration in the 3D dress rehearsal (pickStepGen.ts:75-82) and the rigChangeCount metric — a change in braceCount from one panel to the next is treated as a rigging change. See Cluster 8.

Cluster 5 — Site dialog tree

Reached from md_dlg “su” button. The site-level surface — gridlines, wall lines, slab, batch ops. Site-level globals persist to NOD XRecord site_list (source mode) or site (VLX fallback).

Site geometry is the load-bearing input to the pick-and-brace simulation: slab corners feed castLayout()’s usable-bbox computation (castLayout.ts:62-74), wall lines define the erected-panel destinations and the perimeter walk that seeds the default pick order, and the per-project clearanceIn setting establishes the offset between the casting yard’s outer edge and the erected wall face. See Cluster 8.

5a — site_dlg (router)

Action buttons set pnl and done_dialog; dispatcher in site_dlg.lsp handles routing.

Key

Label

Routes to

new

Create New Site Drawing

(getfiled)sdwg_dlg

old

Edit Existing Site Drawing

(getfiled)

ip

Attach Panels

inspanel()

dp

Detach Panels

xref detach

tu

Tilt-up Panels

tiltup()

lp

Layout Panels

layout()

ml

Print Materials List

matl_dlg

sl

Save Layout

savelay()

val / pal

View / Print All Layers

layer ops

vsl / psl

View / Print Selected Layers

readtile filter (uses embedded layers toggles, read-only)

vp

Change 3D Viewpoint

embedded viewpt (sets vp vector)

rn

Render

stub

calc

Calc

calc_dlg

Embedded viewpt and layers sub-dialogs set vp (viewpoint vector) and a filter string xx respectively; layer toggles (s0, sx, ss, st, sc, sp, sf, sg, su, sh, sl) are read-only filter inputs — not data globals.

5b — sdwg_dlg (Site Drawing Default Settings)

Key

Label

Routes to

gl

Grid Lines

grid_dlg

wl

Wall Line

wall_dlg

sg

Slab on Grade

slab_dlg

fg

Footings

(unimplemented)

cp

Column Pads

(unimplemented)

wc

Weld Connections

(unimplemented)

calc

Calc

calc_dlg

5c — grid_dlg (Gridline Details)

Orientation cross-wired: gdh1↔gdv2, gdh2↔gdv1. Sub-buttons num/let open the per-grid-system editors.

Key

Type

Label

Global

Schema field

gdh1..4

radio

Horiz: Letters/Numbers/Asc/Desc

=key

site.grid.horizontal.* (gap)

gdv1..4

radio

Vert: Letters/Numbers/Asc/Desc

=key

site.grid.vertical.* (gap)

num

button

Define Number Grids

num_dlg

let

button

Define Letter Grids

let_dlg

calc

button

Calc

calc_dlg

5d — num_dlg / let_dlg (Per-system grid editor; up to 50 rows each)

Key pattern

Type

Label

Global

Schema field

ni / li

toggle

Insert Grid

=key

site.grid.{number,letter}.insert (gap)

np / lp

toggle

Preset Grids

=key

site.grid.{number,letter}.preset (gap)

nf / lf

edit

First

=key

site.grid.{...}.first (gap)

nl / ll

edit

Last

=key

site.grid.{...}.last (gap)

nd / ld

edit

Spacing

=key

site.grid.{...}.spacing (gap)

nb / lb

radio

Distance Between Grids

=key

site.grid.{...}.distance_mode (gap)

nr / lr

radio

Distance to Reference Grid

=key

site.grid.{...}.distance_mode (gap)

nmn1..50 / ltn1..50

edit

Grid ID (row N)

=key

site.grid.{...}.items[].id (gap)

nmd1..50 / ltd1..50

edit

Distance (row N)

=key

site.grid.{...}.items[].distance (gap)

5e — wall_dlg (Wall Lines; 64 rows × 11 fields, paged 1–4)

Pattern row: replace N with 1..64.

Key pattern

Type

Label

Global

Schema field

wla

popup

Begin X Grid

=key

site.walls[].begin.x_grid (gap)

wlb

edit

Begin X Offset

=key

site.walls[].begin.x_offset (gap)

wlc

popup

Begin Y Grid

=key

site.walls[].begin.y_grid (gap)

wld

edit

Begin Y Offset

=key

site.walls[].begin.y_offset (gap)

wle

edit

Begin Elevation

=key

site.walls[].begin.elevation (gap)

wlf

popup

End X Grid

=key

site.walls[].end.x_grid (gap)

wlg

edit

End X Offset

=key

site.walls[].end.x_offset (gap)

wlh

popup

End Y Grid

=key

site.walls[].end.y_grid (gap)

wli

edit

End Y Offset

=key

site.walls[].end.y_offset (gap)

wlj

edit

End Elevation

=key

site.walls[].end.elevation (gap)

wlk

edit

Include Panels (list)

=key

site.walls[].panels (gap)

5f — slab_dlg (Slabs; 64 rows × 10 fields + thickness, paged 1–4)

Key

Type

Label

Global

Schema field

slx1

edit

Slab Thickness

=key

site.slab.thickness (gap)

sla

popup

Begin X Grid

=key

site.slabs[].begin.x_grid (gap)

slb

edit

Begin X Offset

=key

site.slabs[].begin.x_offset (gap)

slc

popup

Begin Y Grid

=key

site.slabs[].begin.y_grid (gap)

sld

edit

Begin Y Offset

=key

site.slabs[].begin.y_offset (gap)

sle

edit

Begin Elevation

=key

site.slabs[].begin.elevation (gap)

slf

popup

End X Grid

=key

site.slabs[].end.x_grid (gap)

slg

edit

End X Offset

=key

site.slabs[].end.x_offset (gap)

slh

popup

End Y Grid

=key

site.slabs[].end.y_grid (gap)

sli

edit

End Y Offset

=key

site.slabs[].end.y_offset (gap)

slj

edit

End Elevation

=key

site.slabs[].end.elevation (gap)

5g — btch_dlg (Batch Utilities)

Key

Type

Label

Global

Schema field

ppb / pml / prh / upd / edf / idf

toggle

Print Panel Book / Materials List / Revision History / Update / Export / Import

btcho (sort flags)

(operational)

tofrom

popup

To/From file path

btcha

(operational)

srtpn / srtrn / srtdm / srtrd

radio

Sort: Panel# / Reverse# / Date / Reverse-Date

btch_sortmode (0/1/2/3)

(operational)

selall / clrall

toggle

Select / Clear All

(handler fns)

pnllist

list_box

Panel list (multi-select)

flst, dlst, pnllst

(operational)

bal / ef / fs / lt / pb / wc / cu

layer toggles

Material-list layer flags

btcha

(operational)

n / r

radio

Numbered / Reversed (legacy)

btcho (0/1)

5h — calc_dlg (Foot/Inch Calculator)

Shared helper reachable from md_dlg, site_dlg, grid_dlg, wall_dlg, slab_dlg, sdwg_dlg. Three operands (ca, cb, cc) feed inverse/square/sqrt/sum/diff/area/quotient/hyp/side/board-feet/volume/kips read-outs. Not a data-entry path for the AI fill pipeline.

Cluster 6 — cv-web cross-reference

Clusters 1–5 mapped the cv-cad (AutoCAD 2000 AutoLISP/DCL) side of the data tree. The AI-fill pipeline has a second target: cv-web, the React-based authoring environment at webpage/Simplestruct/cv-web/. cv-web carries the same panel/project/site model in typed TypeScript and serializes it through native JSON envelopes (.cvp, .cvpanel, .cvsite, .cvt). This cluster cross-walks every cv-cad cluster above to its cv-web type and envelope position.

6a — cv-web drawing environment

cv-web is a React 18.3.1 + Vite 5.4.10 SPA. 2D panel drawing is inline SVG (no Konva or Fabric — primitives are rendered as plain <rect>, <polygon>, and <path> elements with a Y-flip transform at the root). 3D extrusion uses Three.js via @react-three/fiber and @react-three/drei — panels become THREE.Shape outlines extruded by ExtrudeGeometry, with openings subtracted as holes. State lives in Zustand; persistence is Dexie/IndexedDB for the working project plus exportable JSON envelopes for share/handoff. Coordinate system: inches, Y-up, origin bottom-left, matching cv-cad’s source-mode dimension conventions.

6b — JSON envelope architecture

Defined in webpage/Simplestruct/cv-web/src/utils/cvpFormat.ts:13 (CV_FORMAT_VERSION = '1.0'). All four envelopes share the shape { cvVersion, type, exportedAt, <payload> }:

Envelope

Extension

Payload root

cv-cad analogue

CVProjectEnvelope

.cvp

project: CVProject

NOD project_list XRecord + all panel/site state

CVTemplateEnvelope

.cvt

template: { name, settings, panels[] }

Stripped-panel reusable preset (no cv-cad equivalent)

CVPanelEnvelope

.cvpanel

panel: PanelData

One panel’s runtime globals + NOD per-panel XRecord

CVSiteEnvelope

.cvsite

site: SiteData

site_dlg tree + NOD site_list XRecord

Export path: downloadJSON() builds a Blob, attaches it to a transient <a download>, and clicks it (cvpFormat.ts:59-67). Import path: parseCVFile() (cvpFormat.ts:149) detects envelope type, dispatches to per-type validation, and additionally sniffs three cv-cad export shapes (isCadExport, isCadProjectExport, isCadSiteExport) for adapter-based round-trip from cv-cad → cv-web.

6c — PanelData ↔ cv-cad var-group cross-walk

PanelData (panelvar.ts:490-515) is the typed mirror of cv-cad’s 21 *var groups. Each row below names a cv-cad var-group, its cv-web TypeScript field, the cv-cad cluster where it’s authored, and the mp_dlg feature toggle that gates it (where applicable).

cv-cad var-group

cv-web field

TS interface (file:line)

cv-cad cluster

mp_dlg toggle

mpvar

panel.mpvar

MpVar (panelvar.ts:210)

3 — mp_dlg top-level

— (always present)

rovar

panel.rovar

RoVar (panelvar.ts:264) — 4 slots

— (cv-web only; rough openings)

wdvar

panel.wdvar

WdVar (panelvar.ts:279) — 6 slots

4a — wd_dlg (Standard Openings)

mpwd

drvar

panel.drvar

DrVar (panelvar.ts:292) — 6 slots

4b — dr_dlg (Man Doors)

mpdr

dlvar

panel.dlvar

DlVar (panelvar.ts:303) — 3 slots

4h — dl_dlg (Dock Leveler)

mpdl

sbvar

panel.sbvar

SbVar (panelvar.ts:314) — 6 slots

4g — rb_dlg (Rect Recess/Blockout)

mprb

rbvar

panel.rbvar

RbVar (panelvar.ts:324) — 6 slots

4g — rb_dlg (Round Blockouts)

mprb

fhvar

panel.fhvar

FhVar (panelvar.ts:337) — 19 slots / 3 pages

4j — fh_dlg (Feature Strip, horizontal)

mpfh

fvvar

panel.fvvar

FvVar (panelvar.ts:349) — 19 slots / 3 pages

4j — fh_dlg (Feature Strip, vertical)

mpfh

plvar

panel.plvar

PlVar (panelvar.ts:359) — 2 slots

4c — pl_dlg (Pilaster)

mppl

llvar

panel.llvar

LlVar (panelvar.ts:369) — 2 slots

4c — pl_dlg (Lintel companion)

mppl

tpvar

panel.tpvar

TpVar (panelvar.ts:372) — single

4i — lb_dlg (Top Plate)

mplb

lbvar

panel.lbvar

LbVar (panelvar.ts:381) — single

4i — lb_dlg (Ledger Bar)

mplb

chvar

panel.chvar

ChVar (panelvar.ts:390) — single

4d — ch_dlg (Chamfer)

mpch

tsvar

panel.tsvar

TsVar (panelvar.ts:406) — 2 slots

3e — Top Steps (mp_dlg subroutine)

fsvar

panel.fsvar

FsVar (panelvar.ts:415) — 2 slots

3e — Footing Steps (mp_dlg subroutine)

ssvar

panel.ssvar

SsVar (panelvar.ts:427) — 2 slots

— (cv-web only; spandrel seats)

sdvar

panel.sdvar

SdVar (panelvar.ts:439) — 4 slots

4e — sd_dlg (Slab Dowels)

mpsd

bpvar

panel.bpvar

BpVar (panelvar.ts:450) — 8 slots

4l — bp_dlg (Brace Points)

mpbp

ppvar

panel.ppvar

PpVar (panelvar.ts:462) — 8 slots

4f — pp_dlg (Pick Points)

mppp

wcvar

panel.wcvar

WcVar (panelvar.ts:487) — 15 slots / 5 pages

4k — wc_dlg (Weld Connections)

mpwc

Slot<T> (panelvar.ts:251) wraps each per-feature item in { enabled: boolean, data: T }. The enabled flag is the cv-web equivalent of cv-cad’s mpX1/mpX2/… per-slot toggles inside each feature subdialog; the data block carries the same per-slot field set.

6d — Round-trip status

Direction

Mechanism

Status

Notes

cv-web → JSON

exportProjectCVP / exportTemplateCVT / exportPanelCVPanel / exportSiteCVSite (cvpFormat.ts:75-138)

✅ implemented

All four envelopes, cvVersion: "1.0"

JSON → cv-web

parseCVFile() (cvpFormat.ts:149)

✅ implemented

Validates envelope type + payload shape

cv-cad → JSON (named-export shape)

scripts/validation-lsp/cvxppnl.lsp, cvxpproj.lsp, cvxpsite.lsp

⚠️ partial

Flat-positional shape (mainPanel_1_1, type: "*-named-export"); cvVersion mixed across branches (cvxppnl.lsp:571 emits "2.0"; same file lines 714, 760 emit "1.0"; cvxpproj.lsp consistent on "1.0"). Validation-LSP only — not in TB11-01x64 product build.

cv-cad-flat JSON → cv-web

cadImportAdapter / cadProjectAdapter / cadSiteAdapter (webpage/Simplestruct/cv-web/src/utils/)

✅ implemented

Sniffs type === "panel-named-export" | "project-named-export" | "site-named-export" and rewrites into PanelData / CVProject / SiteData

JSON → cv-cad

(none)

NOT IMPLEMENTED

No inverse importer LSP in src/x64/TB11-01x64/. This is the CV-337 ship-gate dependency (Sprint 26, patent-evidence checkpoint, NLT 2026-07-09). The AI-fill pipeline can write into cv-web today; the cv-cad write-back is the missing link.

6e — AI-fill target selection

For Track D, an extracted .cvextract.json should land in cv-web first: the typed-in-memory edit surface lets a reviewer correct extraction errors before they propagate to the CAD drawing, the JSON envelopes are already round-trippable, and the schema-gap appendix below maps cleanly onto adding fields to the existing CVProject / PanelData / SiteData types without touching the legacy LSP source tree. cv-cad import (CV-337) replays the same envelopes into NOD XRecords and runtime globals once the inverse LSP exists — that’s the patent-evidence checkpoint, not the primary fill surface.

A second reason to land in cv-web first: the pick-and-brace simulation (Cluster 8) already runs there. As soon as the extracted panels populate the cv-web model, the user can hit “simulate” and get a candidate casting-yard layout, a multi-algorithm pick-order comparison, and a 6-phase 3D dress rehearsal — without the AI-fill or simulation pipelines needing the cv-cad write-back. This compresses the time-to-value from “AI extract → engineer edits CAD → run sim mentally” to “AI extract → cv-web auto-positions and animates → engineer reviews the rehearsal.”

6f — Cluster-to-envelope cross-walk for AI-fill implementers

cv-cad cluster

cv-web envelope

cv-web payload field

Notes

1 — projdet

.cvp

project.* on CVProject (panelvar.ts:702-725) — name, buildingName, jobNumber, client, engineer, superintendent, address, city, state, phone, fax, email, plus settings: ProjectSettings for concrete psi/pcf, units, precision

Closest 1:1 mapping; some cv-cad keys (e.g. addr1/addr2 split, phsite/phoffice split) collapse to single cv-web fields

2 — md_dlg

n/a (routing only)

Maps to cv-web’s ActiveDialog union (panelvar.ts:161-207), not data — 'panel-options', 'panel-dims', 'rough-openings', etc.

3 — mp_dlg top-level

.cvpanel

panel.mpvar.* on MpVar (panelvar.ts:210-248)

thickness/width/height/elevations/miters/casting orientation/top-corner geometry all present

4 — Per-feature subdialogs

.cvpanel

panel.<feat>var[] (see 6c table for each of 12 features)

Each mp_dlg toggle gates the corresponding slot array’s enabled flags

5 — Site dialog tree

.cvsite

site.* on SiteData (panelvar.ts:526-536) + project.elevations: Elevation[] (panelvar.ts:95-109) for the chained B/R/F/L corner-condition model

cv-web’s site model is sparser than cv-cad’s 64-row wall/slab tables — wall/slab batch capacity is the largest single schema gap on the cv-web side

Cluster 7 — Protobuf migration horizon

JSON is the format for v11.1. This cluster records the protobuf-vs-JSON decision for the post-submission roadmap so future planners don’t re-litigate it from scratch.

7a — Why consider protobuf

  • Typed schema with codegen. A .proto file plus protoc generates matching TypeScript, AutoLISP (via a custom emitter), Python, and any future client language from one source of truth. Today the schema lives in three places (cvpFormat.ts types, the cvxp*.schema.json files, and the cv-cad cvxp*.lsp writers) and they drift — see 6d’s cvVersion: "1.0" vs "2.0" split inside one file.

  • Forward/backward compatibility via tag numbers. Adding fields is a non-breaking version bump; renaming or removing fields is a deliberate version transition. JSON has no comparable contract — every field rename today is a flag day.

  • Wire-size savings. Large drawings with 200+ panels and 1000+ embeds serialize to multi-megabyte JSON; protobuf is typically 5–10× smaller with a binary wire format. Matters for IndexedDB quota on tablets and for cloud sync.

  • Polyglot future. A mobile client, an API, or a third-party integration each needs its own decoder; codegen amortizes the cost.

7b — Why defer past v11.1

  • JSON is human-readable for patent-evidence inspection. CV-337 is a patent-evidence checkpoint — a reviewer needs to open the extracted document and see the captured panel data in plaintext. Binary protobuf defeats that.

  • No cv-cad protobuf runtime. AutoCAD 2000 AutoLISP has no protobuf decoder. We’d need to hand-write one in LSP (varint, length-delimited, etc.) — material engineering work on a runtime the modernization roadmap is trying to exit, not invest in.

  • Schema is still in v0.1 → v0.2 churn. The v0.2 candidates appendix below is roughly the same size as the v0.1 schema itself. Adding protobuf now means maintaining two serializers across the most volatile phase of the schema’s life.

  • No second client yet. Until a mobile app, an external API, or a partner integration exists, the codegen overhead is paying premium for capacity that’s not used.

Cluster 8 — Pick-and-brace simulation architecture

The pick-and-brace simulation is a downstream consumer of every cluster above. It takes the populated cv-web model (whether authored by hand or filled by the AI extractor) and answers two questions the rest of the industry answers by hand on a whiteboard:

  1. Where should each panel be cast — flat in the yard, exterior face down — so the crane can pick, swing, and set it with the fewest moves, the shortest reach, and the cleanest rigging changes?

  2. What does that pick sequence actually look like in 3D — will the rigging clash with an erected panel, will the next brace conflict with the crane footprint, will a wind-load rig require a changeover mid-row?

Today the entire pipeline lives in cv-web. The cv-cad port (carry-back) is post-v11.1 — listed here because the same dialog tree feeds it on either side, and the AI-fill bridge spec needs the consumer documented to justify which v0.2 schema fields are load-bearing.

8a — Search: every-candidate-position layout

castLayout() (webpage/Simplestruct/cv-web/src/utils/castLayout.ts:56) places panels flat in the casting yard with their exterior face down (so the crane picks the textured face up and tilts it to vertical at the wall). The search space is the usable slab bbox, derived from the site cluster’s slab corners shrunk inward by the project’s clearanceIn setting (castLayout.ts:62-74). Within that bbox the algorithm:

  1. Walks the perimeter wall clockwise, attempting to place each panel adjacent to its erected destination (near-wall placement minimizes the swing arc from cast to erected).

  2. Falls back to a central “snake” layout for panels that don’t fit near-wall.

  3. Stacks lighter panels on heavier ones where pick-order allows (the isStacked / stackLevel / stackedOnId fields on CastPlacedPanel).

  4. Positions the crane: an LR1300 with a 240”-radius track footprint (CRANE_BODY_RADIUS_IN), placed at the NW corner with iterative inward push so the body never crosses a slab edge.

  5. Returns the clockwise perimeter-walk order as the seed for downstream pick algorithms (perimOrder on CastLayoutResult).

This is the “evaluate every possible position” piece: the bbox + clearance + stacking + crane-exclusion constraints are searched exhaustively for each panel, not just placed by user gesture. The user-tunable knobs are clearanceIn (yard margin), the crane model (drives the load chart in craneCapacity.ts), and whether to allow stacking — every other position is computed.

8b — Score: multi-criteria + Monte Carlo

runAllAlgorithms() (pickSimulation.ts:171) runs five deterministic pick-order algorithms plus an N-iteration Monte Carlo over random shuffles, and scores each ordering on eight metrics computed by computeMetrics() (pickSimulation.ts:17):

Algorithm

What it optimizes for

perimeter-cw

Clockwise wall walk — matches the field convention; baseline

nearest-neighbor

Greedy minimum swing — start from crane, always pick the closest remaining panel

weight-desc (Heaviest first)

Front-loads the critical-radius picks while crane is fresh

weight-asc (Lightest first)

Defers heavies; useful when site access changes mid-erection

mark-sequential

Natural-sort by panel mark — matches the shop’s casting schedule

random (MC)

Monte Carlo median over N shuffles; surfaces the value of any ordering vs. unstructured

Metric (in SimMetrics)

Field meaning

totalArmRotationRad

Sum of

totalArmExtensionDelta

Sum of

totalSwingDistIn

Sum of straight-line distance from cast-down position to erected position — minimum start-to-stop travel for the panel itself

mobilizationCount

Picks whose radius is inside the crane exclusion zone — counts forced crane reposition events

rigChangeCount

Consecutive panels that change pickCount, braceCount, or pickSpread by >6” — counts rigging changeovers

maxPickRadius

Worst-case boom extension — drives crane sizing decisions

totalWeightTons

Aggregate lift-tonnage — sanity check

criticalPickCount

Picks at >75% of the load-chart capacity at that radius (capacityAtRadius in craneCapacity.ts) — counts high-risk lifts

Monte Carlo runs in a Web Worker (pickSimWorker.ts) to keep the main thread responsive. The N-iteration ensemble is reduced to min / p25 / median / p75 / max / IQR per metric (computeMcStats in pickSimulation.ts:151), letting the engineer compare any deterministic algorithm against the random-shuffle distribution — if the chosen ordering is worse than MC median on a metric, it’s suspect.

8c — Animate: 6-phase 3D dress rehearsal

generatePickSteps() (pickStepGen.ts:12) emits a 6-phase animation step per panel:

Phase

Step

What it animates

1

Hook up

Crane rotates to face cast position; rigging descends to flat panel

2

Tilt up

Panel pivots from flat to vertical; bottom edge stays on slab

3

Lift

Panel rises ~4 ft clearance (bottom off slab)

4

Swing to wall

Crane rotates; panel travels across yard to wall destination

5

Set & brace

Panel lowered to footing; crew installs braces (count from bpvar); crane holds load

6

Release rigging

Rigging disconnected; panel self-supporting

Phases 2 and 5 are the two critical field steps — Phase 2 because tilt-up is when the panel is most fragile (face hasn’t reached vertical, rigging is fully loaded), Phase 5 because the crane sits idle holding the load while the brace crew works.

The 3D viewer renders all of this against the same THREE.Shape + ExtrudeGeometry panel meshes already used for static review (CastLayout3D.tsx), so the dress rehearsal exposes:

  • Rigging clash — when the slings or spreader bar would intersect an erected panel during Phase 4 swing.

  • Bracing clash — when a Phase-5 brace footprint overlaps the next pick’s swing path or the crane’s footprint.

  • Crane placement conflict — when mobilizationCount > 0, the simulation surfaces which panels force a crane reposition and where.

  • Rigging changeover — phases 4→5 where rigChangeCount increments are highlighted, showing the engineer the exact transitions that cost field time.

8d — Data dependencies

Which clusters above feed which simulation inputs:

Simulation input

Source cluster

cv-web field path

Panel weight (tons)

Cluster 3 — mp_dlg thickness × width × height + Cluster 1 concpcf

Derived in materialsCalc.tsCastPlacedPanel.weightTons

Panel geometry (for casting + 3D mesh)

Cluster 3 — mp_dlg top-level + 4d ch_dlg chamfer

panel.mpvar, panel.chvar

Casting orientation

Cluster 3 — mp_dlg casting orientation

panel.mpvar.castingOrientation ('face-down' | 'face-up')

Pick-point count + spread

Cluster 4f — pp_dlg

panel.ppvar slots → pickCount, pickSpread on CastPlacedPanel

Brace-point count

Cluster 4l — bp_dlg

panel.bpvar slots → braceCount

Openings (clash test against rigging)

Cluster 4a/4b — wd_dlg, dr_dlg

panel.wdvar, panel.drvar

Slab corners (usable bbox)

Cluster 5 — site_dlg / slab_dlg

SiteData slab geometry → slabCorners in castLayout()

Wall lines (erected destinations + perimeter walk)

Cluster 5f — wall_dlg

Elevation[] chained corners → WallCastRow[]

Clearance from erected face

Project settings

CastLayoutSettings.clearanceIn

Crane model + load chart

Project settings

craneCapacity.ts ring table (LR1300 today; library extensible)

Per-panel installed position (for swing distance)

Cluster 5f — wall_dlg row order

installedPositions map in pickStepGen.ts

Every field with a *(gap)* marker above that feeds this table is a v0.2 simulation-input candidate (see appendix below).

8e — Roadmap

  • Today (cv-web, in development). All five files cited above are working. Improvements still on the punch list: stacking heuristics, ground-bearing pressure under crane outriggers, rigging library beyond a single LR1300, wind-load gating on Phase 4 swing, and configurable scoring weights so a contractor can prioritize (e.g.) form-and-pour ergonomics over swing time.

  • Sprint 22+ (post-v11.1). Land a simulation.* block in schema v0.2 carrying clearance, crane model, scoring weights, and the selected algorithm — so the .cvextract.json round-trip carries the user’s simulation preferences alongside the panel data.

  • Post-CV-337 (cv-cad carry-back). Replay the cv-web layout result into cv-cad as a DXF “casting layout” sheet plus a per-panel casting_position XRecord. The simulation itself stays cv-web-native (the algorithms are inappropriate to port to AutoCAD 2000 LISP); cv-cad consumes the result, not the search.

8f — Novelty and patent posture

The patent-worthy combination is the closed loop, not any single component:

  1. AI blueprint extraction → typed model. Reads a fabricator’s tilt-up plans and lands them in PanelData / SiteData / CVProject without engineer-by-engineer manual entry.

  2. Every-candidate-position layout search. Computes a casting-yard placement for each panel against a multi-criteria score, not by drag-and-drop. The clearance-from-erected-wall constraint and the crane-exclusion zone are honored as hard constraints; the rest is optimized.

  3. Multi-algorithm + Monte Carlo scoring. Surfaces the value of any deterministic ordering against a random distribution. Most existing tilt-up planning tools optimize a single criterion (usually crane reach); the eight-metric score with MC ranking is — to our knowledge — without prior art at the contractor-tool tier.

  4. 3D dress rehearsal with conflict prediction. Animates the chosen sequence against the actual panel meshes and erected-state geometry to surface rigging clash, brace clash, crane reposition events, and rigging changeovers before any panel is cast.

User-facing benefits captured by this loop: automated panel-form layout (no manual yard plan), faster pick times (the score is the metric the field crew is paid against), and risk reduction (the rehearsal catches the conflicts that would otherwise stop the job on erection day).

Combined with the AI-fill story (CV-336 schema, CV-337 cv-cad write-back), this is the strongest single patent-evidence narrative in the roadmap. The cv-web prototype is the evidence; the cv-cad carry-back is the durability proof.

Schema v0.2 candidates appendix

Aggregating the gaps surfaced above. Each candidate is a field or block schema v0.1 doesn’t model but cv-cad already accepts via dialog or persists via NOD XRecord. This appendix is informational — it identifies follow-up work for a Sprint 22+ v0.2 design pass; doc 50’s schema v0.1 stays pinned for Sprints 21–27.

Top-level blocks (currently absent from v0.1)

  • project.* — name, building, contractor, superintendent, estimator, location, address (line1/2, city/state/zip), contact (phone_site/office, fax_site/office, email), concrete (psi, pcf), schedule, notes, units (system, precision), language, plot (sheet_size). Source: projdet + mp_dlg Project Information row. Persists to NOD project_list.

  • site.* — grid (horizontal/vertical letter/number/ascending), grid items (per-row id+distance, up to 50 each system), walls[] (64 max, begin/end x_grid/x_offset/y_grid/y_offset/elevation + panels list), slabs[] (64 max, same pattern), slab.thickness. Source: site dialog tree. Persists to NOD site_list.

  • simulation.* — pick-and-brace simulation preferences (Cluster 8). clearance_in (yard margin from erected face), crane.model (LR1300 default; library extensible), crane.exclusion_in (additional margin beyond track footprint), scoring.weights.{swing,extension,mobilization,rig_change,critical_pick} (per-metric weights for the chosen algorithm), algorithm ∈ {perimeter-cw, nearest-neighbor, weight-desc, weight-asc, mark-sequential, random}, mc_iterations (Monte Carlo run count), allow_stacking. No cv-cad analogue today — these are cv-web-resident; cv-cad carries them back as a single XRecord blob post-CV-337.

Per-panel attribute extensions (panels[].*)

  • thickness, width (currently only bbox_world is modeled)

  • elevation.{bottom, top_left, top_right}, peak.{distance, elevation}, arch_radius

  • miter.{left, right}.{back, front, z} (six values per panel)

  • expansion_gap.{left, right}, radius_panel

  • casting_face ∈ {outside, inside}

  • dim_reference ∈ {edge, outside_wall, inside_wall}

  • print.{layout, shaded}

  • id (panel number, alphanumeric — distinct from VLM-assigned bbox id)

Per-panel feature arrays (each adds one new panels[].<name>[] array)

  • pilasters[] — present, x_reference, x_offset, width, height, thickness

  • chamfer — text_only, targets[] (panel/std-opening/man-door/dock-leveler), direction, size

  • slab_dowels[] — present, elevation, spacing, length, inset

  • pick_points — auto, columns, rows, cols[].{present,x_reference,x_offset}, rows[].{present,y_offset}

  • recesses[] — present, x_reference, x_offset, y_offset, diameter

  • dock_levelers[] — present, x_reference, x_offset, dock_{elevation, width, height}, leveler_{width, elevation}, drip

  • ledgers[] — present, left/right {elevation, inset}, bolt {size, orientation, spacing}, placement, double/offset value, inset_min/value

  • feature_strips[] — present, x_reference, x_offset, left/right_elevation, width, arch_radius, thickness, placement, edge, inside_opening, place.{up,down,left,right}, dimension, chop

  • weld_connections[] — present, type, detail_mode, snap.{l,r,t,b}, x_reference, x_offset, y_offset, offset, from_face, notch_top_plate

  • brace_points — auto, count, items[].{present, x_reference, x_offset, y_offset}

openings[] extensions (v0.1 has type/width/height/bbox/evidence only)

  • present, x_reference ∈ {left, right}, x_offset, y_offset

  • arch_radius (Standard Openings)

  • swing ∈ {left, right} (Man Doors)

  • flags.{drip, future, trim, notch}

Decisions deferred to v0.2 design

  1. Whether panels[].id is the human-facing panel number (e.g. “P1A”) or the VLM-assigned bbox identifier (“P-001”). v0.1 uses the latter; cv-cad’s mpp# is the former. Likely both — a panels[].label for the human number, panels[].id for the bbox-anchor.

  2. Whether project- and site-level data belong inside .cvextract.json or in a sibling .cvproject.json / .cvsite.json document. Track D’s NLT 2026-07-09 scope is panel-level only; project/site round-trip is post-submission scope.

  3. Whether feature-array items need their own evidence blocks (R26 mitigation extends from panel→feature granularity) or whether panel-level evidence suffices.

Cross-references