Skip to content

feat: flatmates matching/profiles enhancements and property search updates#14

Merged
saksham1991999 merged 2 commits into
mainfrom
feature/flatmates-search-updates
May 16, 2026
Merged

feat: flatmates matching/profiles enhancements and property search updates#14
saksham1991999 merged 2 commits into
mainfrom
feature/flatmates-search-updates

Conversation

@RaviSahu1520
Copy link
Copy Markdown
Collaborator

@RaviSahu1520 RaviSahu1520 commented May 16, 2026

Summary

  • Add outgoing likes endpoint and service to track profiles the current user has liked
  • Exclude already-swiped profiles from discoverable list to prevent duplicate suggestions
  • Harden property search result mapping with type-safe float conversions and error handling
  • Tune DB pool sizes for better production performance (pool 3->5, timeout 10->15s, recycle 300->180s)

Changes

  • New endpoint: GET /flatmates/outgoing-likes - returns profiles the user has liked
  • Matching service: added list_outgoing_likes function with proper blocked user filtering
  • Profile discovery: filters out users already swiped by current user
  • Property search: safer extraction of distance_km, vector_distance, relevance_score with float() conversion and exception handling
  • Config: increased DB pool size and timeout, reduced recycle interval for PgBouncer compatibility

Summary by cubic

Adds an endpoint to view profiles you’ve liked and updates discovery to hide already-swiped users. Fixes an N+1 in outgoing likes, improves property search casting with debug logging, and tunes DB pool settings for steadier production performance.

  • New Features

    • GET /flatmates/outgoing-likes returns profiles the current user liked, with block filtering and paging.
    • Discovery excludes users you’ve already swiped.
  • Refactors

    • Outgoing likes: removed N+1 by prefetching block lists; cleaned imports; use SwipeTargetType enum.
    • Property search: cast distance_km, vector_distance, relevance_score to float; log cast errors at debug.
    • DB config: pool size 5, max overflow 5, timeout 15s, recycle 180s.

Written for commit 55112a8. Summary will update on new commits. Review in cubic

Summary by CodeRabbit

  • New Features

    • Added ability for users to view their outgoing likes
  • Bug Fixes & Improvements

    • Improved profile discovery to exclude previously swiped profiles
    • Enhanced search result handling for robustness
    • Optimized database connection pooling for better performance

Review Change Stack

Greptile Summary

This PR adds a GET /flatmates/outgoing-likes endpoint so users can see who they've liked, filters out already-swiped profiles from discovery, hardens property-search row extraction with float() casts and try/except, and tunes DB pool settings for production.

  • New outgoing-likes endpoint: list_outgoing_likes correctly batches block lookups into two queries rather than per-row calls, avoiding the N+1 pattern that still exists in list_incoming_likes.
  • Discovery filtering: swiped_subq is a SQL subquery applied at the DB level, so pagination of discoverable profiles remains correct; the filter intentionally excludes both likes and dislikes.
  • Property-search hardening: float() wrapping and exception handling prevents score-field parse errors from breaking the response; the prop = row[0] fast path is a reasonable optimization for the common case.

Confidence Score: 5/5

Safe to merge — all changes are additive or defensive, with no correctness regressions on existing paths.

The new outgoing-likes function correctly batches block queries, the discovery filter is applied as a SQL subquery so main-list pagination is unaffected, and the property-search hardening only adds safety around score-field extraction. The only notable trade-off is that paginated block-filtering in Python can return short pages, but that is a pre-existing pattern also present in list_incoming_likes and not a new regression.

app/services/flatmates/matching.py — the pagination behaviour under block filtering is worth a follow-up, particularly if blocked-user counts grow in production.

Important Files Changed

Filename Overview
app/services/flatmates/matching.py Adds list_outgoing_likes with batched block queries; pagination applied before block filtering can cause pages to silently return fewer items than requested when blocked users are present.
app/services/flatmates/profiles.py Adds SQL subquery to exclude all previously-swiped profiles from discovery; uses SwipeTargetType.user.value correctly and applies filter at DB level so pagination is unaffected.
app/services/property/search.py Hardens row-extraction with row[0] fast path, float() casts, and try/except with debug logging; bad score values are now silently skipped without breaking the property list.
app/api/api_v1/endpoints/flatmates.py Adds /outgoing-likes endpoint with standard query params; response_model reuse concern already flagged in a previous thread.
app/core/config.py Increases pool_size/max_overflow to 5, timeout to 15s, reduces recycle to 180s for PgBouncer compatibility; straightforward config change.
app/services/flatmates/init.py Exports list_outgoing_likes in both import and all; no issues.

Sequence Diagram

sequenceDiagram
    participant Client
    participant Router as flatmates.py (router)
    participant SvcOut as list_outgoing_likes
    participant SvcDisc as list_discoverable_profiles
    participant DB

    Client->>Router: "GET /outgoing-likes?limit&offset"
    Router->>SvcOut: list_outgoing_likes(db, user_id)
    SvcOut->>DB: "SELECT UserSwipe WHERE user_id=X AND is_liked=True (paged)"
    SvcOut->>DB: "SELECT blocked_user_id WHERE blocker=user_id"
    SvcOut->>DB: "SELECT blocker_user_id WHERE blocked=user_id"
    SvcOut-->>Router: filtered list[dict] (excluded_ids removed in Python)
    Router-->>Client: list[IncomingLikeSummary]

    Client->>Router: GET /discover
    Router->>SvcDisc: list_discoverable_profiles(db, user_id)
    SvcDisc->>DB: SELECT blocked/blocker ids
    SvcDisc->>DB: SELECT User WHERE id NOT IN (swiped_subq) AND id NOT IN (excluded) paged
    SvcDisc-->>Router: paginated profiles
    Router-->>Client: list[profile]
Loading

Reviews (2): Last reviewed commit: "fix: address PR review comments - import..." | Re-trigger Greptile

@chatgpt-codex-connector
Copy link
Copy Markdown

Codex usage limits have been reached for code reviews. Please check with the admins of this repo to increase the limits by adding credits.
Credits must be used to enable repository wide code reviews.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 16, 2026

📝 Walkthrough

Walkthrough

This PR introduces a new outgoing likes feature, improves user discovery filtering, optimizes database connection pooling, and hardens property search result handling. The changes add a GET /outgoing-likes endpoint, prevent already-swiped users from appearing in discovery results, adjust database pool parameters for better resource management, and make search result field assignment more defensive against edge cases.

Changes

Swipe Interaction Tracking & Outgoing Likes

Layer / File(s) Summary
Outgoing likes service implementation
app/services/flatmates/matching.py
list_outgoing_likes queries user's outgoing UserSwipe records where is_liked=True, eager-loads target user and optional context property, orders by recency, applies pagination, filters for missing targets and blocking, and returns dicts with swipe id, peer payload, context, and timestamp.
Outgoing likes API and package exports
app/services/flatmates/__init__.py, app/api/api_v1/endpoints/flatmates.py
Package re-exports list_outgoing_likes in __all__, and endpoint imports and exposes it via GET /outgoing-likes?limit&offset returning list[IncomingLikeSummary] for the authenticated user.
Discovery filtering for already-swiped users
app/services/flatmates/profiles.py
list_discoverable_profiles now builds a swiped_subq subquery selecting target user ids where the requesting user made swipes with target_type == "user", then adds User.id.notin_(swiped_subq) to filters to exclude previously swiped users.

Infrastructure & Robustness Improvements

Layer / File(s) Summary
Database connection pool tuning
app/core/config.py
Settings pool sizing updated: DB_POOL_SIZE 3→5, DB_MAX_OVERFLOW 3→5, DB_POOL_TIMEOUT 10→15s, DB_POOL_RECYCLE 300→180s.
Property search result mapping resilience
app/services/property/search.py
get_unified_properties_optimized post-query handling now safely extracts Property from varying row shapes via _mapping fallback, guards computed-field assignment with null checks and try/except protection.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

Poem

🐰 A swiper queries what hearts they've sent,
No matching twice, discovery's repent,
The pool grows wider, searches stand strong—
Small tweaks and queries, all day long! 💕

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 37.50% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the main changes: flatmates matching/profiles enhancements and property search updates, which aligns with the multiple file changes across matching, profiles, search, and config.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

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

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/flatmates-search-updates

Tip

💬 Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire org—no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-in—scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

👉 Get started


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.

@qodo-code-review
Copy link
Copy Markdown

Review Summary by Qodo

Add outgoing likes endpoint and improve profile discovery filtering

✨ Enhancement

Grey Divider

Walkthroughs

Description
• Add outgoing likes endpoint to track profiles user has liked
• Exclude already-swiped profiles from discoverable list
• Harden property search with type-safe float conversions
• Tune database pool configuration for production performance
Diagram
flowchart LR
  A["User Swipes Profile"] --> B["Record in UserSwipe"]
  B --> C["GET /outgoing-likes"]
  C --> D["list_outgoing_likes Service"]
  D --> E["Return Liked Profiles"]
  F["Profile Discovery"] --> G["Exclude Swiped Users"]
  G --> H["Cleaner Results"]
  I["Property Search"] --> J["Type-safe Float Conversion"]
  J --> K["Error Handling"]
Loading

Grey Divider

File Changes

1. app/api/api_v1/endpoints/flatmates.py ✨ Enhancement +11/-0

Add outgoing likes endpoint to API

• Import list_outgoing_likes service function
• Add new GET /outgoing-likes endpoint with pagination support
• Endpoint returns profiles user has liked using IncomingLikeSummary response model

app/api/api_v1/endpoints/flatmates.py


2. app/core/config.py ⚙️ Configuration changes +4/-4

Tune database pool configuration for production

• Increase DB_POOL_SIZE from 3 to 5 for better concurrency
• Increase DB_MAX_OVERFLOW from 3 to 5 to match pool size
• Increase DB_POOL_TIMEOUT from 10 to 15 seconds
• Reduce DB_POOL_RECYCLE from 300 to 180 seconds for PgBouncer compatibility

app/core/config.py


3. app/services/flatmates/__init__.py ✨ Enhancement +2/-0

Export outgoing likes service function

• Import list_outgoing_likes from matching module
• Export list_outgoing_likes in __all__ list

app/services/flatmates/init.py


View more (3)
4. app/services/flatmates/matching.py ✨ Enhancement +39/-0

Implement outgoing likes service function

• Implement list_outgoing_likes function to retrieve profiles user has liked
• Query UserSwipe records where is_liked is True and user_id matches current user
• Filter out blocked users using _is_blocked helper
• Return paginated list with peer payload and property context

app/services/flatmates/matching.py


5. app/services/flatmates/profiles.py ✨ Enhancement +8/-0

Exclude swiped profiles from discovery

• Import UserSwipe model to track swiped profiles
• Create subquery to identify all profiles user has already swiped
• Add filter to exclude swiped profiles from discoverable list
• Prevents duplicate profile suggestions in discovery results

app/services/flatmates/profiles.py


6. app/services/property/search.py Error handling +17/-11

Harden property search result mapping with error handling

• Add type-safe float() conversion for distance_km, vector_distance, and relevance_score
• Wrap mapping extraction in try-except block to handle conversion errors
• Improve property object detection logic with isinstance check
• Silently skip conversion on TypeError, ValueError, or KeyError

app/services/property/search.py


Grey Divider

Qodo Logo

@qodo-code-review
Copy link
Copy Markdown

qodo-code-review Bot commented May 16, 2026

Code Review by Qodo

🐞 Bugs (0) 📘 Rule violations (0) 📎 Requirement gaps (0)

Grey Divider


Action required

1. Late UserSwipe import unannotated ✓ Resolved 📘 Rule violation ⚙ Maintainability
Description
UserSwipe is imported inside list_discoverable_profiles() without the required # noqa: E402
and explanation. This breaks the project requirement that late imports be explicitly justified and
lint-suppressed for clarity and consistency.
Code

app/services/flatmates/profiles.py[69]

+    from app.models.users import UserSwipe
Evidence
PR Compliance ID 5 requires that late imports include # noqa: E402 with an explanation. The new
late import of UserSwipe is inside the function body and has no # noqa: E402 annotation or
explanation.

CLAUDE.md
app/services/flatmates/profiles.py[68-70]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
A late import (`from app.models.users import UserSwipe`) was added inside `list_discoverable_profiles()` without the required `# noqa: E402` plus an explanation comment.
## Issue Context
Repo compliance requires imports to be at the top of the file, and any unavoidable late imports must include `# noqa: E402` with an explanatory comment.
## Fix Focus Areas
- app/services/flatmates/profiles.py[68-70]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. N+1 blocked checks ✓ Resolved 🐞 Bug ➹ Performance
Description
list_outgoing_likes calls _is_blocked inside the outgoing_swipes loop, causing up to 1 extra SELECT
per swipe (up to 100) and materially increasing latency/DB load for the new endpoint.
Code

app/services/flatmates/matching.py[R335-338]

+    items: list[dict[str, Any]] = []
+    for swipe in outgoing_swipes:
+        if swipe.target_user is None or await _is_blocked(db, user_id, swipe.target_user_id):
+            continue
Evidence
The new outgoing likes implementation calls _is_blocked for each swipe row, and _is_blocked
itself executes a SQL query, producing an N+1 query pattern.

app/services/flatmates/matching.py[311-347]
app/services/flatmates/helpers.py[176-190]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`list_outgoing_likes` performs a per-row `_is_blocked(...)` DB query inside a loop, creating an N+1 query pattern that can add up to 100 extra queries per request.
### Issue Context
- New endpoint `GET /flatmates/outgoing-likes` supports `limit` up to 100.
- `_is_blocked` executes a `SELECT` each time it is called.
### Fix Focus Areas
- Batch blocked checks using a single query (e.g., fetch all blocked pairs between `user_id` and the set of `target_user_id`s), then filter in Python.
- Alternatively, push the blocked logic into the main SQL query using `NOT EXISTS`/`LEFT JOIN ... WHERE UserBlock.id IS NULL`.
### Fix Focus Areas (code references)
- app/services/flatmates/matching.py[311-347]
- app/services/flatmates/helpers.py[176-190]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Remediation recommended

3. Hardcoded target_type filter ✓ Resolved 🐞 Bug ⚙ Maintainability
Description
list_discoverable_profiles filters swiped profiles with a hardcoded string ("user") instead of using
SwipeTargetType.user.value, making the exclusion logic brittle if the canonical enum/value ever
changes and risking duplicate suggestions.
Code

app/services/flatmates/profiles.py[R81-85]

+    swiped_subq = select(UserSwipe.target_user_id).where(
+        UserSwipe.user_id == user_id,
+        UserSwipe.target_type == "user",
+        UserSwipe.target_user_id.is_not(None),
+    )
Evidence
Discovery uses a string literal for the target_type filter, while the canonical enum exists and is
used throughout matching/swipe code paths.

app/services/flatmates/profiles.py[68-102]
app/models/enums.py[93-96]
app/services/flatmates/matching.py[111-186]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`list_discoverable_profiles` hardcodes `UserSwipe.target_type == "user"` while other swipe reads/writes use `SwipeTargetType.user.value`. This inconsistency is easy to miss during refactors and can silently break the swiped-profile exclusion.
### Issue Context
- The enum value is currently `"user"`, so behavior is correct today.
- The risk is future drift (enum/value rename or normalization changes) because this location won’t be updated by type-aware refactors.
### Fix Focus Areas
- Replace the literal with `SwipeTargetType.user.value`.
- Add the appropriate import (`from app.models.enums import SwipeTargetType`) in `profiles.py`.
### Fix Focus Areas (code references)
- app/services/flatmates/profiles.py[68-102]
- app/models/enums.py[93-96]
- app/services/flatmates/matching.py[111-186]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


4. Silent search mapping failures ✓ Resolved 🐞 Bug ◔ Observability
Description
Property search now swallows float conversion errors for distance_km/vector_distance/relevance_score
without logging, which can silently drop these fields (set/leave as None) and make ranking/sorting
issues hard to diagnose.
Code

app/services/property/search.py[R599-608]

+                    try:
+                        mapping = row._mapping if hasattr(row, "_mapping") else {}
+                        if "distance_km" in mapping and mapping["distance_km"] is not None:
+                            prop.distance_km = float(mapping["distance_km"])
+                        if "vector_distance" in mapping and mapping["vector_distance"] is not None:
+                            prop.vector_distance = float(mapping["vector_distance"])
+                        if "relevance_score" in mapping and mapping["relevance_score"] is not None:
+                            prop.relevance_score = float(mapping["relevance_score"])
+                    except (TypeError, ValueError, KeyError):
+                        pass
Evidence
The new code catches conversion errors and intentionally does nothing, while these fields are typed
as floats in the Property schema—so failures will surface as missing fields rather than actionable
signals in logs/metrics.

app/services/property/search.py[588-611]
app/schemas/property.py[265-272]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The property search mapping wraps distance/relevance extraction in a try/except and does `pass` on failure. If these values are malformed, the API will silently omit them, reducing debuggability when search quality degrades.
### Issue Context
`PropertySchema` expects these fields as floats; missing/None values impact client display and troubleshooting.
### Fix Focus Areas
- Add a `logger.debug`/`logger.warning` when conversion fails (include which key failed and a safe representation of the value).
- Consider narrowing exceptions (KeyError is unnecessary since keys are checked).
- Optionally, explicitly set the affected field(s) to `None` to avoid partial stale values.
### Fix Focus Areas (code references)
- app/services/property/search.py[588-611]
- app/schemas/property.py[265-272]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Qodo Logo

Copy link
Copy Markdown

@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.

Actionable comments posted: 2

🧹 Nitpick comments (1)
app/services/flatmates/profiles.py (1)

81-85: ⚡ Quick win

Use SwipeTargetType.user.value instead of hardcoded "user" in the subquery filter.

This avoids silent breakage if enum values change and keeps filter semantics aligned with the rest of the flatmates services.

Suggested diff
 from app.models.enums import (
     FlatmatesProfileStatus,
     PropertyPurpose,
     PropertyType,
+    SwipeTargetType,
 )
@@
-        UserSwipe.target_type == "user",
+        UserSwipe.target_type == SwipeTargetType.user.value,
🤖 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/services/flatmates/profiles.py` around lines 81 - 85, Replace the
hardcoded string "user" in the UserSwipe filter with the enum value to avoid
brittle checks: update the subquery that builds swiped_subq
(select(UserSwipe.target_user_id).where(...)) to use SwipeTargetType.user.value
for the UserSwipe.target_type comparison (ensure SwipeTargetType is imported
where profiles.py references UserSwipe).
🤖 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/services/flatmates/profiles.py`:
- Line 69: Move the UserSwipe import out of the function-local/late import and
place "from app.models.users import UserSwipe" with the other top-level imports
in app/services/flatmates/profiles.py to avoid per-call import overhead and
satisfy E402; if a circular import prevents moving it, keep the late import but
add "# noqa: E402  # circular import with app.models.users; imported late to
avoid import cycle" and a short comment referencing the module that causes the
cycle so the rationale is documented.

In `@app/services/property/search.py`:
- Around line 609-610: The guard "if prop:" can let non-Property truthy values
through and the call cast(Property, prop) is SQLAlchemy's SQL cast, not a Python
type hint; replace this with an explicit runtime type check and remove the
SQLAlchemy cast: check isinstance(prop, Property) before appending to the
properties list (referencing the local variable prop and the properties list in
search.py) and simply append the prop when it is a real Property instance so
downstream code receives a real model object rather than a cast expression.

---

Nitpick comments:
In `@app/services/flatmates/profiles.py`:
- Around line 81-85: Replace the hardcoded string "user" in the UserSwipe filter
with the enum value to avoid brittle checks: update the subquery that builds
swiped_subq (select(UserSwipe.target_user_id).where(...)) to use
SwipeTargetType.user.value for the UserSwipe.target_type comparison (ensure
SwipeTargetType is imported where profiles.py references UserSwipe).
🪄 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: defaults

Review profile: CHILL

Plan: Pro

Run ID: 013ac804-df32-424d-ad29-7ae3824d71e4

📥 Commits

Reviewing files that changed from the base of the PR and between 9da34ae and 73acd4f.

📒 Files selected for processing (6)
  • app/api/api_v1/endpoints/flatmates.py
  • app/core/config.py
  • app/services/flatmates/__init__.py
  • app/services/flatmates/matching.py
  • app/services/flatmates/profiles.py
  • app/services/property/search.py

Comment thread app/services/flatmates/profiles.py Outdated
Comment thread app/services/property/search.py
Comment thread app/services/flatmates/matching.py Outdated
Comment thread app/services/flatmates/profiles.py
Comment thread app/api/api_v1/endpoints/flatmates.py
Comment thread app/services/property/search.py Outdated
Copy link
Copy Markdown

@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.

No issues found across 6 files

Auto-approved: The changes add a read-only outgoing-likes endpoint following the same pattern as existing incoming-likes, exclude already-swiped profiles from discovery to reduce duplicate suggestions, harden property search result parsing with type-safe float conversions and exception handling, and tune DB...
Re-trigger cubic

Comment thread app/services/flatmates/profiles.py Outdated
Comment thread app/services/flatmates/matching.py
@qodo-code-review
Copy link
Copy Markdown

CI Feedback 🧐

A test triggered by this PR failed. Here is an AI-generated analysis of the failure:

Action: test

Failed stage: Run tests [❌]

Failed test name: ""

Failure summary:

The GitHub Action failed because the test run had multiple test failures/errors and the coverage
threshold was not met.

Key blockers shown in the log:
- Coverage gating failure: total coverage was ~44.91% (reported as
TOTAL ... 45%), below --fail-under=90:
- ERROR: Coverage failure: total of 45 is less than
fail-under=90
- FAIL Required test coverage of 90% not reached. Total coverage: 44.91%
- Pytest
errors due to a missing fixture test_db in PM tests:
- tests/pm/test_authz.py:18fixture
'test_db' not found
- tests/pm/test_rent.py:14fixture 'test_db' not found
- Multiple failing
tests due to runtime/code issues, including:
- API blog endpoint returned 404 instead of 200:

- FAILED tests/api/test_blog_endpoints.py::TestBlogPostEndpoints::test_get_blog_post - assert 404 ==
200
- Booking cancellation endpoint uses a mocked booking without property_id:
-
app/api/api_v1/endpoints/bookings.py:167AttributeError: Mock object has no attribute
'property_id'
- PM lifecycle E2E test missing import:
- tests/e2e/test_pm_lifecycle_flow.py:34
NameError: name 'Decimal' is not defined
- Property details endpoint expects an object but
receives a dict:
- app/api/api_v1/endpoints/properties.py:350AttributeError: 'dict' object
has no attribute 'property_type'
- Integration pagination response missing page key:
-
tests/integration/test_property_search.py::...::test_paginationKeyError: 'page'
- MCP admin
tool tests fail auth requirements (unexpected AuthRequiredError), e.g.:
-
app/mcp/admin/agent_tools/properties.py:66AuthRequiredError: Please log in to list managed
properties.
- MCP user tests patch non-existent symbols (refactor mismatch), e.g.:
-
AttributeError: ... app.mcp.user.owner ... does not have the attribute 'list_managed_properties'

- AttributeError: module 'app.mcp.user.booking' has no attribute 'booking_svc'
- Property service
unit tests show mocking/await issues and missing module:
- app/services/property/crud.py:161
TypeError: object MagicMock can't be used in 'await' expression
-
app/services/property/crud.py:380ModuleNotFoundError: No module named 'app.models.visits'
- Final
pytest outcome indicates the job failed due to these issues:
- 36 failed, 1348 passed, ... 2
errors
- Process completed with exit code 1.

Relevant error logs:
1:  ##[group]Runner Image Provisioner
2:  Hosted Compute Agent
...

348:  #6 0.369 Get:6 http://deb.debian.org/debian-security bullseye-security/main amd64 Packages [455 kB]
349:  #6 0.462 Get:7 http://deb.debian.org/debian bullseye-updates/main amd64 Packages [18.8 kB]
350:  #6 0.523 Get:8 http://apt.postgresql.org/pub/repos/apt bullseye-pgdg/15 amd64 Packages [6,585 B]
351:  #6 0.527 Get:9 http://apt.postgresql.org/pub/repos/apt bullseye-pgdg/main amd64 Packages [547 kB]
352:  #6 1.446 Fetched 9,421 kB in 1s (7,235 kB/s)
353:  #6 1.446 Reading package lists...
354:  #6 1.907 Reading package lists...
355:  #6 2.358 Building dependency tree...
356:  #6 2.497 Reading state information...
357:  #6 2.632 The following additional packages will be installed:
358:  #6 2.632   binutils binutils-common binutils-x86-64-linux-gnu bzip2 clang-16 cpp cpp-10
359:  #6 2.632   dpkg-dev g++ g++-10 gcc gcc-10 git-man icu-devtools lib32gcc-s1 lib32stdc++6
360:  #6 2.632   libasan6 libatomic1 libbinutils libc-dev-bin libc6 libc6-dev libc6-i386
361:  #6 2.632   libcc1-0 libclang-common-13-dev libclang-common-16-dev libclang-cpp13
362:  #6 2.632   libclang-cpp16 libclang1-13 libclang1-16 libcrypt-dev libctf-nobfd0 libctf0
363:  #6 2.632   libcurl4 libdpkg-perl liberror-perl libffi-dev libgc1 libgcc-10-dev libgomp1
364:  #6 2.632   libicu-dev libicu67 libisl23 libitm1 libllvm16 liblsan0 libmpc3 libmpdec3
...

381:  #6 2.634   diffutils-doc python3-doc python3-tk python3-venv python3-setuptools
382:  #6 2.634   python-pygments-doc ttf-bitstream-vera python3.9-venv python3.9-doc
383:  #6 2.634   binfmt-support
384:  #6 2.634 Recommended packages:
385:  #6 2.634   llvm-13-dev fakeroot libalgorithm-merge-perl ssh-client manpages
386:  #6 2.634   manpages-dev libc-devtools libnss-nis libnss-nisplus libclang-rt-16-dev
387:  #6 2.634   libfile-fcntllock-perl liblocale-gettext-perl libgpm2 binfmt-support
388:  #6 2.634   binfmt-support | systemd
389:  #6 2.971 The following NEW packages will be installed:
390:  #6 2.971   binutils binutils-common binutils-x86-64-linux-gnu build-essential bzip2
391:  #6 2.972   clang-13 clang-16 cpp cpp-10 dpkg-dev g++ g++-10 gcc gcc-10 git git-man
392:  #6 2.972   icu-devtools lib32gcc-s1 lib32stdc++6 libasan6 libatomic1 libbinutils
393:  #6 2.972   libc-dev-bin libc6-dev libc6-i386 libcc1-0 libclang-common-13-dev
394:  #6 2.972   libclang-common-16-dev libclang-cpp13 libclang-cpp16 libclang1-13
395:  #6 2.972   libclang1-16 libcrypt-dev libctf-nobfd0 libctf0 libcurl4 libdpkg-perl
396:  #6 2.972   liberror-perl libffi-dev libgc1 libgcc-10-dev libgomp1 libicu-dev libisl23
397:  #6 2.972   libitm1 libllvm16 liblsan0 libmpc3 libmpdec3 libncurses-dev libncurses6
...

465:  #6 3.516 Get:55 http://deb.debian.org/debian-security bullseye-security/main amd64 libc6-i386 amd64 2.31-13+deb11u13 [2,618 kB]
466:  #6 3.527 Get:56 http://deb.debian.org/debian bullseye/main amd64 lib32gcc-s1 amd64 10.2.1-6 [49.4 kB]
467:  #6 3.528 Get:57 http://deb.debian.org/debian bullseye/main amd64 lib32stdc++6 amd64 10.2.1-6 [510 kB]
468:  #6 3.531 Get:58 http://deb.debian.org/debian bullseye/main amd64 libclang-common-13-dev amd64 1:13.0.1-6~deb11u1 [5,602 kB]
469:  #6 3.562 Get:59 http://deb.debian.org/debian bullseye/main amd64 llvm-13-linker-tools amd64 1:13.0.1-6~deb11u1 [1,253 kB]
470:  #6 3.570 Get:60 http://deb.debian.org/debian bullseye/main amd64 libclang1-13 amd64 1:13.0.1-6~deb11u1 [6,187 kB]
471:  #6 3.604 Get:61 http://deb.debian.org/debian bullseye/main amd64 clang-13 amd64 1:13.0.1-6~deb11u1 [123 kB]
472:  #6 3.605 Get:62 http://deb.debian.org/debian-security bullseye-security/main amd64 libicu67 amd64 67.1-7+deb11u1 [8,624 kB]
473:  #6 3.639 Get:63 http://deb.debian.org/debian-security bullseye-security/main amd64 libxml2 amd64 2.9.10+dfsg-6.7+deb11u9 [694 kB]
474:  #6 3.642 Get:64 http://deb.debian.org/debian bullseye/main amd64 libllvm16 amd64 1:16.0.6-15~deb11u2 [23.0 MB]
475:  #6 3.769 Get:65 http://deb.debian.org/debian bullseye/main amd64 libclang-cpp16 amd64 1:16.0.6-15~deb11u2 [11.5 MB]
476:  #6 3.832 Get:66 http://deb.debian.org/debian bullseye/main amd64 libclang-common-16-dev all 1:16.0.6-15~deb11u2 [683 kB]
477:  #6 3.836 Get:67 http://deb.debian.org/debian bullseye/main amd64 llvm-16-linker-tools amd64 1:16.0.6-15~deb11u2 [1,258 kB]
478:  #6 3.844 Get:68 http://deb.debian.org/debian bullseye/main amd64 libclang1-16 amd64 1:16.0.6-15~deb11u2 [6,575 kB]
479:  #6 3.882 Get:69 http://deb.debian.org/debian bullseye/main amd64 clang-16 amd64 1:16.0.6-15~deb11u2 [137 kB]
480:  #6 3.883 Get:70 http://deb.debian.org/debian bullseye/main amd64 liberror-perl all 0.17029-1 [31.0 kB]
481:  #6 3.884 Get:71 http://deb.debian.org/debian-security bullseye-security/main amd64 git-man all 1:2.30.2-1+deb11u5 [1,831 kB]
...

811:  #6 17.68 Selecting previously unselected package libclang-cpp16.
812:  #6 17.68 Preparing to unpack .../51-libclang-cpp16_1%3a16.0.6-15~deb11u2_amd64.deb ...
813:  #6 17.68 Unpacking libclang-cpp16 (1:16.0.6-15~deb11u2) ...
814:  #6 18.58 Selecting previously unselected package libclang-common-16-dev.
815:  #6 18.58 Preparing to unpack .../52-libclang-common-16-dev_1%3a16.0.6-15~deb11u2_all.deb ...
816:  #6 18.58 Unpacking libclang-common-16-dev (1:16.0.6-15~deb11u2) ...
817:  #6 18.68 Selecting previously unselected package llvm-16-linker-tools.
818:  #6 18.68 Preparing to unpack .../53-llvm-16-linker-tools_1%3a16.0.6-15~deb11u2_amd64.deb ...
819:  #6 18.68 Unpacking llvm-16-linker-tools (1:16.0.6-15~deb11u2) ...
820:  #6 18.78 Selecting previously unselected package libclang1-16.
821:  #6 18.79 Preparing to unpack .../54-libclang1-16_1%3a16.0.6-15~deb11u2_amd64.deb ...
822:  #6 18.79 Unpacking libclang1-16 (1:16.0.6-15~deb11u2) ...
823:  #6 19.35 Selecting previously unselected package clang-16.
824:  #6 19.35 Preparing to unpack .../55-clang-16_1%3a16.0.6-15~deb11u2_amd64.deb ...
825:  #6 19.36 Unpacking clang-16 (1:16.0.6-15~deb11u2) ...
826:  #6 19.38 Selecting previously unselected package liberror-perl.
827:  #6 19.38 Preparing to unpack .../56-liberror-perl_0.17029-1_all.deb ...
828:  #6 19.39 Unpacking liberror-perl (0.17029-1) ...
829:  #6 19.41 Selecting previously unselected package git-man.
...

901:  #6 27.85 Preparing to unpack .../81-postgresql-server-dev-15_15.18-1.pgdg11+1_amd64.deb ...
902:  #6 27.85 Unpacking postgresql-server-dev-15 (15.18-1.pgdg11+1) ...
903:  #6 28.03 Setting up media-types (4.0.0) ...
904:  #6 28.03 Setting up libz3-dev:amd64 (4.8.10-1) ...
905:  #6 28.03 Setting up libicu67:amd64 (67.1-7+deb11u1) ...
906:  #6 28.04 Setting up libyaml-0-2:amd64 (0.2.2-1) ...
907:  #6 28.04 Setting up binutils-common:amd64 (2.35.2-2) ...
908:  #6 28.04 Setting up libpq5:amd64 (18.4-1.pgdg11+1) ...
909:  #6 28.04 Setting up linux-libc-dev:amd64 (5.10.251-5) ...
910:  #6 28.04 Setting up libctf-nobfd0:amd64 (2.35.2-2) ...
911:  #6 28.05 Setting up libgomp1:amd64 (10.2.1-6) ...
912:  #6 28.05 Setting up bzip2 (1.0.8-4) ...
913:  #6 28.05 Setting up libffi-dev:amd64 (3.3-6) ...
914:  #6 28.05 Setting up libasan6:amd64 (10.2.1-6) ...
915:  #6 28.05 Setting up llvm-13-linker-tools (1:13.0.1-6~deb11u1) ...
916:  #6 28.06 Setting up liberror-perl (0.17029-1) ...
917:  #6 28.06 Setting up libclang1-13 (1:13.0.1-6~deb11u1) ...
...

997:  #6 30.01 You are in 'detached HEAD' state. You can look around, make experimental
998:  #6 30.01 changes and commit them, and you can discard any commits you make in this
999:  #6 30.01 state without impacting any branches by switching back to a branch.
1000:  #6 30.01 
1001:  #6 30.01 If you want to create a new branch to retain commits you create, you may
1002:  #6 30.01 do so (now or later) by using -c with the switch command. Example:
1003:  #6 30.01 
1004:  #6 30.01   git switch -c <new-branch-name>
1005:  #6 30.01 
1006:  #6 30.01 Or undo this operation with:
1007:  #6 30.01 
1008:  #6 30.01   git switch -
1009:  #6 30.01 
1010:  #6 30.01 Turn off this advice by setting config variable advice.detachedHead to false
1011:  #6 30.01 
1012:  #6 30.06 gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wimplicit-fallthrough=3 -Wcast-function-type -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-format-truncation -Wno-stringop-truncation -g -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -fno-omit-frame-pointer -march=native -ftree-vectorize -fassociative-math -fno-signed-zeros -fno-trapping-math -fPIC -I. -I./ -I/usr/include/postgresql/15/server -I/usr/include/postgresql/internal  -Wdate-time -D_FORTIFY_SOURCE=2 -D_GNU_SOURCE -I/usr/include/libxml2   -c -o src/bitutils.o src/bitutils.c
1013:  #6 30.28 gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wimplicit-fallthrough=3 -Wcast-function-type -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-format-truncation -Wno-stringop-truncation -g -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -fno-omit-frame-pointer -march=native -ftree-vectorize -fassociative-math -fno-signed-zeros -fno-trapping-math -fPIC -I. -I./ -I/usr/include/postgresql/15/server -I/usr/include/postgresql/internal  -Wdate-time -D_FORTIFY_SOURCE=2 -D_GNU_SOURCE -I/usr/include/libxml2   -c -o src/bitvec.o src/bitvec.c
1014:  #6 30.33 gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wimplicit-fallthrough=3 -Wcast-function-type -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-format-truncation -Wno-stringop-truncation -g -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -fno-omit-frame-pointer -march=native -ftree-vectorize -fassociative-math -fno-signed-zeros -fno-trapping-math -fPIC -I. -I./ -I/usr/include/postgresql/15/server -I/usr/include/postgresql/internal  -Wdate-time -D_FORTIFY_SOURCE=2 -D_GNU_SOURCE -I/usr/include/libxml2   -c -o src/halfutils.o src/halfutils.c
1015:  #6 30.59 gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wimplicit-fallthrough=3 -Wcast-function-type -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-format-truncation -Wno-stringop-truncation -g -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -fno-omit-frame-pointer -march=native -ftree-vectorize -fassociative-math -fno-signed-zeros -fno-trapping-math -fPIC -I. -I./ -I/usr/include/postgresql/15/server -I/usr/include/postgresql/internal  -Wdate-time -D_FORTIFY_SOURCE=2 -D_GNU_SOURCE -I/usr/include/libxml2   -c -o src/halfvec.o src/halfvec.c
1016:  #6 31.10 gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wimplicit-fallthrough=3 -Wcast-function-type -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-format-truncation -Wno-stringop-truncation -g -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -fno-omit-frame-pointer -march=native -ftree-vectorize -fassociative-math -fno-signed-zeros -fno-trapping-math -fPIC -I. -I./ -I/usr/include/postgresql/15/server -I/usr/include/postgresql/internal  -Wdate-time -D_FORTIFY_SOURCE=2 -D_GNU_SOURCE -I/usr/include/libxml2   -c -o src/hnsw.o src/hnsw.c
1017:  #6 31.21 gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wimplicit-fallthrough=3 -Wcast-function-type -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-format-truncation -Wno-stringop-truncation -g -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -fno-omit-frame-pointer -march=native -ftree-vectorize -fassociative-math -fno-signed-zeros -fno-trapping-math -fPIC -I. -I./ -I/usr/include/postgresql/15/server -I/usr/include/postgresql/internal  -Wdate-time -D_FORTIFY_SOURCE=2 -D_GNU_SOURCE -I/usr/include/libxml2   -c -o src/hnswbuild.o src/hnswbuild.c
1018:  #6 31.50 gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wimplicit-fallthrough=3 -Wcast-function-type -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-format-truncation -Wno-stringop-truncation -g -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -fno-omit-frame-pointer -march=native -ftree-vectorize -fassociative-math -fno-signed-zeros -fno-trapping-math -fPIC -I. -I./ -I/usr/include/postgresql/15/server -I/usr/include/postgresql/internal  -Wdate-time -D_FORTIFY_SOURCE=2 -D_GNU_SOURCE -I/usr/include/libxml2   -c -o src/hnswinsert.o src/hnswinsert.c
1019:  #6 31.71 gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wimplicit-fallthrough=3 -Wcast-function-type -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-format-truncation -Wno-stringop-truncation -g -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -fno-omit-frame-pointer -march=native -ftree-vectorize -fassociative-math -fno-signed-zeros -fno-trapping-math -fPIC -I. -I./ -I/usr/include/postgresql/15/server -I/usr/include/postgresql/internal  -Wdate-time -D_FORTIFY_SOURCE=2 -D_GNU_SOURCE -I/usr/include/libxml2   -c -o src/hnswscan.o src/hnswscan.c
1020:  #6 31.82 gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wimplicit-fallthrough=3 -Wcast-function-type -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-format-truncation -Wno-stringop-truncation -g -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -fno-omit-frame-pointer -march=native -ftree-vectorize -fassociative-math -fno-signed-zeros -fno-trapping-math -fPIC -I. -I./ -I/usr/include/postgresql/15/server -I/usr/include/postgresql/internal  -Wdate-time -D_FORTIFY_SOURCE=2 -D_GNU_SOURCE -I/usr/include/libxml2   -c -o src/hnswutils.o src/hnswutils.c
1021:  #6 32.51 gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wimplicit-fallthrough=3 -Wcast-function-type -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-format-truncation -Wno-stringop-truncation -g -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -fno-omit-frame-pointer -march=native -ftree-vectorize -fassociative-math -fno-signed-zeros -fno-trapping-math -fPIC -I. -I./ -I/usr/include/postgresql/15/server -I/usr/include/postgresql/internal  -Wdate-time -D_FORTIFY_SOURCE=2 -D_GNU_SOURCE -I/usr/include/libxml2   -c -o src/hnswvacuum.o src/hnswvacuum.c
1022:  #6 32.71 gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wimplicit-fallthrough=3 -Wcast-function-type -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-format-truncation -Wno-stringop-truncation -g -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -fno-omit-frame-pointer -march=native -ftree-vectorize -fassociative-math -fno-signed-zeros -fno-trapping-math -fPIC -I. -I./ -I/usr/include/postgresql/15/server -I/usr/include/postgresql/internal  -Wdate-time -D_FORTIFY_SOURCE=2 -D_GNU_SOURCE -I/usr/include/libxml2   -c -o src/ivfbuild.o src/ivfbuild.c
1023:  #6 32.96 gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wimplicit-fallthrough=3 -Wcast-function-type -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-format-truncation -Wno-stringop-truncation -g -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -fno-omit-frame-pointer -march=native -ftree-vectorize -fassociative-math -fno-signed-zeros -fno-trapping-math -fPIC -I. -I./ -I/usr/include/postgresql/15/server -I/usr/include/postgresql/internal  -Wdate-time -D_FORTIFY_SOURCE=2 -D_GNU_SOURCE -I/usr/include/libxml2   -c -o src/ivfflat.o src/ivfflat.c
1024:  #6 33.06 gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wimplicit-fallthrough=3 -Wcast-function-type -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-format-truncation -Wno-stringop-truncation -g -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -fno-omit-frame-pointer -march=native -ftree-vectorize -fassociative-math -fno-signed-zeros -fno-trapping-math -fPIC -I. -I./ -I/usr/include/postgresql/15/server -I/usr/include/postgresql/internal  -Wdate-time -D_FORTIFY_SOURCE=2 -D_GNU_SOURCE -I/usr/include/libxml2   -c -o src/ivfinsert.o src/ivfinsert.c
1025:  #6 33.16 gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wimplicit-fallthrough=3 -Wcast-function-type -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-format-truncation -Wno-stringop-truncation -g -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -fno-omit-frame-pointer -march=native -ftree-vectorize -fassociative-math -fno-signed-zeros -fno-trapping-math -fPIC -I. -I./ -I/usr/include/postgresql/15/server -I/usr/include/postgresql/internal  -Wdate-time -D_FORTIFY_SOURCE=2 -D_GNU_SOURCE -I/usr/include/libxml2   -c -o src/ivfkmeans.o src/ivfkmeans.c
1026:  #6 33.59 gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wimplicit-fallthrough=3 -Wcast-function-type -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-format-truncation -Wno-stringop-truncation -g -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -fno-omit-frame-pointer -march=native -ftree-vectorize -fassociative-math -fno-signed-zeros -fno-trapping-math -fPIC -I. -I./ -I/usr/include/postgresql/15/server -I/usr/include/postgresql/internal  -Wdate-time -D_FORTIFY_SOURCE=2 -D_GNU_SOURCE -I/usr/include/libxml2   -c -o src/ivfscan.o src/ivfscan.c
1027:  #6 33.73 gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wimplicit-fallthrough=3 -Wcast-function-type -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-format-truncation -Wno-stringop-truncation -g -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -fno-omit-frame-pointer -march=native -ftree-vectorize -fassociative-math -fno-signed-zeros -fno-trapping-math -fPIC -I. -I./ -I/usr/include/postgresql/15/server -I/usr/include/postgresql/internal  -Wdate-time -D_FORTIFY_SOURCE=2 -D_GNU_SOURCE -I/usr/include/libxml2   -c -o src/ivfutils.o src/ivfutils.c
1028:  #6 34.02 gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wimplicit-fallthrough=3 -Wcast-function-type -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-format-truncation -Wno-stringop-truncation -g -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -fno-omit-frame-pointer -march=native -ftree-vectorize -fassociative-math -fno-signed-zeros -fno-trapping-math -fPIC -I. -I./ -I/usr/include/postgresql/15/server -I/usr/include/postgresql/internal  -Wdate-time -D_FORTIFY_SOURCE=2 -D_GNU_SOURCE -I/usr/include/libxml2   -c -o src/ivfvacuum.o src/ivfvacuum.c
1029:  #6 34.12 gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wimplicit-fallthrough=3 -Wcast-function-type -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-format-truncation -Wno-stringop-truncation -g -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -fno-omit-frame-pointer -march=native -ftree-vectorize -fassociative-math -fno-signed-zeros -fno-trapping-math -fPIC -I. -I./ -I/usr/include/postgresql/15/server -I/usr/include/postgresql/internal  -Wdate-time -D_FORTIFY_SOURCE=2 -D_GNU_SOURCE -I/usr/include/libxml2   -c -o src/sparsevec.o src/sparsevec.c
1030:  #6 34.61 gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wimplicit-fallthrough=3 -Wcast-function-type -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-format-truncation -Wno-stringop-truncation -g -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -fno-omit-frame-pointer -march=native -ftree-vectorize -fassociative-math -fno-signed-zeros -fno-trapping-math -fPIC -I. -I./ -I/usr/include/postgresql/15/server -I/usr/include/postgresql/internal  -Wdate-time -D_FORTIFY_SOURCE=2 -D_GNU_SOURCE -I/usr/include/libxml2   -c -o src/vector.o src/vector.c
1031:  #6 35.23 gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wimplicit-fallthrough=3 -Wcast-function-type -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-format-truncation -Wno-stringop-truncation -g -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -fno-omit-frame-pointer -march=native -ftree-vectorize -fassociative-math -fno-signed-zeros -fno-trapping-math -fPIC -shared -o vector.so src/bitutils.o src/bitvec.o src/halfutils.o src/halfvec.o src/hnsw.o src/hnswbuild.o src/hnswinsert.o src/hnswscan.o src/hnswutils.o src/hnswvacuum.o src/ivfbuild.o src/ivfflat.o src/ivfinsert.o src/ivfkmeans.o src/ivfscan.o src/ivfutils.o src/ivfvacuum.o src/sparsevec.o src/vector.o -L/usr/lib/x86_64-linux-gnu  -Wl,-z,relro -Wl,-z,now -L/usr/lib/llvm-13/lib  -Wl,--as-needed  
1032:  #6 35.27 cp sql/vector.sql sql/vector--0.7.0.sql
...

1101:  #6 38.61 /usr/bin/install -c -m 644 src/ivfscan.bc '/usr/lib/postgresql/15/lib/bitcode'/vector/src/
1102:  #6 38.61 /usr/bin/install -c -m 644 src/ivfutils.bc '/usr/lib/postgresql/15/lib/bitcode'/vector/src/
1103:  #6 38.61 /usr/bin/install -c -m 644 src/ivfvacuum.bc '/usr/lib/postgresql/15/lib/bitcode'/vector/src/
1104:  #6 38.61 /usr/bin/install -c -m 644 src/sparsevec.bc '/usr/lib/postgresql/15/lib/bitcode'/vector/src/
1105:  #6 38.61 /usr/bin/install -c -m 644 src/vector.bc '/usr/lib/postgresql/15/lib/bitcode'/vector/src/
1106:  #6 38.61 cd '/usr/lib/postgresql/15/lib/bitcode' && /usr/lib/llvm-13/bin/llvm-lto -thinlto -thinlto-action=thinlink -o vector.index.bc vector/src/bitutils.bc vector/src/bitvec.bc vector/src/halfutils.bc vector/src/halfvec.bc vector/src/hnsw.bc vector/src/hnswbuild.bc vector/src/hnswinsert.bc vector/src/hnswscan.bc vector/src/hnswutils.bc vector/src/hnswvacuum.bc vector/src/ivfbuild.bc vector/src/ivfflat.bc vector/src/ivfinsert.bc vector/src/ivfkmeans.bc vector/src/ivfscan.bc vector/src/ivfutils.bc vector/src/ivfvacuum.bc vector/src/sparsevec.bc vector/src/vector.bc
1107:  #6 38.64 Reading package lists...
1108:  #6 39.07 Building dependency tree...
1109:  #6 39.18 Reading state information...
1110:  #6 39.27 The following packages were automatically installed and are no longer required:
1111:  #6 39.27   binutils binutils-common binutils-x86-64-linux-gnu bzip2 clang-16 cpp cpp-10
1112:  #6 39.27   dpkg-dev g++ g++-10 gcc gcc-10 git-man icu-devtools lib32gcc-s1 lib32stdc++6
1113:  #6 39.27   libasan6 libatomic1 libbinutils libc-dev-bin libc6-dev libc6-i386 libcc1-0
1114:  #6 39.27   libclang-common-13-dev libclang-common-16-dev libclang-cpp13 libclang-cpp16
1115:  #6 39.27   libclang1-13 libclang1-16 libcrypt-dev libctf-nobfd0 libctf0 libcurl4
1116:  #6 39.27   libdpkg-perl liberror-perl libffi-dev libgc1 libgcc-10-dev libgomp1
1117:  #6 39.27   libicu-dev libisl23 libitm1 libllvm16 liblsan0 libmpc3 libmpdec3
...

1152:  #6 39.43 Removing build-essential (12.9) ...
1153:  #6 39.44 Removing clang-13 (1:13.0.1-6~deb11u1) ...
1154:  #6 39.45 Removing git (1:2.30.2-1+deb11u5) ...
1155:  #6 39.51 Removing llvm-13 (1:13.0.1-6~deb11u1) ...
1156:  #6 39.53 Removing postgresql-server-dev-15 (15.18-1.pgdg11+1) ...
1157:  #6 39.59 dpkg: warning: while removing postgresql-server-dev-15, directory '/usr/include/postgresql/15/server/extension' not empty so not removed
1158:  #6 39.62 Reading package lists...
1159:  #6 40.07 Building dependency tree...
1160:  #6 40.20 Reading state information...
1161:  #6 40.33 The following packages will be REMOVED:
1162:  #6 40.33   binutils binutils-common binutils-x86-64-linux-gnu bzip2 clang-16 cpp cpp-10
1163:  #6 40.33   dpkg-dev g++ g++-10 gcc gcc-10 git-man icu-devtools lib32gcc-s1 lib32stdc++6
1164:  #6 40.33   libasan6 libatomic1 libbinutils libc-dev-bin libc6-dev libc6-i386 libcc1-0
1165:  #6 40.33   libclang-common-13-dev libclang-common-16-dev libclang-cpp13 libclang-cpp16
1166:  #6 40.33   libclang1-13 libclang1-16 libcrypt-dev libctf-nobfd0 libctf0 libcurl4
1167:  #6 40.33   libdpkg-perl liberror-perl libffi-dev libgc1 libgcc-10-dev libgomp1
1168:  #6 40.33   libicu-dev libisl23 libitm1 libllvm16 liblsan0 libmpc3 libmpdec3
...

1221:  #6 40.95 Removing libatomic1:amd64 (10.2.1-6) ...
1222:  #6 40.96 Removing libncurses-dev:amd64 (6.2+20201114-2+deb11u2) ...
1223:  #6 40.98 Removing libc6-dev:amd64 (2.31-13+deb11u13) ...
1224:  #6 41.01 Removing libc-dev-bin (2.31-13+deb11u13) ...
1225:  #6 41.02 Removing libc6-i386 (2.31-13+deb11u13) ...
1226:  #6 41.05 Removing libcc1-0:amd64 (10.2.1-6) ...
1227:  #6 41.06 Removing libclang-common-16-dev (1:16.0.6-15~deb11u2) ...
1228:  #6 41.08 Removing libclang-cpp13 (1:13.0.1-6~deb11u1) ...
1229:  #6 41.09 Removing libclang-cpp16 (1:16.0.6-15~deb11u2) ...
1230:  #6 41.11 Removing libclang1-13 (1:13.0.1-6~deb11u1) ...
1231:  #6 41.12 Removing libclang1-16 (1:16.0.6-15~deb11u2) ...
1232:  #6 41.13 Removing libcrypt-dev:amd64 (1:4.4.18-4) ...
1233:  #6 41.14 Removing llvm-16 (1:16.0.6-15~deb11u2) ...
1234:  #6 41.17 Removing libcurl4:amd64 (7.74.0-1.3+deb11u16) ...
1235:  #6 41.18 Removing libdpkg-perl (1.20.13) ...
1236:  #6 41.20 Removing liberror-perl (0.17029-1) ...
1237:  #6 41.21 Removing libffi-dev:amd64 (3.3-6) ...
...

1298:  �[36;1m  -e POSTGRES_PASSWORD=test_password \�[0m
1299:  �[36;1m  -e POSTGRES_DB=test_db \�[0m
1300:  �[36;1m  -p 5432:5432 \�[0m
1301:  �[36;1m  test-postgres�[0m
1302:  �[36;1m�[0m
1303:  �[36;1m# Wait for PostgreSQL to accept connections FROM THE HOST�[0m
1304:  �[36;1mecho "Waiting for PostgreSQL to accept host connections..."�[0m
1305:  �[36;1mfor i in {1..30}; do�[0m
1306:  �[36;1m  if pg_isready -h localhost -p 5432 -U test_user; then�[0m
1307:  �[36;1m    echo "PostgreSQL is ready and accepting host connections"�[0m
1308:  �[36;1m    exit 0�[0m
1309:  �[36;1m  fi�[0m
1310:  �[36;1m  echo "Waiting for PostgreSQL... ($i/30)"�[0m
1311:  �[36;1m  sleep 2�[0m
1312:  �[36;1mdone�[0m
1313:  �[36;1mecho "ERROR: PostgreSQL failed to become ready"�[0m
1314:  �[36;1mdocker logs test-postgres�[0m
...

1740:  tests/api/test_agent_endpoints.py::TestUpdateAgentAvailabilityEndpoint::test_update_availability PASSED [  1%]
1741:  tests/api/test_agent_endpoints.py::TestUpdateAgentAvailabilityEndpoint::test_update_availability_not_found PASSED [  1%]
1742:  tests/api/test_agent_endpoints.py::TestGetAgentMeEndpoint::test_get_agent_profile PASSED [  2%]
1743:  tests/api/test_amenity_endpoints.py::TestListAmenitiesEndpoint::test_list_amenities PASSED [  2%]
1744:  tests/api/test_amenity_endpoints.py::TestListAmenitiesEndpoint::test_list_amenities_empty PASSED [  2%]
1745:  tests/api/test_auth_endpoints.py::test_legacy_auth_endpoint_returns_not_found[/api/v1/auth/login/-payload0] PASSED [  2%]
1746:  tests/api/test_auth_endpoints.py::test_legacy_auth_endpoint_returns_not_found[/api/v1/auth/register/-payload1] PASSED [  2%]
1747:  tests/api/test_auth_endpoints.py::test_legacy_auth_endpoint_returns_not_found[/api/v1/auth/otp/request-payload2] PASSED [  2%]
1748:  tests/api/test_auth_endpoints.py::test_legacy_auth_endpoint_returns_not_found[/api/v1/auth/otp/verify-payload3] PASSED [  2%]
1749:  tests/api/test_auth_endpoints.py::test_legacy_auth_endpoint_returns_not_found[/api/v1/auth/refresh-payload4] PASSED [  2%]
1750:  tests/api/test_auth_endpoints.py::test_legacy_auth_endpoint_returns_not_found[/api/v1/auth/logout-payload5] PASSED [  2%]
1751:  tests/api/test_auth_endpoints.py::test_legacy_auth_endpoint_returns_not_found[/api/v1/auth/forgot-password-payload6] PASSED [  2%]
1752:  tests/api/test_auth_endpoints.py::test_legacy_auth_endpoint_returns_not_found[/api/v1/auth/verify-payload7] PASSED [  2%]
1753:  tests/api/test_blog_endpoints.py::TestBlogPostEndpoints::test_list_blog_posts PASSED [  2%]
1754:  tests/api/test_blog_endpoints.py::TestBlogPostEndpoints::test_list_blog_posts_with_filters PASSED [  2%]
1755:  tests/api/test_blog_endpoints.py::TestBlogPostEndpoints::test_list_blog_posts_returns_503_for_transient_db_error PASSED [  2%]
1756:  tests/api/test_blog_endpoints.py::TestBlogPostEndpoints::test_get_blog_post FAILED [  3%]
1757:  tests/api/test_blog_endpoints.py::TestBlogPostEndpoints::test_get_blog_post_not_found PASSED [  3%]
...

1831:  tests/api/test_oauth_endpoints.py::TestTokenResponseResource::test_token_response_omits_resource_when_absent PASSED [  8%]
1832:  tests/api/test_oauth_endpoints.py::TestTokenResponseResource::test_refresh_token_response_includes_resource PASSED [  8%]
1833:  tests/api/test_oauth_endpoints.py::TestWellKnownEndpoints::test_protected_resource_metadata_root PASSED [  8%]
1834:  tests/api/test_oauth_endpoints.py::TestWellKnownEndpoints::test_protected_resource_metadata_mcp PASSED [  8%]
1835:  tests/api/test_oauth_endpoints.py::TestWellKnownEndpoints::test_authorization_server_metadata_root PASSED [  8%]
1836:  tests/api/test_oauth_endpoints.py::TestWellKnownEndpoints::test_authorization_server_metadata_mcp_oauth PASSED [  8%]
1837:  tests/api/test_oauth_endpoints.py::TestWellKnownEndpoints::test_root_and_mcp_oauth_metadata_are_consistent PASSED [  8%]
1838:  tests/api/test_property_endpoints.py::TestCreateProperty::test_create_property_success PASSED [  8%]
1839:  tests/api/test_property_endpoints.py::TestCreateProperty::test_create_pg_property_rejects_non_rent_purpose PASSED [  9%]
1840:  tests/api/test_property_endpoints.py::TestCreateProperty::test_create_property_unauthenticated PASSED [  9%]
1841:  tests/api/test_property_endpoints.py::TestListProperties::test_list_properties_public PASSED [  9%]
1842:  tests/api/test_property_endpoints.py::TestListProperties::test_list_properties_with_filters PASSED [  9%]
1843:  tests/api/test_property_endpoints.py::TestListProperties::test_list_properties_with_location PASSED [  9%]
1844:  tests/api/test_property_endpoints.py::TestListProperties::test_list_properties_with_ids_filter PASSED [  9%]
1845:  tests/api/test_property_endpoints.py::TestListProperties::test_list_properties_with_listing_preference_filters PASSED [  9%]
1846:  tests/api/test_property_endpoints.py::TestListProperties::test_list_properties_returns_503_for_transient_db_error PASSED [  9%]
1847:  tests/api/test_property_endpoints.py::TestRecommendations::test_recommendations_returns_503_for_transient_db_error PASSED [  9%]
1848:  tests/api/test_property_endpoints.py::TestGetProperty::test_get_property_success PASSED [  9%]
...

1910:  tests/api/test_vastu_endpoints.py::TestVastuAnalyzeEndpoint::test_analyze_with_glm_provider PASSED [ 14%]
1911:  tests/api/test_vastu_endpoints.py::TestVastuHealthEndpoint::test_vastu_health_check PASSED [ 14%]
1912:  tests/api/test_visit_endpoints.py::TestCreateVisitEndpoint::test_create_visit_success PASSED [ 14%]
1913:  tests/api/test_visit_endpoints.py::TestCreateVisitEndpoint::test_create_visit_unauthorized PASSED [ 14%]
1914:  tests/api/test_visit_endpoints.py::TestGetVisitEndpoint::test_get_visit_success PASSED [ 14%]
1915:  tests/api/test_visit_endpoints.py::TestGetVisitEndpoint::test_get_visit_not_found PASSED [ 14%]
1916:  tests/api/test_visit_endpoints.py::TestGetUserVisitsEndpoint::test_get_user_visits PASSED [ 14%]
1917:  tests/api/test_visit_endpoints.py::TestGetUpcomingVisitsEndpoint::test_get_upcoming_visits PASSED [ 14%]
1918:  tests/api/test_visit_endpoints.py::TestGetPastVisitsEndpoint::test_get_past_visits PASSED [ 14%]
1919:  tests/api/test_visit_endpoints.py::TestCancelVisitEndpoint::test_cancel_visit_success PASSED [ 14%]
1920:  tests/api/test_visit_endpoints.py::TestCancelVisitEndpoint::test_cancel_visit_not_found PASSED [ 14%]
1921:  tests/api/test_visit_endpoints.py::TestRescheduleVisitEndpoint::test_reschedule_visit_success PASSED [ 14%]
1922:  tests/api/test_visit_endpoints.py::TestMarkVisitCompletedEndpoint::test_mark_visit_completed PASSED [ 15%]
1923:  tests/api/test_visit_endpoints.py::TestMarkVisitCompletedEndpoint::test_mark_visit_completed_forbidden PASSED [ 15%]
1924:  tests/e2e/test_booking_complete_flow.py::TestBookingCompleteFlow::test_search_check_book_flow PASSED [ 15%]
1925:  tests/e2e/test_booking_complete_flow.py::TestBookingManagementFlow::test_view_and_cancel_booking FAILED [ 15%]
1926:  tests/e2e/test_booking_complete_flow.py::TestBookingListingFlow::test_list_all_bookings PASSED [ 15%]
1927:  tests/e2e/test_booking_complete_flow.py::TestBookingListingFlow::test_list_upcoming_bookings PASSED [ 15%]
1928:  tests/e2e/test_booking_complete_flow.py::TestBookingStatusTransitions::test_confirm_booking PASSED [ 15%]
1929:  tests/e2e/test_booking_complete_flow.py::TestBookingStatusTransitions::test_check_in_booking PASSED [ 15%]
1930:  tests/e2e/test_pm_lifecycle_flow.py::TestPMLifecycleFlow::test_lease_to_rent_to_maintenance_flow FAILED [ 15%]
1931:  tests/e2e/test_property_listing_flow.py::TestPropertyListingFlow::test_create_and_list_property PASSED [ 15%]
1932:  tests/e2e/test_property_listing_flow.py::TestPropertySearchFlow::test_search_properties_by_location PASSED [ 15%]
1933:  tests/e2e/test_property_listing_flow.py::TestPropertySearchFlow::test_search_properties_by_filters PASSED [ 15%]
1934:  tests/e2e/test_property_listing_flow.py::TestPropertyViewFlow::test_view_property_details FAILED [ 15%]
1935:  tests/e2e/test_property_listing_flow.py::TestPropertyViewFlow::test_view_increments_counter FAILED [ 15%]
1936:  tests/e2e/test_property_listing_flow.py::TestPropertySwipeFlow::test_swipe_like_and_view_likes PASSED [ 16%]
...

1950:  tests/integration/test_full_text_search.py::TestSearchFilters::test_search_with_price_filter PASSED [ 17%]
1951:  tests/integration/test_full_text_search.py::TestSearchFilters::test_search_with_property_type_filter PASSED [ 17%]
1952:  tests/integration/test_geospatial_queries.py::TestPostGISRadiusSearch::test_properties_within_radius PASSED [ 17%]
1953:  tests/integration/test_geospatial_queries.py::TestPostGISRadiusSearch::test_properties_sorted_by_distance PASSED [ 17%]
1954:  tests/integration/test_geospatial_queries.py::TestPostGISRadiusSearch::test_no_properties_outside_radius PASSED [ 17%]
1955:  tests/integration/test_geospatial_queries.py::TestPostGISBoundingBox::test_properties_in_bounding_box PASSED [ 17%]
1956:  tests/integration/test_geospatial_queries.py::TestPostGISDistanceCalculation::test_st_distance_calculation PASSED [ 17%]
1957:  tests/integration/test_geospatial_queries.py::TestPostGISDistanceCalculation::test_st_dwithin_filter PASSED [ 17%]
1958:  tests/integration/test_geospatial_queries.py::TestLocationIndexing::test_spatial_index_exists PASSED [ 17%]
1959:  tests/integration/test_property_search.py::TestPropertySearchCombinations::test_city_and_purpose_filter PASSED [ 17%]
1960:  tests/integration/test_property_search.py::TestPropertySearchCombinations::test_city_and_type_filter PASSED [ 17%]
1961:  tests/integration/test_property_search.py::TestPropertySearchCombinations::test_purpose_and_type_filter PASSED [ 17%]
1962:  tests/integration/test_property_search.py::TestPropertySearchCombinations::test_price_range_filter PASSED [ 17%]
1963:  tests/integration/test_property_search.py::TestPropertySearchCombinations::test_bedroom_filter PASSED [ 17%]
1964:  tests/integration/test_property_search.py::TestPropertySearchCombinations::test_empty_results PASSED [ 18%]
1965:  tests/integration/test_property_search.py::TestPropertySearchCombinations::test_pagination FAILED [ 18%]
1966:  tests/integration/test_property_search.py::TestPropertySearchCombinations::test_special_listing_filters PASSED [ 18%]
1967:  tests/mcp/test_admin_mcp_server.py::TestAgentPropertyTools::test_agent_properties_list_authenticated FAILED [ 18%]
1968:  tests/mcp/test_admin_mcp_server.py::TestAgentPropertyTools::test_agent_properties_list_unauthorized FAILED [ 18%]
1969:  tests/mcp/test_admin_mcp_server.py::TestAgentLeaseTools::test_agent_leases_list FAILED [ 18%]
1970:  tests/mcp/test_admin_mcp_server.py::TestAgentLeaseTools::test_agent_leases_create FAILED [ 18%]
1971:  tests/mcp/test_admin_mcp_server.py::TestAgentRentTools::test_agent_rent_list_due FAILED [ 18%]
1972:  tests/mcp/test_admin_mcp_server.py::TestAgentRentTools::test_agent_rent_record_payment FAILED [ 18%]
1973:  tests/mcp/test_admin_mcp_server.py::TestAgentMaintenanceTools::test_agent_maintenance_list FAILED [ 18%]
1974:  tests/mcp/test_admin_mcp_server.py::TestAgentMaintenanceTools::test_agent_maintenance_update_status FAILED [ 18%]
1975:  tests/mcp/test_admin_mcp_server.py::TestAgentDashboardTools::test_agent_dashboard_overview FAILED [ 18%]
1976:  tests/mcp/test_admin_mcp_server.py::TestAdminTools::test_admin_system_status PASSED [ 18%]
1977:  tests/mcp/test_admin_mcp_server.py::TestAdminTools::test_admin_system_status_non_admin PASSED [ 18%]
1978:  tests/mcp/test_admin_mcp_server.py::TestAgentBookingTools::test_agent_bookings_list_all FAILED [ 19%]
1979:  tests/mcp/test_admin_mcp_server.py::TestAgentBookingTools::test_agent_bookings_update_status FAILED [ 19%]
1980:  tests/mcp/test_mcp_integration.py::TestMCPServerIntegration::test_mcp_endpoint_mounted PASSED [ 19%]
...

1987:  tests/mcp/test_mcp_integration.py::TestMCPToolsIntegration::test_discovery_amenities PASSED [ 19%]
1988:  tests/mcp/test_mcp_integration.py::TestMCPAuthIntegration::test_token_verifier_valid_oauth_token PASSED [ 19%]
1989:  tests/mcp/test_mcp_integration.py::TestMCPAuthIntegration::test_token_verifier_invalid_token_format PASSED [ 19%]
1990:  tests/mcp/test_mcp_integration.py::TestMCPAuthIntegration::test_token_verifier_expired_token PASSED [ 19%]
1991:  tests/mcp/test_mcp_integration.py::TestMCPAuthIntegration::test_token_verifier_audience_mismatch PASSED [ 19%]
1992:  tests/mcp/test_mcp_integration.py::TestMCPAuthIntegration::test_token_verifier_missing_scope PASSED [ 20%]
1993:  tests/mcp/test_mcp_integration.py::TestMCPOAuthTokenStore::test_store_and_retrieve_auth_code PASSED [ 20%]
1994:  tests/mcp/test_mcp_integration.py::TestMCPOAuthTokenStore::test_store_and_retrieve_tokens PASSED [ 20%]
1995:  tests/mcp/test_mcp_integration.py::TestMCPOAuthTokenStore::test_revoke_token PASSED [ 20%]
1996:  tests/mcp/test_mcp_integration.py::TestMCPOAuthTokenStore::test_refresh_token_rotation PASSED [ 20%]
1997:  tests/mcp/test_mcp_integration.py::TestMCPWidgetIntegration::test_widget_registration PASSED [ 20%]
1998:  tests/mcp/test_mcp_integration.py::TestMCPWidgetIntegration::test_widget_tool_mapping PASSED [ 20%]
1999:  tests/mcp/test_mcp_integration.py::TestMCPWidgetIntegration::test_get_widget_for_tool PASSED [ 20%]
2000:  tests/mcp/test_mcp_integration.py::TestMCPWidgetIntegration::test_all_discovery_tools_have_widgets PASSED [ 20%]
2001:  tests/mcp/test_mcp_integration.py::TestMCPEndToEnd::test_complete_property_workflow PASSED [ 20%]
2002:  tests/mcp/test_mcp_integration.py::TestMCPEndToEnd::test_agent_property_management_workflow FAILED [ 20%]
2003:  tests/mcp/test_mcp_integration.py::TestMCPEndToEnd::test_owner_property_workflow PASSED [ 20%]
2004:  tests/mcp/test_mcp_integration.py::TestMCPEndToEnd::test_tenant_workflow PASSED [ 20%]
2005:  tests/mcp/test_user_mcp_server.py::TestOwnerPropertyTools::test_owner_properties_list_authenticated FAILED [ 20%]
2006:  tests/mcp/test_user_mcp_server.py::TestOwnerPropertyTools::test_owner_properties_list_unauthenticated PASSED [ 21%]
2007:  tests/mcp/test_user_mcp_server.py::TestOwnerPropertyTools::test_owner_properties_list_www_authenticate_meta PASSED [ 21%]
2008:  tests/mcp/test_user_mcp_server.py::TestOwnerPropertyTools::test_tools_list_includes_security_schemes_and_template PASSED [ 21%]
2009:  tests/mcp/test_user_mcp_server.py::TestOwnerPropertyCreate::test_create_property_success FAILED [ 21%]
2010:  tests/mcp/test_user_mcp_server.py::TestTenantTools::test_tenant_lease_current PASSED [ 21%]
2011:  tests/mcp/test_user_mcp_server.py::TestTenantTools::test_tenant_rent_history PASSED [ 21%]
2012:  tests/mcp/test_user_mcp_server.py::TestBookingTools::test_bookings_list FAILED [ 21%]
2013:  tests/mcp/test_user_mcp_server.py::TestBookingTools::test_bookings_check_availability FAILED [ 21%]
2014:  tests/mcp/test_user_mcp_server.py::TestMCPErrorResponses::test_unauthorized_response PASSED [ 21%]
2015:  tests/mcp/test_user_mcp_server.py::TestMCPErrorResponses::test_not_found_response PASSED [ 21%]
2016:  tests/mcp/test_user_mcp_server.py::TestMCPErrorResponses::test_invalid_input_response PASSED [ 21%]
2017:  tests/middleware/test_rate_limit_middleware.py::TestRateLimitMiddleware::test_middleware_initialization PASSED [ 21%]
...

2030:  tests/middleware/test_security_middleware.py::TestXSSProtection::test_xss_protection_header PASSED [ 22%]
2031:  tests/middleware/test_security_middleware.py::TestContentTypeOptions::test_x_content_type_options_header PASSED [ 22%]
2032:  tests/middleware/test_security_middleware.py::TestFrameOptions::test_x_frame_options_header PASSED [ 22%]
2033:  tests/middleware/test_security_middleware.py::TestContentSecurityPolicy::test_csp_header PASSED [ 23%]
2034:  tests/middleware/test_security_middleware.py::TestHSTS::test_hsts_header_in_production PASSED [ 23%]
2035:  tests/middleware/test_trailing_slash_middleware.py::TestMCPMountPaths::test_mcp_mount_paths_do_not_include_sse PASSED [ 23%]
2036:  tests/middleware/test_trailing_slash_middleware.py::TestTrailingSlashAddition::test_adds_trailing_slash_for_mcp PASSED [ 23%]
2037:  tests/middleware/test_trailing_slash_middleware.py::TestTrailingSlashAddition::test_adds_trailing_slash_for_mcp_admin PASSED [ 23%]
2038:  tests/middleware/test_trailing_slash_middleware.py::TestTrailingSlashAddition::test_mcp_subpaths_unchanged PASSED [ 23%]
2039:  tests/middleware/test_trailing_slash_middleware.py::TestTrailingSlashStripping::test_strips_trailing_slash_for_api_routes PASSED [ 23%]
2040:  tests/middleware/test_trailing_slash_middleware.py::TestTrailingSlashStripping::test_preserves_api_root PASSED [ 23%]
2041:  tests/middleware/test_trailing_slash_middleware.py::TestTrailingSlashStripping::test_no_trailing_slash_unchanged PASSED [ 23%]
2042:  tests/middleware/test_trailing_slash_middleware.py::TestTrailingSlashStripping::test_deep_api_path_stripped PASSED [ 23%]
2043:  tests/middleware/test_trailing_slash_middleware.py::TestNonHTTPScopes::test_websocket_scope_unchanged PASSED [ 23%]
2044:  tests/middleware/test_trailing_slash_middleware.py::TestNonHTTPScopes::test_lifespan_scope_unchanged PASSED [ 23%]
2045:  tests/pm/test_authz.py::test_pm_authz_owner_agent_tenant_property_access ERROR [ 23%]
2046:  tests/pm/test_rent.py::test_generate_rent_charges_idempotent_and_payment_status ERROR [ 23%]
2047:  tests/unit/api/test_agent_chat_endpoint.py::test_agent_chat_persists_widget_and_assistant_messages PASSED [ 24%]
2048:  tests/unit/api/test_agent_chat_endpoint.py::test_agent_chat_persists_empty_assistant_when_only_widget_event PASSED [ 24%]
2049:  tests/unit/api/test_agent_chat_endpoint.py::test_agent_chat_ignores_malformed_widget_event PASSED [ 24%]
2050:  tests/unit/api/test_agent_chat_endpoint.py::test_agent_chat_stream_error_emits_error_event PASSED [ 24%]
2051:  tests/unit/api/test_agent_chat_endpoint.py::test_list_conversations_delegates_to_store_and_respects_pagination PASSED [ 24%]
...

2074:  tests/unit/api/test_flatmates_admin.py::TestModerateListingReject::test_reject_sets_listing_rejected PASSED [ 25%]
2075:  tests/unit/api/test_flatmates_admin.py::TestModerateListingReject::test_reject_emits_sse_event PASSED [ 26%]
2076:  tests/unit/api/test_flatmates_admin.py::TestModerateListingRequestEdit::test_request_edit_sets_pending_review PASSED [ 26%]
2077:  tests/unit/api/test_flatmates_admin.py::TestModerateListingNotFound::test_not_found_raises_404 PASSED [ 26%]
2078:  tests/unit/api/test_flatmates_admin.py::TestModerateListingApprovalBoost::test_first_approval_grants_boost PASSED [ 26%]
2079:  tests/unit/api/test_flatmates_admin.py::TestModerateReportDismiss::test_dismiss_sets_status PASSED [ 26%]
2080:  tests/unit/api/test_flatmates_admin.py::TestModerateReportWarnUser::test_warn_user_sets_status_actioned PASSED [ 26%]
2081:  tests/unit/api/test_flatmates_admin.py::TestModerateReportSuspendUser::test_suspend_user_deactivates_account PASSED [ 26%]
2082:  tests/unit/api/test_flatmates_admin.py::TestModerateReportEscalate::test_escalate_sets_status_reviewed PASSED [ 26%]
2083:  tests/unit/api/test_flatmates_admin.py::TestModerateReportNotFound::test_not_found_raises_404 PASSED [ 26%]
2084:  tests/unit/api/test_flatmates_admin.py::TestGetPendingListingsPagination::test_returns_listings_with_pagination PASSED [ 26%]
2085:  tests/unit/api/test_flatmates_admin.py::TestGetPendingReportsPagination::test_returns_reports_with_pagination PASSED [ 26%]
2086:  tests/unit/api/test_flatmates_admin.py::TestGetPendingReportsPagination::test_empty_reports PASSED [ 26%]
2087:  tests/unit/api/test_flatmates_admin.py::TestPrescreenListing::test_admin_can_prescreen PASSED [ 26%]
2088:  tests/unit/api/test_flatmates_admin.py::TestPrescreenListing::test_non_admin_gets_403 PASSED [ 26%]
2089:  tests/unit/app/test_app_composition.py::test_openapi_paths_match_refactor_baseline FAILED [ 27%]
2090:  tests/unit/app/test_app_composition.py::test_mcp_mount_paths_are_registered PASSED [ 27%]
2091:  tests/unit/app/test_app_composition.py::test_base_api_exception_envelope_is_preserved PASSED [ 27%]
2092:  tests/unit/app/test_app_composition.py::test_legacy_request_id_filter_import_remains_compatible PASSED [ 27%]
2093:  tests/unit/app/test_app_composition.py::test_canonical_domain_modules_expose_existing_property_service PASSED [ 27%]
2094:  tests/unit/core/test_auth.py::TestGetSupabaseClients::test_get_supabase_auth_client_creates_singleton PASSED [ 27%]
2095:  tests/unit/core/test_auth.py::TestGetSupabaseClients::test_get_supabase_auth_client_requires_publishable_key PASSED [ 27%]
2096:  tests/unit/core/test_auth.py::TestGetSupabaseClients::test_get_supabase_service_client_creates_singleton PASSED [ 27%]
2097:  tests/unit/core/test_auth.py::TestGetSupabaseClients::test_get_supabase_storage_client_creates_singleton PASSED [ 27%]
2098:  tests/unit/core/test_auth.py::TestVerifySupabaseToken::test_verify_token_success PASSED [ 27%]
2099:  tests/unit/core/test_auth.py::TestVerifySupabaseToken::test_verify_token_failure_returns_none PASSED [ 27%]
2100:  tests/unit/core/test_auth.py::TestVerifySupabaseToken::test_verify_token_missing_id_returns_none PASSED [ 27%]
2101:  tests/unit/core/test_auth.py::TestVerifySupabaseToken::test_verify_token_network_error_returns_none PASSED [ 27%]
2102:  tests/unit/core/test_auth.py::TestAdminFindUserByPhone::test_find_user_success PASSED [ 27%]
...

2123:  tests/unit/core/test_cache_manager.py::TestNullCacheBackend::test_is_available_returns_false PASSED [ 29%]
2124:  tests/unit/core/test_cache_manager.py::TestCacheBackendType::test_memory_backend_type PASSED [ 29%]
2125:  tests/unit/core/test_cache_manager.py::TestCacheBackendType::test_redis_backend_type PASSED [ 29%]
2126:  tests/unit/core/test_cache_manager.py::TestCacheBackendType::test_disk_backend_type PASSED [ 29%]
2127:  tests/unit/core/test_cache_manager.py::TestCacheManager::test_create_from_config_memory PASSED [ 29%]
2128:  tests/unit/core/test_cache_manager.py::TestCacheManager::test_create_from_config_disk PASSED [ 29%]
2129:  tests/unit/core/test_cache_manager.py::TestCacheManager::test_create_from_config_redis PASSED [ 29%]
2130:  tests/unit/core/test_cache_manager.py::TestCacheManager::test_get_delegates_to_backend PASSED [ 30%]
2131:  tests/unit/core/test_cache_manager.py::TestCacheManager::test_set_delegates_to_backend PASSED [ 30%]
2132:  tests/unit/core/test_cache_manager.py::TestCacheManager::test_delete_delegates_to_backend PASSED [ 30%]
2133:  tests/unit/core/test_cache_manager.py::TestCacheManager::test_delete_pattern_delegates_to_backend PASSED [ 30%]
2134:  tests/unit/core/test_cache_manager.py::TestCacheManager::test_exists_delegates_to_backend PASSED [ 30%]
2135:  tests/unit/core/test_cache_manager.py::TestCacheManager::test_clear_delegates_to_backend PASSED [ 30%]
2136:  tests/unit/core/test_cache_manager.py::TestCacheManager::test_is_available_checks_backend PASSED [ 30%]
2137:  tests/unit/core/test_cache_manager.py::TestCacheManager::test_uses_fallback_when_primary_unavailable PASSED [ 30%]
2138:  tests/unit/core/test_cache_manager.py::TestCacheManager::test_connect_sets_fallback_on_primary_failure PASSED [ 30%]
2139:  tests/unit/core/test_cache_manager.py::TestCacheManager::test_disconnect_closes_all_backends PASSED [ 30%]
...

2142:  tests/unit/core/test_cache_manager.py::TestCacheModuleFunctions::test_get_cache_manager_creates_singleton PASSED [ 30%]
2143:  tests/unit/core/test_cache_manager.py::TestCacheModuleFunctions::test_set_cache_manager PASSED [ 30%]
2144:  tests/unit/core/test_cache_manager.py::TestCacheModuleFunctions::test_initialize_cache PASSED [ 31%]
2145:  tests/unit/core/test_cache_manager.py::TestCacheModuleFunctions::test_shutdown_cache PASSED [ 31%]
2146:  tests/unit/core/test_cache_manager.py::TestPropertyCacheManager::test_generate_cache_key PASSED [ 31%]
2147:  tests/unit/core/test_cache_manager.py::TestPropertyCacheManager::test_generate_cache_key_different_filters PASSED [ 31%]
2148:  tests/unit/core/test_cache_manager.py::TestPropertyCacheManager::test_generate_cache_key_different_users PASSED [ 31%]
2149:  tests/unit/core/test_cache_manager.py::TestPropertyCacheManager::test_invalidate_property_caches PASSED [ 31%]
2150:  tests/unit/core/test_cache_manager.py::TestPropertyCacheManager::test_get_cached_properties PASSED [ 31%]
2151:  tests/unit/core/test_cache_manager.py::TestPropertyCacheManager::test_cache_properties PASSED [ 31%]
2152:  tests/unit/core/test_cache_manager.py::TestDiskCacheBackend::test_round_trip_and_delete_pattern PASSED [ 31%]
2153:  tests/unit/core/test_cache_manager.py::TestDiskCacheBackend::test_rejects_oversized_entries PASSED [ 31%]
2154:  tests/unit/core/test_config.py::TestSettings::test_async_database_url_from_postgresql PASSED [ 31%]
2155:  tests/unit/core/test_config.py::TestSettings::test_async_database_url_from_postgres PASSED [ 31%]
2156:  tests/unit/core/test_config.py::TestSettings::test_async_database_url_already_async PASSED [ 31%]
2157:  tests/unit/core/test_config.py::TestSettings::test_default_cache_settings FAILED [ 31%]
2158:  tests/unit/core/test_config.py::TestSettings::test_cache_ttl_settings PASSED [ 32%]
...

2161:  tests/unit/core/test_config.py::TestSettings::test_vastu_default_provider PASSED [ 32%]
2162:  tests/unit/core/test_config.py::TestSettings::test_supabase_client_key_returns_publishable_key PASSED [ 32%]
2163:  tests/unit/core/test_config.py::TestSettings::test_auto_blog_defaults PASSED [ 32%]
2164:  tests/unit/core/test_config.py::TestSettings::test_auto_blog_publisher_user_id_blank_string_is_treated_as_none PASSED [ 32%]
2165:  tests/unit/core/test_constants.py::TestVisionConstants::test_valid_vision_providers PASSED [ 32%]
2166:  tests/unit/core/test_constants.py::TestVisionConstants::test_default_vision_provider_is_glm PASSED [ 32%]
2167:  tests/unit/core/test_constants.py::TestVisionConstants::test_default_vision_model_gemini PASSED [ 32%]
2168:  tests/unit/core/test_constants.py::TestVisionConstants::test_default_vision_model_glm PASSED [ 32%]
2169:  tests/unit/core/test_constants.py::TestVisionConstants::test_valid_providers_are_tuple PASSED [ 32%]
2170:  tests/unit/core/test_constants.py::TestVisionConstants::test_fallback_provider_default PASSED [ 32%]
2171:  tests/unit/core/test_constants.py::TestConstantsDeriveFromSettings::test_gemini_model_fallback_when_settings_none PASSED [ 32%]
2172:  tests/unit/core/test_constants.py::TestConstantsDeriveFromSettings::test_glm_model_fallback_when_settings_none PASSED [ 33%]
2173:  tests/unit/core/test_constants.py::TestConstantsDeriveFromSettings::test_fallback_provider_empty_when_not_set PASSED [ 33%]
2174:  tests/unit/core/test_db_resilience.py::test_execute_with_transient_retry_succeeds_on_second_attempt PASSED [ 33%]
2175:  tests/unit/core/test_db_resilience.py::test_execute_with_transient_retry_does_not_retry_non_transient PASSED [ 33%]
2176:  tests/unit/core/test_db_resilience.py::test_transient_db_error_detection_and_code_extraction PASSED [ 33%]
2177:  tests/unit/core/test_docs_contracts.py::test_docs_contract_validation_passes_for_current_repo PASSED [ 33%]
...

2179:  tests/unit/core/test_exceptions.py::TestBaseAPIException::test_default_status_code PASSED [ 33%]
2180:  tests/unit/core/test_exceptions.py::TestBaseAPIException::test_default_detail PASSED [ 33%]
2181:  tests/unit/core/test_exceptions.py::TestBaseAPIException::test_custom_detail PASSED [ 33%]
2182:  tests/unit/core/test_exceptions.py::TestBaseAPIException::test_custom_headers PASSED [ 33%]
2183:  tests/unit/core/test_exceptions.py::TestBaseAPIException::test_extra_kwargs PASSED [ 33%]
2184:  tests/unit/core/test_exceptions.py::TestNotFoundExceptions::test_not_found_exception PASSED [ 33%]
2185:  tests/unit/core/test_exceptions.py::TestNotFoundExceptions::test_property_not_found PASSED [ 33%]
2186:  tests/unit/core/test_exceptions.py::TestNotFoundExceptions::test_property_not_found_custom_message PASSED [ 34%]
2187:  tests/unit/core/test_exceptions.py::TestNotFoundExceptions::test_user_not_found PASSED [ 34%]
2188:  tests/unit/core/test_exceptions.py::TestNotFoundExceptions::test_agent_not_found PASSED [ 34%]
2189:  tests/unit/core/test_exceptions.py::TestNotFoundExceptions::test_booking_not_found PASSED [ 34%]
2190:  tests/unit/core/test_exceptions.py::TestNotFoundExceptions::test_visit_not_found PASSED [ 34%]
2191:  tests/unit/core/test_exceptions.py::TestAuthExceptions::test_unauthorized_exception PASSED [ 34%]
2192:  tests/unit/core/test_exceptions.py::TestAuthExceptions::test_forbidden_exception PASSED [ 34%]
2193:  tests/unit/core/test_exceptions.py::TestAuthExceptions::test_insufficient_permissions PASSED [ 34%]
2194:  tests/unit/core/test_exceptions.py::TestAuthExceptions::test_property_ownership_error PASSED [ 34%]
2195:  tests/unit/core/test_exceptions.py::TestValidationExceptions::test_validation_exception PASSED [ 34%]
2196:  tests/unit/core/test_exceptions.py::TestValidationExceptions::test_bad_request_exception PASSED [ 34%]
2197:  tests/unit/core/test_exceptions.py::TestConflictExceptions::test_conflict_exception PASSED [ 34%]
2198:  tests/unit/core/test_exceptions.py::TestConflictExceptions::test_booking_conflict_error PASSED [ 34%]
2199:  tests/unit/core/test_exceptions.py::TestConflictExceptions::test_duplicate_swipe_error PASSED [ 34%]
2200:  tests/unit/core/test_exceptions.py::TestRateLimitException::test_rate_limit_exception PASSED [ 35%]
2201:  tests/unit/core/test_exceptions.py::TestServiceUnavailableException::test_service_unavailable_exception PASSED [ 35%]
2202:  tests/unit/core/test_exceptions.py::TestPayloadExceptions::test_file_too_large_exception PASSED [ 35%]
2203:  tests/unit/core/test_exceptions.py::TestPayloadExceptions::test_invalid_file_exception PASSED [ 35%]
2204:  tests/unit/core/test_exceptions.py::TestExternalAndStorageExceptions::test_external_service_error PASSED [ 35%]
2205:  tests/unit/core/test_exceptions.py::TestExternalAndStorageExceptions::test_storage_exception PASSED [ 35%]
...

2209:  tests/unit/core/test_exceptions.py::TestBlogExceptions::test_blog_not_found PASSED [ 35%]
2210:  tests/unit/core/test_exceptions.py::TestBlogExceptions::test_category_not_found PASSED [ 35%]
2211:  tests/unit/core/test_exceptions.py::TestBlogExceptions::test_tag_not_found PASSED [ 35%]
2212:  tests/unit/core/test_exceptions.py::TestPMExceptions::test_lease_not_found PASSED [ 35%]
2213:  tests/unit/core/test_exceptions.py::TestPMExceptions::test_maintenance_request_not_found PASSED [ 36%]
2214:  tests/unit/core/test_exceptions.py::TestExceptionInheritance::test_domain_exceptions_inherit_from_base PASSED [ 36%]
2215:  tests/unit/core/test_exceptions.py::TestExceptionInheritance::test_exceptions_are_http_exceptions PASSED [ 36%]
2216:  tests/unit/core/test_logging.py::TestColorFormatter::test_format_returns_string PASSED [ 36%]
2217:  tests/unit/core/test_logging.py::TestColorFormatter::test_format_with_colors_enabled PASSED [ 36%]
2218:  tests/unit/core/test_logging.py::TestColorFormatter::test_format_without_colors PASSED [ 36%]
2219:  tests/unit/core/test_logging.py::TestColorFormatter::test_name_map_cleans_logger_names PASSED [ 36%]
2220:  tests/unit/core/test_logging.py::TestColorFormatter::test_extras_appended_as_key_value PASSED [ 36%]
2221:  tests/unit/core/test_logging.py::TestColorFormatter::test_level_color_mapping[DEBUG-\x1b[36m] PASSED [ 36%]
2222:  tests/unit/core/test_logging.py::TestColorFormatter::test_level_color_mapping[INFO-\x1b[32m] PASSED [ 36%]
2223:  tests/unit/core/test_logging.py::TestColorFormatter::test_level_color_mapping[WARNING-\x1b[33m] PASSED [ 36%]
2224:  tests/unit/core/test_logging.py::TestColorFormatter::test_level_color_mapping[ERROR-\x1b[31m] PASSED [ 36%]
2225:  tests/unit/core/test_logging.py::TestStructuredFormatter::test_format_returns_valid_json PASSED [ 36%]
...

2246:  tests/unit/core/test_utils.py::TestUtcNow::test_returns_timezone_aware_datetime PASSED [ 38%]
2247:  tests/unit/core/test_utils.py::TestUtcNow::test_returns_utc_timezone PASSED [ 38%]
2248:  tests/unit/core/test_utils.py::TestUtcNow::test_returns_recent_time PASSED [ 38%]
2249:  tests/unit/core/test_utils.py::TestUtcNowIso::test_returns_string PASSED [ 38%]
2250:  tests/unit/core/test_utils.py::TestUtcNowIso::test_is_parseable_as_iso8601 PASSED [ 38%]
2251:  tests/unit/core/test_utils.py::TestMakeTzAware::test_none_returns_none PASSED [ 38%]
2252:  tests/unit/core/test_utils.py::TestMakeTzAware::test_naive_datetime_gets_utc PASSED [ 38%]
2253:  tests/unit/core/test_utils.py::TestMakeTzAware::test_aware_datetime_stays_in_utc PASSED [ 38%]
2254:  tests/unit/core/test_utils.py::TestMakeTzAware::test_non_utc_timezone_converted_to_utc PASSED [ 38%]
2255:  tests/unit/core/test_utils.py::TestMakeTzAware::test_various_naive_dates[2024-1-1-0] PASSED [ 39%]
2256:  tests/unit/core/test_utils.py::TestMakeTzAware::test_various_naive_dates[2025-6-15-12] PASSED [ 39%]
2257:  tests/unit/core/test_utils.py::TestMakeTzAware::test_various_naive_dates[2025-12-31-23] PASSED [ 39%]
2258:  tests/unit/core/test_websocket.py::TestJobConnections::test_connect_job PASSED [ 39%]
2259:  tests/unit/core/test_websocket.py::TestJobConnections::test_disconnect_job PASSED [ 39%]
2260:  tests/unit/core/test_websocket.py::TestJobConnections::test_disconnect_job_removes_empty_set PASSED [ 39%]
2261:  tests/unit/core/test_websocket.py::TestJobConnections::test_disconnect_nonexistent_job_no_error PASSED [ 39%]
2262:  tests/unit/core/test_websocket.py::TestJobConnections::test_multiple_connections_same_job PASSED [ 39%]
2263:  tests/unit/core/test_websocket.py::TestJobConnections::test_send_job_update PASSED [ 39%]
2264:  tests/unit/core/test_websocket.py::TestJobConnections::test_send_job_update_no_connections PASSED [ 39%]
2265:  tests/unit/core/test_websocket.py::TestJobConnections::test_send_job_update_dead_connection_cleaned_up PASSED [ 39%]
2266:  tests/unit/core/test_websocket.py::TestJobConnections::test_get_job_connection_count PASSED [ 39%]
2267:  tests/unit/core/test_websocket.py::TestUserConnections::test_connect_user PASSED [ 39%]
2268:  tests/unit/core/test_websocket.py::TestUserConnections::test_disconnect_user PASSED [ 39%]
2269:  tests/unit/core/test_websocket.py::TestUserConnections::test_send_user_notification PASSED [ 40%]
2270:  tests/unit/core/test_websocket.py::TestUserConnections::test_send_user_notification_no_connections PASSED [ 40%]
2271:  tests/unit/core/test_websocket.py::TestUserConnections::test_get_user_connection_count PASSED [ 40%]
2272:  tests/unit/core/test_websocket.py::TestBroadcasts::test_broadcast_job_completion PASSED [ 40%]
2273:  tests/unit/core/test_websocket.py::TestBroadcasts::test_broadcast_job_error PASSED [ 40%]
2274:  tests/unit/mcp/test_apps_sdk.py::TestResourceMimeType::test_mime_type_format PASSED [ 40%]
2275:  tests/unit/mcp/test_apps_sdk.py::TestResourceMimeType::test_mime_type_contains_html PASSED [ 40%]
2276:  tests/unit/mcp/test_apps_sdk.py::TestResourceMimeType::test_mime_type_contains_profile PASSED [ 40%]
2277:  tests/unit/mcp/test_apps_sdk.py::TestSecuritySche...

Copy link
Copy Markdown

@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.

0 issues found across 3 files (changes from recent commits).

Requires human review: The PR introduces a new outgoing-likes endpoint, modifies discovery filtering, refactors property search mapping, and tunes DB config—these changes touch core business logic and require human review to ensure correctness and performance.
Re-trigger cubic

@saksham1991999 saksham1991999 merged commit 9f18ca1 into main May 16, 2026
3 of 5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants