b3c11a2:tests/unit/test_asset_price_refresh.py:17:    create_asset_price_refresh_job,
b3c11a2:tests/unit/test_asset_price_refresh.py:18:    run_asset_price_refresh,
b3c11a2:tests/unit/test_asset_price_refresh.py:33:    queued, db_path = create_asset_price_refresh_job(conn, stale_hours=12)
b3c11a2:tests/unit/test_asset_price_refresh.py:56:    run_asset_price_refresh(
b3c11a2:tests/unit/test_asset_price_refresh.py:66:    assert status["status"] == "partial"
b3c11a2:tests/unit/test_asset_price_refresh.py:79:    queued, _ = create_asset_price_refresh_job(conn)
b3c11a2:tests/unit/test_asset_price_refresh.py:100:            create_asset_price_refresh_job(conn)
b3c11a2:tests/unit/test_asset_price_refresh.py:125:    queued, db_path = create_asset_price_refresh_job(conn)
b3c11a2:tests/unit/test_asset_price_refresh.py:141:        run_asset_price_refresh(db_path, queued["job_id"], runners=runners)
b3c11a2:tests/unit/test_asset_price_refresh.py:162:    queued, db_path = create_asset_price_refresh_job(conn)
b3c11a2:tests/unit/test_asset_price_refresh.py:168:    run_asset_price_refresh(db_path, queued["job_id"], runners={source: failed for source in ("equity", "crypto", "fx")})
b3c11a2:tests/unit/test_asset_price_refresh.py:179:def test_partial_cached_valuation_keeps_valid_source_status_and_marks_job_partial(tmp_path, monkeypatch):
b3c11a2:tests/unit/test_asset_price_refresh.py:182:    queued, db_path = create_asset_price_refresh_job(conn)
b3c11a2:tests/unit/test_asset_price_refresh.py:196:        "_recalculate_cached_valuations",
b3c11a2:tests/unit/test_asset_price_refresh.py:199:    monkeypatch.setattr(asset_refresh, "build_modelled_wealth_development", lambda *_args, **_kwargs: {"current": {"value_chf": "10"}})
b3c11a2:tests/unit/test_asset_price_refresh.py:201:    run_asset_price_refresh(db_path, queued["job_id"])
b3c11a2:tests/unit/test_asset_price_refresh.py:206:    assert status["status"] == "partial"
b3c11a2:tests/unit/test_asset_price_refresh.py:208:    assert crypto["error_code"] == "crypto_valuation_partial"
b3c11a2:tests/unit/test_asset_price_refresh.py:217:    failed_job, db_path = create_asset_price_refresh_job(conn)
b3c11a2:tests/unit/test_asset_price_refresh.py:224:    monkeypatch.setattr(asset_refresh, "build_modelled_wealth_development", lambda *_args, **_kwargs: (_ for _ in ()).throw(RuntimeError("post_refresh_interrupt")))
b3c11a2:tests/unit/test_asset_price_refresh.py:225:    run_asset_price_refresh(db_path, failed_job["job_id"], runners=runners)
b3c11a2:tests/unit/test_asset_price_refresh.py:229:    recovery_job, _ = create_asset_price_refresh_job(conn)
b3c11a2:tests/unit/test_asset_price_refresh.py:235:    monkeypatch.setattr(asset_refresh, "build_modelled_wealth_development", lambda *_args, **_kwargs: {"current": {"value_chf": "10"}})
b3c11a2:tests/unit/test_asset_price_refresh.py:236:    run_asset_price_refresh(db_path, recovery_job["job_id"], runners=no_op_runners)
b3c11a2:tests/unit/test_asset_price_refresh.py:240:    replay_job, _ = create_asset_price_refresh_job(conn)
b3c11a2:tests/unit/test_asset_price_refresh.py:242:    run_asset_price_refresh(db_path, replay_job["job_id"], runners=no_op_runners)
b3c11a2:tests/unit/test_asset_price_refresh.py:250:def test_partial_instrument_failure_preserves_success_and_quality_counts(tmp_path):
b3c11a2:tests/unit/test_asset_price_refresh.py:253:    queued, db_path = create_asset_price_refresh_job(conn)
b3c11a2:tests/unit/test_asset_price_refresh.py:268:    run_asset_price_refresh(
b3c11a2:tests/unit/test_asset_price_refresh.py:275:    assert status["status"] == "partial"
b3c11a2:tests/unit/test_asset_price_refresh.py:284:def test_unresolved_stale_asset_makes_job_partial(tmp_path):
b3c11a2:tests/unit/test_asset_price_refresh.py:287:    queued, db_path = create_asset_price_refresh_job(conn)
b3c11a2:tests/unit/test_asset_price_refresh.py:300:    run_asset_price_refresh(
b3c11a2:tests/unit/test_asset_price_refresh.py:307:    assert status["status"] == "partial"
b3c11a2:tests/unit/test_asset_price_refresh.py:316:def test_equity_valuation_warning_marks_source_partial(tmp_path, monkeypatch):
b3c11a2:tests/unit/test_asset_price_refresh.py:328:            "warnings": ["portfolio_valuation_partial"],
b3c11a2:tests/unit/test_asset_price_refresh.py:337:    assert result.diagnostics == ("portfolio_valuation_partial",)
b3c11a2:tests/unit/test_asset_price_refresh.py:389:    candidates, updated = asset_refresh._crypto_source(
b3c11a2:tests/unit/test_asset_price_refresh.py:403:    replay = asset_refresh._crypto_source(conn, (now - timedelta(hours=24)).isoformat())
b3c11a2:tests/unit/test_asset_price_refresh.py:481:    issues = asset_refresh._recalculate_cached_valuations(
b3c11a2:tests/unit/test_asset_price_refresh.py:533:    result = asset_refresh._crypto_source(conn, (now - timedelta(hours=24)).isoformat())
b3c11a2:tests/unit/test_asset_price_refresh.py:549:    assert quality.valuation_quality == "partial"
b3c11a2:tests/unit/test_asset_price_refresh.py:576:    result = asset_refresh._crypto_source(conn, (now - timedelta(hours=24)).isoformat())
b3c11a2:tests/unit/test_broker_parser_dry_run_pipeline.py:259:    # cash has no instrument mapping; reviewer confirmation is modelled by explicit metadata confirmation here
b3c11a2:tests/unit/test_budget_analytics_dashboard_v2.py:129:def test_changed_analytics_and_category_contracts_expose_partial_financial_data(
b3c11a2:tests/unit/test_budget_analytics_dashboard_v2.py:145:    assert cockpit["data_status"] == "partial"
b3c11a2:tests/unit/test_budget_analytics_dashboard_v2.py:150:    assert analysis["data_status"] == "partial"
b3c11a2:tests/unit/test_budget_analytics_dashboard_v2.py:153:    assert analysis["totals"]["data_status"] == "partial"
b3c11a2:tests/unit/test_budget_analytics_dashboard_v2.py:157:    assert categories["data_status"] == "partial"
b3c11a2:tests/unit/test_budget_analytics_dashboard_v2.py:164:    # Missing CHF conversion keeps the result partial, while the flexible
b3c11a2:tests/unit/test_budget_analytics_dashboard_v2.py:168:    assert status_row["data_status"] == "partial"
b3c11a2:tests/unit/test_budget_analytics_dashboard_v2.py:173:    assert detail["data_status"] == "partial"
b3c11a2:tests/unit/test_budget_planning_forecast_v1.py:214:def test_partial_import_ranges_never_count_as_complete_forecast_months() -> None:
b3c11a2:tests/unit/test_budget_review_bulk_assign_confirm.py:44:def test_bulk_category_assignment_updates_only_editable_candidates_and_reports_partial_errors() -> None:
b3c11a2:tests/unit/test_crypto_core.py:148:    assert ledger['transaction_type'] == 'partial_sell'
b3c11a2:tests/unit/test_crypto_price_update.py:274:def test_missing_local_price_alert_is_deduped_for_failed_refreshes() -> None:
b3c11a2:tests/unit/test_dashboard_functional_actions_v2.py:89:def test_equity_sale_partial_full_and_oversell_rules_with_audit_and_cash() -> None:
b3c11a2:tests/unit/test_dashboard_functional_actions_v2.py:92:    sale = {"position_id": "broker1:inst1", "cash_account_id": "cash1", "quantity": "4", "price_original": "12", "currency": "CHF", "trade_date": "2026-05-17", "fees_original": "1", "note": "partial sale"}
b3c11a2:tests/unit/test_dashboard_functional_actions_v2.py:100:    tx = conn.execute("SELECT transaction_type, quantity, net_amount_original, fee_original FROM transactions WHERE notes='partial sale'").fetchone()
b3c11a2:tests/unit/test_dashboard_functional_ux_stabilization.py:181:        "INSERT INTO alerts(alert_id, priority, category, entity_type, entity_id, rule_id, message, status, created_at, last_seen_at, occurrence_count, dedup_key, fingerprint) VALUES ('a1','warnung','fx','instrument','instrument-US9229087690','missing_fx','missing_fx','active','now','now',1,'d','f')"
b3c11a2:tests/unit/test_dashboard_mvp.py:102:    assert not ({"asset_id", "wallet_id", "dedup_key", "candidate_count", "provider_symbol_status"} & set(eth))
b3c11a2:tests/unit/test_dashboard_mvp.py:113:    assert not ({"asset_id", "wallet_id", "dedup_key", "raw_json"} & set(detail[0]))
b3c11a2:tests/unit/test_dashboard_mvp.py:200:    assert {"status", "priority", "occurrence_count", "last_seen_at", "fingerprint", "dedup_key"} <= set(alerts[0])
b3c11a2:tests/unit/test_dashboard_usability_simplification.py:82:        "INSERT INTO alerts(alert_id, priority, category, entity_type, entity_id, rule_id, message, status, created_at, last_seen_at, occurrence_count, dedup_key, fingerprint) VALUES ('a1','warnung','market','crypto_asset','asset-btc','missing_crypto_price','asset_id raw should not leak','active','now','now',1,'d1','f1')"
b3c11a2:tests/unit/test_dashboard_ux_sprint2.py:98:    "dedup_key",
b3c11a2:tests/unit/test_data_quality_alert_lifecycle.py:244:def test_failed_refresh_keeps_missing_alert_deduped() -> None:
b3c11a2:tests/unit/test_equity_manage.py:175:        transaction_type="partial_sell",
b3c11a2:tests/unit/test_equity_manage.py:180:        note="synthetic partial sell",
b3c11a2:tests/unit/test_equity_manage.py:191:            transaction_type="partial_sell",
b3c11a2:tests/unit/test_equity_manage.py:459:    add_manual_position_from_catalog(conn, catalog_entry_id=catalog_id, account_id=account_id, position_type="partial_sell", quantity_text="2", trade_date="2026-01-10", currency="CHF", cost_basis_original_text="220", note="synthetic sell", confirm=True)
b3c11a2:tests/unit/test_fx_market_data_phase_c.py:127:def test_missing_and_stale_market_price_alerts_are_deduped() -> None:
b3c11a2:tests/unit/test_household_classification_v2_golden.py:460:def test_raiffeisen_same_day_same_amount_rows_with_distinct_balances_are_never_fuzzy_deduplicated() -> None:
b3c11a2:tests/unit/test_household_cockpit_v1.py:98:    assert result['data_status']['status'] == 'partial'
b3c11a2:tests/unit/test_household_cockpit_v1.py:326:def test_review_quality_is_date_and_account_scoped_and_missing_binding_is_partial() -> None:
b3c11a2:tests/unit/test_household_cockpit_v1.py:351:    assert scoped['data_status']['status'] == 'partial'
b3c11a2:tests/unit/test_household_cockpit_v1.py:359:    assert unavailable['data_status']['status'] == 'partial'
b3c11a2:tests/unit/test_household_import_v1_golden.py:1131:    assert summary["data_status"] == "partial"
b3c11a2:tests/unit/test_household_import_v1_golden.py:1138:    assert overview["data_status"]["status"] == "partial"
b3c11a2:tests/unit/test_household_import_v1_golden.py:1163:def test_unconverted_foreign_currency_is_partial_and_never_invented_as_chf() -> None:
b3c11a2:tests/unit/test_household_import_v1_golden.py:1181:    assert summary["unavailable_chf_count"] == 1 and summary["data_status"] == "partial"
b3c11a2:tests/unit/test_household_import_v1_golden.py:1185:    assert overview["data_status"]["status"] == "partial"
b3c11a2:tests/unit/test_household_import_v1_golden.py:1188:    assert monthly["data_status"] == "partial"
b3c11a2:tests/unit/test_household_import_v1_golden.py:1229:    assert summary["unlinked_refund_count"] == 2 and summary["data_status"] == "partial"
b3c11a2:tests/unit/test_household_import_v1_golden.py:1240:    assert june["data_status"] == "partial"
b3c11a2:tests/unit/test_household_import_v1_golden.py:1280:    assert summary["unavailable_chf_count"] == 1 and summary["data_status"] == "partial"
b3c11a2:tests/unit/test_household_import_v1_golden.py:1283:    assert monthly["unavailable_transfer_count"] == 1 and monthly["data_status"] == "partial"
b3c11a2:tests/unit/test_household_import_v1_golden.py:1286:    assert june["data_status"] == "partial"
b3c11a2:tests/unit/test_household_import_v1_golden.py:1324:    assert conflict["data_status"] == "partial"
b3c11a2:tests/unit/test_household_import_v1_golden.py:1328:    assert conflict_month["data_status"] == "partial"
b3c11a2:tests/unit/test_household_import_v1_golden.py:1331:    assert conflict_june["data_status"] == "partial"
b3c11a2:tests/unit/test_household_import_v1_golden.py:1375:    assert malformed_overview["data_status"]["status"] == "partial"
b3c11a2:tests/unit/test_household_review_corrections_v1.py:359:def test_credit_card_settlement_is_neutral_and_partial_requires_explicit_acknowledgement() -> None:
b3c11a2:tests/unit/test_household_review_corrections_v1.py:382:    assert preview["completeness_status"] == "partial"
b3c11a2:tests/unit/test_household_review_corrections_v1.py:383:    assert preview["data_status"] == "partial"
b3c11a2:tests/unit/test_household_review_corrections_v1.py:384:    assert preview["requires_partial_acknowledgement"] is True
b3c11a2:tests/unit/test_household_review_corrections_v1.py:404:        conn, confirm_payload | {"acknowledge_partial": True}
b3c11a2:tests/unit/test_household_review_corrections_v1.py:412:        "SELECT completeness_status,data_status,acknowledged_partial FROM household_credit_card_settlements"
b3c11a2:tests/unit/test_household_review_corrections_v1.py:414:    assert tuple(relation) == ("partial", "partial", 1)
b3c11a2:tests/unit/test_household_review_corrections_v1.py:425:    partial_request = item_request(conn2, "payment", "credit_card_settlement")
b3c11a2:tests/unit/test_household_review_corrections_v1.py:426:    partial = preview_household_item_action(conn2, partial_request)
b3c11a2:tests/unit/test_household_review_corrections_v1.py:427:    assert partial["completeness_status"] == "partial"
b3c11a2:tests/unit/test_household_review_corrections_v1.py:428:    assert partial["data_status"] == "partial"
b3c11a2:tests/unit/test_household_review_corrections_v1.py:429:    assert partial["requires_partial_acknowledgement"] is True
b3c11a2:tests/unit/test_household_review_corrections_v1.py:430:    confirm_payload = partial_request | {
b3c11a2:tests/unit/test_household_review_corrections_v1.py:432:        "preview_fingerprint": partial["preview_fingerprint"],
b3c11a2:tests/unit/test_household_review_corrections_v1.py:435:    confirmed = confirm_household_item_action(conn2, confirm_payload | {"acknowledge_partial": True})
b3c11a2:tests/unit/test_household_review_corrections_v1.py:438:        conn2, confirm_payload | {"acknowledge_partial": True}
b3c11a2:tests/unit/test_household_review_corrections_v1.py:443:        "SELECT completeness_status,data_status,acknowledged_partial FROM household_credit_card_settlements"
b3c11a2:tests/unit/test_household_review_corrections_v1.py:445:    assert tuple(relation) == ("partial", "partial", 1)
b3c11a2:tests/unit/test_ledger_cash_wac_positions.py:47:    tx(conn, 's1', 'partial_sell', qty=2, gross=260, fee=2, tax=1, net=257)
b3c11a2:tests/unit/test_ledger_cash_wac_positions.py:87:def test_weighted_average_cost_buy_fee_usd_fx_and_partial_sell_realized_pnl() -> None:
b3c11a2:tests/unit/test_ledger_cash_wac_positions.py:91:    tx(conn, 's1', 'partial_sell', instrument='u1', date='2026-01-03', qty=5, gross=700, fee=7, net=693, currency='USD', fx='0.85')
b3c11a2:tests/unit/test_market_alerts.py:40:def test_refresh_crypto_prices_warns_missing_coingecko_and_missing_price_dedupes() -> None:
b3c11a2:tests/unit/test_market_alerts.py:52:def test_alert_lifecycle_dedupes_resolved_and_muted_but_allows_new_fingerprint() -> None:
b3c11a2:tests/unit/test_market_observation_idempotency.py:109:def test_partial_daily_run_accepts_new_economic_payload_as_new_version(tmp_path: Path) -> None:
b3c11a2:tests/unit/test_market_observation_idempotency.py:119:    assert first.status == "partial"
b3c11a2:tests/unit/test_modelled_wealth.py:7:from jarvis_finance.services.modelled_wealth import (
b3c11a2:tests/unit/test_modelled_wealth.py:8:    build_modelled_wealth_development,
b3c11a2:tests/unit/test_modelled_wealth.py:60:            note="modelled wealth fixture",
b3c11a2:tests/unit/test_modelled_wealth.py:82:            note="narrow modelled wealth test scope",
b3c11a2:tests/unit/test_modelled_wealth.py:156:    result = build_modelled_wealth_development(conn, period="1m", as_of="2026-08-27")
b3c11a2:tests/unit/test_modelled_wealth.py:157:    replay = build_modelled_wealth_development(conn, period="1m", as_of="2026-08-27")
b3c11a2:tests/unit/test_modelled_wealth.py:188:    result = build_modelled_wealth_development(conn, period="1m", as_of="2026-08-27")
b3c11a2:tests/unit/test_modelled_wealth.py:223:    result = build_modelled_wealth_development(conn, period="1m", as_of="2026-08-26")
b3c11a2:tests/unit/test_modelled_wealth.py:238:    add_model(conn, "tw-model", "tw-total", "2026-08-26", "520", "truewealth_modelled_daily")
b3c11a2:tests/unit/test_modelled_wealth.py:242:    result = build_modelled_wealth_development(conn, period="1m", as_of="2026-08-27")
b3c11a2:tests/unit/test_modelled_wealth.py:372:    result = build_modelled_wealth_development(conn, period="1m", as_of="2026-08-26")
b3c11a2:tests/unit/test_modelled_wealth.py:385:    result = build_modelled_wealth_development(conn, period="1m", as_of="2026-08-26")
b3c11a2:tests/unit/test_modelled_wealth.py:393:def test_missing_expected_investment_component_marks_partial_total_incomplete():
b3c11a2:tests/unit/test_modelled_wealth.py:399:    result = build_modelled_wealth_development(conn, period="1m", as_of="2026-08-26")
b3c11a2:tests/unit/test_modelled_wealth.py:427:        "truewealth_modelled_daily",
b3c11a2:tests/unit/test_modelled_wealth.py:431:    result = build_modelled_wealth_development(conn, period="all", as_of="2026-08-28")
b3c11a2:tests/unit/test_modelled_wealth.py:443:        "truewealth_modelled_daily", captured_at="2026-08-26T10:00:00Z",
b3c11a2:tests/unit/test_modelled_wealth.py:451:    result = build_modelled_wealth_development(conn, period="1m", as_of="2026-08-26")
b3c11a2:tests/unit/test_modelled_wealth.py:472:    result = build_modelled_wealth_development(conn, period="1m", as_of="2026-08-26")
b3c11a2:tests/unit/test_portfolio_analysis_v1.py:27:def modelled():
b3c11a2:tests/unit/test_portfolio_analysis_v1.py:90:    result = build_portfolio_analysis_v1(conn, as_of="2026-08-27", modelled=modelled())
b3c11a2:tests/unit/test_portfolio_analysis_v1.py:101:    assert result["dimensions"]["region"]["status"] == "partial"
b3c11a2:tests/unit/test_portfolio_data_ingestion_reconciliation.py:170:    assert preview["quality_impact"]["status"] == "partial"
b3c11a2:tests/unit/test_portfolio_market_analytics_v1.py:240:    assert stale_result.status == "partial"
b3c11a2:tests/unit/test_portfolio_market_analytics_v1.py:310:def scenario_partial_provider_failure_unknown_isin_missing_fx_and_unconfirmed_record_are_excluded(tmp_path: Path) -> None:
b3c11a2:tests/unit/test_portfolio_market_analytics_v1.py:328:    assert result.status == "partial"
b3c11a2:tests/unit/test_portfolio_market_analytics_v1.py:448:    assert result.status == "partial" and "stale_price" in result.reason_codes
b3c11a2:tests/unit/test_portfolio_market_analytics_v1.py:655:def test_identical_partial_market_retry_does_not_replace_immutable_snapshots(tmp_path: Path) -> None:
b3c11a2:tests/unit/test_portfolio_market_analytics_v1.py:675:    assert first.status == second.status == "partial"
b3c11a2:tests/unit/test_portfolio_market_analytics_v1.py:687:        scenario_partial_provider_failure_unknown_isin_missing_fx_and_unconfirmed_record_are_excluded,
b3c11a2:tests/unit/test_portfolio_performance_foundation.py:494:def test_stale_snapshot_keeps_calculation_but_marks_metric_partial():
b3c11a2:tests/unit/test_portfolio_performance_foundation.py:497:    add_valuation(conn, "v2", "2025-12-31", "11000", quality_status="partial", reasons=["stale_valuation"])
b3c11a2:tests/unit/test_portfolio_performance_foundation.py:500:    assert result["quality"]["twr"]["status"] == "partial"
b3c11a2:tests/unit/test_portfolio_performance_foundation.py:620:        row["cashflow_coverage_status"] in {"unavailable", "partial"}
b3c11a2:tests/unit/test_postfinance_portfolio_source.py:211:def test_postfinance_invalid_or_ambiguous_batch_cannot_partially_confirm() -> None:
b3c11a2:tests/unit/test_postfinance_portfolio_source.py:528:    test_postfinance_invalid_or_ambiguous_batch_cannot_partially_confirm()
b3c11a2:tests/unit/test_raiffeisen_manual_snapshot.py:11:from jarvis_finance.services.modelled_wealth import build_modelled_wealth_development
b3c11a2:tests/unit/test_raiffeisen_manual_snapshot.py:313:    model = build_modelled_wealth_development(conn, as_of="2026-08-27", period="all")
b3c11a2:tests/unit/test_reconciliation_snapshot_foundation.py:67:def test_missing_comparison_balance_is_partial_not_zero():
b3c11a2:tests/unit/test_reconciliation_snapshot_foundation.py:73:    assert item.status == "partial"
b3c11a2:tests/unit/test_reconciliation_snapshot_foundation.py:147:def test_mixed_stale_and_missing_source_is_partial():
b3c11a2:tests/unit/test_reconciliation_snapshot_foundation.py:148:    assert combined_freshness(["stale", "unavailable"]) == "partial"
b3c11a2:tests/unit/test_sprint11_portfolio_completeness.py:214:def test_unknown_values_remain_null_and_partial_summary_lists_all_missing() -> None:
b3c11a2:tests/unit/test_sprint11_portfolio_completeness.py:225:    assert result.status == "partial"
b3c11a2:tests/unit/test_sprint11_portfolio_completeness.py:232:    assert summary.valued_partial_chf == "10.00"
b3c11a2:tests/unit/test_sprint11_portfolio_completeness.py:249:    assert result.status == "partial" and "stale_price" in result.reason_codes
b3c11a2:tests/unit/test_sprint14_performance_contract.py:211:def test_attribution_unexplained_remainder_remains_visible_and_partial():
b3c11a2:tests/unit/test_sprint14_performance_contract.py:223:    assert bridge["status"] == "partial"
b3c11a2:tests/unit/test_sprint17d_annual_budget.py:172:    assert assistant["coverage"]["status"] == "partial"
b3c11a2:tests/unit/test_sprint17d_annual_budget.py:202:    assert assistant["coverage"]["status"] == "partial"
b3c11a2:tests/unit/test_sprint20b_performance_activation_daily_valuations.py:169:    assert failed.status == "partial" and failed.valuation_stored == 0
b3c11a2:tests/unit/test_sprint20b_performance_activation_daily_valuations.py:230:def test_partial_backfill_rejects_input_drift_and_new_preview_can_complete(tmp_path: Path) -> None:
b3c11a2:tests/unit/test_sprint20b_performance_activation_daily_valuations.py:285:def test_job_status_preserves_last_confirmed_date_when_latest_run_is_partial() -> None:
b3c11a2:tests/unit/test_sprint20b_performance_activation_daily_valuations.py:296:           ) VALUES('partial-run','daily_crypto_valuation_v1','2026-01-02',?,'partial',?,?,?)""",
b3c11a2:tests/unit/test_sprint20b_performance_activation_daily_valuations.py:304:    assert source["status"] == "partial"
b3c11a2:tests/unit/test_sprint20c_performance_activation_hardening.py:481:def test_partial_daily_postfinance_component_set_cannot_override_complete_official_pair():
b3c11a2:tests/unit/test_sprint20c_performance_activation_hardening.py:488:           VALUES('bad-partial-cash','account','pf-cash','pf-cash','100','CHF','CHF','1',
b3c11a2:tests/unit/test_sprint20c_performance_activation_hardening.py:490:                  'daily-run','partial','[\"stale_valuation\"]')"""
b3c11a2:tests/unit/test_sprint20c_performance_activation_hardening.py:557:def test_partial_postfinance_components_from_different_runs_are_not_combined():
b3c11a2:tests/unit/test_sprint20d_truewealth_productization.py:580:def test_uncertain_partial_name_match_is_never_confirmable():
b3c11a2:tests/unit/test_sprint20d_truewealth_productization.py:682:        "modelled_value_chf", "anchor_date", "net_external_cashflows_chf",
b3c11a2:tests/unit/test_sprint20d_truewealth_productization.py:683:        "latest_price_fx_date", "latest_modelled_value", "input_fingerprint",
b3c11a2:tests/unit/test_sprint20d_truewealth_productization.py:686:    assert set(package.json()["modelled_valuation"]) == set(model_payload)
b3c11a2:tests/unit/test_sprint20d_truewealth_valuation.py:21:    store_truewealth_modelled_daily_valuation,
b3c11a2:tests/unit/test_sprint20d_truewealth_valuation.py:44:def test_modelled_value_uses_positions_and_cash_once_and_keeps_contribution_unassigned():
b3c11a2:tests/unit/test_sprint20d_truewealth_valuation.py:57:    assert result['modelled_value_chf'] == '120.00'
b3c11a2:tests/unit/test_sprint20d_truewealth_valuation.py:65:def test_non_chf_cashflow_without_canonical_amount_blocks_modelled_value():
b3c11a2:tests/unit/test_sprint20d_truewealth_valuation.py:70:    conn.execute("""INSERT INTO transactions(transaction_id,transaction_type,activity_kind,account_id,trade_date,gross_amount_original,net_amount_original,currency_original,fx_status,source_type,source_id,is_confirmed,quality_status,created_at) VALUES('usd-deposit','external_deposit','external_deposit','tw-total','2026-07-28','100','100','USD','missing','test','test',1,'partial',?)""", (NOW,))
b3c11a2:tests/unit/test_sprint20d_truewealth_valuation.py:76:    assert result["modelled_value_chf"] is None
b3c11a2:tests/unit/test_sprint20d_truewealth_valuation.py:91:    assert result["modelled_value_chf"] == "100.00"
b3c11a2:tests/unit/test_sprint20d_truewealth_valuation.py:94:def test_missing_exact_price_blocks_new_day_without_faking_a_modelled_fallback():
b3c11a2:tests/unit/test_sprint20d_truewealth_valuation.py:102:    assert result['modelled_value_chf'] is None
b3c11a2:tests/unit/test_sprint20d_truewealth_valuation.py:104:    assert result['latest_modelled_value'] is None
b3c11a2:tests/unit/test_sprint20d_truewealth_valuation.py:115:    stored = store_truewealth_modelled_daily_valuation(conn, as_of='2026-07-28')
b3c11a2:tests/unit/test_sprint20d_truewealth_valuation.py:116:    repeated = store_truewealth_modelled_daily_valuation(conn, as_of='2026-07-28')
b3c11a2:tests/unit/test_sprint20d_truewealth_valuation.py:121:    assert row['quality_status'] == 'partial'
b3c11a2:tests/unit/test_sprint20d_truewealth_valuation.py:123:    assert MODEL_SOURCE == "truewealth_modelled_daily"
b3c11a2:tests/unit/test_sprint20d_truewealth_valuation.py:126:            "SELECT new_values_json FROM audit_log WHERE action='truewealth_modelled_daily_value_stored'"
b3c11a2:tests/unit/test_sprint20d_truewealth_valuation.py:177:    second = store_truewealth_modelled_daily_valuation(conn, as_of='2026-07-28')
b3c11a2:tests/unit/test_sprint20d_truewealth_valuation.py:181:    assert first['modelled_value_chf'] == '100.00'
b3c11a2:tests/unit/test_sprint20d_truewealth_valuation.py:189:    conn.execute("""INSERT INTO portfolio_valuation_snapshots(snapshot_id,scope_kind,scope_id,account_id,value_original,currency,base_currency,fx_rate_to_base,fx_direction,valuation_at,source,captured_at,snapshot_version,source_reference,quality_status,reason_codes_json) VALUES('model-old','account','tw-total','tw-total','120','CHF','CHF','1','original_to_base','2026-07-28',?,?,1,'model-fp','partial','[\"modelled_valuation\"]')""", (MODEL_SOURCE,NOW))
b3c11a2:tests/unit/test_sprint20d_truewealth_valuation.py:215:    conn.execute("""INSERT INTO portfolio_valuation_snapshots(snapshot_id,scope_kind,scope_id,account_id,value_original,currency,base_currency,fx_rate_to_base,fx_direction,valuation_at,source,captured_at,snapshot_version,source_reference,quality_status,reason_codes_json) VALUES('model-after','account','tw-total','tw-total','153000','CHF','CHF','1','original_to_base','2026-07-28',?,?,1,'model-fp','partial','[\"modelled_valuation\"]')""", (MODEL_SOURCE,NOW))
b3c11a2:tests/unit/test_sprint20d_truewealth_valuation.py:223:    assert result["latest_modelled_value"]["date"] == "2026-07-28"
b3c11a2:tests/unit/test_sprint20d_truewealth_valuation.py:245:                      'partial','[\"modelled_valuation\"]')""",
b3c11a2:tests/unit/test_sprint20d_truewealth_valuation.py:258:        ('2026-07-03', '125', 'modelled'),
b3c11a2:tests/unit/test_sprint20e_crypto_market_recovery.py:145:    assert result["status"] == "partial"
b3c11a2:tests/unit/test_sprint20e_crypto_market_recovery.py:154:    assert result["status"] in {"partial", "blocked"}
b3c11a2:tests/unit/test_sprint20e_crypto_market_recovery.py:169:    assert stale.status == "partial"
b3c11a2:tests/unit/test_sprint20e_crypto_market_recovery.py:174:    assert tuple(status) == ("partial", 0, 0)
b3c11a2:tests/unit/test_sprint20e_crypto_market_recovery.py:360:def test_partial_attempt_reports_fetched_and_missing_assets_from_same_run(
b3c11a2:tests/unit/test_sprint20e_crypto_market_recovery.py:364:    activate_crypto_market_source(conn, confirmation_id="partial-status")
b3c11a2:tests/unit/test_sprint20e_crypto_market_recovery.py:370:        lock_path=tmp_path / "partial.lock",
b3c11a2:tests/unit/test_sprint20e_crypto_market_recovery.py:372:    assert result.status == "partial"
b3c11a2:tests/unit/test_sprint20e_crypto_market_recovery.py:379:    assert status["operational_status"] == "partial"
b3c11a2:tests/unit/test_sprint20g1_crypto_reconciliation.py:88:def test_partial_snapshot_does_not_replace_current_balance_basis(tmp_path: Path) -> None:
b3c11a2:tests/unit/test_sprint20g1_crypto_reconciliation.py:93:    assert preview["status"] == "partial"
b3c11a2:tests/unit/test_sprint20g1_crypto_reconciliation.py:94:    result = confirm_crypto_snapshot(conn, CryptoSnapshotConfirmRequest(**payload, preview_id=preview["preview_id"], confirmation_key="partial", confirm=True))
b3c11a2:tests/unit/test_sprint20g1_crypto_reconciliation.py:95:    assert result["snapshot_status"] == "partial"
b3c11a2:tests/unit/test_sprint9_fx_fmp_history.py:182:    assert first.status == "partial"
b3c11a2:tests/unit/test_sprint9_fx_fmp_history.py:185:    assert replay.status == "partial"
b3c11a2:tests/unit/test_true_wealth_mapping_candidates_c3.py:13:    dedupe_missing_provider_symbol_alerts,
b3c11a2:tests/unit/test_true_wealth_mapping_candidates_c3.py:195:def test_missing_provider_symbol_dedupes_per_instrument_only() -> None:
b3c11a2:tests/unit/test_true_wealth_mapping_candidates_c3.py:199:    resolved = dedupe_missing_provider_symbol_alerts(conn)
b3c11a2:tests/unit/test_true_wealth_valuation_pilot.py:153:    assert pos_missing.valuation_status == 'partially_valuable'
b3c11a2:tests/unit/test_vue_dashboard_v12_acceptance.py:214:def test_provider_search_deduplicates_enriches_filters_and_ranks_goog(monkeypatch) -> None:
b3c11a2:tests/unit/test_wealth_cockpit_v1.py:255:        lambda conn: SimpleNamespace(valued_partial_chf="200.00", coverage_complete=True, unvalued_positions=0, as_of="2026-07-31"),
b3c11a2:tests/unit/test_wealth_cockpit_v1.py:515:    assert payload["modelled_development"]["method"] == "modelled_wealth_daily_v1"
b3c11a2:tests/unit/test_wealth_cockpit_v1.py:522:        "partial",
b3c11a2:tests/unit/test_wealth_cockpit_v1.py:528:def test_ytd_is_forwarded_to_the_modelled_wealth_series(monkeypatch):
b3c11a2:tests/unit/test_wealth_cockpit_v1.py:531:    original = cockpit.build_modelled_wealth_development
b3c11a2:tests/unit/test_wealth_cockpit_v1.py:533:    def capture_modelled(conn, *, period, as_of=None):
b3c11a2:tests/unit/test_wealth_cockpit_v1.py:537:    monkeypatch.setattr(cockpit, "build_modelled_wealth_development", capture_modelled)
b3c11a2:tests/unit/test_wealth_cockpit_v1.py:611:    assert dimensions["current_value"]["status"] == "partial"
b3c11a2:tests/unit/test_wealth_cockpit_v1.py:612:    assert dimensions["freshness"]["status"] == "partial"
b3c11a2:tests/unit/test_wealth_cockpit_v1.py:625:def test_source_performance_status_is_partial_when_only_some_metrics_are_ready():
b3c11a2:tests/unit/test_wealth_cockpit_v1.py:632:    ) == "partial"
b3c11a2:tests/unit/test_wealth_cockpit_v1.py:635:def test_diagnostics_name_sources_deduplicate_and_limit_prominent_hints():
b3c11a2:tests/unit/test_wealth_cockpit_v1.py:737:            valued_partial_chf="0.00",
b3c11a2:tests/unit/test_wealth_cockpit_v1.py:769:            valued_partial_chf="0.00",

__HERMES_CWD_8d46a20096ed__/home/agent/.hermes/worktrees/FinanceManager-sprint23.3-hotfix__HERMES_CWD_8d46a20096ed__
