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 (project)

Session 1

3

High

✅ Fixed

dirchk false positive on project directories

dirchk.lsp

Session 1

4

Critical

✅ Fixed

#| |# block comments crash AutoCAD 2000 (load)

Multiple .lsp files

Session 1

5

Critical

✅ Fixed

(command "open" path) invocation/context failure in AutoCAD 2000

scr.lsp

Session 2

6

High

✅ Fixed

dbchk leaves SAVEAS active on unsaved drawings

csv.lsp routing

Session 2

7

Critical

✅ Fixed

VLX detection matches VLIDE runtime, skips source loading

csv.lsp

480c6fb

8

Medium

✅ Fixed

cv.bat/cvplst.bat creation crashes on read-only dirs

csv.lsp

480c6fb

9

High

✅ Fixed

Drawing type dialog asks every time (never persists)

csv.lsp

480c6fb

10

Medium

✅ Fixed

Tilt-Up crashes with FILE nil if Attach Panels not run

tiltup.lsp

337f000

11

Low

✅ Fixed

Inspanel.lsp filename capitalization confusing

inspanel.lsp

cd130c6

12

High

✅ Fixed

Attach Panels crashes lselsetp nil if no wall lines exist

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

401c1b1

15

High

✅ Fixed

Tilt-Up index bug — nn vs xn for pnllst lookup

tiltup.lsp

ad326f5

16

Critical

✅ Fixed

conslist.txt ENAME serialization — Layout crashes on re-read

savelay.lsp

96f693b

17

High

✅ Fixed

Layout index bug — nn vs xn for pnllst lookup

layout.lsp

96f693b

18

High

✅ Fixed

progcont routing reconstructed — all 17 menu items route correctly

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 setvars Function cancelled

...\Menus\Group1, Pop13

20

v7.0

104

Critical

✅ Workaround verified

Startup Suite VLX crash + missing Startup Suite entries

...\.Appload\Startup + acaddoc.lsp

21

v7.0

104

High

✅ Fixed

Edit Existing Drawing can’t find CSBsite1.dwg — missing Project Settings

...\Project Settings\CV\RefSearchPath


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

cv-menu-validation.au3

5ae65f8

23

104

Low

✅ Fixed

propertiesclose command doesn’t exist in AutoCAD 2000

cv-menu-validation.au3

5ae65f8

24

All

Medium

✅ Fixed

Validation screenshots overwrite — stale data contamination

cv-menu-validation.au3

18a503c

25

All

High

⚠️ Known

AutoIT false positive — error dialog detected as valid CV dialog

cv-menu-validation.au3

26

104

Medium

✅ Fixed

Git not on SSH PATH — CV Update.bat fails when run remotely

CV Update.bat

94ecb94

27

104

Low

✅ Fixed

CMD echo caret escaping corrupts generated acaddoc.lsp

CV Update.bat

94ecb94

28

104

High

✅ Fixed

csv.lsp not loaded in source-mode — acaddoc.lsp only loads menu

CV Update.bat, acaddoc.lsp

b0550d2

29

104

Critical

✅ Fixed

#| |# block comments in csvmenu.lsp crash source-mode loading

csvmenu.lsp

63ff0f3

30

104

High

🔍 Investigating

(alert) dialog in csvmenu.lsp blocks AutoIT — drawing open fails

csvmenu.lsp, acaddoc.lsp


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)

CV Update.bat


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 acadstk.dmp — 6 historical AutoCAD crashes (2008–2021)

acadstk.dmp (2 locations)

33

104

High

🔲 Open

AutoCAD crash opening CSBsite1.dwg — acadstk.dmp 0xC0000005 at _WinMain@16

acadstk.dmp

34

104

High

🔲 Open

cvplst not recognized — Batch Utilities hangs waiting for pnllist.txt

btch_dlg.lsp, csv.lsp

35

104

High

🔲 Open

CSBsite1.dwg not found — site drawing open fails

csv.lsp (progcont routing)


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

cv-tracer.lsp load fails — “no function definition: FBOUNDP” on AC2000 source-mode

cv-tracer.lsp, generate-cv-tracer.py

ce6fc3e7

83

All

High

✅ Fixed

G1/G2 drawing open fails — ClipPut+^v unreliable in AC2000 command-line mode

cv-trace-g1.au3, cv-trace-g2.au3

ce6fc3e7

84

108

Critical

✅ Fixed

AutoCAD crashes when G1/G2 continues executing after drawing open failure

cv-trace-g1.au3, cv-trace-g2.au3

0dd6d166

85

108

High

✅ Fixed

G1/G2 LISP strings arrive per-word reversed — Send(...,1) emits {ENTER} as literal text

cv-trace-g1.au3, cv-trace-g2.au3

f6b7e69


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

PANATT crashes — bad argument type: stringp nil on fresh panel drawing open (pc=1)

panatt.lsp

4630e005

87

108

High

✅ Fixed

MATL_DLG aborts with quit / exit abort(exit) called inside open dialog context; restructured to ssget-before-load_dialog; clean (princ) exit

matl_dlg.lsp

3e2a7c32

88

108

Medium

✅ Fixed

G2 CSBsite1 false negative — window detection fires before 59 XREFs finish loading

cv-trace-g2.au3

4630e005

89

108

High

✅ Fixed

(stringp x) not defined in AutoCAD 2000 AutoLISP via (load) — panatt nil-key guard crash

panatt.lsp

cd63f6c8

90

108

High

✅ Fixed

pc=262273 always routes to slyr_dlg (site layers) regardless of drawing type

csv.lsp

cd63f6c8

91

108

Medium

✅ Fixed

Print cleanup layer "s" "custom" fails on drawings without a “custom” layer → Function cancelled

csv.lsp

7f1bbfba

92

108

High

✅ Fixed

progcont > 1 dispatch has no project-context guard — CV commands run in unvalidated environment (no project loaded)

csv.lsp

a9146d1f


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 — coreclr.dll ACCESS_VIOLATION (0xC0000005) during Edit Existing Drawing

scr.lsp

64d8675a5

94

Local

High

✅ Fixed

Unknown command "DWG" — reverted to PB11 script-file OPEN approach

scr.lsp

40c3b7071

95

Local

High

✅ Fixed

Edit Existing Drawing blocked by Bug 92 guard when on untitled drawing

csv.lsp

e5ad3aa41

96

Local

High

✅ Fixed

Default project directory points to My Documents instead of CV Project Files

csv.lsp

e5ad3aa41

97

Local

High

✅ Fixed

Drawing Setup > Existing Project getfiled never shown — while loop condition always false

csv.lsp

e5ad3aa41

98

Local

Medium

✅ Fixed

(exit) in project() silently aborts on dialog load failure — no diagnostic output

csv.lsp

cb3a1a472

99

Local

Medium

✅ Fixed

No *error* handler in c:csv — unhandled errors silently abort with no diagnostics

csv.lsp

cb3a1a472

100

Local

High

✅ Fixed

“Create New Project” crashes with “This drawing has no panel data” — panatt blocks new drawings

mp_dlg.lsp, panatt.lsp, wclist.lsp

95730f624

101

Local

Low

⚠️ External

AutoCAD 2027 crash on exit — System.ExecutionEngineException in coreclr_shutdown via vl_u_crx

None (Autodesk bug)

102

Local

High

✅ Fixed

New Drawing dead end — pcr=T unconditionally set after getfiled kills editor launch

csv.lsp

103

All

High

🔲 Open

cvxpproj.lsp export naming mismatch — 19 of 21 globals exported as null

cvxpproj.lsp

104

All

Critical

🔲 Open

Project Details not persisted to XRecord — data lost on AutoCAD restart

projdet.lsp

105

Local

High

✅ Fixed

pjdll.lsp text-mode line reader — read-char returns LF (10) not CR (13), lines never terminate

pjdll.lsp

e16f8f898

106

Local

High

✅ Fixed

projdet.lsp import gate — csv_contractor already filled by title block, pj.dll-only fields never imported

projdet.lsp

e16f8f898

107

Local

High

✅ Fixed

First c:csv call silently aborts — *error* catches panatt failure during csv_dwgtype Tier 1, masks error from vl-catch-all-apply

csv.lsp

108

Local

High

✅ Fixed

matl_dlg.lsp cond default has stray = operator — Materials List crashes with “too few arguments”

matl_dlg.lsp

109

Local

High

✅ Fixed

matl_dlg.lsp (cons) misplaced paren — wcl default entry crashes with “too few arguments”

matl_dlg.lsp

110

Local

High

✅ Fixed

okcanhlp.lsp cancel handlers missing (done_dialog) — 6 dialogs uncancellable, lyr_dlg while-loop traps user

okcanhlp.lsp

111

Global

High

✅ Fixed

(command "CMD" ...) without dash prefix opens dialog/palette mode in modern AutoCAD — arguments fall through, *error* fires silently. Affects LAYER (70), INSERT (31), BLOCK (4), HATCH (8), ARRAY (3), PURGE (1) = 117 instances across 21 files

21 .lsp files (both x32/x64)

112

Global

Medium

✅ Fixed

47 (exit) calls violated Rule 19. 39 eliminated via restructuring (34 automated + 5 manual). 8 safety-critical exits retained with [CSV-ERROR] diagnostics (makepan×4, panatt×3, cv-diag×1)

40+ .lsp files (both x32/x64)

113

Global

Medium

✅ Fixed

12 load_dialog calls have no error check — nil/negative return value passed to new_dialog unchecked

12 .lsp files (both x32/x64)

114

Local

Medium

✅ Fixed

(findfile "acad.exe") in csv.lsp used in substr/strlen with no nil guard — crashes if acad.exe not on SFSP

csv.lsp

115

Global

Medium

✅ Fixed

30 unguarded (open ...) calls — 13 high-risk sites guarded with (if f (progn ...)) pattern. makepan:146 infinite busy-wait replaced. panatt:819 already guarded. 17 low-risk (logs/diag) deferred

12 .lsp files (both x32/x64)

116

Global

Medium

✅ Fixed

13 unguarded (ssget ...) calls — 4 critical sites guarded (nil→copy/erase/massprop). 9 low-risk mid-workflow deferred

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 .lsp edits had no effect — AutoCAD loaded the compiled csv.vlx binary instead.

  • Root Cause: The menu macros in csv.mnu, csv.mns, and csv.cui referenced csv.vlx directly. AutoCAD loaded the VLX (which bundles all modules) before any source files.

  • Fix: Renamed csv.vlx to csv.vlx.bak. Changed all 57 menu macros (19 per file × 3 files) from csv.vlxcsv.lsp. Deleted csv.mnc/csv.mnr cache 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: getfiled in project() used " " (space) as the file filter with flag 1 (Save mode). This showed all files but made it confusing.

  • Fix: Changed filter to "dwg" with flag 2 (Open mode) to show only drawing files.

  • File: csv.lspproject() 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.lsp with exact path matching against acaddir.

  • 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 .vlx bundles 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 _.open or 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/qsave on 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::STARTUP for deterministic document switching.

  • File: scr.lsp (document-switch path), related routing in csv.lsp

  • Key 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 dbchk ran on an unsaved Drawing.dwg, all subsequent (command ...) calls had their arguments eaten by the still-active SAVEAS dialog.

  • Root Cause: dbchk calls (command "qsave"). On an untitled drawing (Drawing.dwg), QSAVE triggers SAVEAS, which opens a file dialog and leaves cmdactive=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 in csv.lsp. The vla-open approach 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 whenever vl-load-com is called (which our new scr.lsp does). With *vlide* matching, the code took the vl-acad-defun path — 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 nil during csv startup.

  • 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.bat and cvplst.bat creation 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_dwgtype dialog — even after choosing “Site” repeatedly.

  • Root Cause: The csv_ask_dwgtype function was added as a fallback for drawings with no panel_list or site_list in 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_dwgtype with 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 nil when running “Tilt-Up Panels” from Site Options.

  • Root Cause: tiltup.lsp line 2 opens tiltlist.txt for reading. This file is created by inspanel.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.lsp

  • Commit: 337f000

  • Note: 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 I in Inspanel.lsp looks like lowercase l (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.lsp

  • Commit: cd130c6

Bug 12: Attach Panels Crashes on Missing Wall Lines

  • Discovered: Session 3 (Feb 24, 2026)

  • Severity: High

  • Symptom: error: bad argument type: lselsetp nil when running “Attach Panels” from Site Options on CSBsite1.

  • Root Cause: inspanel.lsp calls (ssget "x" ...) to find LINE entities on the WALLINE layer. If no wall lines exist (or the layer has no LINE entities), ssget returns 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) and nums (panel numbers) ssget results. Each shows an (alert) explaining what’s missing and returns cleanly instead of crashing.

  • File: inspanel.lsp

  • Note: 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):

    1. No recovery path: When WALLINE entities are missing (erased or drawing saved without them), inspanel had no way to regenerate them. Initial attempt using walllist.txt save/restore was broken because inspanel line 33 does del *list.txt (deletes all list files) before the recovery code runs.

    2. 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. But inspanel was never updated and still searches for TEXT entities on WALLINE. This is a latent PB11 bug that only manifests when walline() is called on a fresh site (or for recovery).

  • Fix (three parts):

    1. Moved walline to top-level in wall_dlg.lsp so it can be called from inspanel (was previously nested inside wall_dlg and only defined when the dialog ran).

    2. 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).

    3. 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.

    4. Inspanel recovery: When ssget returns nil for WALLINE entities, calls (walline) to regenerate from site dictionary data, then retries ssget. Removed broken walllist.txt approach.

  • 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 pair when Tilt-Up reads tiltlist.txt generated by inspanel’s fast path.

  • Root Cause: entget returns ENAME objects in DXF group 330 (owner pointer) and XData group -3. When prin1 writes these to a text file, it serializes them as <Entity name: 7ef73060> — a string that read cannot parse back into a valid association list. The read call either fails outright or produces malformed data that entmod rejects.

  • 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 'ENAME and 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.lsp uses 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 from pnllst into the saved tiltlst entry. However, the code used nn (the tiltlst loop index) to index into pnllst — should have used xn (the pnllst loop index). When tiltlst has more entries than pnllst, (nth nn pnllst) returns nil, producing (nil (0 . "INSERT") ...) which entmod rejects.

  • Fix: Changed (assoc -1 (nth nn pnllst)) to (assoc -1 (nth xn pnllst)).

  • File: tiltup.lsp — line 76

  • Commit: ad326f5

  • Note: This is a latent PB11 bug — the original production code has the same error. It only triggers when tiltlst and pnllst have 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 input when running “Layout Panels” a second time (with conslist.txt already present).

  • Root Cause: savelay.lsp stripped only the -1 entity name pair via (cdr x) but left group 330 (ENAME owner pointers like (330 . <Entity name: 1F>)) and group -3 (XData) in the output. When prin1 wrote these ENAME values to conslist.txt, (read (read-line f)) in layout.lsp could 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 in inspanel.lsp — checks (type (cdr p)) for 'ENAME and skips groups with code -3. Only serializable DXF groups (numbers, strings, lists) are written.

  • File: savelay.lsp — complete rewrite with proper formatting

  • Commit: 96f693b

  • Note: This is the conslist.txt counterpart of Bug 14 (tiltlist.txt). inspanel.lsp was fixed in Bug 14 but savelay.lsp was 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, causing entmod to silently fail or modify the wrong panel.

  • Root Cause: Identical to Bug 15 (tiltup.lsp). layout.lsp uses a double loop to match live panel entities (pnllst, indexed by xn) to saved layout data (conslst, indexed by nn). When a match is found, the code substituted the live entity name using (assoc -1 (nth nn pnllst)) — but nn is the conslst index. 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 the subst call.

  • File: layout.lsp — second-pass branch (~line 153)

  • Commit: 96f693b

  • Note: 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 “progcont is never read by any code” — this was wrong. The progcont variable 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 bitmasks

    • Source md_dlg.dcl (both PB11 and TB11) = “ConstructiVision – Panel Options” with string keys ("new", "old", "val", "pal", "vgp", etc.) — a completely different, lower-level dialog

    • VLX’s compiled c:csv reads progcont and routes to different dialogs per bitmask value. The source csv.lsp never reads progcont.

    • The csv.mnu menu 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.lsp lines 687–950:

    1. Lines 687–710: Comment block documenting all 17 progcont values

    2. Lines 713–729: Named constants for 12 unique progcont values

    3. Lines 730–758: Bug 92 guard (blocks dispatch without project context)

    4. Lines 762–990: Complete (cond routing dispatch for each progcont value

    5. Line 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 19: Missing Menu Registration Causes setvars Function Cancelled

Build: PB11 (Production Build 11 with VLX) VM: 103 (XP-Legacy)

  • Discovered: Session 5 (Feb 27, 2026) — AutoIT validation test campaign

  • Severity: Critical

  • Status: Fixed

  • DFMEA: 19 (NEW — Profile/registry configuration)

  • Symptom: “Edit Existing Drawing” menu item triggers error dialog: “ConstructiVision encountered an unexpected error. Your most recent changes cannot be saved. First Exit AutoCAD and re-open it…” with call stack showing setvarsFunction cancelled.

  • Root Cause: The AutoCAD profile’s Menus registry key was missing the Group1 and Pop13 entries that register the CSV menu. Without menu registration:

    1. AutoCAD does not load the CSV menu group on startup

    2. The csv.mnu file is never parsed

    3. When csv; command runs via (c:csv), the VLX loads but menu-dependent initialization may differ

    4. Certain code paths that rely on menu state fail with “Function cancelled”

    Registry entries required:

    • HKCU\Software\Autodesk\AutoCAD\R15.0\ACAD-1:409\Profiles\<<Unnamed Profile>>\Menus\Group1 = CSV C:\Program Files\ConstructiVision\csv

    • HKCU\Software\Autodesk\AutoCAD\R15.0\ACAD-1:409\Profiles\<<Unnamed Profile>>\Menus\Pop13 = CSV POP1

  • Discovery Method: AutoIT automated validation comparing VM 102 (working) vs VM 103 (failing). OCR of captured screenshots revealed the error dialog. Registry diff showed missing menu entries.

  • Fix: Add the two registry entries via reg add:

    reg add "HKCU\Software\Autodesk\AutoCAD\R15.0\ACAD-1:409\Profiles\<<Unnamed Profile>>\Menus" /v Group1 /t REG_SZ /d "CSV C:\Program Files\ConstructiVision\csv" /f
    reg add "HKCU\Software\Autodesk\AutoCAD\R15.0\ACAD-1:409\Profiles\<<Unnamed Profile>>\Menus" /v Pop13 /t REG_SZ /d "CSV POP1" /f
    
  • Impact: Any installation where the menu registration is incomplete (e.g., profile migration, registry corruption, incomplete installer run) will exhibit this failure. The fix should be added to Configure-ConstructiVision.ps1 for automated deployment.

  • Validation: Re-ran AutoIT validation on VM 103 after fix — all 11 screenshots now match VM 102 baseline.

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 csv at 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

  1. Phase 1 — Registry fix (Session 6): Identified missing Startup Suite entries (NumStartup/1Startup). Applied registry fix. AutoCAD still failed — crashed instead of loading VLX.

  2. Phase 2 — Crash analysis (Session 7): acadstk.dmp on VM 104 Desktop revealed 3 identical crashes:

    • ExceptionCode=0xC0000005 (Access Violation)

    • ExceptionAddress=0x440B73

    • Reading address 0x40 (null pointer + offset = null this pointer at ECX=0x0)

    • StackWalk: LocalizeReservedPlotStyleStrings+533 in acad.exe

    • Timestamps: Feb 27 9:48 PM, Feb 28 7:33 AM, Feb 28 7:55 AM

  3. Phase 3 — Binary comparison: VM 102’s acadstk.dmp (5 entries from 2008–2021) showed DIFFERENT crashes (HP plotter driver, OPM, ACDB15) — no LocalizeReservedPlotStyleStrings crash ever occurred on VM 102.

  4. Phase 4 — Binary analysis:

    acad.exe MD5 comparison (all 6,795,264 bytes):

    VM

    MD5 Hash

    Last Modified

    102 (working)

    6EB94B99B9B09DE5B8BC0D6C53AFEF10

    04/10/2008

    103 (working)

    6EB94B99B9B09DE5B8BC0D6C53AFEF10

    (matches)

    104 (crashing)

    E3A40A5A5EE98FF67ECE4B1F4B56E8AD

    02/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_FFFRFFFRF pattern followed by encoded serial data) — NOT executable code. PE compile timestamp is identical (0x36FA04B0 = March 25, 1999).

  5. 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).

  6. 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.lsp

    Original

    Identical content

    Plotter configs (.pc3 files)

    Identical set

    Identical set

    DLLs in ACAD2000 directory

    All match

    All match

    DefaultConfig (printer)

    Symantec Fax Starter Edition

    Microsoft 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.

  7. 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:

    1. Missing Startup Suite entries — v7.0(patch) installation did not register CSV.VLX in the AutoCAD Startup Suite

    2. Environment-dependent crash during early VLX loading — When VLX loads via Startup Suite (very early in initialization), LocalizeReservedPlotStyleStrings crashes 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):

    1. Disable Startup Suite (prevent crash):

      reg add "HKCU\...\Appload\Startup" /v NumStartup /t REG_SZ /d 0 /f
      
    2. Deploy acaddoc.lsp to C:\Program Files\ACAD2000\support\:

      ;;; acaddoc.lsp - ConstructiVision deferred VLX loader
      (if (not (boundp 'c:csv))
        (progn
          (load "CSV.VLX")
          (princ "\nConstructiVision loaded.\n")
        )
      )
      (princ)
      
    3. Deploy acad.lsp to C:\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)
      )
      
    4. Original acad.exe restored — 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 loader

    • C:\Program Files\ConstructiVision\acad.lsp (778 bytes) — S::STARTUP backup loader

    • C:\Program Files\ACAD2000\acad.exe — original binary restored (MD5 E3A40A5A5EE98FF67ECE4B1F4B56E8AD)

    • 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 (MD5 6EB94B99B9B09DE5B8BC0D6C53AFEF10)

    • reports/vm-compare/acad-vm104.exe — VM 104 original (MD5 E3A40A5A5EE98FF67ECE4B1F4B56E8AD)

    • 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.lsp or S::STARTUP is 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.rul lines 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 at C:\Program Files\ConstructiVision\Project Files\ConstructiVision Sample Building\CSBsite1.dwg but 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 Settings key but no CV subkey — 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 to Configure-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.dwg in 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\ConstructiVision path is a junction pointing to C:\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.au3 from forward to backslashes.

  • Commit: 5ae65f8

  • Impact: 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 propertiesclose to dismiss the Properties palette, but this command was introduced in AutoCAD 2004+. It does not exist in AutoCAD 2000 (R15.0).

  • Fix: Removed propertiesclose from the AutoIT script.

  • Commit: 5ae65f8

  • Lesson 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.bmp files 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. Added latest-run.txt pointer file for easy discovery of the most recent run.

  • Commit: 18a503c

  • Lesson 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.bmp was actually the “Cannot find the specified drawing file” error dialog

  • Severity: 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 /pull failed with 'git' is not recognized

  • Severity: Medium

  • Status: ✅ Fixed

  • DFMEA: 26 (NEW — Remote deployment PATH issue)

  • Symptom: Running CV Update.bat /pull via 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" to CV Update.bat before any git operations. Alternatively, must prepend this when running remotely.

  • Commit: 94ecb94

  • Lesson 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 ^( characters

  • Severity: Low

  • Status: ✅ Fixed

  • DFMEA: 27 (NEW — Batch file string escaping)

  • Symptom: The acaddoc.lsp generated by CV Update.bat’s CONFIGURE_STARTUP subroutine contained literal caret characters: ^(VLX^) instead of (VLX).

  • Root Cause: In CMD batch files, parentheses inside echo statements require escaping with ^ when inside if/else blocks. 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: 94ecb94

  • Lesson 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 28: csv.lsp Not Loaded in Source-Mode — acaddoc.lsp Only Loads Menu

Affects: TB11 source-mode VM: 104 (XP-TEST)

  • Discovered: Session 9 (Feb 28, 2026) — Diagnostic LISP showed c:csv unbound after startup

  • Severity: High

  • Status: ✅ Fixed

  • DFMEA: 28 (NEW — Incomplete source-mode loading chain)

  • Symptom: After deploying TB11-01x32 in source-mode (no VLX), typing csv at the command line returned Unknown command "CSV". The ConstructiVision menu appeared in the menu bar (csvmenu.lsp loaded successfully), but no ConstructiVision commands were defined.

  • Root Cause: The acaddoc.lsp generated by CV Update.bat’s CONFIGURE_STARTUP subroutine only loaded csvmenu.lsp in the source-mode fallback. csvmenu.lsp only loads the pull-down menu — it does NOT define c:csv or any other ConstructiVision commands. Those are defined in csv.lsp, which was never loaded.

    In VLX mode, this wasn’t an issue because CSV.VLX bundles everything (menu loader + all commands). In source-mode, csvmenu.lsp and csv.lsp must be loaded separately.

  • Fix: Added (if (findfile "csv.lsp") (load "csv.lsp")) after the csvmenu.lsp load in the generated acaddoc.lsp.

  • Commit: b0550d2

  • Impact: Without this fix, the ConstructiVision menu is visible but every command fails with “Unknown command”. This is a 100% failure rate for source-mode installations.

  • Lesson Learned: Source-mode loading requires explicit loading of BOTH csvmenu.lsp (menu structure) AND csv.lsp (command definitions). VLX bundles mask this dependency.

Bug 29: #| |# Block Comments in csvmenu.lsp Crash Source-Mode Loading

Affects: TB11 source-mode VM: 104 (XP-TEST)

  • Discovered: Session 10 (Feb 28, 2026) — OCR analysis showed error: no function definition: COMMERCIAL at startup

  • Severity: Critical

  • Status: ✅ Fixed

  • DFMEA: 4 (Same class as Bug 4 — #| |# block comment limitation)

  • Symptom: AutoCAD command line showed error: no function definition: COMMERCIAL immediately at startup. All subsequent ConstructiVision commands failed with Unknown command "CSV" / no function definition: C:CSV. The word “COMMERCIAL” appeared in the copyright header text inside a #| |# block comment.

  • Root Cause: csvmenu.lsp contained two #| |# block comment regions:

    1. Copyright header (lines 1–54): Legal text including “COMMERCIAL Computer Software”

    2. Technical header (lines 56–118): Architecture documentation

    AutoCAD 2000’s (load) function does not support #| |# block comment syntax. Only the Visual LISP IDE and compiled .vlx bundles parse them correctly. When csvmenu.lsp was loaded via (load "csvmenu.lsp") in acaddoc.lsp, the LISP parser treated the copyright text as executable code. It encountered COMMERCIAL as a function call → error: no function definition: COMMERCIAL.

    This crashed csvmenu.lsp loading entirely. Since csvmenu.lsp never loaded, the (csvmenu) auto-execute never ran (no menu), and the subsequent csv.lsp load (Bug 28 fix) also worked but c:csv was never properly initialized because the loading chain was broken.

    Why only TB source-mode: In PB builds, CSV.VLX is loaded instead. VLX compilation uses the Visual LISP compiler which handles #| |# correctly. The block comments in csvmenu.lsp were invisible in VLX mode — they only manifest when loading raw .lsp source.

    Why missed in Bug 4: Bug 4 (Session 1) cleaned #| |# from “multiple .lsp files” but occurred on VM 108 (Win10) with a different set of files. The block comments in csvmenu.lsp may have been added after Session 1 (during documentation headers), or csvmenu.lsp was not included in the Session 1 cleanup scope.

  • Fix: Converted both #| |# block comment regions to ;;; line comments, following the project coding standard (which already bans #| |#).

  • Commit: 63ff0f3

  • Files Changed: src/x32/TB11-01x32/csvmenu.lsp, src/x64/TB11-01x64/csvmenu.lsp

  • Impact: Without this fix, source-mode loading is 100% broken. No menu, no commands, no functionality.

  • Lesson Learned: The #| |# ban in coding standards exists for exactly this reason. Every .lsp file in the repository should be audited for #| |# usage, especially after adding documentation headers.

Bug 30: (alert) Dialog in csvmenu.lsp Blocks AutoIT Validation — Drawing Open Fails

Affects: TB11 source-mode + AutoIT validation VM: 104 (XP-TEST)

  • Discovered: Session 10 (Feb 28, 2026) — After Bug 29 fix, manual validation showed “Cannot find the specified drawing file” for CSB001.dwg

  • Severity: High

  • Status: 🔍 Investigating

  • DFMEA: 30 (NEW — Modal dialog blocks automation timing)

  • Symptom: After Bugs 28 and 29 were fixed, manual AutoIT validation on VM 104 showed CSB001.dwg failing to open with “Cannot find the specified drawing file” error at Phase 00. All other phases (CSV command, dialogs, menus) worked correctly — ConstructiVision loaded successfully in source-mode.

  • Suspected Root Cause: When csvmenu.lsp loads successfully (post Bug 29 fix), the (csvmenu) auto-execute at the end runs immediately. This function calls (alert msg) which displays a modal dialog:

    “The ConstructiVision menu has been installed.”

    This alert blocks acaddoc.lsp from completing. The AutoIT script’s _HandleStartupDialog() only looks for windows titled “Startup” or “Create New Drawing” — it does NOT recognize the (alert) dialog (which has an “AutoCAD” or “AutoCAD Message” title).

    Timing chain:

    1. AutoCAD starts → Drawing1 opens → acaddoc.lsp runs

    2. (load "csvmenu.lsp")(csvmenu) auto-executes → (alert msg) BLOCKS

    3. AutoIT: _HandleStartupDialog() looks for “Startup” — not found (7-second timeout)

    4. AutoIT: Phase 1 sends (setvar "filedia" 0)_SendToCommandLine sends Escape

    5. Escape MAY dismiss the alert, but then csv.lsp starts loading (LISP evaluator busy)

    6. Phase 1 sends open + {ENTER} + path — but command line may be in wrong state

    7. Result: “Cannot find the specified drawing file” or garbled command

    Additional factor: LISPINIT=1 (LISP reinitializes per document) means acaddoc.lsp runs AGAIN for every new document, showing the alert dialog a second time. This explains the “CSV loaded twice” observation.

    Why VLX mode worked: In VLX mode, CSV.VLX is loaded by acaddoc.lsp but the VLX’s initialization may not trigger (csvmenu) auto-execute (VLX compilation behavior differs from raw source loading). Even if it does, the VLX loading is faster, changing the timing enough for AutoIT to succeed.

  • Proposed Fix (two-part):

    1. Suppress alert in auto-load mode: Add csv_silent_load guard variable. Set it in acaddoc.lsp before loading csvmenu.lsp. In csvmenu.lsp, check the variable: use (princ) instead of (alert) when set.

    2. Set LISPINIT=0 in acaddoc.lsp: Prevents LISP reinitialization per document. Variables persist, (boundp 'c:csv) guard works, no double-load.

  • Impact: Blocks Phase 00 (drawing open) in automated validation. All subsequent phases work because they don’t depend on the drawing open succeeding at Phase 00 timing.

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:

    1. Startup Suite empty — no CSV.VLX or csv.lsp in AutoCAD’s Startup Suite

    2. Search path missingC:\Program Files\ConstructiVision not in AutoCAD’s support file search path

    3. Project paths missingProject Settings\CV\RefSearchPath not set, so project drawings and XRefs cannot be found

  • Root Cause: CV Update.bat’s CONFIGURE_STARTUP, CONFIGURE_SEARCH_PATH, and CONFIGURE_PROJECT subroutines all write to HKCU (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-user

    • The 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:

    1. CV Update enumerates user profiles: Iterate HKEY_USERS SIDs and configure all loaded profiles, plus use HKLM\..\Profiles as a template for new users

    2. CV 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

    3. First-run detection in csvmenu.lsp: Add a check in csvmenu.lsp or acaddoc.lsp that detects missing configuration and self-configures on first AutoCAD launch per user

    4. Default 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 (setvars Function cancelled)

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.lsp loader 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.bat on 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:

    1. Filesystem: CV Update.bat removes and recreates the C:\Program Files\ConstructiVision junction. While Terry’s AutoCAD has CSV.VLX loaded 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/.vlx demand-loading) now resolves to TB11’s files instead of PB11’s — causing undefined behavior.

    2. Registry: CV Update.bat calls :CONFIGURE_STARTUP which writes to HKCU. On a multi-user VM, this only changes Administrator’s registry. Terry’s HKCU still points to CSV.VLX in 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.bat should check for running acad.exe processes and warn/abort if other users have AutoCAD open

    • Consider writing registry values for ALL user profiles (HKU enumeration, as implemented in cv-p0-step1.au3)

    • Add query session / query user check to detect concurrent logged-in users

    • Long-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 (_WriteGoldenLayout via HKU enumeration) to set DockWindow.Position and 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’s DockWindow.Position was 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:

    1. 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.

    2. VM 104: AutoCAD overwrites DockWindow.Position from its internal state on startup, ignoring pre-written registry values. The 3-row default is baked into AutoCAD’s initialization sequence for that profile.

    3. 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’s Send() function after AutoCAD is fully running. The setenv function writes to the active profile’s registry through AutoCAD’s own API, which correctly persists values across sessions. Expanded scope from just CmdVisLines to 8 classic settings:

    • CmdVisLines=6, CmdHistLines=2000, AcadClassic=1, CursorSize=100

    • Background=0, ToolTips=1, Scrollbars=1, MaxArray=999999

  • Impact: All 3 VMs now accept layout settings reliably. The setenv approach 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 Options dialog in TB source mode is missing the version subtitle line. Golden VM 102 (V11 Golden/VLX) shows ConstructiVision Tilt-Up and PreCast Software Version 11.00 2/4/2013 between 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.dcl file on VM 104 matches the repo exactly (2925 bytes, dated 03/02/2026). The DCL source includes a :row with two :text elements for the subtitle. The text is defined in the DCL but does not render visibly. Possible causes:

    1. The :text elements inside the :row may be rendering at zero height or clipped by AutoCAD 2000’s DCL layout engine

    2. DCL spacer_1 before/after the subtitle row may collapse the row on AutoCAD 2000

    3. The subtitle :row may need explicit height or fixed_height attributes to ensure rendering

    4. Difference between how AutoCAD 2000 renders the VLX’s embedded DCL vs runtime-loaded .dcl files

  • Evidence:

    • VM 102 (V11 Golden) OCR: Constructi¥ision Til-Up and PreCast Software Version 11.00 2/4/2013 at pixel row ~734

    • VM 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 Drawing

    • VM 109 (TB) OCR: Same absence

  • Fix (proposed): Test DCL variants — add explicit height = 1; to the :text elements, try fixed_height = true; on the :row, or convert from two :text elements in a :row to a single :text spanning the full width. Also verify: does this work on any standalone .dcl test 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 / :row elements render at zero height in runtime-loaded dialogs

  • Severity: 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 progopts dialog in TB source-mode shows all 14 buttons enabled, including Print Revision History and Print 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:

    1. Button graying logic too narrow: progopts.lsp only disabled matlist and revhist when (not olddwg). Five more project-dependent buttons (viewall, printlay, viewsel, printsel, 3dview) were left enabled — the V11 Golden VLX hides all 7.

    2. Default drawing detection too narrow: csv.lsp checked (= (getvar "dwgname") "Drawing.dwg") exactly, which misses Drawing1.dwg (Win10 AutoCAD 2000 default). When the check fails, olddwg gets set to "Drawing1.dwg" instead of nil, and no buttons get grayed.

    3. Remaining gap vs V11 Golden: The V11 VLX dialog hides the 7 project-dependent buttons entirely (not shown at all). The TB progopts.dcl grays 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):

    1. progopts.lsp: Expanded mode_tile disable list from 2 to 7 buttons — viewall, printlay, viewsel, printsel, 3dview, matlist, revhist are all grayed when (not olddwg).

    2. csv.lsp: Changed default drawing detection from exact string match "Drawing.dwg" to wildcard (wcmatch (strcase (getvar "dwgname")) "DRAWING*.DWG") to catch both Drawing.dwg (XP) and Drawing1.dwg (Win10).

    3. 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 olddwg gets 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.bat on VM 104 (Windows XP), the Version Manager picker displays Active build: unknown even though the junction C:\Program Files\ConstructiVision correctly points to TB11-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 dir output to extract the junction target from bracket notation. On Windows 10, dir shows junctions as:

    03/02/2026  12:00 PM  <JUNCTION>  ConstructiVision [C:\Repos\...\TB11-01x32]
    

    On Windows XP, dir shows junctions created by Sysinternals junction.exe the 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, JLINK is never set and CURRENT remains “unknown”. The script still functions correctly (junction switching works), but the status display is wrong.

  • Fix (proposed): Add XP fallback detection path using junction.exe or fsutil 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 dir bracket parsing fails on XP

  • Severity: 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:csv on VM 108 (Win10, default Drawing1.dwg) shows TWO modal dialogs in sequence: first project() (“ConstructiVision – Project Options”), then progopts (“ConstructiVision - Program Options”). The au3 test fixture sends a single Escape which dismisses project(), but progopts then 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.lsp changed default drawing detection from exact "Drawing.dwg" match to (wcmatch ... "DRAWING*.DWG"), which correctly identifies Drawing1.dwg (Win10 default) and sets olddwg=nil. This is correct behavior — the bug is that csv.lsp had no guard for the case where project() is called and the user cancels. When project.dcl’s Cancel button sets pnl="cancel", csv.lsp proceeded to show progopts as a second dialog. Before Bug 40, Drawing1.dwg on Win10 didn’t match the exact string check, so olddwg was 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") ...). When project.dcl sets pnl="cancel", the routing block (including progopts) is skipped entirely, and pnl/ld are cleaned up in the else branch.

    • Used (/= pnl "cancel") instead of (not (= pnl nil)) because pnl is nil when project() 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 csv in AutoCAD → VLX registration/licensing code triggers FATAL ERROR -- FILES MISSING alert. Same command works fine for Administrator.

  • Root Cause: The compiled VLX’s registration flow (CheckPanelCredit via pcms.arxcv.batwincss.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):

    1. cv.bat format corrected (added rem 20260309 as first line) — no fix

    2. HKLM registration data (status, lr, lic, gp, Registration blob, cssPC, cssRC) copied from VM 102 golden — no fix (hardware-locked)

    3. Registry ACLs: granted BUILTIN\Users FullControl on both HKLM\SOFTWARE\ConstructiVision, Inc and HKLM\SOFTWARE\ConstructiVision keys — no fix

    4. pcms.arx renamed to bypass CheckPanelCredit — no fix, restored

    5. Filesystem ACLs: granted Users:(OI)(CI)M on C:\Program Files\ACAD2000\, C:\Program Files\ConstructiVision junction, and junction target (PB11-00x32) — no fix

    6. “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.lsp fails to load with ; error: no function definition: FBOUNDP. All trace instrumentation absent — subsequent G0/G1/G2 runs produce no trace output.

  • Root Cause: fboundp is a Visual LISP function only available after (vl-load-com) has been called. In AC2000 source-mode, whether fboundp is available depends entirely on whether any previously loaded .lsp file called vl-load-com. On VM 108, csv.lsp initialization happens to call vl-load-com incidentally, so fboundp is available when cv-tracer.lsp loads. On VM 104, the initialization path never reaches vl-load-com before cv-tracer.lsp loads — so fboundp is undefined. Non-deterministic: depends on load order, not a reproducible property of the VM.

  • Fix: Added (vl-load-com) to cv-tracer.lsp before the first (fboundp) call. Also added to the generate-cv-tracer.py template so regeneration preserves the fix.

  • Files: src/x32/TB11-01x32/cv-tracer.lsp, scripts/generate-cv-tracer.py

  • Commit: ce6fc3e7

  • Lesson: Never assume Visual LISP extensions are available in source-mode without explicitly calling (vl-load-com). Any .lsp file using fboundp, 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-com has not been called prior to cv-tracer.lsp load

  • Severity: 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) then OPEN, then ClipPut("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) uses Send(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. Replaced ClipPut()+Send("^v") with Send(fullpath & ".dwg", 1) (slow typing). Matches the golden reference exactly.

  • Files: scripts/acad2000/cv-trace-g1.au3, scripts/acad2000/cv-trace-g2.au3

  • Commit: ce6fc3e7

  • Lesson: 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+^v fails to supply filename; drawing never opens; trace data collected from wrong drawing

  • Severity: 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, producing acad.err and acadstk.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 — FileCopy dump to output dir with timestamp before FileDelete.

  • Files: scripts/acad2000/cv-trace-g1.au3, scripts/acad2000/cv-trace-g2.au3

  • Commit: 0dd6d166

  • Evidence: 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 _SendProgcontSend(..., 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 characters

  • Symptom: All _SendProgcont calls 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 from C:\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 separate Send("{ENTER}") (no flag) for the keystroke. Applied to (setvar "filedia" 1) restore and _SendProgcont LISP expression in both G1 and G2.

  • Files: scripts/acad2000/cv-trace-g1.au3, scripts/acad2000/cv-trace-g2.au3

  • Commit: f6b7e69

  • Lesson: In AutoIt, Send(text, flag=1) sends ALL characters literally including {ENTER}, {TAB}, etc. Always split: Send(content, 1) then Send("{ENTER}"). Additionally, VM scripts are isolated copies at C:\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.lsp VM: 108 (Win10 x32) — confirmed from CSB001_1_1_3767.log G1 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

cdddr/cddddrvl-remove-if-not filter

Crash shifted

v2

Mar 21

prior

Nil guard expanded from 3→7 vars before convert

Crash persisted

v3

Mar 21

1a87b4c4

curdir nil → fallback to dwgprefix

Crash persisted

v4

Mar 21

f7b59d9a

Full DV1543 *error* handler; Guards 1–4

Graceful message; crash persisted

v5

Mar 21

4630e005

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 via vl-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):

  1. Key priority swap: "panel_list" checked first; "panel" only as fallback for drawings with no panel_list. Matches PB11 behavior exactly.

  2. panatt_nod_key variable: stores the resolved key so [P2] diagnostic reports which key was actually used (e.g. [P2] key=panel_list raw=247).

  3. 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_list and pv-sections=21, with pc=1 reaching progopts/md_dlg dialog without crashing.

DFMEA Reference (Bug 86)

  • DFMEA ID: Matches existing failure mode class — progcont target function called without prerequisite global state

  • Failure Mode: PANATT called via progcont routing before panelvar is initialized; crashes on first string operation

  • Severity: 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.au3 VM: 108 (Win10 x32) — confirmed from CSB001_1_1_3767.log G1 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, commit 3e2a7c32)

  • DFMEA: Matches existing class — matl_dlg called without required drawing structure in place

  • Symptom: (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 in 3e2a7c32).

  • Root Cause (architectural): matl_dlg.lsp uses (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 by inspanel.lsp when 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 0

    Individual 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.au3 updated to open CSBsite1.dwg before calling pc=263169, then re-open CSB001.dwg for the Revision History (pc=264193) test. matl_dlg.lsp ssget 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_dlg called cold without panel blocks present in expected layer/state

  • Symptom: (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 abort regardless 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 by bolt.lsp, green.lsp, drawdim.lsp, and brace.lsp after drawpan runs. CSB001 was created without any of these component blocks.

  • Fix: Restructured matl_dlg.lsp to 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 abort trace 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_dlg ssget finds no INSERT entities on layer “0”; aborts with alert; Materials List inaccessible

  • Severity: 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.au3 VM: 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.au3Sleep(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.lsp VM: 108 (Win10 x32)

  • Discovered: March 21, 2026 — G1 run cv-trace-g1-20260321-152728

  • Severity: 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.lsp VM: 108 (Win10 x32)

  • Discovered: March 21, 2026 — G1 run cv-trace-g1-20260321-152728

  • Severity: 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.lsp VM: 108 (Win10 x32)

  • Discovered: March 21, 2026 — G2 run cv-trace-g2-20260321-155922

  • Severity: 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:

  1. Alert: “No project is loaded. Select Drawing Setup to load or create a project.”

  2. Set pcr T (suppress default-path fallthrough)

  3. 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

#||# block comment limitation — add to DFMEA as toolchain risk

5

(Platform — not predicted)

NEW

(command "open") invocation/command-state sensitivity in automation — add as platform-specific failure mode

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 Group1/Pop13 in profile Menus key; setvars undefined

20

v7.0

20

Startup Suite timing + environment

NEW

Startup Suite VLX loading crashes in LocalizeReservedPlotStyleStrings; crash NOT caused by 36-byte exe patch (disproven); suspected printer/plot config interaction; workaround: deferred loading via acaddoc.lsp

21

v7.0

21

Project path not registered

NEW

Missing Project Settings\CV\RefSearchPath; File Open dialog can’t find project drawings in subdirectories

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

propertiesclose doesn’t exist in R15.0; added in AutoCAD 2004+

24

24

Validation pipeline data integrity

NEW

Screenshot overwrite causes stale data; fixed with timestamped run directories

25

25

Validation false positive

NEW

_WaitForAnyDialog() matches error dialogs; OCR verification is mandatory for every run

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 acaddoc.lsp only loaded menu, not command definitions. VLX masks dependency.

29

4

#| |# block comment limitation

Yes

Same class as Bug 4 — recurrence in csvmenu.lsp headers added after Session 1 cleanup

30

(Automation — modal dialog timing)

NEW

(alert) from auto-executed (csvmenu) blocks AutoIT Phase 1 timing. LISPINIT=1 compounds issue.

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 LocalizeReservedPlotStyleStrings+533 during CSBsite1.dwg open on VM 104

34

32

cvplst.bat not on AutoCAD shell PATH

NEW

btch_dlg calls (command "shell" "cvplst ...") but cvplst.bat is in AutoCAD dir which is not necessarily on PATH when called from shell

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

AcDbMText::AcDbMTextAcDbWblockCloneFiler::usesReferencesAcDbDatabase::gsModelAcDbImpObject::dwgIn

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

respSdjhU3_x15+9CA — internal AutoCAD function

4

2020-11-04 20:07

0xC0000005

acopm.arx + ACDB15.dll

acrxEntryPointAcDbImpObject::closeAcDbLeader::getSplitCurvesacdbSaveAsDwg

5

2021-09-15 16:39

0xC0000005

acad.exe

acDocManagerPtr+19A34 — MDI document manager crash

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 — acdbSaveAsDwg called through AcDbLeader::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 LISPINIT and 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:

  1. Use full path: (strcat acaddir "cvplst") instead of bare cvplst

  2. Set the shell’s working directory to acaddir before calling cvplst

  3. Create cvplst.bat in curdir instead of acaddir

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

fboundp unavailable until vl-load-com called; VM104 init path never calls it. Fixed: (vl-load-com) added. S=5 O=6 D=4 RPN=120

83

Tooling: AutoIT drawing-open method incompatible with AC2000 command-line

NEW

ClipPut+^v fails in filedia=0 mode; bare filename fails path resolution. Fixed: full-path Send(...,1) slow-type matching golden reference. S=8 O=9 D=3 RPN=216

84

Tooling: automation continues past failed precondition, injecting keystrokes into broken state

NEW

G1/G2 _Fail() + “Continuing anyway” → _SendProgcont() fires into broken AC state → crash. Fixed: _Finish() after gate failure. S=9 O=10 D=2 RPN=180

85

Tooling: AutoIt raw-mode Send() emits {ENTER} as literal text; LISP never submitted

NEW

Send(text & "{ENTER}", 1) sends {ENTER} as characters. Fixed: split into Send(text,1) + Send("{ENTER}"). VM scripts isolated — must SCP, not git. S=8 O=9 D=3 RPN=216

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

PANATT called via pc=1 before drawpan runs; panelvar nil; crashes on first string op. Same class as Bug 41/52. True root cause: "panel" key checked before "panel_list" — VLX key yields only 2 sections. Fixed v5: key priority swap. S=6 O=7 D=3 RPN=126

87

13

matl_dlg called cold — (exit) inside open dialog context; spurious trace artifact

Yes

Root cause was open-before-check pattern: (load_dialog) + (new_dialog) before ssget. Fixed: ssget moved before (load_dialog); nil path uses (princ). D rating improves: 3→2 (trace now shows clean exit). RPN 147→126

88

25

Validation false negative — automation timing mismatch

Yes

G2 WinWait(CSBsite1) returns early; 59 XREFs not yet resolved on cold session; commands execute against incomplete drawing. Fixed: Sleep(1000)Sleep(20000). S=4 O=5 D=2 RPN=40

89

13

AutoLISP compatibility — function not defined via (load) path

Yes

(stringp x) is VLIDE-only; not available in (load)-mode AutoLISP. Same toolchain compatibility class as Bug 4. Fix: (= (type x) 'STR). D improves: 3→2 (test now catches this class).

90

18

Progcont routing not conditioned on drawing type

Yes

*pc-view-select* always dispatched to slyr_dlg; VLX checked drawing type. Fix: check csv_dwgtype; panel → plyr_dlg, site → slyr_dlg. Extends DFMEA #18 routing coverage.

91

3

Drawing state assumed without guard — missing layer causes unhandled error

Yes

Print cleanup assumes “custom” layer exists. CSBsite1 lacks it. layer "s" "custom"Function cancelled. Fix: (tblsearch "layer" "custom") guard; fallback to “0”. S=4 O=5 D=3 RPN=60

92

34

No project-context gate on progcont dispatch — CV commands run in unvalidated environment

NEW

progcont > 1 dispatch bypasses the (or (= acaddir curdir) (= olddwg nil)) check that the default path uses. CV runs with garbage curdir (ACAD install dir). Fix: pre-check before dispatch cond; alert + block. Exception: *pc-new-project* allowed. S=5 O=3 D=3 RPN=45. Added as DFMEA row #34.

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. The vl-catch-all-apply wrapper 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 NOT projdet.lsp or 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.lsp line 75 calls (unload_dialog dcl_id_pd) BEFORE lines 77-85 attempt (get_tile ...) to read field values. Per AutoLISP Reference, get_tile returns nil after unload_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_tile calls into the action_tile "accept" callback string, executing BEFORE done_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:

    1. 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.

    2. 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_.-layer command 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

(command "CMD" ...) dialog-mode (no dash prefix)

117

Critical

111

✅ Fixed

(exit) violations (Rule 19)

47 (39 eliminated, 8 retained with diagnostics)

High

112

✅ Fixed

load_dialog / new_dialog unchecked returns

12

High

113

✅ Fixed

findfile nil (acad.exe path)

1

High

114

✅ Fixed

(open ...) nil file handle

13 high-risk (17 low-risk deferred)

High

115

✅ Fixed

ssget nil selection set

4 critical (9 low-risk deferred)

High

116

✅ Fixed

Already Guarded — No Action Needed

Scan Class

Sites

Finding

getfiled nil (user cancel)

19

All 19 properly guarded with (if var ...)

getkword / getstring / getint

3

Handled by *error* handler on ESC

tblsearch nil

12

All used as boolean tests in if/and

(nth n list) out-of-bounds

1028

Returns nil, no crash

vla-* / vlax-* COM calls

0

Clean — no .NET Core risk

vl-* runtime calls

356

All safe VLISP built-ins (no COM methods)

Sysvar save/restore (filedia, cmdecho, etc.)

7 functions

Properly managed by csverror.lsp *error* handler

Infinite while loops

0 remaining

makepan:146 was the only one (fixed in Bug 115)

(command ...) with file operations

5

Normal AutoCAD operations (open, saveas, insert)

Low-Risk — Deferred

Scan Class

Sites

Risk

Reason Deferred

entget nil

57

Low

Entity names come from validated enames via ssget/entnext

eval / read injection

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 (strcat/substr with cdr/assoc)

18

Low

Filtered entity data guarantees expected DXF groups exist

Hardcoded paths

4

Low

csv_help.lsp (winhlp32), csvdebug.lsp (debug log), SHOW.LSP (R14 demo), dirchk.lsp (intentional guard)


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 spaces

  • QSAVE on untitled drawings triggers SAVEAS and leaves an active command

VLX vs Source Mode

  • The VLIDE runtime (*vlide*) loads into ARX independently of csv.vlx

  • VLX detection must check only for *csv* in the ARX list

  • vl-acad-defun only works when functions are compiled into a VLX; it’s a no-op otherwise

Binary Integrity & VLX Loading

  • acad.exe binary analysis: VM 104’s exe has a 36-byte registration/serial patch at offset 0x6452A0–0x645368 (data section, _R_FFFRFFFRF pattern). 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.exe files 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.lsp or S::STARTUP) is more robust.

  • The LocalizeReservedPlotStyleStrings crash 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, but dir "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 at command (XP task scheduler) is the only way to launch interactive processes from a non-interactive SSH session. start and wmic do 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 by type-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.bat now handles the full AutoCAD configuration lifecycle: search path, startup, project paths, and acaddoc.lsp generation. This replaced manual registry edits and the incomplete Configure-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 descriptor

  • Always check (ssget ...) return value before calling (sslength ...) — ssget returns nil when no entities match

  • Save 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

  • entget returns ENAME objects (group 330 owner pointer) that can’t survive prin1/read round-trip — always filter before serializing

  • Text 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 after vla-activate

  • S::STARTUP is 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.lsp called (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) inside coreclr.dll at 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-com call, acDocs and newdoc local 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: 64d8675a5

  • Lesson Learned: Never assume crash root cause from context alone — always examine the crash dump. The crash was initially attributed to vla-activate based on Autodesk forum posts about AutoCAD 2024+ crashes with ActiveX calls; the actual faulting module was coreclr.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 — _.open sub-prompt handling difference in AutoCAD 2025+)

  • Symptom: After Bug 93 fix replaced vla-open with (command "_.open" fullpath), the drawing still does not open. AutoCAD prints Unknown 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 LISP command function’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 "" and cmdactive drain 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 named scr() for this reason.

  • Fix: Reverted to PB11’s proven script-file mechanism (v11.04): write a .scr file 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% not curdir, (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:csv blocked the *pc-edit-drawing* progcont value (262145) because olddwg was 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: curdir was derived from (getvar "dwgprefix"). On an untitled Drawing1.dwg, dwgprefix returns the user’s Documents folder. The original code assumed curdir would equal acaddir (the AutoCAD program directory), but on modern installs where AutoCAD is in C:\Program Files\Autodesk\AutoCAD 2027\, the Documents folder does not match — so all directory comparison logic failed silently.

  • Fix: Added projdir computation 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. When olddwg is nil (untitled drawing), curdir is overridden with projdir.

  • 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 because curdir (derived from dwgprefix = My Documents) never equaled acaddir (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 the getfiled call inside the loop is never reached. The user clicks “Existing Project” and nothing happens — a complete silent failure.

  • Fix: Force loop entry by setting curdir to "" before the while loop, and replaced acaddir references inside the loop with projdir. 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_dialog fails in project(), (exit) terminates the entire c:csv call 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:csv execution (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:csv sets ~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 of c:csv that: (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 normally trace 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: cb3a1a472

  • Lesson 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 nil in wclist.lsp. The “Create New Project” workflow is completely blocked.

  • Root Cause: Two-part failure: (1) mp_dlg.lsp unconditionally called (panatt) to load panel XRecord data, even when pnl="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), causing bad argument type: FILE nil.

  • Fix (v2): (1) mp_dlg.lsp skips panatt when pnl="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: 95730f624

  • Lesson 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.ExecutionEngineException thrown 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) calls acedGetAcadFrame() 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.ExecutionEngineException

    • Stack reference: <Module>.acedGetAcadFrame()

    • CLR functions: coreclr_shutdown, coreclr_shutdown_2

    • Crash 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’s vl-load-com not 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 normally but no editor was launched.

  • Root Cause: The *pc-new-drawing* dispatch block (progcont=262161) in csv.lsp unconditionally set (set 'pcr T) after the getfiled call, regardless of whether the user picked a file or cancelled. pcr=T prevents 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 catches pnl="autonew" → launches (panel) or (sdwg_dlg) based on csv_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 from csv_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.lsp validation 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. Only concpsi and concpcf export correctly.

  • Root Cause: Naming mismatch between projdet_edit() and cvxp-snapshot-globals(). The projdet_edit() accept callback stores 19 of 21 values with csv_ prefix (e.g., csv_super, csv_dprec, csv_msys, csv_email). Only concpsi and concpcf use bare names. But cvxp-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 probe csv_-prefixed names first with bare-name fallback: (or (cvxp-safe-eval 'csv_super) (cvxp-safe-eval 'super)). Also add individual csv_city/csv_state/csv_zip probes (currently only the composite csz is exported).

  • Impact: All project metadata export/diagnostics will report accurate values for the first time. Previously, every c:cvxpprojdebug run 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.json

  • Commit: (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() in projdet.lsp correctly captures all 21 values into globals via the action_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_list NOD dictionary key (separate from panel_list and site_list) to store all 21 project detail variables. Implementation:

    1. Define pdvar alist in convert.lsp (21 variables with defaults)

    2. Add csv_write-project-xrecord to projdet.lsp — called after projdet_edit accept, writes globals to NOD using DXF 1/2/3 format matching panel_list convention

    3. Add csv_read-project-xrecord to projdet.lsp — called at startup and at top of projdet_edit, reads NOD project_list and sets globals

    4. Wire csv_read-project-xrecord into csvmenu.lsp startup 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.lsp

  • Commit: (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-bytes used (= 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-char therefore 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: AutoLISP open function — text mode is default; read-char operates 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.lsp

  • Commit: e16f8f898

  • Key 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.lsp checked (csv_is-empty csv_contractor) to decide whether to attempt pj.dll import. But csv_read-title-block + the mp* variable bridge already populated csv_contractor from 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_contractor was 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 checking csv_schedule, csv_notes, and csv_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.lsp

  • Commit: e16f8f898

  • Key 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:csv after module loading appears to return normally (no error visible to vl-catch-all-apply), but pcr stays nil, progcont is not cleared, and csv_dwgtype remains nil. The second and subsequent calls work correctly.

  • Root Cause: On the first c:csv call, modules are freshly loaded via csvlst (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-apply sees 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 with vl-catch-all-apply to isolate panatt errors. If panatt errors, log a warning but still set csv_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-apply to 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.lsp

  • DFMEA 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 with error: too few arguments. The Materials List dialog never appears. Additionally, the new_dialog failure path used (exit) which silently terminated c:csv — replaced with csv_matl-ok guard-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 = between T and (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.lsp

  • DFMEA 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 arguments inside matl_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 from wcl.txt, if no entry with key 0 exists 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 ...) closes cons with only ONE argument. wcl becomes a standalone expression (evaluates but result is discarded). (cons single-arg) throws “too few arguments” — cons requires 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.txt has no entry with key 0. CSB001’s wcl.txt has 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 after wcl so cons receives both required arguments. Applied to both x32 and x64 trees. Also fixed in same session: Bug 108 (exit) replaced with csv_matl-ok guard-flag pattern to prevent silent c:csv termination on dialog load failure.

  • Impact: Materials List now routes correctly on panel drawings where wcl.txt lacks 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.lsp

  • DFMEA 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 is taskkill /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.lsp is 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.lsp

    ly

    (set 'pnl "cancel") — no done_dialog

    wall_dlg.lsp

    wl

    (set 'ok nil) — no done_dialog

    nb_dlg.lsp

    nb

    empty — no done_dialog

    wdpage.lsp

    wd

    empty — no done_dialog

    wcpage.lsp

    wc

    empty — no done_dialog

    wc_edit.lsp

    we

    (set 'ok "0") — no done_dialog

    lyr_dlg.lsp is the worst case: it has a (while (/= pnl "cancel") ...) loop at line 92 that depends on start_dialog returning. Cancel sets pnl = "cancel" but never calls done_dialog, so start_dialog blocks 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_tile calls with (done_dialog). Only these 6 actually route through okcanhlp.

  • Fix: Added (done_dialog) to all 6 cancel handlers in okcanhlp.lsp. State-setting handlers keep their state changes before done_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.lsp

  • DFMEA 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. pcr never set to T. 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:

    1. LAYER (_.-layer): 70 instances across 17 files — applied to both x32 and x64. -LAYER exists since AutoCAD 2000 (R15).

    2. INSERT (_.-insert): 31 instances across 8 files — applied to both x32 and x64. -INSERT exists since AutoCAD R14.

    3. BLOCK (_.-block): 4 instances — x64 only. -BLOCK did not exist in AutoCAD 2000.

    4. HATCH (_.-hatch): 8 instances — x64 only. -HATCH did not exist in AutoCAD 2000.

    5. ARRAY (_.-array): 3 instances — x64 only. -ARRAY did not exist in AutoCAD 2000.

    6. PURGE (_.-purge): 1 instance — x64 only. -PURGE did 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.lsp

  • DFMEA 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 (command ...) wrappers. S=9 O=7 D=3 RPN=189. Affects all VLA calls.

94

36

(command "_.open" ...) sub-prompt leaks to command line — original PB11 used .scr script files

NEW

v11.03 incorrectly replaced PB11’s .scr script-file approach with (command "_.open" fullpath). The command pipeline leaks “DWG” as unknown command on ACAD 2027. Fix: revert to script-file OPEN with SDI/MDI-safe dbmod handling. S=7 O=5 D=4 RPN=140.

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 (findfile "csv.lsp").

97

36

project() while loop condition never true on modern AutoCAD — getfiled never shown

NEW

while (= acaddir curdir) false when curdir=My Documents. User clicks Existing Project, nothing happens. Fix: force curdir=“” before loop.

98

Silent failure: (exit) in project() terminates call chain with no diagnostic output

Pre-existing code debt. (exit) aborts c:csv entirely if dialog load fails. Fix: replaced with error msg + clean bail-out.

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 (vl_u_crx) triggers System.ExecutionEngineException during coreclr_shutdown

Yes

Autodesk bug. Crash on exit — not during CV operation. VLISP runtime calls acedGetAcadFrame() during .NET Core CLR teardown; managed frame already finalized. No CV code involved. Non-blocking: user data safe, crash only on exit. S=3 O=3 D=3 RPN=27.

102

13

New Drawing pcr=T unconditionally set — editor never launches after getfiled

Yes

progcont dispatch for 262161 always set pcr=T after getfiled, bypassing default routing Paths 2/4 that launch the panel/site editor. Cancel → dead end (no editor), template → dead end (file parsed but never opened). Fix: pcr stays nil; cancel → Path 2 (autonew → editor), template → Path 4 (old → scr → editor). Path 2 now respects csv_dwgtype for Panel vs Site. S=7 O=5 D=4 RPN=140.

103

40

Export naming mismatch — cvxp-snapshot-globals probes bare names for csv_-prefixed globals

NEW

cvxpproj.lsp probes super, dprec, msys etc. but projdet_edit stores csv_super, csv_dprec, csv_msys. 19 of 21 fields always export as null. S=5 O=10 D=8 RPN=400. Fix: probe csv_-prefixed first with bare fallback.

104

39

Project details not persisted — projdet_edit writes globals but never saves to XRecord or file

NEW

21 project detail values captured by projdet_edit exist only as volatile runtime globals. No XRecord write, no file write, no title block update. VLX has compiled persistence code absent from TB11 source. S=7 O=10 D=3 RPN=210. Fix: add project_list NOD dictionary with DXF 1/2/3 format.

105

41

AutoLISP text-mode (open "r") returns LF not CR — line reader checks only CR, lines never terminate

NEW

csv_pjdll-read-line-bytes checked only CR (byte 13) as line terminator. AutoLISP (open ... "r") is text mode on Windows, translates CRLF→LF. read-char returns LF (10), not CR (13). Entire file read as one garbled line → decoder returns nil → all pj.dll fields silently missing. S=7 O=8 D=4 RPN=224. Fixed: check CR OR LF.

106

42

Import gate condition triggers on wrong field — blocks pj.dll-only data import

NEW

projdet.lsp pj.dll import gated on csv_contractor empty. But csv_read-title-block + mp* bridge already populated contractor from drawing title block ATTRIBs. By the time pjdll import runs, contractor is non-empty → gate skips import entirely. pj.dll-exclusive fields (schedule, notes, estimator) never filled. S=7 O=8 D=5 RPN=280. Fixed: gate on pj.dll-exclusive fields instead.

107

43

First c:csv call panatt error during csv_dwgtype Tier 1 detection — *error* masks error, c:csv silently aborts

NEW

On first c:csv, Tier 1 calls (panatt) after fresh module load. panatt errors on uninitialized state. CSV *error* handler catches error, terminates c:csv mid-execution. vl-catch-all-apply sees NORMAL return (not error). progcont never cleared, csv_dwgtype stays nil. Second call works because panelvar partially set. S=7 O=7 D=6 RPN=294. Fix: wrap panatt in vl-catch-all-apply inside csv_dwgtype.

108

44

matl_dlg cond default clause has stray = operator — “too few arguments” crash

NEW

matl_dlg.lsp line 513 (x32) / 516 (x64): ((T = (set 'matcnt ...))). Stray = makes cond default evaluate (= single-arg) which requires 2 arguments → “too few arguments”. Fires on any material block name not matched by prior cond clauses (custom blocks). S=7 O=8 D=3 RPN=168. Fix: remove stray =.

109

45

(cons) misplaced paren — wcl default entry initialization crashes Materials List

NEW

matl_dlg.lsp line 157 (x32) / 156 (x64): (set 'wcl (cons (list 0 ...) ) wcl). Closing ) after (list ...) gives cons only 1 arg → “too few arguments”. Only triggers when wcl.txt has no key-0 entry (e.g., CSB001). Pre-existing PB11 paren bug. S=7 O=5 D=5 RPN=175.

110

46

okcanhlp.lsp cancel handlers missing (done_dialog) — 6 dialogs uncancellable

NEW

action_tile "cancel" overrides DCL default (done_dialog 0). If callback doesn’t call done_dialog, dialog stays open. 6 dialogs route cancel through okcanhlp: ly, wl, nb, wd, wc, we — none called done_dialog. lyr_dlg has while-loop checking pnl, but start_dialog never returns → user trapped. S=7 O=8 D=3 RPN=168. Fix: add (done_dialog) to all 6 cancel handlers.

111

47

(command "CMD" ...) without dash prefix opens dialog/palette mode — arguments fall through silently

NEW

Codebase-wide class of silent failure. AutoCAD 2006–2020+ changed LAYER, INSERT, BLOCK, HATCH, ARRAY, PURGE from command-line to dialog/palette mode. (command "CMD" args) opens dialog, args fall through to command processor, *error* catches silently. Fix: bulk replace to "_.-CMD" (command-line + English + original). 117 instances across 21 files. LAYER/INSERT: both x32+x64. BLOCK/HATCH/ARRAY/PURGE: x64 only (dash variants don’t exist in AutoCAD 2000). S=7 O=9 D=4 RPN=252.

112

48

47 (exit) calls violated Rule 19. Fixed: 39 eliminated via if/else restructuring + precondition guards. 7 retained with [CSV-ERROR] diagnostics (makepan×4 database corruption guards, panatt×3 initialization guards). 1 in cv-diag.lsp (acceptable diagnostic tool).

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 (exit) but now print [CSV-ERROR] diagnostics before terminating. S=5 O=2 D=3 RPN=30 (post-fix).

113

48

12 load_dialog calls missing error check — nil/negative return unchecked

NEW

load_dialog returns negative on failure. 12 call sites pass return value directly to new_dialog with no guard. If DCL file missing from SFSP, new_dialog receives garbage → crash or silent failure. S=5 O=6 D=4 RPN=120. Fix: add (if (or (not dcl_id) (< dcl_id 0)) ...) guard per Rule 19 pattern.

114

48

(findfile "acad.exe") in csv.lsp passed to substr/strlen with no nil guard

NEW

csv.lsp line 569–570: (substr (findfile "acad.exe") 1 (- (strlen (findfile "acad.exe")) 8)). If findfile returns nil (non-standard install, portable ACAD, broken SFSP), strlen crashes with “bad argument type: stringp nil”. S=5 O=3 D=3 RPN=45. Fix: guard with nil check, fall back to (getvar "ACADPREFIX").

115

48

30 unguarded (open ...) calls — nil file handle crashes downstream write-line/read-line/close

Yes

30 of 39 (open ...) calls store result without nil check. Downstream (write-line str f), (read-line f), (close f) crash with “bad argument type: FILE nil” if open fails. Common triggers: missing curdir, read-only directory, file locked. 9 calls already guarded with (if (set 'f (open ...)) pattern. S=5 O=5 D=5 RPN=125. Fix: wrap open+write+close blocks in (if f (progn ...) (princ "[CSV-ERROR]")).

116

48

13 unguarded (ssget ...) calls — nil selection set passed to command/sslength/ssname

Yes

13 of 22 (ssget ...) assignments don’t check for nil. Passing nil to (command "copy" sol ...) or (command "erase" sol "") hangs AutoCAD in interactive mode. (sslength nil) and (ssname nil 0) crash with “bad argument type”. 4 critical sites fixed (finpan copy/erase, drawpan massprop). 9 low-risk deferred (mid-workflow). S=5 O=4 D=5 RPN=100.


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] diagnostics

  • Symptom: 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_dlg

    • csvtech.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 .dcl file is missing from the Support File Search Path, load_dialog returns a negative value. The 12 unguarded call sites pass this directly to new_dialog, which either crashes or produces undefined behavior. Combined with Bug 112 (the new_dialog nil 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_dialog call sites DO check the return value (via new_dialog nil check). These 12 were missed.

  • Affected Files (all in both x32 and x64):

    1. dwgnew.lsp:113dwgtype.dcl

    2. lyr_dlg.lsp:92lyr_dlg.dcl

    3. nb_dlg.lsp:84nb_dlg.dcl

    4. plt.lsp:210plt_dlg.dcl

    5. project.lsp:57project.dcl

    6. project.lsp:95new.dcl

    7. project.lsp:104new.dcl

    8. wall_dlg.lsp:469wall_dlg.dcl

    9. warning.lsp:15warning.dcl

    10. wc_dlg.lsp:45wc_dlg.dcl

    11. wc_edit.lsp:133wc_edit.dcl

    12. wd_dlg.lsp:42wd_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.lsp line 569–570 calls (findfile "acad.exe") twice and passes the result directly to (strlen ...) and (substr ...). If findfile returns nil (portable AutoCAD, broken SFSP, sandboxed install), both strlen and substr crash with bad argument type: stringp nil.

  • Root Cause: Assumed acad.exe is always findable via AutoCAD’s Support File Search Path. This is true for standard installations but not guaranteed.

  • Fix: Store findfile result in acad_path, guard for nil, print [CSV-ERROR] diagnostic, set acaddir to empty string fallback. Preserves original substr/strlen arithmetic on the happy path. Also eliminates the double findfile call (was called twice — once for substr, once for strlen):

    (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 with bad argument type: FILE nil if open returns nil. Common triggers: curdir is 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 open function 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 source

    • Low-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 no return, 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: ssget returns 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 ssget returns 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

  1. 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 predicates csv_is-modern-acad and csv_is-dotnet-core added to csvcompat.lsp. Copilot Rule added to prevent future regressions.

  2. S::STARTUP continuation not fully tested — The (command "_.open" ...) + cv-cont.lsp + S::STARTUP approach in scr.lsp has 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.

  3. 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.

  4. Panel drawing workflow untested — All testing so far has been on site drawings. The panel editor path (md_dlg) needs validation.

  5. Missing _. prefix on (command ...) calls — Static analysis found 667 bare (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).

  6. 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 fragile del *list.txt cleanup.

  7. Bug 94: _.OPEN sub-prompt leak in AutoCAD 2027(command "_.open" fullpath "") still produces Unknown command "DWG". The trailing empty string and cmdactive drain loop did NOT fix the issue. Root cause investigation needed: test _.OPEN interactively with filedia=0 in AutoCAD 2027 to determine the exact sub-prompt sequence. Possible causes: file format sub-prompt, SDI/MDI prompt, or the .dwg extension 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)