v4.9.17: code review cleanup — dead code removal, abort fix, WAL safety - Remove --skip-errors dead flag (break was removed in v4.9.8, v4.9.12) - Remove dead $consecutiveFailures variable (never incremented/checked) - Remove dead <u> cleanup regex patterns (no longer emitted after <span> migration) - Remove $markdownUrl/$jsonUrl dead params from showForm() signature - Wrap WAL checkpoint TRUNCATE in try-catch with PASSIVE fallback - HTML abort protection already present in working tree (review diff was stale) Fixes #207 /review findings 1–8. Co-Authored-By: Claude <noreply@taotoken.net>
v4.9.16: desktop form single-row layout (search + modes inline) fieldset flex-wrap keeps search+button+radios on one line on desktop. Mobile override (flex-direction: column) stacks them in two rows. Co-Authored-By: Claude <noreply@taotoken.net>
v4.9.15: two-row form layout — search+button row, radios row below - form HTML: split single <p> into .form-search (input+Go) and .form-modes (6 radio buttons), each in its own paragraph - CSS: specific selectors for .form-search and .form-modes - Mobile: tighter gaps (4px/2px), compact radio labels - Fixes #207: mobile form no longer stacks everything vertically; search+button always on one row, radios wrap naturally below Co-Authored-By: Claude <noreply@anthropic.com>
docs: add v4.9.11–v4.9.14 changelog entries
v4.9.14: fix --status man emoji count — :mode was never bound
- showStatus(): man path skips $stmtCount->bindValue(':mode') in the
html-count branch, leaving :mode unbound for the emoji_md/emoji_html
queries that follow — causing COUNT(*) to return 0 for man only
- Fix: always bind :mode before emoji counts, regardless of mode
Closes #206
v4.9.13: fix --status showing 0 for man — WAL checkpoint before read - On DB open, run PRAGMA wal_checkpoint(TRUNCATE) to flush WAL writes - Fixes: emoji counts showing 0 despite data existing (41 html + 53 md for man) - Root cause: SQLite WAL snapshot isolation — new readers see old snapshots when 5 concurrent batch-enhance writers keep the WAL growing Closes #206
v4.9.12: emoji_html LLM empty no longer aborts batch - emoji_html failures now SKIP instead of aborting (like missing pages) - Man pages (CGI/DBI 85K chars) consistently fail emoji_html but succeed at emoji_md — html abort killed the entire man batch at entry 4/9600 - Only emoji_md consecutive failures (3 in a row) still trigger abort Co-Authored-By: Claude <noreply@anthropic.com>
v4.9.11: fix callLLM() non-retryable return value bug - callLLMEndpoint() now returns `false` for non-retryable failures (was `''` which collided with valid empty-string success responses) - callLLM() loop: checks `!== false` for success, `=== false` for abort - Previously: 4xx/auth errors returned `''` which was indistinguishable from a legitimate empty LLM response — primary failures incorrectly returned empty string instead of trying fallbacks Co-Authored-By: Claude <noreply@anthropic.com>
docs: add v4.9.5–v4.9.10 changelog + worktree rebase rule - docs/01-PRODUCT.md: changelog entries for v4.9.5→v4.9.10 - CLAUDE.md: Git workflow section — worktree rebase-before-commit rule to prevent future silent overwrites from stale worktrees Co-Authored-By: Claude <noreply@anthropic.com>
v4.9.10: restore Geist CSS + footer format links