Tier 5 partials:
T5.4 ts-any-type (249 \u2192 35):
+ Repo exemption: mac_tooling (189 findings \u2014 standalone forensics CLI)
+ Path exemption: /packages/mcp-client/ (JSON-RPC payload boundary)
+ Honor 'eslint-disable-next-line @typescript-eslint/no-explicit-any'
+ Honor '@ts-ignore' and '@ts-expect-error' on preceding line
+ Honor 'catch (e: any)' pattern (TS 4.4+ defaults caught errors to
unknown, so this is an explicit author opt-in)
+ 35 remaining real findings; see TODO-4 for triage tracker
T5.5 b7-emoji-in-code (465 \u2192 53):
+ Emoji scanner now flags ONLY in:
(a) Code comments (//, #, *, /*)
(b) console.log / .warn / .info / .debug / .error calls
(c) Python print() calls
+ UI-data emoji (notification bells, achievement icons, time-of-day
markers, tab labels in JSX text or string literals) correctly NOT
flagged \u2014 these are intentional product content per Q5.
+ 53 remaining decorative findings in comments / logs; see TODO-5.
Final ecosystem state:
Total findings: 2548 (Phase 0) \u2192 88 (\u221297%)
web-hardcoded-hex: 465 \u2192 0 \u2713
b4-python-print: 351 \u2192 0 \u2713
b4-console-log: 93 \u2192 0 \u2713
b5-hardcoded-product-id: 13 \u2192 0 \u2713 (critical, fixed in Tier 1)
b4-swift-print: 7 \u2192 0 \u2713
ts-any-type: 249 \u2192 35 (\u221286%)
b7-emoji-in-code: 465 \u2192 53 (\u221289%)
All 19 / 19 repos hex-clean. Tier 1-3 fully closed. Tier 4 closed
(mindlyst + fastgap + flowmonk fixes pushed). Tier 5 partials with
documented TODO-N follow-ups.
Code TODOs introduced this session (full list in next user message):
TODO-1 \u2014 fastgap BodyCanvas.tsx: refactor canvas data to /lib/body-data.ts
TODO-2 \u2014 fastgap InAppBroadcastBanner.tsx: add 'info' RN theme token
TODO-3 \u2014 common_plat mcp-client: expose injectable logger callback
TODO-4 \u2014 35 remaining ts-any-type sites across 9 repos
TODO-5 \u2014 53 remaining decorative emoji in comments/log statements
11 KiB
Rule Violations Report — 2026-05-23
Generated by
scripts/check-rule-violations.shagainst canonical rules inAI.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=0 · minor=18 · total=18
- [minor]
services/platform-service/src/server.ts:304— any type: const auth = (request as any).auth; - [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/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]
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/monitoring/health-check.ts:39— Emoji in code: 🩺
learning_voice_ai_agent
Counts: critical=0 · major=0 · minor=36 · total=36
- [minor]
mobile_app/common/kill_switch.py:58— Emoji in code: 📱 - [minor]
mobile_app/common/kill_switch.py:66— Emoji in code: 🛑 - [minor]
scripts/test_stress.py:46— Emoji in code: 🏋 - [minor]
scripts/test_stress.py:110— Emoji in code: 📊 - [minor]
scripts/test_security.py:136— Emoji in code: 🔒 - [minor]
scripts/test_security.py:140— Emoji in code: 🔑 - [minor]
scripts/test_security.py:148— Emoji in code: 📝 - [minor]
scripts/test_security.py:156— Emoji in code: 📁 - [minor]
scripts/test_security.py:163— Emoji in code: 💥 - [minor]
scripts/test_security.py:176— Emoji in code: 🔐 - [minor]
scripts/churn-alert.ts:205— Emoji in code: 📊 - [minor]
scripts/churn-alert.ts:238— Emoji in code: 🔍 - [minor]
scripts/test_multi_app_paste.py:75— Emoji in code: 🧪 - [minor]
scripts/test_multi_app_paste.py:92— Emoji in code: 📋 - [minor]
scripts/prove_kill_switch.py:97— Emoji in code: 🔌 - [minor]
scripts/prove_kill_switch.py:108— Emoji in code: 📖 - [minor]
scripts/prove_kill_switch.py:119— Emoji in code: 🔴 - [minor]
scripts/test_ui_crossplatform.py:42— Emoji in code: 🖥 - [minor]
scripts/test_ui_crossplatform.py:46— Emoji in code: 🪟 - [minor]
scripts/test_ui_crossplatform.py:60— Emoji in code: 🎯 - [minor]
scripts/test_ui_crossplatform.py:96— Emoji in code: 🎨 - [minor]
scripts/test_ui_crossplatform.py:126— Emoji in code: 🔧 - [minor]
scripts/prove_cosmos_rw.py:92— Emoji in code: 📖 - [minor]
scripts/prove_cosmos_rw.py:100— Emoji in code: 🗑 - [minor]
scripts/prove_cosmos_rw.py:111— Emoji in code: 🔬 - [minor]
scripts/test_accessibility.py:45— Emoji in code: 📢 - [minor]
scripts/test_accessibility.py:57— Emoji in code: 🎨 - [minor]
scripts/test_accessibility.py:80— Emoji in code: 🎯 - [minor]
scripts/test_accessibility.py:92— Emoji in code: 🪟 - [minor]
scripts/test_accessibility.py:102— Emoji in code: 🔊 - [minor]
scripts/test_accessibility.py:113— Emoji in code: 📏 - [minor]
assets/generate-store-assets.py:165— Emoji in code: 📱 - [minor]
assets/generate-store-assets.py:581— Emoji in code: 📸 - [minor]
assets/generate-store-assets.py:623— Emoji in code: 🎨 - [minor]
assets/generate-store-assets.py:670— Emoji in code: 💫 - [minor]
assets/generate-store-assets.py:731— Emoji in code: 📁
learning_multimodal_memory_agents
Counts: critical=0 · major=0 · minor=17 · total=17
- [minor]
backend/src/modules/brains/repository.ts:30— any type: const decrypted = await getEncryptor().decrypt(doc.rolePrompt as any, { - [minor]
backend/src/modules/reflections/repository.ts:28— any type: const decrypted = await enc.decrypt(val as any, { userId, context }); - [minor]
backend/src/modules/reflections/repository.ts:36— any type: result.repeatedThemes = await encryptStringArray(result.repeatedThemes, uid, ' - [minor]
backend/src/modules/reflections/repository.ts:37— any type: result.postponedItems = await encryptStringArray(result.postponedItems, uid, ' - [minor]
backend/src/modules/reflections/repository.ts:38— any type: result.roleImbalanceSignals = await encryptStringArray(result.roleImbalanceSig - [minor]
backend/src/modules/reflections/repository.ts:39— any type: result.suggestedAdjustments = await encryptStringArray(result.suggestedAdjustm - [minor]
backend/src/modules/reflections/repository.ts:61— any type: const decrypted = await enc.decrypt(result.vsLastWeek!.summary as any, { use - [minor]
backend/src/modules/memory/repository.ts:42— any type: const decrypted = await enc.decrypt(result.rawContent as any, ctx); - [minor]
backend/src/modules/memory/repository.ts:47— any type: const decrypted = await enc.decrypt(result.triageResult.summary as any, { .. - [minor]
backend/src/modules/palace/repository.ts:59— any type: const decrypted = await getEncryptor().decrypt(doc.content as any, { - [minor]
backend/src/modules/daily-briefs/repository.ts:29— any type: result.priorityItems = encrypted as any; - [minor]
backend/src/modules/daily-briefs/repository.ts:34— any type: result.brainSummaries = encrypted as any; - [minor]
backend/src/modules/daily-briefs/repository.ts:56— any type: result.greeting = await enc.decrypt(result.greeting as any, ctx); - [minor]
backend/src/modules/daily-briefs/repository.ts:60— any type: const decrypted = await enc.decrypt(result.priorityItems as any, { ...ctx, c - [minor]
backend/src/modules/daily-briefs/repository.ts:65— any type: const decrypted = await enc.decrypt(result.brainSummaries as any, { ...ctx, - [minor]
backend/src/modules/daily-briefs/repository.ts:70— any type: result.streakMessage = await enc.decrypt(result.streakMessage as any, { ...c - [minor]
backend/src/modules/daily-briefs/repository.ts:74— any type: result.motivationalQuote = await enc.decrypt(result.motivationalQuote as any
learning_ai_clock
Counts: critical=0 · major=0 · minor=6 · total=6
- [minor]
backend/src/modules/shared-timers/repository.ts:31— any type: const decrypted = await getEncryptor().decrypt(doc.description as any, { - [minor]
backend/src/modules/timers/repository.ts:32— any type: const decrypted = await getEncryptor().decrypt(doc.description as any, { - [minor]
backend/src/modules/routines/repository.ts:49— any type: const decrypted = await enc.decrypt(result.description as any, ctx); - [minor]
backend/src/modules/routines/repository.ts:56— any type: const decrypted = await enc.decrypt(step.notes as any, { ...ctx, context - [minor]
backend/src/modules/webhooks/repository.ts:46— any type: const decrypted = await enc.decrypt(result.secret as any, ctx); - [minor]
backend/src/modules/webhooks/repository.ts:51— any type: const decrypted = await enc.decrypt(result.description as any, { ...ctx, con
learning_ai_fastgap
✅ No violations found.
learning_ai_jarvis_jr
✅ No violations found.
learning_ai_peakpulse
Counts: critical=0 · major=0 · minor=1 · total=1
- [minor]
backend/src/modules/peak-sessions/repository.ts:31— any type: const decrypted = await getEncryptor().decrypt(doc.notes as any, {
learning_ai_notes
Counts: critical=0 · major=0 · minor=2 · total=2
- [minor]
web/src/app/(app)/workspaces/page.tsx:198— any type: owner:any - [minor]
web/src/app/(app)/workspaces/page.tsx:199— any type: visibility:any
learning_ai_flowmonk
Counts: critical=0 · major=0 · minor=2 · total=2
- [minor]
web/src/app/(app)/tasks/page.tsx:153— any type: { value: '', label: 'Energy: any' }, - [minor]
backend/src/modules/tasks/repository.ts:28— any type: const decrypted = await getEncryptor().decrypt(task.description as any, {
learning_ai_trails
✅ No violations found.
learning_ai_local_memory_gpt
✅ No violations found.
learning_ai_efforise
Counts: critical=0 · major=0 · minor=4 · total=4
- [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;
learning_ai_local_llms
✅ No violations found.
learning_ai_talk2obsidian
✅ No violations found.
learning_ai_smart_auth
✅ No violations found.
learning_ai_auth_app
✅ No violations found.
learning_ai_productivity_web
✅ No violations found.
oss/learning_ai_claw-cowork
Counts: critical=0 · major=0 · minor=2 · total=2
- [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,
learning_ai_mac_tooling
✅ No violations found.
Ecosystem totals by rule
| Rule | Total findings |
|---|---|
b7-emoji-in-code |
53 |
ts-any-type |
35 |
Grand total: 88 findings across 19 repos.