# BAT-025 Developer Self-Verification - Status: **release-candidate — independent re-QC PASS; lead confirmation recorded** - Batch: BAT-025 - Requirement: REQ-057 - Date: 2026-07-15 - Scope boundary: local isolated PostgreSQL evidence only. No production DB, deployment, service activation, push, merge, or release action was performed. ## Acceptance mapping | REQ-057 acceptance area | Evidence | Result | | --- | --- | --- | | Explicit `0028` revision is the chain head | `alembic_version` queried in a throwaway PostgreSQL DB after upgrade | Pass — current revision `20260715_0028` | | Existing broker/manual business data survives upgrade | Real `20260628_0027 → head` upgrade after a representative pre-existing ledger row is inserted; row fields and metadata are asserted after upgrade | Pass | | `source` is backfilled/defaulted/not-null | Real upgrade asserts preserved row `source='broker'`; schema inspection checks text type, non-null constraint, and default | Pass | | Runtime-precreated metadata schema converges | Real test creates all four columns with nullable `source`, invokes bootstrap, and asserts source backfill/default/not-null plus `current=head` | Pass | | Representative broker/manual writes still work | Post-upgrade synthetic repository writes assert broker source and manual metadata fields | Pass | | Earlier fresh PostgreSQL chain can reach 0028 | `0025` identity-column PostgreSQL incompatibility corrected and exercised by fresh throwaway DB migration path | Pass | | API/manual-ledger regression | `tests/test_v1_portfolios_manual_ledger.py`, `tests/test_v1_portfolios_trades.py`, `tests/test_v1_portfolios_ledger.py` | Pass — 33 tests | | Whole-repository regression | pytest with project dev extra plus temporary TestClient dependency overlay | Pass — 597 tests, 11 warnings | | Lint/compile/diff hygiene | Ruff, compileall, `git diff --check` | Pass | ## Executed commands and results - `BAT025_LOCAL_POSTGRES_DSN=[REDACTED local loopback maintenance DSN] PYTHONPATH=. uv run --extra dev --with httpx2 python -m pytest -q --override-ini addopts='' -p no:cacheprovider tests/test_bat025_portfolio_ledger_manual_metadata_migration.py` - **3 passed in 6.10s**. - Each test creates and removes a UUID-named database on local loopback PostgreSQL; it refuses non-loopback hosts and non-`postgres` maintenance databases. - `PYTHONPATH=. uv run --extra dev --with httpx2 python -m pytest -q --override-ini addopts='' -p no:cacheprovider` - **597 passed, 11 warnings in 41.41s**. - Warnings are Starlette deprecations for `HTTP_422_UNPROCESSABLE_ENTITY`; they are not BAT-025 failures. - `uv run --extra dev ruff check app/db/migrations.py migrations/env.py migrations/versions/20260605_0025_ledger_consolidation.py tests/test_bat025_portfolio_ledger_manual_metadata_migration.py` - **All checks passed**. - `python3 -m compileall -q app migrations` and `git diff --check` - exit 0. ## Evidence boundaries and blockers - The local container is an isolated test target, not a staging or production database. - No production backup/restore, lock-duration measurement under production load, migration run against an operational DB, deploy, or service activation was attempted. - The test command uses a transient `httpx2` overlay because this environment's resolved Starlette TestClient requires it while the project declares `httpx`; no dependency source change was made for this batch. - The initial independent QC reproduced the technical evidence but returned FAIL because the then-committed document described the remediation as uncommitted and its test run produced an untracked `uv.lock`. Follow-up commit `71a0312e1efb54772b94fd7de0d8add5943f05af` corrected provenance/hygiene only; independent re-QC inspected that committed diff and passed it. ## Gate result - Developer self-verification: **complete for committed remediation `779d6f7711d700d6f56be22023cb826cc6f2fe28`**. - Initial independent QC: **FAIL** — documentation provenance and untracked `uv.lock` hygiene only; technical ACs reproduced. - Independent re-QC: **PASS** (`deleg_6b805aa0`, 2026-07-15). It verified `f6195ff → 779d6f7 → 71a0312` ancestry, committed provenance, clean worktree and absent `uv.lock`; reran the loopback PostgreSQL migration suite (**3 passed in 6.28s**) and direct Ruff 0.15.10 checks on the five relevant migration/runtime/test files (**All checks passed**). The non-declared `.venv/bin/ruff` path was correctly treated as non-contractual. - Lead decision: **`confirm-batch-verification` PASS accepted** — batch advances to `release-candidate`. - M5 release / operational migration: **not started and remains blocked pending separate release approval**.