Skip to content

Enhance Civic Intelligence Engine with Delta Tracking and Spike Detection#482

Open
RohanExploit wants to merge 4 commits intomainfrom
civic-intelligence-refinement-4048902690144677027
Open

Enhance Civic Intelligence Engine with Delta Tracking and Spike Detection#482
RohanExploit wants to merge 4 commits intomainfrom
civic-intelligence-refinement-4048902690144677027

Conversation

@RohanExploit
Copy link
Owner

@RohanExploit RohanExploit commented Feb 26, 2026

Implemented the "Daily Civic Intelligence Refinement Engine" improvements as requested. This includes calculating the day-over-day change in the Civic Intelligence Index and smarter detection of emerging concerns based on sudden spikes in category volume rather than just total count.

Changes:

  • Modified backend/civic_intelligence.py:
    • Added logic to load the previous snapshot and calculate score_delta.
    • Implemented spike detection to identify the "Top Emerging Concern".
    • Updated the snapshot structure to include these new metrics.
  • Updated CIVIC_INTELLIGENCE.md to reflect the new algorithm and data points.
  • Created backend/tests/test_civic_intelligence_delta.py to test the new logic with mocks.

The system now provides more actionable daily insights by highlighting sudden trends and tracking overall performance improvement/decline.


PR created automatically by Jules for task 4048902690144677027 started by @RohanExploit


Summary by cubic

Adds day-over-day Civic Intelligence score delta and spike-based emerging concern detection to surface sudden trends. Fixes Render deploys by using a no-cache build script and pointing render.yaml at it.

  • New Features

    • Compute score_delta from the previous snapshot; round score to 0.1; default delta to 0.0 when no prior snapshot exists.
    • Detect spikes (>50% and >5), store spikes and top_spike_category; emerging concern prefers spike, otherwise highest volume; docs, snapshot schema, and tests updated.
  • Dependencies

    • Simplify requirements-render: rely on scikit-learn wheels (drop explicit numpy/scipy/joblib).
    • Use pip --no-cache-dir in render-build.sh and set render.yaml buildCommand to that script to prevent Render install OOM/disk issues.

Written for commit 7f39099. Summary will update on new commits.

Summary by CodeRabbit

  • New Features

    • Civic Intelligence Index now shows a daily score delta and surfaces the top emerging concern by spike (falls back to highest volume).
    • Daily snapshots and trend outputs now include the score delta and identified top spike category.
  • Tests

    • Added unit tests covering delta calculation, spike-based emerging concern selection, and behavior with/without previous snapshots.
  • Documentation

    • Updated Civic Intelligence docs to reflect the delta and trend output changes.

- Enhanced `CivicIntelligenceEngine` to calculate index delta from previous day.
- Refined `Top Emerging Concern` logic to prioritize category spikes (>50% increase) over raw volume.
- Updated `CIVIC_INTELLIGENCE.md` documentation.
- Added comprehensive unit tests in `backend/tests/test_civic_intelligence_delta.py`.
Copilot AI review requested due to automatic review settings February 26, 2026 19:04
@netlify
Copy link

netlify bot commented Feb 26, 2026

Deploy Preview for fixmybharat canceled.

Name Link
🔨 Latest commit 7f39099
🔍 Latest deploy log https://app.netlify.com/projects/fixmybharat/deploys/69a09dcf44e1b8000898dc44

@github-actions
Copy link

🙏 Thank you for your contribution, @RohanExploit!

PR Details:

Quality Checklist:
Please ensure your PR meets the following criteria:

  • Code follows the project's style guidelines
  • Self-review of code completed
  • Code is commented where necessary
  • Documentation updated (if applicable)
  • No new warnings generated
  • Tests added/updated (if applicable)
  • All tests passing locally
  • No breaking changes to existing functionality

Review Process:

  1. Automated checks will run on your code
  2. A maintainer will review your changes
  3. Address any requested changes promptly
  4. Once approved, your PR will be merged! 🎉

Note: The maintainers will monitor code quality and ensure the overall project flow isn't broken.

@coderabbitai
Copy link

coderabbitai bot commented Feb 26, 2026

📝 Walkthrough

Walkthrough

Adds spike-detection to trend analysis, records the top spike category, and computes a daily civic index delta by comparing today's score to the previous snapshot; the daily snapshot schema and outputs now include score_delta and top_spike_category/top_emerging_concern.

Changes

Cohort / File(s) Summary
Documentation
CIVIC_INTELLIGENCE.md
Documents new Top Emerging Concern rule (highest % increase fallback to highest volume) and inclusion of score delta in daily output and data schema.
Core Civic Intelligence Logic
backend/civic_intelligence.py
Adds per-category spike calculations (max_spike_increase, top_spike_category), threads top_spike_category into trends and snapshots, updates _calculate_index signature to accept previous_snapshot and returns score_delta alongside score and top_emerging_concern; run_daily_cycle passes previous snapshot and persists spike/delta fields.
Unit Tests
backend/tests/test_civic_intelligence_delta.py
New tests covering index delta and top emerging concern with and without a previous snapshot; mock DB, trend analyzer, adaptive weights, file I/O, and assert snapshot contents including civic_index.score_delta and top_emerging_concern.
Dependencies
backend/requirements-render.txt
Adds scipy and joblib to backend rendering requirements.

Sequence Diagram

sequenceDiagram
    participant Engine as CivicIntelligenceEngine
    participant DB as Database
    participant TrendAnalyzer as TrendAnalyzer
    participant Snapshot as SnapshotStorage

    Engine->>DB: Query issues, audits, grievances (24h)
    DB-->>Engine: Return current data
    Engine->>TrendAnalyzer: Analyze trends (distributions, spikes)
    TrendAnalyzer-->>Engine: Return category_distribution & spikes

    Engine->>Engine: Compute per-category increases<br/>(handle prev_count==0 as surge)
    Engine->>Engine: Select top_spike_category or fallback by volume

    Engine->>DB: Retrieve previous_snapshot (if exists)
    DB-->>Engine: Return previous_snapshot

    Engine->>Engine: Calculate civic index score
    Engine->>Engine: Compute score_delta = score - previous_score (or 0)

    Engine->>Snapshot: Persist snapshot with score, score_delta, top_spike_category/top_emerging_concern
    Snapshot-->>Engine: Snapshot persisted
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • PR #451: Prior work introducing the CivicIntelligenceEngine that this change extends by modifying index calculation and snapshot handling.
  • PR #463: Earlier changes to spike detection and snapshot persistence in the same civic_intelligence pipeline; strongly related to the updated top_spike_category and trend fields.

Poem

🐰 I watched the numbers hop and climb,

A spike! a tale of changing time,
From yesterday the delta sings,
The top concern on anxious wings,
I nibble data, celebrate the sign 🥕

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 28.57% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the main changes: delta tracking (day-over-day score comparison) and spike detection (emerging concern identification), which are the primary objectives of this PR.
Description check ✅ Passed The PR description is mostly complete with clear details on implementation and changes, but lacks formal sections from the template (Type of Change, Testing Done, Checklist).

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch civic-intelligence-refinement-4048902690144677027

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (2)
backend/civic_intelligence.py (1)

82-88: top_spike_category may be set for non-spike categories.

The tracking at lines 83-85 updates top_spike_category for any category with a positive increase, even if it doesn't meet the spike criteria (>50% increase AND >5 volume). This means top_spike_category could reference a category that isn't actually in the spikes list.

If the intent is to only select from actual spikes, the tracking should be conditional:

♻️ Proposed fix to only track actual spikes
-                # Track the highest spike for "Emerging Concern"
-                if increase > max_spike_increase:
-                    max_spike_increase = increase
-                    top_spike_category = category
+                # Track the highest spike for "Emerging Concern" (only if it qualifies as a spike)
+                if category in spikes or (prev_count == 0 and count > 5):
+                    if increase > max_spike_increase:
+                        max_spike_increase = increase
+                        top_spike_category = category

Alternatively, if the current behavior is intentional (highest increase regardless of spike status), consider updating the documentation to clarify this.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@backend/civic_intelligence.py` around lines 82 - 88, The code updates
max_spike_increase and top_spike_category for any positive increase even when
the category doesn't meet the spike criteria; change the update logic in the
block that computes spikes (using symbols spikes, increase, category,
max_spike_increase, top_spike_category) so you only assign max_spike_increase
and top_spike_category if the current category passes the spike test (e.g.,
increase > 0.5 AND previous_volume > 5, or whatever exact spike condition is
used to append to spikes), otherwise leave top_spike_category unchanged (or set
to None if no actual spikes found).
backend/tests/test_civic_intelligence_delta.py (1)

163-164: Misleading test comment.

The comment states "no spike detection base, so fallback to max volume", but this isn't accurate. When there's no previous snapshot:

  • previous_dist is {}
  • prev_count for "Water" is 0
  • Since prev_count == 0 and count > 5, "Water" is added to spikes with increase = float('inf') (lines 78-80 in civic_intelligence.py)
  • top_spike_category is set to "Water" via spike tracking, not the fallback logic

The assertion is correct, but the comment should reflect the actual code path.

📝 Suggested comment fix
-    # Since no previous snapshot, no spike detection base, so fallback to max volume
+    # With no previous snapshot, "Water" is detected as a new surge (count > 5, prev_count == 0)
+    # and becomes top_spike_category with infinite increase
     assert index_data['top_emerging_concern'] == "Water"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@backend/tests/test_civic_intelligence_delta.py` around lines 163 - 164,
Update the misleading test comment above the assertion that "Water" is
top_emerging_concern to reflect the actual spike-detection path: explain that
with an empty previous_dist (prev_count == 0) the code in civic_intelligence.py
adds "Water" to spikes with increase = float('inf') (the logic around prev_count
handling and lines where increase is set to inf), so top_spike_category becomes
"Water" via spike tracking rather than via a fallback-to-max-volume branch; keep
the assertion unchanged but replace the comment to describe this spike-based
determination.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@backend/civic_intelligence.py`:
- Around line 82-88: The code updates max_spike_increase and top_spike_category
for any positive increase even when the category doesn't meet the spike
criteria; change the update logic in the block that computes spikes (using
symbols spikes, increase, category, max_spike_increase, top_spike_category) so
you only assign max_spike_increase and top_spike_category if the current
category passes the spike test (e.g., increase > 0.5 AND previous_volume > 5, or
whatever exact spike condition is used to append to spikes), otherwise leave
top_spike_category unchanged (or set to None if no actual spikes found).

In `@backend/tests/test_civic_intelligence_delta.py`:
- Around line 163-164: Update the misleading test comment above the assertion
that "Water" is top_emerging_concern to reflect the actual spike-detection path:
explain that with an empty previous_dist (prev_count == 0) the code in
civic_intelligence.py adds "Water" to spikes with increase = float('inf') (the
logic around prev_count handling and lines where increase is set to inf), so
top_spike_category becomes "Water" via spike tracking rather than via a
fallback-to-max-volume branch; keep the assertion unchanged but replace the
comment to describe this spike-based determination.

ℹ️ Review info

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 169ed20 and 78d1d80.

📒 Files selected for processing (3)
  • CIVIC_INTELLIGENCE.md
  • backend/civic_intelligence.py
  • backend/tests/test_civic_intelligence_delta.py

Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 issue found across 3 files

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="backend/civic_intelligence.py">

<violation number="1" location="backend/civic_intelligence.py:83">
P2: Top emerging concern is selected from any positive increase, even if it fails the spike criteria (count <= 5 or increase <= 0.5). This can incorrectly highlight low-volume/non-spike categories. Restrict the max-spike tracking to the same spike criteria.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

spikes.append(category) # New surge

# Track the highest spike for "Emerging Concern"
if increase > max_spike_increase:
Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot Feb 26, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: Top emerging concern is selected from any positive increase, even if it fails the spike criteria (count <= 5 or increase <= 0.5). This can incorrectly highlight low-volume/non-spike categories. Restrict the max-spike tracking to the same spike criteria.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At backend/civic_intelligence.py, line 83:

<comment>Top emerging concern is selected from any positive increase, even if it fails the spike criteria (count <= 5 or increase <= 0.5). This can incorrectly highlight low-volume/non-spike categories. Restrict the max-spike tracking to the same spike criteria.</comment>

<file context>
@@ -63,17 +63,29 @@ def run_daily_cycle(self):
                      spikes.append(category) # New surge
 
+                # Track the highest spike for "Emerging Concern"
+                if increase > max_spike_increase:
+                    max_spike_increase = increase
+                    top_spike_category = category
</file context>
Suggested change
if increase > max_spike_increase:
if count > 5 and increase > 0.5 and increase > max_spike_increase:
Fix with Cubic

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR enhances the Civic Intelligence Engine by adding day-over-day delta tracking and intelligent spike detection for emerging civic concerns. The system now calculates the daily change in the Civic Intelligence Index score and identifies categories with sudden volume increases rather than just selecting the highest-volume category.

Changes:

  • Added delta calculation to track civic intelligence score changes between daily snapshots
  • Implemented percentage-based spike detection to identify emerging concerns with >50% increases and volume >5
  • Enhanced test coverage with new delta-specific test cases

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 8 comments.

File Description
backend/civic_intelligence.py Added spike detection loop (lines 65-88) and delta calculation (lines 217-223); modified _calculate_index to accept previous_snapshot parameter
backend/tests/test_civic_intelligence_delta.py New test file with two comprehensive tests covering delta calculation with and without previous snapshots
CIVIC_INTELLIGENCE.md Updated documentation to describe spike prioritization, delta calculation, and new output fields

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +79 to 80
increase = float('inf') # Infinite increase
spikes.append(category) # New surge
Copy link

Copilot AI Feb 26, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is inconsistent indentation. This line uses spaces that differ from the surrounding code's indentation pattern, which could cause syntax errors or maintenance issues. The line should be aligned with the code block at the same level (lines 76-77 and line 79).

Suggested change
increase = float('inf') # Infinite increase
spikes.append(category) # New surge
increase = float('inf') # Infinite increase
spikes.append(category) # New surge

Copilot uses AI. Check for mistakes.

score_delta = 0.0
if previous_score is not None:
score_delta = round(score - previous_score, 1)
Copy link

Copilot AI Feb 26, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is inconsistent indentation. This line uses spaces that differ from the surrounding code's indentation pattern, which could cause syntax errors or maintenance issues. The line should be aligned with line 222 at the same indentation level.

Suggested change
score_delta = round(score - previous_score, 1)
score_delta = round(score - previous_score, 1)

Copilot uses AI. Check for mistakes.
Comment on lines 65 to +88
spikes = []
max_spike_increase = 0.0
top_spike_category = None

for category, count in current_dist.items():
prev_count = previous_dist.get(category, 0)
# Spike definition: > 50% increase AND significant volume (> 5)
if prev_count > 0 and count > 5:
increase = 0.0

if prev_count > 0:
increase = (count - prev_count) / prev_count
if increase > 0.5:
# Spike definition: > 50% increase AND significant volume (> 5)
if count > 5 and increase > 0.5:
spikes.append(category)
elif prev_count == 0 and count > 5:
increase = float('inf') # Infinite increase
spikes.append(category) # New surge

# Track the highest spike for "Emerging Concern"
if increase > max_spike_increase:
max_spike_increase = increase
top_spike_category = category

trends['spikes'] = spikes
trends['top_spike_category'] = top_spike_category
Copy link

Copilot AI Feb 26, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When current_dist is empty (no categories), the spike detection loop never executes, leaving top_spike_category as None. This is handled correctly by the fallback logic in _calculate_index (lines 229-234), but consider adding a test case to verify this scenario works correctly when both previous and current distributions are empty.

Copilot uses AI. Check for mistakes.
Comment on lines +79 to 80
increase = float('inf') # Infinite increase
spikes.append(category) # New surge
Copy link

Copilot AI Feb 26, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Setting increase to float('inf') for new categories (prev_count == 0 and count > 5) means they will always be selected as top_spike_category over any existing category increases, regardless of how dramatic those increases are. This may not reflect the intended prioritization. Consider using a large but finite value (e.g., count itself or a multiplier like count * 10) to allow comparison with dramatic increases in existing categories, or document this as intentional behavior if new categories should always take priority.

Suggested change
increase = float('inf') # Infinite increase
spikes.append(category) # New surge
# New category with significant volume; treat as a strong spike
increase = float(count)
spikes.append(category) # New surge

Copilot uses AI. Check for mistakes.
Comment on lines +105 to +107
# Check Emerging Concern
# Fire increased from 2 to 10 (>50% and >5 items) -> Should be top spike
assert index_data['top_emerging_concern'] == "Fire"
Copy link

Copilot AI Feb 26, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The test doesn't cover the scenario where a new category appears with significant volume (prev_count == 0 and count > 5), which triggers the infinite increase logic. Consider adding a test case where the previous snapshot has {"Fire": 2} and the current has {"Fire": 10, "NewCategory": 8} to verify that the new category with infinite increase is correctly prioritized (or not, depending on intended behavior).

Copilot uses AI. Check for mistakes.
Comment on lines +82 to +85
# Track the highest spike for "Emerging Concern"
if increase > max_spike_increase:
max_spike_increase = increase
top_spike_category = category
Copy link

Copilot AI Feb 26, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The logic for tracking the highest spike for "Emerging Concern" includes all categories, not just those that qualify as spikes. This means a category with a small count (e.g., count <= 5) could be selected as the top spike even though it doesn't meet the spike criteria. For example, if a category goes from 1 to 2 (100% increase), it would have a higher increase than a category going from 10 to 20 (100% vs a proper spike), but wouldn't qualify as a spike due to low volume. Consider only tracking max_spike_increase and top_spike_category when the category actually qualifies as a spike (either lines 77 or 80).

Copilot uses AI. Check for mistakes.
Comment on lines +105 to +107
# Check Emerging Concern
# Fire increased from 2 to 10 (>50% and >5 items) -> Should be top spike
assert index_data['top_emerging_concern'] == "Fire"
Copy link

Copilot AI Feb 26, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The test doesn't cover the edge case where categories have percentage increases but don't meet the volume threshold (count <= 5). Consider adding a test case where a category has a high percentage increase but low volume (e.g., going from 1 to 3) alongside a category with a valid spike (e.g., from 5 to 10) to ensure top_emerging_concern correctly prioritizes qualified spikes over unqualified increases.

Copilot uses AI. Check for mistakes.
Comment on lines +79 to 80
increase = float('inf') # Infinite increase
spikes.append(category) # New surge
Copy link

Copilot AI Feb 26, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is inconsistent indentation. This line uses spaces that differ from the surrounding code's indentation pattern, which could cause syntax errors or maintenance issues. The line should be aligned with the code block at the same level (lines 76-77).

Suggested change
increase = float('inf') # Infinite increase
spikes.append(category) # New surge
increase = float('inf') # Infinite increase
spikes.append(category) # New surge

Copilot uses AI. Check for mistakes.
- Added `scipy` and `joblib` to `backend/requirements-render.txt`.
- These are required dependencies for `scikit-learn`'s DBSCAN implementation used in `TrendAnalyzer`.
- Prevents `ImportError` or runtime failures in the production environment.
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
backend/requirements-render.txt (1)

24-25: Consider adding version constraints for scipy and joblib.

While scipy and joblib are typically installed automatically as transitive dependencies of scikit-learn, the explicit listing indicates your deployment environment required them declared directly (likely due to dependency resolution constraints or a non-standard installation method). That's a valid pragmatic solution.

However, explicitly adding dependencies without version constraints introduces reproducibility and compatibility risks. Since scikit-learn also lacks a version pin, consider pinning compatible versions:

scipy>=1.10.0,<2.0.0
joblib>=1.3.0,<2.0.0

This ensures consistent behavior across deployments while maintaining flexibility for scikit-learn updates.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@backend/requirements-render.txt` around lines 24 - 25, Update the explicit
package pins for scipy and joblib in requirements-render.txt to include
compatible version constraints (e.g., scipy>=1.10.0,<2.0.0 and
joblib>=1.3.0,<2.0.0) so installations are reproducible and avoid unexpected
breaks from major releases; modify the existing scipy and joblib entries to the
pinned ranges and verify they remain compatible with your scikit-learn version
by running a quick install/test in the deployment environment.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@backend/requirements-render.txt`:
- Around line 24-25: Update the explicit package pins for scipy and joblib in
requirements-render.txt to include compatible version constraints (e.g.,
scipy>=1.10.0,<2.0.0 and joblib>=1.3.0,<2.0.0) so installations are reproducible
and avoid unexpected breaks from major releases; modify the existing scipy and
joblib entries to the pinned ranges and verify they remain compatible with your
scikit-learn version by running a quick install/test in the deployment
environment.

ℹ️ Review info

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 78d1d80 and 7cb7377.

📒 Files selected for processing (1)
  • backend/requirements-render.txt

- Updated `backend/requirements-render.txt`: Removed explicit `numpy`, `scipy`, `joblib` (relying on `scikit-learn` wheel resolution) to simplify dependency graph.
- Updated `render-build.sh`: Added `--no-cache-dir` to `pip install` to prevent OOM/disk errors on Render free tier.
- This addresses the deployment failure caused by heavy dependency installation.
@github-actions
Copy link

🔍 Quality Reminder

Thanks for the updates! Please ensure:
- Your changes don't break existing functionality
- All tests still pass
- Code quality standards are maintained

*The maintainers will verify that the overall project flow remains intact.*

- Updated `render.yaml` to use `./render-build.sh` as the build command.
- This ensures the optimized `pip install --no-cache-dir` command is actually executed, preventing memory issues during build.
- Made `render-build.sh` executable.
- Verified `requirements-render.txt` is optimized.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants