51 — cv-cad Dialog Data-Entry Map¶
Snapshot: 2026-05-18 Owner: 47-gtm-plan Track D Related: 50-blueprint-extraction-architecture —
.cvextract.jsonschema 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 |
|---|---|
|
Top-level panel attribute (schema v0.1 if listed; gap otherwise) |
|
Per-panel feature list — most are schema gaps in v0.1 |
|
Schema v0.1 already models this (limited to width/height/bbox/type) |
|
Schema v0.1 |
|
Gap — no |
|
Gap — no |
|
Not data-entry (routing button, view command, calc helper) |
|
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 |
|
|
bldgname |
edit |
Building Name/Number |
|
|
concpsi |
edit |
Concrete Compressive Strength |
|
|
concpcf |
edit |
Concrete Weight |
|
|
projloc |
edit |
Project Location |
|
|
contractor |
edit |
Contractor |
|
|
super |
edit |
Superintendent |
|
|
addr1 |
edit |
Address line 1 |
|
|
addr2 |
edit |
Address line 2 |
|
|
city |
edit |
City |
|
|
state |
edit |
State |
|
|
zip |
edit |
ZIP |
|
|
phsite |
edit |
Phone (Site) |
|
|
phoffice |
edit |
Phone (Office) |
|
|
fxsite |
edit |
FAX (Site) |
|
|
fxoffice |
edit |
FAX (Office) |
|
|
edit |
|
|
||
schedule |
edit |
Schedule / Delivery |
|
|
notes |
edit |
Special Instructions |
|
|
estimator |
edit |
Estimator |
|
|
imperial / metric |
radio |
Measurement System |
|
|
p8 / p16 |
radio |
Display Precision |
|
|
english / espanol |
radio |
Language |
|
|
s8x11 / s8x14 / s11x17 |
radio |
Plot Sheet Size |
|
|
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 / |
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 |
→ |
pbt |
Batch Utilities |
→ |
calc |
Calc |
inline |
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 |
|
|
mppn |
edit (RO) |
Project Name |
|
|
mpbn |
edit |
Building Name |
|
|
det |
button |
Details |
— |
→ |
3b — Drawing Details¶
Key |
Type |
Label |
Global |
Schema field |
|---|---|---|---|---|
mpp# |
edit |
Panel Number |
|
|
mpdb |
edit |
Drawn by |
|
|
mpsc |
popup |
Drawing Scale |
|
|
mpcf |
radio (of/if) |
Casting Face Down |
|
|
mped |
radio (ep/ow/iw) |
Distances Specified From |
|
|
mppr |
radio (au/po/la) |
Printing Layout |
|
|
mpsv |
toggle |
Shaded View |
|
|
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 |
|
|
mpw1 |
edit |
Width |
|
|
mpe1 |
edit |
Bottom Elevation |
|
|
mpl1 |
edit |
Top Left Elevation |
|
|
mpr1 |
edit |
Top Right Elevation |
|
|
mpd1 |
edit |
Top Peak Distance |
|
|
mpp1 |
edit |
Top Peak Elevation |
|
|
mpa1 |
edit |
Top Arch Radius |
|
|
3d — Edge miters, expansion gaps, radius panel¶
Key |
Type |
Label |
Global |
Schema field |
|---|---|---|---|---|
mpm1 / mpm3 |
edit |
Left miter ( |
|
|
mpzl |
edit |
Left Z Offset |
|
|
mpul |
image |
Left Up-Face indicator |
|
— (display only) |
mpm2 / mpm4 |
edit |
Right miter ( |
|
|
mpzr |
edit |
Right Z Offset |
|
|
mpur |
image |
Right Up-Face indicator |
|
— (display only) |
mpgl |
edit |
Left Expansion Gap |
|
|
mpgr |
edit |
Right Expansion Gap |
|
|
mprp |
edit |
Radius Panel |
|
|
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 |
|
|
Man Door |
mpdr |
|
|
Pilaster/Lintel |
mppl |
|
|
Chamfer |
mpch |
|
|
Slab Dowels |
mpsd |
|
|
Pick Points |
mppp |
|
|
Recess/Blockout |
mprb |
|
|
Dock Leveler |
mpdl |
|
|
Ledger/Top Plate |
mplb |
|
|
Feature Strip |
mpfh |
|
|
Weld Connections |
mpwc |
|
|
Brace Points |
mpbp |
|
|
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 |
|
wdq1..12 |
radio (L/R) |
From |
|
wdd1..12 |
edit |
Distance |
|
wde1..12 |
edit |
Elevation |
|
wdw1..12 |
edit |
Width |
|
wdh1..12 |
edit |
Height |
|
wda1..12 |
edit |
Arch Radius |
|
wdp1..12 |
toggle |
Drip |
|
wdx1..12 |
toggle |
Future |
|
wdo1..12 |
toggle |
Trim |
|
wdi1..12 |
toggle |
Notch |
|
4b — dr_dlg (Man Doors; up to 4)¶
Key pattern |
Type |
Label |
Schema field |
|---|---|---|---|
drt1..4 |
toggle |
Enable |
|
drq1..4 |
radio (L/R) |
From |
|
drd1..4 |
edit |
Distance |
|
dre1..4 |
edit |
Elevation |
|
drw1..4 |
edit |
Width |
|
drh1..4 |
edit |
Height |
|
drs1..4 |
radio (L/R) |
Opens |
|
drx1..4 |
toggle |
Future |
|
4c — pl_dlg (Pilaster/Lintel; up to 3)¶
Key pattern |
Type |
Label |
Schema field |
|---|---|---|---|
plt1..3 |
toggle |
Enable |
|
plq1..3 |
radio (L/R) |
From |
|
pld1..3 |
edit |
Distance |
|
plw1..3 |
edit |
Width |
|
plh1..3 |
edit |
Height |
|
plx1..3 |
edit |
Thickness |
|
4d — ch_dlg (Chamfer; one spec per feature type)¶
Key pattern |
Type |
Label |
Schema field |
|---|---|---|---|
chto |
toggle |
Text Only |
|
cht1..4 |
toggle |
Enable on Panel/Std-Opening/Man-Door/Dock-Leveler |
|
chd1..4 |
radio |
Direction (Up/Down/Both) |
|
chs1..4 |
radio |
Size (1/2”, 3/4”, 1”) |
|
4e — sd_dlg (Slab Dowels; up to 3 rows)¶
Key pattern |
Type |
Label |
Schema field |
|---|---|---|---|
sdt1..3 |
toggle |
Enable |
|
sde1..3 |
edit |
Elevation |
|
sda1..3 |
edit |
Spacing |
|
sdo1..3 |
edit |
Length |
|
sdi1..3 |
edit |
Inset |
|
4f — pp_dlg (Pick Points; auto or grid up to 4×4)¶
Key pattern |
Type |
Label |
Schema field |
|---|---|---|---|
ppa |
toggle |
Auto place |
|
ppc |
radio (1..4) |
Columns |
|
ppr |
radio (1..4) |
Rows |
|
ppt1..4 |
toggle |
Enable (column N) |
|
ppq1..4 |
radio (L/R) |
From |
|
ppd1..4 |
edit |
Distance |
|
ppt5..8 |
toggle |
Enable (row N) |
|
ppe5..8 |
edit |
Elevation |
|
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 |
|
rbq1..6 |
radio (L/R) |
From |
|
rbd1..6 |
edit |
Distance |
|
rbe1..6 |
edit |
Elevation |
|
rbw1..6 |
edit |
Diameter |
|
4h — dl_dlg (Dock Leveler; up to 3)¶
Key pattern |
Type |
Label |
Schema field |
|---|---|---|---|
dlt1..3 |
toggle |
Enable |
|
dlq1..3 |
radio (L/R) |
From |
|
dld1..3 |
edit |
Distance |
|
dle1..3 |
edit |
Dock Elevation |
|
dlw1..3 |
edit |
Dock Width |
|
dlh1..3 |
edit |
Dock Height |
|
dlx1..3 |
edit |
Leveler Width |
|
dly1..3 |
edit |
Leveler Elevation |
|
dlp1..3 |
toggle |
Drip |
|
4i — lb_dlg (Ledger/Top Plate; up to 4)¶
Key pattern |
Type |
Label |
Schema field |
|---|---|---|---|
lbt1..4 |
toggle |
Enable |
|
lbl1..4 |
edit |
Left Elevation |
|
lbd1..4 |
edit |
Left Inset |
|
lbr1..4 |
edit |
Right Elevation |
|
lbw1..4 |
edit |
Right Inset |
|
lbx1..4 |
popup |
Bolt Size |
|
lbs1..4 |
radio (V/H) |
Bolt Orientation |
|
lby1..4 |
popup |
Placement |
|
lbz1..4 |
popup |
Spacing |
|
lbh1..4 |
toggle |
Offset/Double |
|
lba1..4 |
edit |
Offset value |
|
lbo1..4 |
edit |
Inset (min) |
|
lbi1..4 |
edit |
Inset value |
|
4j — fh_dlg (Feature Strip; up to 4 per page)¶
Key pattern |
Type |
Label |
Schema field |
|---|---|---|---|
fht1..N |
toggle |
Enable |
|
fhq1..N |
radio (L/R) |
From |
|
fhd1..N |
edit |
Distance |
|
fhl1..N |
edit |
Left Elevation |
|
fhr1..N |
edit |
Right Elevation |
|
fhw1..N |
edit |
Strip Width |
|
fha1..N |
edit |
Arch Radius |
|
fhy1..N |
edit |
Thickness |
|
fhx1..N |
popup |
Placement (Inside/Opening) |
|
fhz1..N |
popup |
Edge (Panel/Edge) |
|
fhi1..N |
radio (Y/N) |
Inside Opening |
|
u/d/l/r1..N |
toggle |
Place Up/Down/Left/Right |
|
fhp1..N |
toggle |
Dimension |
|
fhc1..N |
toggle |
Chop |
|
4k — wc_dlg (Weld Connections; up to ~20 across pages)¶
Key pattern |
Type |
Label |
Schema field |
|---|---|---|---|
wct1..N |
toggle |
Enable |
|
wcz1..N |
popup |
Type |
|
e/s1..N |
toggle |
Edit/Store Details |
|
l/r/t/b1..N |
toggle |
Snap to Edge (L/R/T/B) |
|
wcq1..N |
radio (L/R) |
From |
|
wcd1..N |
edit |
Distance |
|
wce1..N |
edit |
Elevation |
|
wco1..N |
edit |
Offset |
|
wcp1..N |
radio (U/D) |
From Face |
|
wci1..N |
radio (Y/N) |
Notch Top Plate |
|
4l — bp_dlg (Brace Points; up to 4, auto or manual)¶
Key pattern |
Type |
Label |
Schema field |
|---|---|---|---|
bpa |
toggle |
Auto place |
|
bpn |
radio (1..4) |
Number |
|
bpt1..4 |
toggle |
Enable |
|
bpq1..4 |
radio (L/R) |
From |
|
bpd1..4 |
edit |
Distance |
|
bpe1..4 |
edit |
Elevation |
|
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 |
|
old |
Edit Existing Site Drawing |
|
ip |
Attach Panels |
|
dp |
Detach Panels |
xref detach |
tu |
Tilt-up Panels |
|
lp |
Layout Panels |
|
ml |
Print Materials List |
|
sl |
Save Layout |
|
val / pal |
View / Print All Layers |
layer ops |
vsl / psl |
View / Print Selected Layers |
|
vp |
Change 3D Viewpoint |
embedded |
rn |
Render |
stub |
calc |
Calc |
|
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 |
|
wl |
Wall Line |
|
sg |
Slab on Grade |
|
fg |
Footings |
(unimplemented) |
cp |
Column Pads |
(unimplemented) |
wc |
Weld Connections |
(unimplemented) |
calc |
Calc |
|
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 |
|
|
gdv1..4 |
radio |
Vert: Letters/Numbers/Asc/Desc |
|
|
num |
button |
Define Number Grids |
— |
→ |
let |
button |
Define Letter Grids |
— |
→ |
calc |
button |
Calc |
— |
|
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 |
|
|
np / lp |
toggle |
Preset Grids |
|
|
nf / lf |
edit |
First |
|
|
nl / ll |
edit |
Last |
|
|
nd / ld |
edit |
Spacing |
|
|
nb / lb |
radio |
Distance Between Grids |
|
|
nr / lr |
radio |
Distance to Reference Grid |
|
|
nmn1..50 / ltn1..50 |
edit |
Grid ID (row N) |
|
|
nmd1..50 / ltd1..50 |
edit |
Distance (row N) |
|
|
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 |
|
|
wlb |
edit |
Begin X Offset |
|
|
wlc |
popup |
Begin Y Grid |
|
|
wld |
edit |
Begin Y Offset |
|
|
wle |
edit |
Begin Elevation |
|
|
wlf |
popup |
End X Grid |
|
|
wlg |
edit |
End X Offset |
|
|
wlh |
popup |
End Y Grid |
|
|
wli |
edit |
End Y Offset |
|
|
wlj |
edit |
End Elevation |
|
|
wlk |
edit |
Include Panels (list) |
|
|
5f — slab_dlg (Slabs; 64 rows × 10 fields + thickness, paged 1–4)¶
Key |
Type |
Label |
Global |
Schema field |
|---|---|---|---|---|
slx1 |
edit |
Slab Thickness |
|
|
sla |
popup |
Begin X Grid |
|
|
slb |
edit |
Begin X Offset |
|
|
slc |
popup |
Begin Y Grid |
|
|
sld |
edit |
Begin Y Offset |
|
|
sle |
edit |
Begin Elevation |
|
|
slf |
popup |
End X Grid |
|
|
slg |
edit |
End X Offset |
|
|
slh |
popup |
End Y Grid |
|
|
sli |
edit |
End Y Offset |
|
|
slj |
edit |
End Elevation |
|
|
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 |
|
— (operational) |
tofrom |
popup |
To/From file path |
|
— (operational) |
srtpn / srtrn / srtdm / srtrd |
radio |
Sort: Panel# / Reverse# / Date / Reverse-Date |
|
— (operational) |
selall / clrall |
toggle |
Select / Clear All |
(handler fns) |
— |
pnllist |
list_box |
Panel list (multi-select) |
|
— (operational) |
bal / ef / fs / lt / pb / wc / cu |
layer toggles |
Material-list layer flags |
|
— (operational) |
n / r |
radio |
Numbered / Reversed (legacy) |
|
— |
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 |
|---|---|---|---|
|
|
|
NOD |
|
|
|
Stripped-panel reusable preset (no cv-cad equivalent) |
|
|
|
One panel’s runtime globals + NOD per-panel 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 |
|
|
3 — mp_dlg top-level |
— (always present) |
rovar |
|
|
— (cv-web only; rough openings) |
— |
wdvar |
|
|
4a — |
|
drvar |
|
|
4b — |
|
dlvar |
|
|
4h — |
|
sbvar |
|
|
4g — |
|
rbvar |
|
|
4g — |
|
fhvar |
|
|
4j — |
|
fvvar |
|
|
4j — |
|
plvar |
|
|
4c — |
|
llvar |
|
|
4c — |
|
tpvar |
|
|
4i — |
|
lbvar |
|
|
4i — |
|
chvar |
|
|
4d — |
|
tsvar |
|
|
3e — Top Steps (mp_dlg subroutine) |
— |
fsvar |
|
|
3e — Footing Steps (mp_dlg subroutine) |
— |
ssvar |
|
|
— (cv-web only; spandrel seats) |
— |
sdvar |
|
|
4e — |
|
bpvar |
|
|
4l — |
|
ppvar |
|
|
4f — |
|
wcvar |
|
|
4k — |
|
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 |
|
✅ implemented |
All four envelopes, |
JSON → cv-web |
|
✅ implemented |
Validates envelope type + payload shape |
cv-cad → JSON (named-export shape) |
|
⚠️ partial |
Flat-positional shape ( |
cv-cad-flat JSON → cv-web |
|
✅ implemented |
Sniffs |
JSON → cv-cad |
(none) |
❌ NOT IMPLEMENTED |
No inverse importer LSP in |
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 — |
|
|
Closest 1:1 mapping; some cv-cad keys (e.g. |
2 — |
n/a (routing only) |
— |
Maps to cv-web’s |
3 — |
|
|
thickness/width/height/elevations/miters/casting orientation/top-corner geometry all present |
4 — Per-feature subdialogs |
|
|
Each |
5 — Site dialog tree |
|
|
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
.protofile plusprotocgenerates 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.tstypes, thecvxp*.schema.jsonfiles, and the cv-cadcvxp*.lspwriters) and they drift — see 6d’scvVersion: "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.
7c — Recommended sequencing¶
Now → Sprint 22 (v11.1 ship window). JSON envelopes only,
cvVersion: "1.0". Land schema v0.1 (CV-336, Sprint 21) and the JSON → cv-cad importer (CV-337, Sprint 26) per doc 47 Track D. No protobuf work.Sprint 22+ (post-ship, schema v0.2 design). Continue in JSON, but design v0.2 in a
.proto-friendly shape: flat numeric field IDs inpanelvar.tscomments, no anonymous nested objects, no union types in payloads (use a discriminator field + flat optionals). A future protobuf port becomes mechanical rather than a redesign.Post-WoC 2027 (or first second-client demand). Adopt protobuf v0.3 with a JSON-fallback transcoder for patent-evidence inspection. Trigger is a confirmed second consumer (mobile app, partner API, embedded sensor stream) — not a calendar date.
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:
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?
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:
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).
Falls back to a central “snake” layout for panels that don’t fit near-wall.
Stacks lighter panels on heavier ones where pick-order allows (the
isStacked/stackLevel/stackedOnIdfields onCastPlacedPanel).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.Returns the clockwise perimeter-walk order as the seed for downstream pick algorithms (
perimOrderonCastLayoutResult).
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 |
|---|---|
|
Clockwise wall walk — matches the field convention; baseline |
|
Greedy minimum swing — start from crane, always pick the closest remaining panel |
|
Front-loads the critical-radius picks while crane is fresh |
|
Defers heavies; useful when site access changes mid-erection |
|
Natural-sort by panel mark — matches the shop’s casting schedule |
|
Monte Carlo median over N shuffles; surfaces the value of any ordering vs. unstructured |
Metric (in |
Field meaning |
|---|---|
|
Sum of |
|
Sum of |
|
Sum of straight-line distance from cast-down position to erected position — minimum start-to-stop travel for the panel itself |
|
Picks whose radius is inside the crane exclusion zone — counts forced crane reposition events |
|
Consecutive panels that change |
|
Worst-case boom extension — drives crane sizing decisions |
|
Aggregate lift-tonnage — sanity check |
|
Picks at >75% of the load-chart capacity at that radius ( |
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 |
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
rigChangeCountincrements 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 — |
Derived in |
Panel geometry (for casting + 3D mesh) |
Cluster 3 — |
|
Casting orientation |
Cluster 3 — |
|
Pick-point count + spread |
Cluster 4f — |
|
Brace-point count |
Cluster 4l — |
|
Openings (clash test against rigging) |
Cluster 4a/4b — |
|
Slab corners (usable bbox) |
Cluster 5 — |
|
Wall lines (erected destinations + perimeter walk) |
Cluster 5f — |
|
Clearance from erected face |
Project settings |
|
Crane model + load chart |
Project settings |
|
Per-panel installed position (for swing distance) |
Cluster 5f — |
|
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.jsonround-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_positionXRecord. 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:
AI blueprint extraction → typed model. Reads a fabricator’s tilt-up plans and lands them in
PanelData/SiteData/CVProjectwithout engineer-by-engineer manual entry.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.
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.
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_dlgProject Information row. Persists to NODproject_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 NODsite_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 onlybbox_worldis modeled)elevation.{bottom, top_left, top_right},peak.{distance, elevation},arch_radiusmiter.{left, right}.{back, front, z}(six values per panel)expansion_gap.{left, right},radius_panelcasting_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, thicknesschamfer— text_only, targets[] (panel/std-opening/man-door/dock-leveler), direction, sizeslab_dowels[]— present, elevation, spacing, length, insetpick_points— auto, columns, rows, cols[].{present,x_reference,x_offset}, rows[].{present,y_offset}recesses[]— present, x_reference, x_offset, y_offset, diameterdock_levelers[]— present, x_reference, x_offset, dock_{elevation, width, height}, leveler_{width, elevation}, dripledgers[]— present, left/right {elevation, inset}, bolt {size, orientation, spacing}, placement, double/offset value, inset_min/valuefeature_strips[]— present, x_reference, x_offset, left/right_elevation, width, arch_radius, thickness, placement, edge, inside_opening, place.{up,down,left,right}, dimension, chopweld_connections[]— present, type, detail_mode, snap.{l,r,t,b}, x_reference, x_offset, y_offset, offset, from_face, notch_top_platebrace_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_offsetarch_radius(Standard Openings)swing∈ {left, right} (Man Doors)flags.{drip, future, trim, notch}
Decisions deferred to v0.2 design¶
Whether
panels[].idis the human-facing panel number (e.g. “P1A”) or the VLM-assigned bbox identifier (“P-001”). v0.1 uses the latter; cv-cad’smpp#is the former. Likely both — apanels[].labelfor the human number,panels[].idfor the bbox-anchor.Whether project- and site-level data belong inside
.cvextract.jsonor in a sibling.cvproject.json/.cvsite.jsondocument. Track D’s NLT 2026-07-09 scope is panel-level only; project/site round-trip is post-submission scope.Whether feature-array items need their own
evidenceblocks (R26 mitigation extends from panel→feature granularity) or whether panel-level evidence suffices.
Cross-references¶
50-blueprint-extraction-architecture —
.cvextract.jsonv0.1 schema definition47-gtm-plan §Track D — sprint-level schedule, CV-336 (schema, Sprint 21) and CV-337 (cv-cad import round-trip, Sprint 26)
03-phase-plan-p0-p5 §P2-D, §P3-E — phase plan acknowledgment
00-vision-and-success-criteria §Top Risks — R26/R27/R28 ship-gate elevation