Week 4 project update#2
Conversation
|
Warning Review limit reached
Next review available in: 44 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (3)
WalkthroughThe PR adds GitHub setup files, configuration loading, GitHub API access, embeddings and vector search, issue cleaning and duplicate detection, ingestion, and webhook processing. It also mounts the FastAPI app and adds a health endpoint. ChangesRepository setup
GitHub triage flow
Estimated code review effort: 4 (Complex) | ~60 minutes Sequence Diagram(s)sequenceDiagram
participant GitHub
participant github_webhook
participant detect_duplicate
participant search_similar_issue
participant GitHubClient
participant GitHubAPI
GitHub->>github_webhook: POST /webhook issues opened event
github_webhook->>detect_duplicate: title and body text
detect_duplicate->>search_similar_issue: embedding
search_similar_issue-->>detect_duplicate: distances and metadata
detect_duplicate-->>github_webhook: duplicate result
github_webhook->>GitHubClient: comment_issue(issue_number, comment)
GitHubClient->>GitHubAPI: create issue comment
Poem
🚥 Pre-merge checks | ✅ 3 | ❌ 2❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (3 passed)
✨ Finishing Touches🧪 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: 8
🧹 Nitpick comments (7)
.gitignore (1)
9-12: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winIgnore the whole Chroma data directory, not one generated file.
This is brittle: a new Chroma persistence file or regenerated collection ID will fall back into the repo. Ignoring
data/chroma/keeps the local DB out of source control without depending on a specific UUID.♻️ Suggested cleanup
# Chroma database data/issues.json -data/chroma/chroma.sqlite3 -data/chroma/defcbcc9-4578-4553-b3f4-648cbe1c763b +data/chroma/As per the
app/db/vector.pysnippet, Chroma persists under./data/chroma.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In @.gitignore around lines 9 - 12, The .gitignore entry is too specific because it only excludes individual Chroma-generated files instead of the whole persistence directory. Update the Chroma ignore rules to cover the entire data/chroma folder so any files created by the vector store, including future collection IDs or sqlite artifacts from app/db/vector.py and the Chroma persistence path under ./data/chroma, stay out of source control.app/db/ingest.py (1)
13-13: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueMisleading variable name.
uncleaned_issuesholds the raw issue records persisted todata/issues.json; a name likeraw_issueswould read more clearly. Cosmetic only.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@app/db/ingest.py` at line 13, The variable name in the ingestion logic is misleading because `uncleaned_issues` actually stores the raw issue records loaded from and persisted to `data/issues.json`. Rename it to something clearer like `raw_issues` in the `ingest` flow so the intent is obvious, and update any nearby references in the same scope to match.app/core/github.py (2)
39-42: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueUse a local variable instead of
self.repo.Assigning to
self.repointroduces mutable per-call instance state that other methods could accidentally depend on. A local variable is clearer and side-effect free.♻️ Proposed change
def comment_issue(self, issue_number, comment): - self.repo = self.get_repo(TARGET_REPO) - issue = self.repo.get_issue(number=issue_number) + repo = self.get_repo(TARGET_REPO) + issue = repo.get_issue(number=issue_number) issue.create_comment(comment)🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@app/core/github.py` around lines 39 - 42, Replace the mutable instance assignment in comment_issue with a local repository variable instead of setting self.repo. In github.py, update comment_issue to store the result of get_repo(TARGET_REPO) in a local name and use that for get_issue/create_comment, keeping the method side-effect free and avoiding accidental reliance on shared instance state.
15-37: 🩺 Stability & Availability | 🔵 Trivial | ⚖️ Poor tradeoffAdd error handling around external GitHub calls.
get_repo,get_issues, andcreate_commentcan raise on rate limits, network errors, or auth failures. In the webhook path these are invoked on a request thread; unhandled exceptions will surface as 500s with no recovery. Consider wrapping calls with structured error handling and respecting PyGithub's rate-limit/retry options.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@app/core/github.py` around lines 15 - 37, Add structured error handling around the external GitHub API calls in the GitHub integration so request-thread failures don’t escape as unhandled 500s. In the methods that call PyGithub, especially fetch_issues, and anywhere create_comment is used, wrap get_repo, get_issues, and comment creation in a try/except that catches GitHub/PyGithub/network/rate-limit/auth failures and returns a controlled error or logs context. Use the existing GitHub class methods as the place to centralize this, and ensure the webhook path handles these failures gracefully instead of propagating exceptions.app/ml/clean.py (1)
3-3: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick winModule-level
Embedder()loads the model at import time.Instantiating the
SentenceTransformerat import means any module importingclean_issue(ingest script, webhook handler, tests) pays the model-load cost eagerly, even when no embedding is needed. Consider lazy initialization or dependency injection.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@app/ml/clean.py` at line 3, Module-level instantiation of Embedder is loading the SentenceTransformer eagerly on import, so move this initialization out of the top level in clean_issue/clean.py. Refactor Embedder usage to support lazy creation or dependency injection, and update the callers that use embedder so the model is only loaded when embedding is actually needed.app/config.py (1)
6-10: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winConsider failing fast on missing required configuration.
GITHUB_TOKEN,TARGET_REPO, andSOURCE_REPOwill silently beNoneif unset, surfacing later as confusing runtime errors deep in the GitHub client. A startup check would make misconfiguration obvious.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@app/config.py` around lines 6 - 10, Fail fast on missing required configuration in app/config.py by validating the module-level settings for GITHUB_TOKEN, TARGET_REPO, and SOURCE_REPO as soon as they are loaded instead of leaving them as None. Update the config initialization around WEBHOOK_SECRET, GITHUB_TOKEN, TARGET_REPO, SIMILARITY_THRESHOLD, and SOURCE_REPO so missing required values raise an immediate startup error with a clear message, and keep SIMILARITY_THRESHOLD parsing unchanged except for any needed validation.app/ml/embedder.py (1)
3-9: 🚀 Performance & Scalability | 🔵 Trivial | ⚖️ Poor tradeoffConsider caching/sharing a single
Embedderinstance.
SentenceTransformer("all-MiniLM-L6-v2")is loaded on everyEmbedder()construction. Sinceduplicate.py,test.py, and ingestion each instantiate their own, the model is loaded multiple times in a process. Reusing a module-level singleton avoids redundant load time and memory.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@app/ml/embedder.py` around lines 3 - 9, The Embedder class currently loads SentenceTransformer("all-MiniLM-L6-v2") in every __init__ call, causing redundant model loads across duplicate.py, test.py, and ingestion. Refactor Embedder so the SentenceTransformer instance is created once and shared, ideally via a module-level singleton or cached factory used by Embedder.__init__ and generate_embedding, and update the call sites to reuse the same Embedder instance instead of constructing new ones repeatedly.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In @.env.example:
- Around line 1-11: The env example is inconsistent with the real config
contract and duplicates keys, so clean up the file to show one canonical set of
variables only. Update the example to match what app/config.py reads by
documenting GITHUB_WEBHOOK_SECRET, GITHUB_TOKEN, TARGET_REPO,
SIMILARITY_THRESHOLD, and SOURCE_REPO, and remove the conflicting
REPO_NAME/MY_REPO_NAME block so contributors see a single unambiguous template.
In `@app/api/webhooks.py`:
- Around line 10-21: The github_webhook handler currently accepts any POST
request without verifying the GitHub HMAC signature. In github_webhook, read the
raw request body first, compute the expected X-Hub-Signature-256 using the
configured webhook secret, and compare it with the incoming header using a
constant-time check before parsing the payload. If the signature is missing or
invalid, return an unauthorized response and only proceed with event processing
after the signature is validated.
- Around line 27-31: Guard against malformed issue payloads in the webhook
handler by updating the `issue_text` construction in `app/api/webhooks.py` to
use safe accessors instead of direct indexing on `payload["issue"]["title"]`;
validate the payload shape first, return early for missing `issue` or `title`,
and keep the existing flow in the webhook parsing logic so bad
attacker-controlled input cannot raise a `KeyError` and trigger a 500.
- Around line 33-49: The async webhook handler is calling blocking work
directly, which can stall the event loop and hurt concurrency; in the webhook
flow around detect_duplicate and github.comment_issue, move both the duplicate
detection and the PyGithub issue comment call off the event loop using a
threadpool or background task. Update the handler in app/api/webhooks.py so the
logic around detect_duplicate(payload["issue"]["body"]) and
github.comment_issue(...) is awaited through an async-safe offload path, keeping
the async request handler non-blocking.
In `@app/config.py`:
- Line 6: The webhook flow currently reads WEBHOOK_SECRET in app/config.py but
the handler in app/api/webhooks.py does not use it to authenticate incoming
requests. Update the /webhook handling logic to verify GitHub’s
X-Hub-Signature-256 against an HMAC-SHA256 computed from the raw request body
using WEBHOOK_SECRET, and reject requests when the signature is missing or
invalid before any parsing or duplicate-detection work runs. Use the webhook
handler entrypoint and request-processing logic in app/api/webhooks.py to locate
the change, and perform the comparison in constant time.
In `@app/db/vector.py`:
- Line 7: The collection created in client.get_or_create_collection for
github_issues is using the default L2 distance, which breaks the similarity math
used by app.ml.duplicate's similarity calculation. Update the collection
creation in app.db.vector so github_issues is created with an explicit cosine
distance metric/space, keeping the returned distances compatible with max(0, 1 -
distance).
In `@app/test.py`:
- Around line 2-16: The test is importing and calling the wrong vector search
helper: `app.db.vector` exposes `search_similar_issue`, not `search_similar`.
Update the import in `app/test.py` to use the सही function name, and adjust the
call site to invoke `search_similar_issue` with the embedding so the test
matches the actual API.
In `@README.md`:
- Around line 1-4: The README is still left with merge-conflict markers, so
remove the conflict artifacts and keep the intended content only. Clean up both
conflicted sections in README.md by deleting the HEAD/divider markers and
retaining the final README text, using the visible conflict blocks near the top
and bottom of the file as the locations to fix.
---
Nitpick comments:
In @.gitignore:
- Around line 9-12: The .gitignore entry is too specific because it only
excludes individual Chroma-generated files instead of the whole persistence
directory. Update the Chroma ignore rules to cover the entire data/chroma folder
so any files created by the vector store, including future collection IDs or
sqlite artifacts from app/db/vector.py and the Chroma persistence path under
./data/chroma, stay out of source control.
In `@app/config.py`:
- Around line 6-10: Fail fast on missing required configuration in app/config.py
by validating the module-level settings for GITHUB_TOKEN, TARGET_REPO, and
SOURCE_REPO as soon as they are loaded instead of leaving them as None. Update
the config initialization around WEBHOOK_SECRET, GITHUB_TOKEN, TARGET_REPO,
SIMILARITY_THRESHOLD, and SOURCE_REPO so missing required values raise an
immediate startup error with a clear message, and keep SIMILARITY_THRESHOLD
parsing unchanged except for any needed validation.
In `@app/core/github.py`:
- Around line 39-42: Replace the mutable instance assignment in comment_issue
with a local repository variable instead of setting self.repo. In github.py,
update comment_issue to store the result of get_repo(TARGET_REPO) in a local
name and use that for get_issue/create_comment, keeping the method side-effect
free and avoiding accidental reliance on shared instance state.
- Around line 15-37: Add structured error handling around the external GitHub
API calls in the GitHub integration so request-thread failures don’t escape as
unhandled 500s. In the methods that call PyGithub, especially fetch_issues, and
anywhere create_comment is used, wrap get_repo, get_issues, and comment creation
in a try/except that catches GitHub/PyGithub/network/rate-limit/auth failures
and returns a controlled error or logs context. Use the existing GitHub class
methods as the place to centralize this, and ensure the webhook path handles
these failures gracefully instead of propagating exceptions.
In `@app/db/ingest.py`:
- Line 13: The variable name in the ingestion logic is misleading because
`uncleaned_issues` actually stores the raw issue records loaded from and
persisted to `data/issues.json`. Rename it to something clearer like
`raw_issues` in the `ingest` flow so the intent is obvious, and update any
nearby references in the same scope to match.
In `@app/ml/clean.py`:
- Line 3: Module-level instantiation of Embedder is loading the
SentenceTransformer eagerly on import, so move this initialization out of the
top level in clean_issue/clean.py. Refactor Embedder usage to support lazy
creation or dependency injection, and update the callers that use embedder so
the model is only loaded when embedding is actually needed.
In `@app/ml/embedder.py`:
- Around line 3-9: The Embedder class currently loads
SentenceTransformer("all-MiniLM-L6-v2") in every __init__ call, causing
redundant model loads across duplicate.py, test.py, and ingestion. Refactor
Embedder so the SentenceTransformer instance is created once and shared, ideally
via a module-level singleton or cached factory used by Embedder.__init__ and
generate_embedding, and update the call sites to reuse the same Embedder
instance instead of constructing new ones repeatedly.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 3e1bbede-441c-4408-a2d0-3cb0a21af05d
📒 Files selected for processing (14)
.env.example.gitignoreREADME.mdapp/api/webhooks.pyapp/config.pyapp/core/github.pyapp/db/ingest.pyapp/db/vector.pyapp/main.pyapp/ml/clean.pyapp/ml/duplicate.pyapp/ml/embedder.pyapp/test.pyrequirements.txt
| GITHUB_WEBHOOK_SECRET= | ||
| GITHUB_TOKEN= | ||
| REPO_NAME= #Enter repo from where you want to fetch issues | ||
| SIMILARITY_THRESHOLD= | ||
| MY_REPO_NAME= #Enter repo for which you want to use | ||
|
|
||
| GITHUB_TOKEN=your_token_here | ||
| GITHUB_WEBHOOK_SECRET=your_secret_here | ||
| REPO_NAME=OpenLake/your-repo | ||
| TARGET_REPO=your-test-repo | ||
| SIMILARITY_THRESHOLD=0.85 No newline at end of file |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Align the example with the actual env contract.
This file has two conflicting key blocks, and it never documents SOURCE_REPO, which app/config.py reads. New contributors will copy an incomplete/ambiguous config.
♻️ Suggested cleanup
-GITHUB_WEBHOOK_SECRET=
-GITHUB_TOKEN=
-REPO_NAME= `#Enter` repo from where you want to fetch issues
-SIMILARITY_THRESHOLD=
-MY_REPO_NAME= `#Enter` repo for which you want to use
-
GITHUB_TOKEN=your_token_here
GITHUB_WEBHOOK_SECRET=your_secret_here
-REPO_NAME=OpenLake/your-repo
+SOURCE_REPO=OpenLake/your-repo
TARGET_REPO=your-test-repo
SIMILARITY_THRESHOLD=0.85As per the app/config.py snippet, the app loads GITHUB_WEBHOOK_SECRET, GITHUB_TOKEN, TARGET_REPO, SIMILARITY_THRESHOLD, and SOURCE_REPO.
📝 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.
| GITHUB_WEBHOOK_SECRET= | |
| GITHUB_TOKEN= | |
| REPO_NAME= #Enter repo from where you want to fetch issues | |
| SIMILARITY_THRESHOLD= | |
| MY_REPO_NAME= #Enter repo for which you want to use | |
| GITHUB_TOKEN=your_token_here | |
| GITHUB_WEBHOOK_SECRET=your_secret_here | |
| REPO_NAME=OpenLake/your-repo | |
| TARGET_REPO=your-test-repo | |
| SIMILARITY_THRESHOLD=0.85 | |
| GITHUB_TOKEN=your_token_here | |
| GITHUB_WEBHOOK_SECRET=your_secret_here | |
| SOURCE_REPO=OpenLake/your-repo | |
| TARGET_REPO=your-test-repo | |
| SIMILARITY_THRESHOLD=0.85 |
🧰 Tools
🪛 dotenv-linter (4.0.0)
[warning] 2-2: [UnorderedKey] The GITHUB_TOKEN key should go before the GITHUB_WEBHOOK_SECRET key
(UnorderedKey)
[warning] 3-3: [SpaceCharacter] The line has spaces around equal sign
(SpaceCharacter)
[warning] 3-3: [ValueWithoutQuotes] This value needs to be surrounded in quotes
(ValueWithoutQuotes)
[warning] 5-5: [SpaceCharacter] The line has spaces around equal sign
(SpaceCharacter)
[warning] 5-5: [TrailingWhitespace] Trailing whitespace detected
(TrailingWhitespace)
[warning] 5-5: [UnorderedKey] The MY_REPO_NAME key should go before the REPO_NAME key
(UnorderedKey)
[warning] 5-5: [ValueWithoutQuotes] This value needs to be surrounded in quotes
(ValueWithoutQuotes)
[warning] 7-7: [DuplicatedKey] The GITHUB_TOKEN key is duplicated
(DuplicatedKey)
[warning] 8-8: [DuplicatedKey] The GITHUB_WEBHOOK_SECRET key is duplicated
(DuplicatedKey)
[warning] 9-9: [DuplicatedKey] The REPO_NAME key is duplicated
(DuplicatedKey)
[warning] 11-11: [DuplicatedKey] The SIMILARITY_THRESHOLD key is duplicated
(DuplicatedKey)
[warning] 11-11: [EndingBlankLine] No blank line at the end of the file
(EndingBlankLine)
[warning] 11-11: [UnorderedKey] The SIMILARITY_THRESHOLD key should go before the TARGET_REPO key
(UnorderedKey)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In @.env.example around lines 1 - 11, The env example is inconsistent with the
real config contract and duplicates keys, so clean up the file to show one
canonical set of variables only. Update the example to match what app/config.py
reads by documenting GITHUB_WEBHOOK_SECRET, GITHUB_TOKEN, TARGET_REPO,
SIMILARITY_THRESHOLD, and SOURCE_REPO, and remove the conflicting
REPO_NAME/MY_REPO_NAME block so contributors see a single unambiguous template.
| result = detect_duplicate(issue_text) | ||
| print("Duplicate result:", result) | ||
|
|
||
| if result and result["duplicate"]: | ||
| github.comment_issue( | ||
| payload["issue"]["number"], | ||
|
|
||
| f""" | ||
| Possible duplicate issue detected. | ||
|
|
||
| Similar issue: | ||
| {result['issue']['url']} | ||
|
|
||
| Similarity: | ||
| {result['similarity']:.2f} | ||
| """ | ||
| ) |
There was a problem hiding this comment.
🚀 Performance & Scalability | 🟠 Major | ⚡ Quick win
Blocking work runs on the event loop.
detect_duplicate (model encode + Chroma query) and github.comment_issue (synchronous PyGithub HTTP calls) are blocking, but this is an async handler. They will stall the event loop and degrade concurrency under load. Offload to a thread (e.g. await run_in_threadpool(...)) or a background task.
Proposed change
- result = detect_duplicate(issue_text)
+ from starlette.concurrency import run_in_threadpool
+ result = await run_in_threadpool(detect_duplicate, issue_text)
print("Duplicate result:", result)
if result and result["duplicate"]:
- github.comment_issue(
- payload["issue"]["number"],
- ...
- )
+ await run_in_threadpool(
+ github.comment_issue,
+ payload["issue"]["number"],
+ comment_body,
+ )🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@app/api/webhooks.py` around lines 33 - 49, The async webhook handler is
calling blocking work directly, which can stall the event loop and hurt
concurrency; in the webhook flow around detect_duplicate and
github.comment_issue, move both the duplicate detection and the PyGithub issue
comment call off the event loop using a threadpool or background task. Update
the handler in app/api/webhooks.py so the logic around
detect_duplicate(payload["issue"]["body"]) and github.comment_issue(...) is
awaited through an async-safe offload path, keeping the async request handler
non-blocking.
There was a problem hiding this comment.
Actionable comments posted: 2
♻️ Duplicate comments (1)
README.md (1)
261-268: 📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick winRemove the trailing merge-conflict markers.
The README still ends with unresolved conflict artifacts, which leaves the docs in a conflicted state and should block merge.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@README.md` around lines 261 - 268, The README still contains unresolved merge-conflict artifacts at the end, so remove the leftover conflict marker lines from the document and leave only the intended final content. Check the trailing section of README.md and clean out the stray symbols so the file is no longer in a conflicted state.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@app/config.py`:
- Line 10: Validate the SIMILARITY_THRESHOLD setting in app/config.py before it
is consumed by detect_duplicate(); make sure the value is constrained to the 0–1
range and falls back to a safe default if the environment variable is missing or
invalid. Update the config initialization around SIMILARITY_THRESHOLD so
downstream duplicate checking cannot be broken by 0, negative, or >1 values.
In `@app/ml/clean.py`:
- Around line 20-27: The cleaned issue payload and ingestion code are out of
sync: clean_issue() now returns an "embedding" field, but the ingestion path in
app/db/ingest.py still expects cleaned["vector"]. Update the schema to use one
consistent key across both places, either by changing clean_issue() to return
"vector" or by updating the ingestion logic that consumes clean_issue() to read
"embedding" instead. Keep the fix localized around clean_issue() and the ingest
flow that persists to ChromaDB.
---
Duplicate comments:
In `@README.md`:
- Around line 261-268: The README still contains unresolved merge-conflict
artifacts at the end, so remove the leftover conflict marker lines from the
document and leave only the intended final content. Check the trailing section
of README.md and clean out the stray symbols so the file is no longer in a
conflicted state.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 5a1a2a4e-0320-4c85-b005-0536dc701467
📒 Files selected for processing (12)
.env.example.gitignoreREADME.mdapp/api/webhooks.pyapp/config.pyapp/core/github.pyapp/db/ingest.pyapp/db/vector.pyapp/ml/clean.pyapp/ml/duplicate.pyapp/ml/embedder.pyapp/test.py
💤 Files with no reviewable changes (1)
- .env.example
✅ Files skipped from review due to trivial changes (1)
- .gitignore
🚧 Files skipped from review as they are similar to previous changes (6)
- app/test.py
- app/db/vector.py
- app/ml/embedder.py
- app/ml/duplicate.py
- app/db/ingest.py
- app/core/github.py
Summary by CodeRabbit
/healthendpoint for service monitoring.pingrequests are handled explicitly.