- Move backend/ and layout/ directories into src/ - Update all path references in ASD, scripts, docs - Convert README.org from Markdown syntax to proper Org-mode - Fix demo.lisp use-package conflict (both backend and input export #:read-event) - Fix modern-backend TIOCGWINSZ ioctl alien type (alien-sap wrapper) - Add v0.15.0 section to ROADMAP, update line count to 5760 - Add known gaps (suspend/resume-backend, slot modes) to v1.0.0 checklist - Remove docs/plans/, debug-layout.lisp, system-index.txt, ci-watchdog.sh - Move tangle.py to Hermes skill (org-babel-tangle) - Add .gitignore for fasl files
4.7 KiB
cl-tty Code Audit — Bug Report
Bug 1 [CRITICAL]: dialog rendering undefined functions
File: src/components/dialog-package.lisp and src/components/dialog.lisp
Problem: render-dialog (lines 34, 36, 39) and render-toast (lines 114, 115) call draw-rect, draw-border, draw-text without those symbols being available.
Root cause: The dialog package definition uses (:use :cl :cl-tty.input :cl-tty.select) but draw-rect, draw-border, and draw-text are generic functions exported from cl-tty.backend. They need to be imported. The package does NOT use cl-tty.backend.
Tests don't catch this because dialog-tests.lisp tests push/pop/toast management but never calls render-dialog or render-toast.
Fix: Add :cl-tty.backend to the :use list in dialog-package.lisp, or add individual :import-from entries for the three functions.
Bug 2 [HIGH]: SBCL "function T is undefined" warning in input.lisp
File: src/components/input.lisp
Problem: When SBCL compiles this file, it issues: "WARNING: The function T is undefined, and its name is reserved by ANSI CL so that even if it were defined later, the code doing so would not be portable."
The warning fires during the defmethod read-event compilation unit but the exact source is not identified by line number. The file uses (t ...) in case/cond default clauses extensively and :ctrl t, :alt t etc. as keyword argument values. The root cause needs investigation — could be the case macro expansion or a return-from interaction.
Note: this warning does NOT fire when (compile 'read-event) or (compile nil '(lambda ...)) is called in isolation on individual functions. It only fires during compile-file on the whole file. This suggests it's a cross-form interaction.
Investigation needed.
Bug 3 [MEDIUM]: text-input.lisp ignores variable that IS read
File: src/components/text-input.lisp, lines 163, 169-170
(w (if ln (layout-node-width ln) 80)) ; line 163 — defined
...
(truncated (subseq display 0 (min (length display) w))) ; line 169 — USED
(declare (ignore w cursor)) ; line 170 — declared ignored
Problem: w is declared as (ignore w) on line 170 but is actually read on line 169. Declare ignore + read is a compiler-level contradiction. The cursor variable is legitimately unused and should remain ignored.
Fix: Remove w from the ignore declaration. Only (declare (ignore cursor)).
Bug 4 [MEDIUM]: markdown.lisp ignores variable that IS read
File: src/components/markdown.lisp, lines 142-144
(defun parse-list (lines start)
(declare (ignore start)) ; line 143
(let ((items nil) (i start)) ; line 144 — USES start!
Problem: Same pattern as bug 3. start is declared ignored then immediately used. The declaration should be removed.
Fix: Remove the (declare (ignore start)) declaration.
Bug 5 [MEDIUM]: scrollbox.lisp unused vx variable
File: src/components/scrollbox.lisp, line 45
(vx 0) (vy 0)
Problem: vx is bound but never read — vy is used for viewport height calculations but viewport-x/vx is never referenced. This is a style-warning that indicates either dead code or a real issue where viewport-x should be used.
Fix: Add (declare (ignore vx)) or remove the vx binding entirely.
Bug 6 [LOW]: %simple-border-char ignores edge-style
File: src/backend/simple.lisp, lines 33-40
(defun %simple-border-char (edge-style pos)
"Return ASCII border character for EDGE-STYLE at POS."
(case pos
((:top-left :top-right :bottom-left :bottom-right) #\+)
(:horizontal #\-)
(:vertical #\|)))
Problem: The edge-style parameter is never consulted. Always returns + - | regardless of style. Callers also pass nil for it:
(%simple-border-char nil :horizontal)
Fix: Either remove the edge-style parameter (dead code) or implement border style selection using case on edge-style.
Bug 7 [LOW]: framebuffer draw-border ignores title-align
File: src/rendering/framebuffer.lisp, lines 94, 114-116
(defmethod draw-border ((fb framebuffer-backend) x y w h &key (style :single) title title-align fg bg)
...
(when title
(loop for i from 0 below (length title)
do (%set-cell fb (+ x 2 i) y (char title i) :fg fg :bg bg))))
Problem: title-align is accepted but never used. Title always renders at offset 2 from left edge (hard-coded). The simple backend centers the title, the framebuffer backend left-aligns — inconsistent API behavior.
Fix: Implement title-align support or add (declare (ignore title-align)) and document the behavior.