From 803cf1da11512784663794efce05bcbd7fa8c71e Mon Sep 17 00:00:00 2001 From: William Valentin Date: Sun, 15 Feb 2026 22:53:12 -0800 Subject: [PATCH] audit follow-up: reduce warning debt in local model tests --- .../2026-02-16-codebase-audit-report.md | 12 ++++---- docs/plans/state.json | 6 ++-- src/models/local/llamacpp.test.ts | 28 ++++++++++--------- src/models/local/ollama.test.ts | 17 +++++------ 4 files changed, 35 insertions(+), 28 deletions(-) diff --git a/docs/plans/analysis/2026-02-16-codebase-audit-report.md b/docs/plans/analysis/2026-02-16-codebase-audit-report.md index 2e08c06..4afbbd1 100644 --- a/docs/plans/analysis/2026-02-16-codebase-audit-report.md +++ b/docs/plans/analysis/2026-02-16-codebase-audit-report.md @@ -20,7 +20,7 @@ Scope: Production-risk-first audit of bugs, code improvements, and feature oppor - ✅ F-015 addressed: retry defaults no longer classify timeout-style failures as non-retryable, improving resilience for transient timeout conditions. - ✅ F-011 addressed: Slack user-name resolution now uses bounded TTL+LRU caching to prevent unbounded growth. - ✅ F-013 addressed: shared channel utilities now cover reset normalization/building plus reusable allowlist, mention-gating, and pairing-gating flows across Discord/Slack/WhatsApp adapters. -- ◑ F-004 partially addressed: lint error baseline is restored (`pnpm lint` now passes with 0 errors) and warning burn-down has progressed from `466` to `232`; additional warning debt remains. +- ◑ F-004 partially addressed: lint error baseline is restored (`pnpm lint` now passes with 0 errors) and warning burn-down has progressed from `466` to `212`; additional warning debt remains. ## Executive Summary @@ -28,7 +28,7 @@ Current health snapshot: - `pnpm typecheck`: passing - `pnpm build`: passing - `pnpm test:run`: passing (`140/140` files, `1773/1773` tests) -- `pnpm lint`: passing with warnings only (`0 errors`, `232 warnings`) +- `pnpm lint`: passing with warnings only (`0 errors`, `212 warnings`) Top conclusions: - A critical Web UI security issue exists in markdown rendering (unsanitized HTML insertion). @@ -126,7 +126,7 @@ Remediation update (2026-02-16): - Severity: Medium - Impact: CI noise, reduced confidence in static analysis, and slower defect detection. - Evidence: - - `pnpm -s lint` => `0 errors`, `232 warnings` + - `pnpm -s lint` => `0 errors`, `212 warnings` - Error concentration: - `src/daemon/models.ts` (90 errors) - `src/cli/tui.ts` (25 errors) @@ -145,7 +145,7 @@ Remediation update (2026-02-16): Remediation update (2026-02-16): - Stage 1 complete: fixed all error-level ESLint violations in impacted high-error files so `pnpm lint` now passes with `0` errors. -- Stage 2 in progress: warning-burn-down reduced to `232` warnings via targeted hotspot cleanup in: +- Stage 2 in progress: warning-burn-down reduced to `212` warnings via targeted hotspot cleanup in: - `src/gateway/handlers/handlers.test.ts` - `src/daemon/routing.test.ts` - `src/frontends/tui/minimal.test.ts` @@ -156,6 +156,8 @@ Remediation update (2026-02-16): - `src/frontends/tui/minimal.login.test.ts` - `src/daemon/clientFactory.test.ts` - `src/gateway/handlers/services.test.ts` + - `src/models/local/llamacpp.test.ts` + - `src/models/local/ollama.test.ts` ### F-005 Medium: ESLint browser globals mismatch causes avoidable UI lint failures @@ -460,7 +462,7 @@ pnpm -s lint Observed outcomes: - Typecheck/build/test: passing. -- Lint: passing with warnings only (`0` errors, `232` warnings). +- Lint: passing with warnings only (`0` errors, `212` warnings). Historical pre-remediation lint error concentration snapshot: - `src/daemon/models.ts`: 90 errors diff --git a/docs/plans/state.json b/docs/plans/state.json index 4c1b681..a2be42c 100644 --- a/docs/plans/state.json +++ b/docs/plans/state.json @@ -2652,7 +2652,7 @@ "status": "in_progress", "date": "2026-02-16", "updated": "2026-02-16", - "summary": "Continued stage-2 lint warning reduction with hotspot-focused cleanup in `gateway/handlers/handlers.test.ts`, `daemon/routing.test.ts`, `frontends/tui/minimal.test.ts`, `gateway/tailscale.test.ts`, `automation/webhooks.test.ts`, `automation/cron.test.ts`, `automation/heartbeat.test.ts`, `frontends/tui/minimal.login.test.ts`, `daemon/clientFactory.test.ts`, and `gateway/handlers/services.test.ts`. Replaced broad `any` casts with typed helper casts/unknown-path accessors and removed non-null assertions in high-warning tests. Warning count reduced from 466 to 232 (234 warnings burned down) with lint/test suites still green.", + "summary": "Continued stage-2 lint warning reduction with hotspot-focused cleanup in `gateway/handlers/handlers.test.ts`, `daemon/routing.test.ts`, `frontends/tui/minimal.test.ts`, `gateway/tailscale.test.ts`, `automation/webhooks.test.ts`, `automation/cron.test.ts`, `automation/heartbeat.test.ts`, `frontends/tui/minimal.login.test.ts`, `daemon/clientFactory.test.ts`, `gateway/handlers/services.test.ts`, `models/local/llamacpp.test.ts`, and `models/local/ollama.test.ts`. Replaced broad `any` casts with typed helper casts/unknown-path accessors and removed non-null assertions in high-warning tests. Warning count reduced from 466 to 212 (254 warnings burned down) with lint/test suites still green.", "files_modified": [ "src/tools/builtin/browser/tools.test.ts", "src/channels/telegram/adapter.test.ts", @@ -2669,9 +2669,11 @@ "src/frontends/tui/minimal.login.test.ts", "src/daemon/clientFactory.test.ts", "src/gateway/handlers/services.test.ts", + "src/models/local/llamacpp.test.ts", + "src/models/local/ollama.test.ts", "docs/plans/analysis/2026-02-16-codebase-audit-report.md" ], - "test_status": "pnpm test:run src/channels/utils.test.ts src/channels/discord/adapter.test.ts src/channels/slack/adapter.test.ts src/channels/whatsapp/adapter.test.ts src/daemon/routing.test.ts src/gateway/handlers/handlers.test.ts src/frontends/tui/minimal.test.ts src/gateway/tailscale.test.ts src/automation/webhooks.test.ts src/automation/cron.test.ts src/automation/heartbeat.test.ts src/frontends/tui/minimal.login.test.ts src/daemon/clientFactory.test.ts src/gateway/handlers/services.test.ts + pnpm lint passing (0 errors, 232 warnings)" + "test_status": "pnpm test:run src/channels/utils.test.ts src/channels/discord/adapter.test.ts src/channels/slack/adapter.test.ts src/channels/whatsapp/adapter.test.ts src/daemon/routing.test.ts src/gateway/handlers/handlers.test.ts src/frontends/tui/minimal.test.ts src/gateway/tailscale.test.ts src/automation/webhooks.test.ts src/automation/cron.test.ts src/automation/heartbeat.test.ts src/frontends/tui/minimal.login.test.ts src/daemon/clientFactory.test.ts src/gateway/handlers/services.test.ts src/models/local/llamacpp.test.ts src/models/local/ollama.test.ts + pnpm lint passing (0 errors, 212 warnings)" } }, "overall_progress": { diff --git a/src/models/local/llamacpp.test.ts b/src/models/local/llamacpp.test.ts index e3fcebc..8021876 100644 --- a/src/models/local/llamacpp.test.ts +++ b/src/models/local/llamacpp.test.ts @@ -217,7 +217,8 @@ describe('LlamaCppClient', () => { expect(response.stopReason).toBe('tool_use'); expect(response.toolCalls).toHaveLength(1); - expect(response.toolCalls![0]).toEqual({ + const firstToolCall = response.toolCalls?.[0]; + expect(firstToolCall).toEqual({ id: 'call_123', name: 'shell.exec', args: { command: 'ls' }, @@ -404,7 +405,7 @@ describe('normalizeMessagesForLlamaCpp', () => { content: [ { type: 'text', text: 'Searching...' }, { type: 'tool_use', id: 'call_1', name: 'web.search', input: { query: 'news' } }, - ] as any, + ] as Message['content'], }, ]; @@ -432,13 +433,13 @@ describe('normalizeMessagesForLlamaCpp', () => { role: 'assistant', content: [ { type: 'tool_use', id: 'call_1', name: 'web.search', input: { query: 'news' } }, - ] as any, + ] as Message['content'], }, { role: 'user', content: [ { type: 'tool_result', tool_use_id: 'call_1', content: 'Results here', is_error: false }, - ] as any, + ] as Message['content'], }, ]; @@ -459,22 +460,23 @@ describe('normalizeMessagesForLlamaCpp', () => { content: [ { type: 'tool_use', id: 'call_a', name: 'tool.a', input: {} }, { type: 'tool_use', id: 'call_b', name: 'tool.b', input: { x: 1 } }, - ] as any, + ] as Message['content'], }, { role: 'user', content: [ { type: 'tool_result', tool_use_id: 'call_a', content: 'A result' }, { type: 'tool_result', tool_use_id: 'call_b', content: 'B result' }, - ] as any, + ] as Message['content'], }, ]; const result = normalizeMessagesForLlamaCpp(undefined, messages); - expect(result[1].tool_calls).toHaveLength(2); - expect(result[1].tool_calls![0].id).toBe('call_a'); - expect(result[1].tool_calls![1].function.arguments).toBe('{"x":1}'); + const toolCalls = result[1].tool_calls; + expect(toolCalls).toHaveLength(2); + expect(toolCalls?.[0]?.id).toBe('call_a'); + expect(toolCalls?.[1]?.function.arguments).toBe('{"x":1}'); // Multiple results merged into one user message expect(result).toHaveLength(3); expect(result[2]).toEqual({ @@ -490,13 +492,13 @@ describe('normalizeMessagesForLlamaCpp', () => { role: 'assistant', content: [ { type: 'tool_use', id: 'call_1', name: 'file.read', input: { path: '/tmp/x' } }, - ] as any, + ] as Message['content'], }, { role: 'user', content: [ { type: 'tool_result', tool_use_id: 'call_1', content: 'File not found', is_error: true }, - ] as any, + ] as Message['content'], }, ]; @@ -516,13 +518,13 @@ describe('normalizeMessagesForLlamaCpp', () => { content: [ { type: 'text', text: 'Checking...' }, { type: 'tool_use', id: 'tc_0', name: 'weather.get', input: { city: 'NYC' } }, - ] as any, + ] as Message['content'], }, { role: 'user', content: [ { type: 'tool_result', tool_use_id: 'tc_0', content: 'Sunny, 72F' }, - ] as any, + ] as Message['content'], }, { role: 'assistant', content: 'The weather in NYC is sunny, 72F.' }, ]; diff --git a/src/models/local/ollama.test.ts b/src/models/local/ollama.test.ts index c0580fb..d7a55e2 100644 --- a/src/models/local/ollama.test.ts +++ b/src/models/local/ollama.test.ts @@ -110,7 +110,8 @@ describe('OllamaClient', () => { expect(response.stopReason).toBe('tool_use'); expect(response.toolCalls).toHaveLength(1); - expect(response.toolCalls![0]).toEqual({ + const firstToolCall = response.toolCalls?.[0]; + expect(firstToolCall).toEqual({ id: 'ollama_tc_0', name: 'shell.exec', args: { command: 'ls' }, @@ -374,7 +375,7 @@ describe('normalizeMessagesForOllama', () => { content: [ { type: 'text', text: 'Let me search for that.' }, { type: 'tool_use', id: 'call_1', name: 'web.search', input: { query: 'latest news' } }, - ] as any, + ] as Message['content'], }, ]; @@ -401,13 +402,13 @@ describe('normalizeMessagesForOllama', () => { role: 'assistant', content: [ { type: 'tool_use', id: 'call_1', name: 'web.search', input: { query: 'news' } }, - ] as any, + ] as Message['content'], }, { role: 'user', content: [ { type: 'tool_result', tool_use_id: 'call_1', content: 'Breaking news: ...', is_error: false }, - ] as any, + ] as Message['content'], }, ]; @@ -429,14 +430,14 @@ describe('normalizeMessagesForOllama', () => { content: [ { type: 'tool_use', id: 'call_1', name: 'web.search', input: { query: 'a' } }, { type: 'tool_use', id: 'call_2', name: 'web.search', input: { query: 'b' } }, - ] as any, + ] as Message['content'], }, { role: 'user', content: [ { type: 'tool_result', tool_use_id: 'call_1', content: 'Result A' }, { type: 'tool_result', tool_use_id: 'call_2', content: 'Result B' }, - ] as any, + ] as Message['content'], }, ]; @@ -456,13 +457,13 @@ describe('normalizeMessagesForOllama', () => { content: [ { type: 'text', text: 'Let me check.' }, { type: 'tool_use', id: 'tc_0', name: 'weather.get', input: { city: 'NYC' } }, - ] as any, + ] as Message['content'], }, { role: 'user', content: [ { type: 'tool_result', tool_use_id: 'tc_0', content: 'Sunny, 72F' }, - ] as any, + ] as Message['content'], }, { role: 'assistant', content: 'The weather in NYC is sunny, 72F.' }, ];