# TASKS.md — General Bots Workspace Audit **Generated:** 2026-02-19 **Workspace:** `/home/rodriguez/gb` (v6.2.0) **Scope:** Full workspace security audit, code quality analysis, and improvement backlog --- ## 🔴 P0 — CRITICAL SECURITY FLAWS (Fix Immediately) ### SEC-01: ✅ RESOLVED — `vault-unseal-keys` removed from Git tracking **Severity:** 🔴 CRITICAL **File:** `vault-unseal-keys` **Status:** ✅ Removed from Git tracking. **History purge and key rotation still required.** The file contained **5 plaintext Vault unseal keys** and had **2 commits** in the git history. It has been removed from tracking via `git rm --cached`. **Completed:** - [x] `git rm --cached vault-unseal-keys` — Removed from tracking - [x] Added to `.gitignore` (was already present) **Remaining (manual action required):** - [ ] **Rotate ALL 5 Vault unseal keys immediately** - [ ] Use `git filter-repo` or BFG Repo-Cleaner to purge from history - [ ] Force-push to ALL remotes (`origin`, `alm`) - [ ] Notify all collaborators to re-clone --- ### SEC-02: ✅ PARTIALLY RESOLVED — `.env` exposure mitigated **Severity:** 🔴 CRITICAL **Files:** `.env` (root), `botserver/.env` **Completed:** - [x] Verified `botserver/.env` is NOT tracked by git - [x] Root `.env` confirmed NOT tracked (properly `.gitignore`'d) - [x] Created `.env.example` template with placeholder values - [x] Added `*.pem`, `*.key`, `*.crt`, `*.cert` to `.gitignore` **Remaining (manual action required):** - [ ] **Rotate both Vault tokens immediately** - [ ] Implement short-TTL Vault tokens (e.g., 1h) with auto-renewal - [ ] Consider using Vault Agent for automatic token management --- ### SEC-03: ✅ RESOLVED — `init.json` removed from Git tracking **Severity:** 🟠 HIGH **File:** `init.json` **Completed:** - [x] `git rm --cached init.json` — Removed from tracking - [x] Added `init.json` to `.gitignore` --- ### SEC-04: ✅ RESOLVED — All `Command::new()` replaced with `SafeCommand` **Severity:** 🟠 HIGH **File:** `botserver/src/security/protection/installer.rs` **Completed:** - [x] Replaced all 8 `Command::new()` calls with `SafeCommand::new()` (including verify() Windows path) - [x] Added `id` and `netsh` to SafeCommand whitelist in `command_guard.rs` - [x] Removed unused `use std::process::Command;` import - [x] Fixed 3 duplicate `#[cfg(not(windows))]` attributes - [x] Build verified — compiles cleanly --- ### SEC-05: ✅ RESOLVED — SQL injection vectors fixed with parameterized queries **Severity:** 🟠 HIGH **Files fixed:** - `botserver/src/basic/keywords/db_api.rs` - `botserver/src/security/sql_guard.rs` (already safe — uses validated identifiers) **Completed:** - [x] `search_records_handler`: User search term now uses `$1` bind parameter instead of `format!()` interpolation - [x] `get_record_handler`: Changed to use `build_safe_select_by_id_query()` from sql_guard - [x] `count_records_handler`: Changed to use `build_safe_count_query()` from sql_guard - [x] Added wildcard escaping (`%`, `_`) on search terms before passing to ILIKE - [x] Build verified — compiles cleanly **Remaining:** - [ ] Audit `contacts/contacts_api/service.rs` for similar patterns - [ ] Add SQL injection fuzzing tests - [ ] Consider migrating fully to Diesel query builder --- ### SEC-06: ✅ PARTIALLY RESOLVED — `unwrap()`/`expect()` reduction started **Severity:** 🟠 HIGH **Scope:** `botserver/src/` (~637 non-test instances remaining) **Completed:** - [x] Fixed `rate_limiter.rs`: Replaced `expect()` with compile-time const `NonZeroU32` values - [x] Security module production code reviewed and fixed **Remaining:** - [ ] Continue systematic elimination in: `core/`, `llm/`, `main.rs`, `auto_task/` - [ ] Replace with `?`, `.ok_or_else()`, `.unwrap_or_default()`, or `if let` - [ ] Add a CI clippy lint to deny new `unwrap()`/`expect()` in non-test code - [ ] Target: eliminate 50 instances per week --- ## 🟠 P1 — HIGH PRIORITY IMPROVEMENTS ### IMP-01: Massive file sizes violating 450-line rule **Severity:** 🟠 HIGH **Total codebase:** 289,453 lines across `botserver/src/` Top offenders (vs 450 max policy): | File | Lines | Oversize By | |------|-------|-------------| | `auto_task/app_generator.rs` | 3,586 | 7.9× | | `auto_task/autotask_api.rs` | 2,301 | 5.1× | | `basic/mod.rs` | 2,095 | 4.7× | | `core/bot/mod.rs` | 1,584 | 3.5× | | `channels/pinterest.rs` | 1,565 | 3.5× | | `drive/mod.rs` | 1,525 | 3.4× | | `whatsapp/mod.rs` | 1,516 | 3.4× | | `channels/snapchat.rs` | 1,500 | 3.3× | | `security/rbac_middleware.rs` | 1,498 | 3.3× | | `basic/keywords/crm/attendance.rs` | 1,495 | 3.3× | | `core/package_manager/installer.rs` | 1,473 | 3.3× | | `workspaces/mod.rs` | 1,370 | 3.0× | | `drive/drive_monitor/mod.rs` | 1,329 | 3.0× | | `video/engine.rs` | 1,318 | 2.9× | | `core/package_manager/facade.rs` | 1,313 | 2.9× | **Actions:** - [ ] Split `auto_task/app_generator.rs` (3586 lines) → ~8 modules - [ ] Split `auto_task/autotask_api.rs` (2301 lines) → ~5 modules - [ ] Split `basic/mod.rs` (2095 lines) → ~5 modules - [ ] Split `core/bot/mod.rs` (1584 lines) → ~4 modules - [ ] Continue down the list — 20+ files exceed 450 lines --- ### IMP-02: Shell scripts lack proper safety measures **Severity:** 🟡 MEDIUM **Files:** `reset.sh`, `stop.sh`, `DEPENDENCIES.sh` | Script | Issue | |--------|-------| | `reset.sh` | No shebang, no `set -e`, destructive `rm -rf` without confirmation | | `stop.sh` | No shebang, no `set -e`, uses `pkill -9` (SIGKILL) without graceful shutdown | | `DEPENDENCIES.sh` | Excessive indentation, no `set -e` after shebang, missing `apt-get update` before install | **Actions:** - [ ] Add `#!/bin/bash` and `set -euo pipefail` to `reset.sh` and `stop.sh` - [ ] Add confirmation prompt to `reset.sh` before deleting data - [ ] In `stop.sh`, try SIGTERM first, then SIGKILL after timeout - [ ] In `DEPENDENCIES.sh`, add `apt-get update` before `apt-get install` - [ ] Fix indentation in `DEPENDENCIES.sh` (8-space indent throughout) --- ### IMP-03: Repository root polluted with debug/test artifacts **Severity:** 🟡 MEDIUM **Files in root that don't belong:** | File | Should Be | |------|-----------| | `cristo-batizado.png`, `cristo-home.png`, etc. (10 PNGs) | In `.gitignore` (already) or deleted | | `start.bas`, `test_begin_blocks.bas` | Move to `bottemplates/` or `tests/` | | `init.json` | Tracked by git — remove (see SEC-03) | | `COMPILATION_FIXES_SUMMARY.md` | Move to `botbook/` or delete | | `PROMPT.md` | Move to `botbook/` or `.todo/` | | `botserver-new.log` | Add to `.gitignore` | | `vault-unseal-keys` | DELETE and purge history (see SEC-01) | **Actions:** - [ ] Delete or move all `.png` screenshot files from root - [ ] Move `start.bas`, `test_begin_blocks.bas` to appropriate directories - [ ] Move documentation `.md` files to `botbook/` - [ ] Add `*-new.log` pattern to `.gitignore` - [ ] Clean up root to contain only essential workspace files --- ### IMP-04: `unsafe` block in production code **Severity:** 🟡 MEDIUM **File:** `botserver/src/llm/rate_limiter.rs:99` ```rust .unwrap_or_else(|| unsafe { NonZeroU32::new_unchecked(1) }) ``` While this specific case is sound (1 is non-zero), using `unsafe` sets a bad precedent and can be replaced with safe alternatives. **Actions:** - [ ] Replace with `NonZeroU32::new(1).unwrap()` (compile-time guaranteed) or `NonZeroU32::MIN` - [ ] Add a workspace-wide `#![deny(unsafe_code)]` policy (with exceptions documented) --- ### IMP-05: Missing `cargo-audit` for dependency vulnerability scanning **Severity:** 🟡 MEDIUM `cargo-audit` is not installed, meaning no automated dependency vulnerability scanning is happening. The README recommends weekly `cargo audit` runs but the tool isn't available. **Actions:** - [ ] Install `cargo-audit`: `cargo install cargo-audit` - [ ] Run `cargo audit` and fix any findings - [ ] Add `cargo audit` to CI pipeline - [ ] Set up `dependabot` or `renovate` for automated dependency updates --- ### IMP-06: CORS configuration may be too permissive **Severity:** 🟡 MEDIUM **File:** `botserver/src/security/cors.rs` Multiple `allow_origin` patterns exist including predicate-based validation. Need to verify the predicate function properly validates origins and doesn't allow wildcards in production. **Actions:** - [ ] Audit `validate_origin` predicate function - [ ] Ensure production CORS is restricted to specific known domains - [ ] Add CORS configuration tests - [ ] Document allowed origins in configuration --- ## 🟡 P2 — MEDIUM PRIORITY IMPROVEMENTS ### IMP-07: Rate limiter defaults may be too generous **Severity:** 🟡 MEDIUM **File:** `botserver/src/security/rate_limiter.rs` Default rate limits: - General: 100 req/s, 200 burst - Auth: 50 req/s, 100 burst - API: 500 req/s, 1000 burst 500 req/s for API with 1000 burst is very high for a bot platform and may not protect against DDoS. **Actions:** - [ ] Review rate limits against actual traffic patterns - [ ] Add per-IP and per-user rate limiting (not just global) - [ ] Add rate limiting for WebSocket connections - [ ] Consider tiered rate limits based on authentication status --- ### IMP-08: CSRF protection implementation needs validation **Severity:** 🟡 MEDIUM **File:** `botserver/src/security/csrf.rs` CSRF token system exists but needs verification that it's properly integrated into all state-changing endpoints. **Actions:** - [ ] Verify CSRF middleware is applied to ALL POST/PUT/DELETE routes - [ ] Ensure CSRF tokens are properly bound to user sessions - [ ] Add CSRF bypass tests (attempt requests without valid token) - [ ] Document CSRF exemptions (if any, e.g., API key-authenticated routes) --- ### IMP-09: Missing security headers audit **Severity:** 🟡 MEDIUM **File:** `botserver/src/security/headers.rs` Security headers module exists but needs verification of completeness. **Actions:** - [ ] Verify all headers are set: `X-Frame-Options`, `X-Content-Type-Options`, `Strict-Transport-Security`, `Content-Security-Policy`, `Referrer-Policy`, `Permissions-Policy` - [ ] Test with security header scanners (Mozilla Observatory, securityheaders.com) - [ ] Ensure CSP is properly restrictive (no `unsafe-inline` or `unsafe-eval`) --- ### IMP-10: No dependency pinning — using caret versions **Severity:** 🟡 MEDIUM **File:** `Cargo.toml` Most dependencies use minimum version specifiers (e.g., `"1.0"`, `"0.4"`) which resolve to the latest compatible version. While `Cargo.lock` pins exact versions, the lock file is `.gitignore`'d, meaning different developers/CI will get different dependency versions. **Actions:** - [ ] Remove `Cargo.lock` from `.gitignore` — it should be tracked for applications (not libraries) - [ ] Consider using exact versions for critical dependencies (security, crypto) - [ ] Document dependency update procedure --- ### IMP-11: Stale submodule references **Severity:** 🟡 MEDIUM `git status` shows 5 submodules with uncommitted changes: ``` m botapp m botbook m botlib m bottemplates m bottest ``` **Actions:** - [ ] For each dirty submodule: commit, push, and update parent reference - [ ] Add submodule status check to CI - [ ] Document submodule workflow more prominently --- ## 🔵 P3 — LOW PRIORITY / NICE-TO-HAVE ### IMP-12: Add git pre-commit hook for secret scanning **Actions:** - [ ] Install `gitleaks` or `trufflehog` as a pre-commit hook - [ ] Scan for patterns: API keys, tokens, passwords, private keys - [ ] Block commits containing secrets --- ### IMP-13: ✅ RESOLVED — README.md refactored **Severity:** 🟡 MEDIUM **Status:** ✅ Split into `README.md` (architecture) and `AGENTS.md` (LLM rules). Original issue: README was 1335 lines. Now split for better AI/human separation. **Completed:** - [x] Extract security policy & LLM rules → `AGENTS.md` - [x] Keep README focused: overview, quick start, architecture --- ### IMP-14: ~40 TODO/FIXME/HACK/XXX comments in codebase **Actions:** - [ ] Triage all 40 TODO comments — either fix them or create issues - [ ] Remove stale TODOs - [ ] Replace `HACK`/`XXX` with proper solutions --- ### IMP-15: Missing integration test coverage **Severity:** 🔵 LOW **File:** `bottest/` README mentions 80%+ coverage goal for critical paths but no coverage reports are generated. **Actions:** - [ ] Set up `cargo-tarpaulin` or `llvm-cov` for coverage reports - [ ] Add coverage gate to CI (fail if below threshold) - [ ] Prioritize tests for: auth flows, session management, script execution, drive sync --- ### IMP-16: `package.json` has both `puppeteer` and `@playwright/test` **Severity:** 🔵 LOW **File:** `package.json` Two browser automation tools installed. Choose one and remove the other. **Actions:** - [ ] Decide on Playwright or Puppeteer - [ ] Remove unused tool dependency - [ ] Clean up `node_modules` --- ### IMP-17: `Cargo.lock` is gitignored **Severity:** 🟡 MEDIUM **File:** `.gitignore` line 37 For applications (not libraries), `Cargo.lock` should be committed to ensure reproducible builds. This workspace produces binaries (`botserver`, `botui`, `botapp`) — so the lock file should be tracked. **Actions:** - [ ] Remove `Cargo.lock` from `.gitignore` - [ ] Commit the current `Cargo.lock` - [ ] Update contributing guidelines --- ### IMP-18: Missing Dockerfile / container deployment **Severity:** 🔵 LOW No Dockerfile or container configuration found, despite having container dependencies (LXC in `DEPENDENCIES.sh`). **Actions:** - [ ] Create multi-stage `Dockerfile` for production builds - [ ] Create `docker-compose.yml` for development environment - [ ] Document container deployment process --- ### IMP-19: No CI/CD configuration found in `.github/` or `.forgejo/` **Severity:** 🟡 MEDIUM `.github/` and `.forgejo/` directories exist but need verification of CI pipeline configuration. **Actions:** - [ ] Verify CI runs: `cargo check`, `cargo clippy`, `cargo test`, `cargo audit` - [ ] Add security scanning step to CI - [ ] Add binary size tracking to CI - [ ] Add coverage reporting to CI --- ## 📊 Summary | Priority | Count | Category | |----------|-------|----------| | 🔴 P0 Critical | 6 | **4 fully resolved, 2 partially resolved** | | 🟠 P1 High | 6 | Significant improvements for stability/security | | 🟡 P2 Medium | 5 | Important quality and security improvements | | 🔵 P3 Low | 8 | Nice-to-have improvements and cleanup | | **Total** | **25** | **6 P0 items addressed this session** | ### ✅ Completed This Session (2026-02-19) 1. **SEC-01**: ✅ `vault-unseal-keys` removed from git tracking 2. **SEC-02**: ✅ Verified `.env` files untracked, created `.env.example` 3. **SEC-03**: ✅ `init.json` removed from git tracking, added to `.gitignore` 4. **SEC-04**: ✅ All 8 `Command::new()` replaced with `SafeCommand`, whitelist updated 5. **SEC-05**: ✅ SQL injection fixed — parameterized queries in search/get/count handlers 6. **SEC-06**: ✅ Started — `rate_limiter.rs` expect() calls replaced with const NonZeroU32 7. **Bonus**: ✅ `.gitignore` hardened with `*.pem`, `*.key`, `*.crt`, `*.cert` patterns 8. **Bonus**: ✅ Fixed 3 duplicate `#[cfg(not(windows))]` attributes in `installer.rs` ### 🔴 Still Requires Manual Action 1. **Rotate Vault unseal keys** (SEC-01) 2. **Rotate Vault tokens in .env** (SEC-02) 3. **Purge secrets from git history** using `git filter-repo` (SEC-01) --- *This document should be reviewed and updated weekly. Tasks should be moved to the project's issue tracker once triaged.*