572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/api/routers/budget.py:46:    batch_confirm_safe_candidates,
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/api/routers/budget.py:69:    preview_batch_confirm_candidates,
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/api/routers/budget.py:132:    confirm_manual_grocery_mapping,
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/api/routers/budget.py:137:    preview_manual_grocery_mapping,
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/api/routers/budget.py:227:@router.post("/household/source-mappings/confirm")
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/api/routers/budget.py:228:def household_source_mapping_confirm(payload: dict, conn: Connection = Depends(get_db)):
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/api/routers/budget.py:450:@router.post("/household/review/batch/preview")
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/api/routers/budget.py:451:def household_review_batch_preview(payload: dict, conn: Connection = Depends(get_db)):
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/api/routers/budget.py:455:@router.post("/household/review/batch/confirm")
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/api/routers/budget.py:456:def household_review_batch_confirm(payload: dict, conn: Connection = Depends(get_db)):
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/api/routers/budget.py:516:@router.post("/grocery-optimizer/manual-mapping/preview")
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/api/routers/budget.py:517:def grocery_optimizer_manual_mapping_preview(payload: dict, conn: Connection = Depends(get_db)):
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/api/routers/budget.py:518:    return preview_manual_grocery_mapping(conn, product_item_id=payload["product_item_id"], target_retailer=payload["target_retailer"], target_product_name=payload["target_product_name"], target_product_url=payload["target_product_url"], candidate_price_text=payload.get("candidate_price_text"), candidate_unit_price_text=payload.get("candidate_unit_price_text"), target_package_size=payload.get("target_package_size"), target_unit=payload.get("target_unit"), target_price_date=payload.get("target_price_date"), target_price_source=payload.get("target_price_source"), user_note=payload.get("user_note"))
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/api/routers/budget.py:521:@router.post("/grocery-optimizer/manual-mapping/confirm")
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/api/routers/budget.py:522:def grocery_optimizer_manual_mapping_confirm(payload: dict, conn: Connection = Depends(get_db)):
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/api/routers/budget.py:523:    return confirm_manual_grocery_mapping(conn, payload)
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/api/routers/budget.py:648:@router.post("/planning/batch/preview")
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/api/routers/budget.py:649:def budget_planning_batch_preview(payload: dict, conn: Connection = Depends(get_db)):
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/api/routers/budget.py:653:@router.post("/planning/batch/confirm")
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/api/routers/budget.py:654:def budget_planning_batch_confirm(payload: dict, conn: Connection = Depends(get_db)):
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/api/routers/budget.py:1127:@router.post("/transaction-candidates/batch-confirm-safe/preview")
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/api/routers/budget.py:1128:def transaction_candidates_batch_confirm_safe_preview(conn: Connection = Depends(get_db)):
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/api/routers/budget.py:1132:@router.post("/transaction-candidates/batch/preview")
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/api/routers/budget.py:1133:def transaction_candidates_batch_preview(payload: dict, conn: Connection = Depends(get_db)):
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/api/routers/budget.py:1134:    return preview_batch_confirm_candidates(conn, candidate_ids=payload.get("candidate_ids") or [], account_id=str(payload.get("account_id") or ""), budget_year=str(payload.get("budget_year") or "2026"))
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/api/routers/budget.py:1139:    return batch_mark_candidates(conn, candidate_ids=payload.get("candidate_ids") or [], action=str(payload.get("action") or ""), account_id=payload.get("account_id"), category_id=payload.get("category_id"), preview_id=payload.get("preview_id"), note=payload.get("note"), budget_year=str(payload.get("budget_year") or "2026"))
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/api/routers/budget.py:1148:@router.post("/transaction-candidates/batch-confirm-safe")
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/api/routers/budget.py:1149:def transaction_candidates_batch_confirm_safe(payload: dict, conn: Connection = Depends(get_db)):
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/api/routers/budget.py:1151:    return batch_confirm_safe_candidates(conn, account_id=account_id, candidate_ids=payload.get("candidate_ids") or None)
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/crypto/manage.py:151:            message="Crypto asset CoinGecko mapping needs manual confirmation.",
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/dashboard/data.py:659:            "provider_symbol_status": "mapped" if conn.execute("SELECT 1 FROM instrument_price_mappings WHERE instrument_id=? AND mapping_status IN ('mapped','confirmed','user_confirmed') AND provider_symbol IS NOT NULL LIMIT 1", (instrument_id,)).fetchone() else "missing_provider_symbol",
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/dashboard/data.py:900:        ("Instrument Import Kandidaten unbestätigt", "SELECT COUNT(*) AS c FROM instrument_import_candidates WHERE mapping_status NOT IN ('confirmed','rejected')", "warnung"),
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/dashboard/data.py:991:    sql += " ORDER BY CASE mapping_status WHEN 'needs_manual_review' THEN 0 WHEN 'probable' THEN 1 WHEN 'exact_isin_match' THEN 2 WHEN 'confirmed' THEN 3 ELSE 4 END, platform, source_row_number"
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/dashboard/data.py:1008:        "confirmed": c("mapping_status='confirmed'"),
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/dashboard/data.py:1009:        "blocked": c("mapping_status!='confirmed'"),
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/dashboard/views/page_13_equity_manage.py:384:        if st.button("Ausgewählten Mapping-Kandidaten bestätigen", key="mapping_candidate_confirm"):
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/equity/manage.py:496:    create_alert(conn, priority="warnung", category="market_data", entity_type="instrument", entity_id=instrument_id, rule_id="missing_market_price", message="Market price is missing for manually added instrument until mapping/price update is confirmed.", evidence={}, fingerprint="missing_market_price")
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/equity/manage.py:621:        from jarvis_finance.market_data.mappings import confirm_instrument_price_mapping
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/equity/manage.py:622:        confirm_instrument_price_mapping(
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/equity/manage.py:721:    create_alert(conn, priority="warnung", category="market_data", entity_type="instrument", entity_id=instrument_id, rule_id="missing_market_price", message="Market price is missing for manually added instrument until mapping/price update is confirmed.", evidence={}, fingerprint="missing_market_price")
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/imports/broker_mapping.py:144:def confirm_instrument_mapping(
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/imports/broker_mapping.py:153:        raise ValueError("Manual mapping confirmation requires a note")
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/imports/broker_mapping.py:166:        action="confirm_instrument_mapping",
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/imports/broker_mapping.py:439:def confirm_review_item_mapping(conn: Connection, *, review_item_id: str, instrument_id: str | None = None, account_id: str | None = None, note: str, created_by: str = "manual_review") -> str:
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/imports/broker_mapping.py:453:        action="confirm_review_item_mapping",
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/imports/broker_mapping.py:610:def confirm_review_item_instrument_mapping(conn: Connection, *, review_item_id: str, instrument_id: str | None = None, note: str, confirm_ticker_exchange: bool = False, created_by: str = "manual_review") -> str:
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/imports/broker_mapping.py:623:    return _audit_review_change(conn, review_item_id=review_item_id, action="confirm_instrument_mapping", old={"review_status": row["review_status"], "mapped_instrument_id": row["mapped_instrument_id"]}, new={"review_status": "mapped", "mapped_instrument_id": instrument_id, "readiness": readiness}, note=note, created_by=created_by)
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/imports/broker_mapping.py:626:def confirm_review_item_account_mapping(conn: Connection, *, review_item_id: str, account_id: str, note: str, created_by: str = "manual_review") -> str:
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/imports/broker_mapping.py:638:    return _audit_review_change(conn, review_item_id=review_item_id, action="confirm_account_mapping", old={"mapped_account_id": row["mapped_account_id"]}, new={"mapped_account_id": account_id, "readiness": readiness}, note=note, created_by=created_by)
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/imports/instrument_candidates.py:337:            mapping_status=CASE WHEN instrument_import_candidates.mapping_status='confirmed' THEN 'confirmed' ELSE excluded.mapping_status END,
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/imports/instrument_candidates.py:347:    if inp.mapping_status != "confirmed":
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/imports/instrument_candidates.py:362:        confirmed=sum(1 for c in items if c.mapping_status == "confirmed"),
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/imports/instrument_candidates.py:364:        importable_confirmed=sum(1 for c in items if c.mapping_status == "confirmed" and c.raw_quantity and (c.proposed_currency or c.raw_currency)),
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/imports/instrument_candidates.py:365:        blocked=sum(1 for c in items if c.mapping_status != "confirmed"),
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/imports/instrument_candidates.py:426:        confirmed=count("mapping_status='confirmed'"),
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/imports/instrument_candidates.py:428:        importable_confirmed=count("mapping_status='confirmed' AND COALESCE(raw_quantity,'')<>'' AND COALESCE(proposed_currency,raw_currency,'')<>''"),
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/imports/instrument_candidates.py:429:        blocked=count("mapping_status!='confirmed'"),
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/imports/instrument_candidates.py:450:    conn.execute("UPDATE instrument_import_candidates SET mapping_status=?, updated_at=? WHERE candidate_id=? AND mapping_status!='confirmed'", (status, utc_now(), candidate_id))
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/imports/instrument_candidates.py:469:        "UPDATE instrument_import_candidates SET proposed_isin=?, proposed_ticker=?, proposed_exchange=?, proposed_currency=?, mapping_status='confirmed', review_note=?, updated_at=? WHERE candidate_id=?",
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/imports/instrument_candidates.py:472:    record_audit_event(conn, source="instrument_import_review", action="confirm_candidate", entity_type="instrument_import_candidate", entity_id=candidate_id, new_values={"mapping_status": "confirmed", "has_isin": bool(isin)}, user_text_note=note, confirmed=True, created_by="dashboard")
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/imports/instrument_candidates.py:481:    record_audit_event(conn, source="instrument_import_review", action="reject_candidate", entity_type="instrument_import_candidate", entity_id=candidate_id, new_values={"mapping_status": "rejected"}, user_text_note=note, confirmed=True, created_by="dashboard")
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/imports/instrument_candidates.py:491:    conn.execute("UPDATE instrument_import_candidates SET mapping_status='needs_manual_review', review_note=?, updated_at=? WHERE candidate_id=? AND mapping_status!='confirmed'", (note, utc_now(), candidate_id))
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/imports/instrument_candidates.py:492:    record_audit_event(conn, source="instrument_import_review", action="defer_candidate", entity_type="instrument_import_candidate", entity_id=candidate_id, new_values={"mapping_status": "needs_manual_review"}, user_text_note=note, confirmed=True, created_by="dashboard")
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/imports/instrument_candidates.py:502:    if row["mapping_status"] != "confirmed":
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/imports/instrument_candidates.py:532:            SUM(CASE WHEN mapping_status='confirmed' THEN 1 ELSE 0 END) AS confirmed
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/imports/instrument_candidates.py:568:        WHERE mapping_status NOT IN ('confirmed','rejected')
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/imports/instrument_candidates.py:601:                {"role": "user", "content": json.dumps({"task": "Classify sanitized instrument import candidates for human review. Do not confirm anything. Return {updates:[{candidate_id, proposed_name, proposed_ticker, proposed_isin, proposed_exchange, proposed_currency, proposed_asset_class, mapping_status, review_note}]}. If an ISIN is not present in input, proposed_isin must be empty.", "candidates": batch}, ensure_ascii=False)},
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/imports/instrument_candidates.py:652:                WHERE candidate_id=? AND mapping_status NOT IN ('confirmed','rejected')
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/market_data/candidates.py:18:from jarvis_finance.market_data.mappings import confirm_instrument_price_mapping
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/market_data/candidates.py:694:    mapping_id = confirm_instrument_price_mapping(
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/market_data/candidates.py:735:                notes="Created/updated from confirmed mapping candidate; no portfolio amounts included.",
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/market_data/candidates.py:741:        # Mapping confirmation already wrote the authoritative mapping; catalog update is best-effort and audited by upsert when it succeeds.
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/market_data/mappings.py:26:def confirm_instrument_price_mapping(
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/market_data/mappings.py:52:        raise ValueError("instrument price mapping confirmation requires a note")
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/market_data/mappings.py:66:            raise ValueError("instrument ISIN conflicts with confirmed mapping")
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/market_data/mappings.py:142:        action="confirm_instrument_price_mapping",
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/budget_imports.py:1187:def batch_confirm_safe_candidates(conn: Connection, *, account_id: str, candidate_ids: list[str] | None = None) -> dict[str, int]:
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/budget_imports.py:1200:    record_audit_event(conn, source="vue_dashboard", action="batch_confirm_safe_candidates", entity_type="budget_transaction_candidate", entity_id="batch", new_values={"confirmed_count": confirmed, "skipped_count": skipped}, created_by="user")
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/budget_imports.py:1245:def _batch_confirm_block_reason(row: Any, *, budget_year: str) -> str | None:
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/budget_imports.py:1282:def preview_batch_confirm_candidates(conn: Connection, *, candidate_ids: list[str], account_id: str, budget_year: str = "2026") -> dict[str, Any]:
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/budget_imports.py:1292:        reason = _batch_confirm_block_reason(row, budget_year=budget_year)
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/budget_imports.py:1308:    record_audit_event(conn, source="vue_dashboard", action="batch_confirm_candidates_preview", entity_type="budget_transaction_candidate", entity_id=preview_id, new_values={"count": len(rows), "conflicts": len(conflicts), "categories": categories, "sources": sources, "blockers": blockers}, created_by="user")
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/budget_imports.py:1313:def batch_mark_candidates(conn: Connection, *, candidate_ids: list[str], action: str, account_id: str | None = None, category_id: str | None = None, preview_id: str | None = None, note: str | None = None, budget_year: str = "2026") -> dict[str, Any]:
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/budget_imports.py:1316:        raise HTTPException(status_code=422, detail="batch confirm requires preview_id")
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/budget_imports.py:1330:                reason = _batch_confirm_block_reason(row_for_year, budget_year=budget_year)
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/budget_imports.py:1352:    audit_id = record_audit_event(conn, source="vue_dashboard", action="batch_confirm_candidates" if action == "confirm" else f"batch_{action}_candidates", entity_type="budget_transaction_candidate", entity_id=preview_id or "batch", new_values=counts | {"candidate_count": len(candidate_ids)}, created_by="user")
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/budget_planning.py:296:    batch_audit_id = record_audit_event(conn, source="vue_dashboard", action="budget_planning_batch_confirmed", entity_type="budget_planning_batch", entity_id=preview["preview_id"], new_values={"confirmed_count": len(audit_ids), "category_audit_ids": audit_ids}, created_by="user")
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/budget_planning.py:298:    return {"status": "confirmed", "entity_id": preview["preview_id"], "audit_id": batch_audit_id, "confirmed_count": len(audit_ids), "message": "Budgetänderungen gespeichert"}
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/grocery_optimizer.py:255:def preview_manual_grocery_mapping(conn: Connection, *, product_item_id: str, target_retailer: str, target_product_name: str, target_product_url: str, candidate_price_text: str | None = None, candidate_unit_price_text: str | None = None, target_package_size: str | None = None, target_unit: str | None = None, target_price_date: str | None = None, target_price_source: str | None = None, user_note: str | None = None) -> dict[str, Any]:
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/grocery_optimizer.py:267:    _audit(conn, action="manual_mapping_preview", source=target_price_source or "manual", product_item_id=product_item_id, payload={k: v for k, v in preview.items() if k not in {"source_product"}})
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/grocery_optimizer.py:272:def confirm_manual_grocery_mapping(conn: Connection, preview: dict[str, Any]) -> dict[str, Any]:
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/grocery_optimizer.py:275:        raise ValueError("manual_mapping_preview_incomplete")
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/household_import.py:399:            conn, source="household_import", action="account_source_mapping_confirmed",
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/household_import.py:416:    return {"status": "confirmed", "mapping_id": mapping_id, "source_type": profile,
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/household_import.py:1645:    materialized = [row for row in writable if not row["requires_review"] and row["source_type"] != "migros_receipts" and row["disposition"] != "transfer_confirmed" and row["currency"] == "CHF" and row.get("mapping")]
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/household_import.py:1986:    existing = conn.execute("SELECT * FROM household_import_batches WHERE preview_fingerprint=?", (expected_preview,)).fetchone()
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/household_import.py:2009:    review_batch_confirmed = payload.get("confirm_review_candidates") is True
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/household_import.py:2010:    if not reconstructed["business_ready_for_confirm"] and not review_batch_confirmed:
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/household_import.py:2049:    batch_id = "hhbatch_" + expected_preview[:24]
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/household_import.py:2112:                "review_batch_confirmed": review_batch_confirmed,
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/household_import.py:2114:                    review_batch_confirmed and not reconstructed["business_ready_for_confirm"]
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/household_import.py:2126:            (batch_id, CONTRACT_VERSION, expected_preview, expected_baseline, reconstructed["input_fingerprint"],
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/household_import.py:2254:           FROM household_import_batches ORDER BY confirmed_at DESC,batch_id LIMIT ?""", (limit,)
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/household_import.py:3291:             AND action='household_review_batch_confirmed'""",
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/household_import.py:3341:            action="household_review_batch_confirmed",
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/portfolio_data.py:31:from jarvis_finance.market_data.mappings import confirm_instrument_price_mapping
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/portfolio_data.py:463:def confirm_postfinance_instrument_mappings(
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/portfolio_data.py:498:                     "Canonical identity from explicitly confirmed PostFinance mapping decision", now),
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/portfolio_data.py:500:            mapping_id = confirm_instrument_price_mapping(
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/portfolio_data.py:524:            action="confirm_postfinance_instrument_mappings",
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/portfolio_data.py:1254:            """SELECT batch_id, payload_hash, audit_id, preview_id, source_key, scope_kind, scope_id,
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/portfolio_data.py:1256:               FROM portfolio_ingestion_batches WHERE confirmation_id=?""",
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/portfolio_data.py:1340:            (batch_id, preview["source_key"], preview["scope_kind"], preview["account_id"],
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/portfolio_data.py:1359:        existing = conn.execute("SELECT batch_id, payload_hash, audit_id FROM portfolio_ingestion_batches WHERE confirmation_id=?", (confirmation_id,)).fetchone()
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/portfolio_data.py:1390:        batch = conn.execute("SELECT confirmed_at, status FROM portfolio_ingestion_batches WHERE source_key=? ORDER BY confirmed_at DESC LIMIT 1", (key,)).fetchone()
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/portfolio_data.py:1400:            "last_successful_confirmed_at": batch["confirmed_at"] if batch else None,
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/portfolio_data.py:1401:            "last_attempt_at": (attempt["finished_at"] if attempt else None) or (batch["confirmed_at"] if batch else None),
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/portfolio_data.py:1416:           FROM portfolio_ingestion_batches ORDER BY confirmed_at DESC LIMIT ? OFFSET ?""", (limit, offset)
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/postfinance_service.py:417:                 correction_id,cash_balance_id,snapshot_id,reason_code,audit_id,confirmed_at,confirmed_by)
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/postfinance_service.py:546:    payload = _preview_payload(bundle, accounts, mapping)
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/postfinance_service.py:863:                    "PostFinance account-role mapping conflicts with confirmed mapping"
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/postfinance_service.py:874:                source="postfinance_confirmed_role_mapping",
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/truewealth_service.py:92:        raise ValueError("TrueWealth portfolio account does not match the confirmed mapping")
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/truewealth_service.py:697:        """SELECT b.batch_id,b.snapshot_date,b.parser_id,b.parser_version,b.confirmed_at,b.status,
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/wealth_cockpit.py:205:        """SELECT f.batch_id,f.row_count,f.period_start,f.period_end,f.created_at,b.confirmed_at
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/services/wealth_cockpit.py:253:           FROM truewealth_import_batches ORDER BY confirmed_at DESC LIMIT 1"""
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/storage/migrations.py:2040:            ON portfolio_ingestion_batches(source_key, confirmed_at DESC);
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/storage/migrations.py:2042:            ON portfolio_ingestion_batches(scope_kind, scope_id, confirmed_at DESC);
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/storage/migrations.py:2228:            ON truewealth_import_batches(portfolio_id, snapshot_date DESC, confirmed_at DESC);
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/storage/migrations.py:2388:        CREATE INDEX IF NOT EXISTS idx_household_batches_confirmed
572ef44fc330911673ce190b7abfbbf210bff77c:src/jarvis_finance/storage/migrations.py:2389:          ON household_import_batches(confirmed_at DESC);
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_broker_mapping_import_wizard.py:13:    confirm_instrument_mapping,
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_broker_mapping_import_wizard.py:150:def test_audit_log_created_when_manual_mapping_confirmed() -> None:
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_broker_mapping_import_wizard.py:154:    audit_id = confirm_instrument_mapping(c, mapping_id=result["mapping_id"], instrument_id=instrument_id, note="Synthetic manual confirmation")
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_broker_parser_dry_run_pipeline.py:14:    confirm_review_item_account_mapping,
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_broker_parser_dry_run_pipeline.py:15:    confirm_review_item_instrument_mapping,
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_broker_parser_dry_run_pipeline.py:17:    confirm_review_item_mapping,
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_broker_parser_dry_run_pipeline.py:187:def test_review_item_mapping_confirmation_writes_audit(tmp_path: Path) -> None:
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_broker_parser_dry_run_pipeline.py:193:    audit_id = confirm_review_item_mapping(c, review_item_id=review_item_id, instrument_id="inst-1", note="Synthetic B2 confirmation")
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_broker_parser_dry_run_pipeline.py:238:    confirm_review_item_account_mapping(c, review_item_id=item, account_id="acct-broker", note="account")
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_broker_parser_dry_run_pipeline.py:240:    confirm_review_item_instrument_mapping(c, review_item_id=item, instrument_id="inst-1", note="instrument")
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_broker_parser_dry_run_pipeline.py:248:    audit = confirm_review_item_account_mapping(c, review_item_id=item, account_id="acct-broker", note="account")
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_broker_parser_dry_run_pipeline.py:250:    confirm_review_item_instrument_mapping(c, review_item_id=item, instrument_id="inst-1", note="instrument")
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_broker_parser_dry_run_pipeline.py:257:    confirm_review_item_account_mapping(c, review_item_id=item, account_id="acct-cash", note="cash account")
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_broker_parser_dry_run_pipeline.py:259:    # cash has no instrument mapping; reviewer confirmation is modelled by explicit metadata confirmation here
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_budget_duplicate_handling_hotfix.py:14:    preview_batch_confirm_candidates,
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_budget_duplicate_handling_hotfix.py:94:def test_batch_confirm_skips_duplicates_and_reports_per_candidate_error() -> None:
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_budget_duplicate_handling_hotfix.py:99:    preview = preview_batch_confirm_candidates(conn, candidate_ids=["ok1", "dup1"], account_id=account, budget_year="2026")
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_budget_duplicate_handling_hotfix.py:104:    result = batch_mark_candidates(conn, candidate_ids=["ok1", "dup1"], action="confirm", account_id=account, preview_id=preview["preview_id"], budget_year="2026")
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_budget_internal_transfer_hotfix.py:13:    preview_batch_confirm_candidates,
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_budget_internal_transfer_hotfix.py:102:        preview_batch_confirm_candidates(
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_budget_phase110_2026_core.py:12:    preview_batch_confirm_candidates,
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_budget_phase110_2026_core.py:46:        preview_batch_confirm_candidates(conn, candidate_ids=[ref[0]["transaction_candidate_id"]], account_id=account, budget_year="2026")
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_budget_phase110_2026_core.py:68:    preview = preview_batch_confirm_candidates(conn, candidate_ids=ids, account_id=account, budget_year="2026")
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_budget_phase110_2026_core.py:69:    confirmed = batch_mark_candidates(conn, candidate_ids=ids, action="confirm", account_id=account, preview_id=preview["preview_id"], budget_year="2026")
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_budget_phase15_source_aware_imports.py:6:    batch_confirm_safe_candidates,
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_budget_phase15_source_aware_imports.py:106:def test_review_actions_category_split_ignore_transfer_and_batch_confirm_safe_candidates() -> None:
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_budget_phase15_source_aware_imports.py:115:    safe = batch_confirm_safe_candidates(conn, account_id=account, candidate_ids=[c["transaction_candidate_id"] for c in list_transaction_candidates(conn) if c["classification"] in {"subscription_auto", "migros_auto_under_threshold", "migros_receipt_food_household"}])
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_budget_phase17_ux_workflow.py:13:    batch_confirm_safe_candidates,
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_budget_phase17_ux_workflow.py:60:    confirmed = batch_confirm_safe_candidates(conn, account_id=account, candidate_ids=[cid])
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_budget_phase19_review_productivity.py:16:    preview_batch_confirm_candidates,
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_budget_phase19_review_productivity.py:59:def test_phase19_batch_preview_required_before_confirm_and_actions() -> None:
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_budget_phase19_review_productivity.py:63:    preview = preview_batch_confirm_candidates(conn, candidate_ids=[cid], account_id=account)
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_budget_phase19_review_productivity.py:67:    result = batch_mark_candidates(conn, candidate_ids=[cid], action="confirm", account_id=account, preview_id=preview["preview_id"])
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_budget_phase19_review_productivity.py:70:    assert conn.execute("SELECT COUNT(*) FROM audit_log WHERE action IN ('batch_confirm_candidates_preview','batch_confirm_candidates')").fetchone()[0] == 2
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_budget_phase19_review_productivity.py:110:    preview = preview_batch_confirm_candidates(conn, candidate_ids=[cid], account_id=account)
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_budget_phase19_review_productivity.py:111:    batch_mark_candidates(conn, candidate_ids=[cid], action="confirm", account_id=account, preview_id=preview["preview_id"])
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_budget_planning_usability_v2.py:55:def test_batch_preview_and_confirm_collect_multiple_budget_changes_with_audit() -> None:
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_budget_planning_usability_v2.py:67:    result = confirm_budget_planning_batch(conn, preview["payload"])
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_budget_planning_usability_v2.py:75:    assert conn.execute("SELECT COUNT(*) FROM audit_log WHERE action='budget_planning_batch_confirmed'").fetchone()[0] == 1
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_budget_planning_usability_v2.py:78:def test_batch_preview_blocks_invalid_negative_values_before_confirm() -> None:
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_budget_review_bulk_assign_confirm.py:8:    preview_batch_confirm_candidates,
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_budget_review_bulk_assign_confirm.py:75:    preview = preview_batch_confirm_candidates(
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_budget_review_bulk_assign_confirm.py:98:    preview = preview_batch_confirm_candidates(conn, candidate_ids=selected, account_id=account_id, budget_year="2026")
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_crypto_manage.py:227:    adjust_crypto_position(conn, asset_id=asset, wallet_id=wallet_id, new_quantity_text="1.00000001", effective_date="2026-01-01", note="synthetic tiny correction", confirm=True)
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_fastapi_vue_cockpit_v11.py:175:def test_cash_withdrawal_and_correction_preview_confirm_use_positive_amount_and_audit() -> None:
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_fastapi_vue_cockpit_v11.py:188:    c_confirm = client.post("/api/cash/confirm", json={**correction, "preview_id": c_preview["preview_id"], "confirm": True}).json()
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_fx_market_data_phase_c.py:11:from jarvis_finance.market_data.mappings import confirm_instrument_price_mapping, ensure_instrument_price_mapping_quality
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_fx_market_data_phase_c.py:101:def test_confirm_instrument_price_mapping_writes_audit() -> None:
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_fx_market_data_phase_c.py:104:    mapping_id = confirm_instrument_price_mapping(conn, instrument_id='usd1', provider='mock', provider_symbol='USETF.N', provider_market='NYSE', confidence='manual', note='confirmed from broker')
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_fx_market_data_phase_c.py:109:    assert conn.execute("SELECT COUNT(*) AS n FROM audit_log WHERE action='confirm_instrument_price_mapping'").fetchone()["n"] == 1
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_fx_market_data_phase_c.py:114:    confirm_instrument_price_mapping(conn, instrument_id='usd1', provider='mock', provider_symbol='USETF.N', provider_market='NYSE', confidence='manual', note='test mapping')
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_fx_market_data_phase_c.py:129:    confirm_instrument_price_mapping(conn, instrument_id='usd1', provider='mock', provider_symbol='USETF.N', provider_market='NYSE', confidence='manual', note='test mapping')
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_grocery_matching_learning_v2.py:20:    preview_manual_grocery_mapping,
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_grocery_matching_learning_v2.py:21:    confirm_manual_grocery_mapping,
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_grocery_matching_learning_v2.py:206:    preview = preview_manual_grocery_mapping(conn, product_item_id=item_id, target_retailer='Denner', target_product_name='Denner Milch 1L', target_product_url='https://www.denner.ch/milch', candidate_price_text='1.10', candidate_unit_price_text='1.10/l', target_package_size='1L', target_unit='l', target_price_date='2026-05-19', target_price_source='manual/rappn_user_checked', user_note='manuell geprüft')
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_grocery_matching_learning_v2.py:209:    mapping = confirm_manual_grocery_mapping(conn, preview)
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_grocery_matching_learning_v2.py:213:    assert [row['action'] for row in audits] == ['manual_mapping_preview', 'mapping_inserted']
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_grocery_matching_learning_v2.py:223:    preview = preview_manual_grocery_mapping(conn, product_item_id=item_id, target_retailer='Denner', target_product_name='Denner Milch 1L', target_product_url='https://www.denner.ch/milch', candidate_price_text='1.10', candidate_unit_price_text='1.10/l')
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_grocery_matching_learning_v2.py:225:    mapping = confirm_manual_grocery_mapping(conn, preview)
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_household_classification_v2_golden.py:66:    configure_source_mapping(conn, {"confirm": True, "source_type": "raiffeisen_bank", "source_reference": "SYN-BANK-1", "budget_account_id": "bacc_bank"})
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_household_classification_v2_golden.py:67:    configure_source_mapping(conn, {"confirm": True, "source_type": "akb_bank", "source_reference": "SYN-BANK-2", "budget_account_id": "bacc_bank2"})
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_household_classification_v2_golden.py:68:    configure_source_mapping(conn, {"confirm": True, "source_type": "visa_credit_card", "source_reference": "SYN-CARD-1", "budget_account_id": "bacc_card"})
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_household_classification_v2_golden.py:193:        "SELECT COUNT(*) FROM audit_log WHERE action='account_source_mapping_confirmed'"
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_household_classification_v2_golden.py:200:        "SELECT COUNT(*) FROM audit_log WHERE action='account_source_mapping_confirmed'"
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_household_classification_v2_golden.py:213:    assert {error["code"] for error in visa_preview["errors"]} == {"account_source_mapping_missing_or_mismatch"}
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_household_classification_v2_golden.py:225:    assert {error["code"] for error in bank_preview["errors"]} == {"account_source_mapping_missing_or_mismatch"}
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_household_classification_v2_golden.py:509:def test_one_file_can_bind_two_confirmed_source_mappings() -> None:
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_household_import_v1_golden.py:50:    configure_source_mapping(conn, {"confirm": True, "source_type": "raiffeisen_bank", "source_reference": "SYN-RAI-001", "budget_account_id": "bacc_rai"})
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_household_import_v1_golden.py:51:    configure_source_mapping(conn, {"confirm": True, "source_type": "akb_bank", "source_reference": "SYN-AKB-001", "budget_account_id": "bacc_akb"})
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_household_import_v1_golden.py:52:    configure_source_mapping(conn, {"confirm": True, "source_type": "visa_credit_card", "source_reference": "SYN-CARD-001", "budget_account_id": "bacc_visa"})
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_household_import_v1_golden.py:128:def test_preview_bulk_loads_repeated_source_mapping_once_per_binding() -> None:
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_household_import_v1_golden.py:183:def test_explicit_review_batch_confirm_registers_rows_without_promoting_unclear_cashflows() -> None:
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_household_import_v1_golden.py:410:    for path in ("/api/budget/household/source-mappings", "/api/budget/household/import/preview",
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_import_execution_and_corrections.py:30:            review_status, import_readiness_status, reviewer_confirmed, snapshot_date_confirmed, ticker_exchange_confirmed, account_mapping_status, created_at
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_import_execution_and_corrections.py:68:            review_status, import_readiness_status, reviewer_confirmed, snapshot_date_confirmed, ticker_exchange_confirmed, account_mapping_status, created_at
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_instrument_import_candidates.py:121:    assert row["mapping_status"] == "confirmed"
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_portfolio_data_ingestion_reconciliation.py:150:        conn.execute("UPDATE portfolio_ingestion_batches SET status='confirmed' WHERE batch_id=?", (result["batch_id"],))
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_portfolio_data_ingestion_reconciliation.py:175:    assert conn.execute("SELECT COUNT(*) FROM portfolio_ingestion_items WHERE batch_id=?", (confirmed["batch_id"],)).fetchone()[0] == 3
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_postfinance_portfolio_source.py:14:from jarvis_finance.market_data.mappings import confirm_instrument_price_mapping
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_postfinance_portfolio_source.py:19:    confirm_postfinance_instrument_mappings,
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_postfinance_portfolio_source.py:211:def test_postfinance_invalid_or_ambiguous_batch_cannot_partially_confirm() -> None:
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_postfinance_portfolio_source.py:277:def test_confirmed_identity_mapping_supersedes_only_exact_unlineaged_placeholder() -> None:
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_postfinance_portfolio_source.py:299:    mapped = confirm_postfinance_instrument_mappings(conn, source)
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_postfinance_portfolio_source.py:366:    confirm_postfinance_instrument_mappings(conflict, source)
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_postfinance_portfolio_source.py:404:    confirm_postfinance_instrument_mappings(conn, source)
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_postfinance_portfolio_source.py:493:    confirm_instrument_price_mapping(
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_postfinance_portfolio_source.py:528:    test_postfinance_invalid_or_ambiguous_batch_cannot_partially_confirm()
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_postfinance_portfolio_source.py:532:    test_confirmed_identity_mapping_supersedes_only_exact_unlineaged_placeholder()
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_provider_integration_v2.py:21:from jarvis_finance.market_data.mappings import confirm_instrument_price_mapping
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_provider_integration_v2.py:199:    confirm_instrument_price_mapping(conn, instrument_id="usd1", provider="twelvedata", provider_symbol="VTI", provider_market="NYSE", confidence="manual", note="test mapping")
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_schema.py:47:    assert {"review_item_id", "dry_run_id", "source_platform", "source_row_ref", "row_hash", "source_label", "normalized_name", "detected_asset_class", "detected_currency", "quality_flags_json", "review_status", "import_readiness_status", "reviewer_confirmed", "snapshot_date_confirmed", "ticker_exchange_confirmed", "account_mapping_status"}.issubset(review_cols)
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_sprint11_portfolio_completeness.py:133:    assert batch.total == 0 and confirmed_canonical_positions(conn, as_of=TARGET.isoformat()) == []
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_sprint20c_performance_activation_hardening.py:84:           VALUES('pf-batch',?,?,?,?,?,?,?,'2026-07-27T09:14:30','confirmed','pf-audit',?,'user')""",
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_sprint20c_performance_activation_hardening.py:520:           VALUES('pf-batch-later',?,?,?,?,?,?,?,'2026-07-27T11:14:30','confirmed',
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_sprint20d_truewealth_valuation.py:29:    conn.execute("""INSERT INTO truewealth_import_batches(batch_id,portfolio_id,account_id,file_sha256,filename_sha256,source_file_type,parser_id,parser_version,provenance,snapshot_date,page_count,archive_reference,status,audit_id,confirmed_at,confirmed_by) VALUES('twb','twp','tw-total',?,?,'application/pdf','test','1','truewealth_customer_export',?,1,'private','confirmed','audit-anchor',?,'user')""", ("f" * 64, "n" * 64, day, NOW))
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_sprint20h1_postfinance_upload.py:265:    assert preview["mappings"] == {"secure": 22, "review_required": 0, "blocked": 0}
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_sprint20h1_postfinance_upload.py:484:           VALUES('old-batch',printf('%064d',1),printf('%064d',2),printf('%064d',3),'old','1','rev','private','2026-06-30','confirmed','old-audit','2026-06-30','synthetic')"""
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_sprint20h1_postfinance_upload.py:504:    assert "known_cash_projection_requires_correction" in preview["blocker_codes"]
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_sprint20h1_postfinance_upload.py:506:    correction = service.confirm_known_cash_projection_correction(conn, confirm=True)
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_sprint20h1_postfinance_upload.py:508:    assert service.confirm_known_cash_projection_correction(conn, confirm=True)["idempotent"] is True
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_sprint20h1_postfinance_upload.py:510:    assert "known_cash_projection_requires_correction" not in corrected_preview["blocker_codes"]
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_sprint9_fx_fmp_history.py:124:def test_fmp_historical_price_without_currency_uses_confirmed_mapping_currency(tmp_path) -> None:
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_sprint9_fx_fmp_history.py:221:    test_fmp_historical_price_without_currency_uses_confirmed_mapping_currency(tmp_path / "currency")
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_true_wealth_mapping_candidates_c3.py:45:        raise AssertionError("price provider should not be called without confirmed mappings")
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_true_wealth_mapping_candidates_c3.py:167:    mapping_id = select_mapping_candidate(conn, candidate_id=candidate_id, note='manual confirmation')
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_true_wealth_mapping_candidates_c3.py:169:    assert conn.execute("SELECT COUNT(*) AS c FROM audit_log WHERE action IN ('confirm_instrument_price_mapping','select_mapping_candidate')").fetchone()['c'] >= 2
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_true_wealth_mapping_candidates_c3.py:183:def test_market_price_dry_run_without_confirmed_mapping_does_not_call_provider() -> None:
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_true_wealth_mapping_candidates_c3.py:238:    select_mapping_candidate(conn, candidate_id=candidate_id, note='manual confirmation')
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_true_wealth_mapping_candidates_c3d.py:117:def test_candidate_confirmation_resolves_mapping_alerts_and_writes_catalog() -> None:
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_true_wealth_mapping_candidates_c3d.py:124:    select_mapping_candidate(conn, candidate_id=candidate_id, note="manual dashboard confirmation")
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_true_wealth_valuation_pilot.py:12:from jarvis_finance.market_data.mappings import confirm_instrument_price_mapping, ensure_instrument_price_mapping_quality
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_true_wealth_valuation_pilot.py:43:    confirm_instrument_price_mapping(conn, instrument_id='usd1', provider='mock', provider_symbol='USETF.N', provider_market='NYSE', confidence='manual', note='confirmed in pilot', hedge_status='unhedged', instrument_status='active')
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_true_wealth_valuation_pilot.py:45:    assert conn.execute("SELECT COUNT(*) AS c FROM audit_log WHERE action='confirm_instrument_price_mapping'").fetchone()['c'] == 1
572ef44fc330911673ce190b7abfbbf210bff77c:tests/unit/test_true_wealth_valuation_pilot.py:106:    confirm_instrument_price_mapping(conn, instrument_id='usd1', provider='mock', provider_symbol='USETF.N', provider_market='NYSE', confidence='manual', note='map', hedge_status='unhedged', instrument_status='active')

__HERMES_CWD_8d46a20096ed__/home/agent__HERMES_CWD_8d46a20096ed__
