- Add resize functionality to all controls with hover-only visibility - Replace heading tags with control-title CSS class to prevent content confusion - Implement small circle resize handles positioned in lower-right corner - Add header-only toggle mode for space-efficient control management - Create independent IndexedDB-based debug system with selection filtering - Fix green button backgrounds in debug control (use neutral grey) - Add hover behavior for clean interface (resize handle and close button) - Support document structure scanning for targeted debugging - Enable drag positioning with 16-point compass system - Add persistent storage for debug messages across browser sessions 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
7.1 KiB
ADR-001: Client-Side Debug Storage Technology
Status
Accepted - 2025-11-10
Context
The Markitect application requires a robust client-side debugging infrastructure to track and display debug messages during document editing operations. The previous implementation relied on a tightly-coupled debug panel that expected specific DOM elements and was integrated into old dialog systems.
Requirements
- Independence: Debug system must be independent of specific UI components
- Persistence: Debug messages should survive browser refresh/close
- Real-time Updates: UI should reflect new messages immediately
- Performance: Should not block the main thread or impact editor performance
- Storage Capacity: Must handle 1000+ debug messages efficiently
- Browser Compatibility: Work across all modern browsers
- Developer Experience: Easy to integrate and use throughout the codebase
Problem Statement
The existing debug infrastructure was failing because:
- Tight coupling to specific DOM elements (
debug-messages-container,toggle-debug) - Dependency on old dialog systems
- No persistence across browser sessions
- Limited to in-memory storage only
Decision
We will use IndexedDB as the primary client-side storage technology for the debug system.
Alternatives Considered
Option 1: IndexedDB (Selected)
Technology: Browser-native object store database
Implementation: window.MarkitectDebugSystem with async operations
Option 2: SQLite via SQL.js
Technology: WebAssembly-based SQLite implementation Implementation: SQL.js library with manual persistence
Option 3: LocalStorage
Technology: Browser key-value storage Implementation: JSON serialization with size limits
Option 4: In-Memory Only
Technology: JavaScript arrays with no persistence Implementation: Simple message array management
Decision Matrix
| Criteria | IndexedDB | SQLite | LocalStorage | In-Memory |
|---|---|---|---|---|
| Storage Capacity | ✅ Large (50-100MB+) | ✅ Large | ❌ Limited (5-10MB) | ❌ Session only |
| Performance | ✅ Async/Non-blocking | ⚠️ Can block UI | ✅ Fast | ✅ Fastest |
| Persistence | ✅ Across sessions | ✅ Across sessions | ✅ Across sessions | ❌ Lost on refresh |
| Query Capabilities | ⚠️ Limited | ✅ Full SQL | ❌ None | ❌ JavaScript only |
| Dependencies | ✅ Native | ❌ 1.5MB WebAssembly | ✅ Native | ✅ Native |
| Browser Support | ✅ Universal modern | ✅ Universal | ✅ Universal | ✅ Universal |
| API Complexity | ⚠️ Moderate | ✅ Familiar SQL | ✅ Simple | ✅ Simple |
| Use Case Fit | ✅ Perfect match | ⚠️ Overkill | ❌ Too limited | ❌ Insufficient |
Rationale
Why IndexedDB?
- Native Browser Support: No external dependencies or WebAssembly files
- Asynchronous Operations: Won't block the UI thread during debug operations
- Sufficient Storage: 50-100MB+ capacity easily handles thousands of debug messages
- Appropriate Complexity: Matches our simple data model without over-engineering
- Performance Optimized: Browsers optimize IndexedDB for web applications
- Security: Runs within browser's security sandbox with proper origin isolation
Why Not SQLite?
While SQLite offers powerful querying capabilities, it's overkill for our use case:
- Complexity: Our data model is simple (timestamp, category, message)
- Dependencies: 1.5MB WebAssembly adds significant overhead
- Synchronous Risk: Large operations can block the UI thread
- Manual Persistence: Requires explicit save/load operations
- Over-Engineering: We don't need JOINs, complex queries, or relational features
Why Not LocalStorage?
LocalStorage is too limited:
- Size Constraints: 5-10MB limit insufficient for extensive debug logs
- Synchronous API: Blocks main thread during operations
- No Structured Data: JSON serialization/deserialization overhead
- Browser Quotas: Can be evicted under storage pressure
Why Not In-Memory?
In-memory storage is insufficient:
- No Persistence: Debug context lost on page refresh
- Memory Pressure: Large debug logs consume RAM
- Development Workflow: Debugging often requires page reloads
Implementation Details
Data Structure
{
id: auto_increment_id,
message: "Debug message text",
category: "INFO" | "WARNING" | "ERROR" | "SUCCESS" | "DEBUG",
timestamp: "2025-11-10T23:35:53.123Z",
displayTime: "11:35:53 PM"
}
Database Schema
- Store Name:
messages - Key Path:
id(auto-increment) - Indexes:
timestamp,category - Version: 1
API Design
// Core operations
await MarkitectDebugSystem.addMessage(message, category);
await MarkitectDebugSystem.clearMessages();
const messages = MarkitectDebugSystem.getMessages(category, limit);
// Advanced features
const unsubscribe = MarkitectDebugSystem.subscribe(callback);
const json = MarkitectDebugSystem.exportMessages();
Consequences
Positive
- ✅ Zero Dependencies: No external libraries required
- ✅ High Performance: Non-blocking operations maintain UI responsiveness
- ✅ Persistent Debugging: Debug context preserved across browser sessions
- ✅ Scalable Storage: Handles thousands of debug messages efficiently
- ✅ Future-Proof: Can add advanced features without architectural changes
- ✅ Developer-Friendly: Simple API integration throughout codebase
Negative
- ⚠️ Limited Querying: Complex filtering requires custom JavaScript code
- ⚠️ Browser Variations: Subtle differences in IndexedDB implementations
- ⚠️ Learning Curve: Developers may be less familiar with IndexedDB vs SQL
Mitigation Strategies
- Query Limitations: Implement helper methods for common filtering operations
- Browser Compatibility: Use feature detection with graceful fallbacks
- Developer Experience: Provide clear API documentation and examples
Future Considerations
Potential Enhancements
- Hybrid Approach: Add optional SQLite mode for advanced users
- Data Export: Multiple export formats (JSON, CSV, SQL dumps)
- Advanced Filtering: Web Workers for complex query operations
- Data Visualization: Charts and analytics for debug patterns
- Remote Sync: Optional sync to development servers
Migration Path
The current IndexedDB implementation provides a foundation that could support:
- Adding SQLite as an "advanced mode" option
- Implementing data export to external analysis tools
- Building analytics dashboards on top of the debug data
References
Approval
Decided by: Claude Code Development Team Date: 2025-11-10 Context: Independent debug system redesign Next Review: When complex querying requirements emerge