diff --git a/.gitignore b/.gitignore
index 55227240..3f0d4652 100644
--- a/.gitignore
+++ b/.gitignore
@@ -28,3 +28,9 @@ packages/kotlin-platform-sdk/build/
packages/kotlin-platform-sdk/.gradle/
packages/kotlin-platform-sdk/gradle/
packages/kotlin-platform-sdk/gradlew
+
+# Rule violation scanner outputs (regenerated by scripts/check-rule-violations.sh)
+# Baseline reports are committed as rule-violations-baseline.* for diffing.
+reports/rule-violations-2*.json
+reports/rule-violations-2*.md
+!reports/rule-violations-baseline.md
diff --git a/reports/rule-violations-baseline.md b/reports/rule-violations-baseline.md
new file mode 100644
index 00000000..b42202d6
--- /dev/null
+++ b/reports/rule-violations-baseline.md
@@ -0,0 +1,2661 @@
+# Rule Violations Report — 2026-05-23
+
+> Generated by `scripts/check-rule-violations.sh` against canonical rules in
+> [`AI.dev/SKILLS/agent-behavior-guidelines.md`](../AI.dev/SKILLS/agent-behavior-guidelines.md).
+
+Severity legend: **critical** = data/security risk · **major** = rule violation · **minor** = style
+
+## `learning_ai_common_plat`
+
+**Counts:** critical=0 · major=435 · minor=86 · total=521
+
+- **[major]** `packages/logger/src/logger.ts:40` — console.log: console.log(`${prefix} ${message}${extras}`);
+- **[major]** `packages/create-app/src/scaffolder.ts:60` — console.log: console.log(`
+- **[major]** `packages/create-app/src/scaffolder.ts:115` — console.log: console.log('\n📦 ByteLyst Product Scaffolder\n');
+- **[major]** `packages/create-app/src/scaffolder.ts:126` — console.log: console.log('\nPlatforms (comma-separated: web, mobile, ios, android)');
+- **[major]** `packages/create-app/src/scaffolder.ts:135` — console.log: console.log('\nFeatures (comma-separated: auth, billing, telemetry, flags, syn
+- **[major]** `packages/create-app/src/scaffolder.ts:257` — console.log: console.log(`\n🚀 Scaffolding ${manifest.displayName}`);
+- **[major]** `packages/create-app/src/scaffolder.ts:259` — console.log: console.log(` Product ID: ${manifest.productId}`);
+- **[major]** `packages/create-app/src/scaffolder.ts:261` — console.log: console.log(` Output: ${outPath}`);
+- **[major]** `packages/create-app/src/scaffolder.ts:263` — console.log: console.log(` Platforms: ${manifest.platforms.join(', ')}`);
+- **[major]** `packages/create-app/src/scaffolder.ts:265` — console.log: console.log(` Features: ${manifest.features.join(', ')}`);
+- **[major]** `packages/create-app/src/scaffolder.ts:268` — console.log: console.log(' ⚠️ DRY RUN\n');
+- **[major]** `packages/create-app/src/scaffolder.ts:275` — console.log: console.log(`📄 ${files.length} files would be generated:\n`);
+- **[major]** `packages/create-app/src/scaffolder.ts:278` — console.log: console.log(`── ${file.path} ──────────────────────────────────────`);
+- **[major]** `packages/create-app/src/scaffolder.ts:280` — console.log: console.log(file.content);
+- **[major]** `packages/create-app/src/scaffolder.ts:283` — console.log: console.log(`\n✨ Dry run complete. Re-run without --dry-run to write files.`
+- **[major]** `packages/create-app/src/scaffolder.ts:293` — console.log: console.log(` ✅ ${file.path}`);
+- **[major]** `packages/create-app/src/scaffolder.ts:297` — console.log: console.log(`\n✨ ${manifest.displayName} scaffolded at ${outPath}`);
+- **[major]** `packages/create-app/src/scaffolder.ts:299` — console.log: console.log(`\nNext steps:`);
+- **[major]** `packages/create-app/src/scaffolder.ts:301` — console.log: console.log(` cd ${outDir}/backend && npm install && npm run dev`);
+- **[major]** `packages/create-app/src/scaffolder.ts:304` — console.log: console.log(` cd ${outDir}/web && npm install && npm run dev`);
+- **[major]** `packages/create-app/src/generators/agents-md.ts:49` — console.log: console.log(`
+- **[major]** `packages/create-app/src/generators/agents-md.ts:528` — console.log: console.log(` 📝 Would create symlink: ${target} → AGENTS.md`);
+- **[major]** `packages/create-app/src/generators/agents-md.ts:533` — console.log: console.log(` ✅ ${target} → AGENTS.md`);
+- **[major]** `packages/create-app/src/generators/agents-md.ts:535` — console.log: console.log(
+- **[major]** `packages/create-app/src/generators/agents-md.ts:549` — console.log: console.log(`\n📄 AGENTS.md Generator`);
+- **[major]** `packages/create-app/src/generators/agents-md.ts:550` — console.log: console.log(` Repo: ${repoPath}`);
+- **[major]** `packages/create-app/src/generators/agents-md.ts:551` — console.log: if (dryRun) console.log(' ⚠️ DRY RUN — no files will be written\n');
+- **[major]** `packages/create-app/src/generators/agents-md.ts:552` — console.log: if (update) console.log(' 🔄 UPDATE mode — preserving custom sections\n');
+- **[major]** `packages/create-app/src/generators/agents-md.ts:556` — console.log: console.log(` Product: ${manifest.displayName} (${manifest.productId})`);
+- **[major]** `packages/create-app/src/generators/agents-md.ts:560` — console.log: console.log(` Backend modules: ${info.backendModules.length}`);
+- **[major]** `packages/create-app/src/generators/agents-md.ts:561` — console.log: console.log(` Tests: ~${info.backendTestCount + info.webTestCount + info.mob
+- **[major]** `packages/create-app/src/generators/agents-md.ts:562` — console.log: console.log('');
+- **[major]** `packages/create-app/src/generators/agents-md.ts:574` — console.log: console.log(` 🔄 Preserving ${customSections.size} custom section(s)`);
+- **[major]** `packages/create-app/src/generators/agents-md.ts:578` — console.log: console.log(' ℹ️ No existing AGENTS.md to preserve custom sections from
+- **[major]** `packages/create-app/src/generators/agents-md.ts:583` — console.log: console.log('── AGENTS.md ──────────────────────────────────────');
+- **[major]** `packages/create-app/src/generators/agents-md.ts:584` — console.log: console.log(content);
+- **[major]** `packages/create-app/src/generators/agents-md.ts:585` — console.log: console.log('\n── Symlinks ──────────────────────────────────────');
+- **[major]** `packages/create-app/src/generators/agents-md.ts:587` — console.log: console.log('\n✨ Dry run complete.');
+- **[major]** `packages/create-app/src/generators/agents-md.ts:594` — console.log: console.log(` ✅ AGENTS.md written`);
+- **[major]** `packages/create-app/src/generators/agents-md.ts:599` — console.log: console.log(`\n✨ AGENTS.md generated for ${manifest.displayName}.`);
+- **[major]** `packages/create-app/src/generators/api-routes.ts:92` — console.log: console.log(`
+- **[major]** `packages/create-app/src/generators/api-routes.ts:670` — console.log: console.log(`\n🚀 Generating API routes: ${name}`);
+- **[major]** `packages/create-app/src/generators/api-routes.ts:671` — console.log: console.log(` Mode: ${mode}`);
+- **[major]** `packages/create-app/src/generators/api-routes.ts:672` — console.log: console.log(` Methods: ${methods.join(', ')}`);
+- **[major]** `packages/create-app/src/generators/api-routes.ts:673` — console.log: console.log(` Target: ${target}`);
+- **[major]** `packages/create-app/src/generators/api-routes.ts:674` — console.log: if (fields) console.log(` Fields: ${fields}`);
+- **[major]** `packages/create-app/src/generators/api-routes.ts:675` — console.log: if (dryRun) console.log(' ⚠️ DRY RUN — no files will be written\n');
+- **[major]** `packages/create-app/src/generators/api-routes.ts:725` — console.log: console.log('📄 Generated files:\n');
+- **[major]** `packages/create-app/src/generators/api-routes.ts:727` — console.log: console.log(`── ${file.path} ──────────────────────────────────────`);
+- **[major]** `packages/create-app/src/generators/api-routes.ts:728` — console.log: console.log(file.content);
+- **[major]** `packages/create-app/src/generators/api-routes.ts:730` — console.log: console.log(`\n✨ Dry run complete. Re-run without --dry-run to write files.`
+- **[major]** `packages/create-app/src/generators/api-routes.ts:742` — console.log: console.log(` ⚠️ SKIP ${file.path} (already exists)`);
+- **[major]** `packages/create-app/src/generators/api-routes.ts:749` — console.log: console.log(` ✅ ${file.path}`);
+- **[major]** `packages/create-app/src/generators/api-routes.ts:752` — console.log: console.log(`\n✨ API routes generated for "${name}".`);
+- **[major]** `packages/create-app/src/generators/api-routes.ts:754` — console.log: console.log(`\nPrerequisites (if not already present):`);
+- **[major]** `packages/create-app/src/generators/api-routes.ts:755` — console.log: console.log(` - lib/auth-server.ts — getCurrentUser(authHeader) function`)
+- **[major]** `packages/create-app/src/generators/api-routes.ts:756` — console.log: console.log(` - lib/api-handler.ts — withErrorHandler HOF`);
+- **[major]** `packages/create-app/src/generators/api-routes.ts:757` — console.log: console.log(` - lib/datastore.ts — getCosmosContainer + PRODUCT_ID`);
+- **[major]** `packages/create-app/src/generators/api-routes.ts:758` — console.log: console.log(` - zod installed — npm install zod`);
+- **[major]** `packages/create-app/src/generators/api-routes.ts:760` — console.log: console.log(`\nPrerequisites (if not already present):`);
+- **[major]** `packages/create-app/src/generators/api-routes.ts:761` — console.log: console.log(` - lib/api-helpers.ts — getAccessToken(req) function`);
+- **[major]** `packages/create-app/src/generators/api-routes.ts:762` — console.log: console.log(` - lib/api-handler.ts — withErrorHandler HOF`);
+- **[major]** `packages/create-app/src/generators/api-routes.ts:763` — console.log: console.log(` - NEXT_PUBLIC_BACKEND_URL env var (or defaults to localhost:
+- **[major]** `packages/mcp-client/src/index.ts:51` — console.log: console.log(
+- **[major]** `packages/mcp-client/src/index.ts:76` — console.log: console.log('[MCP] Successfully connected to MCP server');
+- **[major]** `packages/mcp-client/src/index.ts:102` — console.log: console.log('[MCP] Disconnected from MCP server');
+- **[major]** `packages/mcp-client/src/index.ts:155` — console.log: console.log(`[MCP] Tool ${toolName} executed successfully`);
+- **[major]** `packages/mcp-client/src/index.ts:321` — console.log: console.log(`[MCP-AUDIT] Tool called: ${toolName}, Args: ${JSON.stringify(sa
+- **[major]** `packages/mcp-client/src/index.ts:325` — console.log: console.log(`[MCP-AUDIT] Tool succeeded: ${toolName}`);
+- **[major]** `services/extraction-service/src/modules/extract/product-rate-limit.ts:408` — console.log: console.log(`[product-rate-limit] Cleaned up ${cleaned} expired entries`
+- **[major]** `services/extraction-service/src/modules/extract/sidecar-monitor.ts:295` — console.log: console.log(
+- **[major]** `services/monitoring/health-check.ts:39` — console.log: console.log(`🩺 Monitoring dashboard running on http://localhost:${PORT}`);
+- **[major]** `services/monitoring/health-check.ts:40` — console.log: console.log(` Checking ${DEFAULT_SERVICES.length} services every request`)
+- **[major]** `services/monitoring/health-check.ts:46` — console.log: console.log(`\n${icon[report.overall]} Overall: ${report.overall.toUpperCase()
+- **[major]** `services/monitoring/health-check.ts:50` — console.log: console.log(
+- **[major]** `services/monitoring/health-check.ts:55` — console.log: console.log(`\nHealthy: ${report.summary.healthy}/${report.summary.total}`);
+- **[major]** `packages/swift-diagnostics/Sources/ByteLystDiagnostics/Core/Configuration.swift:88` — Swift print(): print("[DEBUG] \(message)")
+- **[major]** `packages/swift-diagnostics/Sources/ByteLystDiagnostics/Core/Configuration.swift:93` — Swift print(): print("[INFO] \(message)")
+- **[major]** `packages/swift-diagnostics/Sources/ByteLystDiagnostics/Core/Configuration.swift:97` — Swift print(): print("[WARN] \(message)")
+- **[major]** `packages/swift-diagnostics/Sources/ByteLystDiagnostics/Core/Configuration.swift:101` — Swift print(): print("[ERROR] \(message)")
+- **[minor]** `dashboards/admin-web/src/app/(dashboard)/ops/ab-testing/page.tsx:135` — any type: return {config.label};
+- **[minor]** `packages/mcp-client/src/index.ts:16` — any type: inputSchema?: any;
+- **[minor]** `packages/mcp-client/src/index.ts:20` — any type: data: any;
+- **[minor]** `packages/mcp-client/src/index.ts:77` — any type: } catch (error: any) {
+- **[minor]** `packages/mcp-client/src/index.ts:103` — any type: } catch (error: any) {
+- **[minor]** `packages/mcp-client/src/index.ts:109` — any type: async callTool(toolName: string, args: any = {}): Promise {
+- **[minor]** `packages/mcp-client/src/index.ts:143` — any type: const response = result.content as any[];
+- **[minor]** `packages/mcp-client/src/index.ts:160` — any type: } catch (error: any) {
+- **[minor]** `packages/mcp-client/src/index.ts:190` — any type: return response.tools.map((tool: any) => ({
+- **[minor]** `packages/mcp-client/src/index.ts:195` — any type: } catch (error: any) {
+- **[minor]** `packages/mcp-client/src/index.ts:225` — any type: private getCacheKey(toolName: string, args: any): string {
+- **[minor]** `packages/mcp-client/src/index.ts:229` — any type: private getFromCache(key: string): any | null {
+- **[minor]** `packages/mcp-client/src/index.ts:244` — any type: private setCache(key: string, data: any): void {
+- **[minor]** `packages/mcp-client/src/index.ts:269` — any type: private isNonRetriableError(error: any): boolean {
+- **[minor]** `packages/mcp-client/src/index.ts:318` — any type: private auditLogToolCall(toolName: string, args: any): void {
+- **[minor]** `packages/mcp-client/src/index.ts:332` — any type: private sanitizeArgs(args: any): any {
+- **[minor]** `services/platform-service/src/server.ts:304` — any type: const auth = (request as any).auth;
+- **[minor]** `services/platform-service/src/server.ts:335` — any type: } catch (error: any) {
+- **[minor]** `services/extraction-service/src/modules/transcribe/routes.ts:5` — any type: * Product-agnostic: any product backend can call this endpoint.
+- **[major]** `dashboards/admin-web/src/app/api/themes/active/route.ts:30` — Hardcoded hex color: #5A8CFF
+- **[major]** `dashboards/admin-web/src/app/login/page.tsx:205` — Hardcoded hex color: #4285F4
+- **[major]** `dashboards/admin-web/src/app/login/page.tsx:209` — Hardcoded hex color: #34A853
+- **[major]** `dashboards/admin-web/src/app/login/page.tsx:213` — Hardcoded hex color: #FBBC05
+- **[major]** `dashboards/admin-web/src/app/login/page.tsx:217` — Hardcoded hex color: #EA4335
+- **[major]** `dashboards/admin-web/src/components/ThemeEditor.tsx:78` — Hardcoded hex color: #5A8CFF
+- **[major]** `dashboards/admin-web/src/components/ThemeEditor.tsx:127` — Hardcoded hex color: #5A8CFF
+- **[major]** `dashboards/tracker-web/src/app/health/page.tsx:43` — Hardcoded hex color: #dc2626
+- **[major]** `dashboards/tracker-web/src/app/health/page.tsx:56` — Hardcoded hex color: #6b7280
+- **[major]** `dashboards/tracker-web/src/app/health/page.tsx:61` — Hardcoded hex color: #16a34a
+- **[major]** `dashboards/tracker-web/src/app/health/page.tsx:61` — Hardcoded hex color: #dc2626
+- **[major]** `dashboards/tracker-web/src/app/health/page.tsx:74` — Hardcoded hex color: #e5e7eb
+- **[major]** `dashboards/tracker-web/src/app/health/page.tsx:82` — Hardcoded hex color: #e5e7eb
+- **[major]** `dashboards/tracker-web/src/app/health/page.tsx:85` — Hardcoded hex color: #6b7280
+- **[major]** `dashboards/tracker-web/src/app/login/page.tsx:310` — Hardcoded hex color: #4285F4
+- **[major]** `dashboards/tracker-web/src/app/login/page.tsx:314` — Hardcoded hex color: #34A853
+- **[major]** `dashboards/tracker-web/src/app/login/page.tsx:318` — Hardcoded hex color: #FBBC05
+- **[major]** `dashboards/tracker-web/src/app/login/page.tsx:322` — Hardcoded hex color: #EA4335
+- **[major]** `packages/ui/.storybook/preview.ts:8` — Hardcoded hex color: #06070A
+- **[major]** `packages/ui/.storybook/preview.ts:9` — Hardcoded hex color: #0E1118
+- **[major]** `packages/ui/.storybook/preview.ts:10` — Hardcoded hex color: #F8F9FC
+- **[major]** `packages/ui/src/components/ConfirmDialog.tsx:40` — Hardcoded hex color: #12151c
+- **[major]** `packages/ui/src/components/ConfirmDialog.tsx:40` — Hardcoded hex color: #2a2a4a
+- **[major]** `packages/ui/src/components/ConfirmDialog.tsx:40` — Hardcoded hex color: #fff
+- **[major]** `packages/ui/src/components/ConfirmDialog.tsx:57` — Hardcoded hex color: #a0a0b0
+- **[major]** `packages/ui/src/components/Card.tsx:27` — Hardcoded hex color: #1a1a2e
+- **[major]** `packages/ui/src/components/Card.tsx:27` — Hardcoded hex color: #2a2a4a
+- **[major]** `packages/ui/src/components/Card.tsx:28` — Hardcoded hex color: #252540
+- **[major]** `packages/ui/src/components/Card.tsx:28` — Hardcoded hex color: #2a2a4a
+- **[major]** `packages/ui/src/components/Card.tsx:30` — Hardcoded hex color: #12151c
+- **[major]** `packages/ui/src/components/Card.tsx:30` — Hardcoded hex color: #2a2a4a
+- **[major]** `packages/ui/src/components/Card.tsx:31` — Hardcoded hex color: #2a2a4a
+- **[major]** `packages/ui/src/components/Card.tsx:40` — Hardcoded hex color: #5A8CFF
+- **[major]** `packages/ui/src/components/Card.tsx:67` — Hardcoded hex color: #fff
+- **[major]** `packages/ui/src/components/Card.tsx:82` — Hardcoded hex color: #a0a0b0
+- **[major]** `packages/ui/src/components/StatCard.tsx:21` — Hardcoded hex color: #1a1a2e
+- **[major]** `packages/ui/src/components/StatCard.tsx:21` — Hardcoded hex color: #2a2a4a
+- **[major]** `packages/ui/src/components/StatCard.tsx:27` — Hardcoded hex color: #a0a0b0
+- **[major]** `packages/ui/src/components/StatCard.tsx:30` — Hardcoded hex color: #fff
+- **[major]** `packages/ui/src/components/StatCard.tsx:35` — Hardcoded hex color: #252540
+- **[major]** `packages/ui/src/components/StatCard.tsx:35` — Hardcoded hex color: #a0a0b0
+- **[major]** `packages/ui/src/components/StatCard.tsx:46` — Hardcoded hex color: #34D399
+- **[major]** `packages/ui/src/components/StatCard.tsx:47` — Hardcoded hex color: #FF6E6E
+- **[major]** `packages/ui/src/components/StatCard.tsx:48` — Hardcoded hex color: #a0a0b0
+- **[major]** `packages/ui/src/components/StatCard.tsx:54` — Hardcoded hex color: #34D399
+- **[major]** `packages/ui/src/components/StatCard.tsx:55` — Hardcoded hex color: #FF6E6E
+- **[major]** `packages/ui/src/components/StatCard.tsx:56` — Hardcoded hex color: #a0a0b0
+- **[major]** `packages/ui/src/components/Label.tsx:12` — Hardcoded hex color: #a0a0b0
+- **[major]** `packages/ui/src/components/LoadingSpinner.tsx:29` — Hardcoded hex color: #5A8CFF
+- **[major]** `packages/ui/src/components/LoadingSpinner.tsx:30` — Hardcoded hex color: #a0a0b0
+- **[major]** `packages/ui/src/components/Badge.tsx:21` — Hardcoded hex color: #252540
+- **[major]** `packages/ui/src/components/Badge.tsx:21` — Hardcoded hex color: #a0a0b0
+- **[major]** `packages/ui/src/components/Badge.tsx:21` — Hardcoded hex color: #2a2a4a
+- **[major]** `packages/ui/src/components/Sidebar.tsx:33` — Hardcoded hex color: #2a2a4a
+- **[major]** `packages/ui/src/components/Sidebar.tsx:33` — Hardcoded hex color: #12151c
+- **[major]** `packages/ui/src/components/Sidebar.tsx:34` — Hardcoded hex color: #fff
+- **[major]** `packages/ui/src/components/Sidebar.tsx:58` — Hardcoded hex color: #2a2a4a
+- **[major]** `packages/ui/src/components/Sidebar.tsx:58` — Hardcoded hex color: #12151c
+- **[major]** `packages/ui/src/components/Sidebar.tsx:65` — Hardcoded hex color: #2a2a4a
+- **[major]** `packages/ui/src/components/Sidebar.tsx:72` — Hardcoded hex color: #2a2a4a
+- **[major]** `packages/ui/src/components/Sidebar.tsx:72` — Hardcoded hex color: #a0a0b0
+- **[major]** `packages/ui/src/components/Sidebar.tsx:96` — Hardcoded hex color: #5A8CFF
+- **[major]** `packages/ui/src/components/Sidebar.tsx:98` — Hardcoded hex color: #1a1a2e
+- **[major]** `packages/ui/src/components/Sidebar.tsx:98` — Hardcoded hex color: #fff
+- **[major]** `packages/ui/src/components/Sidebar.tsx:99` — Hardcoded hex color: #a0a0b0
+- **[major]** `packages/ui/src/components/Sidebar.tsx:99` — Hardcoded hex color: #252540
+- **[major]** `packages/ui/src/components/Sidebar.tsx:99` — Hardcoded hex color: #fff
+- **[major]** `packages/ui/src/components/Separator.tsx:14` — Hardcoded hex color: #2a2a4a
+- **[major]** `packages/ui/src/components/Separator.tsx:24` — Hardcoded hex color: #2a2a4a
+- **[major]** `packages/ui/src/components/Button.tsx:21` — Hardcoded hex color: #5A8CFF
+- **[major]** `packages/ui/src/components/Button.tsx:21` — Hardcoded hex color: #0b0f17
+- **[major]** `packages/ui/src/components/Button.tsx:25` — Hardcoded hex color: #5A8CFF
+- **[major]** `packages/ui/src/components/Button.tsx:25` — Hardcoded hex color: #0b0f17
+- **[major]** `packages/ui/src/components/Button.tsx:27` — Hardcoded hex color: #2a2a4a
+- **[major]** `packages/ui/src/components/Button.tsx:27` — Hardcoded hex color: #1a1a2e
+- **[major]** `packages/ui/src/components/Button.tsx:27` — Hardcoded hex color: #fff
+- **[major]** `packages/ui/src/components/Button.tsx:27` — Hardcoded hex color: #2a2a4a
+- **[major]** `packages/ui/src/components/Button.tsx:27` — Hardcoded hex color: #252540
+- **[major]** `packages/ui/src/components/Button.tsx:29` — Hardcoded hex color: #a0a0b0
+- **[major]** `packages/ui/src/components/Button.tsx:29` — Hardcoded hex color: #252540
+- **[major]** `packages/ui/src/components/Button.tsx:29` — Hardcoded hex color: #fff
+- **[major]** `packages/ui/src/components/Button.tsx:31` — Hardcoded hex color: #fff
+- **[major]** `packages/ui/src/components/Button.tsx:33` — Hardcoded hex color: #2a2a4a
+- **[major]** `packages/ui/src/components/Button.tsx:33` — Hardcoded hex color: #fff
+- **[major]** `packages/ui/src/components/Button.tsx:33` — Hardcoded hex color: #5A8CFF
+- **[major]** `packages/ui/src/components/Button.tsx:33` — Hardcoded hex color: #252540
+- **[major]** `packages/ui/src/components/Button.tsx:35` — Hardcoded hex color: #252540
+- **[major]** `packages/ui/src/components/Button.tsx:35` — Hardcoded hex color: #fff
+- **[major]** `packages/ui/src/components/Button.tsx:35` — Hardcoded hex color: #1a1a2e
+- **[major]** `packages/ui/src/components/Button.tsx:36` — Hardcoded hex color: #5A8CFF
+- **[major]** `packages/ui/src/components/Modal.tsx:40` — Hardcoded hex color: #12151c
+- **[major]** `packages/ui/src/components/Modal.tsx:40` — Hardcoded hex color: #2a2a4a
+- **[major]** `packages/ui/src/components/Modal.tsx:40` — Hardcoded hex color: #fff
+- **[major]** `packages/ui/src/components/Modal.tsx:47` — Hardcoded hex color: #a0a0b0
+- **[major]** `packages/ui/src/components/Modal.tsx:54` — Hardcoded hex color: #666
+- **[major]** `packages/ui/src/components/Modal.tsx:54` — Hardcoded hex color: #fff
+- **[major]** `packages/ui/src/components/Toast.tsx:52` — Hardcoded hex color: #1a1a2e
+- **[major]** `packages/ui/src/components/Toast.tsx:52` — Hardcoded hex color: #2a2a4a
+- **[major]** `packages/ui/src/components/Toast.tsx:52` — Hardcoded hex color: #fff
+- **[major]** `packages/ui/src/components/Toast.tsx:59` — Hardcoded hex color: #a0a0b0
+- **[major]** `packages/ui/src/components/Toast.tsx:66` — Hardcoded hex color: #666
+- **[major]** `packages/ui/src/components/Toast.tsx:66` — Hardcoded hex color: #fff
+- **[major]** `packages/ui/src/components/EmptyState.tsx:30` — Hardcoded hex color: #555
+- **[major]** `packages/ui/src/components/EmptyState.tsx:33` — Hardcoded hex color: #fff
+- **[major]** `packages/ui/src/components/EmptyState.tsx:35` — Hardcoded hex color: #a0a0b0
+- **[major]** `packages/ui/src/components/CardButton.tsx:51` — Hardcoded hex color: #5A8CFF
+- **[major]** `packages/ui/src/components/CardButton.tsx:51` — Hardcoded hex color: #0b0f17
+- **[major]** `packages/ui/src/components/CardButton.tsx:55` — Hardcoded hex color: #5A8CFF
+- **[major]** `packages/ui/src/components/Select.tsx:37` — Hardcoded hex color: #1a1a2e
+- **[major]** `packages/ui/src/components/Select.tsx:38` — Hardcoded hex color: #252540
+- **[major]** `packages/ui/src/components/Select.tsx:47` — Hardcoded hex color: #a0a0b0
+- **[major]** `packages/ui/src/components/Select.tsx:60` — Hardcoded hex color: #fff
+- **[major]** `packages/ui/src/components/Select.tsx:62` — Hardcoded hex color: #5A8CFF
+- **[major]** `packages/ui/src/components/Select.tsx:63` — Hardcoded hex color: #2a2a4a
+- **[major]** `packages/ui/src/components/Select.tsx:82` — Hardcoded hex color: #555
+- **[major]** `packages/ui/src/components/Textarea.tsx:25` — Hardcoded hex color: #1a1a2e
+- **[major]** `packages/ui/src/components/Textarea.tsx:26` — Hardcoded hex color: #252540
+- **[major]** `packages/ui/src/components/Textarea.tsx:35` — Hardcoded hex color: #a0a0b0
+- **[major]** `packages/ui/src/components/Textarea.tsx:47` — Hardcoded hex color: #fff
+- **[major]** `packages/ui/src/components/Textarea.tsx:48` — Hardcoded hex color: #555
+- **[major]** `packages/ui/src/components/Textarea.tsx:50` — Hardcoded hex color: #5A8CFF
+- **[major]** `packages/ui/src/components/Textarea.tsx:51` — Hardcoded hex color: #2a2a4a
+- **[major]** `packages/ui/src/components/Textarea.tsx:64` — Hardcoded hex color: #555
+- **[major]** `packages/ui/src/components/Input.tsx:25` — Hardcoded hex color: #1a1a2e
+- **[major]** `packages/ui/src/components/Input.tsx:26` — Hardcoded hex color: #252540
+- **[major]** `packages/ui/src/components/Input.tsx:35` — Hardcoded hex color: #a0a0b0
+- **[major]** `packages/ui/src/components/Input.tsx:47` — Hardcoded hex color: #fff
+- **[major]** `packages/ui/src/components/Input.tsx:48` — Hardcoded hex color: #555
+- **[major]** `packages/ui/src/components/Input.tsx:50` — Hardcoded hex color: #5A8CFF
+- **[major]** `packages/ui/src/components/Input.tsx:51` — Hardcoded hex color: #2a2a4a
+- **[major]** `packages/ui/src/components/Input.tsx:64` — Hardcoded hex color: #555
+- **[major]** `packages/devops/src/ui.tsx:76` — Hardcoded hex color: #ef4444
+- **[major]** `packages/devops/src/ui.tsx:136` — Hardcoded hex color: #ef4444
+- **[major]** `packages/devops/src/ui.tsx:305` — Hardcoded hex color: #6b7280
+- **[major]** `packages/devops/src/ui.tsx:306` — Hardcoded hex color: #6b7280
+- **[major]** `packages/devops/src/ui.tsx:310` — Hardcoded hex color: #e5e7eb
+- **[major]** `packages/devops/src/ui.tsx:318` — Hardcoded hex color: #6b7280
+- **[major]** `packages/devops/src/ui.tsx:323` — Hardcoded hex color: #2563eb
+- **[major]** `packages/devops/src/ui.tsx:324` — Hardcoded hex color: #fff
+- **[major]** `packages/devops/src/ui.tsx:330` — Hardcoded hex color: #e5e7eb
+- **[major]** `packages/devops/src/ui.tsx:338` — Hardcoded hex color: #e5e7eb
+- **[major]** `packages/devops/src/ui.tsx:349` — Hardcoded hex color: #6b7280
+- **[major]** `packages/devops/src/ui.tsx:354` — Hardcoded hex color: #2563eb
+- **[major]** `packages/devops/src/ui.tsx:365` — Hardcoded hex color: #f3f4f6
+- **[major]** `packages/devops/src/ui.tsx:369` — Hardcoded hex color: #6b7280
+- **[major]** `packages/devops/src/ui.tsx:385` — Hardcoded hex color: #000
+- **[major]** `packages/devops/src/ui.tsx:393` — Hardcoded hex color: #000
+- **[major]** `packages/devops/src/ui.tsx:409` — Hardcoded hex color: #10b981
+- **[major]** `packages/devops/src/ui.tsx:410` — Hardcoded hex color: #10b981
+- **[major]** `packages/devops/src/ui.tsx:413` — Hardcoded hex color: #ef4444
+- **[major]** `packages/devops/src/ui.tsx:414` — Hardcoded hex color: #ef4444
+- **[major]** `packages/devops/src/ui.tsx:419` — Hardcoded hex color: #6b7280
+- **[major]** `packages/feature-flag-client/src/client.ts:27` — Hardcoded hex color: #000000
+- **[major]** `packages/config/src/product-manifest.ts:23` — Hardcoded hex color: #5AE68C
+- **[major]** `packages/config/src/product-manifest.ts:229` — Hardcoded hex color: #5AE68C
+- **[major]** `packages/config/src/product-manifest.ts:230` — Hardcoded hex color: #5A8CFF
+- **[major]** `packages/config/src/product-manifest.ts:231` — Hardcoded hex color: #2EE6D6
+- **[major]** `packages/config/src/product-manifest.ts:232` — Hardcoded hex color: #06070A
+- **[major]** `packages/config/src/product-manifest.ts:233` — Hardcoded hex color: #121725
+- **[major]** `packages/config/src/product-manifest.ts:234` — Hardcoded hex color: #EFF4FF
+- **[major]** `packages/config/src/product-manifest.ts:235` — Hardcoded hex color: #FF6E6E
+- **[major]** `packages/config/src/product-manifest.ts:236` — Hardcoded hex color: #F59E0B
+- **[major]** `packages/config/src/product-manifest.ts:237` — Hardcoded hex color: #34D399
+- **[major]** `packages/auth-ui/src/VerifyEmailForm.tsx:30` — Hardcoded hex color: #333
+- **[major]** `packages/auth-ui/src/VerifyEmailForm.tsx:47` — Hardcoded hex color: #ccc
+- **[major]** `packages/auth-ui/src/VerifyEmailForm.tsx:61` — Hardcoded hex color: #dc3545
+- **[major]** `packages/auth-ui/src/VerifyEmailForm.tsx:70` — Hardcoded hex color: #22c55e
+- **[major]** `packages/auth-ui/src/VerifyEmailForm.tsx:84` — Hardcoded hex color: #0066ff
+- **[major]** `packages/auth-ui/src/VerifyEmailForm.tsx:85` — Hardcoded hex color: #fff
+- **[major]** `packages/auth-ui/src/VerifyEmailForm.tsx:105` — Hardcoded hex color: #0066ff
+- **[major]** `packages/auth-ui/src/MfaChallenge.tsx:29` — Hardcoded hex color: #333
+- **[major]** `packages/auth-ui/src/MfaChallenge.tsx:36` — Hardcoded hex color: #999
+- **[major]** `packages/auth-ui/src/MfaChallenge.tsx:55` — Hardcoded hex color: #ccc
+- **[major]** `packages/auth-ui/src/MfaChallenge.tsx:67` — Hardcoded hex color: #dc3545
+- **[major]** `packages/auth-ui/src/MfaChallenge.tsx:81` — Hardcoded hex color: #0066ff
+- **[major]** `packages/auth-ui/src/MfaChallenge.tsx:82` — Hardcoded hex color: #fff
+- **[major]** `packages/auth-ui/src/MfaChallenge.tsx:102` — Hardcoded hex color: #0066ff
+- **[major]** `packages/auth-ui/src/ForgotPasswordForm.tsx:25` — Hardcoded hex color: #ccc
+- **[major]** `packages/auth-ui/src/ForgotPasswordForm.tsx:38` — Hardcoded hex color: #333
+- **[major]** `packages/auth-ui/src/ForgotPasswordForm.tsx:56` — Hardcoded hex color: #dc3545
+- **[major]** `packages/auth-ui/src/ForgotPasswordForm.tsx:65` — Hardcoded hex color: #22c55e
+- **[major]** `packages/auth-ui/src/ForgotPasswordForm.tsx:79` — Hardcoded hex color: #0066ff
+- **[major]** `packages/auth-ui/src/ForgotPasswordForm.tsx:80` — Hardcoded hex color: #fff
+- **[major]** `packages/auth-ui/src/ForgotPasswordForm.tsx:99` — Hardcoded hex color: #0066ff
+- **[major]** `packages/auth-ui/src/AuthPageLayout.tsx:27` — Hardcoded hex color: #f5f5f5
+- **[major]** `packages/auth-ui/src/AuthPageLayout.tsx:35` — Hardcoded hex color: #fff
+- **[major]** `packages/auth-ui/src/AuthPageLayout.tsx:53` — Hardcoded hex color: #111
+- **[major]** `packages/auth-ui/src/AuthPageLayout.tsx:62` — Hardcoded hex color: #333
+- **[major]** `packages/auth-ui/src/AuthPageLayout.tsx:71` — Hardcoded hex color: #666
+- **[major]** `packages/auth-ui/src/AuthPageLayout.tsx:88` — Hardcoded hex color: #eee
+- **[major]** `packages/auth-ui/src/AuthPageLayout.tsx:91` — Hardcoded hex color: #999
+- **[major]** `packages/auth-ui/src/LoginForm.tsx:41` — Hardcoded hex color: #ccc
+- **[major]** `packages/auth-ui/src/LoginForm.tsx:56` — Hardcoded hex color: #ccc
+- **[major]** `packages/auth-ui/src/LoginForm.tsx:65` — Hardcoded hex color: #dc3545
+- **[major]** `packages/auth-ui/src/LoginForm.tsx:79` — Hardcoded hex color: #0066ff
+- **[major]** `packages/auth-ui/src/LoginForm.tsx:80` — Hardcoded hex color: #fff
+- **[major]** `packages/auth-ui/src/LoginForm.tsx:99` — Hardcoded hex color: #999
+- **[major]** `packages/auth-ui/src/LoginForm.tsx:104` — Hardcoded hex color: #eee
+- **[major]** `packages/auth-ui/src/LoginForm.tsx:108` — Hardcoded hex color: #eee
+- **[major]** `packages/auth-ui/src/RegisterForm.tsx:42` — Hardcoded hex color: #ccc
+- **[major]** `packages/auth-ui/src/RegisterForm.tsx:55` — Hardcoded hex color: #333
+- **[major]** `packages/auth-ui/src/RegisterForm.tsx:69` — Hardcoded hex color: #333
+- **[major]** `packages/auth-ui/src/RegisterForm.tsx:83` — Hardcoded hex color: #333
+- **[major]** `packages/auth-ui/src/RegisterForm.tsx:100` — Hardcoded hex color: #333
+- **[major]** `packages/auth-ui/src/RegisterForm.tsx:114` — Hardcoded hex color: #dc3545
+- **[major]** `packages/auth-ui/src/RegisterForm.tsx:122` — Hardcoded hex color: #dc3545
+- **[major]** `packages/auth-ui/src/RegisterForm.tsx:135` — Hardcoded hex color: #333
+- **[major]** `packages/auth-ui/src/RegisterForm.tsx:152` — Hardcoded hex color: #0066ff
+- **[major]** `packages/auth-ui/src/RegisterForm.tsx:164` — Hardcoded hex color: #0066ff
+- **[major]** `packages/auth-ui/src/RegisterForm.tsx:177` — Hardcoded hex color: #dc3545
+- **[major]** `packages/auth-ui/src/RegisterForm.tsx:191` — Hardcoded hex color: #0066ff
+- **[major]** `packages/auth-ui/src/RegisterForm.tsx:192` — Hardcoded hex color: #fff
+- **[major]** `packages/auth-ui/src/RegisterForm.tsx:203` — Hardcoded hex color: #999
+- **[major]** `packages/auth-ui/src/RegisterForm.tsx:212` — Hardcoded hex color: #0066ff
+- **[major]** `packages/auth-ui/src/ResetPasswordForm.tsx:30` — Hardcoded hex color: #ccc
+- **[major]** `packages/auth-ui/src/ResetPasswordForm.tsx:43` — Hardcoded hex color: #333
+- **[major]** `packages/auth-ui/src/ResetPasswordForm.tsx:47` — Hardcoded hex color: #333
+- **[major]** `packages/auth-ui/src/ResetPasswordForm.tsx:64` — Hardcoded hex color: #333
+- **[major]** `packages/auth-ui/src/ResetPasswordForm.tsx:78` — Hardcoded hex color: #dc3545
+- **[major]** `packages/auth-ui/src/ResetPasswordForm.tsx:86` — Hardcoded hex color: #dc3545
+- **[major]** `packages/auth-ui/src/ResetPasswordForm.tsx:95` — Hardcoded hex color: #dc3545
+- **[major]** `packages/auth-ui/src/ResetPasswordForm.tsx:104` — Hardcoded hex color: #22c55e
+- **[major]** `packages/auth-ui/src/ResetPasswordForm.tsx:118` — Hardcoded hex color: #0066ff
+- **[major]** `packages/auth-ui/src/ResetPasswordForm.tsx:119` — Hardcoded hex color: #fff
+- **[major]** `packages/auth-ui/src/SocialButtons.tsx:34` — Hardcoded hex color: #ccc
+- **[major]** `packages/auth-ui/src/SocialButtons.tsx:36` — Hardcoded hex color: #fff
+- **[major]** `packages/auth-ui/src/SocialButtons.tsx:37` — Hardcoded hex color: #333
+- **[major]** `packages/auth-ui/src/PasswordStrengthBar.tsx:10` — Hardcoded hex color: #dc3545
+- **[major]** `packages/auth-ui/src/PasswordStrengthBar.tsx:11` — Hardcoded hex color: #f59e0b
+- **[major]** `packages/auth-ui/src/PasswordStrengthBar.tsx:12` — Hardcoded hex color: #3b82f6
+- **[major]** `packages/auth-ui/src/PasswordStrengthBar.tsx:13` — Hardcoded hex color: #22c55e
+- **[major]** `packages/auth-ui/src/PasswordStrengthBar.tsx:44` — Hardcoded hex color: #e5e7eb
+- **[major]** `packages/auth-ui/src/OnboardingShell.tsx:28` — Hardcoded hex color: #e5e7eb
+- **[major]** `packages/auth-ui/src/OnboardingShell.tsx:38` — Hardcoded hex color: #0066ff
+- **[major]** `packages/auth-ui/src/OnboardingShell.tsx:67` — Hardcoded hex color: #0066ff
+- **[major]** `packages/auth-ui/src/OnboardingShell.tsx:69` — Hardcoded hex color: #22c55e
+- **[major]** `packages/auth-ui/src/OnboardingShell.tsx:70` — Hardcoded hex color: #999
+- **[major]** `packages/auth-ui/src/OnboardingShell.tsx:85` — Hardcoded hex color: #0066ff
+- **[major]** `packages/auth-ui/src/OnboardingShell.tsx:85` — Hardcoded hex color: #e5e7eb
+- **[major]** `packages/auth-ui/src/OnboardingShell.tsx:86` — Hardcoded hex color: #fff
+- **[major]** `packages/auth-ui/src/OnboardingShell.tsx:86` — Hardcoded hex color: #999
+- **[major]** `packages/auth-ui/src/OnboardingShell.tsx:116` — Hardcoded hex color: #ccc
+- **[major]** `packages/auth-ui/src/OnboardingShell.tsx:118` — Hardcoded hex color: #fff
+- **[major]** `packages/auth-ui/src/OnboardingShell.tsx:119` — Hardcoded hex color: #333
+- **[major]** `packages/auth-ui/src/OnboardingShell.tsx:136` — Hardcoded hex color: #0066ff
+- **[major]** `packages/auth-ui/src/OnboardingShell.tsx:137` — Hardcoded hex color: #fff
+- **[major]** `packages/dashboard-shell/src/DashboardShell.tsx:31` — Hardcoded hex color: #f9fafb
+- **[major]** `packages/dashboard-shell/src/TopBar.tsx:37` — Hardcoded hex color: #e5e7eb
+- **[major]** `packages/dashboard-shell/src/TopBar.tsx:38` — Hardcoded hex color: #fff
+- **[major]** `packages/dashboard-shell/src/TopBar.tsx:54` — Hardcoded hex color: #6b7280
+- **[major]** `packages/dashboard-shell/src/TopBar.tsx:76` — Hardcoded hex color: #6b7280
+- **[major]** `packages/dashboard-shell/src/TopBar.tsx:113` — Hardcoded hex color: #2563eb
+- **[major]** `packages/dashboard-shell/src/TopBar.tsx:114` — Hardcoded hex color: #fff
+- **[major]** `packages/dashboard-shell/src/TopBar.tsx:128` — Hardcoded hex color: #111827
+- **[major]** `packages/dashboard-shell/src/TopBar.tsx:145` — Hardcoded hex color: #fff
+- **[major]** `packages/dashboard-shell/src/TopBar.tsx:146` — Hardcoded hex color: #e5e7eb
+- **[major]** `packages/dashboard-shell/src/TopBar.tsx:156` — Hardcoded hex color: #e5e7eb
+- **[major]** `packages/dashboard-shell/src/TopBar.tsx:160` — Hardcoded hex color: #6b7280
+- **[major]** `packages/dashboard-shell/src/TopBar.tsx:216` — Hardcoded hex color: #e5e7eb
+- **[major]** `packages/dashboard-shell/src/TopBar.tsx:217` — Hardcoded hex color: #dc2626
+- **[major]** `packages/dashboard-shell/src/TopBar.tsx:222` — Hardcoded hex color: #e5e7eb
+- **[major]** `packages/dashboard-shell/src/TopBar.tsx:241` — Hardcoded hex color: #111827
+- **[major]** `packages/dashboard-shell/src/SettingsPage.tsx:12` — Hardcoded hex color: #111827
+- **[major]** `packages/dashboard-shell/src/SettingsPage.tsx:24` — Hardcoded hex color: #6b7280
+- **[major]** `packages/dashboard-shell/src/SettingsPage.tsx:39` — Hardcoded hex color: #e5e7eb
+- **[major]** `packages/dashboard-shell/src/SettingsPage.tsx:41` — Hardcoded hex color: #fff
+- **[major]** `packages/dashboard-shell/src/SettingsPage.tsx:49` — Hardcoded hex color: #111827
+- **[major]** `packages/dashboard-shell/src/SettingsPage.tsx:58` — Hardcoded hex color: #6b7280
+- **[major]** `packages/dashboard-shell/src/ProfilePage.tsx:26` — Hardcoded hex color: #111827
+- **[major]** `packages/dashboard-shell/src/ProfilePage.tsx:33` — Hardcoded hex color: #dc2626
+- **[major]** `packages/dashboard-shell/src/ProfilePage.tsx:38` — Hardcoded hex color: #16a34a
+- **[major]** `packages/dashboard-shell/src/ProfilePage.tsx:51` — Hardcoded hex color: #2563eb
+- **[major]** `packages/dashboard-shell/src/ProfilePage.tsx:52` — Hardcoded hex color: #fff
+- **[major]** `packages/dashboard-shell/src/ProfilePage.tsx:77` — Hardcoded hex color: #6b7280
+- **[major]** `packages/dashboard-shell/src/ProfilePage.tsx:84` — Hardcoded hex color: #6b7280
+- **[major]** `packages/dashboard-shell/src/ProfilePage.tsx:137` — Hardcoded hex color: #2563eb
+- **[major]** `packages/dashboard-shell/src/ProfilePage.tsx:138` — Hardcoded hex color: #fff
+- **[major]** `packages/dashboard-shell/src/ProfilePage.tsx:156` — Hardcoded hex color: #111827
+- **[major]** `packages/dashboard-shell/src/ProfilePage.tsx:163` — Hardcoded hex color: #e5e7eb
+- **[major]** `packages/dashboard-shell/src/ProfilePage.tsx:165` — Hardcoded hex color: #fff
+- **[major]** `packages/dashboard-shell/src/ProfilePage.tsx:166` — Hardcoded hex color: #111827
+- **[major]** `packages/dashboard-shell/src/BillingPage.tsx:5` — Hardcoded hex color: #16a34a
+- **[major]** `packages/dashboard-shell/src/BillingPage.tsx:6` — Hardcoded hex color: #d97706
+- **[major]** `packages/dashboard-shell/src/BillingPage.tsx:7` — Hardcoded hex color: #dc2626
+- **[major]** `packages/dashboard-shell/src/BillingPage.tsx:8` — Hardcoded hex color: #6b7280
+- **[major]** `packages/dashboard-shell/src/BillingPage.tsx:25` — Hardcoded hex color: #111827
+- **[major]** `packages/dashboard-shell/src/BillingPage.tsx:37` — Hardcoded hex color: #e5e7eb
+- **[major]** `packages/dashboard-shell/src/BillingPage.tsx:39` — Hardcoded hex color: #fff
+- **[major]** `packages/dashboard-shell/src/BillingPage.tsx:54` — Hardcoded hex color: #6b7280
+- **[major]** `packages/dashboard-shell/src/BillingPage.tsx:61` — Hardcoded hex color: #111827
+- **[major]** `packages/dashboard-shell/src/BillingPage.tsx:85` — Hardcoded hex color: #d97706
+- **[major]** `packages/dashboard-shell/src/BillingPage.tsx:98` — Hardcoded hex color: #e5e7eb
+- **[major]** `packages/dashboard-shell/src/BillingPage.tsx:102` — Hardcoded hex color: #fff
+- **[major]** `packages/dashboard-shell/src/BillingPage.tsx:103` — Hardcoded hex color: #111827
+- **[major]** `packages/dashboard-shell/src/BillingPage.tsx:119` — Hardcoded hex color: #111827
+- **[major]** `packages/dashboard-shell/src/BillingPage.tsx:140` — Hardcoded hex color: #2563eb
+- **[major]** `packages/dashboard-shell/src/BillingPage.tsx:141` — Hardcoded hex color: #e5e7eb
+- **[major]** `packages/dashboard-shell/src/BillingPage.tsx:142` — Hardcoded hex color: #fff
+- **[major]** `packages/dashboard-shell/src/BillingPage.tsx:151` — Hardcoded hex color: #2563eb
+- **[major]** `packages/dashboard-shell/src/BillingPage.tsx:163` — Hardcoded hex color: #6b7280
+- **[major]** `packages/dashboard-shell/src/BillingPage.tsx:176` — Hardcoded hex color: #2563eb
+- **[major]** `packages/dashboard-shell/src/Sidebar.tsx:44` — Hardcoded hex color: #111827
+- **[major]** `packages/dashboard-shell/src/Sidebar.tsx:45` — Hardcoded hex color: #6b7280
+- **[major]** `packages/dashboard-shell/src/Sidebar.tsx:47` — Hardcoded hex color: #f3f4f6
+- **[major]** `packages/dashboard-shell/src/Sidebar.tsx:66` — Hardcoded hex color: #2563eb
+- **[major]** `packages/dashboard-shell/src/Sidebar.tsx:67` — Hardcoded hex color: #fff
+- **[major]** `packages/dashboard-shell/src/Sidebar.tsx:104` — Hardcoded hex color: #fff
+- **[major]** `packages/dashboard-shell/src/Sidebar.tsx:105` — Hardcoded hex color: #e5e7eb
+- **[major]** `packages/dashboard-shell/src/Sidebar.tsx:118` — Hardcoded hex color: #e5e7eb
+- **[major]** `packages/dashboard-shell/src/Sidebar.tsx:135` — Hardcoded hex color: #2563eb
+- **[major]** `packages/dashboard-shell/src/Sidebar.tsx:153` — Hardcoded hex color: #6b7280
+- **[major]** `packages/dashboard-shell/src/Sidebar.tsx:183` — Hardcoded hex color: #6b7280
+- **[major]** `packages/dashboard-shell/src/Sidebar.tsx:220` — Hardcoded hex color: #e5e7eb
+- **[major]** `packages/dashboard-shell/src/Sidebar.tsx:222` — Hardcoded hex color: #6b7280
+- **[major]** `packages/create-app/src/lib/templates.ts:455` — Hardcoded hex color: #666
+- **[major]** `packages/dashboard-components/src/PageHeader.tsx:27` — Hardcoded hex color: #6b7280
+- **[major]** `packages/dashboard-components/src/PageHeader.tsx:37` — Hardcoded hex color: #6b7280
+- **[major]** `packages/dashboard-components/src/PageHeader.tsx:48` — Hardcoded hex color: #111827
+- **[major]** `packages/dashboard-components/src/ErrorPage.tsx:20` — Hardcoded hex color: #fef2f2
+- **[major]** `packages/dashboard-components/src/ErrorPage.tsx:24` — Hardcoded hex color: #ef4444
+- **[major]** `packages/dashboard-components/src/ErrorPage.tsx:39` — Hardcoded hex color: #111827
+- **[major]** `packages/dashboard-components/src/ErrorPage.tsx:45` — Hardcoded hex color: #6b7280
+- **[major]** `packages/dashboard-components/src/ErrorPage.tsx:53` — Hardcoded hex color: #2563eb
+- **[major]** `packages/dashboard-components/src/LoadingSkeleton.tsx:15` — Hardcoded hex color: #e5e7eb
+- **[major]** `packages/dashboard-components/src/NotFoundPage.tsx:27` — Hardcoded hex color: #9ca3af
+- **[major]** `packages/dashboard-components/src/NotFoundPage.tsx:33` — Hardcoded hex color: #111827
+- **[major]** `packages/dashboard-components/src/NotFoundPage.tsx:37` — Hardcoded hex color: #6b7280
+- **[major]** `packages/dashboard-components/src/NotFoundPage.tsx:45` — Hardcoded hex color: #2563eb
+- **[major]** `packages/dashboard-components/src/NotFoundPage.tsx:53` — Hardcoded hex color: #2563eb
+- **[major]** `packages/dashboard-components/src/EmptyState.tsx:28` — Hardcoded hex color: #f3f4f6
+- **[major]** `packages/dashboard-components/src/EmptyState.tsx:35` — Hardcoded hex color: #111827
+- **[major]** `packages/dashboard-components/src/EmptyState.tsx:39` — Hardcoded hex color: #6b7280
+- **[major]** `packages/dashboard-components/src/EmptyState.tsx:46` — Hardcoded hex color: #2563eb
+- **[major]** `services/platform-service/src/modules/status/routes.ts:22` — Hardcoded hex color: #f7f4ec
+- **[major]** `services/platform-service/src/modules/status/routes.ts:23` — Hardcoded hex color: #fffdf8
+- **[major]** `services/platform-service/src/modules/status/routes.ts:24` — Hardcoded hex color: #1f2933
+- **[major]** `services/platform-service/src/modules/status/routes.ts:25` — Hardcoded hex color: #52606d
+- **[major]** `services/platform-service/src/modules/status/routes.ts:26` — Hardcoded hex color: #1f7a3d
+- **[major]** `services/platform-service/src/modules/status/routes.ts:27` — Hardcoded hex color: #b42318
+- **[major]** `services/platform-service/src/modules/status/routes.ts:28` — Hardcoded hex color: #d9d3c4
+- **[major]** `services/platform-service/src/modules/status/routes.ts:33` — Hardcoded hex color: #f7f4ec
+- **[major]** `services/platform-service/src/modules/status/routes.ts:33` — Hardcoded hex color: #f2efe6
+- **[major]** `services/platform-service/src/modules/delivery/templates.ts:205` — Hardcoded hex color: #dc3545
+- **[major]** `services/platform-service/src/modules/themes/routes.ts:24` — Hardcoded hex color: #4caf50
+- **[major]** `services/platform-service/src/modules/themes/routes.ts:25` — Hardcoded hex color: #2e7d32
+- **[major]** `services/platform-service/src/modules/themes/routes.ts:26` — Hardcoded hex color: #66bb6a
+- **[major]** `services/platform-service/src/modules/themes/routes.ts:27` — Hardcoded hex color: #ffffff
+- **[major]** `services/platform-service/src/modules/themes/routes.ts:28` — Hardcoded hex color: #f5f5f5
+- **[major]** `services/platform-service/src/modules/themes/routes.ts:29` — Hardcoded hex color: #f44336
+- **[major]** `services/platform-service/src/modules/themes/routes.ts:30` — Hardcoded hex color: #ff9800
+- **[major]** `services/platform-service/src/modules/themes/routes.ts:31` — Hardcoded hex color: #4caf50
+- **[major]** `services/platform-service/src/modules/themes/routes.ts:36` — Hardcoded hex color: #4caf50
+- **[major]** `services/platform-service/src/modules/themes/routes.ts:37` — Hardcoded hex color: #e94560
+- **[major]** `services/platform-service/src/modules/themes/routes.ts:38` — Hardcoded hex color: #f5a623
+- **[major]** `services/platform-service/src/modules/themes/routes.ts:39` — Hardcoded hex color: #9e9e9e
+- **[minor]** `dashboards/admin-web/src/app/(dashboard)/surveys/[id]/page.tsx:21` — Emoji in code: 📊
+- **[minor]** `dashboards/admin-web/src/app/(dashboard)/surveys/[id]/page.tsx:22` — Emoji in code: 📝
+- **[minor]** `dashboards/admin-web/src/app/(dashboard)/surveys/[id]/page.tsx:23` — Emoji in code: 📄
+- **[minor]** `dashboards/tracker-web/src/app/roadmap/page.tsx:513` — Emoji in code: 💬
+- **[minor]** `dashboards/tracker-web/src/app/roadmap/page.tsx:569` — Emoji in code: 💬
+- **[minor]** `dashboards/tracker-web/src/app/dashboard/items/[id]/page.tsx:232` — Emoji in code: 🌐
+- **[minor]** `scripts/encrypt-migrate.ts:507` — Emoji in code: 📦
+- **[minor]** `scripts/encrypt-migrate.ts:510` — Emoji in code: 🔐
+- **[minor]** `scripts/encrypt-migrate.ts:589` — Emoji in code: 🏢
+- **[minor]** `packages/dashboard-shell/src/TopBar.tsx:80` — Emoji in code: 🔔
+- **[minor]** `packages/celebrations/src/index.ts:7` — Emoji in code: 👏
+- **[minor]** `packages/celebrations/src/index.ts:12` — Emoji in code: 🎉
+- **[minor]** `packages/celebrations/src/index.ts:14` — Emoji in code: 🔥
+- **[minor]** `packages/celebrations/src/index.ts:15` — Emoji in code: 🏆
+- **[minor]** `packages/swift-platform-sdk/Tests/BLFieldEncryptTests.swift:32` — Emoji in code: 🌍
+- **[minor]** `packages/create-app/src/scaffolder.ts:115` — Emoji in code: 📦
+- **[minor]** `packages/create-app/src/scaffolder.ts:257` — Emoji in code: 🚀
+- **[minor]** `packages/create-app/src/scaffolder.ts:275` — Emoji in code: 📄
+- **[minor]** `packages/create-app/src/generators/agents-md.ts:528` — Emoji in code: 📝
+- **[minor]** `packages/create-app/src/generators/agents-md.ts:549` — Emoji in code: 📄
+- **[minor]** `packages/create-app/src/generators/agents-md.ts:552` — Emoji in code: 🔄
+- **[minor]** `packages/create-app/src/generators/agents-md.ts:574` — Emoji in code: 🔄
+- **[minor]** `packages/create-app/src/generators/api-routes.ts:670` — Emoji in code: 🚀
+- **[minor]** `packages/create-app/src/generators/api-routes.ts:725` — Emoji in code: 📄
+- **[minor]** `packages/time-references/src/client.ts:16` — Emoji in code: 🎵
+- **[minor]** `packages/time-references/src/client.ts:23` — Emoji in code: 📺
+- **[minor]** `packages/time-references/src/client.ts:24` — Emoji in code: 🚶
+- **[minor]** `packages/time-references/src/client.ts:31` — Emoji in code: 🧘
+- **[minor]** `packages/time-references/src/client.ts:32` — Emoji in code: 📺
+- **[minor]** `packages/time-references/src/client.ts:39` — Emoji in code: 🎬
+- **[minor]** `packages/time-references/src/client.ts:40` — Emoji in code: 🚴
+- **[minor]** `packages/time-references/src/client.ts:47` — Emoji in code: 🚗
+- **[minor]** `packages/time-references/src/client.ts:48` — Emoji in code: 📺
+- **[minor]** `packages/time-references/src/client.ts:55` — Emoji in code: 💼
+- **[minor]** `packages/time-references/src/client.ts:56` — Emoji in code: 😴
+- **[minor]** `packages/time-references/src/client.ts:64` — Emoji in code: 🌅
+- **[minor]** `packages/time-references/src/client.ts:74` — Emoji in code: 🧙
+- **[minor]** `packages/time-references/src/client.ts:83` — Emoji in code: 🌍
+- **[minor]** `packages/time-references/src/client.ts:84` — Emoji in code: 🥾
+- **[minor]** `packages/time-references/src/client.ts:91` — Emoji in code: 🏆
+- **[minor]** `packages/time-references/src/client.ts:99` — Emoji in code: 🌟
+- **[minor]** `packages/time-references/src/index.ts:11` — Emoji in code: 🎬
+- **[minor]** `packages/time-references/src/index.ts:17` — Emoji in code: 🌙
+- **[minor]** `packages/time-references/src/index.ts:20` — Emoji in code: 🏔
+- **[minor]** `packages/time-references/src/index.ts:23` — Emoji in code: 🌍
+- **[minor]** `packages/time-references/src/index.ts:26` — Emoji in code: 🚂
+- **[minor]** `packages/time-references/src/index.ts:31` — Emoji in code: 🏕
+- **[minor]** `services/mcp-server/src/modules/dev/changelog-tools.ts:156` — Emoji in code: 📊
+- **[minor]** `services/mcp-server/src/modules/dev/changelog-tools.ts:164` — Emoji in code: 🚨
+- **[minor]** `services/mcp-server/src/modules/dev/changelog-tools.ts:183` — Emoji in code: 🐛
+- **[minor]** `services/mcp-server/src/modules/dev/changelog-tools.ts:185` — Emoji in code: 📚
+- **[minor]** `services/mcp-server/src/modules/dev/changelog-tools.ts:186` — Emoji in code: 🧪
+- **[minor]** `services/mcp-server/src/modules/dev/changelog-tools.ts:187` — Emoji in code: 🔧
+- **[minor]** `services/mcp-server/src/modules/dev/changelog-tools.ts:189` — Emoji in code: 🎨
+- **[minor]** `services/mcp-server/src/modules/dev/changelog-tools.ts:190` — Emoji in code: 🔄
+- **[minor]** `services/mcp-server/src/modules/dev/changelog-tools.ts:191` — Emoji in code: 📝
+- **[minor]** `services/platform-service/scripts/gen-module.ts:515` — Emoji in code: 📝
+- **[minor]** `services/platform-service/scripts/gen-module.ts:551` — Emoji in code: 📝
+- **[minor]** `services/platform-service/scripts/gen-module.ts:608` — Emoji in code: 🚀
+- **[minor]** `services/platform-service/scripts/gen-module.ts:636` — Emoji in code: 📄
+- **[minor]** `services/platform-service/src/modules/predictive-analytics/campaign-engine.ts:451` — Emoji in code: 🚨
+- **[minor]** `services/platform-service/src/modules/diagnostics/auto-triggers.ts:393` — Emoji in code: 🚨
+- **[minor]** `services/platform-service/src/modules/diagnostics/auto-triggers.ts:427` — Emoji in code: 🚨
+- **[minor]** `services/platform-service/src/modules/delivery/templates.ts:203` — Emoji in code: 🚨
+- **[minor]** `services/platform-service/src/modules/delivery/templates.ts:205` — Emoji in code: 🚨
+- **[minor]** `services/platform-service/src/modules/delivery/templates.ts:214` — Emoji in code: 🚨
+- **[minor]** `services/monitoring/health-check.ts:39` — Emoji in code: 🩺
+
+## `learning_voice_ai_agent`
+
+**Counts:** critical=2 · major=29 · minor=89 · total=120
+
+- **[major]** `src/audio/sounds.py:115` — Python print(): print("\a", end="", flush=True)
+- **[major]** `src/audio/sounds.py:120` — Python print(): print("\a", end="", flush=True)
+- **[major]** `src/hotkey/fn_listener.py:93` — Python print(): print(
+- **[major]** `src/cli_output.py:30` — Python print(): print(message) # noqa: T201 — intentional CLI output
+- **[major]** `src/cli_output.py:36` — Python print(): print(message, file=sys.stderr) # noqa: T201 — intentional CLI output
+- **[minor]** `user-dashboard-web/src/lib/api-handler.ts:10` — any type: type RouteHandler = (req: NextRequest, ctx: any) => Promise Promiseowner:any
+- **[minor]** `web/src/app/(app)/workspaces/page.tsx:199` — any type: visibility:any
+- **[minor]** `backend/src/lib/request-context.ts:15` — any type: return _ctx.getRequestProductId(req as any);
+- **[minor]** `backend/src/lib/request-context.ts:20` — any type: return _ctx.getUserId(req as any);
+- **[minor]** `mobile/src/app/(tabs)/capture.tsx:16` — Emoji in code: 📷
+- **[minor]** `mobile/src/app/(tabs)/capture.tsx:17` — Emoji in code: 🎙
+- **[minor]** `mobile/src/app/(tabs)/capture.tsx:18` — Emoji in code: 🔗
+- **[minor]** `mobile/src/app/(tabs)/capture.tsx:19` — Emoji in code: 📄
+- **[minor]** `mobile/src/app/(tabs)/capture.tsx:20` — Emoji in code: 📋
+- **[minor]** `mobile/src/app/(tabs)/capture/scan.tsx:21` — Emoji in code: 📄
+- **[minor]** `mobile/src/app/(tabs)/capture/voice.tsx:22` — Emoji in code: 🎙
+
+## `learning_ai_flowmonk`
+
+**Counts:** critical=0 · major=151 · minor=4 · total=155
+
+- **[minor]** `web/src/app/(app)/tasks/page.tsx:153` — any type: { value: '', label: 'Energy: any' },
+- **[minor]** `backend/src/lib/scheduler/engine.ts:468` — any type: // Priority 3: any remaining slot (no zone match)
+- **[minor]** `backend/src/modules/tasks/repository.ts:28` — any type: const decrypted = await getEncryptor().decrypt(task.description as any, {
+- **[major]** `web/src/app/globals.css:6` — Hardcoded hex color: #5a8cff
+- **[major]** `web/src/app/globals.css:7` — Hardcoded hex color: #5a8cff
+- **[major]** `web/src/app/globals.css:8` — Hardcoded hex color: #f59e0b
+- **[major]** `web/src/app/globals.css:9` — Hardcoded hex color: #ff6e6e
+- **[major]** `web/src/app/globals.css:25` — Hardcoded hex color: #3b1117
+- **[major]** `web/src/app/globals.css:26` — Hardcoded hex color: #7f1d1d
+- **[major]** `web/src/app/globals.css:27` — Hardcoded hex color: #fca5a5
+- **[major]** `web/src/app/globals.css:28` — Hardcoded hex color: #422006
+- **[major]** `web/src/app/globals.css:29` — Hardcoded hex color: #92400e
+- **[major]** `web/src/app/globals.css:30` — Hardcoded hex color: #fcd34d
+- **[major]** `web/src/app/globals.css:31` — Hardcoded hex color: #ef4444
+- **[major]** `web/src/app/globals.css:32` — Hardcoded hex color: #f59e0b
+- **[major]** `web/src/app/globals.css:63` — Hardcoded hex color: #5A8CFF
+- **[major]** `web/src/app/globals.css:141` — Hardcoded hex color: #2a2a4a
+- **[major]** `web/src/app/globals.css:142` — Hardcoded hex color: #12151c
+- **[major]** `web/src/app/globals.css:143` — Hardcoded hex color: #fff
+- **[major]** `web/src/app/globals.css:165` — Hardcoded hex color: #F8FAFC
+- **[major]** `web/src/app/globals.css:166` — Hardcoded hex color: #FFFFFF
+- **[major]** `web/src/app/globals.css:167` — Hardcoded hex color: #FFFFFF
+- **[major]** `web/src/app/globals.css:168` — Hardcoded hex color: #F1F5F9
+- **[major]** `web/src/app/globals.css:169` — Hardcoded hex color: #0F172A
+- **[major]** `web/src/app/globals.css:170` — Hardcoded hex color: #475569
+- **[major]** `web/src/app/globals.css:171` — Hardcoded hex color: #94A3B8
+- **[major]** `backend/src/modules/zones/repository.ts:28` — Hardcoded hex color: #5A8CFF
+- **[major]** `backend/src/modules/zones/repository.ts:29` — Hardcoded hex color: #5AE68C
+- **[major]** `backend/src/modules/zones/repository.ts:30` — Hardcoded hex color: #FF6B6B
+- **[major]** `backend/src/modules/zones/repository.ts:31` — Hardcoded hex color: #FECA57
+- **[major]** `backend/src/modules/zones/repository.ts:32` — Hardcoded hex color: #A66BFF
+- **[major]** `backend/src/modules/zones/repository.ts:69` — Hardcoded hex color: #5A8CFF
+- **[major]** `backend/src/modules/zones/types.ts:9` — Hardcoded hex color: #5A8CFF
+- **[major]** `mobile/src/app/index.tsx:57` — Hardcoded hex color: #07111f
+- **[major]** `mobile/src/app/index.tsx:59` — Hardcoded hex color: #5ae68c
+- **[major]** `mobile/src/app/index.tsx:60` — Hardcoded hex color: #eff4ff
+- **[major]** `mobile/src/app/index.tsx:61` — Hardcoded hex color: #a8b4c8
+- **[major]** `mobile/src/app/index.tsx:64` — Hardcoded hex color: #0f1b2d
+- **[major]** `mobile/src/app/index.tsx:64` — Hardcoded hex color: #24344d
+- **[major]** `mobile/src/app/index.tsx:68` — Hardcoded hex color: #eff4ff
+- **[major]** `mobile/src/app/index.tsx:70` — Hardcoded hex color: #07111f
+- **[major]** `mobile/src/app/index.tsx:70` — Hardcoded hex color: #5ae68c
+- **[major]** `mobile/src/app/index.tsx:73` — Hardcoded hex color: #a8b4c8
+- **[major]** `mobile/src/app/urgent.tsx:39` — Hardcoded hex color: #ef4444
+- **[major]** `mobile/src/app/urgent.tsx:39` — Hardcoded hex color: #f59e0b
+- **[major]** `mobile/src/app/urgent.tsx:69` — Hardcoded hex color: #07111f
+- **[major]** `mobile/src/app/urgent.tsx:70` — Hardcoded hex color: #eff4ff
+- **[major]** `mobile/src/app/urgent.tsx:71` — Hardcoded hex color: #a8b4c8
+- **[major]** `mobile/src/app/urgent.tsx:74` — Hardcoded hex color: #22170a
+- **[major]** `mobile/src/app/urgent.tsx:74` — Hardcoded hex color: #5b4112
+- **[major]** `mobile/src/app/urgent.tsx:79` — Hardcoded hex color: #eff4ff
+- **[major]** `mobile/src/app/urgent.tsx:80` — Hardcoded hex color: #d9c7a4
+- **[major]** `mobile/src/app/urgent.tsx:81` — Hardcoded hex color: #a8b4c8
+- **[major]** `mobile/src/app/urgent.tsx:83` — Hardcoded hex color: #5b4112
+- **[major]** `mobile/src/app/urgent.tsx:84` — Hardcoded hex color: #5ae68c
+- **[major]** `mobile/src/app/urgent.tsx:85` — Hardcoded hex color: #f59e0b
+- **[major]** `mobile/src/app/urgent.tsx:86` — Hardcoded hex color: #5a8cff
+- **[major]** `mobile/src/app/urgent.tsx:88` — Hardcoded hex color: #a8b4c8
+- **[major]** `mobile/src/app/login.tsx:31` — Hardcoded hex color: #5a6a82
+- **[major]** `mobile/src/app/login.tsx:40` — Hardcoded hex color: #5a6a82
+- **[major]** `mobile/src/app/login.tsx:54` — Hardcoded hex color: #07111f
+- **[major]** `mobile/src/app/login.tsx:55` — Hardcoded hex color: #0f1b2d
+- **[major]** `mobile/src/app/login.tsx:56` — Hardcoded hex color: #5ae68c
+- **[major]** `mobile/src/app/login.tsx:57` — Hardcoded hex color: #a8b4c8
+- **[major]** `mobile/src/app/login.tsx:58` — Hardcoded hex color: #07111f
+- **[major]** `mobile/src/app/login.tsx:58` — Hardcoded hex color: #24344d
+- **[major]** `mobile/src/app/login.tsx:58` — Hardcoded hex color: #eff4ff
+- **[major]** `mobile/src/app/login.tsx:59` — Hardcoded hex color: #5ae68c
+- **[major]** `mobile/src/app/login.tsx:60` — Hardcoded hex color: #07111f
+- **[major]** `mobile/src/app/tasks.tsx:7` — Hardcoded hex color: #ef4444
+- **[major]** `mobile/src/app/tasks.tsx:8` — Hardcoded hex color: #f59e0b
+- **[major]** `mobile/src/app/tasks.tsx:9` — Hardcoded hex color: #5a8cff
+- **[major]** `mobile/src/app/tasks.tsx:10` — Hardcoded hex color: #a8b4c8
+- **[major]** `mobile/src/app/tasks.tsx:69` — Hardcoded hex color: #5ae68c
+- **[major]** `mobile/src/app/tasks.tsx:74` — Hardcoded hex color: #5a8cff
+- **[major]** `mobile/src/app/tasks.tsx:79` — Hardcoded hex color: #f59e0b
+- **[major]** `mobile/src/app/tasks.tsx:83` — Hardcoded hex color: #a8b4c8
+- **[major]** `mobile/src/app/tasks.tsx:98` — Hardcoded hex color: #07111f
+- **[major]** `mobile/src/app/tasks.tsx:99` — Hardcoded hex color: #eff4ff
+- **[major]** `mobile/src/app/tasks.tsx:100` — Hardcoded hex color: #a8b4c8
+- **[major]** `mobile/src/app/tasks.tsx:102` — Hardcoded hex color: #a8b4c8
+- **[major]** `mobile/src/app/tasks.tsx:104` — Hardcoded hex color: #0f1b2d
+- **[major]** `mobile/src/app/tasks.tsx:104` — Hardcoded hex color: #24344d
+- **[major]** `mobile/src/app/tasks.tsx:107` — Hardcoded hex color: #ef4444
+- **[major]** `mobile/src/app/tasks.tsx:110` — Hardcoded hex color: #eff4ff
+- **[major]** `mobile/src/app/tasks.tsx:111` — Hardcoded hex color: #fff
+- **[major]** `mobile/src/app/tasks.tsx:111` — Hardcoded hex color: #ef4444
+- **[major]** `mobile/src/app/tasks.tsx:112` — Hardcoded hex color: #a8b4c8
+- **[major]** `mobile/src/app/tasks.tsx:114` — Hardcoded hex color: #24344d
+- **[major]** `mobile/src/app/schedule.tsx:7` — Hardcoded hex color: #5a8cff
+- **[major]** `mobile/src/app/schedule.tsx:8` — Hardcoded hex color: #5ae68c
+- **[major]** `mobile/src/app/schedule.tsx:9` — Hardcoded hex color: #e879f9
+- **[major]** `mobile/src/app/schedule.tsx:10` — Hardcoded hex color: #f59e0b
+- **[major]** `mobile/src/app/schedule.tsx:71` — Hardcoded hex color: #24344d
+- **[major]** `mobile/src/app/schedule.tsx:81` — Hardcoded hex color: #5ae68c
+- **[major]** `mobile/src/app/schedule.tsx:84` — Hardcoded hex color: #f59e0b
+- **[major]** `mobile/src/app/schedule.tsx:87` — Hardcoded hex color: #5a8cff
+- **[major]** `mobile/src/app/schedule.tsx:105` — Hardcoded hex color: #07111f
+- **[major]** `mobile/src/app/schedule.tsx:107` — Hardcoded hex color: #eff4ff
+- **[major]** `mobile/src/app/schedule.tsx:108` — Hardcoded hex color: #a8b4c8
+- **[major]** `mobile/src/app/schedule.tsx:109` — Hardcoded hex color: #5ae68c
+- **[major]** `mobile/src/app/schedule.tsx:110` — Hardcoded hex color: #07111f
+- **[major]** `mobile/src/app/schedule.tsx:113` — Hardcoded hex color: #0f1b2d
+- **[major]** `mobile/src/app/schedule.tsx:113` — Hardcoded hex color: #24344d
+- **[major]** `mobile/src/app/schedule.tsx:117` — Hardcoded hex color: #5a8cff
+- **[major]** `mobile/src/app/schedule.tsx:118` — Hardcoded hex color: #a8b4c8
+- **[major]** `mobile/src/app/schedule.tsx:120` — Hardcoded hex color: #eff4ff
+- **[major]** `mobile/src/app/schedule.tsx:121` — Hardcoded hex color: #a8b4c8
+- **[major]** `mobile/src/app/schedule.tsx:123` — Hardcoded hex color: #24344d
+- **[major]** `mobile/src/app/schedule.tsx:125` — Hardcoded hex color: #a8b4c8
+- **[major]** `mobile/src/app/_layout.tsx:11` — Hardcoded hex color: #07111f
+- **[major]** `mobile/src/app/flows.tsx:55` — Hardcoded hex color: #07111f
+- **[major]** `mobile/src/app/flows.tsx:56` — Hardcoded hex color: #eff4ff
+- **[major]** `mobile/src/app/flows.tsx:57` — Hardcoded hex color: #a8b4c8
+- **[major]** `mobile/src/app/flows.tsx:60` — Hardcoded hex color: #0f1b2d
+- **[major]** `mobile/src/app/flows.tsx:60` — Hardcoded hex color: #24344d
+- **[major]** `mobile/src/app/flows.tsx:65` — Hardcoded hex color: #eff4ff
+- **[major]** `mobile/src/app/flows.tsx:66` — Hardcoded hex color: #a8b4c8
+- **[major]** `mobile/src/app/flows.tsx:66` — Hardcoded hex color: #24344d
+- **[major]** `mobile/src/app/flows.tsx:67` — Hardcoded hex color: #a8b4c8
+- **[major]** `mobile/src/app/flows.tsx:69` — Hardcoded hex color: #5a6a82
+- **[major]** `mobile/src/app/flows.tsx:71` — Hardcoded hex color: #a8b4c8
+- **[major]** `mobile/src/app/capture.tsx:44` — Hardcoded hex color: #5a6a82
+- **[major]** `mobile/src/app/capture.tsx:71` — Hardcoded hex color: #5a6a82
+- **[major]** `mobile/src/app/capture.tsx:83` — Hardcoded hex color: #07111f
+- **[major]** `mobile/src/app/capture.tsx:84` — Hardcoded hex color: #eff4ff
+- **[major]** `mobile/src/app/capture.tsx:86` — Hardcoded hex color: #a8b4c8
+- **[major]** `mobile/src/app/capture.tsx:88` — Hardcoded hex color: #0f1b2d
+- **[major]** `mobile/src/app/capture.tsx:88` — Hardcoded hex color: #24344d
+- **[major]** `mobile/src/app/capture.tsx:89` — Hardcoded hex color: #eff4ff
+- **[major]** `mobile/src/app/capture.tsx:94` — Hardcoded hex color: #24344d
+- **[major]** `mobile/src/app/capture.tsx:94` — Hardcoded hex color: #0f1b2d
+- **[major]** `mobile/src/app/capture.tsx:96` — Hardcoded hex color: #5a8cff
+- **[major]** `mobile/src/app/capture.tsx:96` — Hardcoded hex color: #5a8cff
+- **[major]** `mobile/src/app/capture.tsx:97` — Hardcoded hex color: #a8b4c8
+- **[major]** `mobile/src/app/capture.tsx:98` — Hardcoded hex color: #fff
+- **[major]** `mobile/src/app/capture.tsx:100` — Hardcoded hex color: #5ae68c
+- **[major]** `mobile/src/app/capture.tsx:102` — Hardcoded hex color: #07111f
+- **[major]** `mobile/src/app/recommendations.tsx:7` — Hardcoded hex color: #ef4444
+- **[major]** `mobile/src/app/recommendations.tsx:8` — Hardcoded hex color: #f59e0b
+- **[major]** `mobile/src/app/recommendations.tsx:9` — Hardcoded hex color: #5a8cff
+- **[major]** `mobile/src/app/recommendations.tsx:50` — Hardcoded hex color: #24344d
+- **[major]** `mobile/src/app/recommendations.tsx:78` — Hardcoded hex color: #07111f
+- **[major]** `mobile/src/app/recommendations.tsx:79` — Hardcoded hex color: #eff4ff
+- **[major]** `mobile/src/app/recommendations.tsx:80` — Hardcoded hex color: #a8b4c8
+- **[major]** `mobile/src/app/recommendations.tsx:83` — Hardcoded hex color: #0f1b2d
+- **[major]** `mobile/src/app/recommendations.tsx:88` — Hardcoded hex color: #eff4ff
+- **[major]** `mobile/src/app/recommendations.tsx:89` — Hardcoded hex color: #5a6a82
+- **[major]** `mobile/src/app/recommendations.tsx:90` — Hardcoded hex color: #a8b4c8
+- **[major]** `mobile/src/app/recommendations.tsx:92` — Hardcoded hex color: #5ae68c
+- **[major]** `mobile/src/app/recommendations.tsx:93` — Hardcoded hex color: #07111f
+- **[major]** `mobile/src/app/recommendations.tsx:94` — Hardcoded hex color: #24344d
+- **[major]** `mobile/src/app/recommendations.tsx:95` — Hardcoded hex color: #a8b4c8
+- **[major]** `mobile/src/app/recommendations.tsx:97` — Hardcoded hex color: #a8b4c8
+- **[minor]** `web/src/app/(app)/settings/page.tsx:74` — Emoji in code: 🌙
+
+## `learning_ai_trails`
+
+**Counts:** critical=0 · major=26 · minor=1 · total=27
+
+- **[major]** `web/src/app/error.tsx:9` — Hardcoded hex color: #07111F
+- **[major]** `web/src/app/error.tsx:11` — Hardcoded hex color: #FF6E6E
+- **[major]** `web/src/app/error.tsx:12` — Hardcoded hex color: #A8B4C8
+- **[major]** `web/src/app/error.tsx:18` — Hardcoded hex color: #5A8CFF
+- **[major]** `web/src/app/error.tsx:18` — Hardcoded hex color: #fff
+- **[major]** `web/src/app/loading.tsx:3` — Hardcoded hex color: #07111F
+- **[major]** `web/src/app/loading.tsx:7` — Hardcoded hex color: #5A8CFF
+- **[major]** `web/src/app/loading.tsx:9` — Hardcoded hex color: #A8B4C8
+- **[major]** `web/src/app/globals.css:47` — Hardcoded hex color: #5A8CFF
+- **[major]** `web/src/app/globals.css:109` — Hardcoded hex color: #2a2a4a
+- **[major]** `web/src/app/globals.css:110` — Hardcoded hex color: #12151c
+- **[major]** `web/src/app/globals.css:111` — Hardcoded hex color: #fff
+- **[major]** `web/src/app/globals.css:133` — Hardcoded hex color: #F8FAFC
+- **[major]** `web/src/app/globals.css:134` — Hardcoded hex color: #FFFFFF
+- **[major]** `web/src/app/globals.css:135` — Hardcoded hex color: #FFFFFF
+- **[major]** `web/src/app/globals.css:136` — Hardcoded hex color: #F1F5F9
+- **[major]** `web/src/app/globals.css:137` — Hardcoded hex color: #0F172A
+- **[major]** `web/src/app/globals.css:138` — Hardcoded hex color: #475569
+- **[major]** `web/src/app/globals.css:139` — Hardcoded hex color: #94A3B8
+- **[major]** `web/src/app/not-found.tsx:5` — Hardcoded hex color: #07111F
+- **[major]** `web/src/app/not-found.tsx:7` — Hardcoded hex color: #5A8CFF
+- **[major]** `web/src/app/not-found.tsx:8` — Hardcoded hex color: #A8B4C8
+- **[major]** `web/src/app/not-found.tsx:9` — Hardcoded hex color: #A8B4C8
+- **[major]** `web/src/app/not-found.tsx:15` — Hardcoded hex color: #5A8CFF
+- **[major]** `web/src/app/not-found.tsx:15` — Hardcoded hex color: #fff
+- **[major]** `web/src/components/Sidebar.tsx:27` — Hardcoded hex color: #fff
+- **[minor]** `web/src/app/(app)/settings/page.tsx:42` — Emoji in code: 🌙
+
+## `learning_ai_local_memory_gpt`
+
+**Counts:** critical=0 · major=48 · minor=0 · total=48
+
+- **[major]** `web/src/app/error.tsx:9` — Hardcoded hex color: #0A0A0A
+- **[major]** `web/src/app/error.tsx:11` — Hardcoded hex color: #EF4444
+- **[major]** `web/src/app/error.tsx:12` — Hardcoded hex color: #999
+- **[major]** `web/src/app/error.tsx:18` — Hardcoded hex color: #6366F1
+- **[major]** `web/src/app/error.tsx:18` — Hardcoded hex color: #fff
+- **[major]** `web/src/app/loading.tsx:3` — Hardcoded hex color: #0A0A0A
+- **[major]** `web/src/app/loading.tsx:7` — Hardcoded hex color: #6366F1
+- **[major]** `web/src/app/loading.tsx:9` — Hardcoded hex color: #999
+- **[major]** `web/src/app/globals.css:8` — Hardcoded hex color: #2a2a2a
+- **[major]** `web/src/app/globals.css:9` — Hardcoded hex color: #333
+- **[major]** `web/src/app/globals.css:19` — Hardcoded hex color: #ffffff
+- **[major]** `web/src/app/globals.css:20` — Hardcoded hex color: #f7f7f8
+- **[major]** `web/src/app/globals.css:21` — Hardcoded hex color: #ececf1
+- **[major]** `web/src/app/globals.css:22` — Hardcoded hex color: #e5e5ea
+- **[major]** `web/src/app/globals.css:23` — Hardcoded hex color: #dcdce4
+- **[major]** `web/src/app/globals.css:24` — Hardcoded hex color: #ffffff
+- **[major]** `web/src/app/globals.css:25` — Hardcoded hex color: #d9d9e3
+- **[major]** `web/src/app/globals.css:26` — Hardcoded hex color: #c5c5d2
+- **[major]** `web/src/app/globals.css:27` — Hardcoded hex color: #1a1a2e
+- **[major]** `web/src/app/globals.css:28` — Hardcoded hex color: #565869
+- **[major]** `web/src/app/globals.css:29` — Hardcoded hex color: #8e8ea0
+- **[major]** `web/src/app/globals.css:30` — Hardcoded hex color: #6366f1
+- **[major]** `web/src/app/globals.css:31` — Hardcoded hex color: #4f46e5
+- **[major]** `web/src/app/globals.css:33` — Hardcoded hex color: #16a34a
+- **[major]** `web/src/app/globals.css:34` — Hardcoded hex color: #d97706
+- **[major]** `web/src/app/globals.css:35` — Hardcoded hex color: #dc2626
+- **[major]** `web/src/app/globals.css:150` — Hardcoded hex color: #6366F1
+- **[major]** `web/src/app/globals.css:195` — Hardcoded hex color: #F8FAFC
+- **[major]** `web/src/app/globals.css:196` — Hardcoded hex color: #FFFFFF
+- **[major]** `web/src/app/globals.css:197` — Hardcoded hex color: #FFFFFF
+- **[major]** `web/src/app/globals.css:198` — Hardcoded hex color: #F1F5F9
+- **[major]** `web/src/app/globals.css:199` — Hardcoded hex color: #0F172A
+- **[major]** `web/src/app/globals.css:200` — Hardcoded hex color: #475569
+- **[major]** `web/src/app/globals.css:201` — Hardcoded hex color: #94A3B8
+- **[major]** `web/src/app/not-found.tsx:5` — Hardcoded hex color: #0A0A0A
+- **[major]** `web/src/app/not-found.tsx:7` — Hardcoded hex color: #6366F1
+- **[major]** `web/src/app/not-found.tsx:8` — Hardcoded hex color: #999
+- **[major]** `web/src/app/not-found.tsx:9` — Hardcoded hex color: #666
+- **[major]** `web/src/app/not-found.tsx:15` — Hardcoded hex color: #6366F1
+- **[major]** `web/src/app/not-found.tsx:15` — Hardcoded hex color: #fff
+- **[major]** `web/src/components/ComparePanel.tsx:61` — Hardcoded hex color: #fff
+- **[major]** `web/src/components/ComparePanel.tsx:84` — Hardcoded hex color: #fff
+- **[major]** `web/src/components/ComparePanel.tsx:92` — Hardcoded hex color: #fff
+- **[major]** `web/src/components/ChatView.tsx:140` — Hardcoded hex color: #fff
+- **[major]** `web/src/components/ChatView.tsx:151` — Hardcoded hex color: #fff
+- **[major]** `web/src/components/SearchPanel.tsx:52` — Hardcoded hex color: #fff
+- **[major]** `web/src/components/DocumentsPanel.tsx:54` — Hardcoded hex color: #fff
+- **[major]** `web/src/components/Sidebar.tsx:164` — Hardcoded hex color: #fff
+
+## `learning_ai_efforise`
+
+**Counts:** critical=0 · major=82 · minor=10 · total=92
+
+- **[minor]** `backend/src/lib/request-context.ts:14` — any type: return _ctx.getRequestProductId(req as any);
+- **[minor]** `backend/src/lib/request-context.ts:19` — any type: return _ctx.getUserId(req as any);
+- **[minor]** `client/src/components/ui/dialog.tsx:107` — any type: const isCurrentlyComposing = (e as any).isComposing || isComposing();
+- **[minor]** `client/src/components/ui/textarea.tsx:24` — any type: const isComposing = (e.nativeEvent as any).isComposing || dialogCompositio
+- **[minor]** `client/src/components/ui/input.tsx:25` — any type: const isComposing = (e.nativeEvent as any).isComposing || dialogCompositio
+- **[minor]** `client/src/hooks/usePersistFn.ts:3` — any type: type noop = (...args: any[]) => any;
+- **[major]** `mobile/src/theme/colors.ts:3` — Hardcoded hex color: #0C0F0E
+- **[major]** `mobile/src/theme/colors.ts:4` — Hardcoded hex color: #141A18
+- **[major]** `mobile/src/theme/colors.ts:7` — Hardcoded hex color: #1A2320
+- **[major]** `mobile/src/theme/colors.ts:8` — Hardcoded hex color: #243029
+- **[major]** `mobile/src/theme/colors.ts:11` — Hardcoded hex color: #2D3B36
+- **[major]** `mobile/src/theme/colors.ts:12` — Hardcoded hex color: #1E2B26
+- **[major]** `mobile/src/theme/colors.ts:15` — Hardcoded hex color: #E8F0EC
+- **[major]** `mobile/src/theme/colors.ts:16` — Hardcoded hex color: #8FA89C
+- **[major]** `mobile/src/theme/colors.ts:17` — Hardcoded hex color: #5E7A6D
+- **[major]** `mobile/src/theme/colors.ts:20` — Hardcoded hex color: #34D399
+- **[major]** `mobile/src/theme/colors.ts:21` — Hardcoded hex color: #059669
+- **[major]** `mobile/src/theme/colors.ts:24` — Hardcoded hex color: #34D399
+- **[major]** `mobile/src/theme/colors.ts:25` — Hardcoded hex color: #FBBF24
+- **[major]** `mobile/src/theme/colors.ts:26` — Hardcoded hex color: #F87171
+- **[major]** `mobile/src/theme/colors.ts:29` — Hardcoded hex color: #6EE7B7
+- **[major]** `mobile/src/theme/colors.ts:30` — Hardcoded hex color: #34D399
+- **[major]** `mobile/src/theme/colors.ts:31` — Hardcoded hex color: #059669
+- **[major]** `client/src/index.css:47` — Hardcoded hex color: #ffffff
+- **[major]** `client/src/index.css:48` — Hardcoded hex color: #f8fafc
+- **[major]** `client/src/index.css:49` — Hardcoded hex color: #ffffff
+- **[major]** `client/src/index.css:50` — Hardcoded hex color: #0f172a
+- **[major]** `client/src/index.css:51` — Hardcoded hex color: #475569
+- **[major]** `client/src/index.css:52` — Hardcoded hex color: #94a3b8
+- **[major]** `client/src/index.css:53` — Hardcoded hex color: #059669
+- **[major]** `client/src/index.css:54` — Hardcoded hex color: #0d9488
+- **[major]** `client/src/index.css:55` — Hardcoded hex color: #059669
+- **[major]** `client/src/index.css:55` — Hardcoded hex color: #0d9488
+- **[major]** `client/src/index.css:57` — Hardcoded hex color: #e2e8f0
+- **[major]** `client/src/index.css:58` — Hardcoded hex color: #f1f5f9
+- **[major]** `client/src/index.css:117` — Hardcoded hex color: #0f172a
+- **[major]** `client/src/index.css:118` — Hardcoded hex color: #1e293b
+- **[major]** `client/src/index.css:119` — Hardcoded hex color: #1e293b
+- **[major]** `client/src/index.css:120` — Hardcoded hex color: #f1f5f9
+- **[major]** `client/src/index.css:121` — Hardcoded hex color: #94a3b8
+- **[major]** `client/src/index.css:122` — Hardcoded hex color: #64748b
+- **[major]** `client/src/index.css:123` — Hardcoded hex color: #34d399
+- **[major]** `client/src/index.css:124` — Hardcoded hex color: #2dd4bf
+- **[major]** `client/src/index.css:125` — Hardcoded hex color: #34d399
+- **[major]** `client/src/index.css:125` — Hardcoded hex color: #2dd4bf
+- **[major]** `client/src/index.css:154` — Hardcoded hex color: #34d399
+- **[major]** `client/src/index.css:155` — Hardcoded hex color: #2dd4bf
+- **[major]** `client/src/index.css:156` — Hardcoded hex color: #6ee7b7
+- **[major]** `client/src/index.css:157` — Hardcoded hex color: #5eead4
+- **[major]** `client/src/index.css:158` — Hardcoded hex color: #10b981
+- **[major]** `client/src/components/ui/chart.tsx:56` — Hardcoded hex color: #ccc
+- **[major]** `client/src/components/ui/chart.tsx:56` — Hardcoded hex color: #ccc
+- **[major]** `client/src/components/ui/chart.tsx:56` — Hardcoded hex color: #ccc
+- **[major]** `client/src/components/ui/chart.tsx:56` — Hardcoded hex color: #fff
+- **[major]** `client/src/components/ui/chart.tsx:56` — Hardcoded hex color: #fff
+- **[major]** `client/src/components/Sidebar.tsx:54` — Hardcoded hex color: #fff
+- **[major]** `client/src/components/Sidebar.tsx:111` — Hardcoded hex color: #fff
+- **[major]** `client/src/pages/app/Settings.tsx:46` — Hardcoded hex color: #fff
+- **[major]** `client/src/pages/app/Settings.tsx:68` — Hardcoded hex color: #f59e0b
+- **[major]** `client/src/pages/app/Dashboard.tsx:49` — Hardcoded hex color: #fff
+- **[major]** `client/src/pages/app/Dashboard.tsx:64` — Hardcoded hex color: #f59e0b
+- **[major]** `client/src/pages/app/Dashboard.tsx:65` — Hardcoded hex color: #ef4444
+- **[major]** `client/src/pages/app/Dashboard.tsx:66` — Hardcoded hex color: #8b5cf6
+- **[major]** `client/src/pages/app/Dashboard.tsx:184` — Hardcoded hex color: #34d399
+- **[major]** `client/src/pages/app/Dashboard.tsx:185` — Hardcoded hex color: #f59e0b
+- **[major]** `client/src/pages/app/Dashboard.tsx:186` — Hardcoded hex color: #8b5cf6
+- **[major]** `client/src/pages/app/Identity.tsx:7` — Hardcoded hex color: #059669
+- **[major]** `client/src/pages/app/Identity.tsx:7` — Hardcoded hex color: #0d9488
+- **[major]** `client/src/pages/app/Identity.tsx:7` — Hardcoded hex color: #f59e0b
+- **[major]** `client/src/pages/app/Identity.tsx:7` — Hardcoded hex color: #8b5cf6
+- **[major]** `client/src/pages/app/Identity.tsx:7` — Hardcoded hex color: #ef4444
+- **[major]** `client/src/pages/app/Identity.tsx:7` — Hardcoded hex color: #3b82f6
+- **[major]** `client/src/pages/app/Identity.tsx:7` — Hardcoded hex color: #ec4899
+- **[major]** `client/src/pages/app/Identity.tsx:7` — Hardcoded hex color: #f97316
+- **[major]** `client/src/pages/app/Identity.tsx:66` — Hardcoded hex color: #fff
+- **[major]** `client/src/pages/app/Identity.tsx:177` — Hardcoded hex color: #fff
+- **[major]** `client/src/pages/app/Identity.tsx:196` — Hardcoded hex color: #fff
+- **[major]** `client/src/pages/app/Identity.tsx:254` — Hardcoded hex color: #ef4444
+- **[major]** `client/src/pages/app/Identity.tsx:279` — Hardcoded hex color: #ef4444
+- **[major]** `client/src/pages/app/Insights.tsx:17` — Hardcoded hex color: #34d399
+- **[major]** `client/src/pages/app/Insights.tsx:18` — Hardcoded hex color: #f59e0b
+- **[major]** `client/src/pages/app/Insights.tsx:19` — Hardcoded hex color: #8b5cf6
+- **[major]** `client/src/pages/app/Insights.tsx:104` — Hardcoded hex color: #f59e0b
+- **[major]** `client/src/pages/app/Log.tsx:8` — Hardcoded hex color: #34d399
+- **[major]** `client/src/pages/app/Log.tsx:9` — Hardcoded hex color: #f59e0b
+- **[major]** `client/src/pages/app/Log.tsx:10` — Hardcoded hex color: #8b5cf6
+- **[major]** `client/src/pages/app/Log.tsx:147` — Hardcoded hex color: #fff
+- **[major]** `client/src/pages/Home.tsx:8` — Hardcoded hex color: #10B981
+- **[minor]** `client/src/pages/app/Dashboard.tsx:139` — Emoji in code: 🎯
+- **[minor]** `client/src/pages/app/Identity.tsx:6` — Emoji in code: 🎯
+- **[minor]** `client/src/pages/app/Identity.tsx:243` — Emoji in code: 🎯
+- **[minor]** `client/src/pages/app/Identity.tsx:272` — Emoji in code: 🎯
+
+## `learning_ai_local_llms`
+
+**Counts:** critical=0 · major=46 · minor=1 · total=47
+
+- **[major]** `dashboard/src/app/(mission-control)/mission-control/page.tsx:2198` — Hardcoded hex color: #fff
+- **[major]** `dashboard/src/app/layout.tsx:16` — Hardcoded hex color: #3b82f6
+- **[major]** `dashboard/src/app/loading.tsx:3` — Hardcoded hex color: #06070A
+- **[major]** `dashboard/src/app/loading.tsx:7` — Hardcoded hex color: #5A8CFF
+- **[major]** `dashboard/src/app/loading.tsx:9` — Hardcoded hex color: #A5B1C7
+- **[major]** `dashboard/src/app/globals.css:114` — Hardcoded hex color: #F6F8FC
+- **[major]** `dashboard/src/app/globals.css:115` — Hardcoded hex color: #FFFFFF
+- **[major]** `dashboard/src/app/globals.css:116` — Hardcoded hex color: #FFFFFF
+- **[major]** `dashboard/src/app/globals.css:117` — Hardcoded hex color: #F3F5FA
+- **[major]** `dashboard/src/app/globals.css:118` — Hardcoded hex color: #DCE4F2
+- **[major]** `dashboard/src/app/globals.css:119` — Hardcoded hex color: #BFCBDE
+- **[major]** `dashboard/src/app/globals.css:121` — Hardcoded hex color: #0E1320
+- **[major]** `dashboard/src/app/globals.css:122` — Hardcoded hex color: #55637A
+- **[major]** `dashboard/src/app/globals.css:123` — Hardcoded hex color: #6C7C98
+- **[major]** `dashboard/src/app/globals.css:124` — Hardcoded hex color: #13956A
+- **[major]** `dashboard/src/app/globals.css:125` — Hardcoded hex color: #B87504
+- **[major]** `dashboard/src/app/globals.css:126` — Hardcoded hex color: #D24242
+- **[major]** `dashboard/src/app/globals.css:133` — Hardcoded hex color: #F6F8FC
+- **[major]** `dashboard/src/app/globals.css:134` — Hardcoded hex color: #FFFFFF
+- **[major]** `dashboard/src/app/globals.css:135` — Hardcoded hex color: #FFFFFF
+- **[major]** `dashboard/src/app/globals.css:136` — Hardcoded hex color: #F3F5FA
+- **[major]** `dashboard/src/app/globals.css:137` — Hardcoded hex color: #DCE4F2
+- **[major]** `dashboard/src/app/globals.css:138` — Hardcoded hex color: #BFCBDE
+- **[major]** `dashboard/src/app/globals.css:140` — Hardcoded hex color: #0E1320
+- **[major]** `dashboard/src/app/globals.css:141` — Hardcoded hex color: #55637A
+- **[major]** `dashboard/src/app/globals.css:142` — Hardcoded hex color: #6C7C98
+- **[major]** `dashboard/src/app/globals.css:143` — Hardcoded hex color: #13956A
+- **[major]** `dashboard/src/app/globals.css:144` — Hardcoded hex color: #B87504
+- **[major]** `dashboard/src/app/globals.css:145` — Hardcoded hex color: #D24242
+- **[major]** `dashboard/src/app/globals.css:228` — Hardcoded hex color: #F8FAFC
+- **[major]** `dashboard/src/app/globals.css:229` — Hardcoded hex color: #FFFFFF
+- **[major]** `dashboard/src/app/globals.css:230` — Hardcoded hex color: #FFFFFF
+- **[major]** `dashboard/src/app/globals.css:231` — Hardcoded hex color: #F1F5F9
+- **[major]** `dashboard/src/app/globals.css:232` — Hardcoded hex color: #E2E8F0
+- **[major]** `dashboard/src/app/globals.css:233` — Hardcoded hex color: #CBD5E1
+- **[major]** `dashboard/src/app/globals.css:235` — Hardcoded hex color: #0F172A
+- **[major]** `dashboard/src/app/globals.css:236` — Hardcoded hex color: #475569
+- **[major]** `dashboard/src/app/globals.css:237` — Hardcoded hex color: #94A3B8
+- **[major]** `dashboard/src/app/globals.css:238` — Hardcoded hex color: #3B6FE8
+- **[major]** `dashboard/src/app/globals.css:239` — Hardcoded hex color: #0EA5E9
+- **[major]** `dashboard/src/app/globals.css:240` — Hardcoded hex color: #10B981
+- **[major]** `dashboard/src/app/globals.css:241` — Hardcoded hex color: #D97706
+- **[major]** `dashboard/src/app/globals.css:242` — Hardcoded hex color: #EF4444
+- **[major]** `dashboard/src/app/globals.css:243` — Hardcoded hex color: #8B5CF6
+- **[major]** `dashboard/src/components/Toast.tsx:41` — Hardcoded hex color: #f59e0b
+- **[major]** `dashboard/src/components/Toast.tsx:49` — Hardcoded hex color: #f59e0b
+- **[minor]** `dashboard/src/app/lib/format.ts:61` — Emoji in code: 👁
+
+## `learning_ai_talk2obsidian`
+
+**Counts:** critical=0 · major=27 · minor=0 · total=27
+
+- **[major]** `web/src/App.tsx:290` — Hardcoded hex color: #fff
+- **[major]** `web/src/App.tsx:311` — Hardcoded hex color: #fff
+- **[major]** `web/src/App.tsx:381` — Hardcoded hex color: #fff
+- **[major]** `web/src/App.tsx:391` — Hardcoded hex color: #fff
+- **[major]** `web/src/App.tsx:395` — Hardcoded hex color: #fff
+- **[major]** `web/src/App.tsx:448` — Hardcoded hex color: #fff
+- **[major]** `web/src/main.tsx:15` — Hardcoded hex color: #fff
+- **[major]** `web/src/index.css:4` — Hardcoded hex color: #0f0f14
+- **[major]** `web/src/index.css:5` — Hardcoded hex color: #1a1a24
+- **[major]** `web/src/index.css:6` — Hardcoded hex color: #222233
+- **[major]** `web/src/index.css:7` — Hardcoded hex color: #2a2a3a
+- **[major]** `web/src/index.css:8` — Hardcoded hex color: #e4e4ef
+- **[major]** `web/src/index.css:9` — Hardcoded hex color: #8888aa
+- **[major]** `web/src/index.css:10` — Hardcoded hex color: #7c6aef
+- **[major]** `web/src/index.css:11` — Hardcoded hex color: #9484ff
+- **[major]** `web/src/index.css:12` — Hardcoded hex color: #2a2a50
+- **[major]** `web/src/index.css:13` — Hardcoded hex color: #1e1e2e
+- **[major]** `web/src/index.css:14` — Hardcoded hex color: #4ade80
+- **[major]** `web/src/index.css:15` — Hardcoded hex color: #facc15
+- **[major]** `web/src/index.css:16` — Hardcoded hex color: #f87171
+- **[major]** `web/src/VoiceCompose.tsx:352` — Hardcoded hex color: #fff
+- **[major]** `web/src/VoiceCompose.tsx:382` — Hardcoded hex color: #fff
+- **[major]** `web/src/VoiceCompose.tsx:462` — Hardcoded hex color: #fff
+- **[major]** `web/src/NotesView.tsx:223` — Hardcoded hex color: #fff
+- **[major]** `web/src/NotesView.tsx:246` — Hardcoded hex color: #fff
+- **[major]** `web/src/NotesView.tsx:250` — Hardcoded hex color: #fff
+- **[major]** `web/src/NotesView.tsx:257` — Hardcoded hex color: #fff
+
+## `learning_ai_smart_auth`
+
+✅ No violations found.
+
+## `learning_ai_auth_app`
+
+✅ No violations found.
+
+## `learning_ai_productivity_web`
+
+**Counts:** critical=0 · major=57 · minor=6 · total=63
+
+- **[major]** `tailwind.config.ts:17` — Hardcoded hex color: #eff6ff
+- **[major]** `tailwind.config.ts:18` — Hardcoded hex color: #dbeafe
+- **[major]** `tailwind.config.ts:19` — Hardcoded hex color: #3b82f6
+- **[major]** `tailwind.config.ts:20` — Hardcoded hex color: #2563eb
+- **[major]** `tailwind.config.ts:21` — Hardcoded hex color: #1d4ed8
+- **[major]** `src/app/tools/image-to-base64/page.tsx:411` — Hardcoded hex color: #1e293b
+- **[major]** `src/app/tools/image-to-base64/page.tsx:411` — Hardcoded hex color: #334155
+- **[major]** `src/app/tools/regex-tester/page.tsx:19` — Hardcoded hex color: #3B82F6
+- **[major]** `src/app/tools/regex-tester/page.tsx:19` — Hardcoded hex color: #fff
+- **[major]** `src/app/tools/regex-tester/page.tsx:19` — Hardcoded hex color: #EF4444
+- **[major]** `src/app/tools/qr-code/page.tsx:90` — Hardcoded hex color: #000000
+- **[major]** `src/app/tools/qr-code/page.tsx:91` — Hardcoded hex color: #ffffff
+- **[major]** `src/app/tools/markdown-preview/page.tsx:174` — Hardcoded hex color: #f1f5f9
+- **[major]** `src/app/tools/markdown-preview/page.tsx:175` — Hardcoded hex color: #e2e8f0
+- **[major]** `src/app/tools/markdown-preview/page.tsx:176` — Hardcoded hex color: #cbd5e1
+- **[major]** `src/app/tools/markdown-preview/page.tsx:177` — Hardcoded hex color: #94a3b8
+- **[major]** `src/app/tools/markdown-preview/page.tsx:178` — Hardcoded hex color: #38bdf8
+- **[major]** `src/app/tools/markdown-preview/page.tsx:179` — Hardcoded hex color: #f1f5f9
+- **[major]** `src/app/tools/markdown-preview/page.tsx:180` — Hardcoded hex color: #e2e8f0
+- **[major]** `src/app/tools/markdown-preview/page.tsx:181` — Hardcoded hex color: #1e293b
+- **[major]** `src/app/tools/markdown-preview/page.tsx:181` — Hardcoded hex color: #7dd3fc
+- **[major]** `src/app/tools/markdown-preview/page.tsx:182` — Hardcoded hex color: #0f172a
+- **[major]** `src/app/tools/markdown-preview/page.tsx:182` — Hardcoded hex color: #334155
+- **[major]** `src/app/tools/markdown-preview/page.tsx:183` — Hardcoded hex color: #93c5fd
+- **[major]** `src/app/tools/markdown-preview/page.tsx:184` — Hardcoded hex color: #94a3b8
+- **[major]** `src/app/tools/markdown-preview/page.tsx:185` — Hardcoded hex color: #94a3b8
+- **[major]** `src/app/tools/markdown-preview/page.tsx:187` — Hardcoded hex color: #475569
+- **[major]** `src/app/tools/markdown-preview/page.tsx:187` — Hardcoded hex color: #64748b
+- **[major]** `src/app/tools/markdown-preview/page.tsx:189` — Hardcoded hex color: #1e293b
+- **[major]** `src/app/tools/markdown-preview/page.tsx:189` — Hardcoded hex color: #e2e8f0
+- **[major]** `src/app/tools/markdown-preview/page.tsx:189` — Hardcoded hex color: #334155
+- **[major]** `src/app/tools/markdown-preview/page.tsx:190` — Hardcoded hex color: #1e293b
+- **[major]** `src/app/tools/markdown-preview/page.tsx:190` — Hardcoded hex color: #94a3b8
+- **[major]** `src/app/tools/markdown-preview/page.tsx:191` — Hardcoded hex color: #0f172a
+- **[major]** `src/app/tools/markdown-preview/page.tsx:192` — Hardcoded hex color: #334155
+- **[major]** `src/app/tools/color-picker/page.tsx:66` — Hardcoded hex color: #EF4444
+- **[major]** `src/app/tools/color-picker/page.tsx:66` — Hardcoded hex color: #F97316
+- **[major]** `src/app/tools/color-picker/page.tsx:66` — Hardcoded hex color: #EAB308
+- **[major]** `src/app/tools/color-picker/page.tsx:66` — Hardcoded hex color: #22C55E
+- **[major]** `src/app/tools/color-picker/page.tsx:66` — Hardcoded hex color: #14B8A6
+- **[major]** `src/app/tools/color-picker/page.tsx:67` — Hardcoded hex color: #3B82F6
+- **[major]** `src/app/tools/color-picker/page.tsx:67` — Hardcoded hex color: #8B5CF6
+- **[major]** `src/app/tools/color-picker/page.tsx:67` — Hardcoded hex color: #EC4899
+- **[major]** `src/app/tools/color-picker/page.tsx:67` — Hardcoded hex color: #6B7280
+- **[major]** `src/app/tools/color-picker/page.tsx:67` — Hardcoded hex color: #0F172A
+- **[major]** `src/app/tools/color-picker/page.tsx:71` — Hardcoded hex color: #3B82F6
+- **[major]** `src/app/tools/color-picker/page.tsx:72` — Hardcoded hex color: #3B82F6
+- **[major]** `src/app/tools/color-picker/page.tsx:75` — Hardcoded hex color: #3B82F6
+- **[major]** `src/app/tools/color-picker/page.tsx:145` — Hardcoded hex color: #000000
+- **[major]** `src/app/globals.css:15` — Hardcoded hex color: #0a0f1e
+- **[major]** `src/app/globals.css:16` — Hardcoded hex color: #f1f5f9
+- **[major]** `src/app/globals.css:38` — Hardcoded hex color: #334155
+- **[major]** `src/app/globals.css:42` — Hardcoded hex color: #475569
+- **[major]** `src/app/globals.css:51` — Hardcoded hex color: #334155
+- **[major]** `src/app/globals.css:60` — Hardcoded hex color: #3b82f6
+- **[major]** `src/app/globals.css:62` — Hardcoded hex color: #0a0f1e
+- **[major]** `src/app/globals.css:66` — Hardcoded hex color: #60a5fa
+- **[minor]** `src/app/tools/markdown-preview/page.tsx:36` — Emoji in code: 🕐
+- **[minor]** `src/lib/tools-registry.ts:27` — Emoji in code: 📝
+- **[minor]** `src/lib/tools-registry.ts:28` — Emoji in code: 🔐
+- **[minor]** `src/lib/tools-registry.ts:29` — Emoji in code: 🔄
+- **[minor]** `src/lib/tools-registry.ts:30` — Emoji in code: 🎨
+- **[minor]** `src/lib/tools-registry.ts:31` — Emoji in code: 📊
+
+## `oss/learning_ai_claw-cowork`
+
+**Counts:** critical=0 · major=45 · minor=5 · total=50
+
+- **[major]** `plugins/bytelyst-scaffolder/main.js:182` — console.log: console.log(JSON.stringify({ error: "no input provided" }));
+- **[major]** `plugins/bytelyst-scaffolder/main.js:190` — console.log: console.log(
+- **[major]** `plugins/bytelyst-scaffolder/main.js:205` — console.log: console.log(JSON.stringify(result));
+- **[major]** `plugins/bytelyst-scaffolder/main.js:207` — console.log: console.log(JSON.stringify({ error: e.message }));
+- **[major]** `plugins/data-analyzer/main.js:152` — console.log: console.log(JSON.stringify({ error: "no input provided" }));
+- **[major]** `plugins/data-analyzer/main.js:160` — console.log: console.log(JSON.stringify({ error: `invalid JSON input: ${e.message}` }));
+- **[major]** `plugins/data-analyzer/main.js:171` — console.log: console.log(JSON.stringify({ error: "missing required parameters: file_p
+- **[major]** `plugins/data-analyzer/main.js:177` — console.log: console.log(JSON.stringify({ error: "missing required parameter: file_pa
+- **[major]** `plugins/data-analyzer/main.js:182` — console.log: console.log(JSON.stringify(result));
+- **[major]** `plugins/data-analyzer/main.js:184` — console.log: console.log(JSON.stringify({ error: e.message }));
+- **[major]** `plugins/product-backend-module/main.js:320` — console.log: console.log(JSON.stringify({ error: "no input provided" }));
+- **[major]** `plugins/product-backend-module/main.js:328` — console.log: console.log(JSON.stringify({ error: `invalid JSON input: ${e.message}` }));
+- **[major]** `plugins/product-backend-module/main.js:340` — console.log: console.log(JSON.stringify(result));
+- **[major]** `plugins/product-backend-module/main.js:342` — console.log: console.log(JSON.stringify({ error: e.message }));
+- **[minor]** `crates/cowork-desktop/src/components/ChatView.tsx:543` — any type: path: (f as any).path || f.name,
+- **[minor]** `crates/cowork-desktop/src/components/ChatView.tsx:616` — any type: path: (f as any).path || f.name,
+- **[major]** `crates/cowork-desktop/src/styles/globals.css:8` — Hardcoded hex color: #ffffff
+- **[major]** `crates/cowork-desktop/src/styles/globals.css:9` — Hardcoded hex color: #f8fafc
+- **[major]** `crates/cowork-desktop/src/styles/globals.css:10` — Hardcoded hex color: #f1f5f9
+- **[major]** `crates/cowork-desktop/src/styles/globals.css:11` — Hardcoded hex color: #e2e8f0
+- **[major]** `crates/cowork-desktop/src/styles/globals.css:12` — Hardcoded hex color: #e2e8f0
+- **[major]** `crates/cowork-desktop/src/styles/globals.css:13` — Hardcoded hex color: #cbd5e1
+- **[major]** `crates/cowork-desktop/src/styles/globals.css:14` — Hardcoded hex color: #0f172a
+- **[major]** `crates/cowork-desktop/src/styles/globals.css:15` — Hardcoded hex color: #475569
+- **[major]** `crates/cowork-desktop/src/styles/globals.css:16` — Hardcoded hex color: #64748b
+- **[major]** `crates/cowork-desktop/src/styles/globals.css:17` — Hardcoded hex color: #0c93e7
+- **[major]** `crates/cowork-desktop/src/styles/globals.css:18` — Hardcoded hex color: #0ea5e9
+- **[major]** `crates/cowork-desktop/src/styles/globals.css:19` — Hardcoded hex color: #22c55e
+- **[major]** `crates/cowork-desktop/src/styles/globals.css:20` — Hardcoded hex color: #f59e0b
+- **[major]** `crates/cowork-desktop/src/styles/globals.css:21` — Hardcoded hex color: #ef4444
+- **[major]** `crates/cowork-desktop/src/styles/globals.css:68` — Hardcoded hex color: #0f172a
+- **[major]** `crates/cowork-desktop/src/styles/globals.css:69` — Hardcoded hex color: #1e293b
+- **[major]** `crates/cowork-desktop/src/styles/globals.css:70` — Hardcoded hex color: #1e293b
+- **[major]** `crates/cowork-desktop/src/styles/globals.css:71` — Hardcoded hex color: #334155
+- **[major]** `crates/cowork-desktop/src/styles/globals.css:72` — Hardcoded hex color: #334155
+- **[major]** `crates/cowork-desktop/src/styles/globals.css:73` — Hardcoded hex color: #475569
+- **[major]** `crates/cowork-desktop/src/styles/globals.css:74` — Hardcoded hex color: #f1f5f9
+- **[major]** `crates/cowork-desktop/src/styles/globals.css:75` — Hardcoded hex color: #cbd5e1
+- **[major]** `crates/cowork-desktop/src/styles/globals.css:76` — Hardcoded hex color: #94a3b8
+- **[major]** `crates/cowork-desktop/src/styles/globals.css:77` — Hardcoded hex color: #36adf6
+- **[major]** `crates/cowork-desktop/src/styles/globals.css:78` — Hardcoded hex color: #38bdf8
+- **[major]** `crates/cowork-desktop/src/styles/globals.css:79` — Hardcoded hex color: #4ade80
+- **[major]** `crates/cowork-desktop/src/styles/globals.css:80` — Hardcoded hex color: #fbbf24
+- **[major]** `crates/cowork-desktop/src/styles/globals.css:81` — Hardcoded hex color: #f87171
+- **[major]** `crates/cowork-desktop/src/components/ChatView.tsx:413` — Hardcoded hex color: #128196
+- **[major]** `crates/cowork-desktop/src/components/McpAppHost.tsx:111` — Hardcoded hex color: #374151
+- **[major]** `crates/cowork-desktop/src/components/McpAppHost.tsx:156` — Hardcoded hex color: #ffffff
+- **[minor]** `crates/cowork-desktop/src/App.tsx:84` — Emoji in code: 🚧
+- **[minor]** `crates/cowork-desktop/src/cli.rs:39` — Emoji in code: 💭
+- **[minor]** `crates/cowork-desktop/src/components/ChatView.tsx:141` — Emoji in code: 🔧
+
+## `learning_ai_mac_tooling`
+
+**Counts:** critical=0 · major=366 · minor=219 · total=585
+
+- **[major]** `tools/network_transfer_audit.py:649` — Python print(): print(f" {YELLOW}⚠ LLM classification skipped: LLM_OPENAI_ENDPOINT or L
+- **[major]** `tools/network_transfer_audit.py:708` — Python print(): print(f" {DIM}Classifying {len(to_classify)} unknown processes via LLM.
+- **[major]** `tools/network_transfer_audit.py:729` — Python print(): print(f" {GREEN}✓ classified {len(classifications)} processes{RESET}")
+- **[major]** `tools/network_transfer_audit.py:732` — Python print(): print(f" {RED}✗ LLM API error: {e}{RESET}")
+- **[major]** `tools/network_transfer_audit.py:734` — Python print(): print(f" {RED}✗ Failed to parse LLM response: {e}{RESET}")
+- **[major]** `tools/network_transfer_audit.py:1081` — Python print(): print(f"\n{BOLD}{CYAN}{'═' * 70}{RESET}")
+- **[major]** `tools/network_transfer_audit.py:1082` — Python print(): print(f"{BOLD}{CYAN} Network Transfer Monitor{RESET}")
+- **[major]** `tools/network_transfer_audit.py:1083` — Python print(): print(f"{BOLD}{CYAN}{'═' * 70}{RESET}")
+- **[major]** `tools/network_transfer_audit.py:1085` — Python print(): print(f" {BOLD}Monitoring duration:{RESET} {mins:.0f} minutes")
+- **[major]** `tools/network_transfer_audit.py:1086` — Python print(): print(f" {DIM}Taking initial nettop snapshot...{RESET}")
+- **[major]** `tools/network_transfer_audit.py:1090` — Python print(): print(f" {GREEN}Start:{RESET} {from_dt.strftime('%Y-%m-%d %H:%M:%S')}")
+- **[major]** `tools/network_transfer_audit.py:1091` — Python print(): print(f" {DIM}Monitoring network activity — waiting {mins:.0f} minutes...{R
+- **[major]** `tools/network_transfer_audit.py:1107` — Python print(): print(f"\r {CYAN}[{bar}]{RESET} {pct:>3}% {r_min}m {r_sec:02d}s remain
+- **[major]** `tools/network_transfer_audit.py:1109` — Python print(): print(f"\r {GREEN}[{'█' * 40}]{RESET} 100% Done! ")
+- **[major]** `tools/network_transfer_audit.py:1111` — Python print(): print(f" {GREEN}End:{RESET} {to_dt.strftime('%Y-%m-%d %H:%M:%S')}")
+- **[major]** `tools/network_transfer_audit.py:1113` — Python print(): print(f" {DIM}Taking final nettop snapshot...{RESET}")
+- **[major]** `tools/network_transfer_audit.py:1135` — Python print(): print(f"\n {BOLD}Transfer during monitoring period:{RESET}")
+- **[major]** `tools/network_transfer_audit.py:1136` — Python print(): print(f" {GREEN}↓ Inbound: {fmt_bytes(total_in)}{RESET}")
+- **[major]** `tools/network_transfer_audit.py:1137` — Python print(): print(f" {YELLOW}↑ Outbound: {fmt_bytes(total_out)}{RESET}")
+- **[major]** `tools/network_transfer_audit.py:1138` — Python print(): print(f" {DIM}Processes with activity: {len(deltas)}{RESET}\n")
+- **[major]** `tools/network_transfer_audit.py:2236` — Python print(): print(f"\n{BOLD}{CYAN}{'═' * 70}{RESET}")
+- **[major]** `tools/network_transfer_audit.py:2237` — Python print(): print(f"{BOLD}{CYAN} {title}{RESET}")
+- **[major]** `tools/network_transfer_audit.py:2238` — Python print(): print(f"{BOLD}{CYAN}{'═' * 70}{RESET}")
+- **[major]** `tools/network_transfer_audit.py:2242` — Python print(): print(f"\n{BOLD}{YELLOW}── {title} {'─' * (65 - len(title))}{RESET}")
+- **[major]** `tools/network_transfer_audit.py:2246` — Python print(): print(f" {DIM}{msg}{RESET}")
+- **[major]** `tools/network_transfer_audit.py:2263` — Python print(): print(f" {BOLD}Time window:{RESET} {window_str}")
+- **[major]** `tools/network_transfer_audit.py:2266` — Python print(): print(f" {BOLD}Duration:{RESET} {hours:.1f} hours")
+- **[major]** `tools/network_transfer_audit.py:2271` — Python print(): print(f" {DIM}Querying: subsystem == com.apple.networkd ...{RESET}")
+- **[major]** `tools/network_transfer_audit.py:2294` — Python print(): print(f" {GREEN}Found {len(events)} events across {len(proc_counts)
+- **[major]** `tools/network_transfer_audit.py:2295` — Python print(): print(f" {'Process':<22} {'PID':>7} {'Events':>7} {'Category':<16}
+- **[major]** `tools/network_transfer_audit.py:2296` — Python print(): print(f" {'─' * 22} {'─' * 7} {'─' * 7} {'─' * 16} {'─' * 11} {'─'
+- **[major]** `tools/network_transfer_audit.py:2304` — Python print(): print(f" {proc_name:<22} {sample_pid:>7} {count:>7} {category:
+- **[major]** `tools/network_transfer_audit.py:2311` — Python print(): print(f" {DIM}Querying: subsystem == com.apple.dnssd ...{RESET}")
+- **[major]** `tools/network_transfer_audit.py:2318` — Python print(): print(f" {GREEN}Found {sum(c for _, c in dns)} DNS events, {len(dns
+- **[major]** `tools/network_transfer_audit.py:2319` — Python print(): print(f" {'Domain':<50} {'Hits':>6}")
+- **[major]** `tools/network_transfer_audit.py:2320` — Python print(): print(f" {'─' * 50} {'─' * 6}")
+- **[major]** `tools/network_transfer_audit.py:2322` — Python print(): print(f" {domain:<50} {count:>6}")
+- **[major]** `tools/network_transfer_audit.py:2329` — Python print(): print(f" {DIM}Querying: subsystem == com.apple.alf ...{RESET}")
+- **[major]** `tools/network_transfer_audit.py:2336` — Python print(): print(f" {GREEN}Found {len(fw_events)} firewall decisions{RESET}\n"
+- **[major]** `tools/network_transfer_audit.py:2339` — Python print(): print(f" {color}{ev}{RESET}")
+- **[major]** `tools/network_transfer_audit.py:2341` — Python print(): print(f" {DIM}... and {len(fw_events) - 15} more{RESET}")
+- **[major]** `tools/network_transfer_audit.py:2355` — Python print(): print(f" {GREEN}Found {len(valid_downloads)} downloads{RESET}\n")
+- **[major]** `tools/network_transfer_audit.py:2357` — Python print(): print(f" {BOLD}{dl['time']}{RESET} via {CYAN}{dl['agent']}{RES
+- **[major]** `tools/network_transfer_audit.py:2360` — Python print(): print(f" ↓ {url_display}")
+- **[major]** `tools/network_transfer_audit.py:2363` — Python print(): print(f" ← {DIM}{origin_display}{RESET}")
+- **[major]** `tools/network_transfer_audit.py:2364` — Python print(): print()
+- **[major]** `tools/network_transfer_audit.py:2385` — Python print(): print(f" {GREEN}Found {len(live)} active connections{RESET}\n")
+- **[major]** `tools/network_transfer_audit.py:2386` — Python print(): print(f" {'Process':<16} {'PID':<7} {'Category':<15} {'Installe
+- **[major]** `tools/network_transfer_audit.py:2387` — Python print(): print(f" {'─' * 16} {'─' * 7} {'─' * 15} {'─' * 10} {'─' * 16}
+- **[major]** `tools/network_transfer_audit.py:2391` — Python print(): print(f" {c['process']:<16} {c['pid']:<7} {category:<15} {i
+- **[major]** `tools/network_transfer_audit.py:2408` — Python print(): print(f" {GREEN}Processes with active network I/O:{RESET}\n")
+- **[major]** `tools/network_transfer_audit.py:2409` — Python print(): print(f" {'Process':<25} {'Category':<14} {'Installer':<10} {'↓
+- **[major]** `tools/network_transfer_audit.py:2410` — Python print(): print(f" {'─' * 25} {'─' * 14} {'─' * 10} {'─' * 10} {'─' * 10}
+- **[major]** `tools/network_transfer_audit.py:2418` — Python print(): print(f" {p['process']:<25} {category:<14} {installer:<10}
+- **[major]** `tools/network_transfer_audit.py:2524` — Python print(): print(f" {GREEN}Connections: {ext} external, {intr} internal/loopba
+- **[major]** `tools/network_transfer_audit.py:2529` — Python print(): print(f" {BOLD}Top External Destinations:{RESET}")
+- **[major]** `tools/network_transfer_audit.py:2530` — Python print(): print(f" {'IP Address':<22} {'Connections':>12}")
+- **[major]** `tools/network_transfer_audit.py:2531` — Python print(): print(f" {'─' * 22} {'─' * 12}")
+- **[major]** `tools/network_transfer_audit.py:2533` — Python print(): print(f" {d['ip']:<22} {d['count']:>12}")
+- **[major]** `tools/network_transfer_audit.py:2537` — Python print(): print(f"\n {BOLD}Top Remote Ports:{RESET}")
+- **[major]** `tools/network_transfer_audit.py:2538` — Python print(): print(f" {'Port':<8} {'Service':<16} {'Connections':>12} {'Stat
+- **[major]** `tools/network_transfer_audit.py:2539` — Python print(): print(f" {'─' * 8} {'─' * 16} {'─' * 12} {'─' * 10}")
+- **[major]** `tools/network_transfer_audit.py:2542` — Python print(): print(f" {p['port']:<8} {p['service']:<16} {p['count']:>12}
+- **[major]** `tools/network_transfer_audit.py:2553` — Python print(): print(f" {GREEN}Found {len(listeners)} listening ports{RESET}\n
+- **[major]** `tools/network_transfer_audit.py:2554` — Python print(): print(f" {'Process':<20} {'PID':<7} {'User':<10} {'Address'}")
+- **[major]** `tools/network_transfer_audit.py:2555` — Python print(): print(f" {'─' * 20} {'─' * 7} {'─' * 10} {'─' * 30}")
+- **[major]** `tools/network_transfer_audit.py:2557` — Python print(): print(f" {l['process']:<20} {l['pid']:<7} {l['user']:<10} {
+- **[major]** `tools/network_transfer_audit.py:2559` — Python print(): print(f" {DIM}... and {len(listeners) - 20} more{RESET}")
+- **[major]** `tools/network_transfer_audit.py:2586` — Python print(): print(f" {DIM}Querying: com.apple.TCC, com.apple.locationd, com.apple.b
+- **[major]** `tools/network_transfer_audit.py:2598` — Python print(): print(f" {GREEN}Found {len(sensor_events)} sensor access events acr
+- **[major]** `tools/network_transfer_audit.py:2599` — Python print(): print(f" {'Process':<28} {'Sensor':<18} {'Count':>6} {'First Seen'
+- **[major]** `tools/network_transfer_audit.py:2600` — Python print(): print(f" {'─' * 28} {'─' * 18} {'─' * 6} {'─' * 20} {'─' * 20} {'─
+- **[major]** `tools/network_transfer_audit.py:2615` — Python print(): print(f" {color}{s['process']:<28} {s['sensor']:<18} {s['count'
+- **[major]** `tools/network_transfer_audit.py:2640` — Python print(): print(f" {GREEN}Wi-Fi:{RESET} {BOLD}{ssid}{RESET}{rssi_label} ch:{
+- **[major]** `tools/network_transfer_audit.py:2642` — Python print(): print(f" {DIM}Wi-Fi: not connected{RESET}")
+- **[major]** `tools/network_transfer_audit.py:2649` — Python print(): print(f" {GREEN}VPN:{RESET} {len(vpn['tunnels'])} active tunnel(s)
+- **[major]** `tools/network_transfer_audit.py:2653` — Python print(): print(f" {t['interface']}{ip_str} mtu={t['mtu']}")
+- **[major]** `tools/network_transfer_audit.py:2655` — Python print(): print(f" {DIM}VPN: no active tunnels{RESET}")
+- **[major]** `tools/network_transfer_audit.py:2660` — Python print(): print(f"\n {BOLD}Top Interfaces (cumulative):{RESET}")
+- **[major]** `tools/network_transfer_audit.py:2661` — Python print(): print(f" {'Interface':<12} {'↓ In':>14} {'↑ Out':>14}")
+- **[major]** `tools/network_transfer_audit.py:2662` — Python print(): print(f" {'─' * 12} {'─' * 14} {'─' * 14}")
+- **[major]** `tools/network_transfer_audit.py:2664` — Python print(): print(f" {iface:<12} {fmt_bytes(v['bytes_in']):>14} {fmt_bytes(
+- **[major]** `tools/network_transfer_audit.py:2670` — Python print(): print(f"\n {BOLD}Proxy:{RESET} PAC → {pac}")
+- **[major]** `tools/network_transfer_audit.py:2672` — Python print(): print(f" {BOLD}DNS:{RESET} {', '.join(net_config['dns_servers'][:4]
+- **[major]** `tools/network_transfer_audit.py:2691` — Python print(): print(f" {GREEN}{len(arp)} devices on local network{RESET}")
+- **[major]** `tools/network_transfer_audit.py:2694` — Python print(): print(f" {a['ip']:<18} {a['mac']:<20} {a['interface']}")
+- **[major]** `tools/network_transfer_audit.py:2696` — Python print(): print(f" {DIM}... and {len(arp) - 10} more{RESET}")
+- **[major]** `tools/network_transfer_audit.py:2702` — Python print(): print(f"\n {BOLD}Bluetooth:{RESET} {bt.get('controller_state','?')}
+- **[major]** `tools/network_transfer_audit.py:2706` — Python print(): print(f" {d['name']:<30} {d.get('type',''):<12} {status}")
+- **[major]** `tools/network_transfer_audit.py:2711` — Python print(): print(f"\n {BOLD}USB Devices:{RESET} {len(named_usb)} with vendor i
+- **[major]** `tools/network_transfer_audit.py:2713` — Python print(): print(f" {u['name']:<30} {u.get('vendor','')}")
+- **[major]** `tools/network_transfer_audit.py:2717` — Python print(): print(f"\n {YELLOW}{BOLD}⚠ External disks mounted:{RESET}")
+- **[major]** `tools/network_transfer_audit.py:2719` — Python print(): print(f" {d['mount_point']} ({d['filesystem']})")
+- **[major]** `tools/network_transfer_audit.py:2737` — Python print(): print(f" {name:<14} {color}{val}{RESET}")
+- **[major]** `tools/network_transfer_audit.py:2739` — Python print(): print(f" {'Stealth Mode':<14} {GREEN}on{RESET}")
+- **[major]** `tools/network_transfer_audit.py:2741` — Python print(): print(f"\n {RED}{BOLD}⚠ Firewall is DISABLED — all inbound connecti
+- **[major]** `tools/network_transfer_audit.py:2758` — Python print(): print(f" {BOLD}Privilege escalations:{RESET} {len(auth_evts)}")
+- **[major]** `tools/network_transfer_audit.py:2760` — Python print(): print(f" {e['timestamp'][11:19]} {e['process']:<20} {e['righ
+- **[major]** `tools/network_transfer_audit.py:2765` — Python print(): print(f" {BOLD}Gatekeeper/XProtect:{RESET} {len(gk_events)} events
+- **[major]** `tools/network_transfer_audit.py:2768` — Python print(): print(f" {BOLD}Network Extension:{RESET} {len(ne_events)} VPN event
+- **[major]** `tools/network_transfer_audit.py:2770` — Python print(): print(f" {e['timestamp'][11:19]} {e['event_type']:<20} {e['d
+- **[major]** `tools/network_transfer_audit.py:2783` — Python print(): print(f" {RED if high_sev else GREEN}Found {len(anomalies)} anomali
+- **[major]** `tools/network_transfer_audit.py:2786` — Python print(): print(f" {icon} {BOLD}{a['process']}{RESET}: {a['detail']}")
+- **[major]** `tools/network_transfer_audit.py:2788` — Python print(): print(f" {GREEN}✓ No anomalies detected.{RESET}")
+- **[major]** `tools/network_transfer_audit.py:2805` — Python print(): print(f"\n {'Category':<18} {'Installer':<12} {'Procs':>6} {'Events
+- **[major]** `tools/network_transfer_audit.py:2806` — Python print(): print(f" {'─' * 18} {'─' * 12} {'─' * 6} {'─' * 7} {'─' * 14}")
+- **[major]** `tools/network_transfer_audit.py:2810` — Python print(): print(f" {cat:<18} {installers_str:<12} {len(stats['processes']
+- **[major]** `tools/network_transfer_audit.py:2816` — Python print(): print(f"\n {RED}{BOLD}⚠ HIGH RISK PROCESSES DETECTED:{RESET}")
+- **[major]** `tools/network_transfer_audit.py:2819` — Python print(): print(f" → {BOLD}{p['process']}{RESET} [{p['category']}] In
+- **[major]** `tools/network_transfer_audit.py:2821` — Python print(): print(f"\n {GREEN}✓ No high-risk processes detected in this window
+- **[major]** `tools/network_transfer_audit.py:2826` — Python print(): print(f" Network connection events: {len(events)}")
+- **[major]** `tools/network_transfer_audit.py:2827` — Python print(): print(f" Unique DNS domains: {len(dns)}")
+- **[major]** `tools/network_transfer_audit.py:2828` — Python print(): print(f" Firewall decisions: {len(fw_events)}")
+- **[major]** `tools/network_transfer_audit.py:2830` — Python print(): print(f" Files downloaded: {len(valid_dl)}")
+- **[major]** `tools/network_transfer_audit.py:2832` — Python print(): print(f" Live connections: {len(live)}")
+- **[major]** `tools/network_transfer_audit.py:2833` — Python print(): print(f" Processes with network I/O: {len(nettop)}")
+- **[major]** `tools/network_transfer_audit.py:2834` — Python print(): print(f" Unique remote destinations: {dest_analysis.get('unique_de
+- **[major]** `tools/network_transfer_audit.py:2835` — Python print(): print(f" Listening ports: {len(listeners)}")
+- **[major]** `tools/network_transfer_audit.py:2836` — Python print(): print(f" Anomalies detected: {len(anomalies)}")
+- **[major]** `tools/network_transfer_audit.py:2837` — Python print(): print(f" {BOLD}Total data inbound: {GREEN}{fmt_bytes(total
+- **[major]** `tools/network_transfer_audit.py:2838` — Python print(): print(f" {BOLD}Total data outbound: {YELLOW}{fmt_bytes(tota
+- **[major]** `tools/network_transfer_audit.py:2839` — Python print(): print(f" Sensor access events: {len(sensor_events)}")
+- **[major]** `tools/network_transfer_audit.py:2840` — Python print(): print()
+- **[major]** `tools/network_transfer_audit.py:2845` — Python print(): print(json.dumps(report, indent=2, default=str))
+- **[major]** `tools/network_transfer_audit.py:2854` — Python print(): print(f"{GREEN}HTML report saved to: {output_html}{RESET}")
+- **[major]** `tools/network_transfer_audit.py:2855` — Python print(): print(f"{DIM}Open in browser: open \"{output_html}\"{RESET}")
+- **[major]** `tools/network_transfer_audit.py:2873` — Python print(): print(f"{RED}Error: session '{session_id}' not found in {db_path}{RESET}
+- **[major]** `tools/network_transfer_audit.py:2885` — Python print(): print(f" {BOLD}Session:{RESET} {session_id}")
+- **[major]** `tools/network_transfer_audit.py:2886` — Python print(): print(f" {BOLD}Status:{RESET} {session['status']}")
+- **[major]** `tools/network_transfer_audit.py:2887` — Python print(): print(f" {BOLD}Windows:{RESET} {session['windows_done']}")
+- **[major]** `tools/network_transfer_audit.py:2888` — Python print(): print(f" {BOLD}Range:{RESET} {from_dt.strftime('%Y-%m-%d %H:%M')} → {to
+- **[major]** `tools/network_transfer_audit.py:2889` — Python print(): print()
+- **[major]** `tools/network_transfer_audit.py:2894` — Python print(): print(f" {YELLOW}No data windows found in the requested range.{RESET}")
+- **[major]** `tools/network_transfer_audit.py:2898` — Python print(): print(f" {GREEN}Found {len(windows)} windows covering this range{RESET}\n")
+- **[major]** `tools/network_transfer_audit.py:2910` — Python print(): print(f" {GREEN}{len(events)} events{RESET}")
+- **[major]** `tools/network_transfer_audit.py:2917` — Python print(): print(f" {GREEN}{len(dns)} unique domains{RESET}")
+- **[major]** `tools/network_transfer_audit.py:2919` — Python print(): print(f" {domain:<40} {count:>5} queries")
+- **[major]** `tools/network_transfer_audit.py:2928` — Python print(): print(f" {GREEN}{len(fw_events)} events{RESET}")
+- **[major]** `tools/network_transfer_audit.py:2936` — Python print(): print(f" {GREEN}{len(downloads)} files{RESET}")
+- **[major]** `tools/network_transfer_audit.py:2949` — Python print(): print(f" {GREEN}{len(live)} unique connections{RESET}")
+- **[major]** `tools/network_transfer_audit.py:2958` — Python print(): print(f" {GREEN}↓ {fmt_bytes(total_in)} ↑ {fmt_bytes(total_out)}{RESET
+- **[major]** `tools/network_transfer_audit.py:2959` — Python print(): print(f"\n {'Process':<25} {'↓ In':>10} {'↑ Out':>10}")
+- **[major]** `tools/network_transfer_audit.py:2960` — Python print(): print(f" {'─' * 25} {'─' * 10} {'─' * 10}")
+- **[major]** `tools/network_transfer_audit.py:2962` — Python print(): print(f" {p['process']:<25} {fmt_bytes(p['bytes_in']):>10} {fmt_byt
+- **[major]** `tools/network_transfer_audit.py:2980` — Python print(): print(f" {GREEN}{len(listeners)} unique listening ports{RESET}")
+- **[major]** `tools/network_transfer_audit.py:2995` — Python print(): print(f" {GREEN}{len(sensor_raw)} events across {len(sensor_types)} sen
+- **[major]** `tools/network_transfer_audit.py:2996` — Python print(): print(f"\n {'Process':<28} {'Sensor':<18} {'Count':>6}")
+- **[major]** `tools/network_transfer_audit.py:2997` — Python print(): print(f" {'─' * 28} {'─' * 18} {'─' * 6}")
+- **[major]** `tools/network_transfer_audit.py:3001` — Python print(): print(f" {color}{s['process']:<28} {s['sensor']:<18} {s['count']:>6
+- **[major]** `tools/network_transfer_audit.py:3016` — Python print(): print(f" {GREEN}Wi-Fi:{RESET} {BOLD}{ssid}{RESET} ch:{latest_wifi.
+- **[major]** `tools/network_transfer_audit.py:3019` — Python print(): print(f" {DIM}Wi-Fi: not connected{RESET}")
+- **[major]** `tools/network_transfer_audit.py:3023` — Python print(): print(f" {YELLOW}⚠ Wi-Fi SSID changed during session: {', '.join(ss
+- **[major]** `tools/network_transfer_audit.py:3035` — Python print(): print(f" {GREEN}VPN:{RESET} {len(tunnels)} tunnel(s)")
+- **[major]** `tools/network_transfer_audit.py:3038` — Python print(): print(f" {t['interface']}{ip_str} mtu={t.get('mtu','')}")
+- **[major]** `tools/network_transfer_audit.py:3045` — Python print(): print(f" Default route → {route_color}{default_iface}{RESET} "
+- **[major]** `tools/network_transfer_audit.py:3052` — Python print(): print(f"\n {BOLD}Per-Interface Transfer (session delta):{RESET}")
+- **[major]** `tools/network_transfer_audit.py:3053` — Python print(): print(f" {'Interface':<12} {'↓ In':>14} {'↑ Out':>14}")
+- **[major]** `tools/network_transfer_audit.py:3054` — Python print(): print(f" {'─' * 12} {'─' * 14} {'─' * 14}")
+- **[major]** `tools/network_transfer_audit.py:3056` — Python print(): print(f" {d['interface']:<12} {fmt_bytes(d['bytes_in']):>14} {fmt_b
+- **[major]** `tools/network_transfer_audit.py:3061` — Python print(): print(f"\n {BOLD}Proxy:{RESET} PAC → {pac}")
+- **[major]** `tools/network_transfer_audit.py:3063` — Python print(): print(f" {BOLD}DNS:{RESET} {', '.join(net_config['dns_servers'][:4])}")
+- **[major]** `tools/network_transfer_audit.py:3083` — Python print(): print(f" {GREEN}{len(unique_arp)} unique LAN devices{RESET}")
+- **[major]** `tools/network_transfer_audit.py:3086` — Python print(): print(f" {a['ip']:<18} {a['mac']:<20} {a['interface']}")
+- **[major]** `tools/network_transfer_audit.py:3094` — Python print(): print(f"\n {BOLD}Bluetooth:{RESET} {len(bt_unique)} devices")
+- **[major]** `tools/network_transfer_audit.py:3097` — Python print(): print(f" {b.get('name',''):<30} {b.get('device_type',''):<12} {st
+- **[major]** `tools/network_transfer_audit.py:3105` — Python print(): print(f"\n {BOLD}USB Devices:{RESET} {len(usb_unique)}")
+- **[major]** `tools/network_transfer_audit.py:3107` — Python print(): print(f" {u['name']:<30} {u.get('vendor','')}")
+- **[major]** `tools/network_transfer_audit.py:3115` — Python print(): print(f"\n {YELLOW}{BOLD}⚠ External disk:{RESET} {d['mount_point']}
+- **[major]** `tools/network_transfer_audit.py:3130` — Python print(): print(f" {name:<14} {color}{val}{RESET}")
+- **[major]** `tools/network_transfer_audit.py:3132` — Python print(): print(f"\n {RED}{BOLD}⚠ Firewall is DISABLED{RESET}")
+- **[major]** `tools/network_transfer_audit.py:3150` — Python print(): print(f" {BOLD}Privilege escalations:{RESET} {len(auth_rows)}")
+- **[major]** `tools/network_transfer_audit.py:3153` — Python print(): print(f" {ts} {e.get('process',''):<20} {e.get('auth_right','')[
+- **[major]** `tools/network_transfer_audit.py:3155` — Python print(): print(f" {BOLD}Gatekeeper/XProtect:{RESET} {len(gk_rows)} events")
+- **[major]** `tools/network_transfer_audit.py:3157` — Python print(): print(f" {BOLD}Network Extension:{RESET} {len(ne_rows)} VPN events")
+- **[major]** `tools/network_transfer_audit.py:3197` — Python print(): print(f" {color}{sensor:<24} {ok}/{total} ok {fmt_bytes(size):>10}
+- **[major]** `tools/network_transfer_audit.py:3201` — Python print(): print(f"\n {BOLD}Total:{RESET} {total_ok}/{total_samples} successful "
+- **[major]** `tools/network_transfer_audit.py:3254` — Python print(): print(f" {icon} {BOLD}{a['process']}{RESET}: {a['detail']}")
+- **[major]** `tools/network_transfer_audit.py:3256` — Python print(): print(f" {GREEN}✓ No anomalies detected.{RESET}")
+- **[major]** `tools/network_transfer_audit.py:3263` — Python print(): print(f" {'Window':<20} {'Net Evts':>9} {'DNS':>5} {'Conns':>6} {'↓ In'
+- **[major]** `tools/network_transfer_audit.py:3264` — Python print(): print(f" {'─' * 20} {'─' * 9} {'─' * 5} {'─' * 6} {'─' * 10} {'─' * 10}
+- **[major]** `tools/network_transfer_audit.py:3268` — Python print(): print(f" {ts:<20} {w['network_event_count']:>9} {w['dns_query_count
+- **[major]** `tools/network_transfer_audit.py:3275` — Python print(): print(f" Windows analyzed: {totals.get('windows_count', 0)}")
+- **[major]** `tools/network_transfer_audit.py:3276` — Python print(): print(f" Network connection events: {totals.get('total_network_events', 0
+- **[major]** `tools/network_transfer_audit.py:3277` — Python print(): print(f" Unique DNS domains: {len(dns)}")
+- **[major]** `tools/network_transfer_audit.py:3278` — Python print(): print(f" Firewall decisions: {totals.get('total_firewall_events',
+- **[major]** `tools/network_transfer_audit.py:3279` — Python print(): print(f" Files downloaded: {totals.get('total_downloads', 0)}")
+- **[major]** `tools/network_transfer_audit.py:3280` — Python print(): print(f" Sensor access events: {totals.get('total_sensor_events', 0)
+- **[major]** `tools/network_transfer_audit.py:3281` — Python print(): print(f" {BOLD}Total data inbound: {GREEN}{fmt_bytes(totals.get('t
+- **[major]** `tools/network_transfer_audit.py:3282` — Python print(): print(f" {BOLD}Total data outbound: {YELLOW}{fmt_bytes(totals.get('
+- **[major]** `tools/network_transfer_audit.py:3283` — Python print(): print()
+- **[major]** `tools/network_transfer_audit.py:3288` — Python print(): print(json.dumps(report, indent=2, default=str))
+- **[major]** `tools/network_transfer_audit.py:3297` — Python print(): print(f"{GREEN}HTML report saved to: {output_html}{RESET}")
+- **[major]** `tools/network_transfer_audit.py:3298` — Python print(): print(f"{DIM}Open in browser: open \"{output_html}\"{RESET}")
+- **[major]** `tools/network_transfer_audit.py:3404` — Python print(): print(f"{RED}Error: invalid collect duration '{args.collect}'. Use e
+- **[major]** `tools/network_transfer_audit.py:3415` — Python print(): print(f"{RED}Error: session '{args.data}' not found in {data_dir}/{R
+- **[major]** `tools/network_transfer_audit.py:3453` — Python print(): print(f"{RED}Error: invalid monitor duration '{args.monitor}'. Use e
+- **[major]** `tools/network_transfer_audit.py:3461` — Python print(): print(f"{RED}Error: --from time is after --to time{RESET}", file=sys.std
+- **[major]** `tools/network_transfer_audit.py:3488` — Python print(): print(f" {YELLOW}No data directory found at {data_dir}{RESET}")
+- **[major]** `tools/network_transfer_audit.py:3493` — Python print(): print(f" {YELLOW}No collected sessions found in {data_dir}/{RESET}")
+- **[major]** `tools/network_transfer_audit.py:3499` — Python print(): print(f" {'Session ID':<22} {'Status':<12} {'Windows':>8} {'Started':<20} {
+- **[major]** `tools/network_transfer_audit.py:3500` — Python print(): print(f" {'─' * 22} {'─' * 12} {'─' * 8} {'─' * 20} {'─' * 20} {'─' * 10}")
+- **[major]** `tools/network_transfer_audit.py:3511` — Python print(): print(f" {s['id']:<22} {status_color}{s['status']:<12}{RESET} "
+- **[major]** `tools/network_transfer_audit.py:3515` — Python print(): print(f" {dbf.name:<22} {RED}error: {e}{RESET}")
+- **[major]** `tools/network_transfer_audit.py:3517` — Python print(): print(f"\n {DIM}Use --data SESSION_ID to query a session{RESET}")
+- **[major]** `tools/collector.py:127` — Python print(): print(f"\n {YELLOW}⚡ Resuming incomplete session {self._session_id}
+- **[major]** `tools/collector.py:128` — Python print(): print(f" {DIM}Windows already done: {resume_info['windows_done']},
+- **[major]** `tools/collector.py:148` — Python print(): print(f" {YELLOW}Resumed from window {self._seq}/{total_windows}{RE
+- **[major]** `tools/collector.py:157` — Python print(): print(f" {DIM}Collecting session baseline...{RESET}")
+- **[major]** `tools/collector.py:164` — Python print(): print(f" {GREEN}✓{RESET} Network config + security posture + se
+- **[major]** `tools/collector.py:165` — Python print(): print(f" {DIM}Sensor capture enabled: {', '.join(enabled_sensor
+- **[major]** `tools/collector.py:167` — Python print(): print(f" {YELLOW}⚠ Firewall is disabled{RESET}")
+- **[major]** `tools/collector.py:169` — Python print(): print(f" {YELLOW}⚠ Baseline collection warning: {e}{RESET}")
+- **[major]** `tools/collector.py:182` — Python print(): print(f" {GREEN}✓{RESET} Input activity monitor started (ke
+- **[major]** `tools/collector.py:184` — Python print(): print(f" {YELLOW}⚠ Input monitor unavailable (need Accessib
+- **[major]** `tools/collector.py:186` — Python print(): print(f" {YELLOW}⚠ Input monitor failed: {e}{RESET}")
+- **[major]** `tools/collector.py:189` — Python print(): print(f" {DIM}Taking initial nettop snapshot...{RESET}")
+- **[major]** `tools/collector.py:206` — Python print(): print(f"\n {CYAN}━━ Window {self._seq + 1}/{total_windows} "
+- **[major]** `tools/collector.py:210` — Python print(): print(f" {DIM}Querying network events...{RESET}", end="", flu
+- **[major]** `tools/collector.py:212` — Python print(): print(f" {len(net_events)} events")
+- **[major]** `tools/collector.py:215` — Python print(): print(f" {DIM}Querying DNS...{RESET}", end="", flush=True)
+- **[major]** `tools/collector.py:217` — Python print(): print(f" {len(dns)} domains")
+- **[major]** `tools/collector.py:220` — Python print(): print(f" {DIM}Querying firewall...{RESET}", end="", flush=Tru
+- **[major]** `tools/collector.py:222` — Python print(): print(f" {len(fw)} events")
+- **[major]** `tools/collector.py:225` — Python print(): print(f" {DIM}Querying downloads...{RESET}", end="", flush=Tr
+- **[major]** `tools/collector.py:228` — Python print(): print(f" {len(valid_dl)} files")
+- **[major]** `tools/collector.py:231` — Python print(): print(f" {DIM}Snapshotting live connections...{RESET}", end="
+- **[major]** `tools/collector.py:233` — Python print(): print(f" {len(live)} connections")
+- **[major]** `tools/collector.py:236` — Python print(): print(f" {DIM}Computing nettop delta...{RESET}", end="", flus
+- **[major]** `tools/collector.py:242` — Python print(): print(f" ↓{_fmt_bytes(total_in)} ↑{_fmt_bytes(total_out)}")
+- **[major]** `tools/collector.py:245` — Python print(): print(f" {DIM}Querying sensor access...{RESET}", end="", flus
+- **[major]** `tools/collector.py:247` — Python print(): print(f" {len(sensor_events_raw)} events")
+- **[major]** `tools/collector.py:250` — Python print(): print(f" {DIM}Snapshotting listening ports...{RESET}", end=""
+- **[major]** `tools/collector.py:252` — Python print(): print(f" {len(listeners)} ports")
+- **[major]** `tools/collector.py:255` — Python print(): print(f" {DIM}Snapshotting process list...{RESET}", end="", f
+- **[major]** `tools/collector.py:260` — Python print(): print(f" {len(proc_list)} processes")
+- **[major]** `tools/collector.py:263` — Python print(): print(f" {DIM}Querying Wi-Fi / VPN / interfaces...{RESET}", e
+- **[major]** `tools/collector.py:269` — Python print(): print(f" Wi-Fi:{wifi_label} route:{vpn_label} {len(iface_bytes
+- **[major]** `tools/collector.py:272` — Python print(): print(f" {DIM}Scanning LAN & devices...{RESET}", end="", flus
+- **[major]** `tools/collector.py:277` — Python print(): print(f" {len(arp)} LAN {len(bt.get('devices',[]))} BT {len(us
+- **[major]** `tools/collector.py:280` — Python print(): print(f" {DIM}Querying security events...{RESET}", end="", fl
+- **[major]** `tools/collector.py:284` — Python print(): print(f" {len(gk_events)} GK {len(auth_evts)} auth {len(ne_eve
+- **[major]** `tools/collector.py:288` — Python print(): print(f" {DIM}Capturing sensor samples ({len(enabled_sens
+- **[major]** `tools/collector.py:295` — Python print(): print(f" {ok} ok {skip} skip {err} err blobs={_fmt_by
+- **[major]** `tools/collector.py:298` — Python print(): print(f" {YELLOW}⚠ {e}{RESET}")
+- **[major]** `tools/collector.py:302` — Python print(): print(f" {DIM}Running exfiltration monitors...{RESET}", end="
+- **[major]** `tools/collector.py:316` — Python print(): print(f" git:{git_ct} exfil-proc:{launch_ct} staging:{stag
+- **[major]** `tools/collector.py:319` — Python print(): print(f" {YELLOW}⚠ {e}{RESET}")
+- **[major]** `tools/collector.py:323` — Python print(): print(f" {DIM}Writing to database...{RESET}", end="", flush=T
+- **[major]** `tools/collector.py:353` — Python print(): print(f" {YELLOW}⚠ exfil write: {e}{RESET}")
+- **[major]** `tools/collector.py:356` — Python print(): print(f" {DIM}Building process tree...{RESET}", end="", flush
+- **[major]** `tools/collector.py:361` — Python print(): print(f" {len(ptree)} processes {unsigned} unsigned")
+- **[major]** `tools/collector.py:364` — Python print(): print(f" {YELLOW}⚠ {e}{RESET}")
+- **[major]** `tools/collector.py:368` — Python print(): print(f" {DIM}Building connection graph...{RESET}", end="", f
+- **[major]** `tools/collector.py:373` — Python print(): print(f" {len(conn_graph)} edges {total_dests} unique desti
+- **[major]** `tools/collector.py:376` — Python print(): print(f" {YELLOW}⚠ {e}{RESET}")
+- **[major]** `tools/collector.py:380` — Python print(): print(f" {DIM}Scanning persistence mechanisms...{RESET}", end
+- **[major]** `tools/collector.py:384` — Python print(): print(f" {len(persist_items)} items {risky} flagged")
+- **[major]** `tools/collector.py:387` — Python print(): print(f" {YELLOW}⚠ {e}{RESET}")
+- **[major]** `tools/collector.py:391` — Python print(): print(f" {DIM}Capturing payloads...{RESET}", end="", flush=Tr
+- **[major]** `tools/collector.py:395` — Python print(): print(f" {len(payloads)} payloads {sensitive_ct} with sensi
+- **[major]** `tools/collector.py:398` — Python print(): print(f" {YELLOW}⚠ {e}{RESET}")
+- **[major]** `tools/collector.py:403` — Python print(): print(f" {DIM}Reading input activity...{RESET}", end="",
+- **[major]** `tools/collector.py:411` — Python print(): print(f" keys:{k} ({kpm:.0f}/min) clicks:{clicks_l} "
+- **[major]** `tools/collector.py:415` — Python print(): print(f" {YELLOW}⚠ {e}{RESET}")
+- **[major]** `tools/collector.py:418` — Python print(): print(f" {GREEN}✓{RESET}")
+- **[major]** `tools/collector.py:422` — Python print(): print(f" {GREEN}Window {self._seq} saved.{RESET} "
+- **[major]** `tools/collector.py:426` — Python print(): print(f"\n {RED}✗ Collection error: {e}{RESET}")
+- **[major]** `tools/collector.py:433` — Python print(): print(f" {DIM}Computing baselines & updating known processe
+- **[major]** `tools/collector.py:437` — Python print(): print(f" {len(new_procs)} new processes detected")
+- **[major]** `tools/collector.py:439` — Python print(): print(f" {GREEN}✓{RESET}")
+- **[major]** `tools/collector.py:441` — Python print(): print(f" {YELLOW}⚠ {e}{RESET}")
+- **[major]** `tools/collector.py:485` — Python print(): print(f"\r {DIM}[{bar}] next window in {int(sleep_for - slept):>3}s
+- **[major]** `tools/collector.py:500` — Python print(): print(f"\n\n {YELLOW}⚠ {sig_name} received — finishing current window a
+- **[major]** `tools/collector.py:504` — Python print(): print(f"\n{BOLD}{CYAN}{'═' * 70}{RESET}")
+- **[major]** `tools/collector.py:505` — Python print(): print(f"{BOLD}{CYAN} Continuous Data Collector{RESET}")
+- **[major]** `tools/collector.py:506` — Python print(): print(f"{BOLD}{CYAN}{'═' * 70}{RESET}")
+- **[major]** `tools/collector.py:507` — Python print(): print(f" {BOLD}Duration:{RESET} {_fmt_duration(self.duration)}")
+- **[major]** `tools/collector.py:509` — Python print(): print(f" {BOLD}Interval:{RESET} {self.interval}s ({interval_labe
+- **[major]** `tools/collector.py:510` — Python print(): print(f" {BOLD}Total windows:{RESET} {total_windows}")
+- **[major]** `tools/collector.py:511` — Python print(): print(f" {BOLD}Start:{RESET} {start_time.strftime('%Y-%m-%d %
+- **[major]** `tools/collector.py:512` — Python print(): print(f" {BOLD}Expected end:{RESET} {end_time.strftime('%Y-%m-%d %H:
+- **[major]** `tools/collector.py:513` — Python print(): print(f" {BOLD}Database:{RESET} {db_path}")
+- **[major]** `tools/collector.py:514` — Python print(): print(f" {DIM}Press Ctrl+C to stop gracefully{RESET}")
+- **[major]** `tools/collector.py:515` — Python print(): print()
+- **[major]** `tools/collector.py:519` — Python print(): print(f"\n{BOLD}{CYAN}{'═' * 70}{RESET}")
+- **[major]** `tools/collector.py:520` — Python print(): print(f" {BOLD}Collection {color}{status}{RESET}")
+- **[major]** `tools/collector.py:521` — Python print(): print(f" {BOLD}Windows collected:{RESET} {self._seq}")
+- **[major]** `tools/collector.py:522` — Python print(): print(f" {BOLD}Database:{RESET} {db_path}")
+- **[major]** `tools/collector.py:523` — Python print(): print(f" {BOLD}Database size:{RESET} {_fmt_bytes(os.path.getsize(db
+- **[major]** `tools/collector.py:524` — Python print(): print(f"{BOLD}{CYAN}{'═' * 70}{RESET}\n")
+- **[major]** `tools/collector.py:556` — Python print(): print(f"\n {YELLOW}Received signal {signum}, shutting down daemon...{RE
+- **[major]** `tools/collector.py:562` — Python print(): print(f"{BOLD}{CYAN}{'═' * 70}{RESET}")
+- **[major]** `tools/collector.py:563` — Python print(): print(f"{BOLD} Sensor Audit Collector — Daemon Mode{RESET}")
+- **[major]** `tools/collector.py:564` — Python print(): print(f"{DIM} Session duration: {_fmt_duration(session_duration)}")
+- **[major]** `tools/collector.py:565` — Python print(): print(f" Collection interval: {_fmt_duration(interval)}")
+- **[major]** `tools/collector.py:566` — Python print(): print(f" Data directory: {data_dir}{RESET}")
+- **[major]** `tools/collector.py:567` — Python print(): print(f"{BOLD}{CYAN}{'═' * 70}{RESET}\n")
+- **[major]** `tools/collector.py:572` — Python print(): print(f"\n {CYAN}━━ Starting session #{session_num} "
+- **[major]** `tools/collector.py:581` — Python print(): print(f" {RED}✗ Session #{session_num} error: {e}{RESET}")
+- **[major]** `tools/collector.py:587` — Python print(): print(f" {DIM}Next session in 10s...{RESET}")
+- **[major]** `tools/collector.py:590` — Python print(): print(f"\n {GREEN}✓ Daemon stopped cleanly after {session_num} session(s){R
+- **[major]** `tools/sample_capture.py:238` — Python print(): print(s)
+- **[major]** `tools/secure_vault.py:329` — Python print(): print("Error: Password cannot be empty", file=sys.stderr)
+- **[major]** `tools/secure_vault.py:334` — Python print(): print("Error: Passwords do not match", file=sys.stderr)
+- **[major]** `tools/secure_vault.py:399` — Python print(): print(f"Vault '{result['name']}' created ({result['max_size']})")
+- **[major]** `tools/secure_vault.py:400` — Python print(): print(f" Path: {result['vault_path']}")
+- **[major]** `tools/secure_vault.py:402` — Python print(): print(f" Imported from: {args.source}")
+- **[major]** `tools/secure_vault.py:407` — Python print(): print(f"Vault '{result['name']}' unlocked")
+- **[major]** `tools/secure_vault.py:408` — Python print(): print(f" Mount point: {result['mount_point']}")
+- **[major]** `tools/secure_vault.py:410` — Python print(): print(f" ({result['message']})")
+- **[major]** `tools/secure_vault.py:414` — Python print(): print(f"Vault '{result['name']}' locked")
+- **[major]** `tools/secure_vault.py:416` — Python print(): print(f" ({result['message']})")
+- **[major]** `tools/secure_vault.py:421` — Python print(): print("No vaults are currently unlocked")
+- **[major]** `tools/secure_vault.py:424` — Python print(): print(f" {r['name']}: {status}")
+- **[major]** `tools/secure_vault.py:429` — Python print(): print("No vaults found. Create one with: secure_vault.py create
+- **[major]** `tools/secure_vault.py:431` — Python print(): print(f"{'Name':<20} {'Status':<10} {'Size':<12} {'Created':<20} {'M
+- **[major]** `tools/secure_vault.py:432` — Python print(): print("-" * 90)
+- **[major]** `tools/secure_vault.py:438` — Python print(): print(f"{v['name']:<20} {status_icon} {v['status']:<7} {size:<12
+- **[major]** `tools/secure_vault.py:443` — Python print(): print(f"Vault: {s['name']}")
+- **[major]** `tools/secure_vault.py:444` — Python print(): print(f" Status: {status_icon}")
+- **[major]** `tools/secure_vault.py:445` — Python print(): print(f" Path: {s['vault_path']}")
+- **[major]** `tools/secure_vault.py:446` — Python print(): print(f" Max size: {s['max_size']}")
+- **[major]** `tools/secure_vault.py:447` — Python print(): print(f" On disk: {_fmt_bytes(s['size_on_disk'])}")
+- **[major]** `tools/secure_vault.py:448` — Python print(): print(f" Created: {s['created']}")
+- **[major]** `tools/secure_vault.py:450` — Python print(): print(f" Last unlocked: {s['last_unlocked']}")
+- **[major]** `tools/secure_vault.py:452` — Python print(): print(f" Mount point: {s['mount_point']}")
+- **[major]** `tools/secure_vault.py:454` — Python print(): print(f" Hint: {s['password_hint']}")
+- **[major]** `tools/secure_vault.py:459` — Python print(): print("Aborted.")
+- **[major]** `tools/secure_vault.py:463` — Python print(): print(f"Vault '{result['name']}' permanently destroyed")
+- **[major]** `tools/secure_vault.py:466` — Python print(): print("Enter current password:")
+- **[major]** `tools/secure_vault.py:468` — Python print(): print("Enter new password:")
+- **[major]** `tools/secure_vault.py:471` — Python print(): print(f"Password changed for vault '{result['name']}'")
+- **[major]** `tools/secure_vault.py:474` — Python print(): print(f"Access denied: {e}", file=sys.stderr)
+- **[major]** `tools/secure_vault.py:477` — Python print(): print(f"Error: {e}", file=sys.stderr)
+- **[major]** `tools/input_monitor.py:196` — Python print(): print(" ⚠ pyobjc-framework-Quartz not installed — input monitoring
+- **[major]** `tools/input_monitor.py:213` — Python print(): print(" ⚠ CGEventTap failed — grant Accessibility permission to Ter
+- **[major]** `tools/input_monitor.py:438` — Python print(): print("Input Monitor — press Ctrl+C to stop")
+- **[major]** `tools/input_monitor.py:439` — Python print(): print("Requires Accessibility permission for Terminal/Python")
+- **[major]** `tools/input_monitor.py:440` — Python print(): print()
+- **[major]** `tools/input_monitor.py:444` — Python print(): print("Failed to start — check Accessibility permissions")
+- **[major]** `tools/input_monitor.py:451` — Python print(): print(f"[{datetime.now().strftime('%H:%M:%S')}] "
+- **[major]** `tools/input_monitor.py:461` — Python print(): print(f" Top categories: {', '.join(f'{k}={v}' for k, v
+- **[major]** `tools/input_monitor.py:465` — Python print(): print(f" Top combos: {', '.join(f'{k}={v}' for k, v in t
+- **[major]** `tools/input_monitor.py:467` — Python print(): print("\nStopping...")
+- **[major]** `tools/input_monitor.py:470` — Python print(): print("\nFinal stats:")
+- **[major]** `tools/input_monitor.py:471` — Python print(): print(json.dumps(final, indent=2))
+- **[minor]** `dashboard/src/api.ts:28` — any type: async function put(path: string, body: any): Promise {
+- **[minor]** `dashboard/src/api.ts:38` — any type: async function post(path: string, body?: any): Promise {
+- **[minor]** `dashboard/src/api.ts:56` — any type: updateConfig: (data: any) => put('/config', data),
+- **[minor]** `dashboard/src/pages/Reports.tsx:25` — any type: {reports.map((r: any) => (
+- **[minor]** `dashboard/src/pages/Sessions.tsx:10` — any type: const STATUS_CFG: Record = {
+- **[minor]** `dashboard/src/pages/Sessions.tsx:37` — any type: sessions.forEach((s: any) => { if (s.status in c) (c as any)[s.status]++; })
+- **[minor]** `dashboard/src/pages/Sessions.tsx:43` — any type: const totalSize = sessions.reduce((a: number, s: any) => a + (s.db_size || 0
+- **[minor]** `dashboard/src/pages/Sessions.tsx:44` — any type: const totalWindows = sessions.reduce((a: number, s: any) => a + (s.windows_d
+- **[minor]** `dashboard/src/pages/Sessions.tsx:51` — any type: if (statusFilter !== 'all') list = list.filter((s: any) => s.status === stat
+- **[minor]** `dashboard/src/pages/Sessions.tsx:54` — any type: list = list.filter((s: any) =>
+- **[minor]** `dashboard/src/pages/Sessions.tsx:58` — any type: list.sort((a: any, b: any) => {
+- **[minor]** `dashboard/src/pages/Sessions.tsx:172` — any type: {filtered.map((s: any) => {
+- **[minor]** `dashboard/src/pages/Vaults.tsx:44` — any type: } catch (e: any) {
+- **[minor]** `dashboard/src/pages/Vaults.tsx:73` — any type: } catch (e: any) { flashErr(e.message); }
+- **[minor]** `dashboard/src/pages/Vaults.tsx:79` — any type: catch (e: any) { flashErr(e.message); }
+- **[minor]** `dashboard/src/pages/Vaults.tsx:84` — any type: catch (e: any) { flashErr(e.message); }
+- **[minor]** `dashboard/src/pages/Vaults.tsx:108` — any type: } catch (e: any) { flashErr(e.message); }
+- **[minor]** `dashboard/src/pages/SessionDetail.tsx:48` — any type: const isRunning = (s: any) => s?.status === 'running';
+- **[minor]** `dashboard/src/pages/SessionDetail.tsx:162` — any type: const maxBytes = nettop.length ? Math.max(...nettop.map((n: any) => n.bytes_in
+- **[minor]** `dashboard/src/pages/SessionDetail.tsx:198` — any type: } catch (e: any) { toast('error', 'Report failed', e.message); }
+- **[minor]** `dashboard/src/pages/Dashboard.tsx:32` — any type: toast('success', 'Capture complete', `${results.filter((r: any) => r.statu
+- **[minor]** `dashboard/src/pages/Dashboard.tsx:33` — any type: } catch (e: any) {
+- **[minor]** `dashboard/src/pages/Dashboard.tsx:45` — any type: } catch (e: any) {
+- **[minor]** `dashboard/src/pages/Dashboard.tsx:55` — any type: } catch (e: any) {
+- **[minor]** `dashboard/src/pages/Dashboard.tsx:77` — any type: const unackedAlerts = (alerts || []).filter((a: any) => !a.acknowledged);
+- **[minor]** `dashboard/src/pages/Dashboard.tsx:152` — any type: {unackedAlerts.filter((a: any) => a.severity === 'critical').len
+- **[minor]** `dashboard/src/pages/Dashboard.tsx:223` — any type: {captureResult.map((r: any, i: number) => (
+- **[minor]** `dashboard/src/pages/Dashboard.tsx:264` — any type: {sessions.slice(0, 8).map((s: any) => (
+- **[minor]** `dashboard/src/pages/SampleViewer.tsx:21` — any type: function MetadataTree({ data, depth = 0 }: { data: any; depth?: number }) {
+- **[minor]** `dashboard/src/pages/SampleViewer.tsx:163` — any type: {sample.metadata.running_apps?.slice(0, 15).map((a: any, i: numb
+- **[minor]** `dashboard/src/pages/SessionCompare.tsx:50` — any type: {sessions?.map((s: any) => (
+- **[minor]** `dashboard/src/pages/SessionCompare.tsx:60` — any type: {sessions?.map((s: any) => (
+- **[minor]** `dashboard/src/pages/SessionCompare.tsx:151` — any type: {data.process_diff.map((p: any) => (
+- **[minor]** `dashboard/src/pages/DataManagement.tsx:66` — any type: {sessionList.map((s: any) => (
+- **[minor]** `dashboard/src/pages/Config.tsx:22` — any type: mutationFn: (data: any) => api.updateConfig(data),
+- **[minor]** `dashboard/src/pages/Config.tsx:32` — any type: setLocal((prev: any) => ({
+- **[minor]** `dashboard/src/pages/Config.tsx:38` — any type: const updateSensorParam = (sensor: string, param: string, value: any) => {
+- **[minor]** `dashboard/src/pages/Config.tsx:39` — any type: setLocal((prev: any) => ({
+- **[minor]** `dashboard/src/pages/Config.tsx:46` — any type: setLocal((prev: any) => ({ ...prev, schedule: { ...prev.schedule, [param]: v
+- **[minor]** `dashboard/src/pages/Alerts.tsx:48` — any type: critical: alerts.filter((a: any) => a.severity === 'critical').length,
+- **[minor]** `dashboard/src/pages/Alerts.tsx:49` — any type: warning: alerts.filter((a: any) => a.severity === 'warning').length,
+- **[minor]** `dashboard/src/pages/Alerts.tsx:50` — any type: info: alerts.filter((a: any) => a.severity === 'info').length,
+- **[minor]** `dashboard/src/pages/Alerts.tsx:51` — any type: unacked: alerts.filter((a: any) => !a.acknowledged).length,
+- **[minor]** `dashboard/src/pages/Alerts.tsx:57` — any type: const cats = new Set(alerts.map((a: any) => a.category).filter(Boolean));
+- **[minor]** `dashboard/src/pages/Alerts.tsx:64` — any type: if (sevFilter !== 'all') list = list.filter((a: any) => a.severity === sevFi
+- **[minor]** `dashboard/src/pages/Alerts.tsx:65` — any type: if (ackFilter === 'unacked') list = list.filter((a: any) => !a.acknowledged)
+- **[minor]** `dashboard/src/pages/Alerts.tsx:66` — any type: if (ackFilter === 'acked') list = list.filter((a: any) => a.acknowledged);
+- **[minor]** `dashboard/src/pages/Alerts.tsx:67` — any type: if (catFilter !== 'all') list = list.filter((a: any) => a.category === catFi
+- **[minor]** `dashboard/src/pages/Alerts.tsx:76` — any type: } catch (e: any) {
+- **[minor]** `dashboard/src/pages/Alerts.tsx:170` — any type: {filtered.map((a: any) => {
+- **[minor]** `dashboard/src/pages/Services.tsx:108` — any type: try { await api.stopCollection(); refetch(); toast('info', 'Coll
+- **[minor]** `dashboard/src/pages/Services.tsx:114` — any type: try { await api.startCollection(3600, 300); refetch(); toast('su
+- **[minor]** `dashboard/src/pages/ProcessDetail.tsx:39` — any type: ? Math.max(...data.bandwidth_timeline.map((w: any) => w.bytes_in + w.bytes_o
+- **[minor]** `dashboard/src/pages/ProcessDetail.tsx:112` — any type: {data.bandwidth_timeline.map((w: any, i: number) => {
+- **[minor]** `dashboard/src/pages/ProcessDetail.tsx:146` — any type: {data.connections.map((c: any, i: number) => (
+- **[minor]** `dashboard/src/pages/ProcessDetail.tsx:172` — any type: {data.sensor_access.map((s: any, i: number) => (
+- **[minor]** `dashboard/src/pages/Calendar.tsx:76` — any type: for (const s of (sessions || []) as any[]) {
+- **[minor]** `dashboard/src/pages/Calendar.tsx:89` — any type: if (!map[k].find((x: any) => x.id === s.id)) map[k].push(s);
+- **[minor]** `dashboard/src/pages/Calendar.tsx:100` — any type: for (const r of (reports || []) as any[]) {
+- **[minor]** `dashboard/src/pages/Calendar.tsx:159` — any type: const result: any[] = [];
+- **[minor]** `dashboard/src/pages/Calendar.tsx:161` — any type: for (const s of (sessions || []) as any[]) {
+- **[minor]** `dashboard/src/pages/Calendar.tsx:180` — any type: return ((reports || []) as any[]).filter((r: any) => {
+- **[minor]** `dashboard/src/pages/Calendar.tsx:257` — any type: {daySessions.slice(0, 4).map((s: any) => (
+- **[minor]** `dashboard/src/pages/Calendar.tsx:261` — any type: {dayReports.slice(0, 3).map((r: any, ri: number) => (
+- **[minor]** `dashboard/src/pages/Calendar.tsx:332` — any type: {selectedSessions.map((s: any) => (
+- **[minor]** `dashboard/src/pages/Calendar.tsx:367` — any type: {selectedReports.map((r: any, i: number) => (
+- **[minor]** `dashboard/src/pages/DataFlowMap.tsx:305` — any type: {(sessions || []).map((s: any) => (
+- **[minor]** `dashboard/src/pages/session-tabs/ConnectionsTab.tsx:6` — any type: connGraphData: any;
+- **[minor]** `dashboard/src/pages/session-tabs/ConnectionsTab.tsx:7` — any type: processTreeData: any;
+- **[minor]** `dashboard/src/pages/session-tabs/ConnectionsTab.tsx:18` — any type: e
+- **[minor]** `dashboard/src/pages/session-tabs/ConnectionsTab.tsx:19` — any type: e.process))
+- **[minor]** `dashboard/src/pages/session-tabs/ConnectionsTab.tsx:20` — any type: [
+- **[minor]** `dashboard/src/pages/session-tabs/ConnectionsTab.tsx:44` — any type: rows={tree.filter((p: any) => p.is_exfil_relevant || p.code_signed =
+- **[minor]** `dashboard/src/pages/session-tabs/OverviewTab.tsx:8` — any type: session: any;
+- **[minor]** `dashboard/src/pages/session-tabs/OverviewTab.tsx:9` — any type: insightsData: any;
+- **[minor]** `dashboard/src/pages/session-tabs/OverviewTab.tsx:10` — any type: summaryData: any;
+- **[minor]** `dashboard/src/pages/session-tabs/OverviewTab.tsx:12` — any type: windows: any[] | undefined;
+- **[minor]** `dashboard/src/pages/session-tabs/OverviewTab.tsx:13` — any type: nettop: any[];
+- **[minor]** `dashboard/src/pages/session-tabs/OverviewTab.tsx:17` — any type: processRisk: any;
+- **[minor]** `dashboard/src/pages/session-tabs/OverviewTab.tsx:18` — any type: screenCaptures: any[] | undefined;
+- **[minor]** `dashboard/src/pages/session-tabs/OverviewTab.tsx:33` — any type: {insightsData?.alerts?.filter((a: any) => a.severity === 'critical').map((
+- **[minor]** `dashboard/src/pages/session-tabs/OverviewTab.tsx:85` — any type: const timelineMax = Math.max(...windows.map((x: any) => (x.bytes_in_
+- **[minor]** `dashboard/src/pages/session-tabs/OverviewTab.tsx:88` — any type: {windows.map((w: any, i: number) => {
+- **[minor]** `dashboard/src/pages/session-tabs/OverviewTab.tsx:112` — any type: rows={nettop.slice(0, 20).map((n: any) => [
+- **[minor]** `dashboard/src/pages/session-tabs/OverviewTab.tsx:152` — any type: const highRisk = procs.filter((p: any) => p.risk_score >= 6);
+- **[minor]** `dashboard/src/pages/session-tabs/OverviewTab.tsx:175` — any type: {highRisk.map((p: any) => (
+- **[minor]** `dashboard/src/pages/session-tabs/OverviewTab.tsx:200` — any type: {procs.slice(0, 25).map((p: any) => (
+- **[minor]** `dashboard/src/pages/session-tabs/OverviewTab.tsx:227` — any type: {screenCaptures && screenCaptures.filter((s: any) => s.blob_url && s.blob_
+- **[minor]** `dashboard/src/pages/session-tabs/OverviewTab.tsx:228` — any type:
+- **[minor]** `dashboard/src/pages/session-tabs/OverviewTab.tsx:231` — any type: .filter((s: any) => s.blob_url && s.blob_mime?.startsWith('image/'
+- **[minor]** `dashboard/src/pages/session-tabs/OverviewTab.tsx:233` — any type: .map((s: any) => (
+- **[minor]** `dashboard/src/pages/session-tabs/OverviewTab.tsx:246` — any type: {screenCaptures.filter((s: any) => s.blob_url).length > 12 && (
+- **[minor]** `dashboard/src/pages/session-tabs/OverviewTab.tsx:249` — any type: View all {screenCaptures.filter((s: any) => s.blob_url).length} sc
+- **[minor]** `dashboard/src/pages/session-tabs/PayloadsTab.tsx:6` — any type: payloadData: any;
+- **[minor]** `dashboard/src/pages/session-tabs/PayloadsTab.tsx:12` — any type: const sourceTypes = [...new Set(samples.map((s: any) => s.source_type))] as st
+- **[minor]** `dashboard/src/pages/session-tabs/PayloadsTab.tsx:19` — any type: s.se
+- **[minor]** `dashboard/src/pages/session-tabs/PayloadsTab.tsx:20` — any type: s.source_type === st).slice(0, 30).map((s:
+- **[minor]** `dashboard/src/pages/session-tabs/shared.tsx:10` — any type: export function Table({ headers, rows }: { headers: string[]; rows: any[][] }) {
+- **[minor]** `dashboard/src/pages/session-tabs/shared.tsx:48` — any type: export const POSTURE_OK: Record boolean> = {
+- **[minor]** `dashboard/src/pages/session-tabs/SamplesTab.tsx:7` — any type: samples: any[] | undefined;
+- **[minor]** `dashboard/src/pages/session-tabs/SamplesTab.tsx:14` — any type: windows: any[] | undefined;
+- **[minor]** `dashboard/src/pages/session-tabs/SamplesTab.tsx:58` — any type: {windows.map((w: any) => (
+- **[minor]** `dashboard/src/pages/session-tabs/SamplesTab.tsx:67` — any type: {[...(samples || [])].sort((a: any, b: any) => {
+- **[minor]** `dashboard/src/pages/session-tabs/SamplesTab.tsx:74` — any type: }).map((s: any) => {
+- **[minor]** `dashboard/src/pages/session-tabs/SecurityTab.tsx:4` — any type: const POSTURE_OK: Record boolean> = {
+- **[minor]** `dashboard/src/pages/session-tabs/SecurityTab.tsx:10` — any type: security: any;
+- **[minor]** `dashboard/src/pages/session-tabs/SecurityTab.tsx:22` — any type: rows={security.sensor_events.slice(0, 50).map((e: any) => [
+- **[minor]** `dashboard/src/pages/session-tabs/SecurityTab.tsx:34` — any type: rows={security.gatekeeper.slice(0, 50).map((e: any) => [
+- **[minor]** `dashboard/src/pages/session-tabs/SecurityTab.tsx:46` — any type: rows={security.auth_events.slice(0, 50).map((e: any) => [
+- **[minor]** `dashboard/src/pages/session-tabs/InputTab.tsx:5` — any type: inputStats: any;
+- **[minor]** `dashboard/src/pages/session-tabs/InputTab.tsx:6` — any type: inputTimeline: any[];
+- **[minor]** `dashboard/src/pages/session-tabs/InputTab.tsx:21` — any type: const totalCatKeys = cats.reduce((s: number, c: any) => s + c.count, 0) || 1;
+- **[minor]** `dashboard/src/pages/session-tabs/InputTab.tsx:22` — any type: const maxTimelineKeys = timeline.length ? Math.max(...timeline.map((t: any) =>
+- **[minor]** `dashboard/src/pages/session-tabs/InputTab.tsx:50` — any type: {cats.map((c: any) => {
+- **[minor]** `dashboard/src/pages/session-tabs/InputTab.tsx:75` — any type: rows={apps.map((a: any) => [
+- **[minor]** `dashboard/src/pages/session-tabs/InputTab.tsx:89` — any type: rows={combos.map((c: any) => [
+- **[minor]** `dashboard/src/pages/session-tabs/InputTab.tsx:109` — any type: {timeline.map((w: any, i: number) => (
+- **[minor]** `dashboard/src/pages/session-tabs/PermissionsTab.tsx:6` — any type: permissionsData: any;
+- **[minor]** `dashboard/src/pages/session-tabs/PermissionsTab.tsx:16` — any type: const allProcs: any[] = permissionsData.processes || [];
+- **[minor]** `dashboard/src/pages/session-tabs/PermissionsTab.tsx:19` — any type: ? allProcs.filter((p: any) => p.process.toLowerCase().includes(q) || p.binar
+- **[minor]** `dashboard/src/pages/session-tabs/PermissionsTab.tsx:21` — any type: if (permFilter) filtered = filtered.filter((p: any) => p.permissions[permFilte
+- **[minor]** `dashboard/src/pages/session-tabs/PermissionsTab.tsx:22` — any type: const withPerms = filtered.filter((p: any) => p.total_events > 0);
+- **[minor]** `dashboard/src/pages/session-tabs/PermissionsTab.tsx:23` — any type: const withoutPerms = filtered.filter((p: any) => p.total_events === 0);
+- **[minor]** `dashboard/src/pages/session-tabs/PermissionsTab.tsx:25` — any type: for (const s of sensors) sensorCounts[s] = allProcs.filter((p: any) => p.permi
+- **[minor]** `dashboard/src/pages/session-tabs/PermissionsTab.tsx:33` — any type:
+- **[minor]** `dashboard/src/pages/session-tabs/PermissionsTab.tsx:79` — any type: {withPerms.map((p: any) => (
+- **[minor]** `dashboard/src/pages/session-tabs/PermissionsTab.tsx:114` — any type: {withoutPerms.map((p: any) => (
+- **[minor]** `dashboard/src/pages/session-tabs/ExfiltrationTab.tsx:6` — any type: exfilData: any;
+- **[minor]** `dashboard/src/pages/session-tabs/ExfiltrationTab.tsx:38` — any type: {exfilData.ai_ide_activity.map((a: any, i: number) => (
+- **[minor]** `dashboard/src/pages/session-tabs/ExfiltrationTab.tsx:87` — any type: {exfilData.git_events.filter((e: any) => e.event_type === 'git_recent_
+- **[minor]** `dashboard/src/pages/session-tabs/ExfiltrationTab.tsx:124` — any type: {exfilData.git_events.filter((e: any) => e.event_type !== 'git_recent_
+- **[minor]** `dashboard/src/pages/session-tabs/ExfiltrationTab.tsx:127` — any type: rows={exfilData.git_events.filter((e: any) => e.event_type !== 'gi
+- **[minor]** `dashboard/src/pages/session-tabs/ExfiltrationTab.tsx:142` — any type: rows={exfilData.process_launches.map((e: any) => [
+- **[minor]** `dashboard/src/pages/session-tabs/ExfiltrationTab.tsx:156` — any type: {exfilData.file_staging.map((e: any, i: number) => (
+- **[minor]** `dashboard/src/pages/session-tabs/ExfiltrationTab.tsx:182` — any type: rows={exfilData.remote_copies.map((e: any) => [
+- **[minor]** `dashboard/src/pages/session-tabs/ExfiltrationTab.tsx:198` — any type: rows={exfilData.http_requests.slice(0, 100).map((e: any) => [
+- **[minor]** `dashboard/src/pages/session-tabs/PersistenceTab.tsx:5` — any type: persistenceData: any;
+- **[minor]** `dashboard/src/pages/session-tabs/PersistenceTab.tsx:19` — any type: i.enabled).length}
+- **[minor]** `dashboard/src/pages/session-tabs/PersistenceTab.tsx:24` — any type: {items.filter((i: any) => i.item_type === type).slice(0, 50).map((it
+- **[minor]** `dashboard/src/pages/session-tabs/NetworkTab.tsx:7` — any type: totals: any;
+- **[minor]** `dashboard/src/pages/session-tabs/NetworkTab.tsx:8` — any type: nettop: any[];
+- **[minor]** `dashboard/src/pages/session-tabs/NetworkTab.tsx:10` — any type: connections: any[] | undefined;
+- **[minor]** `dashboard/src/pages/session-tabs/NetworkTab.tsx:11` — any type: networkData: any;
+- **[minor]** `dashboard/src/pages/session-tabs/NetworkTab.tsx:12` — any type: destinations: any;
+- **[minor]** `dashboard/src/pages/session-tabs/NetworkTab.tsx:29` — any type: rows={nettop.slice(0, 30).map((n: any) => [
+- **[minor]** `dashboard/src/pages/session-tabs/NetworkTab.tsx:44` — any type: rows={connections.slice(0, 50).map((c: any) => [c.process, c.type, c
+- **[minor]** `dashboard/src/pages/session-tabs/NetworkTab.tsx:53` — any type: rows={networkData.dns.map((d: any) => [d[0], d[1]])}
+- **[minor]** `dashboard/src/pages/session-tabs/NetworkTab.tsx:65` — any type: p.suspicious) ? 't
+- **[minor]** `dashboard/src/pages/session-tabs/NetworkTab.tsx:73` — any type: {destinations.top_destinations.filter((d: any) => !d.internal)
+- **[minor]** `dashboard/src/pages/session-tabs/NetworkTab.tsx:86` — any type: {destinations.top_ports.slice(0, 12).map((p: any, i: number) =
+- **[minor]** `dashboard/src/pages/session-tabs/TimelineTab.tsx:27` — any type: timelineData: any;
+- **[minor]** `dashboard/src/pages/session-tabs/TimelineTab.tsx:68` — any type: {events.map((ev: any, i: number) => {
+- **[minor]** `dashboard/src/pages/session-tabs/InsightsTab.tsx:6` — any type: insightsData: any;
+- **[minor]** `dashboard/src/pages/session-tabs/InsightsTab.tsx:7` — any type: networkData: any;
+- **[minor]** `dashboard/src/pages/session-tabs/InsightsTab.tsx:19` — any type: {insightsData.alerts.map((a: any, i: number) => {
+- **[minor]** `dashboard/src/pages/session-tabs/InsightsTab.tsx:40` — any type: {insightsData.insights.map((ins: any, i: number) => (
+- **[minor]** `dashboard/src/pages/session-tabs/InsightsTab.tsx:97` — any type: {data.errors.map((e: any) => `${e.status} (${e.count})`).j
+- **[minor]** `dashboard/src/pages/session-tabs/InsightsTab.tsx:115` — any type: rows={procs.map((p: any) => {
+- **[minor]** `dashboard/src/pages/session-tabs/InsightsTab.tsx:116` — any type: const totalAll = procs.reduce((s: number, x: any) => s + x.count
+- **[minor]** `dashboard/src/pages/session-tabs/InsightsTab.tsx:134` — any type: rows={insightsData.bandwidth_spikes.map((s: any) => [
+- **[minor]** `dashboard/src/pages/session-tabs/InsightsTab.tsx:150` — any type: rows={insightsData.baseline_anomalies.map((a: any) => [
+- **[minor]** `dashboard/src/pages/session-tabs/InsightsTab.tsx:167` — any type: rows={insightsData.new_processes_with_network.map((p: any) => [
+- **[minor]** `dashboard/src/pages/session-tabs/DevicesTab.tsx:5` — any type: devices: any;
+- **[minor]** `dashboard/src/pages/session-tabs/DevicesTab.tsx:17` — any type: rows={devices.wifi.map((w: any) => [
+- **[minor]** `dashboard/src/pages/session-tabs/DevicesTab.tsx:29` — any type: rows={devices.vpn.map((v: any) => [v.interface, v.ip, v.mtu, (v.flag
+- **[minor]** `dashboard/src/pages/session-tabs/DevicesTab.tsx:38` — any type: rows={devices.interface_bytes.map((i: any) => [i.interface, fmtBytes
+- **[minor]** `dashboard/src/pages/session-tabs/DevicesTab.tsx:47` — any type: rows={devices.listening_ports.map((p: any) => [p.process, p.pid, p.u
+- **[minor]** `dashboard/src/pages/session-tabs/DevicesTab.tsx:56` — any type: rows={devices.bluetooth.map((b: any) => [b.name, b.mac, b.type, b.co
+- **[minor]** `dashboard/src/pages/session-tabs/DevicesTab.tsx:65` — any type: rows={devices.usb.map((u: any) => [u.name, u.vendor, u.serial, u.pro
+- **[minor]** `dashboard/src/pages/session-tabs/DevicesTab.tsx:74` — any type: rows={devices.arp.map((a: any) => [a.ip, a.mac, a.interface])}
+- **[minor]** `dashboard/src/pages/AskQuestion.tsx:14` — any type: data?: any;
+- **[minor]** `dashboard/src/pages/AskQuestion.tsx:67` — any type: } catch (err: any) {
+- **[minor]** `dashboard/src/pages/AskQuestion.tsx:103` — any type: {(sessions || []).map((s: any) => (
+- **[minor]** `dashboard/src/pages/AskQuestion.tsx:230` — any type: function DataPreview({ data }: { data: any[] }) {
+- **[minor]** `dashboard/src/pages/AskQuestion.tsx:247` — any type: {items.map((row: any, i: number) => (
+- **[minor]** `dashboard/src/pages/Trends.tsx:12` — any type: const maxBw = Math.max(...trends.map((t: any) => t.bytes_in + t.bytes_out), 1)
+- **[minor]** `dashboard/src/pages/Trends.tsx:13` — any type: const maxAlerts = Math.max(...trends.map((t: any) => t.alerts_critical + t.ale
+- **[minor]** `dashboard/src/pages/Trends.tsx:26` — any type: {trends.map((t: any, i: number) => {
+- **[minor]** `dashboard/src/pages/Trends.tsx:55` — any type: {trends.map((t: any, i: number) => {
+- **[minor]** `dashboard/src/pages/Trends.tsx:86` — any type: {trends.map((t: any) => (
+- **[minor]** `dashboard/src/pages/RunAudit.tsx:239` — any type: } catch (e: any) {
+- **[minor]** `dashboard/src/pages/RunAudit.tsx:265` — any type: } catch (e: any) {
+- **[minor]** `dashboard/src/pages/RunAudit.tsx:571` — any type: {sessions.map((s: any) => (
+- **[minor]** `dashboard/src/pages/LaunchAgents.tsx:5` — any type: function AgentTable({ title, agents }: { title: string; agents: any[] }) {
+- **[minor]** `dashboard/src/pages/LaunchAgents.tsx:22` — any type: {agents.map((a: any, i: number) => {
+- **[major]** `dashboard/src/index.css:11` — Hardcoded hex color: #334155
+- **[major]** `dashboard/src/index.css:12` — Hardcoded hex color: #475569
+- **[major]** `dashboard/src/index.css:37` — Hardcoded hex color: #cbd5e1
+- **[major]** `dashboard/src/index.css:38` — Hardcoded hex color: #94a3b8
+- **[major]** `dashboard/src/pages/DataFlowMap.tsx:63` — Hardcoded hex color: #38bdf8
+- **[major]** `dashboard/src/pages/DataFlowMap.tsx:64` — Hardcoded hex color: #f87171
+- **[major]** `dashboard/src/pages/DataFlowMap.tsx:65` — Hardcoded hex color: #a78bfa
+- **[major]** `dashboard/src/pages/DataFlowMap.tsx:69` — Hardcoded hex color: #0284c7
+- **[major]** `dashboard/src/pages/DataFlowMap.tsx:70` — Hardcoded hex color: #dc2626
+- **[major]** `dashboard/src/pages/DataFlowMap.tsx:71` — Hardcoded hex color: #7c3aed
+- **[major]** `dashboard/src/pages/DataFlowMap.tsx:76` — Hardcoded hex color: #f87171
+- **[major]** `dashboard/src/pages/DataFlowMap.tsx:77` — Hardcoded hex color: #fbbf24
+- **[major]** `dashboard/src/pages/DataFlowMap.tsx:78` — Hardcoded hex color: #38bdf8
+- **[major]** `dashboard/src/pages/DataFlowMap.tsx:79` — Hardcoded hex color: #475569
+- **[major]** `dashboard/src/pages/DataFlowMap.tsx:405` — Hardcoded hex color: #1e293b
+- **[major]** `dashboard/src/pages/DataFlowMap.tsx:432` — Hardcoded hex color: #fff
+- **[major]** `dashboard/src/pages/DataFlowMap.tsx:432` — Hardcoded hex color: #e2e8f0
+- **[major]** `dashboard/src/pages/DataFlowMap.tsx:440` — Hardcoded hex color: #334155
+- **[major]** `dashboard/src/pages/DataFlowMap.tsx:440` — Hardcoded hex color: #94a3b8
+- **[major]** `dashboard/src/pages/DataFlowMap.tsx:453` — Hardcoded hex color: #fff
+- **[minor]** `tools/capture_config.py:44` — Emoji in code: 📷
+- **[minor]** `tools/capture_config.py:45` — Emoji in code: 🖥
+- **[minor]** `tools/capture_config.py:46` — Emoji in code: 🎙
+- **[minor]** `tools/capture_config.py:47` — Emoji in code: 📍
+- **[minor]** `tools/capture_config.py:48` — Emoji in code: 🌐
+- **[minor]** `tools/capture_config.py:49` — Emoji in code: 📋
+- **[minor]** `tools/capture_config.py:50` — Emoji in code: 📶
+- **[minor]** `tools/capture_config.py:51` — Emoji in code: 🔌
+- **[minor]** `tools/capture_config.py:52` — Emoji in code: 💾
+- **[minor]** `tools/capture_config.py:53` — Emoji in code: 🔤
+- **[minor]** `tools/capture_config.py:54` — Emoji in code: 🪟
+- **[minor]** `tools/html_report.py:522` — Emoji in code: 🔒
+- **[minor]** `tools/html_report.py:542` — Emoji in code: 📸
+- **[minor]** `tools/html_report.py:585` — Emoji in code: 🌐
+- **[minor]** `tools/html_report.py:616` — Emoji in code: 📱
+- **[minor]** `tools/html_report.py:647` — Emoji in code: 🛡
+- **[minor]** `tools/html_report.py:663` — Emoji in code: 🔑
+- **[minor]** `tools/secure_vault.py:437` — Emoji in code: 🔓
+- **[minor]** `tools/secure_vault.py:442` — Emoji in code: 🔓
+- **[minor]** `dashboard/src/pages/SampleViewer.tsx:98` — Emoji in code: 💡
+- **[minor]** `dashboard/src/pages/SampleViewer.tsx:101` — Emoji in code: 💡
+- **[minor]** `dashboard/src/pages/SampleViewer.tsx:131` — Emoji in code: 📍
+- **[minor]** `dashboard/src/pages/Config.tsx:7` — Emoji in code: 📷
+- **[minor]** `dashboard/src/pages/Config.tsx:8` — Emoji in code: 🌐
+- **[minor]** `dashboard/src/pages/Config.tsx:9` — Emoji in code: 💾
+- **[minor]** `dashboard/src/pages/Config.tsx:119` — Emoji in code: 📡
+- **[minor]** `dashboard/src/pages/session-tabs/OverviewTab.tsx:54` — Emoji in code: 🧠
+- **[minor]** `dashboard/src/pages/session-tabs/OverviewTab.tsx:139` — Emoji in code: 📷
+- **[minor]** `dashboard/src/pages/session-tabs/OverviewTab.tsx:228` — Emoji in code: 📸
+- **[minor]** `dashboard/src/pages/session-tabs/SamplesTab.tsx:38` — Emoji in code: 📷
+
+## Ecosystem totals by rule
+
+| Rule | Total findings |
+|------|----------------|
+| `web-hardcoded-hex` | 1370 |
+| `b7-emoji-in-code` | 465 |
+| `b4-python-print` | 351 |
+| `ts-any-type` | 249 |
+| `b4-console-log` | 93 |
+| `b5-hardcoded-product-id` | 13 |
+| `b4-swift-print` | 7 |
+
+**Grand total: 2548 findings across 19 repos.**
diff --git a/scripts/check-rule-violations.sh b/scripts/check-rule-violations.sh
new file mode 100644
index 00000000..1d20a9f6
--- /dev/null
+++ b/scripts/check-rule-violations.sh
@@ -0,0 +1,453 @@
+#!/usr/bin/env bash
+# check-rule-violations.sh — Ecosystem-wide AGENTS.md rule compliance scanner.
+#
+# Scans every repo in repos.txt for violations of the canonical rules defined
+# in AI.dev/SKILLS/agent-behavior-guidelines.md (Parts B4, B5, B7) plus a few
+# stack-specific per-repo MUST NOT rules (no `any`, no hardcoded hex colors).
+#
+# Output:
+# reports/rule-violations-YYYY-MM-DD.md — human-readable, grouped by repo
+# reports/rule-violations-YYYY-MM-DD.json — machine-readable, one finding per line
+#
+# Usage:
+# bash scripts/check-rule-violations.sh # scan all repos
+# bash scripts/check-rule-violations.sh # scan single repo
+# bash scripts/check-rule-violations.sh --quiet # only print summary
+#
+# Exit code: 0 always (scanner is informational, not gating).
+#
+# Each rule is implemented as a function:
+# scan_() { repo_dir="$1"; ...emit findings via emit_finding... }
+# Adding a new rule:
+# 1. Add a function below
+# 2. Append to RULES=() array
+# 3. Document severity + rationale in the function header comment
+#
+# Findings are emitted via emit_finding which appends to two global arrays
+# (FINDINGS_JSON and FINDINGS_MD) consumed at the end by the report writer.
+
+set -uo pipefail
+# NOT -e: grep returning 1 (no matches) is normal and must not abort the scan.
+
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+REPOS_TXT="${SCRIPT_DIR}/../.windsurf/workflows/repos.txt"
+BASE_DIR="$(cd "${SCRIPT_DIR}/../.." && pwd)"
+REPORTS_DIR="${SCRIPT_DIR}/../reports"
+TODAY="$(date +%Y-%m-%d)"
+JSON_OUT="${REPORTS_DIR}/rule-violations-${TODAY}.json"
+MD_OUT="${REPORTS_DIR}/rule-violations-${TODAY}.md"
+
+RED='\033[0;31m'; YELLOW='\033[1;33m'; GREEN='\033[0;32m'; BLUE='\033[0;34m'; NC='\033[0m'
+
+mkdir -p "$REPORTS_DIR"
+
+# ─── Mode parsing ──────────────────────────────────────────────────────────────
+
+QUIET=0
+SINGLE_REPO=""
+for arg in "$@"; do
+ case "$arg" in
+ --quiet|-q) QUIET=1 ;;
+ --help|-h) sed -n '2,30p' "$0"; exit 0 ;;
+ -*) echo "Unknown flag: $arg" >&2; exit 1 ;;
+ *) SINGLE_REPO="$arg" ;;
+ esac
+done
+
+# ─── Repo list ─────────────────────────────────────────────────────────────────
+
+REPOS=()
+if [[ -n "$SINGLE_REPO" ]]; then
+ REPOS+=("$SINGLE_REPO")
+else
+ while IFS= read -r line; do
+ [[ "$line" =~ ^[[:space:]]*# ]] && continue
+ [[ -z "${line// }" ]] && continue
+ REPOS+=("$line")
+ done < "$REPOS_TXT"
+fi
+
+# ─── Finding accumulator ───────────────────────────────────────────────────────
+
+# Globals updated by emit_finding(); flushed at end of each repo.
+declare -a FINDINGS_JSON
+declare -a FINDINGS_MD
+
+# Per-repo counters (reset before each repo). Bash 3.2 compatible — no
+# associative arrays. Ecosystem totals are computed at the end by grep'ing
+# the JSONL output file (each finding is one line).
+REPO_CRITICAL=0
+REPO_MAJOR=0
+REPO_MINOR=0
+
+# emit_finding RULE_ID SEVERITY REPO FILE LINE EVIDENCE
+# SEVERITY: critical|major|minor
+emit_finding() {
+ local rule_id="$1" severity="$2" repo="$3" file="$4" line="$5" evidence="$6"
+ # Strip leading repo path for shorter reporting
+ local rel_file="${file#${BASE_DIR}/${repo}/}"
+ # JSON escape (basic — content is grep output, no nested quotes from us)
+ local json_evidence="${evidence//\\/\\\\}"
+ json_evidence="${json_evidence//\"/\\\"}"
+ json_evidence="${json_evidence// /\\t}"
+ FINDINGS_JSON+=("{\"rule\":\"$rule_id\",\"severity\":\"$severity\",\"repo\":\"$repo\",\"file\":\"$rel_file\",\"line\":$line,\"evidence\":\"$json_evidence\"}")
+ FINDINGS_MD+=("- **[$severity]** \`$rel_file:$line\` — $evidence")
+ case "$severity" in
+ critical) REPO_CRITICAL=$(( REPO_CRITICAL + 1 )) ;;
+ major) REPO_MAJOR=$(( REPO_MAJOR + 1 )) ;;
+ minor) REPO_MINOR=$(( REPO_MINOR + 1 )) ;;
+ esac
+}
+
+# ─── Shared exclusion globs (grep --exclude-dir / --exclude) ───────────────────
+#
+# These directories are always excluded from scans. They contain either
+# generated, vendored, or test code (tests have a separate exclusion policy
+# per rule — tests are sacred but they don't violate prod-code rules).
+
+EXCLUDE_DIRS=(
+ --exclude-dir=node_modules
+ --exclude-dir=.git
+ --exclude-dir=.next
+ --exclude-dir=.turbo
+ --exclude-dir=dist
+ --exclude-dir=build
+ --exclude-dir=coverage
+ --exclude-dir=__pycache__
+ --exclude-dir=.venv
+ --exclude-dir=venv
+ --exclude-dir=target # Rust
+ --exclude-dir=Pods # CocoaPods
+ --exclude-dir=DerivedData # Xcode
+ --exclude-dir=.gradle
+ --exclude-dir=reports
+ --exclude-dir=test-results
+ --exclude-dir=playwright-report
+ --exclude-dir=.pytest_cache
+ --exclude-dir=.ruff_cache
+ --exclude-dir=generated # design-tokens output
+ --exclude-dir=__LOCAL_LLMs # local LLM sandbox (not production)
+ --exclude-dir=chat-history # IDE chat archives
+ --exclude-dir=__experiments # experimental code
+ --exclude-dir=experiments # experimental code
+ --exclude-dir=_archive_helper # archived code
+ --exclude-dir=.docker-deps # bundled npm tarballs for Docker builds
+)
+
+# Test-file exclusions (used per-rule; some rules apply to tests, others don't)
+TEST_EXCLUDES=(
+ --exclude-dir=__tests__
+ --exclude-dir=__mocks__
+ --exclude-dir=e2e
+ --exclude-dir=tests
+ --exclude=*.test.ts
+ --exclude=*.test.tsx
+ --exclude=*.spec.ts
+ --exclude=*.spec.tsx
+ --exclude=*.test.js
+ --exclude=*.spec.js
+)
+
+# ─── RULES ─────────────────────────────────────────────────────────────────────
+#
+# Each scan_* function:
+# • Receives $1 = absolute repo path
+# • Emits findings via emit_finding
+# • Must not error out (use || true after grep when needed)
+
+# B4 — no `console.log` in production TS/JS code.
+# Severity: major. Tests excluded. Allowed: console.warn/error for legit errors
+# in some places, but we still flag console.log to surface.
+scan_b4_console_log() {
+ local repo="$1" repo_dir="$2"
+ while IFS=: read -r file line evidence; do
+ [[ -z "$file" ]] && continue
+ # Skip commented lines (// or # before console.log)
+ [[ "$evidence" =~ ^[[:space:]]*(//|#|\*) ]] && continue
+ # Skip CLI/admin scripts — their job is to print to terminal.
+ # Pattern: top-level scripts/ directory in either common_plat or product repos.
+ [[ "$file" =~ (^|/)scripts/ ]] && continue
+ emit_finding "b4-console-log" "major" "$repo" "$file" "$line" "console.log: ${evidence:0:80}"
+ done < <(grep -rnE 'console\.log\(' "$repo_dir" \
+ --include='*.ts' --include='*.tsx' --include='*.js' --include='*.jsx' --include='*.mjs' \
+ "${EXCLUDE_DIRS[@]}" "${TEST_EXCLUDES[@]}" 2>/dev/null || true)
+}
+
+# B4 — no `print(` in Swift production code.
+# Severity: major. XCTest test files excluded.
+scan_b4_swift_print() {
+ local repo="$1" repo_dir="$2"
+ while IFS=: read -r file line evidence; do
+ [[ -z "$file" ]] && continue
+ [[ "$evidence" =~ ^[[:space:]]*// ]] && continue
+ emit_finding "b4-swift-print" "major" "$repo" "$file" "$line" "Swift print(): ${evidence:0:80}"
+ done < <(grep -rnE '\bprint\(' "$repo_dir" --include='*.swift' \
+ --exclude-dir=Tests --exclude='*Tests.swift' --exclude='*Test.swift' \
+ "${EXCLUDE_DIRS[@]}" 2>/dev/null || true)
+}
+
+# B4 — no `print(` in Python production code under src/ tools/ backend-python/.
+# Severity: major. Scripts dir and tests excluded (scripts and CLIs may print).
+scan_b4_python_print() {
+ local repo="$1" repo_dir="$2"
+ # Note: scripts/ explicitly excluded (CLIs print to terminal). Only scan
+ # core src/library/backend trees where structlog/logging should be used.
+ for src in src tools backend-python backend/src; do
+ [[ -d "${repo_dir}/${src}" ]] || continue
+ while IFS=: read -r file line evidence; do
+ [[ -z "$file" ]] && continue
+ [[ "$evidence" =~ ^[[:space:]]*# ]] && continue
+ # Skip CLI entrypoint files (often named cli.py, __main__.py).
+ [[ "$file" =~ /(cli|__main__|main)\.py$ ]] && continue
+ emit_finding "b4-python-print" "major" "$repo" "$file" "$line" "Python print(): ${evidence:0:80}"
+ done < <(grep -rnE '^\s*print\(' "${repo_dir}/${src}" --include='*.py' \
+ --exclude-dir=tests --exclude='test_*.py' --exclude='*_test.py' \
+ "${EXCLUDE_DIRS[@]}" 2>/dev/null || true)
+ done
+}
+
+# B4 — TypeScript `any` type usage in source code.
+# Severity: minor (per AGENTS.md it's a MUST NOT for most TS repos but is
+# pervasive in some legacy code; flagging as minor avoids drowning the report).
+# Excludes: tests, .d.ts files, generated code, lines that are pre-existing
+# `// eslint-disable` annotated.
+scan_ts_any_type() {
+ local repo="$1" repo_dir="$2"
+ while IFS=: read -r file line evidence; do
+ [[ -z "$file" ]] && continue
+ [[ "$evidence" =~ eslint-disable ]] && continue
+ # Skip type narrowing patterns like `as any` for legitimate JSON parsing
+ # (we still report them but in a follow-up rule if needed)
+ emit_finding "ts-any-type" "minor" "$repo" "$file" "$line" "any type: ${evidence:0:80}"
+ done < <(grep -rnE ':\s*any\b|\bas\s+any\b' "$repo_dir" \
+ --include='*.ts' --include='*.tsx' \
+ --exclude='*.d.ts' \
+ "${EXCLUDE_DIRS[@]}" "${TEST_EXCLUDES[@]}" 2>/dev/null || true)
+}
+
+# Web-specific: hardcoded hex colors in TS/TSX/CSS source code.
+# Per-repo AGENTS.md MUST NOT — colors must come from design-tokens
+# (--XX-* CSS custom properties).
+# Severity: major. Excludes: design-tokens output, tests, comments.
+# Evidence: the actual matched hex code (e.g., "#fff") plus a short context
+# snippet, so triage doesn't need to open the file for trivial cases.
+scan_web_hardcoded_hex() {
+ local repo="$1" repo_dir="$2"
+ # Use grep -oE with --only-matching-line position so we can show the real match.
+ # Pattern: '#' followed by either 6 or 3 hex chars at a word boundary.
+ while IFS=: read -r file line match; do
+ [[ -z "$file" ]] && continue
+ # Allow hex colors in tokens / generated / design-system files
+ [[ "$file" =~ /(tokens\.css|.*\.tokens\..*|generated/|design-tokens/) ]] && continue
+ emit_finding "web-hardcoded-hex" "major" "$repo" "$file" "$line" "Hardcoded hex color: $match"
+ done < <(grep -rnoE '#[0-9a-fA-F]{6}\b|#[0-9a-fA-F]{3}\b' "$repo_dir" \
+ --include='*.ts' --include='*.tsx' --include='*.css' --include='*.scss' \
+ "${EXCLUDE_DIRS[@]}" "${TEST_EXCLUDES[@]}" 2>/dev/null || true)
+}
+
+# B5 — hardcoded product ID string literals outside shared/product.json
+# and product-config files.
+# Severity: critical. The canonical pattern is PRODUCT_ID from product-config.ts
+# or @bytelyst/config.
+scan_b5_hardcoded_product_id() {
+ local repo="$1" repo_dir="$2"
+ local product_ids='"(lysnrai|mindlyst|chronomind|jarvisjr|nomgap|peakpulse|flowmonk|notelett|actiontrail|localmemgpt|efforise|localllmlab|smartauth|productivity-web|talk2obs)"'
+ while IFS=: read -r file line evidence; do
+ [[ -z "$file" ]] && continue
+ # Allow in canonical locations
+ [[ "$file" =~ (shared/product\.json|product-config\.(ts|js|swift|kt)|product\.manifest\.json) ]] && continue
+ # Allow in test fixtures (they need literal IDs)
+ [[ "$file" =~ (__tests__|tests/|\.test\.|\.spec\.) ]] && continue
+ # Allow in docs
+ [[ "$file" =~ \.(md|mdx)$ ]] && continue
+ # Allow cross-product UI in common_plat dashboards (they legitimately
+ # enumerate all products for admin operations).
+ [[ "$repo" == "learning_ai_common_plat" && "$file" =~ dashboards/(admin-web|tracker-web|ux-lab)/ ]] && continue
+ # Allow obvious enumeration patterns: SelectItem value=, option value=,
+ # product list arrays, etc. These are intentional cross-product references,
+ # not hardcoded product identity.
+ [[ "$evidence" =~ (SelectItem|option|productId:|product:)[[:space:]]*[=:][[:space:]]*\" ]] && continue
+ # Skip JSDoc / docstring / inline comment lines containing example product IDs.
+ # Pattern: line begins with whitespace then '*' (JSDoc continuation),
+ # '//' (line comment), or '#' (Python comment).
+ [[ "$evidence" =~ ^[[:space:]]*(\*|//|#) ]] && continue
+ emit_finding "b5-hardcoded-product-id" "critical" "$repo" "$file" "$line" "Hardcoded product ID: ${evidence:0:80}"
+ done < <(grep -rnE "$product_ids" "$repo_dir" \
+ --include='*.ts' --include='*.tsx' --include='*.js' \
+ "${EXCLUDE_DIRS[@]}" 2>/dev/null || true)
+}
+
+# B7 — emojis in source code (per-repo AGENTS.md "Never add emojis to code").
+# Severity: minor. Excludes: markdown, tests, generated files.
+# Implementation: writes a small Python helper to a temp file and runs it,
+# avoiding the bash heredoc-in-process-substitution pattern which produced
+# 'ambiguous redirect' errors under set -u.
+scan_b7_emojis() {
+ local repo="$1" repo_dir="$2"
+ command -v python3 >/dev/null 2>&1 || return 0
+ local py_helper out
+ py_helper="$(mktemp -t emoji-scan.XXXXXX.py)"
+ out="$(mktemp -t emoji-out.XXXXXX)"
+ cat > "$py_helper" <<'PYEOF'
+import os, re, sys
+root = sys.argv[1]
+# Only flag DECORATIVE emojis (faces, food, animals, transport, hearts).
+# Explicitly EXCLUDE U+2600-U+27BF (Miscellaneous Symbols) which contains
+# ✓ ✗ ⚠ ★ ☐ ☑ ✓ — universally used as UI status indicators, not decorative.
+EMOJI_RE = re.compile(
+ r"[\U0001F600-\U0001F64F]" # emoticons (faces)
+ r"|[\U0001F300-\U0001F5FF]" # misc symbols + pictographs (decorative)
+ r"|[\U0001F680-\U0001F6FF]" # transport + map
+ r"|[\U0001F700-\U0001F77F]" # alchemical symbols
+ r"|[\U0001F900-\U0001F9FF]" # supplemental symbols + pictographs
+ r"|[\U0001FA70-\U0001FAFF]" # symbols + pictographs extended-A
+)
+EXTS = {".ts", ".tsx", ".js", ".jsx", ".py", ".swift", ".kt", ".rs"}
+SKIP_DIRS = {"node_modules", ".git", ".next", "dist", "build", "coverage",
+ "__pycache__", "target", "Pods", "DerivedData", "reports",
+ "test-results", ".pytest_cache", ".venv", "venv",
+ "__tests__", "__mocks__", "tests", "e2e", "generated",
+ "__LOCAL_LLMs", "chat-history", "__experiments",
+ "experiments", "_archive_helper", ".docker-deps",
+ ".turbo", ".ruff_cache", ".gradle", "playwright-report"}
+for dp, dirs, files in os.walk(root):
+ dirs[:] = [d for d in dirs if d not in SKIP_DIRS]
+ for f in files:
+ ext = os.path.splitext(f)[1]
+ if ext not in EXTS:
+ continue
+ if f.endswith((".test.ts", ".test.tsx", ".spec.ts", ".spec.tsx",
+ ".test.js", ".spec.js")):
+ continue
+ fp = os.path.join(dp, f)
+ try:
+ with open(fp, encoding="utf-8", errors="replace") as fh:
+ for i, l in enumerate(fh, 1):
+ m = EMOJI_RE.search(l)
+ if m:
+ # Emit: filepath:line:emoji_char
+ print(f"{fp}:{i}:{m.group(0)}")
+ except (OSError, UnicodeDecodeError):
+ continue
+PYEOF
+ python3 "$py_helper" "$repo_dir" > "$out" 2>/dev/null || true
+ while IFS=: read -r file line evidence; do
+ [[ -z "$file" ]] && continue
+ emit_finding "b7-emoji-in-code" "minor" "$repo" "$file" "$line" "Emoji in code: $evidence"
+ done < "$out"
+ rm -f "$py_helper" "$out"
+}
+
+# ─── Rule registry ─────────────────────────────────────────────────────────────
+
+RULES=(
+ scan_b4_console_log
+ scan_b4_swift_print
+ scan_b4_python_print
+ scan_ts_any_type
+ scan_web_hardcoded_hex
+ scan_b5_hardcoded_product_id
+ scan_b7_emojis
+)
+
+# ─── Scan loop ─────────────────────────────────────────────────────────────────
+
+echo "" > "$JSON_OUT"
+{
+ echo "# Rule Violations Report — ${TODAY}"
+ echo ""
+ echo "> Generated by \`scripts/check-rule-violations.sh\` against canonical rules in"
+ echo "> [\`AI.dev/SKILLS/agent-behavior-guidelines.md\`](../AI.dev/SKILLS/agent-behavior-guidelines.md)."
+ echo ""
+ echo "Severity legend: **critical** = data/security risk · **major** = rule violation · **minor** = style"
+ echo ""
+} > "$MD_OUT"
+
+[[ "$QUIET" -eq 0 ]] && echo -e "${BLUE}Scanning $(echo "${REPOS[@]}" | wc -w | tr -d ' ') repo(s) against ${#RULES[@]} rules...${NC}"
+
+total_findings=0
+for repo in "${REPOS[@]}"; do
+ repo_dir="${BASE_DIR}/${repo}"
+ if [[ ! -d "$repo_dir" ]]; then
+ [[ "$QUIET" -eq 0 ]] && echo -e "${YELLOW} skip: $repo (directory missing)${NC}"
+ continue
+ fi
+
+ # Reset per-repo finding arrays + counters
+ FINDINGS_MD=()
+ FINDINGS_JSON=()
+ REPO_CRITICAL=0
+ REPO_MAJOR=0
+ REPO_MINOR=0
+
+ for rule_fn in "${RULES[@]}"; do
+ "$rule_fn" "$repo" "$repo_dir"
+ done
+
+ # Append per-repo section to markdown report
+ local_count=${#FINDINGS_MD[@]}
+ total_findings=$(( total_findings + local_count ))
+ c=$REPO_CRITICAL
+ M=$REPO_MAJOR
+ m=$REPO_MINOR
+
+ {
+ echo "## \`$repo\`"
+ echo ""
+ if [[ "$local_count" -eq 0 ]]; then
+ echo "✅ No violations found."
+ else
+ echo "**Counts:** critical=$c · major=$M · minor=$m · total=$local_count"
+ echo ""
+ printf "%s\n" "${FINDINGS_MD[@]}"
+ fi
+ echo ""
+ } >> "$MD_OUT"
+
+ # Append per-repo JSON lines
+ if [[ "$local_count" -gt 0 ]]; then
+ printf '%s\n' "${FINDINGS_JSON[@]}" >> "$JSON_OUT"
+ fi
+
+ if [[ "$QUIET" -eq 0 ]]; then
+ if [[ "$local_count" -eq 0 ]]; then
+ echo -e " ${GREEN}✓ $repo${NC} (0 findings)"
+ else
+ echo -e " ${YELLOW}⚠ $repo${NC} critical=$c major=$M minor=$m total=$local_count"
+ fi
+ fi
+done
+
+# ─── Summary ───────────────────────────────────────────────────────────────────
+
+# Compute per-rule totals from the JSONL output (bash 3.2-compatible).
+# Extract "rule":"" via sed, then sort | uniq -c.
+RULE_COUNTS_FILE="$(mktemp)"
+sed -nE 's/.*"rule":"([^"]+)".*/\1/p' "$JSON_OUT" | sort | uniq -c | sort -rn > "$RULE_COUNTS_FILE"
+
+{
+ echo "## Ecosystem totals by rule"
+ echo ""
+ echo "| Rule | Total findings |"
+ echo "|------|----------------|"
+ while read -r count rule; do
+ [[ -z "$rule" ]] && continue
+ echo "| \`$rule\` | $count |"
+ done < "$RULE_COUNTS_FILE"
+ echo ""
+ echo "**Grand total: $total_findings findings across ${#REPOS[@]} repos.**"
+} >> "$MD_OUT"
+
+echo ""
+echo -e "${BLUE}═══ Summary ═══${NC}"
+echo " Total findings: $total_findings"
+echo " Markdown report: $MD_OUT"
+echo " JSON report: $JSON_OUT"
+echo ""
+echo "By rule (highest first):"
+while read -r count rule; do
+ [[ -z "$rule" ]] && continue
+ printf " %-32s %d\n" "$rule" "$count"
+done < "$RULE_COUNTS_FILE"
+
+rm -f "$RULE_COUNTS_FILE"