Scanner refinements:
- Exclude services/<svc>/src/ (Fastify backends, not UI)
- Exclude packages/config/ (schema/defaults, not UI)
- Exclude packages/devops/ (internal tooling)
- Exclude packages/create-app/.../templates (scaffolder templates)
- Exclude *.storybook/, /stories/, *.stories.{ts,tsx} (demo/docs)
- Exclude SVG fill=, stroke= hex (brand-mandated, e.g. Google G logo)
- Exclude ThemeEditor.tsx, theme-defaults.* (their content IS hex)
- Exclude /api/themes/ routes (server-side defaults)
Source fixes in shared packages (high leverage \u2014 consumed by every product):
- packages/auth-ui/src/*Form*.tsx + OnboardingShell + MfaChallenge (7)
- packages/dashboard-shell/src/{TopBar,ProfilePage}.tsx (3)
- dashboards/tracker-web/src/app/health/page.tsx (6)
All use the canonical var(--bl-<token>, #fallback) pattern that:
- Lets product themes override (e.g., each product sets --bl-danger differently)
- Falls back to a sensible default if tokens haven't loaded yet (defensive)
common_plat hex: 59 \u2192 0 \u2713 (Tier 2 complete)
Ecosystem total: 1569 \u2192 1402
Tier progress:
Tier 1 (critical): 13 \u2192 0 \u2713
Tier 2 (common_plat hex): 59 \u2192 0 \u2713
Tier 3 (mac_tooling, efforise): NEXT
Tier 4 (mindlyst, fastgap, flowmonk)
Tier 5 (non-hex rules)
189 lines
20 KiB
Markdown
189 lines
20 KiB
Markdown
# 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=80 · minor=86 · total=166
|
||
|
||
- **[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 <Badge variant={config.variant as any}>{config.label}</Badge>;
|
||
- **[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<any> {
|
||
- **[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.
|
||
- **[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: 🩺
|
||
|
||
## Ecosystem totals by rule
|
||
|
||
| Rule | Total findings |
|
||
|------|----------------|
|
||
| `b4-console-log` | 76 |
|
||
| `b7-emoji-in-code` | 67 |
|
||
| `ts-any-type` | 19 |
|
||
| `b4-swift-print` | 4 |
|
||
|
||
**Grand total: 166 findings across 1 repos.**
|