[frontend] Global state pollution: 575+ window.* assignments across JS modules #795

Open
opened 2026-06-03 00:41:08 +02:00 by sleepy · 0 comments
Owner

Finding

Frontend JS assigns to window.* properties 575+ times across all files. Top polluted namespaces:

Module window.* count
sessionsModule 57
chatModule 46
modelsModule 30
documentModule 26
uiModule 12
groupModule 11
adminModule 10
compareModule 9

These are module objects exported to window for cross-module access, creating a de facto global dependency graph.

Impact

  • No encapsulation — any module can read/write any other module's state
  • Order-dependent initialization: if modelsModule is accessed before it's assigned, undefined errors result
  • Makes testing extremely difficult — cannot mock individual modules without polluting global scope
  • Violates AGENTS.md: "Features communicate through narrow, typed interfaces"

Recommendation

  1. Use ES module imports (import/export) exclusively — already partially in use
  2. Create a lightweight event bus or dependency injection container for cross-module communication
  3. Remove all window.* assignments once proper imports are in place
## Finding Frontend JS assigns to `window.*` properties **575+ times** across all files. Top polluted namespaces: | Module | window.* count | |--------|---------------| | sessionsModule | 57 | | chatModule | 46 | | modelsModule | 30 | | documentModule | 26 | | uiModule | 12 | | groupModule | 11 | | adminModule | 10 | | compareModule | 9 | These are module objects exported to `window` for cross-module access, creating a de facto global dependency graph. ## Impact - No encapsulation — any module can read/write any other module's state - Order-dependent initialization: if `modelsModule` is accessed before it's assigned, undefined errors result - Makes testing extremely difficult — cannot mock individual modules without polluting global scope - Violates AGENTS.md: _"Features communicate through narrow, typed interfaces"_ ## Recommendation 1. Use ES module imports (`import/export`) exclusively — already partially in use 2. Create a lightweight event bus or dependency injection container for cross-module communication 3. Remove all `window.*` assignments once proper imports are in place
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
sleepy/odysseus#795
No description provided.