Bug Tracker — Validation Campaign

Last Updated: March 1, 2026 Test Environments: VM 102/103/104 (XP), VM 108 (Win10 x32)

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

🔲 Open

progcont routing missing from source — VLX/source mismatch

csv.lsp, md_dlg.dcl, csv.mnu

GH #18


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


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

  • 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 Required: Reconstruct the missing progcont routing:

    1. Add progcont reading to csv.lsp — decode the bitmask and route to appropriate dialogs

    2. Reverse-engineer or rewrite the numeric-key md_dlg.dcl and md_dlg.lsp based on OCR evidence of the working VLX dialogs

    3. Map all 17 csv.mnu progcont values to their correct target dialogs

  • Previous Fix Options (superseded): The original Bug 18 proposed either implementing progcont routing OR consolidating menu items. Now that we know progcont routing WORKS in VLX mode, consolidation is not appropriate — the routing must be reconstructed.

  • Files: csv.lsp (routing), md_dlg.dcl (dialog definition), md_dlg.lsp (dialog handler), 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.


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


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 missing from source

Yes

Corrected Mar 1: NOT dead code — VLX reads progcont correctly. Source missing routing + wrong md_dlg. RPN upgraded 70→240

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.


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


Open Issues

  1. S::STARTUP continuation not fully tested — The vla-open + 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).

  2. Xref resolution after vla-open — When vla-open opens a drawing, xrefs may not auto-resolve the same way manual OPEN does. Needs testing on drawings with embedded xrefs (CBSsite1).

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