61 Commits

Author SHA1 Message Date
0629f8c6d3 fix dialog navigation and sidebar data construction
Dialog: use consistent cl-tty.dialog: prefix for all select accessors.
The :cl-tty.select and :cl-tty.dialog packages each define their own
SELECT class with separate accessor generic functions. Mixing prefixes
caused "no applicable method" errors. Now all 14 references use
cl-tty.dialog: (make-select, select-filter, select-next, etc.)

Sidebar: fix sidebar-lines append arguments. Each item must be a
proper list of cons cells, not a bare cons. Replaced all quoted
'("x" . :y) with (list (cons "x" :y)). Also fixed the quoted
cons call that was never evaluated.

Bash script: add --disable-debugger and --eval '(uiop:quit 0)' to
the tui sbcl invocation. Prevents the debugger from entering raw
terminal mode on error and ensures clean exit.

cl-tty: delete stale select-package.lisp and select.lisp orphan files
(not tangled by any current org file).
2026-05-20 12:07:56 -04:00
9492e00318 Phase 4 — sidebar, input, chat cleanup
Sidebar: replace manual (incf y) tracking with flat list construction.
sidebar-lines returns (text . color-key) pairs; view-sidebar loops
over them. Version footer stays at h-2. No more fragile y arithmetic.

Input panel: use cl-tty.input text-input's render method instead of
manual word-wrap + cursor-position computation. Layout node set each
frame for dynamic position.

Chat: extract msg->pairs (message to renderable lines) and render-pair
(draw one line pair) as separate functions. Replace reverse-iteration
scroll culling with forward scan that skips by scroll-offset. Same
behavior, less nesting.
2026-05-20 11:11:00 -04:00
ef36854822 cleanup — remove dead markdown code, migrate theme to cl-tty, fix dialog navigation
Phases 1-3 of library/application boundary cleanup:

Phase 1: Remove dead code (150 lines)
- Delete local word-wrap (all callers already used cl-tty.box:word-wrap)
- Delete parse-markdown-spans, render-styled, parse-markdown-blocks,
  syntax-highlight (all unused — view uses cl-tty.markdown directly)
- Replace tests with cl-tty.markdown equivalents

Phase 2: Migrate theme to cl-tty.theme (250 lines removed)
- Replace *tui-theme*/*tui-theme-presets* with *theme* + define-preset
- theme-switch/theme-save/theme-load delegate to cl-tty.theme
- theme-color is now a 3-line wrapper
- Added save-theme/load-theme to cl-tty.theme (38 lines added there)

Phase 3: Fix dialog arrow navigation with select-handle-key
- Replace broken manual key dispatch with cl-tty.dialog:select-handle-key
- The old code had a dead (and ch (graphic-char-p ch)) — the and result
  was discarded, so every unhandled key ran (code-char key-code) against
  the filter unconditionally, inserting garbage on arrow keys
2026-05-20 11:05:21 -04:00
8eb866dee3 v0.8.2: fix grey background/text cosmetic issues
- view-chat draw-text calls: change nil bg to (theme-color :bg)
  so text characters sit on explicit near-black instead of terminal
  default background (which appears as grey highlight)
- cl-tty bump (v1.2.0: remove \n from draw-rect that caused scroll
  leaving the last row blank)
2026-05-20 09:57:59 -04:00
b61191bec2 v0.8.0: TUI simplification — process-key-event, with-frame, inline reader
Replace queue-based key dispatch with process-key-event (inline in reader,
zero latency between keypress and render).
Add with-frame to cl-tty.backend (error-safe begin-sync/end-sync wrapper).
Use with-frame in redraw instead of manual begin-sync/end-sync.
Add initial render before main loop (UI appears before first read-event).
Remove position-cursor (replaced by inline block cursor in view-input).
Remove input-string/input-insert-char/input-delete-char wrappers.
Remove :input-buffer/:cursor-pos from state (managed by text-input widget).
passepartout script: set *debugger-hook* nil and failure-behaviour :warn
before quickload to survive compile warnings; remove cache-clear line.
2026-05-18 20:55:22 -04:00
d157a837a9 v0.8.0: use cl-tty.box:char-width and cl-tty.markdown:search-highlight
Removed local definitions of char-width (dead code) and search-highlight
(now uses cl-tty.markdown:search-highlight). Moved char-width tests to
cl-tty's box-tests.
2026-05-18 15:50:29 -04:00
126e104854 v0.8.0: remove position-cursor from dirty-guarded redraw (runs every frame from main loop already) 2026-05-18 15:35:10 -04:00
5c4edb3d98 v0.8.0: revert to stable e04b12c (undo typecase guard, navigation refactor, cursor calc changes)
The typecase guard, explicit navigation keyword dispatch, and word-wrap
cursor calculation changes introduced two regressions:
1. Cursor shows letter before instead of on (off-by-one)
2. Right arrow sometimes moves backward

Reverting to e04b12c which had working arrow keys and single-line cursor.
The unconditional position-cursor fix will be re-applied separately.
2026-05-18 15:33:39 -04:00
7eab3c93d2 v0.8.0: move position-cursor out of dirty-guarded redraw and out of dialog-guarded let — runs every frame unconditional
Removed (position-cursor fb w h) from inside redraw (which is gated by dirty
flags), and from inside the dialog-guarded (unless dialog* ...) block in the
main loop. Added unconditional (position-cursor be w h) at loop body level so
it runs every single iteration regardless of dirty state or dialog activity.
This ensures the cursor highlight always tracks cursor-pos correctly.
2026-05-18 15:16:58 -04:00
2f1abee930 v0.8.0: fix cursor off-by-one in word-wrap — use < instead of <=, incf accum len instead of 1+len
The position-cursor function now uses cursor-line/cursor-col stored by
view-input instead of recomputing from scratch, guaranteeing alignment
with the rendered text. The boundary check uses (< pos (+ accum len))
to avoid falsely matching the first character of the next wrapped line.

Removed the speculative reset-recovery code that sent cursor to end
when pos was 0, since that broke legitimate navigation to the
beginning of the input.
2026-05-18 15:06:13 -04:00
a65374e120 v0.8.0: add cursor position recovery — if text exists but pos is 0, place cursor at end
position-cursor now also clamps cursor-line to valid range and
recovers from cursor-pos resets by moving to end of text.
2026-05-18 14:43:30 -04:00
46cac554ab v0.8.0: fix multiline cursor — position-cursor now computes its own word-wrap
Removed dependency on (st :cursor-line) and (st :cursor-col) state.
position-cursor now does its own word-wrap and accum tracking to
determine which wrapped line and column the cursor is on. This makes
it independent of view-input's rendering state.
2026-05-18 14:38:22 -04:00
b1aafc56b2 v0.8.0: fix extra close paren in view-input, balance check
Discovered and fixed an extra close parenthesis on the hint bar's
last draw-text line that caused a compile error.
2026-05-18 14:34:55 -04:00
05aec4d028 v0.8.0: fix cursor position on multi-line input
view-input now stores cursor-line and cursor-col in state after
word-wrapping. position-cursor uses these to place the cursor on
the correct wrapped line, instead of the hardcoded row (- h 6)
which always put the cursor on the first line.
2026-05-18 14:32:23 -04:00
5524b4de06 v0.8.0: remove dead code duplicates — use cl-tty.box:word-wrap, delete local markdown/syntax-highlight/char-width
Phase 1 of cl-tty abstraction: remove 5 dead functions (word-wrap,
char-width, parse-markdown-spans, parse-markdown-blocks, render-styled,
syntax-highlight) and their tests. Switch 2 remaining word-wrap calls
to cl-tty.box:word-wrap.
2026-05-18 13:17:26 -04:00
e04b12c31c v0.8.0: TUI stabilization, command palette reverse-video highlight, hint bar redesign
- ROADMAP: consolidate all TUI work under v0.8.0 (removed premature
  v0.9.0/v0.10.x labels), restored original v0.9.0 eval harness plan
- channel-tui-view.org: Emacs-style reverse-video cursor (swap fg/bg
  instead of drawing █), hint bar now shows F:focus/MCP:count on left
  and token gauge + keybindings on right, sidebar reorganized to show
  GATE TRACE, RULES + BLOCK COUNT, COST, FILES panels
- channel-tui-main.org: command palette selection now uses reverse-video
  highlight (bg-input fg on input-fg bg, matching cursor style), fixed
  cond order so sel-p is checked before cat (all items had :category
  making sel-p unreachable), added session-cost extraction from daemon
- passepartout: export COLORTERM=truecolor for modern backend detection
2026-05-17 15:37:40 -04:00
2fedbbcb3b fix: solid amber █ cursor with finish-output flush
Replaced reverse-video cursor with a solid █ block in :input-prompt
color (amber). Drawn at the insertion point every frame from redraw
and main loop. finish-output ensures the cursor escape reaches the
terminal immediately.
2026-05-16 18:29:49 -04:00
c568ac6842 feat: Emacs-style reverse-video cursor (solid, no blink)
Replaced the software blinking █ cursor with a reverse-video cursor
that swaps foreground and background colors at the insertion point.
Solid at all times — no blink logic, no state tracking, no flicker.
- Removed duplicate cursor-visible-p functions
- Removed software cursor draw from view-input
- Removed terminal cursor style/show from initialize-backend
- position-cursor draws character at cursor with :bg fg + :input-fg bg
2026-05-16 18:22:01 -04:00
aca3f9e314 fix: draw cursor immediately in redraw (not 100ms later)
position-cursor now called at end of redraw so the cursor appears
on the very first frame and after every keypress without a 100ms
delay. Also still called from main loop between sleep for blinking.
2026-05-16 18:08:30 -04:00
5444322bf9 fix: software █ cursor blinking at 2Hz independently of typing
position-cursor runs every frame from main loop (after sleep 0.1),
drawing █ when cursor-visible-p returns T, space when NIL.
This creates a true 2Hz blink that toggles independently of keypresses.
Terminal cursor also set to blinking block as fallback.
2026-05-16 17:56:42 -04:00
f8ae4ac817 fix: terminal cursor instead of software-drawn █
Replaced software cursor (draw-text █ every frame) with native terminal
cursor (position-cursor using cursor-move + cursor-style). Terminal handles
blinking natively at 500ms — no redraw needed for cursor updates.

- position-cursor: computed input insertion point from state, calls
  cursor-move + cursor-style (:block :blink t) + cursor-show.
- Called from main loop every frame after (sleep 0.1), outside
  redraw's begin-sync/end-sync. No flicker.
2026-05-16 17:50:08 -04:00
7e9da0f867 v0.10.5: multi-line expanding input box with software blinking cursor
view-input word-wraps input at prompt-w, expanding the grey panel
upward as needed. Uses software cursor (█) in :input-fg blinking
at 2Hz via get-internal-real-time.
view-chat max-lines adapts to variable panel height via input-panel-top.
Removed terminal cursor (position-cursor, cursor-show, cursor-style).
Dialog minibuffer top now computed from input-panel-top.
2026-05-16 11:01:05 -04:00
bb98b486e4 v0.10.4: spacer rows between messages in history area
Clean implementation: spacer inserted in the rendering loop as an
(incf y) between message blocks, tracked in scroll-fitting loop
via spacer variable. No data structure changes.

Also: fixed premature let close in spacer binding, fixed view-input
closing paren count, and re-applied speaker alignment fixes lost in
revert.
2026-05-16 09:54:34 -04:00
bcab429dd7 Revert "v0.10.4: spacer rows between messages in history area"
This reverts commit 2513466576.
2026-05-16 09:31:52 -04:00
2513466576 v0.10.4: spacer rows between messages in history area
Each message block gets a trailing empty line (no speaker, no text)
to improve visual separation between turns.
2026-05-16 09:24:42 -04:00
f6dbd6dbd0 v0.10.3: input area speaker line — 4 rows get │ in :input-prompt color
Consistent with history area: user │ (amber), agent │ (tan), gate │ (grey),
and the 4-row input box │ (:input-prompt).
2026-05-16 09:14:51 -04:00
bad7686d4e v0.10.2: voice system — all speakers use │, neuro-thinking bg bar, blinking cursor
- Theme: added :agent-border, :thinking-bg, :symbolic-border to all 13
  presets with theme-load fallback for saved themes.
- Agent output now draws │ with :agent-border color (muted tan).
- Neuro-thinking (streaming): draw-rect at column 0 with :thinking-bg
  (dark grey block) instead of a grey │ character. No border text.
- Gate traces: │ with :symbolic-border (was ╎ with :dim).
- Tool calls: │ with tool status color (was ╎).
- Removed > prompt prefix from input line.
- Added position-cursor function: blinking block cursor at insertion
  point, called every frame from the main loop after sleep.
2026-05-16 09:10:39 -04:00
2189745f40 v0.10.1: architectural cleanup — full-frame redraw, explicit bg everywhere, :bg-input fallback
- redraw: always draws all three views (status/chat/input) when any
  dirty flag is set. Dirty flags only gate frame rendering, not
  which parts render. Fixes disappearing input/history.
- Added :bg-input to all 13 presets with #2e2e2e (dark) / #d4d4d4
  (light-amber). theme-load fills missing keys from current preset
  defaults for backward compatibility.
- Removed unused *sidebar-panels* defvar and obsolete contract docs.
- Renamed dim-bg → dim-fg (foreground color, not background).
- All draw-text calls in sidebar and dialog minibuffer now pass
  explicit bg-panel, preventing background leaks.
- render-styled (markdown renderer) passes explicit (theme-color :bg).
- Fix h shadowing in view-chat scroll loop (h → mh).
2026-05-16 09:03:59 -04:00
0a0478f502 v0.10.0: TUI visual overhaul — dark-neutral theme, left-border messages, sidebar auto-show, cl-tty style-reset
- Theme: near-black (#0a0a0a) backgrounds, dark-grey panels (#141414),
  warm amber (#fab283) accent only. New keys: :bg, :bg-panel, :bg-element,
  :text-muted. All 13 presets updated.
- Messages: No background fills (sit on global black). User messages get
  amber left border (│). Agent response has no border (invisible).
  Streaming agent messages get grey left border. Gate traces and tool
  calls use grey ╎ prefix. No label lines, no time separators.
- Sidebar: :sidebar-mode with :auto/:visible/:hidden. Auto-shows at >120
  cols (opencode-style). Width 42 with version + connection dot footer.
- Input: 2-char hpad on each side. Grey panel (2 rows: separator +
  prompt). Hint right-aligned at bottom on black.
- Status bar: empty (clean black line).
- cl-tty backend: draw-text, draw-rect, draw-link, draw-border now use
  \e[22;23;24;25;27m (style-only reset) instead of \e[0m (full reset),
  preserving foreground/background across draw calls.
- Fix: all sidebar text draws pass explicit bg-panel background.
- Fix: hint at h-1 passes explicit (theme-color :bg).
- Fix: sidebar bottom row uses draw-text (no \n) to prevent scroll at h-1.
2026-05-16 08:02:53 -04:00
6d7dd9e1ea fix: clean TUI exit, restore terminal, suppress compiler warnings
passepartout script:
- Add (uiop:quit 0) after tui-main so SBCL exits on Ctrl+Q
- Remove exec to allow stty restore after sbcl subprocess
- Restore icanon echo ixon after TUI exits (terminal stuck raw)

channel-tui-view.org:
- Remove unused fb/h vars from test-sidebar-not-shown-narrow
- Add (declare (ignore w)) to render-styled
- Qualify theme-color as passepartout.channel-tui:theme-color
  (render-styled is in :passepartout package)
- Remove dead :url clause from pick in parse-markdown-spans
  (URLs handled by dedicated branch, not via pick)
- Update literate prose for all changes
2026-05-14 16:25:36 -04:00
74621cffd2 fix: disable flow control (-ixon) for Ctrl+Q, constrain prompt/hint to chat-w
- Added -ixon to stty so Ctrl+Q (XON byte) isn't swallowed by the
  terminal driver and reaches the TUI as :CTRL-Q
- view-input now truncates the prompt (> prefix + visible text) to
  chat-w - 2 characters, and the hint to chat-w characters, so
  neither extends into the sidebar area
2026-05-14 15:48:34 -04:00
2ce8d9d886 fix: constrain separator/input/status to chat area when sidebar visible
Added chat-w = w - sidebar_width calculation in view-status and
view-input, matching view-chat's existing approach. Also added
chat-w for the separator line drawing in tui-main. This prevents
the prompt, separator, hint, and status bar from extending into
the sidebar area when it's visible.
2026-05-14 15:44:17 -04:00
84ef4c3443 fix: lower sidebar threshold to 60 cols, word-wrap agent messages
- Sidebar threshold lowered from 120 to 60 so it works on 83-col
  terminals
- Agent response text is now word-wrapped through cl-tty.box:word-wrap
  after markdown rendering, preventing text from bleeding past the
  terminal edge
2026-05-14 15:31:00 -04:00
ad5b9669a6 fix: revert w→chat-w replacement outside view-chat
view-status and view-sidebar don't have chat-w bound. Reverted
lines 78 and 236 to use w instead of chat-w.
2026-05-14 15:26:00 -04:00
187ec6e471 fix: constrain chat width when sidebar is visible, Ctrl+B sets all dirty
- Added chat-w = w - sidebar-width in view-chat for all width
  calculations (word-wrap, padding, borders) so text doesn't
  bleed into the sidebar area
- Changed Ctrl+B dirty flags from (list t t nil) to (list t t t)
  so input view also redraws, fixing the toggle-not-turning-off issue
2026-05-14 15:24:43 -04:00
337b8cdd86 fix: nil guards on w and h in all view functions
Prevents crash when backend-size returns nil for height.
Defaults to 80x24 if dimensions are nil or invalid.
2026-05-14 13:41:15 -04:00
4bfb407094 fix: draw hint before prompt so cursor stays at input line
view-input drew prompt first (row h-3), then hint (row h-2),
leaving the cursor at end of the hint line after 'complete'.
Typed characters appeared there. Swapped order: hint first,
prompt last, so cursor ends at the > prompt.
2026-05-14 12:51:21 -04:00
b9a4318ef8 reorg: tangle to XDG, remove stale lisp files, fix tui input
- Changed all 50 org file :tangle targets from ../lisp/ to
  ~/.local/share/passepartout/lisp/ (XDG data dir)
- Removed 49 generated .lisp files from project lisp/ directory
- Removed tests/system-integration-tests.lisp (generated)
- Removed lisp/*.fasl (compiled, stale)
- Updated core-manifest.org to tangle .asd to XDG root
- Remapped quicklisp symlink: local-projects/passepartout → XDG

TUI fixes in channel-tui-main.org:
- Removed with-raw-terminal (stty raw breaks fd 0 reads in this SBCL)
- Use cat subprocess + pipe for keyboard input (via :input :interactive)
- Blocking read-char on pipe with with-timeout 0.1s for daemon processing
- Key events queued via drain-queue alongside daemon messages
- Full dialog key routing (Escape, Up/Down, Enter, filters, Backspace)
- SIGWINCH resize handling
- Post-handshake backend-size re-query
- Daemon version in status bar (was v0.5.0 hardcoded)
- Handshake version stored in state, no add-msg
- :daemon-version and :size-queried in state plist
- view-status uses draw-rect for background
- Test section gated with #+passepartout-tests
2026-05-14 12:34:06 -04:00
adca69d29c fix: remove hardcoded v0.5.0, show daemon version in status bar
- Removed connect-daemon's hardcoded "* Connected v0.5.0 *" message
  (fired before handshake arrived, was always stale)
- Added :daemon-version slot to state plist, filled by handshake handler
- view-status now shows version: "● passepartout v0.7.2 msgs:N Rules:N"
- passepartout script: force cl-tty recompile (:force t) to pick up
  CSI positioning, ioctl sizing, and detection fixes
2026-05-14 09:11:22 -04:00
35fbf1d418 bump passepartout: v0.9.0 Warm TUI Redesign fixes 2026-05-13 19:49:45 -04:00
b17c501231 fix: replace draw-rect on framebuffer with draw-text
draw-rect has no method on raw arrays (only on framebuffer-backend,
simple-backend, modern-backend). Three calls in view-status, view-chat,
and view-sidebar passed the framebuffer array to draw-rect, causing
'no applicable method' crash on startup.

Replaced with (draw-text ... (make-string w #\Space) nil bg) which
fills the same area with background spaces.
2026-05-13 19:20:00 -04:00
15d16fd520 bump passepartout: v0.9.0 Warm TUI Redesign — blank slate
Complete rewrite of the TUI with warm amber/gold color palette and
clean three-zone layout (chat top, input bottom, status very bottom).

1. Layout restructure: input at y=h-3, hint at y=h-2, status at y=h-1
2. Warm palette: 20-key amber/gold theme, 8 warm presets
3. Readline keybindings: Ctrl+A/E/U/W/K/Y/L/D/F/G in :global keymap
4. Chat messages: user boxes (┌─└─), agent headers, collapsible tools
5. Command palette: Ctrl+P top-centered overlay, warm colors
6. Sidebar: Ctrl+B toggle, right panel with focus/rules/context/MCP
7. Keybindings: :ctrl+x, :?, mouse wheel support
8. Search: existing /search with match highlighting
9. Help overlay: ? shows keybinding and command reference
2026-05-13 19:13:20 -04:00
b5a07a5dcb bump passepartout: v0.8.0 TUI upgrade — all 6 items
Minibuffer (dialog stack), conversation view (ScrollBox+Markdown),
command palette (Ctrl+P), sidebar (6 panels, Ctrl+B), status bar
(degraded-mode signaling), keybinding layer (defkeymap).
2026-05-13 17:57:54 -04:00
af4d81ec9f fix: add word-wrap function, complete TUI migration
- Add missing word-wrap function (was declared in contract but never defined)
- TUI now renders correctly: draw-text on framebuffer arrays works
- Daemon connection verified
- All three view functions (status, chat, input) call draw-text correctly
2026-05-13 16:06:05 -04:00
885fc3f92e fix: resolve TUI compilation errors, replace ST calls with GETF
- Remove dead croatoan-to-tty-event keymap dispatch clause from on-key
- Replace all (st :key) with (getf *state* :key) and all
  (setf (st :key) val) with (setf (getf *state* :key) val)
  to avoid SBCL cross-file SETF expander issues (239 replacements)
- Fix redraw arity: called with 4 args but defined with 3
- TUI now loads, initializes, and connects to daemon successfully
2026-05-13 14:04:25 -04:00
6e69c4a724 v0.8.0: complete cl-tty TUI migration — remove all Croatoan deps
- Replace numeric key code dispatch with cl-tty keyword events
- Replace Croatoan code-key/key-name normalization with direct keyword dispatch
- Update main loop to construct Ctrl-key keywords from cl-tty key-event modifiers
- Remove croatoan-to-tty-event compatibility shim and its test
- Remove duplicate Esc handling from main loop (now handled by on-key)
- Update all documentation contracts, prose, docstrings to remove Croatoan refs
- Remove :croatoan from package dependencies
- All event handling now goes through cl-tty keymaps or keyword dispatch
2026-05-13 12:46:43 -04:00
2d18fa4525 docs: port TUI roadmap to cl-tty, mark Emacs as secondary client
v0.8.0: Information Radiator now built on cl-tty v1.1.0. Minibuffer
uses cl-tty Dialog stack. New TODO items: conversation view (ScrollBox
+ Markdown), command palette (Select), sidebar (slot system), status bar
(Box + Theme), keybindings (keymap).

v0.9.1: Emacs is now an optional secondary client, not the primary
bridge. cl-tty is the primary TUI.
2026-05-13 11:41:41 -04:00
00211cf685 wip: unified minibuffer panel, v0.9.1 Emacs dev env in ROADMAP
- Unified minibuffer slash-command panel (panel-based wizard, settings,
  help sub-mode stack) — channel-tui state/view changes
- ROADMAP: v0.8.0 broken into atomic DONE items, v0.9.1 added with
  Emacs major mode + M-x command surface TODOs
- Semver discipline from v0.7.1 onward (X.Y.Z)
2026-05-13 09:17:48 -04:00
c227877302 v0.8.3: TUI stabilization — box calls, package fixes, sandbox, configure
Bug fixes:
- Fix box() calls: set color-pair before box, pass ACS default chtype integers
- Fix markdown functions: move to passepartout.channel-tui package where
  Croatoan is imported; use add-attributes/remove-attributes instead of
  :bold/:underline kwargs to add-string; call theme-color in gate-trace-lines
  to convert theme keys to Croatoan colors
- Fix sandbox: remove dex:get/dex:post from restricted symbols
  (blocked neuro-provider from loading)
- Export *log-lock* from passepartout (was unbound in jailed skill packages)
- Fix configure: always deploy to XDG, skip cp when source==dest
- Fix bash crash handler format string (~~ escaping)
- Revert test reorder in 28 files (caused package leakage in skill loader)

Design cleanup:
- Extract tui-run-screen from tui-main for clean separation
- Remove inject-stimulus alias
- Merge *backend-registry* into *probabilistic-backends*
- Fix read-framed-message whitespace DoS (4096-iteration max)
- Add *read-eval* nil to dispatcher-approvals-process read-from-string
2026-05-13 09:17:48 -04:00
8fd56dece3 v0.8.2: cleanup + prose + structure + decomposition + budget + errors
Phase 1 — dedup + hardening (~9 items):
- Remove duplicate *skill-registry* defvar from core-skills
- Merge *backend-registry* into *probabilistic-backends*, delete backend-register
- Remove inject-stimulus alias, standardize on stimulus-inject
- Add pre-eval sandbox (skill-source-scan) blocks restricted symbols before eval
- Remove dead plist-get function; remove duplicate json-alist-to-plist export
- Fix read-framed-message whitespace DoS (4096-iteration max)
- Add *read-eval* nil to dispatcher-approvals-process read-from-string (RCE)
- Add test-op to ASDF; update .asd version 0.4.3→0.7.2

Phase 2 — prose + contracts + reorder:
- Split ROADMAP: 2623→1089 lines (TODO only), CHANGELOG: 260→1528 lines (full DONE history, 14 versions reverse chron)
- Add Contracts + Overview to 6 channel files + embedding-native + programming-standards + symbolic-scope
- Reorder 28 .org files: Contract → Test Suite → Implementation (TDD order)
- Add 7-phase inline prose to think() in core-reason
- Expand USER_MANUAL: 183→461 lines (10 new sections)

Phase 3 — decomposition + export organization:
- Decompose think() into think-assemble-prompt, think-call-llm, think-parse-response orchestrator
- Organize 188 exports into 16 grouped sections by module

Phase 4 — budget enforcement + error protocol:
- Per-session budget enforcement (SESSION_BUDGET_USD env var, budget-exhausted-p, guard in think-call-llm)
- Error condition hierarchy (6 conditions: pipeline-error, llm-error, gate-error, budget-error, protocol-error)
- Restarts in loop-process: skip-signal, use-fallback, abort-pipeline
2026-05-13 09:17:48 -04:00