- Upgraded Rust base image from 1.75 to 1.81 in client.Dockerfile
- Replaced python -m pip with uv pip for NER dependency installation in server.Dockerfile
- Updated spaCy model download and verification commands to use uv run python
- Added bind mount for .venv directory in devcontainer to persist Python virtual environment across container rebuilds
- Enabled updateRemoteUserUID for proper file permissions in devcontainer
- Normalized peer dependency flags in package-lock.json (removed inconsistent "peer": true from core dependencies, added to test-only dependencies)
- Added empty codex file placeholder
- Created comprehensive
- Moved sprint-15-platform-hardening (README.md, RESILIENCE_TEST_PLAN.md) to docs/sprints/.archive
- Moved sprint-16-identity-foundation (README.md) to docs/sprints/.archive
- Moved sprint-17-custom-oauth (README.md) to docs/sprints/.archive
- Moved sprint-18-projects (README.md, CLOSEOUT.md) to docs/sprints/.archive
- Added "peer": true to multiple dependencies in package-lock.json to ensure compatibility with peer dependencies.
- Introduced a new Cargo configuration file to address Windows linker issues, specifying the use of the MSVC linker.
- Introduced constants for maximum session audio buffer size and samples to improve memory management during recordings.
- Refactored audio buffer handling to utilize `VecDeque` for efficient memory usage and added logic to cap buffer size.
- Implemented a new function to append audio chunks to a file, ensuring proper handling of audio data during recording sessions.
- Updated various recording and playback functions to utilize the new buffer management and file writing logic, improving overall performance and reliability.
- Added tests to validate the new audio buffer behavior and ensure correct functionality under long recording scenarios.
- Removed pages.md containing frontend code review findings (Analytics pie chart key bug, fire-and-forget error handling, export logic duplication, preferences refresh hack)
- Review findings have been addressed in prior commits or are no longer relevant to current codebase state
- Keeps .claudectx focused on active architectural documentation (AGENTS.md for Python backend, codefixes.md for Tauri backend)
feat: add drift compensation system for synchronized audio capture with EMA-based detection and resampling
- Added DriftDetector using exponential moving average and linear regression to calculate clock drift in ppm between primary/secondary audio sources
- Implemented DriftMetrics for tracking overflow counts, adjustment counts, and throttled logging to prevent log spam
- Created DriftCompensator with rubato-based resampling to apply dynamic ratio adjustments when drift exceeds threshold
- Added comprehensive
- Added server-gpu and full-gpu Docker Compose profiles with NVIDIA CUDA support for GPU-accelerated inference
- Created server-gpu.Dockerfile with PyTorch CUDA base image and GPU runtime configuration
- Added compose.gpu.yaml for optional GPU allocation customization (device count, IDs, memory settings)
- Documented GPU setup requirements for Linux (nvidia-container-toolkit), Windows WSL2, and macOS in docker/CLAUDE
- Added initializePromise singleton to prevent concurrent API initialization attempts and ensure single initialization
- Wrapped initializeAPI logic in IIFE that caches promise and clears on error for retry capability
- Replaced all initializeAPI() calls with synchronous getAPI() in hooks (useAudioDevices, useDiarization, usePostProcessing, useRecordingAppPolicy)
- Updated corresponding test mocks from
- Replaced structlog.dev.ConsoleRenderer with RichHandler for richer terminal output with clickable paths, time formatting, and keyword highlighting
- Added _render_for_rich_handler processor to output minimal event + context, avoiding duplication with RichHandler's built-in decorations
- Introduced module-level _rich_console for consistent stderr output and terminal detection across all Rich components
- Added _
- Added normalizeProjectId and normalizeProjectIds functions to filter out default/empty project IDs before sending to backend
- Applied normalization to setActiveProject, createMeeting, and listMeetings API calls
- Added AssertionError to caught exceptions in streaming diarization and session chunk processing
- Updated repomix config to focus on src/noteflow/infrastructure directory
- Added mock_torch_minimal fixture to
- Added 500ms debounce to persistPreferencesToTauri to batch rapid changes (e.g., typing) into single disk writes
- Extracted _persistPreferencesImpl as internal implementation, with public function handling debounce logic
- Fixed diarization SlidingWindow configuration to use per-sample duration instead of chunk duration, resolving frames/weights mismatch warnings
- Added DEFAULT_PROJECT_ID constant and update
- Added change detection in audio device preference updates to skip redundant disk writes when values haven't changed
- Implemented PartialEq for AudioDevicePrefs to enable equality comparison
- Reduced logging verbosity: changed get_preferences and persist_preferences_to_disk from info to trace/debug, and gRPC identity interceptor from debug to trace
- Fixed ProjectProvider oscillation loop by using ref
refactor: extract ASR configuration management into focused manager classes
- Split AsrConfigService into three focused components for better separation of concerns:
- AsrEngineManager: handles engine lifecycle, model loading, and capability detection
- AsrJobManager: manages job tracking, status updates, and shutdown cleanup
- AsrConfigService: orchestrates configuration changes using the managers
- Moved engine creation, validation, and persistence logic to AsrEngineManager
- Moved job registration
- Introduced memory snapshot logging to track resource usage during summarization and diarization processes.
- Added action item extraction capabilities from meeting segments, improving the summarization output.
- Refactored summarization and diarization mixins to integrate new logging and extraction functionalities.
- Implemented a bounded audio buffer for streaming diarization to manage memory efficiently.
- Enhanced error handling and diagnostics in summarization and diarization workflows.
- Moved all hookify configuration files from `.claude/` to `.claude/hooks/` subdirectory for better organization
- Added four new blocking hooks to prevent common error handling anti-patterns:
- `block-broad-exception-handler`: Prevents catching generic `Exception` with only logging
- `block-datetime-now-fallback`: Blocks returning `datetime.now()` as fallback on parse failures to prevent data corruption
- `block-default
- Integrated memory snapshot logging throughout the summarization and diarization processes to improve diagnostics and performance tracking.
- Added action item extraction capabilities from meeting segments, utilizing predefined keywords to identify actionable tasks.
- Refactored summarization generation to ensure cloud provider registration is handled dynamically based on application configuration.
- Introduced a new audio buffer class for managing streaming audio data in the diarization process, enhancing memory management and performance.
- Updated various mixins to incorporate model status logging for better observability during processing stages.
- Changed `repomix.config.json` to disable comment removal, empty line removal, and compression, while enabling Base64 truncation.
- Updated the include paths to add a new "tests/" directory.
- Enhanced the `ExportAISection` tests by refining mock implementations and adding new test cases for export settings, template presets, and UI elements.
- Improved the `useAsyncData` hook to store success and error callbacks in refs to prevent unnecessary re-fetching.
- Adjusted timer handling in `useAsrConfig` tests for better accuracy and reliability.
- Added new mock implementations in `RecordingPage` tests to ensure proper state management during rendering.
- Introduced `profile_comprehensive.py` for detailed performance analysis of the NoteFlow backend, covering audio processing, ORM conversions, Protobuf operations, async overhead, and gRPC simulations.
- Implemented options for cProfile, verbose output, and memory profiling to enhance profiling capabilities.
- Updated `asr_config_service.py` to improve engine reference handling and added observability tracing during reconfiguration.
- Enhanced gRPC service shutdown procedures to include cancellation of sync tasks and improved lifecycle management.
- Refactored various components to ensure proper cleanup and resource management during shutdown.
- Updated client submodule to the latest commit for improved integration.
- Introduced logging for CRUD operations in repositories to enhance visibility into database interactions.
- Implemented timing logs for BaseRepository and UnitOfWork lifecycle events to track performance.
- Added export logging for size and duration without exposing sensitive content.
- Promoted logging levels for specific operations to improve clarity and reduce noise in logs.
- Established a framework for consistent logging practices across persistence and export functionalities.
- Added `asr_config_persistence.py` to handle ASR configuration preferences, including methods for building and resolving preferences.
- Updated `AsrConfigService` to include an asynchronous callback for persisting ASR configuration after reconfiguration.
- Introduced new constants for ASR settings in `constants` modules to improve clarity and maintainability.
- Enhanced gRPC service to load persisted ASR configuration on startup, ensuring consistent behavior across sessions.
- Refactored related components to utilize the new ASR configuration management features.