Bump the backend-dependencies group in /backend with 10 updates - #5
Open
dependabot[bot] wants to merge 10 commits into
Open
Bump the backend-dependencies group in /backend with 10 updates#5dependabot[bot] wants to merge 10 commits into
dependabot[bot] wants to merge 10 commits into
Conversation
…covery Response to the 2026-08-08 external audit. All six P1 findings and the actionable P2s are fixed with regression tests. Backend: - Valuations store a SHA-256 input fingerprint; the API flags stale results and report generation returns 409 until valuation + strategies are refreshed from one consistent state - Unscored comparables get zero weight (was: full base weight) with an explicit warning; new effective_count drives adequacy warnings and the single-comparable band - Strict config validation (unknown keys, NaN/Infinity, negative range_k, negative dollar assumptions, non-positive similarity caps all 422) - CSV import rejects non-finite numbers and surplus cells as row errors; blank property_type/pool stay unknown (nullable columns + migration) instead of being guessed; pool adjustments skip unknown status - Explicit-null PATCH on required fields 422s; PATCH enforces the future-sale-date rule; no-op adjustment edits create no audit events - SQLite FK enforcement, SQL-side audit pagination, pre-read upload size check, report favicon fix Frontend: - Stale banners on valuation/strategies/report + header badge - Generate suggested adjustments persists visible assumption edits first - Failed saves keep drafts and re-enable controls (finally + commit-on- success drafts); report flow uses an explicit open link instead of a blockable popup and updates the stepper; dashboard gains complete/ archive/restore; weights editor blocks an all-zero total Docs/tools: METHODOLOGY calc-v1.1 notes, DATA_DICTIONARY, README (counts, env vars, e2e isolation, expanded known limitations), QA_REPORT addendum, CHANGELOG; verify_math.py verifies the new semantics and no longer assumes CMA id 1 (279 checks passing) Tests: 106 pytest (+19), 33 Vitest (+5), 4/4 Playwright (chromium+webkit)
Fixes the five remaining findings from the follow-up external audit. Backend: - Suggested adjustments record the assumption set that produced them (weight_configurations.suggestions_assumptions + migration). Changing assumptions without regenerating flags the config, adds an outdated_suggestions warning to any valuation computed from them, and blocks report generation (409) until suggestions are regenerated - Reports require a complete chain: no valuation or no strategies is 400, never a seller-facing document with empty sections - Hard input bounds: adjustment amounts +/-$1B, prices <= $1B, living area <= 1M sq ft, lot <= 100M sq ft (API and CSV) so extreme values cannot overflow; nonpositive_estimate warning when the central estimate <= 0 and strategies refuse to price off it (a falsy check previously let negative centrals generate negative list prices) - Strategies record the valuation_id they were derived from (+ migration); seed records the same provenance as the API Frontend: - Manual comparable entry defaults property type and pool to "Not specified" (stored as unknown) instead of guessing single-family/no-pool - Weight, multiplier, and adjustment changes refresh the header staleness flag immediately; adjustments page shows an outdated-suggestions banner and refetches the flag after regenerating - Report page disables Generate and lists exactly what is still missing; strategy cards show the valuation they were computed against Docs: METHODOLOGY provenance/bounds/completeness notes, DATA_DICTIONARY columns and limits, CHANGELOG, README test counts Tests: 112 pytest (+6), 33 Vitest, 4/4 Playwright (chromium+webkit), verify_math 279/279 against the reseeded demo
…-click repair Six previously deferred usability gaps, all user-facing convenience: - Form submits with validation errors focus the first invalid field - 44px touch targets for the include toggles and pool checkbox - Strategy price inputs display $ + thousands separators (text/numeric input; commit strips formatting, accepts pasted currency) - StaleBanner gains a one-click "Recalculate valuation & refresh strategies" button (pages refetch via onRefreshed) - Workflow stepper auto-centers the active step on narrow screens with an edge-fade scroll hint; scrolls only its own container (scrollIntoView panned the whole page on mobile and was replaced) - Inline rename in the CMA header (Enter/Escape, audit-logged; excluded from the staleness fingerprint as a cosmetic field) Verified in-browser on mobile and desktop viewports; 35 Vitest (+2), 4/4 Playwright (chromium+webkit), tsc/ESLint clean, verify_math 279/279.
UX review follow-up: the remaining gaps were all about staleness being invisible in places results appear. - Dashboard: value ranges whose inputs changed show an "outdated: recalculate" badge (the list API already computed the flag; it was simply never rendered) - Strategies: warn when the cards were generated from an earlier valuation (stored valuation_id vs latest) with an inline refresh action, distinct from the inputs-changed banner - Comparables table: secondary columns (sale date, sq ft, beds/baths, distance) collapse below md; sold date moves into the address sub-line and full details remain in the expandable similarity breakdown (10 -> 6 columns on phones) Verified headless on iPhone-width: 6 visible columns, page cannot pan horizontally (window.scrollX stays 0; the documentElement scrollWidth delta is a benign reporting artifact of the stepper's clipped scroller). 35 Vitest, 4/4 Playwright (chromium+webkit), tsc/ESLint clean, build ok. Note: the review's report-completeness and manual-entry-guessing items were already fixed in e01ed99 (gates + "Not specified" defaults).
…caps Third external audit round. The headline finding was real: the suggestion-provenance snapshot only tracked assumptions, so editing the subject's square footage let old adjustments into a "fresh" report. - suggestions_fingerprint (new column + migration) hashes ALL suggestion inputs: assumptions + subject priced fields + every comparable's priced fields (as-of date deliberately excluded to avoid daily false flags). Subject edits, comp edits, and newly added comps now flag suggestions outdated, warn on the valuation, and block the report - Strategy generation and price edits 409 while the latest valuation is stale, closing the API path that priced strategies off known-outdated numbers - Magnitude caps: assumptions <= $1B, similarity params <= 1M, subject living area/lot size capped, so extreme finite values cannot overflow into server errors - Subject property_type/has_pool now nullable with "Not specified" defaults (+ migration), matching the comparables' never-guess rule; report template renders unknowns as placeholders - Saving assumptions refreshes the header staleness flag immediately - Docs: corrected test counts (117/35), METHODOLOGY provenance section, DATA_DICTIONARY columns Tests: 117 pytest (+5, 1 strengthened), 35 Vitest, 4/4 Playwright, verify_math 279/279, migration up/down/up verified
Found while live-demoing the provenance gate: fingerprints hashed 1850 (int) and 1850.0 (float) differently, so SQLite/JSON round-trips could flip staleness flags on identical values. Two real consequences: - seed.py assigns int literals to Float columns and fingerprints them pre-persistence, so a fresh demo seed reported its own suggestions as outdated (unknown/true) the moment the values round-tripped - config defaults hold ints (bedroom_cap: 3) that become 3.0 after any user save, silently changing the valuation fingerprint All numeric fingerprint leaves are now normalized to float (bools kept as bools, dates as ISO strings) in both valuation and suggestion fingerprints. Verified live: fresh seed -> clean; subject resized -> flagged + report 409; reverted -> clean + report 201. Also: README roadmap notes the hosted read-only demo as future work (blocked on auth + rate limiting). Tests: 119 pytest (+2: type-stability unit test, seeded-provenance regression)
… ints Fourth external audit round, all four findings: - The one-click repair now regenerates outdated suggested adjustments before recalculating valuation and strategies (it previously cleared the banner while leaving the report gate blocked); button renamed to "Refresh the full analysis" and covered by two new component tests - Unknown provenance FAILS CLOSED: valuations/suggestions with null fingerprints (rows migrated from before provenance tracking) now 409 on strategy generation and reports until recalculated, instead of silently passing verification they cannot satisfy - CSV integer caps (bedrooms/parking <= 50, bathrooms <= 50, distance <= 20,000 mi): bedrooms=1e308 becomes a row error instead of a database-overflow 500 - Test counts corrected in README/ARCHITECTURE (121 backend / 36 frontend) Tests: 121 pytest (+2), 36 Vitest (+1), 4/4 Playwright, verify_math 279/279 on the reseeded demo
Updates the requirements on [fastapi](https://github.com/fastapi/fastapi), [uvicorn](https://github.com/Kludex/uvicorn), [sqlalchemy](https://github.com/sqlalchemy/sqlalchemy), [alembic](https://github.com/sqlalchemy/alembic), [pydantic](https://github.com/pydantic/pydantic), [python-multipart](https://github.com/Kludex/python-multipart), [jinja2](https://github.com/pallets/jinja), [pytest](https://github.com/pytest-dev/pytest), [httpx](https://github.com/encode/httpx) and [ruff](https://github.com/astral-sh/ruff) to permit the latest version. Updates `fastapi` to 0.141.1 - [Release notes](https://github.com/fastapi/fastapi/releases) - [Commits](fastapi/fastapi@0.110.0...0.141.1) Updates `uvicorn` to 0.52.1 - [Release notes](https://github.com/Kludex/uvicorn/releases) - [Changelog](https://github.com/Kludex/uvicorn/blob/main/docs/release-notes.md) - [Commits](Kludex/uvicorn@0.27.0...0.52.1) Updates `sqlalchemy` to 2.0.51 - [Release notes](https://github.com/sqlalchemy/sqlalchemy/releases) - [Changelog](https://github.com/sqlalchemy/sqlalchemy/blob/main/CHANGES.rst) - [Commits](https://github.com/sqlalchemy/sqlalchemy/commits) Updates `alembic` to 1.19.0 - [Release notes](https://github.com/sqlalchemy/alembic/releases) - [Changelog](https://github.com/sqlalchemy/alembic/blob/main/CHANGES) - [Commits](https://github.com/sqlalchemy/alembic/commits) Updates `pydantic` to 2.13.4 - [Release notes](https://github.com/pydantic/pydantic/releases) - [Changelog](https://github.com/pydantic/pydantic/blob/main/HISTORY.md) - [Commits](pydantic/pydantic@v2.5.0...v2.13.4) Updates `python-multipart` to 0.0.32 - [Release notes](https://github.com/Kludex/python-multipart/releases) - [Changelog](https://github.com/Kludex/python-multipart/blob/main/CHANGELOG.md) - [Commits](Kludex/python-multipart@0.0.9...0.0.32) Updates `jinja2` to 3.1.6 - [Release notes](https://github.com/pallets/jinja/releases) - [Changelog](https://github.com/pallets/jinja/blob/main/CHANGES.rst) - [Commits](pallets/jinja@3.1.0...3.1.6) Updates `pytest` to 9.1.1 - [Release notes](https://github.com/pytest-dev/pytest/releases) - [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst) - [Commits](pytest-dev/pytest@8.0.0...9.1.1) Updates `httpx` to 0.28.1 - [Release notes](https://github.com/encode/httpx/releases) - [Changelog](https://github.com/encode/httpx/blob/master/CHANGELOG.md) - [Commits](encode/httpx@0.27.0...0.28.1) Updates `ruff` to 0.16.1 - [Release notes](https://github.com/astral-sh/ruff/releases) - [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md) - [Commits](astral-sh/ruff@v0.4.0...0.16.1) --- updated-dependencies: - dependency-name: fastapi dependency-version: 0.141.1 dependency-type: direct:production dependency-group: backend-dependencies - dependency-name: uvicorn dependency-version: 0.52.1 dependency-type: direct:production dependency-group: backend-dependencies - dependency-name: sqlalchemy dependency-version: 2.0.51 dependency-type: direct:production dependency-group: backend-dependencies - dependency-name: alembic dependency-version: 1.19.0 dependency-type: direct:production dependency-group: backend-dependencies - dependency-name: pydantic dependency-version: 2.13.4 dependency-type: direct:production dependency-group: backend-dependencies - dependency-name: python-multipart dependency-version: 0.0.32 dependency-type: direct:production dependency-group: backend-dependencies - dependency-name: jinja2 dependency-version: 3.1.6 dependency-type: direct:production dependency-group: backend-dependencies - dependency-name: pytest dependency-version: 9.1.1 dependency-type: direct:production dependency-group: backend-dependencies - dependency-name: httpx dependency-version: 0.28.1 dependency-type: direct:production dependency-group: backend-dependencies - dependency-name: ruff dependency-version: 0.16.1 dependency-type: direct:production dependency-group: backend-dependencies ... Signed-off-by: dependabot[bot] <support@github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Updates the requirements on fastapi, uvicorn, sqlalchemy, alembic, pydantic, python-multipart, jinja2, pytest, httpx and ruff to permit the latest version.
Updates
fastapito 0.141.1Release notes
Sourced from fastapi's releases.
Commits
95f8322🔖 Release version 0.141.1 (#16106)f137944📝 Update release notesd623544🐛 Fix support for background tasks and headers from dependencies in `app.fron...1d211b9📝 Update release notes8a1f876📝 DocumentFASTAPI_ENVin FastAPI CLI guide (#16104)c7e7b65🔖 Release version 0.141.0 (#16103)6bceb84📝 Update release notes5429fed✨ Addapp.frontend(check_dir="auto"), to make local development more conven...628663f🔖 Release version 0.140.13 (#16096)0b54fd0📝 Update release notesUpdates
uvicornto 0.52.1Release notes
Sourced from uvicorn's releases.
Changelog
Sourced from uvicorn's changelog.
... (truncated)
Commits
ee8e45cVersion 0.52.1 (#3056)b57926dRemove duplicate content headers from WebSocket denial responses on websocket...49de1b9chore(deps): bump pymdown-extensions from 10.21.3 to 11.0 (#3042)2f3fa3aComplete server-initiated closes in SansIO WebSocket protocols (#3053)8c59d55chore(deps): bump the github-actions group with 5 updates (#3054)e148451Handle connection loss during WebSocket write backpressure (#3050)e16a69bAdd missing write flow control towebsockets-sansio(#3048)ef1dd44Fold the zttp-only tests back into the HTTP test suite (#3046)8f1b884Version 0.52.0 (#3044)f6833dbAdd experimental zttp HTTP/1.1 protocol (#2979)Updates
sqlalchemyto 2.0.51Release notes
Sourced from sqlalchemy's releases.
... (truncated)
Commits
Updates
alembicto 1.19.0Release notes
Sourced from alembic's releases.
Commits
Updates
pydanticto 2.13.4Release notes
Sourced from pydantic's releases.
Changelog
Sourced from pydantic's changelog.
... (truncated)
Commits
cf67d4bFix lintingf0d8a21Prepare release v2.13.45e3fe1dCheck for pydantic tag pattern in CI7f9edccDocument tagging conventionsb46a0c9Adaptpydantic-corelinker flags on macOS50629c8Update to PyPy 7.3.228522ebbPreserveRootModelcore metadataa37f3afAdaptMISSINGsentinel test to work with unreleasedtyping_extensionsver...909259aRemove Logfire example in documentation2c4174cBump libc from 0.2.155 to 0.2.185Updates
python-multipartto 0.0.32Release notes
Sourced from python-multipart's releases.
Changelog
Sourced from python-multipart's changelog.
... (truncated)
Commits
238ead6Version 0.0.32 (#302)8672979Replace per-byte partial-boundary scan with rfind lookbehind (#300)8190779Bump the python-packages group with 7 updates (#301)0d3c086Use uv package ecosystem for Dependabot (#299)4cffc68Version 0.0.31 (#298)c814948Reject negativeContent-Lengthinparse_form(#297)6b837d4Bound header field name size before validating (#296)e0c4f9dBump the github-actions group with 3 updates (#294)b8a01bbBump the python-packages group with 3 updates (#293)6732164Speed up multipart header parsing and callback dispatch (#295)Updates
jinja2to 3.1.6Release notes
Sourced from jinja2's releases.
Changelog
Sourced from jinja2's changelog.
... (truncated)
Commits
1520688release version 3.1.690457bbMerge commit from fork065334dattr filter uses env.getattr033c200start version 3.1.6bc68d4euse global contributing guide (#2070)247de5euse global contributing guideab8218cuse project advisory link instead of globalb4ffc8frelease version 3.1.5 (#2066)877f6e5release version 3.1.58d58859remove test pypiUpdates
pytestto 9.1.1Release notes
Sourced from pytest's releases.
Commits
cf470ecPrepare release version 9.1.1e0c8ce6Merge pull request #14625 from pytest-dev/patchback/backports/9.1.x/a07c31a97...1b82d16Merge pull request #14624 from pytest-dev/patchback/backports/9.1.x/b375b79ec...501c4bcMerge pull request #14596 from bluetech/doc-classmethodb61f588Merge pull request #14622 from chrisburr/fix-14608-initial-conftest-test-subdir9a567e0[automated] Update plugin list (#14617) (#14618)ef8b299Merge pull request #14620 from pytest-dev/patchback/backports/9.1.x/680f9f3ed...66abd07Merge pull request #14220 from bysiber/fix-stale-iexp-raisesgroup79fbf93Merge pull request #14612 from pytest-dev/patchback/backports/9.1.x/974ed48b6...0d312ebMerge pull request #14611 from bluetech/parametrize-argvalues-typingUpdates
httpxto 0.28.1Release notes
Sourced from httpx's releases.
Changelog
Sourced from httpx's changelog.
... (truncated)
Commits
26d48e0Version 0.28.1 (#3445)89599a9Fixverify=False,cert=...case. (#3442)8ecb86fAdd test for request params behavior changes (#3364) (#3440)0cb7e5aBump the python-packages group with 11 updates (#3434)15e21e9Updating deprecated docstring Client() class (#3426)80960faVersion 0.28.0. (#3419)a33c878Fixextensionstype annotation. (#3380)ce7e14dError on verify as str. (#3418)47f4a96Handle empty zstd responses (#3412)189fc4bUpdate CHANGELOG.md, fix typo(s) (#3406)Updates
ruffto 0.16.1Release notes
Sourced from ruff's releases.
... (truncated)
Changelog
Sourced from ruff's changelog.
... (truncated)
Commits
80790b3Bump 0.16.1 (#27330)63830f3[ty] Borrow from constraint set storage less often (#27328)f40dca9[ty] Preserve forwarded expanded-variadic diagnostic sources (#27266)0d80497Lint TOML files in the LSP (#26862)d91586bUpdate prek dependencies (#27293)7da4b8b[ty] Respect bounds and constraints in generic materializations (#27228)b20daf7[ty] refactor: add helper function to send partial results (#27249)4d4c8fa[ty] Emit diagnostic when specializing a non-generic class (#26883)7c3e2db[ty] Fix enum class container assignability (#27318)d5ef97f[flake8-return] Fix false positive when variable is read infinallyclaus...Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting
@dependabot rebase.Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR:
@dependabot rebasewill rebase this PR@dependabot recreatewill recreate this PR, overwriting any edits that have been made to it@dependabot show <dependency name> ignore conditionswill show all of the ignore conditions of the specified dependency@dependabot ignore <dependency name> major versionwill close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself)@dependabot ignore <dependency name> minor versionwill close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself)@dependabot ignore <dependency name>will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself)@dependabot unignore <dependency name>will remove all of the ignore conditions of the specified dependency@dependabot unignore <dependency name> <ignore condition>will remove the ignore condition of the specified dependency and ignore conditions