feat(meeting): finalize meeting management with live config broadcasts#52
feat(meeting): finalize meeting management with live config broadcasts#52aniebietafia wants to merge 1 commit intomainfrom
Conversation
- Enforce active-room constraint for room configuration updates - Integrate WebSocket broadcasting for real-time config sync across participants - Update integration tests to verify broadcast logic and status-based validation - Mark meeting management issue tasks as complete in documentation Signed-off-by: aniebietafia <aniebietafia87@gmail.com>
📝 WalkthroughWalkthroughThis PR comprehensively documents and enhances the FluentMeet application by establishing automated linting (Ruff pre-commit hooks), adding extensive API documentation for all major packages, improving docstrings with Google-style conventions, enhancing signup validation with password confirmation and terms acceptance requirements, and refining login error handling with detailed lockout/attempt information in response payloads. Additionally, old specification documents for implemented features are removed. Changes
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related issues
Possibly related PRs
Suggested labels
Poem
🚥 Pre-merge checks | ✅ 3✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 19
Note
Due to the large number of review comments, Critical, Major severity comments were prioritized as inline comments.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (3)
app/external_services/voiceai/service.py (2)
84-84: 🛠️ Refactor suggestion | 🟠 MajorReplace print() with logger.debug().
Line 84 contains a debug print statement that should use the logger instead for consistency with the existing logging at line 99.
🔍 Proposed fix to use logger
- print(f"Voice.ai Audio format: {audio_format}") + logger.debug("Voice.ai Audio format: %s", audio_format)🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@app/external_services/voiceai/service.py` at line 84, Replace the debug print statement in service.py (print(f"Voice.ai Audio format: {audio_format}")) with the module logger by calling logger.debug and include the audio_format variable; update the line in the same scope where audio_format is defined (same function in app/external_services/voiceai/service.py) so logging is consistent with the existing logger usage elsewhere (e.g., near the line where logger is used at line 99).
98-98: 🛠️ Refactor suggestion | 🟠 MajorReplace print() with logger.debug().
Line 98 duplicates the logging at line 99. Remove this debug print statement.
🔍 Proposed fix to remove duplicate debug output
- print(f"Voice.ai TTS API completed in {elapsed_ms} ms") logger.debug("Voice.ai TTS completed in %.1fms", elapsed_ms)🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@app/external_services/voiceai/service.py` at line 98, The print statement emitting "Voice.ai TTS API completed in {elapsed_ms} ms" should be removed and replaced with a logger.debug call to avoid duplicate stdout output; update the code in app/external_services/voiceai/service.py (inside the function where elapsed_ms is computed) to call logger.debug with that message (use the existing logger instance) instead of print so it matches the subsequent logging line.app/core/rate_limiter.py (1)
17-30:⚠️ Potential issue | 🟡 MinorRemove trailing whitespace on line 25.
Line 25 contains trailing whitespace that violates the project's linting rules.
🧹 Proposed fix
Args: _request (Request): Starlette HTTP request mapping object. - _exc (RateLimitExceeded): Fastapi Limiter exceeded bounds exception + _exc (RateLimitExceeded): Fastapi Limiter exceeded bounds exception tracking model.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@app/core/rate_limiter.py` around lines 17 - 30, Remove the trailing whitespace inside the docstring of the rate_limit_exception_handler function (the line describing RateLimitExceeded in the Args section); edit the docstring so there are no trailing spaces at the end of that line and ensure the docstring lines are trimmed to satisfy linting.
🟡 Minor comments (33)
app/modules/auth/models.py-18-27 (1)
18-27:⚠️ Potential issue | 🟡 MinorRewrite
Userdocstring to fix CI and improve clarity.Line 18 exceeds Ruff limit (
E501), and the current wording is hard to read. Please simplify and wrap lines.Suggested patch
- """Database model tracking all identity, profiles, and state constructs for individuals natively. - - Attributes: - id: Primary UUID. - email: Unique user email address identifying accounts. - hashed_password: Encrypted payload statically parsed securely. - full_name: Standardized user provided string. - is_active: Activation mapping bounding sessions dynamically. - is_verified: Identity validation marker defining login allowance. - """ + """Database model for user identity, profile, and account state. + + Attributes: + id: Primary UUID. + email: Unique account email. + hashed_password: Hashed password. + full_name: Optional display name. + is_active: Whether the account can authenticate. + is_verified: Whether email verification is complete. + """🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@app/modules/auth/models.py` around lines 18 - 27, The User class docstring is one long line that triggers Ruff E501 and is hard to read; rewrite the class-level docstring for User into a concise, multi-line paragraph with wrapped lines and clearer attribute descriptions, e.g., a short summary sentence followed by an "Attributes:" section with each attribute on its own wrapped line (id, email, hashed_password, full_name, is_active, is_verified) using plain language; update the docstring in the User class in app/modules/auth/models.py to replace the current long docstring with the wrapped, simplified version.app/modules/meeting/schemas.py-3-6 (1)
3-6:⚠️ Potential issue | 🟡 MinorFix duplicate module string and Ruff line-length failure.
This adds a second top-level string (not a module docstring) and currently fails CI on Line 5 (
E501). Merge this text into the primary module docstring and wrap to <=88 chars.Suggested patch
-"""Meeting Pydantic schemas module. - -Strictly defines JSON constraints validating bounding API requests automatically natively. -""" +"""Pydantic schemas for the meeting feature package. + +Meeting request/response schemas used to validate API payloads. +"""🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@app/modules/meeting/schemas.py` around lines 3 - 6, The file contains a duplicate top-level string (a second module string) causing a Ruff E501 line-length error; open app/modules/meeting/schemas.py and merge the second string into the existing module docstring so there is only one docstring at the top of the module, reflowing its contents to lines <= 88 characters, and remove the extra standalone string literal so the module has a single properly wrapped docstring.app/schemas/pipeline.py-43-43 (1)
43-43:⚠️ Potential issue | 🟡 MinorFix line-length violation.
Line 43 exceeds the 88-character limit.
📏 Proposed fix for line-length violation
- audio_data: Base64-encoded raw audio bytes manually structured natively smoothly. + audio_data: Base64-encoded raw audio bytes.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@app/schemas/pipeline.py` at line 43, The doc/comment for the schema field audio_data in app/schemas/pipeline.py exceeds the 88-character line limit; shorten or reflow the description so each line is ≤88 chars (for example split the phrase into two sentences or use a shorter wording like "Base64-encoded raw audio bytes" and move additional detail to the next line). Locate the audio_data field/description in the schema and update the text accordingly to eliminate the long line while preserving its meaning.app/modules/auth/oauth_google.py-59-59 (1)
59-59:⚠️ Potential issue | 🟡 MinorFix line-length violation.
Line 59 exceeds the 88-character limit (89 characters).
📏 Proposed fix
- code (str): Time-sensitive exchange code provided by Google callback queries. + code (str): Authorization code from Google's OAuth callback.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@app/modules/auth/oauth_google.py` at line 59, Shorten the docstring parameter description for "code (str)" to meet the 88-character limit; update the line in the oauth_google.py docstring (the "code (str): Time-sensitive exchange code provided by Google callback queries." entry) to a more concise phrasing such as "code (str): Time-sensitive exchange code from Google callback." so the line length is <=88 characters while preserving meaning.app/external_services/deepl/api-docs.md-40-40 (1)
40-40:⚠️ Potential issue | 🟡 MinorFix heading level increment.
The heading jumps from h2 (##) to h4 (####), skipping h3. Headings should only increment by one level at a time.
📝 Proposed fix
-#### `translate(text, source_language, target_language)` +### `translate(text, source_language, target_language)`🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@app/external_services/deepl/api-docs.md` at line 40, The section heading "translate(text, source_language, target_language)" is using h4 (####) while the previous section is h2, so update the heading to the next level (h3) to preserve proper incremental heading structure; locate the heading line with "#### `translate(text, source_language, target_language)`" and change the leading hashes to "###" so headings only increase by one level.app/modules/auth/oauth_google.py-19-19 (1)
19-19:⚠️ Potential issue | 🟡 MinorFix line-length violation.
Line 19 exceeds the 88-character limit (94 characters).
📏 Proposed fix
- """Oauth2 Proxy wrapping OpenID Connect callbacks dynamically against Google environments. + """OAuth2 service for Google OpenID Connect integration.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@app/modules/auth/oauth_google.py` at line 19, The module-level docstring in oauth_google.py (the Oauth2 Proxy description) has a line exceeding 88 characters; break the long docstring line into shorter lines under 88 characters (for example split after "callbacks" into two lines) so the module docstring for oauth_google.py fits the style guide while preserving the same wording and meaning.app/external_services/openai_tts/service.py-48-49 (1)
48-49:⚠️ Potential issue | 🟡 MinorFix line-length violations.
Both lines exceed the 88-character limit enforced by Ruff.
📏 Proposed fix for line-length violations
- voice (str | None): OpenAI voice ID (alloy, echo, fable, onyx, nova, shimmer). Defaults to None. - encoding (str): Output encoding (``linear16`` or ``opus``). Defaults to "linear16". + voice (str | None): OpenAI voice ID (alloy, echo, fable, onyx, + nova, shimmer). Defaults to None. + encoding (str): Output encoding (``linear16`` or ``opus``). + Defaults to "linear16".🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@app/external_services/openai_tts/service.py` around lines 48 - 49, The docstring parameter lines for voice and encoding in the OpenAI TTS service exceed the 88-character Ruff limit; edit the docstring (the parameter entries for "voice" and "encoding") to wrap each description to multiple shorter lines (or break the long voice list onto its own indented line) so no line exceeds 88 characters, preserving the existing docstring style/indentation and keeping the parameter names "voice" and "encoding" intact for clarity.app/modules/auth/oauth_google.py-39-39 (1)
39-39:⚠️ Potential issue | 🟡 MinorFix line-length violation.
Line 39 exceeds the 88-character limit (90 characters).
📏 Proposed fix
- state (str): Unique cryptographic state proxying tokens mitigating CSRF risks. + state (str): Unique cryptographic state token for CSRF protection.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@app/modules/auth/oauth_google.py` at line 39, The docstring for the parameter "state" is over the 88-character line limit; shorten or rephrase it in the oauth_google.py docstring (the "state (str): ..." parameter description) so it fits under 88 chars — for example, change to a more concise phrase like "state (str): Unique cryptographic state used to proxy tokens and mitigate CSRF risks." or break the description into two shorter lines to comply with the style limit.app/modules/auth/oauth_google.py-24-24 (1)
24-24:⚠️ Potential issue | 🟡 MinorFix line-length violation.
Line 24 exceeds the 88-character limit (93 characters).
📏 Proposed fix
- redirect_uri (str): Allowed Oauth 2.0 callback destination natively tracked securely. + redirect_uri (str): Allowed OAuth 2.0 callback destination URL.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@app/modules/auth/oauth_google.py` at line 24, The docstring line describing the redirect_uri parameter is over the 88-char limit; shorten or reflow it so each line is <=88 chars—e.g., split the sentence into two lines or rephrase to something like "redirect_uri (str): Oauth 2.0 callback destination tracked securely." Ensure the change is made in the docstring where redirect_uri is documented so the identifier remains unchanged.app/modules/auth/oauth_google.py-42-42 (1)
42-42:⚠️ Potential issue | 🟡 MinorFix line-length violation.
Line 42 exceeds the 88-character limit (99 characters).
📏 Proposed fix
- str: Absolute https URI routing user browsers natively to Google Consent architectures. + str: Absolute HTTPS URI for Google's OAuth consent screen.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@app/modules/auth/oauth_google.py` at line 42, Shorten or wrap the overlong docstring/comment string on line "str: Absolute https URI routing user browsers natively to Google Consent architectures." so it stays within the 88-character limit; edit the string in app/modules/auth/oauth_google.py by rephrasing into a shorter sentence or splitting it into multiple adjacent string literals (or separate lines in the docstring) while preserving the same meaning and punctuation.app/external_services/voiceai/service.py-52-54 (1)
52-54:⚠️ Potential issue | 🟡 MinorFix line-length violations.
Both lines exceed the 88-character limit.
📏 Proposed fix for line-length violations
- language (str): ISO 639-1 language code for voice selection. Defaults to "en". + language (str): ISO 639-1 language code for voice selection. + Defaults to "en". voice_id (str | None): Optional Voice.ai voice ID. Uses default if omitted. - encoding (str): Output encoding (``linear16`` or ``opus``). Defaults to "linear16". + encoding (str): Output encoding (``linear16`` or ``opus``). + Defaults to "linear16".🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@app/external_services/voiceai/service.py` around lines 52 - 54, Shorten the long docstring parameter lines in app/external_services/voiceai/service.py to respect the 88-character limit: split or rewrap the descriptions for the parameters language, voice_id and encoding (the block containing "language (str): ...", "voice_id (str | None): ...", and "encoding (str): ...") into multiple shorter lines or sentences while preserving the same content, types and default values and keeping the surrounding docstring style in the function/class where this docstring lives.app/external_services/voiceai/api-docs.md-54-54 (1)
54-54:⚠️ Potential issue | 🟡 MinorFix API-doc symbol/behavior wording to match
service.py.Line 63 names
_synthesize, but the implementation usessynthesize. Also, Line 54 should describe exception propagation (raise_for_status) rather than implying routing happens in this method.📝 Proposed doc correction
-* **Exception Behavior:** Immediately traps non-200 configurations routing `httpx.HTTPStatusError` directly to Kafka Retry protocols. +* **Exception Behavior:** Calls `response.raise_for_status()`; non-2xx responses raise `httpx.HTTPStatusError` for upstream retry/DLQ handling. -* **Model Adjustments:** Voice.ai tracks multiple models explicitly. If `VOICEAI_TTS_MODEL` is set to `"multilingual-something"`, but the detected/passed `language` is purely `"en"`, the `_synthesize` module inherently edits the parameter dictionary replacing `.replace("multilingual-", "")` resolving natively to a faster specialized english model automatically. +* **Model Adjustments:** Voice.ai tracks multiple models explicitly. If `VOICEAI_TTS_MODEL` is set to `"multilingual-something"` but `language` is `"en"`, the `synthesize` method adjusts the payload model via `.replace("multilingual-", "")` to use the English-optimized variant.Also applies to: 63-63
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@app/external_services/voiceai/api-docs.md` at line 54, The docs wrongly reference _synthesize and imply this function routes non-200 responses to Kafka; update the API doc to match service.py by renaming the symbol to synthesize and change the exception wording to state that the method calls response.raise_for_status() so HTTPStatusError is raised (propagated) rather than being routed here; ensure the doc line that currently reads about “traps … routing httpx.HTTPStatusError directly to Kafka Retry protocols” is replaced with language that the method will call raise_for_status and let the HTTPStatusError propagate to the caller/retry mechanism.app/core/sanitize.py-1-5 (1)
1-5:⚠️ Potential issue | 🟡 MinorFormatting fix needed to clear CI (Black + Ruff W291).
Line 3 contains trailing whitespace, and this file is currently failing formatting checks.
🧹 Minimal fix
-Automatically replaces control characters and dynamically truncates values +Automatically replaces control characters and dynamically truncates values🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@app/core/sanitize.py` around lines 1 - 5, Remove the trailing whitespace in the module docstring of sanitize.py (the third line of the top-level string) so the file passes Black/Ruff W291; update the docstring to have no trailing spaces and re-run formatting (Black/ruff) to ensure no other formatting issues remain.app/modules/meeting/models.py-19-31 (1)
19-31:⚠️ Potential issue | 🟡 MinorDocstrings currently misdescribe model fields and types.
For example, Line 30 describes
settingsas a JSON array, but the model type isdict[str, Any]. Multiple attribute descriptions are similarly unclear, which makes the ORM contract harder to trust.Also applies to: 63-74
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@app/modules/meeting/models.py` around lines 19 - 31, The model docstring misstates several field types and should be corrected: update the docstring that describes id, room_code, host_id, name, status, scheduled_at, created_at, ended_at, and settings so each entry matches the actual ORM types (id: UUID, room_code: str, host_id: UUID foreign key, name: str, status: RoomStatus enum, scheduled_at: Optional[datetime], created_at: datetime, ended_at: Optional[datetime], settings: dict[str, Any]) and use precise, brief descriptions (e.g., "settings: dict[str, Any] containing keys like 'lock_room' and 'max_participants'") and apply the same fixes to the second attributes docstring block covering the later attributes.app/core/exception_handlers.py-106-112 (1)
106-112:⚠️ Potential issue | 🟡 MinorRemove trailing whitespace on line 110.
Line 110 contains trailing whitespace that violates the project's linting rules.
🧹 Proposed fix
Args: - app (FastAPI): The main application context container natively + app (FastAPI): The main application context container natively targeting startup hooks framework.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@app/core/exception_handlers.py` around lines 106 - 112, The docstring for register_exception_handlers contains trailing whitespace in the "Args:" block; remove the trailing space characters (e.g., after "container natively" or at the end of that docstring line) so the docstring lines have no trailing whitespace, then save and re-run the project's linter/formatter to confirm the fix; target the register_exception_handlers function's docstring when making the edit.app/schemas/api-docs.md-36-53 (1)
36-53:⚠️ Potential issue | 🟡 MinorAdd language identifier to the fenced code block.
The fenced code block containing the ASCII diagram should specify a language identifier to satisfy markdownlint. Use
textfor ASCII art.📝 Proposed fix
-``` +```text [ WebSocket Client (Binary) ] │🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@app/schemas/api-docs.md` around lines 36 - 53, The fenced ASCII diagram block in app/schemas/api-docs.md is missing a language identifier which triggers markdownlint; update the opening fence for the diagram (the triple backticks that start the ASCII art block) to include the language identifier "text" so it becomes ```text, leaving the diagram content unchanged and keeping the closing triple backticks as-is.app/core/exception_handlers.py-41-50 (1)
41-50:⚠️ Potential issue | 🟡 MinorRemove trailing whitespace on line 48.
Line 48 contains trailing whitespace that violates the project's linting rules.
🧹 Proposed fix
Returns: - JSONResponse: HTTP 400 error dynamically defining all Pydantic field + JSONResponse: HTTP 400 error dynamically defining all Pydantic field failures natively.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@app/core/exception_handlers.py` around lines 41 - 50, Remove the trailing whitespace present in the docstring for the "Handler for Pydantic validation errors (422 -> 400)" block in app/core/exception_handlers.py; edit the docstring line that currently ends with an extra space so it has no trailing spaces to satisfy the linter (the docstring containing "JSONResponse: HTTP 400 error dynamically defining all Pydantic field" should be trimmed).app/core/exception_handlers.py-88-97 (1)
88-97:⚠️ Potential issue | 🟡 MinorRemove trailing whitespace on line 95.
Line 95 contains trailing whitespace that violates the project's linting rules.
🧹 Proposed fix
Returns: - JSONResponse: Protected HTTP 500 entity guarding system stacktraces + JSONResponse: Protected HTTP 500 entity guarding system stacktraces from external clients statically.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@app/core/exception_handlers.py` around lines 88 - 97, Remove the trailing whitespace in the docstring for the "Handler for all other unhandled exceptions (500)" (the 500 error handler) — edit the docstring text containing "Protected HTTP 500 entity guarding system stacktraces from external clients statically." to delete the stray space at the end of the offending line so the file no longer contains trailing whitespace.app/services/tts_worker.py-51-56 (1)
51-56:⚠️ Potential issue | 🟡 MinorFix line length violation on line 55.
Line 55 exceeds the project's 88-character limit (95 characters).
📏 Proposed fix to wrap the line
"""Process a translation: synthesize audio → publish. Args: - event (BaseEvent[Any]): The deserialized wrapper containing the TranslationPayload. + event (BaseEvent[Any]): The deserialized wrapper containing the + TranslationPayload. """🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@app/services/tts_worker.py` around lines 51 - 56, The docstring for the async def handle function has a line that exceeds the 88-char limit; split the long Args description for the event parameter into multiple wrapped lines so no line exceeds 88 chars. Update the docstring under handle (the "Args:" block for event (BaseEvent[Any])) to break the sentence across lines with proper indentation/continuation indentation so it stays within the line-length limit while preserving the same text and meaning.tests/test_auth/test_auth_signup.py-144-145 (1)
144-145:⚠️ Potential issue | 🟡 MinorRemove duplicated
fieldsassignment.Line 145 repeats the exact statement from Line 144 and adds noise to the test.
🧹 Suggested cleanup
- fields = [detail["field"] for detail in body["details"]] fields = [detail["field"] for detail in body["details"]]🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@tests/test_auth/test_auth_signup.py` around lines 144 - 145, The test contains a duplicated assignment to the local variable fields (the two identical lines "fields = [detail['field'] for detail in body['details']]"); remove the redundant second assignment so fields is only set once (keep the first occurrence) and run the test to ensure no other references rely on the duplicate.app/routers/api-docs.md-33-33 (1)
33-33:⚠️ Potential issue | 🟡 MinorAdd a language tag to the fenced code block (MD040).
The architecture block should declare a language to satisfy markdownlint.
📝 Suggested fix
-``` +```text ... -``` +```🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@app/routers/api-docs.md` at line 33, The fenced code block in the "architecture" section is missing a language tag (MD040); change the opening fence from ``` to a tagged fence such as ```text so the block declares its language, i.e. update the architecture fenced code block delimiter in the markdown to ```text to satisfy markdownlint.app/external_services/deepgram/api-docs.md-31-33 (1)
31-33:⚠️ Potential issue | 🟡 MinorCorrect API semantics:
bytesinput and runtime key-check timingLine 31 describes PCM “strings”, but
transcribe(...)acceptsaudio_bytes: bytes.
Line 71 says failure happens “on startup”, whileRuntimeErroris raised whenget_deepgram_headers()is invoked during request handling.💡 Suggested wording update
-1. Receives base64-decoded PCM strings. +1. Receives base64-decoded PCM bytes. @@ -* Fails fast natively issuing `RuntimeError` on startup if `DEEPGRAM_API_KEY` is completely missing from `.env` or Server Environment. +* Raises `RuntimeError` when `get_deepgram_headers()` is called and + `DEEPGRAM_API_KEY` is missing from the environment.Also applies to: 70-71
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@app/external_services/deepgram/api-docs.md` around lines 31 - 33, Update the API docs to state that transcribe(...) accepts raw audio_bytes of type bytes (base64-decoded PCM) rather than “PCM strings”, and correct the timing note to indicate that the RuntimeError is raised at request/runtime when get_deepgram_headers() is called (during request handling), not “on startup”; reference the transcribe(...) parameter name audio_bytes and the get_deepgram_headers() function in the updated wording.app/core/dependencies.py-133-135 (1)
133-135:⚠️ Potential issue | 🟡 MinorFix incorrect dependency name in optional-user docstring
Line 134 says
Depends(oauth2_scheme), but this function actually usesDepends(oauth2_scheme_optional). The docstring should reflect the real dependency.💡 Suggested correction
- Defaults to Depends(oauth2_scheme). + Defaults to Depends(oauth2_scheme_optional).🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@app/core/dependencies.py` around lines 133 - 135, Update the docstring to reference the actual dependency used: replace the incorrect mention of Depends(oauth2_scheme) with Depends(oauth2_scheme_optional) so the parameter docs for token (str | None) and bearer (HTTPAuthorizationCredentials | None) match the function's real dependency (oauth2_scheme_optional).app/models/api-docs.md-30-54 (1)
30-54:⚠️ Potential issue | 🟡 MinorAdd a language to the fenced diagram block (MD040)
The block starting at Line 30 is missing a fence language and triggers markdownlint MD040.
💡 Suggested fix
-``` +```text ┌─────────────────────────┐ ┌─────────────────────────┐ ... └─────────────────────────────────────────────────────────────┘</details> <details> <summary>🤖 Prompt for AI Agents</summary>Verify each finding against the current code and only fix it if needed.
In
@app/models/api-docs.mdaround lines 30 - 54, The fenced diagram in
app/models/api-docs.md is missing a language tag (MD040); update the opening
fence to include a language (e.g., "text") so the block is treated as plain
text. Locate the ASCII diagram that references app/models/init.py,
alembic/env.py, Base and Room and change thefence to something liketext
to satisfy markdownlint MD040.</details> </blockquote></details> <details> <summary>app/modules/auth/schemas.py-1-4 (1)</summary><blockquote> `1-4`: _⚠️ Potential issue_ | _🟡 Minor_ **Resolve formatting/lint failures in this module (CI blocker).** Current changes fail Black/Ruff (long lines + import formatting), so CI won’t pass until these are wrapped/formatted. <details> <summary>🧹 Proposed fix</summary> ```diff -"""Authentication Pydantic schemas module. - -Strictly defines JSON constraints validating and mutating incoming API properties automatically. -""" +"""Authentication Pydantic schemas module. + +Strictly defines JSON constraints validating and mutating incoming API +properties automatically. +""" @@ -from pydantic import BaseModel, ConfigDict, EmailStr, Field, field_validator, model_validator +from pydantic import ( + BaseModel, + ConfigDict, + EmailStr, + Field, + field_validator, + model_validator, +) @@ - "You must accept the Terms of Service and Privacy Policy to create an account." + "You must accept the Terms of Service and Privacy Policy " + "to create an account." ``` </details> Also applies to: 6-10, 96-97 <details> <summary>🤖 Prompt for AI Agents</summary> ``` Verify each finding against the current code and only fix it if needed. In `@app/modules/auth/schemas.py` around lines 1 - 4, The file fails Black/Ruff due to long lines and import formatting; reformat the module-level imports and all Pydantic schema definitions in this module so lines adhere to the project line-length (wrap long expressions and imports using parentheses or multi-line imports), remove or reorder imports to match import grouping rules, and run ruff --fix and black to ensure CI passes; target the module-level docstring, the top imports block, and the Pydantic schema classes/fields in this file when making changes. ``` </details> </blockquote></details> <details> <summary>app/modules/auth/service.py-73-73 (1)</summary><blockquote> `73-73`: _⚠️ Potential issue_ | _🟡 Minor_ **Wrap the long docstring line to fix Ruff E501 (CI blocker).** Line 73 exceeds configured max line length and fails Code Quality. <details> <summary>✂️ Proposed fix</summary> ```diff - frontend_base_url (str): The frontend UI router domain natively targeting Verification links. + frontend_base_url (str): Frontend base URL used for verification + links. ``` </details> <details> <summary>🤖 Prompt for AI Agents</summary> ``` Verify each finding against the current code and only fix it if needed. In `@app/modules/auth/service.py` at line 73, The docstring line describing the parameter frontend_base_url is too long (Ruff E501); edit the docstring where frontend_base_url is documented in app/modules/auth/service.py and wrap the description into multiple shorter lines so each line is under the configured max length (e.g., break after "domain" and continue with "natively targeting Verification links."), ensuring the param name frontend_base_url remains unchanged and the overall docstring formatting (indentation and parameter list style) is preserved. ``` </details> </blockquote></details> <details> <summary>app/modules/user/api-docs.md-186-190 (1)</summary><blockquote> `186-190`: _⚠️ Potential issue_ | _🟡 Minor_ **Fix invalid JSON in the response example.** The example at Line 189 uses a `//` inline comment, which makes the JSON invalid for copy/paste consumers. <details> <summary>🛠️ Proposed fix</summary> ```diff { "status": "ok", - "message": "Account has been deactivated and scheduled for deletion." // (Or "Account has been successfully deleted." for hard delete) + "message": "Account has been deactivated and scheduled for deletion." } ``` Add the hard-delete variant as plain text below the code block. </details> <details> <summary>🤖 Prompt for AI Agents</summary> ``` Verify each finding against the current code and only fix it if needed. In `@app/modules/user/api-docs.md` around lines 186 - 190, The JSON example in the user API docs response contains an inline `//` comment which makes the block invalid; remove the inline comment from the JSON so the code block contains only valid JSON (e.g., {"status":"ok","message":"Account has been deactivated and scheduled for deletion."}), and add the hard-delete variant as plain text immediately after the code block (e.g., a short line stating that the hard-delete response would be: "Account has been successfully deleted."). Ensure you update the example around the response snippet in app/modules/user/api-docs.md so consumers can copy/paste valid JSON and still see the alternate message. ``` </details> </blockquote></details> <details> <summary>app/services/connection_manager.py-88-88 (1)</summary><blockquote> `88-88`: _⚠️ Potential issue_ | _🟡 Minor_ **Fix Ruff E501 in the method docstring (CI blocker).** Line 88 exceeds the configured line length and is failing Code Quality checks. <details> <summary>✂️ Proposed fix</summary> ```diff - sender_id (str | None): The user ID of the sender to avoid echo, if applicable. + sender_id (str | None): The sender user ID to avoid echoing the + message back, if applicable. ``` </details> <details> <summary>🤖 Prompt for AI Agents</summary> ``` Verify each finding against the current code and only fix it if needed. In `@app/services/connection_manager.py` at line 88, Docstring line for the parameter "sender_id" in connection_manager.py exceeds the configured max line length (Ruff E501); break or reflow the description so no line is longer than the project's limit (e.g., wrap after "sender to avoid echo," or split into two sentences) within the method's docstring (the param block containing "sender_id (str | None): The user ID of the sender to avoid echo, if applicable."). Ensure the reflow keeps the same wording/meaning and aligns with the surrounding docstring indentation and style. ``` </details> </blockquote></details> <details> <summary>app/modules/auth/token_store.py-27-31 (1)</summary><blockquote> `27-31`: _⚠️ Potential issue_ | _🟡 Minor_ **Clean up unclear autogenerated docstring wording** The new docstring text at **Line 30**, **Line 69–72**, **Line 79–93**, **Line 105**, and **Line 145–159** is grammatically broken and ambiguous. This hurts maintainability and generated docs quality. <details> <summary>✏️ Suggested docstring wording cleanup</summary> ```diff def _get_redis_client() -> Redis: """Return (and lazily create) a module-level async Redis client. Returns: - Redis: Async mapped wrapper block securely. + Redis: Asynchronous Redis client instance. """ @@ async def save_refresh_token(self, email: str, jti: str, ttl_seconds: int) -> None: @@ Args: - email (str): Valid user email constraints. - jti (str): Tracker mapped identifier natively. - ttl_seconds (int): Redis mapped expiry limit securely. + email (str): User email associated with the refresh token. + jti (str): Refresh-token JTI to persist. + ttl_seconds (int): Time-to-live in seconds for automatic expiry. @@ async def revoke_refresh_token(self, email: str, jti: str) -> None: @@ Args: - email (str): Native account identifier securely mappings. - jti (str): Stored tracker target block natively bound. + email (str): User email associated with the refresh token. + jti (str): Refresh-token JTI to revoke. @@ async def is_refresh_token_valid(self, email: str, jti: str) -> bool: @@ Args: - email (str): Target email validation parameter natively. - jti (str): Evaluated identifier mapped natively. + email (str): User email associated with the refresh token. + jti (str): Refresh-token JTI to validate. Returns: - bool: True if mapped securely found, else False. + bool: True if the token exists (not revoked/expired), else False. @@ async def revoke_all_user_tokens(self, email: str) -> None: @@ Args: - email (str): User identifier mapped natively. + email (str): User email whose refresh tokens should be revoked. @@ async def blacklist_access_token(self, jti: str, ttl_seconds: int) -> None: @@ Args: - jti (str): Parsed natively extracted JTI block automatically. - ttl_seconds (int): Bound duration tracked via Redis securely. + jti (str): Access-token JTI to blacklist. + ttl_seconds (int): Remaining token lifetime in seconds. @@ async def is_access_token_blacklisted(self, jti: str) -> bool: @@ Args: - jti (str): JTI payload natively verified block. + jti (str): Access-token JTI to check. Returns: - bool: Native verification constraint returned correctly mapping. + bool: True if the access token is blacklisted, else False. ``` </details> Also applies to: 66-72, 76-81, 85-93, 104-106, 144-147, 152-159 <details> <summary>🤖 Prompt for AI Agents</summary> ``` Verify each finding against the current code and only fix it if needed. In `@app/modules/auth/token_store.py` around lines 27 - 31, The docstrings in app/modules/auth/token_store.py are autogenerated and grammatically broken (notably the module-level async Redis client docstring and several others around the file); update each docstring to be clear and concise: for the module-level async Redis client function (the one that lazily creates/returns the async Redis client) replace the ambiguous text with a proper one-line summary, parameter descriptions (if any), and a clear Returns section stating the exact return type (e.g., Redis or AsyncRedisClient); do the same for the other functions/classes flagged (the docstrings around lines you annotated) — ensure each docstring uses conventional phrasing (summary line, optional Args, Returns, Raises) and remove awkward phrases like “mapped wrapper block securely” so the intent and types are obvious (reference the function/class names in the file to locate each docstring to edit). ``` </details> </blockquote></details> <details> <summary>app/modules/meeting/api-docs.md-201-210 (1)</summary><blockquote> `201-210`: _⚠️ Potential issue_ | _🟡 Minor_ **Use valid JSON in the response example** At **Line 206–207**, inline `//` comments make the block invalid JSON and non-copyable for clients. <details> <summary>✅ Valid JSON version</summary> ```diff { "status": "success", "message": "Joined room successfully.", "data": { - "status": "joined", // or "waiting" - "guest_token": "eyJhb..." // Set if user joined as an anonymous guest + "status": "joined", + "guest_token": "eyJhb..." } } ``` </details> <details> <summary>🤖 Prompt for AI Agents</summary> ``` Verify each finding against the current code and only fix it if needed. In `@app/modules/meeting/api-docs.md` around lines 201 - 210, The JSON response example in api-docs.md contains inline `//` comments which make it invalid JSON; update the code block used for the "Joined room successfully" example to be valid JSON by removing the inline comments (e.g., delete `// or "waiting"` and `// Set if user joined as an anonymous guest`) and instead add explanatory text outside the triple-backtick block or provide separate valid JSON examples for the "status" values and the presence/absence of "guest_token"; look for the example object containing keys "status", "message", "data", and "guest_token" to apply the fix. ``` </details> </blockquote></details> <details> <summary>app/modules/meeting/api-docs.md-329-331 (1)</summary><blockquote> `329-331`: _⚠️ Potential issue_ | _🟡 Minor_ **Fix schema-to-endpoint mappings in the table** The “Used By” paths at **Line 329–331** are inconsistent with documented routes (they omit `/{room_code}` for join/config/invite). <details> <summary>🔧 Suggested fix</summary> ```diff -| `JoinRoomRequest` | `POST /join` | `display_name (optional)`, `listening_language (optional)` | -| `RoomConfigUpdate`| `PATCH /config`| Matches settings fields | -| `InviteRequest` | `POST /invite` | `emails (list[str])` | +| `JoinRoomRequest` | `POST /{room_code}/join` | `display_name (optional)`, `listening_language (optional)` | +| `RoomConfigUpdate`| `PATCH /{room_code}/config`| Matches settings fields | +| `InviteRequest` | `POST /{room_code}/invite` | `emails (list[str])` | ``` </details> <details> <summary>🤖 Prompt for AI Agents</summary> ``` Verify each finding against the current code and only fix it if needed. In `@app/modules/meeting/api-docs.md` around lines 329 - 331, Update the table rows for JoinRoomRequest, RoomConfigUpdate, and InviteRequest so their "Used By" endpoints include the room code path segment; specifically change the endpoints for JoinRoomRequest (currently `POST /join`) to `POST /{room_code}/join`, for RoomConfigUpdate (`PATCH /config`) to `PATCH /{room_code}/config`, and for InviteRequest (`POST /invite`) to `POST /{room_code}/invite` so the schema-to-endpoint mappings match the documented routes. ``` </details> </blockquote></details> <details> <summary>app/modules/meeting/api-docs.md-3-4 (1)</summary><blockquote> `3-4`: _⚠️ Potential issue_ | _🟡 Minor_ **Remove editorial/internal note from the public docs** At **Line 3**, the base URL line includes draft commentary ("wait let me check..."). This should be replaced with clean, publish-ready text. <details> <summary>🧹 Suggested cleanup</summary> ```diff -> **Base URL:** `/api/v1/meetings` (Assuming router prefix, though undefined in `router.py`, wait let me check `main.py` or just document the endpoints as defined, usually it's `/api/v1/meetings`). +> **Base URL:** `/api/v1/meetings` ``` </details> <details> <summary>🤖 Prompt for AI Agents</summary> ``` Verify each finding against the current code and only fix it if needed. In `@app/modules/meeting/api-docs.md` around lines 3 - 4, The "Base URL" line in app/modules/meeting/api-docs.md contains editorial/internal commentary; replace that entire line with a clean, publish-ready statement such as "**Base URL:** `/api/v1/meetings`" (remove the "wait let me check..." parenthetical) and ensure no other draft notes remain in the document (search for "wait", "let me check", or similar editorial phrases). ``` </details> </blockquote></details> <details> <summary>app/modules/meeting/api-docs.md-49-70 (1)</summary><blockquote> `49-70`: _⚠️ Potential issue_ | _🟡 Minor_ **Add a fenced-code language to satisfy markdownlint (MD040)** The architecture block fence has no language tag. This can fail markdown linting. <details> <summary>🧾 Lint-friendly change</summary> ```diff -``` +```text ┌─────────────────────────────────────────────────────────────────┐ │ FastAPI Routers (REST & WebSockets) │ ... └─────────────────────────────────────────────────────────────────┘ ``` ``` </details> <details> <summary>🤖 Prompt for AI Agents</summary>Verify each finding against the current code and only fix it if needed.
In
@app/modules/meeting/api-docs.mdaround lines 49 - 70, The ASCII-art
architecture code fence in the meeting API docs lacks a language tag, which
trips markdownlint MD040; update the fenced block in api-docs.md (the
Triple-backtick block containing the FastAPI Routers / MeetingService / Redis /
PostgreSQL diagram) by adding a language identifier (e.g., add "text"
immediately after the openingso it becomestext) to satisfy the linter.</details> </blockquote></details> </blockquote></details> --- <details> <summary>ℹ️ Review info</summary> <details> <summary>⚙️ Run configuration</summary> **Configuration used**: defaults **Review profile**: CHILL **Plan**: Pro **Run ID**: `2e492a09-047e-4a3d-a6ba-c6bc731a2cce` </details> <details> <summary>📥 Commits</summary> Reviewing files that changed from the base of the PR and between e491d4876e02451b01d1390da5c15e7bb4d4a1e2 and cd4042b67d97dcc7d925a1dd98dbd800f8629416. </details> <details> <summary>📒 Files selected for processing (82)</summary> * `.pre-commit-config.yaml` * `app/core/api-docs.md` * `app/core/config.py` * `app/core/dependencies.py` * `app/core/error_responses.py` * `app/core/exception_handlers.py` * `app/core/exceptions.py` * `app/core/init_admin.py` * `app/core/rate_limiter.py` * `app/core/sanitize.py` * `app/core/security.py` * `app/db/api-docs.md` * `app/db/session.py` * `app/external_services/cloudinary/api-docs.md` * `app/external_services/deepgram/api-docs.md` * `app/external_services/deepgram/config.py` * `app/external_services/deepgram/service.py` * `app/external_services/deepl/api-docs.md` * `app/external_services/deepl/config.py` * `app/external_services/deepl/service.py` * `app/external_services/mailgun/__init__.py` * `app/external_services/openai_tts/api-docs.md` * `app/external_services/openai_tts/config.py` * `app/external_services/openai_tts/service.py` * `app/external_services/voiceai/api-docs.md` * `app/external_services/voiceai/config.py` * `app/external_services/voiceai/service.py` * `app/kafka/api-docs.md` * `app/kafka/consumer.py` * `app/kafka/exceptions.py` * `app/kafka/manager.py` * `app/kafka/producer.py` * `app/kafka/schemas.py` * `app/kafka/topics.py` * `app/main.py` * `app/models/api-docs.md` * `app/models/base.py` * `app/modules/auth/account_lockout.py` * `app/modules/auth/api-docs.md` * `app/modules/auth/constants.py` * `app/modules/auth/dependencies.py` * `app/modules/auth/models.py` * `app/modules/auth/oauth_google.py` * `app/modules/auth/router.py` * `app/modules/auth/schemas.py` * `app/modules/auth/service.py` * `app/modules/auth/token_store.py` * `app/modules/auth/verification.py` * `app/modules/meeting/api-docs.md` * `app/modules/meeting/dependencies.py` * `app/modules/meeting/models.py` * `app/modules/meeting/repository.py` * `app/modules/meeting/router.py` * `app/modules/meeting/schemas.py` * `app/modules/meeting/service.py` * `app/modules/meeting/state.py` * `app/modules/meeting/ws_dependencies.py` * `app/modules/meeting/ws_router.py` * `app/modules/user/api-docs.md` * `app/modules/user/dependencies.py` * `app/modules/user/router.py` * `app/modules/user/service.py` * `app/routers/api-docs.md` * `app/schemas/api-docs.md` * `app/schemas/pipeline.py` * `app/services/api-docs.md` * `app/services/audio_bridge.py` * `app/services/connection_manager.py` * `app/services/email_consumer.py` * `app/services/email_producer.py` * `app/services/stt_worker.py` * `app/services/translation_worker.py` * `app/services/tts_worker.py` * `app/utils/__init__.py` * `app/utils/authentication.py` * `app/utils/validation.py` * `issues/change-password.md` * `issues/logout.md` * `issues/password-reset.md` * `pyproject.toml` * `tests/test_auth/test_auth_login.py` * `tests/test_auth/test_auth_signup.py` </details> <details> <summary>💤 Files with no reviewable changes (3)</summary> * issues/change-password.md * issues/password-reset.md * issues/logout.md </details> </details> <!-- This is an auto-generated comment by CodeRabbit for review status -->
| token (str | None): OAuth2 password bearer token. | ||
| Defaults to Depends(oauth2_scheme). | ||
| bearer (HTTPAuthorizationCredentials | None): HTTP bearer credentials. | ||
| Defaults to Depends(bearer_scheme). |
There was a problem hiding this comment.
Clean trailing whitespace and reflow docstring lines to satisfy CI
Lines 43/45/133/135 include trailing whitespace, and this file is already failing Black/Ruff checks.
💡 Suggested cleanup
- token (str | None): OAuth2 password bearer token.
+ token (str | None): OAuth2 password bearer token.
@@
- bearer (HTTPAuthorizationCredentials | None): HTTP bearer credentials.
+ bearer (HTTPAuthorizationCredentials | None): HTTP bearer credentials.
@@
- token (str | None): OAuth2 password bearer token.
+ token (str | None): OAuth2 password bearer token.
@@
- bearer (HTTPAuthorizationCredentials | None): HTTP bearer credentials.
+ bearer (HTTPAuthorizationCredentials | None): HTTP bearer credentials.Also applies to: 133-136
🧰 Tools
🪛 GitHub Actions: Code Quality
[warning] 43-43: ruff check reported W291 Trailing whitespace. Trailing whitespace at app/core/dependencies.py:43:58.
[warning] 45-45: ruff check reported W291 Trailing whitespace. Trailing whitespace at app/core/dependencies.py:45:79.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@app/core/dependencies.py` around lines 43 - 46, Remove trailing whitespace
and reflow the long docstring lines in app/core/dependencies.py: edit the
parameter docstring entries for token and bearer (the "token (str | None): ..."
and "bearer (HTTPAuthorizationCredentials | None): ..." lines) to remove
trailing spaces and wrap/reflow so they fit style limits (e.g., ~88 chars) and
mirror the same fixes for the other occurrences reported around lines 133-136;
then run Black/Ruff to confirm formatting passes CI.
| @@ -1,3 +1,8 @@ | |||
| """Standardized API Error Response architectures module. | |||
|
|
|||
| Defines Pydantic representations guaranteeing frontend API structures respond homogenously. | |||
There was a problem hiding this comment.
Resolve Ruff E501 failures in docstrings.
Line 3 and Line 40 exceed the configured max length and currently break the code-quality pipeline.
✍️ Suggested line-length-safe wording
-Defines Pydantic representations guaranteeing frontend API structures respond homogenously.
+Defines Pydantic models to keep API error responses consistent for clients.
@@
- JSONResponse: Standardized FastAPI JSON response strictly bound to ErrorResponse schema.
+ JSONResponse: Standardized FastAPI error response based on ErrorResponse.Also applies to: 40-40
🧰 Tools
🪛 GitHub Actions: Code Quality
[error] 3-3: ruff check reported E501 Line too long (91 > 88) at app/core/error_responses.py:3:89.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@app/core/error_responses.py` at line 3, Shorten the overlong docstrings to
satisfy the linter: replace the module-level docstring (currently "Defines
Pydantic representations guaranteeing frontend API structures respond
homogenously.") and the docstring at the Pydantic model(s) around line 40 with
concise, line-length-safe sentences (e.g., "Pydantic models for consistent API
error responses."), ensuring each docstring line is under the configured max
length; update the module docstring and the docstring for the Pydantic response
classes (the model definitions around line 40) accordingly.
| """Application Base Exceptions module. | ||
|
|
||
| Defines the core `FluentMeetException` structure allowing handlers to easily map | ||
| application failures directly to standardized HTTP 400 and 500 entity wrappers natively. | ||
| """ | ||
|
|
||
| from typing import Any | ||
|
|
||
|
|
||
| class FluentMeetException(Exception): | ||
| """ | ||
| Base exception for all FluentMeet API errors. | ||
| """Base exception for all FluentMeet API errors. | ||
|
|
||
| Attributes: | ||
| status_code (int): Standard HTTP binding natively decoded by handlers. | ||
| code (str): Explicit mapped exception code array dynamically returned | ||
| to frontend structures. | ||
| message (str): Text definition descriptor structure readable | ||
| explicitly by users. | ||
| details (list[dict[str, Any]]): Internal mappings definition blocks | ||
| (useful for validation outputs). |
There was a problem hiding this comment.
Formatting issues in docstrings are breaking CI (Line 15/17/19).
There are trailing spaces on Lines 15, 17, and 19 (W291), and Black also reports this file needs reformatting.
Proposed cleanup
"""Application Base Exceptions module.
@@
Defines the core `FluentMeetException` structure allowing handlers to easily map
application failures directly to standardized HTTP 400 and 500 entity wrappers natively.
"""
@@
class FluentMeetException(Exception):
@@
Attributes:
status_code (int): Standard HTTP binding natively decoded by handlers.
- code (str): Explicit mapped exception code array dynamically returned
+ code (str): Explicit mapped exception code array dynamically returned
to frontend structures.
- message (str): Text definition descriptor structure readable
+ message (str): Text definition descriptor structure readable
explicitly by users.
- details (list[dict[str, Any]]): Internal mappings definition blocks
+ details (list[dict[str, Any]]): Internal mappings definition blocks
(useful for validation outputs).
"""🧰 Tools
🪛 GitHub Actions: CI
[error] 1-1: Black --check failed: file would be reformatted by Black.
🪛 GitHub Actions: Code Quality
[warning] 15-15: ruff check reported W291 Trailing whitespace. Trailing whitespace at app/core/exceptions.py:15:78.
[warning] 17-17: ruff check reported W291 Trailing whitespace. Trailing whitespace at app/core/exceptions.py:17:69.
[warning] 19-19: ruff check reported W291 Trailing whitespace. Trailing whitespace at app/core/exceptions.py:19:76.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@app/core/exceptions.py` around lines 1 - 20, The module docstring and the
FluentMeetException class docstring contain trailing whitespace characters
(W291) that break CI and Black formatting; remove trailing spaces from the
affected lines in the docstrings (notably the lines describing `code`,
`message`, and `details` inside the FluentMeetException docstring) and then
reformat the file with Black to ensure CI passes.
| Args: | ||
| redis_client (aioredis.Redis | None): Optional overriding injected Redis Async client. Defaults to None. | ||
| """ |
There was a problem hiding this comment.
Wrap long docstring lines to clear Ruff E501
Line 53 and Line 122 exceed the configured max line length and currently fail the quality gate.
💡 Suggested wrap
- redis_client (aioredis.Redis | None): Optional overriding injected Redis Async client. Defaults to None.
+ redis_client (aioredis.Redis | None): Optional injected async Redis
+ client. Defaults to None.
@@
- dict: Lockout status containing is_locked, lock_time_left, and attempts_remaining.
+ dict: Lockout status containing `is_locked`, `lock_time_left`,
+ and `attempts_remaining`.Also applies to: 121-123
🧰 Tools
🪛 GitHub Actions: Code Quality
[error] 53-53: ruff check reported E501 Line too long (116 > 88) at app/modules/auth/account_lockout.py:53:89.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@app/modules/auth/account_lockout.py` around lines 52 - 54, The long docstring
lines in the account_lockout module exceed Ruff's max line length (E501); update
the multi-line docstrings (notably the Args block that documents redis_client
and the later docstring around the 121-123 region) to wrap lines under the
configured max width by breaking long sentences into shorter lines and moving
long parameter descriptions onto subsequent indented lines; locate the
docstrings in account_lockout.py (e.g., the function/class docstring that
contains "Args:" and the redis_client description) and reflow them so each line
is within the line-length limit while preserving the same wording and
indentation for parameter descriptions.
| | Status | Code | Condition | | ||
| |---|---|---| | ||
| | `409` | `EMAIL_ALREADY_REGISTERED` | An account with this email already exists | | ||
| | `422` | — | Validation error (missing fields, passwords mismatch, etc.) | |
There was a problem hiding this comment.
Correct signup validation status code in docs (contract mismatch).
Line 298 documents 422, but current exception handling returns 400 for request validation errors, so this contract is inaccurate for clients.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@app/modules/auth/api-docs.md` at line 298, Update the API docs row that
currently reads "`| `422` | — | Validation error (missing fields, passwords
mismatch, etc.) |`" to use the actual status returned by the implementation
(`400`) so the contract matches runtime behavior; search for other occurrences
of the `422` validation-row for the signup/validation endpoints and change them
to `400` (and regenerate any table ordering if needed) to keep docs and
exception handling consistent.
| class AudioChunkPayload(BaseModel): | ||
| """Payload for a single audio chunk from a WebSocket client.""" | ||
| """Payload for a single audio chunk from a WebSocket client. | ||
|
|
||
| Attributes: | ||
| room_id: Room the audio originates from securely mapped. | ||
| user_id: Speaker's tracking ID (user UUID or guest session UUID). | ||
| sequence_number: Monotonically increasing chunk index. | ||
| audio_data: Base64-encoded raw audio bytes manually structured natively smoothly. | ||
| sample_rate: Audio sample rate natively mapping efficiently. | ||
| encoding: Audio encoding format mapped explicitly. | ||
| source_language: Speaker's language reliably securely nicely comfortably. | ||
| """ |
There was a problem hiding this comment.
🛠️ Refactor suggestion | 🟠 Major
Simplify verbose attribute descriptions.
Several attribute descriptions contain excessive and awkward phrasing (e.g., "manually structured natively smoothly", "natively mapping efficiently", "reliably securely nicely comfortably"). These reduce clarity rather than improving it.
✍️ Proposed simplification
"""Payload for a single audio chunk from a WebSocket client.
Attributes:
room_id: Room the audio originates from securely mapped.
user_id: Speaker's tracking ID (user UUID or guest session UUID).
sequence_number: Monotonically increasing chunk index.
- audio_data: Base64-encoded raw audio bytes manually structured natively smoothly.
- sample_rate: Audio sample rate natively mapping efficiently.
- encoding: Audio encoding format mapped explicitly.
- source_language: Speaker's language reliably securely nicely comfortably.
+ audio_data: Base64-encoded raw audio bytes.
+ sample_rate: Audio sample rate in Hz.
+ encoding: Audio encoding format.
+ source_language: Speaker's language (ISO 639-1 code).
"""🧰 Tools
🪛 GitHub Actions: Code Quality
[error] 43-43: ruff check reported E501 Line too long (91 > 88) at app/schemas/pipeline.py:43:89.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@app/schemas/pipeline.py` around lines 36 - 47, The field descriptions in the
AudioChunkPayload docstring are overly verbose and contain awkward phrasing;
update the docstring for class AudioChunkPayload and its attributes (room_id,
user_id, sequence_number, audio_data, sample_rate, encoding, source_language) to
concise, clear descriptions — e.g., "room_id: ID of the room where the audio
originates", "user_id: speaker's UUID or guest session ID", "sequence_number:
monotonically increasing chunk index", "audio_data: base64-encoded raw audio
bytes", "sample_rate: sample rate in Hz", "encoding: audio encoding format",
"source_language: speaker's language code". Ensure wording is short, factual,
and consistent across attributes.
| class TranscriptionPayload(BaseModel): | ||
| """Payload produced by the STT worker.""" | ||
| """Payload produced by the STT worker. | ||
|
|
||
| Attributes: | ||
| room_id: Active tracker explicitly identifying organically flawlessly dynamically mapped. | ||
| user_id: Connected speaker logically securely confidently dependably smoothly. | ||
| sequence_number: Ordered limit elegantly flawlessly appropriately stably. | ||
| text: Transcribed result mapped automatically perfectly. | ||
| source_language: Detected or declared source language. | ||
| is_final: Check bounds effectively naturally flawlessly. | ||
| confidence: Float organically cleanly cleanly successfully. | ||
| """ |
There was a problem hiding this comment.
🛠️ Refactor suggestion | 🟠 Major
Simplify verbose attribute descriptions.
Similar to AudioChunkPayload, these attribute descriptions contain excessive awkward phrasing that reduces readability.
✍️ Proposed simplification
"""Payload produced by the STT worker.
Attributes:
- room_id: Active tracker explicitly identifying organically flawlessly dynamically mapped.
- user_id: Connected speaker logically securely confidently dependably smoothly.
- sequence_number: Ordered limit elegantly flawlessly appropriately stably.
- text: Transcribed result mapped automatically perfectly.
+ room_id: Room identifier for the transcription.
+ user_id: Speaker's user identifier.
+ sequence_number: Chunk sequence number.
+ text: Transcribed text from the audio chunk.
source_language: Detected or declared source language.
- is_final: Check bounds effectively naturally flawlessly.
- confidence: Float organically cleanly cleanly successfully.
+ is_final: Whether this is a final transcription or interim.
+ confidence: STT confidence score (0.0 to 1.0).
"""🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@app/schemas/pipeline.py` around lines 79 - 90, The TranscriptionPayload
docstring is overly verbose; simplify each attribute description to concise,
readable phrases similar to AudioChunkPayload: describe room_id as "room
identifier", user_id as "speaker identifier", sequence_number as
"utterance/order index", text as "transcribed text", source_language as
"language code", is_final as "whether this is the final transcription", and
confidence as "confidence score (float)". Update the class TranscriptionPayload
attribute comments to these short descriptions so they match the style of
AudioChunkPayload and improve clarity.
| class TranslationPayload(BaseModel): | ||
| """Payload produced by the Translation worker.""" | ||
| """Payload produced by the Translation worker. | ||
|
|
||
| Attributes: | ||
| room_id: Active room identifier for the translation. | ||
| user_id: Participant rationally fluently suitably rationally cleanly explicitly cleanly organically successfully realistically correctly properly. | ||
| sequence_number: Stream limit intelligently cleanly comfortably naturally effectively perfectly. | ||
| original_text: Initial text before translation. | ||
| translated_text: Resulting text after translation. | ||
| source_language: Identity rationally predictably optimally accurately effortlessly structurally accurately elegantly optimally intelligently fluently. | ||
| target_language: Target effectively elegantly successfully mapping efficiently flawlessly seamlessly cleanly correctly securely accurately. | ||
| """ |
There was a problem hiding this comment.
🛠️ Refactor suggestion | 🟠 Major
Simplify verbose attribute descriptions.
These attribute descriptions also contain excessive awkward phrasing.
✍️ Proposed simplification
"""Payload produced by the Translation worker.
Attributes:
room_id: Active room identifier for the translation.
- user_id: Participant rationally fluently suitably rationally cleanly explicitly cleanly organically successfully realistically correctly properly.
- sequence_number: Stream limit intelligently cleanly comfortably naturally effectively perfectly.
+ user_id: Participant user identifier.
+ sequence_number: Chunk sequence number.
original_text: Initial text before translation.
translated_text: Resulting text after translation.
- source_language: Identity rationally predictably optimally accurately effortlessly structurally accurately elegantly optimally intelligently fluently.
- target_language: Target effectively elegantly successfully mapping efficiently flawlessly seamlessly cleanly correctly securely accurately.
+ source_language: Source language (ISO 639-1 code).
+ target_language: Target language (ISO 639-1 code).
"""📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| class TranslationPayload(BaseModel): | |
| """Payload produced by the Translation worker.""" | |
| """Payload produced by the Translation worker. | |
| Attributes: | |
| room_id: Active room identifier for the translation. | |
| user_id: Participant rationally fluently suitably rationally cleanly explicitly cleanly organically successfully realistically correctly properly. | |
| sequence_number: Stream limit intelligently cleanly comfortably naturally effectively perfectly. | |
| original_text: Initial text before translation. | |
| translated_text: Resulting text after translation. | |
| source_language: Identity rationally predictably optimally accurately effortlessly structurally accurately elegantly optimally intelligently fluently. | |
| target_language: Target effectively elegantly successfully mapping efficiently flawlessly seamlessly cleanly correctly securely accurately. | |
| """ | |
| class TranslationPayload(BaseModel): | |
| """Payload produced by the Translation worker. | |
| Attributes: | |
| room_id: Active room identifier for the translation. | |
| user_id: Participant user identifier. | |
| sequence_number: Chunk sequence number. | |
| original_text: Initial text before translation. | |
| translated_text: Resulting text after translation. | |
| source_language: Source language (ISO 639-1 code). | |
| target_language: Target language (ISO 639-1 code). | |
| """ |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@app/schemas/pipeline.py` around lines 120 - 131, The class TranslationPayload
docstring is overly verbose and contains awkward phrasing; update the
class-level docstring for TranslationPayload to use concise, clear attribute
descriptions for room_id, user_id, sequence_number, original_text,
translated_text, source_language, and target_language—each attribute should have
a one-line plain description (e.g., "room_id: Active room identifier", "user_id:
Participant ID", "sequence_number: Stream sequence number", "original_text: Text
before translation", "translated_text: Text after translation",
"source_language: Source language code", "target_language: Target language
code") so the docstring is readable and unambiguous while keeping the attribute
names unchanged.
| Args: | ||
| event (BaseEvent[Any]): The deserialized wrapper containing the AudioChunkPayload. | ||
| """ |
There was a problem hiding this comment.
Line length violation in handle docstring (Line 45).
Ruff E501 is triggered by the Args line and blocks the quality check.
Proposed fix
Args:
- event (BaseEvent[Any]): The deserialized wrapper containing the AudioChunkPayload.
+ event (BaseEvent[Any]): The deserialized wrapper containing
+ ``AudioChunkPayload``.
"""📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| Args: | |
| event (BaseEvent[Any]): The deserialized wrapper containing the AudioChunkPayload. | |
| """ | |
| Args: | |
| event (BaseEvent[Any]): The deserialized wrapper containing | |
| ``AudioChunkPayload``. | |
| """ |
🧰 Tools
🪛 GitHub Actions: Code Quality
[error] 45-45: ruff check reported E501 Line too long (94 > 88) at app/services/stt_worker.py:45:89.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@app/services/stt_worker.py` around lines 44 - 46, The docstring for the
handle function has a line-length violation (Ruff E501) on the "Args:" block;
update the handle(...) docstring in app/services/stt_worker.py to wrap or reflow
the "Args:" and following parameter description lines so no line exceeds the
project's max line length (e.g., split "Args:" and "event (BaseEvent[Any]): The
deserialized wrapper containing the AudioChunkPayload." into multiple shorter
lines or reformat into a short description + indented param lines), ensuring you
reference the handle function and the types BaseEvent and AudioChunkPayload in
the adjusted docstring.
| Args: | ||
| event (BaseEvent[Any]): The deserialized wrapper containing the TranscriptionPayload. | ||
| """ |
There was a problem hiding this comment.
Wrap docstring arg description to pass Ruff E501
Line 55 exceeds the configured limit and is currently breaking Code Quality checks.
💡 Suggested wrap
- event (BaseEvent[Any]): The deserialized wrapper containing the TranscriptionPayload.
+ event (BaseEvent[Any]): The deserialized wrapper containing
+ the `TranscriptionPayload`.📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| Args: | |
| event (BaseEvent[Any]): The deserialized wrapper containing the TranscriptionPayload. | |
| """ | |
| Args: | |
| event (BaseEvent[Any]): The deserialized wrapper containing | |
| the `TranscriptionPayload`. | |
| """ |
🧰 Tools
🪛 GitHub Actions: Code Quality
[error] 55-55: ruff check reported E501 Line too long (97 > 88) at app/services/translation_worker.py:55:89.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@app/services/translation_worker.py` around lines 54 - 56, The docstring Args
entry for the parameter "event" in translation_worker.py exceeds the line length
limit (Ruff E501); edit the docstring under the Args section for "event" (the
BaseEvent[Any] wrapper containing the TranscriptionPayload) to wrap or reflow
the description so no single line exceeds the configured length—e.g., break the
type/description across lines or shorten the wording while preserving
"BaseEvent[Any]" and "TranscriptionPayload" references and keeping the docstring
formatting intact.
Summary by CodeRabbit
Release Notes
New Features
Documentation
Configuration