Bug Tracker — Validation Campaign¶
Last Updated: April 9, 2026 Test Environments: VM 102/103/104 (XP), VM 108 (Win10 x32), VM 201 (Win10 x32 Alpha)
This document tracks bugs discovered during the 2026 validation campaign. Bugs are categorized by the build/version where they were discovered.
Bug Definition
A bug is any deviation from expected user experience — including code defects, misconfigurations, missing registry entries, incomplete installations, confusing UI behavior, and environmental issues. If the user encounters something unexpected or suboptimal, it gets logged here regardless of root cause. There is no such thing as an “automation bug” or “tooling bug” — there are only bugs that automation and tooling expose. The goal is to capture every friction point so the product and its deployment can be optimized.
TB11 Source-Mode Bugs (VM 108)¶
Bugs 1–18 were found on VM 108 (Win10 x32) after removing csv.vlx and switching to direct .lsp source loading.
# |
Severity |
Status |
Title |
File(s) |
Commit |
|---|---|---|---|---|---|
1 |
Critical |
✅ Fixed |
CSV.VLX overrides all source file changes |
csv.mnu, csv.mns, csv.cui |
Session 1 |
2 |
High |
✅ Fixed |
File browser shows no .dwg files |
csv.lsp ( |
Session 1 |
3 |
High |
✅ Fixed |
dirchk false positive on project directories |
dirchk.lsp |
Session 1 |
4 |
Critical |
✅ Fixed |
|
Multiple .lsp files |
Session 1 |
5 |
Critical |
✅ Fixed |
|
scr.lsp |
Session 2 |
6 |
High |
✅ Fixed |
|
csv.lsp routing |
Session 2 |
7 |
Critical |
✅ Fixed |
VLX detection matches VLIDE runtime, skips source loading |
csv.lsp |
|
8 |
Medium |
✅ Fixed |
|
csv.lsp |
|
9 |
High |
✅ Fixed |
Drawing type dialog asks every time (never persists) |
csv.lsp |
|
10 |
Medium |
✅ Fixed |
Tilt-Up crashes with |
tiltup.lsp |
|
11 |
Low |
✅ Fixed |
|
inspanel.lsp |
|
12 |
High |
✅ Fixed |
Attach Panels crashes |
inspanel.lsp |
Session 3 |
13 |
High |
✅ Fixed |
Wall line entities missing — no recovery + TEXT regression |
wall_dlg.lsp, inspanel.lsp |
Session 3 |
14 |
High |
✅ Fixed |
tiltlist.txt ENAME serialization — entmod rejects saved data |
inspanel.lsp |
|
15 |
High |
✅ Fixed |
Tilt-Up index bug — nn vs xn for pnllst lookup |
tiltup.lsp |
|
16 |
Critical |
✅ Fixed |
conslist.txt ENAME serialization — Layout crashes on re-read |
savelay.lsp |
|
17 |
High |
✅ Fixed |
Layout index bug — nn vs xn for pnllst lookup |
layout.lsp |
|
18 |
High |
✅ Fixed |
|
csv.lsp (L687–950) |
G-series + Step 7 PASS (Mar 6–21) |
Profile/Deployment Bugs (VLX Installations)¶
Bugs discovered during AutoIT validation comparing XP VMs. These are registry/profile configuration issues that affect VLX-based installations (not source-mode).
# |
Version |
VM |
Severity |
Status |
Title |
Registry Key |
|---|---|---|---|---|---|---|
19 |
PB11 |
103 |
Critical |
✅ Fixed |
Missing menu registration causes |
|
20 |
v7.0 |
104 |
Critical |
✅ Workaround verified |
Startup Suite VLX crash + missing Startup Suite entries |
|
21 |
v7.0 |
104 |
High |
✅ Fixed |
Edit Existing Drawing can’t find CSBsite1.dwg — missing Project Settings |
|
Deployment, Environment & Validation Bugs (VM 104)¶
Bugs 22–30 were discovered during the Feb 28, 2026 deployment and validation campaign on VM 104 (XP-TEST). These span platform quirks, deployment script issues, validation pipeline gaps, and source-mode loading failures — all exposed by automated and manual validation testing.
# |
VM(s) |
Severity |
Status |
Title |
File(s) |
Commit |
|---|---|---|---|---|---|---|
22 |
104 |
High |
✅ Fixed |
Forward slashes fail through NTFS junctions on XP |
|
|
23 |
104 |
Low |
✅ Fixed |
|
|
|
24 |
All |
Medium |
✅ Fixed |
Validation screenshots overwrite — stale data contamination |
|
|
25 |
All |
High |
⚠️ Known |
AutoIT false positive — error dialog detected as valid CV dialog |
|
— |
26 |
104 |
Medium |
✅ Fixed |
Git not on SSH PATH — CV Update.bat fails when run remotely |
|
|
27 |
104 |
Low |
✅ Fixed |
CMD echo caret escaping corrupts generated acaddoc.lsp |
|
|
28 |
104 |
High |
✅ Fixed |
|
|
|
29 |
104 |
Critical |
✅ Fixed |
|
|
|
30 |
104 |
High |
🔍 Investigating |
|
|
— |
Multi-User / New Profile Bugs¶
Bugs discovered during alpha testing when non-Administrator users log in for the first time.
# |
VM(s) |
Severity |
Status |
Title |
File(s) |
Commit |
|---|---|---|---|---|---|---|
31 |
201 |
Critical |
🔲 Open |
New user profile missing AutoCAD configuration — CV Update is per-user (HKCU) |
|
— |
Historical Crash Dumps & Validation Bugs¶
Bugs discovered during the March 2, 2026 validation campaign on VM 104, plus historical crash dump analysis from VM 103.
# |
VM(s) |
Severity |
Status |
Title |
File(s) |
Commit |
|---|---|---|---|---|---|---|
32 |
103 |
Info |
📋 Historical |
VM 103 |
|
— |
33 |
104 |
High |
🔲 Open |
AutoCAD crash opening CSBsite1.dwg — |
|
— |
34 |
104 |
High |
🔲 Open |
|
|
— |
35 |
104 |
High |
🔲 Open |
CSBsite1.dwg not found — site drawing open fails |
|
— |
Trace Infrastructure Bugs (G0/G1/G2 AutoIT Scripts)¶
Bugs 82–85 were discovered during the March 2026 trace campaign (G0/G1/G2 multi-VM run). These are defects in the trace automation scripts (cv-trace-g1.au3, cv-trace-g2.au3) and the tracer LISP module, exposed by running across VMs with different initialization states.
# |
VM(s) |
Severity |
Status |
Title |
File(s) |
Commit |
|---|---|---|---|---|---|---|
82 |
104 |
High |
✅ Fixed |
|
|
|
83 |
All |
High |
✅ Fixed |
G1/G2 drawing open fails — |
|
|
84 |
108 |
Critical |
✅ Fixed |
AutoCAD crashes when G1/G2 continues executing after drawing open failure |
|
|
85 |
108 |
High |
✅ Fixed |
G1/G2 LISP strings arrive per-word reversed — |
|
|
G1 First-Run Bugs (March 20–21, 2026)¶
Bugs 86–91 were discovered during G1/G2 trace runs on VM108. G1 completed successfully with [CV-TRACE-G1-END] written. G2 completed with [CV-TRACE-G2-END] written.
# |
VM(s) |
Severity |
Status |
Title |
File(s) |
Commit |
|---|---|---|---|---|---|---|
86 |
108 |
High |
✅ Fixed |
|
|
|
87 |
108 |
High |
✅ Fixed |
|
|
|
88 |
108 |
Medium |
✅ Fixed |
G2 CSBsite1 false negative — window detection fires before 59 XREFs finish loading |
|
|
89 |
108 |
High |
✅ Fixed |
|
|
|
90 |
108 |
High |
✅ Fixed |
|
|
|
91 |
108 |
Medium |
✅ Fixed |
Print cleanup |
|
|
92 |
108 |
High |
✅ Fixed |
|
|
|
AutoCAD 2027 Deployment Bugs (Local Dev)¶
Bugs 93+ discovered during AutoCAD 2027 (R26.0) deployment on local dev machine (Dell Latitude 5480, Win11 Pro x64).
# |
VM(s) |
Severity |
Status |
Title |
File(s) |
Commit |
|---|---|---|---|---|---|---|
93 |
Local |
Critical |
✅ Fixed |
AutoCAD 2027 crash — |
|
|
94 |
Local |
High |
✅ Fixed |
|
|
|
95 |
Local |
High |
✅ Fixed |
Edit Existing Drawing blocked by Bug 92 guard when on untitled drawing |
|
|
96 |
Local |
High |
✅ Fixed |
Default project directory points to My Documents instead of CV Project Files |
|
|
97 |
Local |
High |
✅ Fixed |
Drawing Setup > Existing Project getfiled never shown — while loop condition always false |
|
|
98 |
Local |
Medium |
✅ Fixed |
|
|
|
99 |
Local |
Medium |
✅ Fixed |
No |
|
|
100 |
Local |
High |
✅ Fixed |
“Create New Project” crashes with “This drawing has no panel data” — panatt blocks new drawings |
|
|
101 |
Local |
Low |
⚠️ External |
AutoCAD 2027 crash on exit — |
None (Autodesk bug) |
— |
102 |
Local |
High |
✅ Fixed |
New Drawing dead end — |
|
— |
103 |
All |
High |
🔲 Open |
|
|
— |
104 |
All |
Critical |
🔲 Open |
Project Details not persisted to XRecord — data lost on AutoCAD restart |
|
— |
105 |
Local |
High |
✅ Fixed |
|
|
|
106 |
Local |
High |
✅ Fixed |
|
|
|
107 |
Local |
High |
✅ Fixed |
First |
|
— |
108 |
Local |
High |
✅ Fixed |
|
|
— |
109 |
Local |
High |
✅ Fixed |
|
|
— |
110 |
Local |
High |
✅ Fixed |
|
|
— |
111 |
Global |
High |
✅ Fixed |
|
21 |
— |
112 |
Global |
Medium |
✅ Fixed |
47 |
40+ |
— |
113 |
Global |
Medium |
✅ Fixed |
12 |
12 |
— |
114 |
Local |
Medium |
✅ Fixed |
|
|
— |
115 |
Global |
Medium |
✅ Fixed |
30 unguarded |
12 |
— |
116 |
Global |
Medium |
✅ Fixed |
13 unguarded |
drawpan.lsp, finpan.lsp (both x32/x64) |
— |
117 |
Local |
High |
🔲 Open |
New Project (pc=262153) hits DEFAULT on blank drawing — regression from April 13 |
csv.lsp, projdet.lsp |
— |
118 |
Local |
High |
🔲 Open |
Project Details fields show stale/default data on panel and site drawings — get_tile called after unload_dialog (Bug 101/104 confirmed in parity testing) |
projdet.lsp |
— |
119 |
Local |
Medium |
🔲 Open |
Materials List fails: panel “no blocks found” (no INSERTs on layer 0), site “no panels loaded” (panel NOD guard rejects site drawings) |
matl_dlg.lsp, csv.lsp |
— |
120 |
Local |
High |
🔲 Open |
4 panel print/layer routes still DEFAULT after Bug 111 fix — works on site but not panel. View All Layers, Print All, Print Setup, Print Select |
csv.lsp, plt.lsp |
— |
Detailed Bug Reports¶
Bug 1: CSV.VLX Overrides Source Files¶
Discovered: Session 1
Severity: Critical
Symptom: All
.lspedits had no effect — AutoCAD loaded the compiledcsv.vlxbinary instead.Root Cause: The menu macros in
csv.mnu,csv.mns, andcsv.cuireferencedcsv.vlxdirectly. AutoCAD loaded the VLX (which bundles all modules) before any source files.Fix: Renamed
csv.vlxtocsv.vlx.bak. Changed all 57 menu macros (19 per file × 3 files) fromcsv.vlx→csv.lsp. Deletedcsv.mnc/csv.mnrcache files.Impact: Enabled all subsequent source-mode development and testing.
Bug 2: File Browser Shows No .dwg Files¶
Discovered: Session 1
Severity: High
Symptom: “Open Existing Project” file dialog showed no files.
Root Cause:
getfiledinproject()used" "(space) as the file filter with flag1(Save mode). This showed all files but made it confusing.Fix: Changed filter to
"dwg"with flag2(Open mode) to show only drawing files.File:
csv.lsp—project()function
Bug 3: dirchk False Positive¶
Discovered: Session 1
Severity: High
Symptom: dirchk incorrectly flagged valid project directories as AutoCAD program directories.
Root Cause: Original implementation used greedy wildcard matching that was too broad.
Fix: Rewrote
dirchk.lspwith exact path matching againstacaddir.File:
dirchk.lsp
Bug 4: Block Comments Crash AutoCAD 2000¶
Discovered: Session 1
Severity: Critical
Symptom: Files with
#| |#block comments caused parse errors when loaded via(load "filename").Root Cause: AutoCAD 2000’s
(load)function does not support#| |#syntax. Only the Visual LISP IDE and compiled.vlxbundles parse them.Fix: Reverted all
#| |#comments back to;;style. Added explicit ban to.github/copilot-instructions.md.Prevention: Coding standards now prohibit
#| |#block comments.
Bug 5: (command "open" path) Invocation/Context Failure in AutoCAD 2000¶
Discovered: Session 2
Severity: Critical
Symptom: Automated open flow sometimes created files named
_.openor routed the path argument into the wrong command context.Root Cause: Not a universal OPEN defect. Failures came from invocation/context issues: command syntax in automation and leaked active command state (especially SAVEAS after
dbchk/qsaveon unsaved drawings).Fix: Corrected automation syntax (AU3/manual validation path), removed the fragile pre-open dependency in routing, and retained
vla-open+vla-activate+S::STARTUPfor deterministic document switching.File:
scr.lsp(document-switch path), related routing incsv.lspKey Insight:
(command "open" ...)is stateful/context-sensitive in AutoCAD 2000 LISP automation; ActiveX/COM open is more reliable for scripted switching.
Bug 6: dbchk Leaves SAVEAS Active¶
Discovered: Session 2
Severity: High
Symptom: After
dbchkran on an unsavedDrawing.dwg, all subsequent(command ...)calls had their arguments eaten by the still-active SAVEAS dialog.Root Cause:
dbchkcalls(command "qsave"). On an untitled drawing (Drawing.dwg), QSAVE triggers SAVEAS, which opens a file dialog and leavescmdactive=1. All subsequent LISP(command ...)calls feed arguments into SAVEAS instead of their intended commands.Fix: Removed
(dbchk)call from the existing-project routing path incsv.lsp. Thevla-openapproach handles the document switch without needing a pre-save.File:
csv.lsp— routing block at ~line 435
Bug 7: VLX Detection Matches VLIDE Runtime¶
Discovered: Session 3 (Feb 24, 2026)
Severity: Critical
Symptom: All 93 module functions (
inspanel,tiltup,site_dlg, etc.) were undefined. Site operations (Attach Panels, Tilt-Up, Detach Panels) all failed with errors.Root Cause: The ARX detection loop matched
*vlide*in addition to*csv*. The VLIDE runtime loads into the ARX list whenevervl-load-comis called (which our newscr.lspdoes). With*vlide*matching, the code took thevl-acad-defunpath — which does nothing without a VLX — and skipped loading all 93 .lsp source files.Fix: Removed
*vlide*from the ARX match pattern. Only*csv*is checked now.File:
csv.lsp— module loading section (~line 240)Commit:
480c6fb
;; BEFORE (broken):
(if (or (wcmatch a "*vlide*") (wcmatch a "*csv*"))
;; AFTER (fixed):
(if (wcmatch a "*csv*")
Bug 8: FILE nil on Batch File Creation¶
Discovered: Session 3 (Feb 24, 2026)
Severity: Medium
Symptom:
error: bad argument type: FILE nilduringcsvstartup.Root Cause:
(open)returns nil when the target directory is read-only (e.g.,C:\Program Files\ACAD2000\under UAC). The code passed nil directly to(princ ... f)without checking.Fix: Wrapped
cv.batandcvplst.batcreation in(if f ...)guards.File:
csv.lsp— batch file creation section (~lines 360-393)Commit:
480c6fb
Bug 9: Drawing Type Dialog Asks Every Time¶
Discovered: Session 3 (Feb 24, 2026)
Severity: High
Symptom: Every time “Drawing Setup” was run on an existing site drawing, it asked “Panel or Site?” via
csv_ask_dwgtypedialog — even after choosing “Site” repeatedly.Root Cause: The
csv_ask_dwgtypefunction was added as a fallback for drawings with nopanel_listorsite_listin the Named Object Dictionary. But it never persisted the choice to the dictionary, so the next run hit the same fallback.Fix: Replaced
csv_ask_dwgtypewith a 4-step detection: (1) panel_list in dictionary → panel, (2) site_list in dictionary → site, (3) filename contains*SITE*→ site (heuristic), (4) fallback → panel (PB11 default behavior).File:
csv.lsp— routing logic (~lines 447-457)Commit:
480c6fb
Bug 10: Tilt-Up Crashes Without Attach Panels¶
Discovered: Session 3 (Feb 24, 2026)
Severity: Medium
Symptom:
error: bad argument type: FILE nilwhen running “Tilt-Up Panels” from Site Options.Root Cause:
tiltup.lspline 2 openstiltlist.txtfor reading. This file is created byinspanel.lsp(Attach Panels workflow). If Attach Panels was never run on the drawing, the file doesn’t exist and(open ...)returns nil.Fix: Added nil check with
(alert)explaining “You must Attach Panels before Tilt-Up.” Wrapped the entire function body in(if (not f) ... (progn ...)).File:
tiltup.lspCommit:
337f000Note: This is also the original PB11 behavior — both versions crash without
tiltlist.txt. The fix is new defensive code.
Bug 11: Inspanel.lsp Filename Capitalization¶
Discovered: Session 3 (Feb 24, 2026)
Severity: Low
Symptom: Capital
IinInspanel.lsplooks like lowercasel(lspanel) at a glance, causing confusion when reading file listings.Root Cause: Original file was saved with capital letter. All code references use lowercase
inspanel.Fix:
git mv Inspanel.lsp inspanel.lspCommit:
cd130c6
Bug 12: Attach Panels Crashes on Missing Wall Lines¶
Discovered: Session 3 (Feb 24, 2026)
Severity: High
Symptom:
error: bad argument type: lselsetp nilwhen running “Attach Panels” from Site Options on CSBsite1.Root Cause:
inspanel.lspcalls(ssget "x" ...)to find LINE entities on the WALLINE layer. If no wall lines exist (or the layer has no LINE entities),ssgetreturns nil. The code then calls(sslength nil)which crashes. Same issue exists for the panel number TEXT entities.Fix: Added nil guards for both
wls(wall lines) andnums(panel numbers) ssget results. Each shows an(alert)explaining what’s missing and returns cleanly instead of crashing.File:
inspanel.lspNote: This is also a PB11 bug — the original code has no nil checks on ssget results. The drawing may need wall lines drawn before panels can be attached.
Bug 13: Wall Line Entities Missing — No Recovery + TEXT Regression¶
Discovered: Session 3
Severity: High
Symptom: Attach Panels shows “No wall lines found” alert on CSBsite1. The drawing previously had panels attached, so wall lines existed at some point.
Root Cause (two issues):
No recovery path: When WALLINE entities are missing (erased or drawing saved without them),
inspanelhad no way to regenerate them. Initial attempt usingwalllist.txtsave/restore was broken becauseinspanelline 33 doesdel *list.txt(deletes all list files) before the recovery code runs.v7.0→v11 TEXT regression: In v7.0,
walline()created both LINE entities and TEXT entities (panel numbers) on the WALLINE layer. In v11 (PB11/TB11),walline()was refactored to store panel numbers as XData on LINE entities only — TEXT creation was removed. Butinspanelwas never updated and still searches for TEXT entities on WALLINE. This is a latent PB11 bug that only manifests whenwalline()is called on a fresh site (or for recovery).
Fix (three parts):
Moved
wallineto top-level inwall_dlg.lspso it can be called frominspanel(was previously nested insidewall_dlgand only defined when the dialog ran).Added grdlst auto-build to
walline— builds grid lookup table from sitevar if not already set (needed when called from inspanel recovery vs. from wall_dlg dialog).Restored TEXT creation in
walline(v7.0 behavior) — creates panel number TEXT entities at evenly-spaced positions along each wall LINE. This fixes the v7.0→v11 regression.Inspanel recovery: When
ssgetreturns nil for WALLINE entities, calls(walline)to regenerate from site dictionary data, then retriesssget. Removed brokenwalllist.txtapproach.
Files:
wall_dlg.lsp(walline refactor + TEXT creation),inspanel.lsp(walline recovery)Related: Bug 12 (nil guard prerequisite)
Bug 14: tiltlist.txt ENAME Serialization¶
Discovered: Session 3 (Feb 24, 2026)
Severity: High
Symptom:
error: extra cdrs in dotted pairwhen Tilt-Up reads tiltlist.txt generated by inspanel’s fast path.Root Cause:
entgetreturns ENAME objects in DXF group 330 (owner pointer) and XData group -3. Whenprin1writes these to a text file, it serializes them as<Entity name: 7ef73060>— a string thatreadcannot parse back into a valid association list. Thereadcall either fails outright or produces malformed data thatentmodrejects.Fix: Added filter to both the fast path and normal tiltlist.txt write in
inspanel.lsp. Before writing, strips any association where(type (cdr p))is'ENAMEand any group with code-3(XData). Only serializable DXF groups (numbers, strings, lists) are written.File:
inspanel.lsp— fast path (~line 110) and normal path (~line 480)Commit:
401c1b1
;; Filter: strip ENAME objects and XData before prin1
(foreach p (cdr x)
(if (and (/= (type (cdr p)) 'ENAME)
(/= (car p) -3)
)
(set 'tmp (cons p tmp))
)
)
Bug 15: Tilt-Up Index Bug — nn vs xn for pnllst Lookup¶
Discovered: Session 3 (Feb 24, 2026)
Severity: High
Symptom:
error: bad association list (nil (0 . "INSERT") ...)when running Tilt-Up after Layout.Root Cause:
tiltup.lspuses a double loop to match live panel entities (pnllst) to saved tilt data (tiltlst) by block name. When a match is found, the code substitutes the live entity name frompnllstinto the savedtiltlstentry. However, the code usednn(thetiltlstloop index) to index intopnllst— should have usedxn(thepnllstloop index). Whentiltlsthas more entries thanpnllst,(nth nn pnllst)returns nil, producing(nil (0 . "INSERT") ...)whichentmodrejects.Fix: Changed
(assoc -1 (nth nn pnllst))to(assoc -1 (nth xn pnllst)).File:
tiltup.lsp— line 76Commit:
ad326f5Note: This is a latent PB11 bug — the original production code has the same error. It only triggers when
tiltlstandpnllsthave different sizes.
;; BEFORE (broken) — nn is tiltlst index, wrong list:
(assoc -1 (nth nn pnllst))
;; AFTER (fixed) — xn is pnllst index, correct list:
(assoc -1 (nth xn pnllst))
Bug 16: conslist.txt ENAME Serialization — Layout Crashes on Re-read¶
Discovered: Session 4 (Feb 25, 2026)
Severity: Critical
Symptom:
error: extra cdrs in dotted pair on inputwhen running “Layout Panels” a second time (withconslist.txtalready present).Root Cause:
savelay.lspstripped only the-1entity name pair via(cdr x)but left group 330 (ENAME owner pointers like(330 . <Entity name: 1F>)) and group -3 (XData) in the output. Whenprin1wrote these ENAME values toconslist.txt,(read (read-line f))inlayout.lspcould not parse the<Entity name:...>token — it is not valid Lisp syntax.Fix: Replaced the simple
(cdr x)strip with the same ENAME/XData filter used ininspanel.lsp— checks(type (cdr p))for'ENAMEand skips groups with code-3. Only serializable DXF groups (numbers, strings, lists) are written.File:
savelay.lsp— complete rewrite with proper formattingCommit:
96f693bNote: This is the
conslist.txtcounterpart of Bug 14 (tiltlist.txt).inspanel.lspwas fixed in Bug 14 butsavelay.lspwas overlooked — same root cause, different file.
;; BEFORE (broken) — strips only -1 pair, leaves ENAME/XData:
(set 'conslst (mapcar '(lambda (x) (cdr x)) pnllst))
;; AFTER (fixed) — full ENAME/XData filter:
(set 'conslst
(mapcar
'(lambda (x)
(set 'tmp nil)
(foreach p (cdr x)
(if (and (/= (type (cdr p)) 'ENAME)
(/= (car p) -3)
)
(set 'tmp (cons p tmp))
)
)
(reverse tmp)
)
pnllst
)
)
Bug 17: Layout Index Bug — nn vs xn for pnllst Lookup¶
Discovered: Session 4 (Feb 25, 2026)
Severity: High
Symptom: Layout’s second-pass restore (from
conslist.txt) substitutes the wrong live entity name, causingentmodto silently fail or modify the wrong panel.Root Cause: Identical to Bug 15 (tiltup.lsp).
layout.lspuses a double loop to match live panel entities (pnllst, indexed byxn) to saved layout data (conslst, indexed bynn). When a match is found, the code substituted the live entity name using(assoc -1 (nth nn pnllst))— butnnis theconslstindex. Should be(assoc -1 (nth xn pnllst))to get the entity from the correct list.Fix: Changed
(nth nn pnllst)to(nth xn pnllst)in thesubstcall.File:
layout.lsp— second-pass branch (~line 153)Commit:
96f693bNote: This is a latent PB11 bug — the original production code has the same error. Same pattern as Bug 15 in
tiltup.lsp.
;; BEFORE (broken) — nn is conslst index, wrong list:
(assoc -1 (nth nn pnllst))
;; AFTER (fixed) — xn is pnllst index, correct list:
(assoc -1 (nth xn pnllst))
Bug 18: progcont Routing Missing from Source — VLX/Source Mismatch¶
Discovered: Session 4 (Feb 27, 2026)
Updated: March 1, 2026 — root cause corrected after VLX binary analysis and OCR comparison
Severity: High → Critical (upgraded — blocks all source-mode menu routing)
Status: ✅ Fixed — March 21, 2026 (routing reconstructed in csv.lsp lines 687–950; G-series validated all 17 progcont values; P0 Step 7 PASS on configs B–G)
DFMEA: BRK-04 / BRK-05 (RPN 240 — upgraded from 70) — Section 7.1, doc 31
Symptom: “Drawing Setup”, “Create New Project”, “Create New Drawing”, “Edit Existing Drawing”, “Slope Calculator”, and “Batch Utilities” all produce the same “Panel Options” dialog in source-mode. Users expect distinct operations per menu item but get the same dialog regardless.
Root Cause (corrected Mar 1, 2026): The original analysis stated “
progcontis never read by any code” — this was wrong. Theprogcontvariable IS read by the compiled VLX bytecode and correctly routes to different dialogs per value. OCR evidence from VM 102 (PB11/VLX) confirms:progcont 1 → “Program Options” hub dialog
progcont 8193 → “Slope Elevation Calculator”
progcont 262153 → “Project Details”
progcont 262161 → file chooser “Choose a Drawing to use as a template”
progcont 262145 → file chooser “Choose a Drawing to edit”
progcont 262177 → “Batch UI”
The real problem is a VLX/source code mismatch: the CSV.VLX was compiled from source that was never committed to the repository. Specifically:
VLX’s embedded
md_dlg.dcl= “ConstructiVision - Program Options” with numeric button keys ("2","8","16","32","64","128","256","512","1024","2048","4096","16384") mapping to progcont bitmasksSource
md_dlg.dcl(both PB11 and TB11) = “ConstructiVision – Panel Options” with string keys ("new","old","val","pal","vgp", etc.) — a completely different, lower-level dialogVLX’s compiled
c:csvreadsprogcontand routes to different dialogs per bitmask value. The sourcecsv.lspnever readsprogcont.The
csv.mnumenu file is the authoritative source for all progcont values (17 menu items). The au3 test fixture replicates the menu macros exactly:(progn (setq progcont N)(c:csv)).
Fix Implemented: Progcont routing reconstructed in
csv.lsplines 687–950:Lines 687–710: Comment block documenting all 17 progcont values
Lines 713–729: Named constants for 12 unique progcont values
Lines 730–758: Bug 92 guard (blocks dispatch without project context)
Lines 762–990: Complete
(condrouting dispatch for each progcont valueLine 994: Clears progcont after dispatch to prevent stale values
Validation: G-series trace campaign (Mar 14–21) — G1 (8/8 panel), G2 (9/9 site), G3 (5/5 remaining) all dispatched correctly. P0 Step 7 passed on configs B–G (Mar 6). All 17 menu items produce their expected dialogs.
Files:
csv.lsp(routing — lines 687–950),csv.mnu(progcont source of truth)
Profile/Deployment Bug Reports¶
Bug 20: Startup Suite VLX Crash + Missing Startup Suite Entries¶
Build: v7.0(patch) VM: 104 (XP-TEST)
Discovered: Session 6 (Feb 28, 2026) — AutoIT validation on VM 104 (v7.0 patch)
Severity: Critical
Status: 🔧 Workaround (deferred loading via
acaddoc.lsp; root cause TBD)DFMEA: 20 (NEW — Environment-dependent VLX load crash)
Symptom: Typing
csvat the AutoCAD command line returns “Unknown command ‘CSV’. Press F1 for help.” and(c:csv)returns “error: no function definition: C:CSV”. After applying Startup Suite registry fix, AutoCAD crashes (Access Violation 0xC0000005) during VLX load. Manually clicking ConstructiVision > Program Options loads the VLX successfully — the VLX itself is fine, only the Startup Suite loading timing triggers the crash.
Investigation Timeline¶
Phase 1 — Registry fix (Session 6): Identified missing Startup Suite entries (
NumStartup/1Startup). Applied registry fix. AutoCAD still failed — crashed instead of loading VLX.Phase 2 — Crash analysis (Session 7):
acadstk.dmpon VM 104 Desktop revealed 3 identical crashes:ExceptionCode=0xC0000005(Access Violation)ExceptionAddress=0x440B73Reading address
0x40(null pointer + offset = nullthispointer at ECX=0x0)StackWalk: LocalizeReservedPlotStyleStrings+533inacad.exeTimestamps: Feb 27 9:48 PM, Feb 28 7:33 AM, Feb 28 7:55 AM
Phase 3 — Binary comparison: VM 102’s
acadstk.dmp(5 entries from 2008–2021) showed DIFFERENT crashes (HP plotter driver, OPM, ACDB15) — noLocalizeReservedPlotStyleStringscrash ever occurred on VM 102.Phase 4 — Binary analysis:
acad.exe MD5 comparison (all 6,795,264 bytes):
VM
MD5 Hash
Last Modified
102 (working)
6EB94B99B9B09DE5B8BC0D6C53AFEF1004/10/2008
103 (working)
6EB94B99B9B09DE5B8BC0D6C53AFEF10(matches)
104 (crashing)
E3A40A5A5EE98FF67ECE4B1F4B56E8AD02/10/2026
Binary diff: Only 36 bytes differ, all clustered at offset
0x6452A0–0x645368(data section). Hex dump shows this is a registration/serial data area (_R_FFFRFFFRFpattern followed by encoded serial data) — NOT executable code. PE compile timestamp is identical (0x36FA04B0= March 25, 1999).Phase 5 — Exe swap DISPROVEN (Session 8):
Test A: Patched exe + NO VLX loading (NumStartup=0) → AutoCAD starts normally, no crash
Test B: VM 102’s original exe copied to VM 104 + VLX loading enabled → SAME CRASH (0xC0000005 at 0x440B73,
LocalizeReservedPlotStyleStrings+533)Conclusion: The 36-byte patch is NOT the cause. Both binaries crash identically. The original acad.exe was restored from backup (
acad.exe.bak-patched).
Phase 6 — Environmental comparison (Session 8):
Complete registry comparison between VM 102 (working) and VM 104 (crashing):
Component
VM 102
VM 104
Match?
Startup Suite (
NumStartup,1Startup)Present
Present (after fix)
✅
Menu registration (
Group1,Pop13)Present
Present
✅
ACAD search path
Identical
Identical
✅
acad2000.lsp,acad2000doc.lspOriginal
Identical content
✅
Plotter configs (
.pc3files)Identical set
Identical set
✅
DLLs in ACAD2000 directory
All match
All match
✅
DefaultConfig (printer)
Symantec Fax Starter EditionMicrosoft XPS Document Writer❌
Installed printers
7 printers (hardware drivers)
1 printer (XPS only)
❌
Plot-related registry (
PSTYLEPOLICY,PLOTLEGACY, etc.)Present
Missing (using defaults)
❌
Plot Styles folder
19 files (4 custom .ctb)
15 files (stock only)
❌
Key finding: The crash is in
LocalizeReservedPlotStyleStrings— a plot subsystem function. VM 104 has minimal printer/plotter configuration (single XPS printer) vs VM 102’s 7 hardware printers. Several plot-related registry entries (PSTYLEPOLICY,PLOTLEGACY,PAPERUPDATE,PLSPOOLALERT) are present on VM 102 but missing on VM 104.Phase 7 — Workaround (Session 8):
Key observation: User manually clicked ConstructiVision > Program Options → VLX loaded successfully. CSV command worked. The VLX itself is fine — the crash only occurs during Startup Suite loading (very early initialization).
Solution: Bypass Startup Suite entirely. Load VLX via
acaddoc.lsp(per-document loader) which runs after AutoCAD subsystems are fully initialized.
Root Cause:
Missing Startup Suite entries — v7.0(patch) installation did not register
CSV.VLXin the AutoCAD Startup SuiteEnvironment-dependent crash during early VLX loading — When VLX loads via Startup Suite (very early in initialization),
LocalizeReservedPlotStyleStringscrashes with null pointer dereference. This crash is NOT caused by the 36-byte exe patch (disproven by testing VM 102’s unmodified binary). The suspected trigger is VM 104’s minimal printer/plot configuration — the crash function name (LocalizeReservedPlotStyleStrings) relates to the plot subsystem, and VM 104 differs significantly from VM 102 in printer setup. Root cause remains under investigation.
Fix (workaround):
Disable Startup Suite (prevent crash):
reg add "HKCU\...\Appload\Startup" /v NumStartup /t REG_SZ /d 0 /fDeploy
acaddoc.lsptoC:\Program Files\ACAD2000\support\:;;; acaddoc.lsp - ConstructiVision deferred VLX loader (if (not (boundp 'c:csv)) (progn (load "CSV.VLX") (princ "\nConstructiVision loaded.\n") ) ) (princ)
Deploy
acad.lsptoC:\Program Files\ConstructiVision\(backup S::STARTUP loader):;;; acad.lsp - ConstructiVision deferred VLX loader (backup) (defun S::STARTUP () (if (not (boundp 'c:csv)) (progn (load "CSV.VLX") (princ "\nConstructiVision loaded.\n")) ) (princ) )
Original
acad.exerestored — VM 102’s binary was swapped in during Session 7 but the same crash occurred, proving the 36-byte patch was not the cause. The original was restored from backup.
Files deployed on VM 104:
C:\Program Files\ACAD2000\support\acaddoc.lsp(749 bytes) — per-document VLX loaderC:\Program Files\ConstructiVision\acad.lsp(778 bytes) — S::STARTUP backup loaderC:\Program Files\ACAD2000\acad.exe— original binary restored (MD5E3A40A5A5EE98FF67ECE4B1F4B56E8AD)C:\Program Files\ACAD2000\acad.exe.bak-patched— backup of original
Crash dumps preserved locally:
reports/ocr-output/vm104-feb28/acadstk.dmp(1,998 bytes, 3 crashes)reports/ocr-output/vm104-feb28/acadstk-manual-run.dmp(681 bytes, 1 crash with VM 102 exe)reports/ocr-output/vm102-acadstk.dmp(6,824 bytes, 5 historical crashes from 2008–2021)
acad.exe binaries preserved locally:
reports/vm-compare/acad-vm102.exe— VM 102 original (MD56EB94B99B9B09DE5B8BC0D6C53AFEF10)reports/vm-compare/acad-vm104.exe— VM 104 original (MD5E3A40A5A5EE98FF67ECE4B1F4B56E8AD)reports/vm-compare/acad-vm103.exe— VM 103 (matches VM 102)
Status: ✅ Workaround verified (Feb 28, 2026). User manually opened AutoCAD on VM 104 desktop, typed
csv→ command recognized. Ran full validation manually — all steps passed until Bug 21 (missing Project Settings). Root cause investigation (printer/plot configuration theory) TBD.Impact: AutoCAD 2000 installations with minimal printer configuration may fail to load VLX files via the Startup Suite. The deferred loading approach (
acaddoc.lsp) is more robust than the Startup Suite for environments where the plot subsystem state is unknown at startup time.Related: Bug 19 (menu registration). Both are profile/environment configuration issues on pre-existing installations.
Lesson Learned: The Startup Suite loads VLX files very early in AutoCAD initialization — before all subsystems (especially the plot subsystem) are fully initialized. Deferred loading via
acaddoc.lsporS::STARTUPis more robust for diverse environments. Binary comparisons (hex dumps, MD5 hashes) are important for investigation but diff ≠ causation — always verify with controlled experiments.Historical Note: The v3.60 InstallShield script (
constructivision-v3.60-setup.rullines 3640-3652) correctly writes the startup suite registry entries. The v7.0(patch) was a manual installation that skipped this step.
Bug 21: Edit Existing Drawing Can’t Find CSBsite1.dwg — Missing Project Settings¶
Build: v7.0(patch) VM: 104 (XP-TEST)
Discovered: Session 8 (Feb 28, 2026) — Manual validation on VM 104 after Bug 20 workaround
Severity: High
Status: ✅ Fixed
DFMEA: 21 (NEW — Incomplete project path configuration)
Symptom: After Bug 20 workaround succeeded (CSV command works), user ran manual validation. “Edit Existing Drawing” opened a File Open dialog, but the dialog could not navigate to
CSBsite1.dwg. The file exists atC:\Program Files\ConstructiVision\Project Files\ConstructiVision Sample Building\CSBsite1.dwgbut the dialog didn’t know to look in that subfolder.Root Cause: VM 104 was missing the AutoCAD Project Settings registry entry that tells AutoCAD where to resolve project file paths. VM 102 (working) has:
HKCU\...\Profiles\<<Unnamed Profile>>\Project Settings\CV RefSearchPath = C:\Program Files\ConstructiVision\Project Files; C:\Program Files\ConstructiVision\Project Files\ConstructiVision Sample Building
VM 104 had the
Project Settingskey but noCVsubkey — the v7.0(patch) manual installation never created it.Fix:
reg add "HKCU\...\Project Settings\CV" /v RefSearchPath /t REG_SZ /d "C:\Program Files\ConstructiVision\Project Files;C:\Program Files\ConstructiVision\Project Files\ConstructiVision Sample Building" /f
Impact: Without the CV project path, AutoCAD cannot resolve xref paths or navigate to project drawings from ConstructiVision dialogs. This affects any installation where the project was not registered — all manual/incomplete installations.
Related: Bugs 19, 20 — same class: incomplete profile/registry configuration on manual v7.0 installations.
Lesson Learned: The installer must register the CV project and its
RefSearchPath. Add toConfigure-ConstructiVision.ps1.
Bug 22: Forward Slashes Fail Through NTFS Junctions on XP¶
Affects: All builds VM: 104 (XP-TEST)
Discovered: Session 9 (Feb 28, 2026) — OCR analysis of VM 104 validation screenshots
Severity: High
Status: ✅ Fixed
DFMEA: 22 (NEW — XP junction path resolution)
Symptom: AutoCAD showed “Cannot find the specified drawing file. Please verify that the file exists.” when the AutoIT script opened
CSB001.dwgin Phase 1. The file physically exists at the expected path.Root Cause: The AutoIT validation script used forward slashes in file paths:
C:/Program Files/ConstructiVision/Project Files/ConstructiVision Sample Building/CSB001.dwg
On Windows XP, forward slashes fail to resolve through NTFS junctions. The
C:\Program Files\ConstructiVisionpath is a junction pointing toC:\Repos\Constructivision\src\x32\PB11-00x32. Forward slashes work for regular directories but not through junctions on XP.Proof:
dir "C:\Program Files\ConstructiVision\...\CSB001.dwg" → FOUND (183,286 bytes) dir "C:/Program Files/ConstructiVision/.../CSB001.dwg" → File Not Found
Fix: Changed all drawing file paths in
cv-menu-validation.au3from forward to backslashes.Commit:
5ae65f8Impact: Any script or tool that uses forward-slash paths through junctions on XP will fail silently. This is an XP-specific behavior — Windows 10 handles forward slashes through junctions correctly.
Lesson Learned: Always use backslashes in file paths on XP, especially when NTFS junctions are involved. Forward-slash normalization is unreliable on legacy Windows.
Bug 23: propertiesclose Command Doesn’t Exist in AutoCAD 2000¶
Affects: All builds VM: 104 (XP-TEST)
Discovered: Session 9 (Feb 28, 2026) — OCR of baseline screenshot
Severity: Low
Status: ✅ Fixed
DFMEA: 23 (NEW — AutoCAD version command mismatch)
Symptom: AutoCAD command line showed
Unknown command "PROPERTIESCLOSE"during Phase 1 baseline.Root Cause: The AutoIT script sent
propertiescloseto dismiss the Properties palette, but this command was introduced in AutoCAD 2004+. It does not exist in AutoCAD 2000 (R15.0).Fix: Removed
propertiesclosefrom the AutoIT script.Commit:
5ae65f8Lesson Learned: Always verify AutoCAD commands against the R15.0 command reference. Commands available in newer versions should never be assumed to exist.
Bug 24: Validation Screenshots Overwrite — Stale Data Contamination¶
Affects: Validation pipeline VM: All
Discovered: Session 9 (Feb 28, 2026) — Timestamp analysis of screenshot files
Severity: Medium
Status: ✅ Fixed
DFMEA: 24 (NEW — Validation pipeline data integrity)
Symptom: OCR analysis showed
*-no-dialog.bmpfiles from a 7:47 AM run mixed with 3:20 PM screenshots. Stale files from a previous run that captured “no dialog found” screenshots persisted into the new run’s output directory, contaminating the results.Root Cause: The AutoIT script wrote all screenshots to
C:\CV-Validation\VM###\with fixed filenames. If a new run produced fewer screenshots (or different screenshots), old files with the same names were overwritten but old files with different names persisted.Fix: Added timestamped run subdirectories (
run-YYYYMMDD-HHMMSS/) so each run gets a clean output directory. Addedlatest-run.txtpointer file for easy discovery of the most recent run.Commit:
18a503cLesson Learned: Validation outputs must be immutable per-run. Never overwrite previous results — always write to a unique directory.
Bug 25: AutoIT False Positive — Error Dialog Detected as Valid CV Dialog¶
Affects: Validation pipeline VM: All
Discovered: Session 9 (Feb 28, 2026) — OCR revealed
01-csv-entry-dialog.bmpwas actually the “Cannot find the specified drawing file” error dialogSeverity: High
Status: ⚠️ Known limitation
DFMEA: 25 (NEW — Validation false positive)
Symptom: AutoIT validation log reported
01-csv-entry-dialog: PASS— but OCR of the actual screenshot showed it was AutoCAD’s “Cannot find the specified drawing file” error dialog, not the ConstructiVision Program Options dialog.Root Cause: The
_WaitForAnyDialog()helper function matches ANY dialog window that appears, including error dialogs. When the drawing file wasn’t found (Bug 22), AutoCAD displayed an error dialog. AutoIT detected this error dialog and logged it as the expected CSV entry dialog.Fix: No code fix — this is a fundamental limitation of window-title-based dialog detection. Mitigation: ALWAYS run OCR on captured screenshots after every validation run. The AutoIT log’s PASS/FAIL is unreliable and must never be trusted alone.
Impact: Any validation run analysis that only reads the AutoIT log will produce false confidence. OCR verification is mandatory.
Lesson Learned: Dialog detection by window presence is insufficient for validation. OCR-based content verification is the only reliable method. This should be enforced in the validation workflow — no run is “complete” until OCR summary is reviewed.
Bug 26: Git Not on SSH PATH — CV Update.bat Fails Remotely¶
Affects: All builds VM: 104 (XP-TEST)
Discovered: Session 9 (Feb 28, 2026) —
CV Update.bat /pullfailed with'git' is not recognizedSeverity: Medium
Status: ✅ Fixed
DFMEA: 26 (NEW — Remote deployment PATH issue)
Symptom: Running
CV Update.bat /pullvia SSH returned'git' is not recognized as an internal or external command. Git is installed and works fine when run interactively on the VM desktop.Root Cause: SSH sessions (Bitvise SSH Server) on XP don’t inherit the full user PATH. Git’s installation path (
C:\Program Files\Git\cmd) is not in the minimal PATH used by SSH sessions.Fix: Added
set "PATH=%PATH%;C:\Program Files\Git\cmd"toCV Update.batbefore any git operations. Alternatively, must prepend this when running remotely.Commit:
94ecb94Lesson Learned: SSH sessions have a minimal PATH. Deployment scripts must be self-contained and not rely on interactive-session PATH. Always include full paths or PATH prepends for external tools.
Bug 27: CMD Echo Caret Escaping Corrupts Generated acaddoc.lsp¶
Affects: Deployment tooling VM: 104 (XP-TEST)
Discovered: Session 9 (Feb 28, 2026) — Generated acaddoc.lsp contained literal
^(charactersSeverity: Low
Status: ✅ Fixed
DFMEA: 27 (NEW — Batch file string escaping)
Symptom: The
acaddoc.lspgenerated byCV Update.bat’sCONFIGURE_STARTUPsubroutine contained literal caret characters:^(VLX^)instead of(VLX).Root Cause: In CMD batch files, parentheses inside
echostatements require escaping with^when insideif/elseblocks. However, the caret escaping produced literal characters in the output file.Fix: Removed parentheses from the LISP status message strings entirely. Changed
"ConstructiVision loaded (VLX)"to"ConstructiVision loaded VLX".Commit:
94ecb94Lesson Learned: Batch file string escaping is fragile. When generating code via
echo >>, avoid characters that need escaping (parentheses, pipes, ampersands, angle brackets). Simplify output strings rather than fighting CMD’s escaping rules.
Bug 31: New User Profile Missing AutoCAD Configuration — CV Update is Per-User (HKCU)¶
Affects: All builds (PB11, TB11) on Win10 VMs with multiple users VM: 201 (Alpha1 — Terry)
Discovered: Session 11 (Mar 2, 2026) — Terry logged into Alpha1 VM 201 for the first time. AutoCAD loaded but ConstructiVision did not: no menu, no CSV command, project files not found.
Severity: Critical
Status: 🔲 Open
DFMEA: 31 (NEW — Per-user registry configuration not propagated to new profiles)
Symptom: When a new Windows user (Terry) logs in and opens AutoCAD, ConstructiVision is completely unconfigured:
Startup Suite empty — no
CSV.VLXorcsv.lspin AutoCAD’s Startup SuiteSearch path missing —
C:\Program Files\ConstructiVisionnot in AutoCAD’s support file search pathProject paths missing —
Project Settings\CV\RefSearchPathnot set, so project drawings and XRefs cannot be found
Root Cause:
CV Update.bat’sCONFIGURE_STARTUP,CONFIGURE_SEARCH_PATH, andCONFIGURE_PROJECTsubroutines all write toHKCU(current user) registry keys:HKCU\Software\Autodesk\AutoCAD\R15.0\ACAD-1:409\Profiles\<<Unnamed Profile>>\...
When Administrator runs CV Update, only Administrator’s HKCU is configured. When Terry logs in, his HKCU has no ConstructiVision entries because:
AutoCAD creates a default
<<Unnamed Profile>>on first run per-userThe default profile has no knowledge of ConstructiVision
CV Update was never run under Terry’s account
There is no mechanism to configure all user profiles at install time
Workaround (applied manually): Chad manually configured Terry’s AutoCAD registry entries for Startup Suite, search path, and project paths.
Proposed Fix Options:
CV Update enumerates user profiles: Iterate
HKEY_USERSSIDs and configure all loaded profiles, plus useHKLM\..\Profilesas a template for new usersCV Update runs under each user: Schedule CV Update to run on login for all users (via Public Desktop shortcut — already done) and auto-detect unconfigured profiles
First-run detection in csvmenu.lsp: Add a check in
csvmenu.lsporacaddoc.lspthat detects missing configuration and self-configures on first AutoCAD launch per userDefault profile template: Configure
HKLM\Software\Autodesk\AutoCAD\R15.0\ACAD-1:409\Profiles\<<Unnamed Profile>>at the machine level so all new users inherit the correct settings
Impact: Every new Windows user on a Win10 VM must manually run CV Update or have an administrator configure their AutoCAD profile. This is a deployment blocker for multi-user environments (alpha testers, GSCI engineers).
3-VM Comparison Results (Feb 28, 2026)¶
Full 3-VM OCR comparison after all fixes applied:
# |
Screenshot |
VM 104 (TB11 fresh) |
VM 102 (PB11 reference) |
VM 103 (v7.0 MASTER) |
|---|---|---|---|---|
00 |
Baseline drawing |
✅ CSB001.dwg loaded, “ConstructiVision loaded VLX” |
✅ CSB001.dwg loaded, menus loaded |
✅ CSB001 loaded |
01 |
CSV entry dialog |
✅ CV Program Options |
✅ CV Program Options |
✅ CV Program Options |
02 |
Drawing setup |
✅ CV Program Options |
✅ CV Program Options |
✅ CV Program Options |
03 |
Slope calculator |
✅ Slope Elevation Calculator |
✅ Slope Elevation Calculator |
✅ Slope Elevation Calculator |
04 |
Create new project |
✅ Project Details dialog |
✅ Project Details dialog |
✅ Project Details dialog |
05 |
Create new drawing |
✅ File browser (Sample Building) |
✅ File browser (Sample Building) |
✅ File browser (Sample Building) |
06 |
Edit existing drawing |
✅ File browser (Sample Building) |
✅ File browser (Sample Building) |
❌ Bug 19 error ( |
07 |
Batch utilities |
✅ Batch UI, 24 panels (2026 dates) |
✅ Batch UI, 24 panels (2007 dates) |
✅ Batch UI, 24 panels (2007 dates) |
10 |
MD panel options |
✅ CV Program Options |
✅ CV Program Options |
✅ CV Program Options |
20 |
Site drawing |
✅ XRefs CSB053-059 resolved |
✅ XRefs CSB050-059 resolved |
✅ CSBsite1 loaded |
21 |
Site dialog |
✅ CV Program Options |
✅ CV Program Options |
✅ CV Program Options |
Summary: VM 104 (TB11 fresh deploy with all fixes) matches VM 102 (PB11 reference) across all 11 test phases. Only VM 103 (v7.0 MASTER, read-only) shows an issue at phase 06 — Bug 19’s setvars error, which may need re-validation after the Feb 27 fix was applied.
Notable differences:
VM 104 shows “ConstructiVision loaded VLX” (deferred
acaddoc.lsploader message) vs VM 102 (Startup Suite, no message)Batch panel timestamps: VM 104 = 2026 (fresh project), VM 102/103 = 2007 (original sample)
VM 103 screenshot 06 still shows Bug 19 error — needs re-run to confirm if the fix persisted
Bug 31: Multi-User Junction Conflict — CV Update Crashes Other User’s AutoCAD¶
Discovered: March 3, 2026
Severity: High
VM: 201 (Alpha tester — Tai)
Status: 📝 Logged (deferred — special case, may not be worth fixing now)
Symptom: Administrator ran
CV Update.baton VM 201 and switched the junction from PB11 to TB11. Terry was logged in simultaneously and running AutoCAD with PB11 (CSV.VLX). Terry got a fatal error in AutoCAD.Root Cause (suspected): Two-pronged conflict:
Filesystem:
CV Update.batremoves and recreates theC:\Program Files\ConstructiVisionjunction. While Terry’s AutoCAD hasCSV.VLXloaded from/ConstructiVision/, the junction target changes from PB11 to TB11 mid-session. Any file access through the junction (DLL loads, XRef resolution, file dialogs,.fas/.vlxdemand-loading) now resolves to TB11’s files instead of PB11’s — causing undefined behavior.Registry:
CV Update.batcalls:CONFIGURE_STARTUPwhich writes to HKCU. On a multi-user VM, this only changes Administrator’s registry. Terry’s HKCU still points toCSV.VLXin the Startup Suite — but the VLX file path now resolves through the TB11 junction. On next AutoCAD restart, Terry would load TB11’s files with PB11’s registry settings.
Impact: Fatal AutoCAD crash for concurrent user. Data loss possible if unsaved drawings were open.
Mitigation (future):
CV Update.batshould check for runningacad.exeprocesses and warn/abort if other users have AutoCAD openConsider writing registry values for ALL user profiles (HKU enumeration, as implemented in
cv-p0-step1.au3)Add
query session/query usercheck to detect concurrent logged-in usersLong-term: per-user build selection rather than shared junction
Fix: Deferred. This is a multi-user edge case specific to alpha testing VMs. Production deployments will have a single user per workstation.
DFMEA Reference (Bug 31)¶
DFMEA ID: NEW (to be added to doc 31)
Failure Mode: Multi-user junction switch during active AutoCAD session
Severity: 8 (fatal crash, potential data loss)
Occurrence: 3 (rare — requires simultaneous login + build switch)
Detection: 2 (immediately obvious — crash dialog)
RPN: 48
Bug 32: Registry-Based Layout Standardization Unreliable Across VMs¶
Discovered: March 3, 2026
Severity: Medium
VM: 103, 104
Status: ✅ Fixed
Symptom: P0 Step 1 used direct registry writes (
_WriteGoldenLayoutvia HKU enumeration) to setDockWindow.Positionand other AutoCAD layout values. VM 102 accepted the values and displayed 6 command-line rows. VM 103’s active profile disappeared from the registry after AutoCAD exit (profile name resolved but key was empty on next read). VM 104’sDockWindow.Positionwas overwritten back to 3-row default upon AutoCAD startup — the registry values did not persist.Root Cause: AutoCAD 2000’s registry behavior is inconsistent across VMs and profile states:
VM 103: The active profile’s registry key under
HKCU\Software\Autodesk\AutoCAD\R15.0\ACAD-1:409\Profiles\appeared to be ephemeral — possibly maintained in-memory by AutoCAD and flushed on exit with different values than what was written externally.VM 104: AutoCAD overwrites
DockWindow.Positionfrom its internal state on startup, ignoring pre-written registry values. The 3-row default is baked into AutoCAD’s initialization sequence for that profile.VM 102 worked because it already had the correct values from a previous manual configuration — the registry write was a no-op.
Fix: Abandoned registry-based approach entirely. Replaced with runtime
(setenv)LISP commands sent via AutoIT’sSend()function after AutoCAD is fully running. Thesetenvfunction writes to the active profile’s registry through AutoCAD’s own API, which correctly persists values across sessions. Expanded scope from justCmdVisLinesto 8 classic settings:CmdVisLines=6,CmdHistLines=2000,AcadClassic=1,CursorSize=100Background=0,ToolTips=1,Scrollbars=1,MaxArray=999999
Impact: All 3 VMs now accept layout settings reliably. The
setenvapproach works because AutoCAD itself manages the registry write — no external tooling races with AutoCAD’s profile manager.Prevention: Use
(setenv)or(setvar)for any AutoCAD configuration changes. Never write directly to AutoCAD’s profile registry keys from external tools — AutoCAD owns those keys and may overwrite them.DFMEA: 32 (NEW — External registry writes to AutoCAD profile keys are unreliable)
DFMEA Reference (Bug 32)¶
DFMEA ID: NEW (to be added to doc 31)
Failure Mode: External registry writes to AutoCAD profile keys overwritten or lost
Severity: 4 (incorrect layout, not a crash — cosmetic/workflow impact)
Occurrence: 7 (happened on 2 of 3 VMs — high occurrence in practice)
Detection: 5 (requires visual inspection or screenshot comparison; log doesn’t catch it)
RPN: 140
Bug 39: Version Subtitle Not Rendering in TB progopts Dialog¶
Discovered: March 6, 2026
Severity: Medium
VM: 104, 108, 109 (all TB builds)
Status: 🔲 Open
Symptom: The
ConstructiVision - Program Optionsdialog in TB source mode is missing the version subtitle line. Golden VM 102 (V11 Golden/VLX) showsConstructiVision Tilt-Up and PreCast Software Version 11.00 2/4/2013between the dialog title and the first row of buttons. All three TB VMs show nothing in that space — OCR confirmed zero matching words (no “Version”, “Tilt-Up”, “PreCast”, or “11.00” detected in any TB screenshot).Root Cause (suspected): The deployed
progopts.dclfile on VM 104 matches the repo exactly (2925 bytes, dated 03/02/2026). The DCL source includes a:rowwith two:textelements for the subtitle. The text is defined in the DCL but does not render visibly. Possible causes:The
:textelements inside the:rowmay be rendering at zero height or clipped by AutoCAD 2000’s DCL layout engineDCL
spacer_1before/after the subtitle row may collapse the row on AutoCAD 2000The subtitle
:rowmay need explicitheightorfixed_heightattributes to ensure renderingDifference between how AutoCAD 2000 renders the VLX’s embedded DCL vs runtime-loaded
.dclfiles
Evidence:
VM 102 (V11 Golden) OCR:
Constructi¥ision Til-Up and PreCast Software Version 11.00 2/4/2013at pixel row ~734VM 104 (TB) OCR detail: No trace of version text — only noise characters between title bar and first button
VM 108 (TB) OCR: Same absence — blank area between title and
Create New DrawingVM 109 (TB) OCR: Same absence
Fix (proposed): Test DCL variants — add explicit
height = 1;to the:textelements, tryfixed_height = true;on the:row, or convert from two:textelements in a:rowto a single:textspanning the full width. Also verify: does this work on any standalone.dcltest dialog? May be an AutoCAD 2000 DCL rendering quirk.Impact: Cosmetic — no functionality loss. Version identification is missing from the dialog header.
DFMEA: See DFMEA Reference below.
DFMEA Reference (Bug 39)¶
DFMEA ID: NEW (to be added to doc 31)
Failure Mode: DCL
:text/:rowelements render at zero height in runtime-loaded dialogsSeverity: 2 (cosmetic — missing version text, no functional impact)
Occurrence: 10 (reproducible on every TB build, every VM — 3/3 TB VMs affected)
Detection: 5 (requires visual inspection or OCR comparison; not detected by au3 validation)
RPN: 100
Bug 40: Print Revision History / Print Materials List Enabled Without Project¶
Discovered: March 6, 2026
Severity: Medium
VM: 104, 108, 109 (all TB builds)
Status: ✅ Fixed (March 5, 2026)
Symptom: The
progoptsdialog in TB source-mode shows all 14 buttons enabled, includingPrint Revision HistoryandPrint Materials List, even when no project/drawing is loaded. The V11 Golden dialog on VM 102 shows a reduced set of ~8 buttons appropriate for the no-project context — the view/print buttons are not visible at all.Root Cause: Two issues:
Button graying logic too narrow:
progopts.lsponly disabledmatlistandrevhistwhen(not olddwg). Five more project-dependent buttons (viewall,printlay,viewsel,printsel,3dview) were left enabled — the V11 Golden VLX hides all 7.Default drawing detection too narrow:
csv.lspchecked(= (getvar "dwgname") "Drawing.dwg")exactly, which missesDrawing1.dwg(Win10 AutoCAD 2000 default). When the check fails,olddwggets set to"Drawing1.dwg"instead of nil, and no buttons get grayed.Remaining gap vs V11 Golden: The V11 VLX dialog hides the 7 project-dependent buttons entirely (not shown at all). The TB
progopts.dclgrays them instead. This is intentional — full parity would require multiple DCL dialog definitions selected by context, deferred to a future enhancement.
Evidence:
VM 102 (V11 Golden) p0-04 OCR: Shows only Create New Drawing, Edit Existing Drawing, Create New Project, Batch Utilities, Change Project Search Path, Cancel, Help (no Print/View buttons)
VM 104/108/109 (TB) p0-04 OCR: Shows all 14 buttons including Print Revision History, Print Materials List, View All Layers, Print All Layers, View Selected Layers, Print Selected Layers, Change 3D Viewpoint
Fix (applied):
progopts.lsp: Expandedmode_tiledisable list from 2 to 7 buttons —viewall,printlay,viewsel,printsel,3dview,matlist,revhistare all grayed when(not olddwg).csv.lsp: Changed default drawing detection from exact string match"Drawing.dwg"to wildcard(wcmatch (strcase (getvar "dwgname")) "DRAWING*.DWG")to catch bothDrawing.dwg(XP) andDrawing1.dwg(Win10).Both x32 and x64 builds synced.
Impact: 7 project-dependent buttons now grayed on fresh startup. Buttons are visible but disabled, making it clear they require a project. Partial parity with V11 Golden (grayed vs hidden). No regressions — buttons re-enable normally when a drawing is loaded because
olddwggets set to the drawing filename.DFMEA: Matches existing DFMEA #11 (Toggle enabled with empty data / feature left enabled without valid context). Detection (D) improved from 5→3 with the fix in place (buttons now visually indicate state).
DFMEA Reference (Bug 40)¶
DFMEA ID: 11 (existing — Toggle enabled with empty data)
Failure Mode: Buttons enabled when prerequisite data (project/drawing) not loaded
Severity: 4 (incorrect UX, non-fatal — buttons either fail gracefully or produce unexpected dialogs)
Occurrence: 10 (reproducible on every TB build fresh launch — 3/3 TB VMs)
Detection: 3 (grayed buttons now visually indicate state; OCR comparison can detect difference)
RPN: 120 (reduced from 200 — fix reduces Detection from 5→3)
Bug 41: CV Update.bat Shows “Active build: unknown” on XP¶
Discovered: March 6, 2026
Severity: Low
VM: 104 (XP)
Status: 🔲 Open
Symptom: When running
CV Update.baton VM 104 (Windows XP), the Version Manager picker displaysActive build: unknowneven though the junctionC:\Program Files\ConstructiVisioncorrectly points toTB11-01x32.Root Cause: The junction target detection at line 75 uses:
for /f "tokens=2 delims=[]" %%j in ('dir "!JUNCTION!\.." 2^>nul ^| findstr /i "ConstructiVision"') do ( set "JLINK=%%j" )
This parses
diroutput to extract the junction target from bracket notation. On Windows 10,dirshows junctions as:03/02/2026 12:00 PM <JUNCTION> ConstructiVision [C:\Repos\...\TB11-01x32]
On Windows XP,
dirshows junctions created by Sysinternalsjunction.exethe same as regular directories — no<JUNCTION>tag, no bracket notation:03/02/2026 12:00 PM <DIR> ConstructiVision
Since
tokens=2 delims=[]finds no brackets,JLINKis never set andCURRENTremains “unknown”. The script still functions correctly (junction switching works), but the status display is wrong.Fix (proposed): Add XP fallback detection path using
junction.exeorfsutil reparsepoint query:if "!CURRENT!"=="unknown" ( for /f "tokens=*" %%t in ('junction "!JUNCTION!" 2^>nul ^| findstr /i "target"') do ( echo %%t | findstr /i "TB11" >nul && set "CURRENT=%TB%" echo %%t | findstr /i "PB11" >nul && set "CURRENT=%PB%" ) )
Impact: Cosmetic only — the Version Manager shows “unknown” but still functions correctly. Users can still switch builds and pull updates. Only affects display on XP VMs where junctions were created by
junction.exe.DFMEA: See DFMEA Reference below.
DFMEA Reference (Bug 41)¶
DFMEA ID: NEW (to be added to doc 31)
Failure Mode: Junction detection via
dirbracket parsing fails on XPSeverity: 1 (cosmetic — status display wrong, functionality unaffected)
Occurrence: 10 (reproducible on every XP VM)
Detection: 2 (immediately visible to user — they see “unknown”)
RPN: 20
Bug 42: Bug 40 Regression — project() Cancel Falls Through to progopts¶
Discovered: March 5, 2026
Severity: High
VM: 108 (Win10 x32) — affects all TB builds on Win10
Status: ✅ Fixed (March 5, 2026)
Regression of: Bug 40 (
d43af50)Symptom: After the Bug 40 fix, running
c:csvon VM 108 (Win10, defaultDrawing1.dwg) shows TWO modal dialogs in sequence: firstproject()(“ConstructiVision – Project Options”), thenprogopts(“ConstructiVision - Program Options”). The au3 test fixture sends a single Escape which dismissesproject(), butprogoptsthen appears with no one to dismiss it. The dialog stays on screen, blocking all subsequent validation steps (config dumps, environment variable retrieval).Root Cause: Bug 40’s wcmatch fix in
csv.lspchanged default drawing detection from exact"Drawing.dwg"match to(wcmatch ... "DRAWING*.DWG"), which correctly identifiesDrawing1.dwg(Win10 default) and setsolddwg=nil. This is correct behavior — the bug is thatcsv.lsphad no guard for the case whereproject()is called and the user cancels. Whenproject.dcl’s Cancel button setspnl="cancel",csv.lspproceeded to showprogoptsas a second dialog. Before Bug 40,Drawing1.dwgon Win10 didn’t match the exact string check, soolddwgwas non-nil,project()was never called, and the two-dialog chain couldn’t occur.Evidence:
VM 108 p0-step2-20260305-134631 screenshots: p0-04 shows “Project Options”, p0-04b through p0-07 show progopts stuck on screen with grayed buttons
VM 108 p0-step2-20260305-121235 (pre-fix): p0-04 shows only progopts, p0-04b shows text window (dialog dismissed normally)
Fix (applied):
csv.lsp: Added cancel guard after(project)call — wraps the entire routing block in(if (/= pnl "cancel") ...). Whenproject.dclsetspnl="cancel", the routing block (includingprogopts) is skipped entirely, andpnl/ldare cleaned up in the else branch.Used
(/= pnl "cancel")instead of(not (= pnl nil))becausepnlis nil whenproject()was never called (real drawing open), and progopts must still appear in that case.Both x32 and x64 builds synced.
Impact: Fixes the two-dialog regression on Win10 default drawings. When project() is cancelled (Escape or Cancel button), csv exits cleanly without showing progopts. Normal flows (user picks New/Existing in project dialog, or real drawing open bypassing project entirely) are unaffected.
DFMEA: New failure mode — regression from incomplete guard logic in a fix.
DFMEA Reference (Bug 42)¶
DFMEA ID: NEW (to be added to doc 31)
Failure Mode: Fix introduces new dialog flow path without guard for cancel case
Severity: 6 (blocks validation — modal dialog traps UI, all subsequent tests fail)
Occurrence: 10 (reproducible on every Win10 TB build with default drawing)
Detection: 3 (OCR comparison catches stuck dialog immediately; validation log falsely reports PASS per Bug 25)
RPN: 180
Bug 43: FATAL ERROR — FILES MISSING for Non-Admin User on VM 201¶
Discovered: March 9, 2026
Severity: High
VM: 201 (Win10 x64, Alpha tester)
Status: ✅ Fixed (March 9, 2026)
Symptom: User Terry (non-admin, Remote Desktop Users group only) runs
csvin AutoCAD → VLX registration/licensing code triggersFATAL ERROR -- FILES MISSINGalert. Same command works fine for Administrator.Root Cause: The compiled VLX’s registration flow (CheckPanelCredit via
pcms.arx→cv.bat→wincss.exe→ FATAL ERROR) requires admin-level privileges to access some resource. The exact resource was never identified — the VLX’s registration code is compiled and opaque, and the source-mode equivalent is commented out.Investigation (exhaustive):
cv.bat format corrected (added
rem 20260309as first line) — no fixHKLM registration data (
status,lr,lic,gp,Registrationblob,cssPC,cssRC) copied from VM 102 golden — no fix (hardware-locked)Registry ACLs: granted
BUILTIN\UsersFullControl on bothHKLM\SOFTWARE\ConstructiVision, IncandHKLM\SOFTWARE\ConstructiVisionkeys — no fixpcms.arxrenamed to bypass CheckPanelCredit — no fix, restoredFilesystem ACLs: granted
Users:(OI)(CI)MonC:\Program Files\ACAD2000\,C:\Program Files\ConstructiVisionjunction, and junction target (PB11-00x32) — no fix“Run as Administrator” on AutoCAD while logged in as Terry → works — confirms elevation/permissions issue
Fix: Added Terry to local Administrators group (
net localgroup Administrators Terry /add). Terry must log out and back in for token refresh.Impact: Alpha testers on PB11 VLX builds must be in the Administrators group. This is a known limitation of the compiled VLX’s registration code. The modernized TB11 source-mode build does NOT have this restriction (registration code is commented out). This bug will not exist in the final distributable release.
Side effect: During investigation, Terry temporarily disappeared from Windows login screen. Added Terry to Users group as well. Root cause of login screen issue unclear but moot with admin membership.
Lesson: The compiled VLX has opaque permission requirements that cannot be reverse-engineered from recovered source alone. Process Monitor would be needed to identify the exact resource. For alpha testing, admin accounts are the pragmatic solution.
DFMEA Reference (Bug 43)¶
DFMEA ID: NEW (to be added to doc 31)
Failure Mode: VLX compiled registration code requires undocumented admin privileges
Severity: 7 (user cannot launch application — complete loss of function for that user)
Occurrence: 4 (only affects non-admin users on PB11 VLX builds; TB11 source-mode unaffected)
Detection: 2 (immediately visible — FATAL ERROR alert on every launch attempt)
RPN: 56
Bug 82: cv-tracer.lsp Load Fails — “no function definition: FBOUNDP” on AC2000 Source-Mode¶
Affects: Trace infrastructure — cv-tracer.lsp VM: 104 (XP, TB11); latent on all VMs depending on load order
Discovered: March 2026 — G1 run on VM 104
Severity: High
Status: ✅ Fixed (commit
ce6fc3e7)DFMEA: NEW — Tooling/trace infrastructure: Visual LISP extension availability depends on load order
Symptom:
cv-tracer.lspfails to load with; error: no function definition: FBOUNDP. All trace instrumentation absent — subsequent G0/G1/G2 runs produce no trace output.Root Cause:
fboundpis a Visual LISP function only available after(vl-load-com)has been called. In AC2000 source-mode, whetherfboundpis available depends entirely on whether any previously loaded.lspfile calledvl-load-com. On VM 108,csv.lspinitialization happens to callvl-load-comincidentally, sofboundpis available whencv-tracer.lsploads. On VM 104, the initialization path never reachesvl-load-combeforecv-tracer.lsploads — sofboundpis undefined. Non-deterministic: depends on load order, not a reproducible property of the VM.Fix: Added
(vl-load-com)tocv-tracer.lspbefore the first(fboundp)call. Also added to thegenerate-cv-tracer.pytemplate so regeneration preserves the fix.Files:
src/x32/TB11-01x32/cv-tracer.lsp,scripts/generate-cv-tracer.pyCommit:
ce6fc3e7Lesson: Never assume Visual LISP extensions are available in source-mode without explicitly calling
(vl-load-com). Any.lspfile usingfboundp,vlax-*, or similar must call(vl-load-com)at the top as self-contained bootstrap.
DFMEA Reference (Bug 82)¶
DFMEA ID: NEW — Tooling load-order dependency: Visual LISP extension availability
Failure Mode: Trace infrastructure fails silently when
vl-load-comhas not been called prior tocv-tracer.lsploadSeverity: 5
Occurrence: 6
Detection: 4
RPN: 120
Bug 83: G1/G2 Drawing Open Fails — ClipPut+^v Unreliable in AC2000 Command-Line Mode¶
Affects: Trace infrastructure — cv-trace-g1.au3, cv-trace-g2.au3 VM: All (VM 104 confirmed, VM 108 confirmed from log evidence)
Discovered: March 2026 — G1 run analysis
Severity: High
Status: ✅ Fixed (commit
ce6fc3e7)DFMEA: NEW — Tooling: AutoIT drawing-open method incompatible with AutoCAD 2000 command-line mode
Symptom: G1 sends
(setvar "filedia" 0)thenOPEN, thenClipPut("CSB001.dwg") + Send("^v")to supply the filename. AutoCAD does not open CSB001.dwg — clipboard paste is ignored or bare filename fails path resolution.Root Cause: Two compounding issues: (1) Clipboard paste is unreliable in AC2000 command-line mode with
filedia=0. The golden reference (reports/vm102-cv-menu-validation.au3) usesSend(fullpath, 1)(slow typing) instead. (2) Bare filename without full path fails because AutoCAD can’t find it via Search Path.Fix: Changed
$CSB001_DWG(G1) and$CSBSITE1_DWG(G2) to full junction-based paths. ReplacedClipPut()+Send("^v")withSend(fullpath & ".dwg", 1)(slow typing). Matches the golden reference exactly.Files:
scripts/acad2000/cv-trace-g1.au3,scripts/acad2000/cv-trace-g2.au3Commit:
ce6fc3e7Lesson: Always type the full path character-by-character with
Send(path, 1)for AutoCAD 2000 file opens. The golden reference (reports/vm102-cv-menu-validation.au3) is the authoritative pattern.
DFMEA Reference (Bug 83)¶
DFMEA ID: NEW — Tooling: AutoIT drawing-open method incompatible with AC2000 command-line mode
Failure Mode:
ClipPut+^vfails to supply filename; drawing never opens; trace data collected from wrong drawingSeverity: 8
Occurrence: 9
Detection: 3
RPN: 216
Bug 84: AutoCAD Crashes When G1/G2 Continues Executing After Drawing Open Failure¶
Affects: Trace infrastructure — cv-trace-g1.au3, cv-trace-g2.au3 VM: VM 108 (Win10 x32, confirmed from acad.err + acadstk.dmp); latent all VMs
Discovered: March 2026 — G1 crash evidence (acad.err + acadstk.dmp)
Severity: Critical
Status: ✅ Fixed (commit
0dd6d166)DFMEA: NEW — Tooling: script continues executing after target drawing fails to open, injecting commands into broken AutoCAD state
Symptom: After CSB001.dwg fails to open (Bug 83), G1 logged
"Continuing anyway: trace will run on whatever drawing is open."and proceeded to send_SendProgcont()calls. The LISP strings injected at the wrong moment were fragmented and garbled: Drawing1 log shows"OGN(SETQ","PRLIONCG0F0I","262401)(9C;SECTSVVA)R9"— fragments of LISP code interpreted as AutoCAD commands. AutoCAD crashed, producingacad.errandacadstk.dmp. The crash dump was destroyed by the next pre-check before it could be collected.Root Cause:
_Fail()logs the failure but does NOT stop execution. The code path after_Fail("CSB001 title not found")continued with_Log(" Continuing anyway...")and proceeded to run all 9+_SendProgcont()calls into an unknown AutoCAD command state.Fix: (1) Replaced
_Log("Continuing anyway...")with_Finish()in both G1 and G2. (2) Added crash dump preservation to pre-check —FileCopydump to output dir with timestamp beforeFileDelete.Files:
scripts/acad2000/cv-trace-g1.au3,scripts/acad2000/cv-trace-g2.au3Commit:
0dd6d166Evidence:
reports/vm108-step7-run3/Drawing1_1_1_5064.log— garbled commands,Unknown command "OGN(SETQ"Lesson: Every
_Fail()call at a critical gate (drawing open, title verification) MUST be followed immediately by_Finish(). The “Continuing anyway” pattern is never acceptable when the script sends keyboard input to a potentially broken application state.
DFMEA Reference (Bug 84)¶
DFMEA ID: NEW — Tooling: automation continues past failed precondition, injecting keystrokes into broken application state
Failure Mode: Script sends LISP commands to AutoCAD after drawing open fails; keystroke fragmentation crashes AutoCAD
Severity: 9
Occurrence: 10
Detection: 2
RPN: 180
Bug 85: G1/G2 _SendProgcont — Send(..., 1) Emits {ENTER} as Literal Text¶
Affects: Trace infrastructure — cv-trace-g1.au3, cv-trace-g2.au3 VM: VM 108 (Win10 x32)
Discovered: March 20, 2026 — G1 run (rev1/rev2/rev3 all failed due to stale script on VM; root cause identified after SCP realization)
Severity: High
Status: ✅ Fixed (commit
f6b7e69, rev4)DFMEA: NEW — Tooling: AutoIt raw/slow-mode
Send()emits special-key sequences as literal charactersSymptom: All
_SendProgcontcalls showed the LISP command typed into the AutoCAD command line but{ENTER}appearing as the literal characters{ENTER}at the end, never submitting. AutoCAD received the whole LISP expression as text but never executed it.Root Cause: AutoIt’s
Send(text, 1)flag enables raw/slow mode — characters are sent one at a time, INCLUDING special sequences like{ENTER},{TAB}, etc. In slow mode{ENTER}is not interpreted as the Enter key; it is sent as the six characters{,E,N,T,E,R,}. All three revisions (rev1, rev2, rev3) that attempted to fix an earlier hypothesis (LISP character reversal caused by AutoCAD Text Window BiDi input) were deployed to the repo but never reached VM108 because the VM runs scripts fromC:\CV-Validation\scripts\— an isolated copy not synced from git. All prior debugging sessions tested against the original buggy code.Fix (rev4): Split every slow-mode send into two calls:
Send(text, 1)for the LISP content, then a separateSend("{ENTER}")(no flag) for the keystroke. Applied to(setvar "filedia" 1)restore and_SendProgcontLISP expression in both G1 and G2.Files:
scripts/acad2000/cv-trace-g1.au3,scripts/acad2000/cv-trace-g2.au3Commit:
f6b7e69Lesson: In AutoIt,
Send(text, flag=1)sends ALL characters literally including{ENTER},{TAB}, etc. Always split:Send(content, 1)thenSend("{ENTER}"). Additionally, VM scripts are isolated copies atC:\CV-Validation\scripts\— they must be updated via SCP, not git.
DFMEA Reference (Bug 85)¶
DFMEA ID: NEW — Tooling: AutoIt raw-mode Send emits control sequences as literal characters; ENTER key never fires
Failure Mode: LISP expressions typed into AutoCAD command line but never submitted; no CV functions invoked; trace data empty
Severity: 8
Occurrence: 9
Detection: 3
RPN: 216
Bug 86: PANATT Crashes — bad argument type: stringp nil on Fresh Panel Drawing Open (pc=1)¶
Affects:
panatt.lspVM: 108 (Win10 x32) — confirmed fromCSB001_1_1_3767.logG1 trace run
Discovered: March 20, 2026 — G1 first successful trace run (
cv-trace-g1-20260320-211127)Severity: High
Status: ✅ Fixed — March 21, 2026 (commit
4630e005)DFMEA: Matches existing class — progcont target called without prerequisite global state initialized
Fix History:
Ver |
Date |
Commit |
Change |
Outcome |
|---|---|---|---|---|
v1 |
Mar 20 |
prior |
|
Crash shifted |
v2 |
Mar 21 |
prior |
Nil guard expanded from 3→7 vars before convert |
Crash persisted |
v3 |
Mar 21 |
|
|
Crash persisted |
v4 |
Mar 21 |
|
Full DV1543 |
Graceful message; crash persisted |
v5 |
Mar 21 |
|
Root cause fix — key priority swap |
Expected PASS |
Root Cause (confirmed Mar 21 via P0–PB diagnostic trace, commit cb56dab9):
Diagnostic trace markers P0–PB were added spanning every execution stage. The Mar 21 14:58 run (CSB001_1_1_6289.log) produced:
; [P0] panatt entry
; [P1] cmds ok
; [P2] nod=set ← XRecord found
; [P3] post-mapcar a=set e=nil
; [P4] pv-sections=2 ← ONLY 2 sections — should be 21
; [P5] pv-guard passed
; panatt error: bad argument type: stringp nil ← crash in foreach
[P4] pv-sections=2 is the smoking gun. TB11 panatt was checking the "panel" Named Object Dictionary key first — before "panel_list". CSB001.dwg contains both keys:
"panel"— VLX-internal key, different DXF structure, only ~2 parseable sections viavl-remove-if-not '(lambda (x) (member (car x) '(1 2 3)))"panel_list"— source-mode key, 1/2/3 DXF triplets, full 21 sections
With only 2 malformed sections loaded, the subsequent foreach variable expansion hit (read nil) → bad argument type: stringp nil when a section entry’s (car b) was nil. PB11 panatt only ever reads "panel_list"; it never checks "panel". This is exactly why PB11 passes on the same drawing.
Fix (v5):
Key priority swap:
"panel_list"checked first;"panel"only as fallback for drawings with no panel_list. Matches PB11 behavior exactly.panatt_nod_keyvariable: stores the resolved key so[P2]diagnostic reports which key was actually used (e.g.[P2] key=panel_list raw=247).Nil-key guard in foreach:
(if (stringp (car b)) ...)prevents(read nil)even if a future XRecord has a malformed entry; logs[P5-SKIP]for any skipped entry.
Impact: G1 re-run expected to show
[P2] key=panel_listandpv-sections=21, with pc=1 reachingprogopts/md_dlgdialog without crashing.
DFMEA Reference (Bug 86)¶
DFMEA ID: Matches existing failure mode class — progcont target function called without prerequisite global state
Failure Mode:
PANATTcalled via progcont routing beforepanelvaris initialized; crashes on first string operationSeverity: 6 (function crashes, no drawing damage; error dialog shown)
Occurrence: 7 (reproducible whenever pc=1 fires without prior drawpan in session)
Detection: 3 (ACAD log shows crash; no dialog appears in G1 run)
RPN: 126
Bug 87: MATL_DLG — architecture requires site drawing; G1 test was using wrong drawing type¶
Affects:
matl_dlg.lsp,scripts/acad2000/cv-trace-g1.au3VM: 108 (Win10 x32) — confirmed fromCSB001_1_1_3767.logG1 trace run
Discovered: March 20, 2026 — G1 first successful trace run (
cv-trace-g1-20260320-211127)Severity: High
Status: ✅ Fixed — March 21, 2026 (G1 script corrected to use CSBsite1.dwg; matl_dlg.lsp
(exit)artifact also fixed separately, commit3e2a7c32)DFMEA: Matches existing class —
matl_dlgcalled without required drawing structure in placeSymptom:
(progn(setq progcont 263169)(c:csv)(princ))on CSB001.dwg routes to(MATL_DLG)which shows alert “No panel blocks found in drawing.” and exits. Originally this also showed; error: quit / exit abort(fixed in3e2a7c32).Root Cause (architectural):
matl_dlg.lspuses(ssget "x" '((-4 . "<and") (0 . "INSERT") (8 . "0") (-4 . "and>")))to find panel block INSERT entities on layer"0". These INSERT entities are XREF block references placed byinspanel.lspwhen panels are attached to a site drawing (e.g.CSBsite1.dwg): ```lisp ;; inspanel.lsp lines 346-400 (command “layer” … “s” “0” …) ;; current layer = 0 (command “-xref” “a” pnl-dwg-path …) ;; XREF landed on layer 0Individual panel drawings (CSB001-CSB059) are the *source* files that get XREFed into the site drawing. They do NOT contain panel INSERT entities on layer `"0"` — they ARE the panel. The G1 trace script was calling pc=263169 with CSB001.dwg open, which always yields "No panel blocks found" because CSB001 is a panel detail drawing, not a site drawing.
Fix:
scripts/acad2000/cv-trace-g1.au3updated to openCSBsite1.dwgbefore calling pc=263169, then re-openCSB001.dwgfor the Revision History (pc=264193) test.matl_dlg.lspssget filter is architecturally correct — no code change needed there.Impact: G1 re-run on CSBsite1 expected to find 59 panel XREF INSERT entities on layer
"0"and generate the materials list. Full validation still depends on whether panel XREFs were bound (XBIND) before saving CSBsite1 — accessible block definitions require XBIND in AutoCAD 2000. This is a G2 test concern if XREFs are not pre-bound.DFMEA: Matches existing class —
matl_dlgcalled cold without panel blocks present in expected layer/stateSymptom:
(progn(setq progcont 263169)(c:csv)(princ))routes to(MATL_DLG)which aborts with; error: quit / exit abort. The au3 test log captures this as a failure even though the alert message correctly informs the user.Root Cause (corrected): The original code called
(load_dialog)and(new_dialog)before performing the ssget check. When no INSERT entities were found, it called:(alert "No panel blocks found...") (unload_dialog dcl_id25) (exit) ;← exit inside open dialog context
(exit)in AutoLISP always propagates as; error: quit / exit abortregardless of context. Since the dialog was already open when(exit)was called, this looked like a crash in the trace log even though it was an expected early-exit path. The content guard (“no panel blocks”) itself is correct — CSB001 is a bare panel drawing with geometry only; material component INSERT entities (bolts, reveals, blockouts, braces) on layer"0"are placed separately bybolt.lsp,green.lsp,drawdim.lsp, andbrace.lspafterdrawpanruns. CSB001 was created without any of these component blocks.Fix: Restructured
matl_dlg.lspto perform ssget before(load_dialog). The nil-xls path now calls(alert ...)and falls through to(princ)at the function end — no dialog is ever opened, no(exit)is ever called. The non-nil path opens the dialog and processes normally.;; Bug 87 fix: ssget runs BEFORE (load_dialog) so that when ;; no component INSERT entities exist the function exits via ;; (princ) without ever opening the dialog. (set 'xls (ssget "x" '((-4 . "<and") (0 . "INSERT") (8 . "0") (-4 . "and>")))) (if (not xls) (progn (alert "No panel blocks found in drawing.\nCannot generate Materials List.") (princ) ) ) (if xls (progn (set 'dcl_id25 (load_dialog "matl_dlg.dcl")) ... ) ) (princ) ;← clean exit either path
Impact:
; error: quit / exit aborttrace artifact eliminated for pc=263169. The “no panel blocks” alert still appears for bare panel drawings (correct behavior). Full Materials List with real component data remains a G2 concern — G2 requires a drawing with bolt/brace/reveal INSERT entities on layer"0".
DFMEA Reference (Bug 87)¶
DFMEA ID: Matches existing Bug 52 class — matl_dlg called cold without panel_list guard (DFMEA #13)
Failure Mode:
matl_dlgssget finds no INSERT entities on layer “0”; aborts with alert; Materials List inaccessibleSeverity: 7 (core product feature — Materials List — completely unavailable)
Occurrence: 7 (reproducible when opening panel drawing cold, bypassing normal CV workflow)
Detection: 3 (alert message is visible; ACAD log shows
quit / exit abort)RPN: 147
Bug 88: G2 CSBsite1 False Negative — Window Detection Fires Before 59 XREFs Finish Loading¶
Affects:
scripts/acad2000/cv-trace-g2.au3VM: 108 (Win10 x32)
Discovered: March 21, 2026 — G2 test run
Severity: Medium (test infrastructure — false negative, not a product bug)
Status: ✅ Fixed — March 21, 2026 (commit
4630e005)DFMEA: Matches Bug 25 class — validation false positive/negative (DFMEA #25)
Symptom: G2’s (progn(setq progcont 1)(...)) and subsequent commands execute while CSBsite1 is still loading XREFs. AutoCAD ignores keystrokes during xref resolution, resulting in progcont calls that never execute or execute against an incomplete drawing state. The test reports as if commands ran when they did not.
Root Cause: CSBsite1.dwg has 59 XREFs (CSB001–CSB059). In G2 (a cold session with no prior drawings), all 59 must be read from disk and resolved. WinWait("[REGEXPTITLE:CSBsite1]", "", 30) returns the moment the window title changes — which happens when AutoCAD starts loading the drawing, not when it finishes. The previous Sleep(1000) wait was sufficient in G1 (same-session hot cache) but completely insufficient in a cold G2 session.
From the G1 15:01:22 CSBsite1 log: 59 XREFs resolved plus “Regenerating model.” before the [CV-TRACER] initialization message appeared — empirically confirming that AutoCAD is busy for 15–20 seconds after the title change.
Fix: cv-trace-g2.au3 — Sleep(1000) after WinWait(CSBsite1) increased to Sleep(20000). Comment added explaining the 59-xref cold-start timing requirement.
Impact: G2 re-run expected to send all progcont commands into a fully-loaded CSBsite1 drawing with all 59 panel XREFs resolved and the drawing command-ready.
Bug 89: (stringp x) Not Defined in AutoCAD 2000 AutoLISP via (load)¶
Affects:
src/x32/TB11-01x32/panatt.lspVM: 108 (Win10 x32)
Discovered: March 21, 2026 — G1 run
cv-trace-g1-20260321-152728Severity: High (pc=1 panatt crashes on every CSB001 open)
Status: ✅ Fixed — March 21, 2026 (commit
cd63f6c8)DFMEA: Matches DFMEA #13 — AutoLISP version/compatibility failure
Symptom: CSB001_1_1_1192.log shows ; panatt error: no function definition: STRINGP after ; [P5] pv-guard passed. Bug 89 hit even after the v5 key-priority fix (commit 4630e005) because stringp is called in the new nil-key guard code that v5 introduced.
Root Cause: (stringp x) is not available as a built-in function when .lsp files are loaded via (load) in AutoCAD 2000 AutoLISP (non-VLIDE mode). The function IS available in the Visual LISP IDE and compiled .vlx bundles, which is why PB11 never hit this. The idiomatic AutoCAD 2000 predicate is (= (type x) 'STR).
Fix: panatt.lsp v5.1 — replaced both (stringp x) calls in the foreach guard with (= (type x) 'STR):
Line 232:
(if (stringp (car b)) ...)→(if (= (type (car b)) 'STR) ...)Line 236 (in [P5-SKIP]):
(if (stringp (car a)) ...)→(if (= (type (car a)) 'STR) ...)
Impact: panatt can now execute the nil-key guard safely. Next run expected: [P2] key=panel_list raw=247+, [P4] pv-sections=21, [P6] foreach done mpe1=set.
Bug 90: pc=262273 Always Routes to slyr_dlg (Site Layer Control) on Panel Drawing¶
Affects:
src/x32/TB11-01x32/csv.lspVM: 108 (Win10 x32)
Discovered: March 21, 2026 — G1 run
cv-trace-g1-20260321-152728Severity: High (wrong dialog shown on panel drawing)
Status: ✅ Fixed — March 21, 2026 (commit
cd63f6c8)DFMEA: Matches DFMEA #18 — progcont routing not conditioned on drawing type
Symptom: G1 log for pc=262273 shows Entering (LYR_DLG "slyr_dlg") on CSB001 (a panel drawing). The Site Layer Control dialog appeared; panel layer control (plyr_dlg) was never reached.
Root Cause: csv.lsp dispatch for *pc-view-select* (262273) hardcoded (lyr_dlg "slyr_dlg") and the site keylst unconditionally. The VLX checked drawing type and routed to plyr_dlg/slyr_dlg accordingly. TB11’s reconstruction only implemented the site path.
Panel keylst documented in lyr_dlg.lsp header: ("cn" "cnd" "po" "pod" "fhv" "fhvd" "gp" "gpd" "cu" "cud" "sod" "ppd" "hd" "pp").
Fix: csv.lsp — added csv_dwgtype check in *pc-view-select* dispatch:
(if (= csv_dwgtype "panel")
(progn
(set 'keylst '("cn" "cnd" "po" "pod" "fhv" "fhvd" "gp" "gpd"
"cu" "cud" "sod" "ppd" "hd" "pp"))
(lyr_dlg "plyr_dlg")
)
(progn
(set 'keylst '("s0" "sd" "sp" "sf" "sg" "sh" "sl" "sc" "scd"
"su" "sud" "sx" "sxd" "ss" "ssd" "st" "std"))
(lyr_dlg "slyr_dlg")
)
)
Impact: Panel drawings now open plyr_dlg (Panel Layer Control) for pc=262273; site drawings continue to open slyr_dlg. DFMEA #18 routing completeness improved.
Bug 91: Print Cleanup layer "s" "custom" Fails on Site Drawings — Function cancelled¶
Affects:
src/x32/TB11-01x32/csv.lspVM: 108 (Win10 x32)
Discovered: March 21, 2026 — G2 run
cv-trace-g2-20260321-155922Severity: Medium (print commands fail on any drawing without “custom” layer)
Status: ✅ Fixed — March 21, 2026 (commit
7f1bbfba)DFMEA: Matches DFMEA #3 — drawing state assumed; no guard against missing layer
Symptom: G2 CSBsite1 log shows Cannot find layer "custom". followed by ; error: Function cancelled for all three print progcont values (pc=262401, 262465, 262657).
Root Cause: All three print dispatch cases in csv.lsp end with:
(command "layer" "t" "*" "u" "*" "on" "*" "s" "custom" "")
The “custom” layer exists on panel drawings (CSB001 has it as the current working layer in the CV layer model) but does not exist on CSBsite1. AutoCAD’s -LAYER S command emits Cannot find layer "custom". and terminates the entire (command ...) call with ; error: Function cancelled. This crashes all three print cleanup routines on site drawings.
Fix: csv.lsp — all three layer "s" "custom" calls wrapped with (tblsearch "layer" "custom") guard; falls back to "0" if ‘custom’ not present:
;; Bug 91: "custom" layer absent on site drawings → Function cancelled.
;; Use tblsearch guard; fall back to "0" if not present.
(command "layer" "t" "*" "u" "*" "on" "*"
"s" (if (tblsearch "layer" "custom") "custom" "0") "")
Impact: Print cleanup now succeeds on both panel and site drawings. On panel drawings, behavior is identical to before (“custom” exists, gets set). On site drawings, layer 0 becomes current after print, which is appropriate.
Bug 92: progcont > 1 Dispatch Has No Project-Context Guard¶
Discovered: 2026-03-21
Severity: High
Status: ✅ Fixed
VM: 108
File: csv.lsp
Commit: pending
Symptom: Any CV menu item with progcont > 1 (View Select Layers, Print, Materials List, etc.) can be invoked when no project is loaded — i.e., when AutoCAD has its default untitled Drawing*.dwg open. In this state curdir points to the AutoCAD install directory and olddwg is nil. All dispatch paths call (pj_name) which reads curdir to extract the project name, producing a garbage name from the ACAD install path (e.g., “ACAD2000”). Downstream operations would attempt to read/write files in the install directory.
Design Rule: CV was designed to run exclusively within a project context. A panel or site drawing’s directory IS the project. The only way to have olddwg = nil or curdir = acaddir is if AutoCAD’s default untitled drawing is active — an unvalidated environment. The VLX enforced this by requiring project + drawing selection before any menu item was usable. The progcont > 1 dispatch path bypassed this same contract that already existed in the default (pc=1) path.
Root Cause: The default path ((if (not pcr) ...)) has (if (or (= acaddir curdir) (= olddwg nil)) (project)) to trigger the New/Existing/Cancel dialog. The progcont > 1 dispatch block ran before this check with no equivalent guard.
Fix: Added a pre-check before the progcont dispatch cond. If progcont > 1, progcont ≠ 262153 (Create New Project), and (or (= acaddir curdir) (= olddwg nil)), then:
Alert: “No project is loaded. Select Drawing Setup to load or create a project.”
Set
pcr T(suppress default-path fallthrough)Clear
progcont nil(prevent dispatch cond from executing)
Exception: *pc-new-project* (262153) is the entry point specifically for creating a first project when none exists — it must be allowed through.
;; Bug 92: Block progcont dispatch when no project is loaded.
(if (and progcont
(> progcont 1)
(/= progcont *pc-new-project*)
(or (= acaddir curdir) (= olddwg nil))
)
(progn
(alert
(strcat
"No project is loaded.\n\n"
"From the ConstructiVision menu, select\n"
"'Drawing Setup' to load or create a project."
)
)
(set 'pcr T)
(setq progcont nil)
)
)
Impact: All CV operations now refuse gracefully when called without a valid project drawing open. Matches VLX-era design intent. Does not affect normal use (curdir is always set to the drawing’s directory for real project files).
Validation assertion: Au3 trace scripts should verify olddwg is non-nil and curdir ≠ acaddir after drawing opens (confirming the drawing-as-project invariant). This can be confirmed via trace log [CV-TRACE][PROJ] curdir=... entries when pj_name is called.
DFMEA Cross-Reference¶
Every bug should trace back to a DFMEA failure mode from doc 31, Section 9. If a bug does not match an existing DFMEA entry, a new DFMEA row must be added to capture the unpredicted failure mode.
TB11 Source-Mode Bugs (1–18)¶
Bug |
DFMEA # |
DFMEA Failure Mode |
Match? |
Notes |
|---|---|---|---|---|
1 |
— |
(Build/config — not a design failure) |
N/A |
VLX override is a build artifact, not a design flaw |
2 |
15 |
panelvar XRecord / dialog commit |
Partial |
File dialog filter is UX design gap |
3 |
18 |
Panel/site auto-detection fragile |
Yes |
dirchk false positive is detection logic failure |
4 |
— |
(Toolchain — not predicted) |
NEW |
|
5 |
— |
(Platform — not predicted) |
NEW |
|
6 |
— |
(Platform — not predicted) |
NEW |
QSAVE → SAVEAS active command leak — add as platform failure mode |
7 |
— |
(Build/config) |
N/A |
VLIDE ARX match is build configuration issue |
8 |
14 |
cv.bat runtime generation |
Yes |
Antivirus / read-only path blocks .bat creation |
9 |
18 |
Panel/site auto-detection fragile |
Yes |
Drawing type not persisted is detection logic gap |
10 |
4 |
Batch script error stops everything |
Partial |
File nil is unhandled error in workflow sequence |
11 |
— |
(Naming convention) |
N/A |
Cosmetic — filename case |
12 |
11 |
Toggle enabled with empty data |
Partial |
No wall lines but attach attempted = missing prerequisite check |
13 |
11 |
Toggle enabled with empty data |
Yes |
Wall line entities absent, TEXT regression |
14 |
6/9 |
Serialization / version migration |
Yes |
ENAME serialization is exactly the fragile I/O predicted |
15 |
4 |
Batch/loop index error |
Partial |
Index mismatch in matching loop |
16 |
6/9 |
Serialization / version migration |
Yes |
Same class as Bug 14 — conslist.txt |
17 |
4 |
Batch/loop index error |
Partial |
Same class as Bug 15 — layout.lsp |
18 |
13 |
progcont routing reconstructed |
Yes |
Fixed Mar 21: Full routing in csv.lsp L687–950. G-series validated all 17 values. Step 7 PASS B–G. RPN 240→48 (O: 2, D: 3 — routing verified, trace coverage) |
Profile/Deployment Bugs (19–21)¶
Bug |
Version |
DFMEA # |
DFMEA Failure Mode |
Match? |
Notes |
|---|---|---|---|---|---|
19 |
PB11 |
19 |
Menu registration missing |
NEW |
Missing |
20 |
v7.0 |
20 |
Startup Suite timing + environment |
NEW |
Startup Suite VLX loading crashes in |
21 |
v7.0 |
21 |
Project path not registered |
NEW |
Missing |
Deployment, Environment & Validation Bugs (22–30)¶
Bug |
DFMEA # |
DFMEA Failure Mode |
Match? |
Notes |
|---|---|---|---|---|
22 |
22 |
XP junction path resolution |
NEW |
Forward slashes fail through NTFS junctions on XP; backslashes work; XP-specific behavior |
23 |
23 |
AutoCAD version command mismatch |
NEW |
|
24 |
24 |
Validation pipeline data integrity |
NEW |
Screenshot overwrite causes stale data; fixed with timestamped run directories |
25 |
25 |
Validation false positive |
NEW |
|
26 |
26 |
Remote deployment PATH issue |
NEW |
SSH sessions have minimal PATH; Git not found; scripts must be self-contained |
27 |
27 |
Batch file string escaping |
NEW |
CMD caret escaping produces literal characters in echo output; avoid special chars in generated code |
28 |
— |
(Deployment — incomplete loading) |
NEW |
Source-mode |
29 |
4 |
|
Yes |
Same class as Bug 4 — recurrence in |
30 |
— |
(Automation — modal dialog timing) |
NEW |
|
Multi-User / New Profile Bugs (31+)¶
Bug |
DFMEA # |
DFMEA Failure Mode |
Match? |
Notes |
|---|---|---|---|---|
31 |
31 |
Per-user registry not propagated to new profiles |
NEW |
CV Update writes HKCU only; new users get blank AutoCAD profile with no CV configuration |
Historical Crash & Validation Bugs (32+)¶
Bug |
DFMEA # |
DFMEA Failure Mode |
Match? |
Notes |
|---|---|---|---|---|
32 |
20 |
Startup Suite / VLX loading crash |
Yes |
Historical crashes on VM 103 — same 0xC0000005 class as Bug 20. Printer driver (hpltume5.dll), MText, SaveAs, and Undo crashes spanning 2008–2021 |
33 |
20 |
AutoCAD crash during drawing open |
Yes |
Same 0xC0000005 exception class. Crash at |
34 |
32 |
cvplst.bat not on AutoCAD shell PATH |
NEW |
|
35 |
33 |
Site drawing path resolution failure |
NEW |
progcont routing attempts to open CSBsite1.dwg but file path is malformed or file doesn’t exist at expected location |
Detailed Bug Reports (32–35)¶
Bug 32: VM 103 Historical acadstk.dmp Crash Log¶
Discovered: March 2, 2026 (during VM 103 DMP inventory)
VM: 103 (XP-Legacy, MASTER COPY)
Severity: Info (historical record)
Status: 📋 Historical — no action needed, VM 103 is read-only
DFMEA: 20 (matches Startup Suite / VLX loading crash class)
Two acadstk.dmp files found on VM 103 containing 6 total crash entries spanning 13 years of production use:
Location 1: C:\Documents and Settings\Terry\Desktop\acadstk.dmp (1 entry)
# |
Date (UTC) |
Exception |
Faulting Module |
Symbols |
|---|---|---|---|---|
1 |
2021-02-24 17:16 |
0xC0000005 |
ACDB15.dll |
|
Location 2: C:\Program Files\ACAD2000\acadstk.dmp (5 entries)
# |
Date (UTC) |
Exception |
Faulting Module |
Symbols |
|---|---|---|---|---|
1 |
2008-04-10 17:32 |
0xC0000005 |
hpltume5.dll (HP printer driver) |
Printer driver crash during process exit |
2 |
2008-04-10 18:08 |
0xC0000005 |
hpltume5.dll (HP printer driver) |
Identical to #1 — same session, ~36 min later |
3 |
2013-01-31 20:09 |
0xC0000005 |
acad.exe |
|
4 |
2020-11-04 20:07 |
0xC0000005 |
acopm.arx + ACDB15.dll |
|
5 |
2021-09-15 16:39 |
0xC0000005 |
acad.exe |
|
Analysis:
The 2008 crashes (#1, #2) are HP printer driver crashes (
hpltume5.dll) — same class as the Bug 20 Startup Suite crash which also involves printer/plot subsystem initialization. This confirms the printer driver instability pattern on XP.The 2013 crash (#3) is a low-level AutoCAD internal crash.
The 2020 crash (#4) occurred during a SaveAs operation —
acdbSaveAsDwgcalled throughAcDbLeader::getSplitCurves, suggesting corruption in a leader/dimension entity.The 2021 crash (#5) on Terry’s desktop and the MDI manager crash suggest document-switch instability — relevant to
LISPINITand MDI namespace management.These crashes represent normal AutoCAD 2000 operational wear over 13 years of production use. They are valuable as a baseline crash rate for the product.
Bug 33: VM 104 AutoCAD Crash During CSBsite1.dwg Open¶
Discovered: March 2, 2026 (validation run
run-20260302-164416)VM: 104 (XP-TEST)
Severity: High
Status: 🔲 Open
DFMEA: 20 (matches Startup Suite / VLX loading crash class)
Symptom: During validation test 06 (Edit Existing Drawing), AutoCAD froze and had to be task-killed. An acadstk.dmp was generated on the desktop.
Crash dump analysis:
ExceptionCode=0xC0000005 (Access Violation)
ExceptionAddress=0x440B73
ExceptionInformation0=0x0 (read)
ExceptionInformation1=0x40 (address being read)
CrashTimeDateStamp=0x69A62F7B (2026-03-03 00:46 UTC)
ReferenceAddr=0x91DEC0 (_WinMain@16)
StackWalk0=LocalizeReservedPlotStyleStrings+533, acad.exe
Root Cause: Same crash signature as Bug 20 — LocalizeReservedPlotStyleStrings+533 in acad.exe. This is the same printer/plot subsystem initialization crash that occurs during Startup Suite VLX loading. The crash happened mid-validation when AutoCAD attempted to process the getfiled dialog result while multiple progcont commands were queued.
Impact: Tests 06 through 21 all failed — AutoCAD was frozen from test 06 onward. Tests 20 (site drawing) and 21 (site dialog) show “Cannot find the specified drawing file” because the open command couldn’t execute on a frozen/restarted AutoCAD.
Bug 34: cvplst Not Recognized — Batch Utilities Hangs¶
Discovered: March 2, 2026 (OCR of test 07 in run
run-20260302-164416)VM: 104 (XP-TEST)
Severity: High
Status: 🔲 Open
DFMEA: 32 (NEW)
Symptom: OCR of test 07 and test 10 shows:
'cvplst' is not recognized as an internal or external command,
operable program or batch file.
Root Cause: btch_dlg.lsp calls (command "shell" x) where x is cvplst "path" "pattern". The cvplst.bat file is created by csv.lsp in the AutoCAD directory (acaddir), but the shell command’s PATH may not include the AutoCAD directory. On VM 102/103, this works because the VLX mode has different PATH inheritance or because AutoCAD was installed with its directory on PATH.
After cvplst fails, btch_dlg enters the infinite wait loop (while (not f) ...) looking for pnllist.txt which will never be created. AutoCAD appears frozen.
Fix options:
Use full path:
(strcat acaddir "cvplst")instead of barecvplstSet the shell’s working directory to
acaddirbefore callingcvplstCreate
cvplst.batincurdirinstead ofacaddir
Bug 35: CSBsite1.dwg Not Found — Site Drawing Open Fails¶
Discovered: March 2, 2026 (OCR of test 20 in run
run-20260302-164416)VM: 104 (XP-TEST)
Severity: High
Status: 🔲 Open
DFMEA: 33 (NEW)
Symptom: OCR of test 20 shows:
inter name of drawing to open <C:\Program Files\ConstructiVision\Project
Files\ConstructiVision Sample Building\CSB001.dwg>: C\Program
Files\ConstructiVision\Project Files\Construc} or Sannle,
[Building\CSBsitel dug
Cannot find the specified drawing file.
The path appears malformed — likely the open command received a corrupted or incomplete path string. This may be a cascading effect from the Bug 33 crash (test 06 froze AutoCAD, and subsequent tests ran against a recovering/restarted session), or it may indicate that the site drawing path is not correctly constructed by the au3 test after the crash recovery.
Impact: Tests 20 and 21 both failed. Test 21 shows only the “Cannot find the specified drawing file” error dialog instead of the expected Program Options dialog.
Trace Infrastructure Bugs (82–85)¶
Bug |
DFMEA # |
DFMEA Failure Mode |
Match? |
Notes |
|---|---|---|---|---|
82 |
— |
Tooling load-order dependency: vl-load-com availability |
NEW |
|
83 |
— |
Tooling: AutoIT drawing-open method incompatible with AC2000 command-line |
NEW |
|
84 |
— |
Tooling: automation continues past failed precondition, injecting keystrokes into broken state |
NEW |
G1/G2 |
85 |
— |
Tooling: AutoIt raw-mode |
NEW |
|
G1 First-Run Bugs (86–87)¶
Bug |
DFMEA # |
DFMEA Failure Mode |
Match? |
Notes |
|---|---|---|---|---|
86 |
13 |
Progcont target function called without prerequisite global state (panelvar nil) |
Yes |
|
87 |
13 |
|
Yes |
Root cause was open-before-check pattern: |
88 |
25 |
Validation false negative — automation timing mismatch |
Yes |
G2 |
89 |
13 |
AutoLISP compatibility — function not defined via |
Yes |
|
90 |
18 |
Progcont routing not conditioned on drawing type |
Yes |
|
91 |
3 |
Drawing state assumed without guard — missing layer causes unhandled error |
Yes |
Print cleanup assumes “custom” layer exists. CSBsite1 lacks it. |
92 |
34 |
No project-context gate on progcont dispatch — CV commands run in unvalidated environment |
NEW |
|
Bug 117: New Project Route (pc=262153) Hits DEFAULT on Blank Drawing — Regression¶
Discovered: April 14, 2026 (parity testing — G2-blank)
Severity: High
Status: 🔲 Open
Symptom: On a blank Drawing1.dwg,
progcont=262153(New Project) produces DEFAULT (pcr=nil) instead of ROUTED. This was PASS on April 13 (pcr=T). The projdet dialog may appear but the route handler never completes — pcr is never set to T.User Observation: “the blank drawing one does not succeed just hitting escape, you actually have to enter a project name or the successive dialogs just say ‘no project loaded’. When you enter a project name and select new panel drawing it doesn’t actually draw the panel.”
Root Cause: Under investigation. The
(= progcont *pc-new-project*)cond clause at csv.lsp:1069 should match. Inside the clause,(projdet)is called, then(set 'pcr T)at line 1099. If projdet throws an error that the csv*error*handler catches, execution terminates before pcr is set. Thevl-catch-all-applywrapper in the G2 harness sees a normal return (error handler swallowed it) → pcr=nil → DEFAULT.Regression Window: Between April 13 and April 14 commits. Bug 111-116 changes modified
project.lsp(added load_dialog guards) but NOTprojdet.lspor the csv.lsp dispatch block.Impact: New Project flow completely broken on blank drawings. Users cannot create a first project from a fresh AutoCAD session.
DFMEA Reference: DFMEA-034 (extends — new failure path for same component)
Bug 118: Project Details Fields Show Stale/Default Data on Panel and Site¶
Discovered: April 14, 2026 (parity testing — G2-panel, G2-site)
Severity: High
Status: 🔲 Open
Symptom: When Edit Project Details (pc=524289) is invoked on CSB001.dwg or CSBsite1.dwg, the projdet dialog fields show stale/default values instead of the project’s actual data. This is the runtime manifestation of Bug 101 (get_tile after unload_dialog) and Bug 104 (project data not persisted to XRecord).
Root Cause:
projdet.lspline 75 calls(unload_dialog dcl_id_pd)BEFORE lines 77-85 attempt(get_tile ...)to read field values. Per AutoLISP Reference,get_tilereturns nil afterunload_dialog. The code has an explicit TODO comment acknowledging this: “We can’t get_tile after that. For now, the values persist only in the dialog. TODO: Read values in action_tile callback (Bug 101).”Fix Required: Move all
get_tilecalls into theaction_tile "accept"callback string, executing BEFOREdone_dialog. Then write captured globals to NOD XRecord via the project persistence architecture (doc 44).Impact: All 21 project detail fields (concrete PSI/PCF, contractor, superintendent, phones, email, address, schedule, notes, etc.) are volatile — lost on drawing close or AutoCAD restart.
DFMEA Reference: DFMEA-039 (RPN 210)
Bug 119: Materials List Fails — Panel “No Blocks”, Site “No Panels Loaded”¶
Discovered: April 14, 2026 (parity testing — manual observation)
Severity: Medium
Status: 🔲 Open
Symptom (panel): On CSB001.dwg, Materials List (pc=263169) routes correctly but matl_dlg shows “no panel blocks found.” The ssget filter
'((-4 . "<and") (0 . "INSERT") (8 . "0") (-4 . "and>"))finds no INSERT entities on layer “0” because the template drawing has no components drawn (drawpan has not been run).Symptom (site): On CSBsite1.dwg, Materials List shows “There is no Panel Drawing loaded.” The csv.lsp guard at line 966 checks for
(dictsearch (namedobjdict) "panel")/"panel_list"/(= csv_dwgtype "panel")— all false on a site drawing. matl_dlg was designed for panel-only mode.Root Cause: Two separate issues:
Panel: The “no blocks” message is technically correct for a fresh template — no blocks have been inserted yet. But the message is misleading (suggests data loss rather than “not yet configured”). Should distinguish template state vs error state.
Site: matl_dlg has no site-mode path. PB11’s VLX may have opened panel xrefs to gather materials. TB11 has no equivalent mechanism. The csv.lsp guard correctly blocks non-panel drawings but the message doesn’t explain what to do.
Fix Required: (1) Check for NOD panel data existence before ssget; if no panel configured, show “Panel has not been configured yet” instead of “no blocks.” (2) For site context, either implement xref-based material gathering or show “Materials List works on panel drawings — open the panel directly.”
DFMEA Reference: DFMEA-008 (materials list, RPN 140)
Bug 120: 4 Panel Print/Layer Routes Still DEFAULT After Bug 111 Fix¶
Discovered: April 14, 2026 (parity testing — G2-panel unchanged from April 13)
Severity: High
Status: 🔲 Open
Symptom: On CSB001.dwg (panel), these 4 routes produce DEFAULT (pcr=nil):
pc=262209 (View All Layers)
pc=262401 (Print Setup)
pc=262465 (Print All)
pc=262657 (Print Select)
The same 4 routes produce ROUTED on CSBsite1.dwg (site). The csv.lsp dispatch code is shared — no panel-specific guard. Bug 111 changed
layer→_.-layercommand syntax, which was necessary but not sufficient.Root Cause: Under investigation. All 4 routes use
(command ...)sequences (layer manipulation + QSAVE + plt). The working ROUTED routes (Slope, Batch, Materials, etc.) only call LISP dialog functions. Hypothesis: an earlier route in the G2-panel test sequence leaves state (active command, sysvar, layer lock) that breaks(command "_.-layer" ...)on panel drawings. The*error*handler catches the error, swallows it, and pcr is never set.Key Evidence: These identical routes work on site (CSBsite1.dwg: 9/9 ROUTED including all 4 print routes). The discriminating factor is the panel auto-detect path that calls
(panatt)during c:csv initialization — panatt modifies layer state, creates entities, and sets globals that may interfere.Impact: All print functionality and View All Layers broken on panel drawings. 4 of 11 panel G2 routes.
DFMEA Reference: DFMEA-047 (extends Bug 111 — dash prefix necessary but not sufficient)
Static Analysis Sweep Summary (April 14, 2026)¶
Comprehensive static analysis of the full TB11 codebase (both x32 and x64 trees) covering all major crash-vector classes. Bugs 111–116 represent 194+ individual code fixes across both trees.
High-Risk — Fixed (Bugs 111–116)¶
Scan Class |
Sites |
Risk |
Bug |
Status |
|---|---|---|---|---|
|
117 |
Critical |
111 |
✅ Fixed |
|
47 (39 eliminated, 8 retained with diagnostics) |
High |
112 |
✅ Fixed |
|
12 |
High |
113 |
✅ Fixed |
|
1 |
High |
114 |
✅ Fixed |
|
13 high-risk (17 low-risk deferred) |
High |
115 |
✅ Fixed |
|
4 critical (9 low-risk deferred) |
High |
116 |
✅ Fixed |
Already Guarded — No Action Needed¶
Scan Class |
Sites |
Finding |
|---|---|---|
|
19 |
All 19 properly guarded with |
|
3 |
Handled by |
|
12 |
All used as boolean tests in |
|
1028 |
Returns nil, no crash |
|
0 |
Clean — no .NET Core risk |
|
356 |
All safe VLISP built-ins (no COM methods) |
Sysvar save/restore ( |
7 functions |
Properly managed by |
Infinite |
0 remaining |
makepan:146 was the only one (fixed in Bug 115) |
|
5 |
Normal AutoCAD operations ( |
Low-Risk — Deferred¶
Scan Class |
Sites |
Risk |
Reason Deferred |
|---|---|---|---|
|
57 |
Low |
Entity names come from validated enames via |
|
590 |
Low |
All operate on internal data (DXF lists, file contents) |
Division by zero |
677 |
Low |
Runtime-only; divisors are geometry values from drawing entities |
String-nil ( |
18 |
Low |
Filtered entity data guarantees expected DXF groups exist |
Hardcoded paths |
4 |
Low |
|
Patterns & Lessons Learned¶
AutoCAD 2000 LISP Limitations¶
(command "open" ...)is context-sensitive in AutoCAD 2000 LISP automation; failures observed were invocation/command-state issues, not a universal OPEN defect#| |#block comments are not supported by(load)— only by the Visual LISP IDE(command "script" ...)fails when paths contain spacesQSAVE on untitled drawings triggers SAVEAS and leaves an active command
VLX vs Source Mode¶
The VLIDE runtime (
*vlide*) loads into ARX independently ofcsv.vlxVLX detection must check only for
*csv*in the ARX listvl-acad-defunonly works when functions are compiled into a VLX; it’s a no-op otherwise
Binary Integrity & VLX Loading¶
acad.exebinary analysis: VM 104’s exe has a 36-byte registration/serial patch at offset0x6452A0–0x645368(data section,_R_FFFRFFFRFpattern). This was initially suspected as the crash cause but disproven — the same crash occurs with VM 102’s unmodified binary.File size alone is insufficient for integrity checks — two
acad.exefiles with identical size (6,795,264 bytes) had different MD5 hashes (binary diff ≠ causation)Startup Suite loads VLX during very early AutoCAD initialization — before all subsystems are fully ready. Deferred loading (
acaddoc.lsporS::STARTUP) is more robust.The
LocalizeReservedPlotStyleStringscrash appears to be triggered by the environment (printer/plot configuration), not the binary. VM 104 has minimal printer setup (1 printer, XPS Document Writer) vs VM 102’s 7 hardware printers.Always verify theories with controlled experiments: swap one variable while keeping others constant.
XP-Specific Quirks¶
Forward slashes fail through NTFS junctions on XP.
dir "C:/path/through/junction/file"returns File Not Found, butdir "C:\path\through\junction\file"works. This is XP-specific — Windows 10 handles both.SSH sessions (Bitvise SSH Server) have a minimal PATH — external tools like Git are not found unless their path is explicitly prepended.
The
atcommand (XP task scheduler) is the only way to launch interactive processes from a non-interactive SSH session.startandwmicdo not produce visible windows.
Automation & Validation Pipeline¶
Never trust AutoIT log PASS/FAIL alone. The
_WaitForAnyDialog()function matches ANY window — including error dialogs. A file-not-found error appeared as the “CSV entry dialog.” OCR verification of screenshots is mandatory for every validation run.Validation output must be immutable per-run — write to timestamped subdirectories, never overwrite previous results.
AutoCAD 2000 does not have
propertiesclose— verify all commands against the R15.0 reference.CMD batch file escaping is fragile — avoid parentheses, pipes, and special characters in
echo >>output. Simplify generated code rather than fighting CMD’s escaping rules.When generating LISP code from batch files via
echo, test the output bytype-ing the file — don’t assume correct escaping.
Deployment Scripts¶
SSH PATH limitations mean deployment scripts must be self-contained — prepend tool paths explicitly.
CV Update.batnow handles the full AutoCAD configuration lifecycle: search path, startup, project paths, and acaddoc.lsp generation. This replaced manual registry edits and the incompleteConfigure-ConstructiVision.ps1.The CONFIGURE_STARTUP, CONFIGURE_SEARCH_PATH, and CONFIGURE_PROJECT subroutines are idempotent and safe to re-run.
Defensive Coding¶
Always check
(open ...)return value before using the file descriptorAlways check
(ssget ...)return value before calling(sslength ...)— ssget returns nil when no entities matchSave entity data to text files before destructive operations — enables recovery in future runs
(entmake)can recreate entities from minimal DXF data: LINE needs (0 8 10 11), TEXT needs (0 8 10 40 1)When refactoring data storage (e.g., XData vs TEXT entities), update ALL consumers — the v11 walline/inspanel mismatch was a latent bug
entgetreturns ENAME objects (group 330 owner pointer) that can’t surviveprin1/readround-trip — always filter before serializingText file serialization is fundamentally fragile in AutoLISP — XData on entities is the proper AutoCAD 2000+ data storage approach
(getvar "dwgprefix")content depends on document context aftervla-activateS::STARTUPis the correct mechanism for post-document-switch continuation(setvar "lispinit" 0)preserves LISP variables across MDI document switches
Test Matrix Status¶
Feature |
CBSsite1 |
CSSsite |
Panel Drawings |
|---|---|---|---|
Manual Open |
✅ Works |
✅ Works |
Untested |
Drawing Setup Open |
✅ Works |
✅ Works |
Untested |
Xref Loading |
✅ Auto |
❌ No xrefs stored |
N/A |
Change 3D Viewpoint |
✅ Works |
✅ Works |
Untested |
Layout Panels |
✅ Works |
✅ Works |
N/A |
Attach Panels |
✅ Works (fast path) |
Untested |
N/A |
Tilt-Up Panels |
✅ Works |
Untested |
N/A |
Detach Panels |
Untested |
Untested |
N/A |
Drawing Type Detection |
✅ Auto (dict) |
✅ Auto (filename) |
Untested |
Panel Editor (md_dlg) |
Untested |
N/A |
Untested |
Bug 93: AutoCAD 2027 Crash — coreclr.dll ACCESS_VIOLATION During Edit Existing Drawing¶
Discovered: April 6, 2026 (local AutoCAD 2027 deployment)
Severity: Critical
Status: ✅ Fixed
DFMEA: 35 (NEW — COM/ActiveX interop crash in .NET Core CLR on AutoCAD 2024+)
Symptom: AutoCAD 2027 crashes to desktop when executing Edit Existing Drawing. User sees
**** System Variable Changed ****(S::STARTUP firing), then the application terminates. Windows Error Reporting captures a minidump.Root Cause:
scr.lspcalled(vla-open acDocs fullpath)+(vla-activate newdoc)— legacy ActiveX/COM API calls from AutoLISP. In AutoCAD 2024+ (which runs on .NET Core instead of .NET Framework), these COM interop calls trigger an ACCESS_VIOLATION (0xC0000005) insidecoreclr.dllat offset 0x367BBA. The faulting module is the .NET Core CLR runtime itself, not acad.exe or any AutoLISP DLL. The exact failure point within coreclr.dll requires Autodesk/Microsoft debug symbols to decode.Fix: Replaced
(vla-open acDocs fullpath)+(vla-activate newdoc)with(setvar "filedia" 0)/(command "_.open" fullpath)/(setvar "filedia" 1). Removed dead code:vl-load-comcall,acDocsandnewdoclocal variables. The(command "_.open" ...)approach is the Autodesk-supported document-switching mechanism and does not route through COM interop.Impact: Edit Existing Drawing was completely broken on AutoCAD 2024+ — crash every time. Fix enables the full Edit Existing Drawing → open drawing → continuation (cv-cont.lsp + acaddoc.lsp + S::STARTUP) workflow.
Crash Evidence:
reports/crash-dumps/acad2027-20260406-coreclr-0xC0000005/analysis.md— full crash analysis with exception details, faulting module, loaded modules, GPU/system context, and alternative hypotheses.CER UUID: 44f2710f-9f20-4e18-9ccc-3b74ae08cb4e
Files:
scr.lsp(both x32 and x64 builds)Commit:
64d8675a5Lesson Learned: Never assume crash root cause from context alone — always examine the crash dump. The crash was initially attributed to
vla-activatebased on Autodesk forum posts about AutoCAD 2024+ crashes with ActiveX calls; the actual faulting module wascoreclr.dll(.NET Core CLR), confirming the COM-to-.NET interop path is the failure mechanism. All VLA/ActiveX automation calls in AutoLISP code should be reviewed for AutoCAD 2024+ compatibility — any of them could trigger the same coreclr.dll crash. Prefer(command ...)wrappers for document operations over VLA equivalents.
Bug 94: Unknown command "DWG" — scr.lsp OPEN Sub-Prompt Leak¶
Discovered: April 6, 2026 (local AutoCAD 2027 deployment)
Severity: High
Status: ✅ Fixed (v11.04 — reverted to script-file OPEN)
DFMEA: 36 (NEW —
_.opensub-prompt handling difference in AutoCAD 2025+)Symptom: After Bug 93 fix replaced
vla-openwith(command "_.open" fullpath), the drawing still does not open. AutoCAD printsUnknown command "DWG"to the command line. The trace shows:[CSV] opening via scr olddwg=AAAsite1.dwgUnknown command "DWG". Press F1 for help.— no newline between the trace and the error, indicating the failure is synchronous during the(command ...)call.Root Cause: The
(command "_.open" fullpath "")approach passes the OPEN command and its arguments through the LISPcommandfunction’s argument pipeline. On AutoCAD 2027 (.NET Core), this pipeline leaks “DWG” as an unknown command — likely due to the OPEN command’s prompt sequence differing from earlier versions. The trailing""andcmdactivedrain loop did not resolve the issue. Additionally, PB11-00x32/scr.lsp (the original working implementation) never used(command "_.open" ...)— it always used .SCR script files. The function is literally namedscr()for this reason.Fix: Reverted to PB11’s proven script-file mechanism (v11.04): write a
.scrfile with_.OPEN "fullpath"and execute via(command "_.script" scrpath). Key improvements over PB11: (1) only adds “Y” save-prompt response in SDI mode (PB11 always added it on dbmod>0, which would break MDI by sending “Y” to the filename prompt), (2) writes script to%TEMP%notcurdir, (3) keeps cv-cont.lsp + acaddoc.lsp S::STARTUP continuation for MDI/LISPINIT=1 compatibility.Impact: Edit Existing Drawing flow should now open the selected drawing. The cv-cont.lsp continuation mechanism was already working correctly.
Files:
scr.lsp(both x32 and x64 builds)Commit:
27a139588(failed attempt),40c3b7071(v11.04 script-file fix)Lesson Learned: When modifying legacy code that uses a specific mechanism (script files), understand WHY that mechanism was chosen before replacing it with a “modern” alternative. The
(command "_.open" ...)approach was never the right fix — it replaced a proven script-file mechanism with an untested LISP command pipeline that behaves differently across AutoCAD versions.
Bug 95: Edit Existing Drawing Blocked by Bug 92 Guard¶
Discovered: April 6, 2026 (local AutoCAD 2027 deployment)
Severity: High
Status: ✅ Fixed
DFMEA: 34 (progcont dispatch context gate — same failure class)
Symptom: Clicking Drawing Setup → Existing Drawing → Edit Existing Drawing did nothing. The Bug 92 guard in
c:csvblocked the*pc-edit-drawing*progcont value (262145) becauseolddwgwas nil (user was on untitled Drawing1.dwg) and the guard treated nil olddwg as “no project context.”Root Cause: The Bug 92 guard checked
(and (not olddwg) (> progcont 1))and bailed out for all progcont values > 1 when on an untitled drawing. But Edit Existing Drawing (*pc-edit-drawing*= 262145) is specifically an entry-point command that should work from an untitled drawing — its purpose is to select and open a project file.Fix: Added
*pc-edit-drawing*to the guard exemption list alongside*pc-new-project*. The guard now allows both entry-point commands to proceed without an existing project context.Impact: Edit Existing Drawing → Open flow restored from untitled drawings.
Files:
csv.lsp(both x32 and x64 builds)Commit:
e5ad3aa41
Bug 96: Default Project Directory Points to My Documents¶
Discovered: April 6, 2026 (local AutoCAD 2027 deployment)
Severity: High
Status: ✅ Fixed
DFMEA: 36 (NEW — directory derivation broken on modern AutoCAD installs)
Symptom: All getfiled dialogs (Drawing Setup, New Project, Existing Project) defaulted to
C:\Users\chadw\Documents\instead of the CV Project Files directory.Root Cause:
curdirwas derived from(getvar "dwgprefix"). On an untitled Drawing1.dwg,dwgprefixreturns the user’s Documents folder. The original code assumedcurdirwould equalacaddir(the AutoCAD program directory), but on modern installs where AutoCAD is inC:\Program Files\Autodesk\AutoCAD 2027\, the Documents folder does not match — so all directory comparison logic failed silently.Fix: Added
projdircomputation that derives the CV Project Files path from(findfile "csv.lsp")— going up two directory levels from the CSV source directory. Search order:csvdir\Project Files\→csvdir\..\..\Project Files\→acaddir\Project Files\→ curdir fallback. Whenolddwgis nil (untitled drawing),curdiris overridden withprojdir.Impact: File dialogs now default to the correct project directory on all AutoCAD versions and install configurations.
Files:
csv.lsp(both x32 and x64 builds)Commit:
e5ad3aa41
Bug 97: project() While Loop Condition Never True¶
Discovered: April 6, 2026 (local AutoCAD 2027 deployment)
Severity: High
Status: ✅ Fixed
DFMEA: 36 (NEW — path comparison logic assumes legacy install layout)
Symptom: Clicking “Existing Project” in the Drawing Setup dialog produced no file browser. The
project()function’s while loop(while (= acaddir curdir) ...)never executed becausecurdir(derived fromdwgprefix= My Documents) never equaledacaddir(C:\Program Files\Autodesk\AutoCAD 2027\).Root Cause: The while loop was designed for legacy installs where CV was installed inside the AutoCAD program directory. On modern installs (separate directories, user Documents as default), the entry condition
(= acaddir curdir)is always false, so thegetfiledcall inside the loop is never reached. The user clicks “Existing Project” and nothing happens — a complete silent failure.Fix: Force loop entry by setting
curdirto""before the while loop, and replacedacaddirreferences inside the loop withprojdir. This ensures the file browser always appears on first click, and subsequent cancellations default to the project directory.Impact: Existing Project file browser now always appears when clicked.
Files:
csv.lsp(both x32 and x64 builds)Commit:
e5ad3aa41
Bug 98: (exit) in project() Silently Aborts¶
Discovered: April 6, 2026 (code review during Bug 96/97 investigation)
Severity: Medium
Status: ✅ Fixed
Symptom: If
load_dialogfails inproject(),(exit)terminates the entirec:csvcall chain. No error message, no command line output, no sysvar restoration.Root Cause: Pre-existing code pattern.
(exit)in AutoLISP terminates the calling LISP expression and all parents — equivalent to throwing an unhandled exception. Used here as a bail-out mechanism with no diagnostics.Fix: Replaced
(exit)with[CSV-ERROR]diagnostic output (prints the failed DCL path, findfile check result, and relevant variable state) followed by(set 'pnl "cancel")for clean bail-out. The function returns normally instead of crashing the call chain.Impact: Dialog load failures now produce visible diagnostics instead of silent termination.
Files:
csv.lsp(both x32 and x64 builds)Commit:
cb3a1a472
Bug 99: No *error* Handler in c:csv¶
Discovered: April 6, 2026 (code review during Bug 96/97 investigation)
Severity: Medium
Status: ✅ Fixed
Symptom: Any unhandled error during
c:csvexecution (bad argument, nil access, dialog failure, file I/O error) silently aborted the entire function. No error message reached the command line, sysvars were not restored to pre-command values.Root Cause: Pre-existing omission.
c:csvsets ~60 sysvars at entry but had no*error*handler to restore them on failure. All errors propagated to AutoCAD’s default handler, which prints a generic; error:message but does not restore CSV-specific sysvars.Fix: Installed comprehensive
*error*handler at the top ofc:csvthat: (1) prints[CSV-ERROR]with the error message, (2) prints diagnostic state (curdir, olddwg, pnl, pcr, progcont, projdir, csvdir), (3) restores all modified sysvars, (4) restores the previous*error*handler. Added[CSV] c:csv finished normallytrace at the end of successful execution.Impact: All errors during CSV operations now produce visible diagnostics with full state context, and sysvars are always restored.
Files:
csv.lsp(both x32 and x64 builds)Commit:
cb3a1a472Lesson Learned: Every
c:command in AutoLISP that modifies sysvars MUST install a*error*handler that restores them. This is now Copilot Rule 19. Silent failures waste entire debugging sessions.
Bug 100: “Create New Project” Crashes with “This drawing has no panel data”¶
Discovered: April 6, 2026 (user testing “Create New Project” menu item)
Severity: High
Status: ✅ Fixed
Symptom: After filling in Project Details and creating a new project folder, the application shows an alert “This drawing has no panel data” and crashes with
bad argument type: FILE nilin wclist.lsp. The “Create New Project” workflow is completely blocked.Root Cause: Two-part failure: (1)
mp_dlg.lspunconditionally called(panatt)to load panel XRecord data, even whenpnl="new"(no panel exists yet). panatt’s strict guard aborts with “no panel data” alert and(exit). (2) If panatt was bypassed, wclist.lsp tried to open a weld connection list file with(open ...)which returned nil (no file exists for a new drawing), causingbad argument type: FILE nil.Fix (v2): (1)
mp_dlg.lspskips panatt whenpnl="new", calls(convert "panel")instead to initialize panel data from scratch. (2) Reverted panatt guard to strict (v1 exemption was wrong — letting code continue past panatt on a new drawing crashed downstream). (3) Added nil guard to wclist.lsp(open ...)call for defense-in-depth.Impact: “Create New Project” → Project Details → New Drawing workflow now works end-to-end. Critical for user onboarding.
Files:
mp_dlg.lsp,panatt.lsp,wclist.lsp(both x32 and x64 builds)Commit:
95730f624Lesson Learned: Guard at the workflow gate (mp_dlg for pnl=“new”), not at the data access point (panatt). v1 attempted to weaken panatt’s guard, which propagated nil state to downstream functions. v2 correctly skips panatt entirely for new drawings.
Bug 101: AutoCAD 2027 Crash on Exit — System.ExecutionEngineException in coreclr_shutdown¶
Discovered: April 7, 2026 (Test 1 — Create New Project succeeded, crash occurred while closing AutoCAD)
Severity: Low (crash on exit only — user data safe, no work lost)
Status: ⚠️ External (Autodesk bug — no CV code fix possible)
Symptom: After successfully completing Test 1 (New Project workflow), user closes AutoCAD 2027. AutoCAD crashes with “A software problem has caused AutoCAD to close unexpectedly” CER dialog. Minidump generated at
%LOCALAPPDATA%\Autodesk\CER\...\1775583845586\.Root Cause:
System.ExecutionEngineExceptionthrown during .NET Core CLR shutdown sequence (coreclr_shutdown/coreclr_shutdown_2). The VLISP runtime (vl_u_crx.dll, PDB:U:\develop\local\current\Release64\bin\acad\vl_u_crx.pdb) callsacedGetAcadFrame()during teardown, but the managed AutoCAD frame object has already been finalized by the .NET Core garbage collector. This is a race condition in Autodesk’s shutdown orchestration between the native VLISP runtime and the .NET Core managed layer.Evidence from minidump:
Exception:
System.ExecutionEngineExceptionStack reference:
<Module>.acedGetAcadFrame()CLR functions:
coreclr_shutdown,coreclr_shutdown_2Crash thread: 32508, PID: 15740
Application:
AcCoreConsole.exe(AutoCAD 2027 R26.0, build 26.0.60.0.0)CER UUID:
e9e9428d-68af-43ff-b51e-2aabc7d45511
CV Code Analysis: Zero CV modules in loaded module list. No
vla-*/vlax-*calls executed (csv_help.lsp’svl-load-comnot invoked during Test 1). VLISP runtime loaded automatically because csv.lsp is in Startup Suite — this is normal and unavoidable.Impact: None on user workflow. Crash occurs only during AutoCAD exit. No data loss. The CER dialog is cosmetically annoying but functionally harmless.
Workaround: None needed (crash on exit only). If persistent, user can dismiss the CER dialog or disable CER reporting.
Resolution path: File with Autodesk via CER (“Send Report” button) referencing crash UUID
e9e9428d-68af-43ff-b51e-2aabc7d45511. This is the same DFMEA-035 failure class as Bug 93 but in the shutdown path rather than the runtime path.Files: None (no CV code change needed)
Commit: N/A
Lesson Learned: Same DFMEA-035 class as Bug 93 (coreclr + VLISP interop), but in shutdown path. Confirms that the .NET Core migration in AutoCAD 2025+ has systemic issues with VLISP runtime lifecycle management. Monitor for recurrence — if it happens during save or mid-operation, severity escalates.
Bug 102: New Drawing Dead End — pcr=T Kills Editor Launch¶
Discovered: April 7, 2026 (Test 2 — opened AAA001.dwg, clicked ConstructiVision > New Drawing, typed Panel, clicked Cancel on getfiled)
Severity: High
Status: ✅ Fixed
Symptom: After New Drawing → Panel → Cancel on file picker, nothing happens. No panel editor dialog appears. The user is left on the current drawing with no way to draw a new panel from scratch. The command line shows
[CSV] c:csv finished normallybut no editor was launched.Root Cause: The
*pc-new-drawing*dispatch block (progcont=262161) incsv.lspunconditionally set(set 'pcr T)after the getfiled call, regardless of whether the user picked a file or cancelled.pcr=Tprevents the default routing block from executing, which is where Paths 2 and 4 live — the code that actually launches the panel/site editor.Fix: Removed the unconditional
(set 'pcr T). Now:Cancel (user wants blank drawing):
pnl="autonew", pcr=nil → default routing Path 2 catchespnl="autonew"→ launches(panel)or(sdwg_dlg)based oncsv_dwgtype.Template selected:
pnl="old", olddwg set, pcr=nil → default routing Path 4 catches(and olddwg (= pnl "old"))→ opens drawing via(scr)→ S::STARTUP fires on new document → editor launches.Path 2 updated: Now respects
csv_dwgtype(set fromcsv_newdwg_type) to route to panel editor (ld="pt") or site editor (ld="st") instead of always defaulting to panel.
Impact: New Drawing workflow now works end-to-end for both cancel (blank scratch) and template selection paths, for both Panel and Site drawing types.
Files:
csv.lsp(both x32 and x64 builds)Commit: (pending)
Bug 103: cvxpproj.lsp Export Naming Mismatch — 19 of 21 Globals Exported as Null¶
Discovered: April 9, 2026 (parity audit of project detail variable lifecycle)
Severity: High
Status: 🔲 Open
Symptom: The
cvxpproj.lspvalidation export script reports null for 19 of 21 project detail runtime globals, even after the user has entered values via the Project Details dialog and the globals are populated in memory. Onlyconcpsiandconcpcfexport correctly.Root Cause: Naming mismatch between
projdet_edit()andcvxp-snapshot-globals(). Theprojdet_edit()accept callback stores 19 of 21 values withcsv_prefix (e.g.,csv_super,csv_dprec,csv_msys,csv_email). Onlyconcpsiandconcpcfuse bare names. Butcvxp-snapshot-globals()probes ALL variables with bare names (e.g.,super,dprec,msys,email) — these bare-name globals are never set. Complete mapping of all 21 mismatches documented in Project Data Persistence Architecture.Fix: Update
cvxp-snapshot-globals()to probecsv_-prefixed names first with bare-name fallback:(or (cvxp-safe-eval 'csv_super) (cvxp-safe-eval 'super)). Also add individualcsv_city/csv_state/csv_zipprobes (currently only the compositecszis exported).Impact: All project metadata export/diagnostics will report accurate values for the first time. Previously, every
c:cvxpprojdebugrun silently returned null for contact info, measurement system, precision, language, and page size — making validation data unreliable.Files:
scripts/validation-lsp/cvxpproj.lsp,scripts/validation-lsp/cvxpproj.schema.jsonCommit: (pending)
DFMEA Reference: DFMEA-040 (RPN 400)
Bug 104: Project Details Not Persisted to XRecord — Data Lost on AutoCAD Restart¶
Discovered: April 9, 2026 (parity audit — confirmed VLX persists across restarts, TB11 source mode does not)
Severity: Critical
Status: 🔲 Open
Symptom: User opens Project Details dialog, fills in all 21 fields (concrete PSI, contractor, superintendent, phones, email, measurement system, precision, language, page size), clicks OK. Values appear to be accepted. But after closing and reopening AutoCAD on the same drawing, all fields revert to defaults or blanks. Only contractor (
mpco), project location (mplo), and city/state/zip (ADD2) partially survive via title block ATTRIBs. The remaining 16 fields are completely volatile — lost every session.Root Cause:
projdet_edit()inprojdet.lspcorrectly captures all 21 values into globals via theaction_tile "accept"callback. But the function NEVER writes those globals to any persistent storage — no XRecord, no title block update, no file write. The globals exist only in the VLISP runtime memory and are destroyed when AutoCAD closes. The PB11 VLX has compiled persistence code that does not exist in the TB11 source tree (same class of VLX/source mismatch as Bug 13/progcont routing). This was previously mis-classified as a “feature request” — it is a regression from VLX behavior.Fix: Create a new
project_listNOD dictionary key (separate frompanel_listandsite_list) to store all 21 project detail variables. Implementation:Define
pdvaralist inconvert.lsp(21 variables with defaults)Add
csv_write-project-xrecordtoprojdet.lsp— called afterprojdet_editaccept, writes globals to NOD using DXF 1/2/3 format matchingpanel_listconventionAdd
csv_read-project-xrecordtoprojdet.lsp— called at startup and at top ofprojdet_edit, reads NODproject_listand sets globalsWire
csv_read-project-xrecordintocsvmenu.lspstartup chain
Impact: All 21 project detail fields will persist across AutoCAD sessions for the first time in source mode. Achieves parity with VLX behavior. Enables reliable export via
cvxpproj.lsp. Design documented in Project Data Persistence Architecture.Files:
projdet.lsp,convert.lsp,csvmenu.lsp,csv_diag.lspCommit: (pending)
DFMEA Reference: DFMEA-039 (RPN 210)
Bug 105: pjdll.lsp Text-Mode Line Reader — read-char Returns LF Not CR¶
Discovered: April 12, 2026 (pj.dll import testing — Project Details dialog showed empty schedule/notes/estimator)
Severity: High
Status: ✅ Fixed
Symptom: After implementing pj.dll import in
pjdll.lsp, the cipher decoder returned nil for all fields. Project Details dialog showed empty schedule, notes, and estimator fields despite pj.dll containing valid encrypted data.Root Cause:
csv_pjdll-read-line-bytesused(= ch 13)(CR) as the sole line terminator. AutoLISP(open filename "r")opens files in text mode on Windows, which translates CRLF sequences to LF at the C runtime level.read-chartherefore returns LF (byte 10) at line boundaries, never CR (byte 13). The line reader accumulated the entire file as one garbled line → the field-count check failed → decoder returned nil → all 58 pj.dll fields silently missing.Fix: Changed line terminator check from
(= ch 13)to(or (= ch 13) (= ch 10))— handles both text mode (LF) and any future binary mode (CR). Ref: AutoLISPopenfunction — text mode is default;read-charoperates on translated stream.Impact: pj.dll cipher decoder now correctly parses all 58 fields. Schedule, notes, and estimator data from pj.dll appear in Project Details dialog.
Files:
pjdll.lspCommit:
e16f8f898Key Insight: AutoLISP has no binary file mode —
(open ... "r")is always text mode on Windows. Any byte-level file reader must account for CRLF→LF translation. This affects all custom file parsers in the codebase.DFMEA Reference: DFMEA-041 (RPN 224)
Bug 106: projdet.lsp Import Gate — csv_contractor Already Filled by Title Block¶
Discovered: April 12, 2026 (same investigation as Bug 105 — pj.dll data not appearing)
Severity: High
Status: ✅ Fixed
Symptom: Even after fixing Bug 105 (line reader), pj.dll-exclusive fields (schedule, notes, estimator) still did not appear in the Project Details dialog. The pj.dll import code never executed.
Root Cause: The pj.dll import gate in
projdet.lspchecked(csv_is-empty csv_contractor)to decide whether to attempt pj.dll import. Butcsv_read-title-block+ the mp* variable bridge already populatedcsv_contractorfrom the drawing’s title block ATTRIBs earlier in the data retrieval hierarchy (NOD XRecord → title block → runtime globals → convert defaults). By the time the pj.dll import check ran,csv_contractorwas non-empty (set from title block) → the gate evaluated false → pj.dll import was skipped entirely. Fields that exist only in pj.dll (schedule, notes, estimator) were never imported.Fix: Changed the import gate from checking
csv_contractor(shared between title block and pj.dll) to checkingcsv_schedule,csv_notes, andcsv_estimator(pj.dll-exclusive fields). Gate now reads: “try pj.dll if ANY dll-exclusive field is still empty.”Impact: pj.dll import now correctly fires when pj.dll-exclusive data is missing, regardless of whether shared fields were already populated by higher-priority sources. Data retrieval hierarchy is now respected: NOD XRecord > title block > pj.dll > runtime globals > convert defaults.
Files:
projdet.lspCommit:
e16f8f898Key Insight: Import gates must check fields exclusive to the data source being gated, not shared fields that may be populated by higher-priority sources in the data retrieval hierarchy. This is a general pattern for any multi-source data pipeline.
DFMEA Reference: DFMEA-042 (RPN 280)
Bug 107: First c:csv Call Silently Aborts — *error* Masks panatt Failure During csv_dwgtype Detection¶
Discovered: April 14, 2026 (parity testing — cv-test-trace.lsp trace output)
Severity: High
Status: ✅ Fixed
Symptom: The first invocation of
c:csvafter module loading appears to return normally (no error visible tovl-catch-all-apply), butpcrstays nil,progcontis not cleared, andcsv_dwgtyperemains nil. The second and subsequent calls work correctly.Root Cause: On the first
c:csvcall, modules are freshly loaded viacsvlst(98 entries). The csv_dwgtype auto-detect block (Bug 63 fix) then runs Tier 1 detection:(dictsearch (namedobjdict) "panel")matches on CSB001.dwg → calls(panatt)directly. panatt errors on uninitialized state (first call after fresh load). The CSV*error*handler (csverror.lsp) catches the error, prints diagnostics, restores sysvars, and returns via(princ). This terminates c:csv mid-execution —(set 'csv_dwgtype "panel")never runs,(setq progcont nil)at line ~1271 never runs. Critically,vl-catch-all-applysees a NORMAL return (not an error object) because*error*intercepted the error before it could propagate. The caller has no indication that c:csv failed. On the second call, modules are already loaded AND panelvar is partially set from the first call’s panatt attempt → csv_dwgtype detection works correctly.Fix: Wrap the
(panatt)call inside the csv_dwgtype Tier 1 cond clause withvl-catch-all-applyto isolate panatt errors. If panatt errors, log a warning but still setcsv_dwgtype = "panel"(the NOD check already confirmed it IS a panel drawing). This makes the Tier 1 detection resilient to panatt initialization errors without aborting c:csv.Impact: Any caller using
vl-catch-all-applyto invoke c:csv (including the au3 test fixture’s(progn (setq progcont N)(c:csv))pattern) will now get correct routing on the first call. Eliminates the “warm-up call” requirement and fixes 4 cascading G2-panel test failures.Files:
csv.lspDFMEA Reference: DFMEA-043 (RPN 294)
Bug 108: matl_dlg.lsp Cond Default Has Stray = Operator — Materials List Crashes¶
Discovered: April 14, 2026 (parity testing — cv-test-diag.lsp diagnostic output)
Severity: High
Status: ✅ Fixed
Symptom: Calling
(matl_dlg)on a panel drawing with any custom block names (not matched by the material code prefix patterns) crashes witherror: too few arguments. The Materials List dialog never appears. Additionally, thenew_dialogfailure path used(exit)which silently terminated c:csv — replaced withcsv_matl-okguard-flag pattern.Root Cause: In
matl_dlg.lsp, the material code collation(mapcar ...)uses a(cond ...)to rename block name prefixes to human-readable names (PP* → Panel Prop, BP* → Blockout Prop, J_BOLT → J-Bolt, etc.). The default (catch-all) clause at line 513 (x32) / 516 (x64) reads:((T = (set 'matcnt (subst (list (strcat "Custom Block, " y) (cadr x)) x matcnt))))
This is malformed. The stray
=betweenTand(set ...)causes the cond to evaluate(= single-argument)— the=function requires exactly two numeric arguments. With one argument, it throws “too few arguments”. The correct syntax is:(T (set 'matcnt (subst (list (strcat "Custom Block, " y) (cadr x)) x matcnt)))
The outer
(( ))double-wrapping is also wrong — cond default clauses use single( ).Fix: Remove the stray
=and fix the parenthesization of the cond default clause.Impact: Materials List generation will work for all panel drawings, including those with custom block names not in the standard prefix table. This was the only real code bug in matl_dlg — the 15/17 PASS diagnostic confirmed all other handlers work correctly.
Files:
matl_dlg.lspDFMEA Reference: DFMEA-044 (RPN 168)
Bug 109: matl_dlg.lsp (cons) Misplaced Paren — wcl Default Entry Crashes Materials List¶
Discovered: April 13, 2026 (parity testing — cv-test-trace.lsp bisection tracing)
Severity: High
Status: ✅ Fixed
Symptom: Materials List route (progcont=263169) fails with
error: too few argumentsinsidematl_dlg. The error is caught by CSV’s*error*handler, which terminates c:csv mid-execution. The Materials dialog never appears. From the caller’s perspective, c:csv appears to complete normally (pcr=T from the*error*handler’s path, but no dialog shown).Root Cause: In
matl_dlg.lsp, when building the wall component list fromwcl.txt, if no entry with key0exists in the list, the code attempts to create a default entry using(cons). The closing parenthesis is misplaced:;; BUGGY (line 157 x32 / line 156 x64): (set 'wcl (cons (list 0 " " 0.0 0.0 0.0 "" "" "" "" "" "" "" 0.0 0.0)) wcl) ;; ^-- closes cons with 1 arg ;; wcl is standalone
The
)after(list ...)closesconswith only ONE argument.wclbecomes a standalone expression (evaluates but result is discarded).(cons single-arg)throws “too few arguments” —consrequires exactly 2 arguments. The correct form is:(set 'wcl (cons (list 0 " " 0.0 0.0 0.0 "" "" "" "" "" "" "" 0.0 0.0) wcl))
Only triggered when
wcl.txthas no entry with key 0. CSB001’swcl.txthas only keys 6 and 7 — no default entry. This is a pre-existing PB11 paren bug that was never caught because VLX test data always included a key-0 entry.Fix: Move the misplaced closing paren from after
(list ...)to afterwclsoconsreceives both required arguments. Applied to both x32 and x64 trees. Also fixed in same session: Bug 108(exit)replaced withcsv_matl-okguard-flag pattern to prevent silent c:csv termination on dialog load failure.Impact: Materials List now routes correctly on panel drawings where
wcl.txtlacks a default (key 0) entry. This was the final blocker for G2-panel parity — after this fix, all 6 progcont route tests pass (6/6 ROUTED).Files:
matl_dlg.lspDFMEA Reference: DFMEA-045 (RPN 175)
Bug 110: okcanhlp.lsp Cancel Handlers Missing (done_dialog) — 6 Dialogs Uncancellable¶
Discovered: April 14, 2026 (G2-panel retest — CV-TEST-PANEL stuck on test 4, View Select Layers)
Severity: High
Status: ✅ Fixed
Symptom: Running G2-panel validation (CV-TEST-PANEL), the test reaches test 4 (View Select Layers, progcont=262273). The layer dialog (
lyr_dlg) opens, but clicking Cancel, pressing Escape, or clicking X does nothing — the dialog is completely uncancellable. The only way to recover istaskkill /f /im acad.exe. Same pattern affects 5 other dialogs: Wall Line (wl), Non-Rect Blockout (nb), Window/Door Opening Page (wd), Weld Connections Page (wc), WC Edit (we).Root Cause:
okcanhlp.lspis the centralized OK/Cancel/Help callback router for ConstructiVision dialogs. When a dialog registers(action_tile "cancel" "(okcanhlp $key \"ly\")"), this replaces the DCL default cancel behavior(done_dialog 0).Ref:
action_tile— AutoLISP Reference: “The default action for a cancel tile is(done_dialog 0). If no action is assigned…” — when action IS assigned, the default is replaced.
6 dialogs route cancel through okcanhlp (confirmed by grep of all
action_tile "cancel"calls in TB11):File
Code
Cancel handler before fix
lyr_dlg.lsply(set 'pnl "cancel")— nodone_dialogwall_dlg.lspwl(set 'ok nil)— nodone_dialognb_dlg.lspnbempty — no
done_dialogwdpage.lspwdempty — no
done_dialogwcpage.lspwcempty — no
done_dialogwc_edit.lspwe(set 'ok "0")— nodone_dialoglyr_dlg.lspis the worst case: it has a(while (/= pnl "cancel") ...)loop at line 92 that depends onstart_dialogreturning. Cancel setspnl = "cancel"but never callsdone_dialog, sostart_dialogblocks forever and the while-loop condition is never re-evaluated.Note: The other ~31 cancel handlers in okcanhlp are dead code — those dialogs (ch, dl, dr, fh, etc.) handle cancel directly in their own
action_tilecalls with(done_dialog). Only these 6 actually route through okcanhlp.Fix: Added
(done_dialog)to all 6 cancel handlers inokcanhlp.lsp. State-setting handlers keep their state changes beforedone_dialog. Applied to both x32 and x64 trees.Impact: All 6 affected dialogs are now properly cancellable. The lyr_dlg while-loop now breaks correctly when the user clicks Cancel. This was the blocker for G2-panel test 4 (View Select Layers).
Files:
okcanhlp.lspDFMEA Reference: DFMEA-046 (RPN 168)
Bug 111: (command "CMD" ...) Without Dash Prefix Opens Dialog/Palette Mode — Silent Failures Across Entire Codebase¶
Discovered: April 13, 2026 (parity testing — G2-panel print routes all returning DEFAULT)
Severity: High
Status: ✅ Fixed
Symptom: All 4 print/layer routes (View All Layers, Print All, Print Setup, Print Select) returned DEFAULT in G2 panel test. No ERROR caught by
vl-catch-all-apply—*error*handler intercepted the error internally.pcrnever set toT. No visible crash, just silent failure to execute the route.Root Cause: Multiple AutoCAD commands changed from command-line to dialog/palette mode in AutoCAD 2006–2020+. When called via
(command "CMD" ...)in AutoLISP without the dash prefix (-CMD), the dialog/palette opens and returns immediately. Arguments intended as subcommands fall through to the command processor as invalid commands, triggering*error*silently.Affected commands and when they changed:
LAYER → Layer Properties Manager palette (AutoCAD 2000+, modeless since 2006)
INSERT → Insert Block palette/gallery (AutoCAD 2020+)
BLOCK → Block Editor (AutoCAD 2006+)
HATCH → Hatch Creation ribbon tab (AutoCAD 2011+)
ARRAY → Associative Array (AutoCAD 2012+)
PURGE → Purge dialog (AutoCAD 2020+)
The dash prefix (
-CMD) forces command-line mode on all versions. The_.prefix ensures English command + original definition (no menu overrides).Additionally, View All Layers used
(command "expert" 5)instead of(setvar "expert" 5).Fix: Codebase-wide bulk replace applied in two passes:
LAYER (
_.-layer): 70 instances across 17 files — applied to both x32 and x64.-LAYERexists since AutoCAD 2000 (R15).INSERT (
_.-insert): 31 instances across 8 files — applied to both x32 and x64.-INSERTexists since AutoCAD R14.BLOCK (
_.-block): 4 instances — x64 only.-BLOCKdid not exist in AutoCAD 2000.HATCH (
_.-hatch): 8 instances — x64 only.-HATCHdid not exist in AutoCAD 2000.ARRAY (
_.-array): 3 instances — x64 only.-ARRAYdid not exist in AutoCAD 2000.PURGE (
_.-purge): 1 instance — x64 only.-PURGEdid not exist in AutoCAD 2000.
Total: 117 instances fixed across 21 files in both build trees.
BLOCK/HATCH/ARRAY/PURGE are x64-only because the dash-prefix variants did not exist in AutoCAD 2000 (the commands were already command-line-only in R15 — their dialog modes were added in later versions). Applying dash prefix in x32 would break AutoCAD 2000 compatibility.
Impact: 4 G2-panel print tests should flip from DEFAULT to ROUTED (7/11 → potentially 11/11). All block insertion, hatching, arraying, and purging operations now safe on AutoCAD 2027. Eliminates an entire class of silent failure across the codebase.
Files:
csv.lsp,plt.lsp,md_dlg.lsp,site_dlg.lsp,grid_dlg.lsp,panatt.lsp,chamfer.lsp,drawpan.lsp,drawdim.lsp,drawdimlst.lsp,nbblock.lsp,opening.lsp,finpan.lsp,inspanel.lsp,lyr_dlg.lsp,makepan.LSP,layout.lsp,green.lsp,bolt.lsp,brace.lsp,pick.lsp,weldconn.lsp,pointmap.lspDFMEA Reference: DFMEA-047 (RPN 252)
Bug |
DFMEA # |
DFMEA Failure Mode |
Match? |
Notes |
|---|---|---|---|---|
93 |
35 |
COM/ActiveX VLA calls crash .NET Core CLR in AutoCAD 2024+ (coreclr.dll ACCESS_VIOLATION) |
NEW |
New runtime incompatibility class: legacy VLA API → COM interop → .NET Core CLR crash. Fix: use |
94 |
36 |
|
NEW |
v11.03 incorrectly replaced PB11’s .scr script-file approach with |
95 |
34 |
progcont dispatch context gate blocks valid entry-point commands |
Yes |
Bug 92 guard was too aggressive — blocked pc-edit-drawing from untitled Drawing1.dwg. Same failure class as DFMEA-034. Fix: exempt edit-drawing from guard. |
96 |
36 |
Default directory derived from dwgprefix (My Documents) instead of CV install dir |
NEW |
curdir=dwgprefix on Drawing1.dwg = My Documents. All getfiled dialogs defaulted to wrong dir. Fix: derive projdir from |
97 |
36 |
project() while loop condition never true on modern AutoCAD — getfiled never shown |
NEW |
|
98 |
— |
Silent failure: |
— |
Pre-existing code debt. |
99 |
— |
Silent failure: no error handler in c:csv — all errors abort silently |
— |
Pre-existing code debt. Fix: added error handler with [CSV-ERROR] output + sysvar restore. |
100 |
38 |
Panel data initialization assumed for all mp_dlg entry paths — panatt blocks new drawings |
NEW |
panatt guard fires on pnl=“new” because no XRecord exists yet. Downstream wclist crashes on nil file. Fix: skip panatt for new drawings, use convert. S=7 O=6 D=5 RPN=210. |
101 |
35 |
VLISP runtime ( |
Yes |
Autodesk bug. Crash on exit — not during CV operation. VLISP runtime calls |
102 |
13 |
New Drawing |
Yes |
progcont dispatch for 262161 always set |
103 |
40 |
Export naming mismatch — |
NEW |
|
104 |
39 |
Project details not persisted — |
NEW |
21 project detail values captured by |
105 |
41 |
AutoLISP text-mode |
NEW |
|
106 |
42 |
Import gate condition triggers on wrong field — blocks pj.dll-only data import |
NEW |
|
107 |
43 |
First c:csv call panatt error during csv_dwgtype Tier 1 detection — |
NEW |
On first c:csv, Tier 1 calls |
108 |
44 |
matl_dlg cond default clause has stray |
NEW |
matl_dlg.lsp line 513 (x32) / 516 (x64): |
109 |
45 |
|
NEW |
matl_dlg.lsp line 157 (x32) / 156 (x64): |
110 |
46 |
|
NEW |
|
111 |
47 |
|
NEW |
Codebase-wide class of silent failure. AutoCAD 2006–2020+ changed LAYER, INSERT, BLOCK, HATCH, ARRAY, PURGE from command-line to dialog/palette mode. |
112 |
48 |
47 |
Yes |
All 47 instances addressed across both x32/x64 trees. Automated script handled 34 dialog-load patterns. Manual restructuring for csvtech (nested if/else), btch_dlg/revision (precondition wrap), SHOW.LSP (if/else). Safety-critical exits retain |
113 |
48 |
12 |
NEW |
|
114 |
48 |
|
NEW |
csv.lsp line 569–570: |
115 |
48 |
30 unguarded |
Yes |
30 of 39 |
116 |
48 |
13 unguarded |
Yes |
13 of 22 |
Bug 112 — 47 (exit) Calls Violate Rule 19 (Silent Termination) — ✅ Fixed¶
Discovered: Static analysis sweep, April 2026
Severity: Medium (codebase-wide code debt, degrades debuggability)
Status: ✅ Fixed — 39 of 47 eliminated via restructuring, 8 retained with
[CSV-ERROR]diagnosticsSymptom: When any of 47
(exit)call sites fire, the entire calling chain terminates immediately with no diagnostic output, no sysvar restoration, and no command-line error message. Debugging requires source-level tracing to determine which(exit)fired and why.Root Cause: Legacy coding pattern.
(exit)was used as a shorthand abort in AutoLISP before structured error handling was established. Per Rule 19 of the project coding standards,(exit)is banned because it “terminates the entire calling chain with no diagnostic output.”Fix Applied (both x32 and x64):
34 dialog-load guards (automated via
scripts/fix-exit-guards.py):(if (not (new_dialog ...)) (exit))restructured to(if (new_dialog ...) (progn ...dialog code...) (princ "\n[CSV-ERROR] ..."))with(unload_dialog)moved outside the if/else. Files: bp_dlg, btch_dlg, calc_dlg, ch_dlg, dl_dlg, dr_dlg, dwgnew, dwgold, fh_dlg, fs_dlg, fv_dlg, grid_dlg(×2), invar, lb_dlg, let_dlg, ll_dlg, md_dlg, mp_dlg, new, num_dlg, pl_dlg, pp_dlg, progopts, rb_dlg, revision, ro_dlg, sb_dlg, sd_dlg, sdwg_dlg, site_dlg, slab_dlg, slope_dlg, ss_dlg, tp_dlg, ts_dlgcsvtech.lsp (2 exits → 0): Restructured into nested if/else —
(if (>= dcl_id 0) (progn (if (new_dialog ...) (progn ...dialog...) (progn [CSV-ERROR])) (unload_dialog)) (progn [CSV-ERROR])).(setq result 0)fallback on either failure path.btch_dlg.lsp (1 exit → 0): Precondition guard wrap —
(if (and curdir pnlname) (progn ...rest of function...))with[CSV-ERROR]diagnostic on nil guard.revision.lsp (1 exit → 0): Precondition guard wrap —
(if (and (boundp 'rev) rev (numberp rev) ...) (progn ...))with[CSV-ERROR]diagnostic.SHOW.LSP (1 exit → 0): Restructured to
(if (new_dialog ...) (progn ...dialog code...) (progn [CSV-ERROR] (unload_dialog))).makepan.LSP (4 exits RETAINED): Safety-critical database corruption guards.
(exit)kept as protection against corrupted data propagation.[CSV-ERROR]diagnostics added before each exit: “database integrity check failed”, “version mismatch”, “project name mismatch”, “panel not found”.panatt.lsp (3 exits RETAINED): Initialization guard exits in error handler restoration blocks.
(exit)kept as the outer guard of last resort.[CSV-ERROR]diagnostics added: “no panel data in drawing”, “panel dimension init failed”, “project path not determined”.cv-diag.lsp (1 exit): Diagnostic tool — acceptable, not a bug.
Final Count: 8 remaining
(exit)calls across both trees (7 with diagnostics + 1 diagnostic tool). Down from 47 original.Impact: Eliminates the largest class of silent failure in the codebase. Every future debugging session saved by diagnostic output pays back the refactoring cost.
DFMEA Reference: DFMEA-048 (RPN 315 → 30 post-fix)
Bug 113 — 12 Unguarded load_dialog Calls¶
Discovered: Static analysis sweep, April 2026
Severity: Medium (crash on missing DCL file)
Symptom: If a
.dclfile is missing from the Support File Search Path,load_dialogreturns a negative value. The 12 unguarded call sites pass this directly tonew_dialog, which either crashes or produces undefined behavior. Combined with Bug 112 (thenew_dialognil check →(exit)pattern), the net effect is still silent termination — but these 12 don’t even get that far.Root Cause: Inconsistent error checking. 34
load_dialogcall sites DO check the return value (vianew_dialognil check). These 12 were missed.Affected Files (all in both x32 and x64):
dwgnew.lsp:113—dwgtype.dcllyr_dlg.lsp:92—lyr_dlg.dclnb_dlg.lsp:84—nb_dlg.dclplt.lsp:210—plt_dlg.dclproject.lsp:57—project.dclproject.lsp:95—new.dclproject.lsp:104—new.dclwall_dlg.lsp:469—wall_dlg.dclwarning.lsp:15—warning.dclwc_dlg.lsp:45—wc_dlg.dclwc_edit.lsp:133—wc_edit.dclwd_dlg.lsp:42—wd_dlg.dcl
Fix: Add guard per Rule 19 pattern:
(set 'dcl_id (load_dialog "xxx.dcl")) (if (or (not dcl_id) (< dcl_id 0)) (progn (princ "\n[CSV-ERROR] xxx.dcl failed to load") (princ (strcat "\n findfile: " (if (findfile "xxx.dcl") "found" "NOT FOUND"))) (set 'pcr T) ) (progn ;; ... existing dialog flow ... ) )
DFMEA Reference: DFMEA-048 (RPN 120)
Bug 114 — Unguarded findfile "acad.exe" in csv.lsp¶
Discovered: Static analysis sweep, April 2026
Severity: Medium (crash on non-standard AutoCAD install)
Symptom:
csv.lspline 569–570 calls(findfile "acad.exe")twice and passes the result directly to(strlen ...)and(substr ...). Iffindfilereturns nil (portable AutoCAD, broken SFSP, sandboxed install), bothstrlenandsubstrcrash withbad argument type: stringp nil.Root Cause: Assumed
acad.exeis always findable via AutoCAD’s Support File Search Path. This is true for standard installations but not guaranteed.Fix: Store
findfileresult inacad_path, guard for nil, print[CSV-ERROR]diagnostic, setacaddirto empty string fallback. Preserves originalsubstr/strlenarithmetic on the happy path. Also eliminates the doublefindfilecall (was called twice — once forsubstr, once forstrlen):(set 'acad_path (findfile "acad.exe")) (if acad_path (set 'acaddir (substr acad_path 1 (- (strlen acad_path) 8) ) ) (progn (princ "\n[CSV-ERROR] acad.exe not found in search path") (set 'acaddir "") ) )
Applied to both x64 and x32
csv.lsp.DFMEA Reference: DFMEA-048 (RPN 45)
Bug 115 — 30 Unguarded (open ...) Calls — File I/O Crash Risk¶
Discovered: Static analysis sweep, April 2026
Severity: Medium (crash on file access failure — missing directory, locked file, read-only path)
Status: ✅ Fixed (high-risk sites) — 13/30 unguarded opens guarded in both x32 and x64. Remaining 17 are low-risk (log files, diagnostic tools, already-guarded-at-runtime).
Symptom: 30 of 39
(open ...)calls store the file handle without checking for nil. Downstream(write-line str f),(read-line f), and(close f)crash withbad argument type: FILE nilifopenreturns nil. Common triggers:curdiris nil/empty, target directory doesn’t exist, file is locked by another process, read-mode on file that was never created.Root Cause: AutoLISP’s
openfunction returns nil (not an error) when a file can’t be opened. Code assumes successful open without checking.Affected Files (30 unguarded, 9 guarded):
Already guarded (9): drread:104, engimp:104, makepan:88, matl_dlg:140, mbread:103, panatt:778, panatt:843, updvar:669, wsbread:103
Fixed — high-risk write-mode (12): centgrav:307✅, drawpan:545✅, dreng:309✅, inspanel:139✅, inspanel:504✅, makepan:146✅, matl_dlg:567✅, mbeng:444✅, savelay:65✅, updvar:114✅, updvar:644✅, updvar:691✅, wsbeng:311✅
Already guarded at runtime (1): panatt:819 — has
(if f (progn ... (close f)))in sourceLow-risk / deferred (17): csv:428/463/496/549 (log files), csv:586/607/1239 (log files), csvdebug:23 (diagnostic), csvtech:333 (diagnostic), btch:73, scr:142, wclist:76, layout:246 (read), pjdll:347/528 (read), tiltup:32 (read)
Special fix — makepan:146: Replaced infinite
(while (not f) ...)busy-wait loop with single open + if guard. The original loop would spin forever on invalid paths.
Fix Pattern: Wrap open→write→close blocks in
(if f (progn ...write-line...close...) (princ "\n[CSV-ERROR] cannot open ...")). AutoLISP has noreturn, so the entire downstream block must be inside the guard.DFMEA Reference: DFMEA-048 (RPN 125)
Bug 116 — 13 Unguarded (ssget ...) Calls — Nil Selection Set Crash Risk¶
Discovered: Static analysis sweep, April 2026
Severity: Medium (crash or hang if no matching entities found)
Status: ✅ Fixed (critical sites) — 4 high-risk sites guarded in both x32 and x64. 9 low-risk deferred.
Symptom:
ssgetreturns nil when no entities match the filter. Passing nil to(command "copy" sol ...),(command "erase" sol ...),(sslength nil), or(ssname nil 0)causes crashes (bad argument type: ENAME nil) or hangs (AutoCAD enters interactive selection mode waiting for user input).Root Cause: AutoLISP’s
ssgetreturns nil (not empty set) when no entities match. Code assumes entities always exist.Affected Files (13 unguarded, 9 guarded):
Already guarded (9): csv_diag:292, drawpan:392/423/528, grid_dlg:67, matl_dlg:181, slab_dlg:63, titleblk:79, wall_dlg:51
Fixed — critical (4 sites): finpan:303✅ (copy/erase 3DSOLID), finpan:310✅ (copy/erase INSERT), finpan:290✅ (rotate PERIMETER), drawpan:541✅ (massprop script with ssname)
Low-risk / deferred (9): drawpan:233/283/372/401/416/484/499/511, finpan:213 — mid-workflow selections where entities should always exist (just created by preceding commands)
Fix Pattern:
(if sol (progn (command "copy" sol ...) (command "erase" sol "")) (princ "\n[CSV-ERROR] ..."))DFMEA Reference: DFMEA-048 (RPN 125)
Open Issues¶
VLA/ActiveX audit for AutoCAD 2024+ compatibility— ✅ Completed. Full audit found zero unguarded VLA method calls in the TB11 main code path. All 44 grep matches were comments or safe VLISP built-ins (vlax-product-key,vl-load-com). Guard predicatescsv_is-modern-acadandcsv_is-dotnet-coreadded tocsvcompat.lsp. Copilot Rule added to prevent future regressions.S::STARTUP continuation not fully tested — The
(command "_.open" ...)+ cv-cont.lsp + S::STARTUP approach inscr.lsphas been pushed but not thoroughly tested across all workflow paths (new panel, new site, edit panel, edit site). Update: Trace confirms routing reaches scr() correctly and cv-cont.lsp is written, but the OPEN command itself fails (Bug 94) so the continuation never fires.CSSsite missing xref definitions — CSSsite does not have panel xrefs baked into the drawing. This is a data issue, not a code issue. Running Attach Panels on CSSsite would fix it.
Panel drawing workflow untested — All testing so far has been on site drawings. The panel editor path (md_dlg) needs validation.
Missing— Static analysis found 667 bare_.prefix on(command ...)calls(command "CMD" ...)calls across 42 unique command names without the_.(English + original) prefix. These work correctly on English AutoCAD but would fail on localized (non-English) AutoCAD installations. Not an active bug for the current English-only deployment, but logged as tech debt for future internationalization. Top offenders:ucs(92),pline(73),change(64),text(56),extrude(55).XData refactor planned — Replace fragile text file serialization (
tiltlist.txt,conslist.txt) with XData stored on INSERT entities. See XData Refactor Plan — Eliminate Text File Serialization for full design and implementation plan. This eliminates the entire class of serialization bugs (14, 15, 16, 17) and the fragiledel *list.txtcleanup.Bug 94:
_.OPENsub-prompt leak in AutoCAD 2027 —(command "_.open" fullpath "")still producesUnknown command "DWG". The trailing empty string andcmdactivedrain loop did NOT fix the issue. Root cause investigation needed: test_.OPENinteractively withfiledia=0in AutoCAD 2027 to determine the exact sub-prompt sequence. Possible causes: file format sub-prompt, SDI/MDI prompt, or the.dwgextension in the path being parsed as a separate token. This is the #1 blocking issue for the Edit Existing Drawing workflow. (DFMEA-36, RPN=140)