Spaces:
Paused
Paused
Commit History
-
Fix Gmail statement attribution and reject non-card imports
6303b7b
-
offers: +356 verified market-sweep deals (2026-08-08)
2b55cd4
-
Bug hunt round 2: statement parsing, offer gating, geo scope, flight backend
3eccb81 -
Deploy: statement parser fixes, pax-aware scoring, 587 verified offers
9a100d5
-
Deploy: fast search default, income bands, statement parser fixes
7c1b9e0
-
backend sync 2026-07-29: 411 gate-verified offers, 139-card catalogue, redemptions layer, walkthrough fixes (flat clamp, debit/new-user scoping)
2fb33b2
-
Statement parsing: fix hallucinated rows + undetectable issuers
Found by a real-statement simulation (tests/statement_sim.py) and verified against real HDFC Infinia + Kotak statements: * Hallucinated transactions: _PDF_START only matched 4 literal phrases, so layouts with a plain 'Date Description Amount' table header gated nothing and fell back to ungated parsing from the top of the page, turning the header's own 'Statement Date ... Total Outstanding Rs.x' summary line into a phantom purchase. _PDF_STOP was only consulted for lines WITHOUT an amount, so summary rows carrying a date+amount bypassed every guard. -> _PDF_START_RE now matches the generic column header, and a new _SUMMARY_RE rejects summary lines on every row (\s* so it also catches glued layouts like Kotak's 'MinimumAmountDue(MAD) Rs.2,159.25'). * Phantom cards: _header_region had the same blind spot - with no table marker it fell back to a blind 1800-char window, leaking transaction rows into card detection (a Swiggy purchase inventing the Swiggy HDFC card…d2e968d
-
Issuer detection matches sender domains (hdfcbank/icicibank/axisbank...)
so a bank email's From address is recognised even with no body text.cb30e2e -
Detection: header region stops at the real txn table, not stray 'transaction'
The card name sits above the transaction table; cutting the header at the FIRST occurrence of 'transaction' clipped it when a 'Transaction Summary' box appeared up top. Now cut at transaction-SPECIFIC markers (Domestic/ International Transactions, Transaction Date/Details, delimited Date..Amount) with a tight 1800-char safety cap. Card names above summary boxes now detect; transaction-row merchants still cannot leak (markers + issuer/product gating). Verified identical on both engines across 6 realistic layouts + 7 bank fixtures + matrix 0 mismatch + veteran parse QA.d485928 -
Issuer-fallback card detection: no more dead-end 'no cards recognised'
- detect_issuers_from_text/detect_issuers: name the bank even when the exact product name doesn't match a signature (14 issuers, header-region only) - /statements/parse returns detected_issuers so the app can pre-fill the card picker with the recognised bank - TS mirror verified identical; api_e2e + veteran parse QA 0 failuresaf26b53 -
Smart statement unlock: probe formulaic password candidates
- find_pdf_password(): pypdf probe of app-derived candidates (name4+DDMM, DDMMYYYY, DDMM+last4 and friends - every common issuer formula) - /statements/parse: password field accepts a candidate list; the working password is resolved once per file, then a single parse runs - locked/broken files still return filename-based detected_cards - verified: encrypted-PDF probe picks the right candidate among decoys, generic filenames yield no false card detections, api_e2e 0 failuresc9afe29 -
Statement reversals: refund credits net out their spend
- statement_parser: _credit_kind splits credits into payments (ignored) vs merchant refunds (returned as reversal events); parse_csv/parse_pdf/ parse_statement accept a reversals sink - main: /statements/parse and /email/inbound responses include reversals - verified: 7/7 bank fixtures, 103k parser fuzz, api_e2e all endpoints, and classification parity with the app's TS mirrora5516f5
-
Truthful at-place availability, email import, debit cards, card kind in API
- availability/channels: at_place truthfulness rule (verified merchant data only; movies always unverified at a specific venue), issuer portals city-aware - statement_parser: 30-card signature detection reads header region only - main: /email/inbound + /email/pending, rate limits, detected_cards, card kind field - card_catalogue: 19 debit cards (kind=debit, RuPay UPI-eligible), 49 total - scoring_engine: debit apply-url wording; engine parity verified vs app (0 mismatches, 2674-case matrix + exhaustive hash match)a7eaed9
-
Credit-limit detection: inline + positional + OCR fallback (Kotak/Axis/IDFC/HDFC)
7f1c52e -
Parser hardening + brand aliases: multi-issuer layouts, NUL/trim/control-char safety
03c920c -
Parser: multi-issuer support (HDFC/Axis/IDFC/Kotak), forex/fee fixes, city-split, brand aliases
c2ddb81
-
Parser: integer/lakh amounts, tax/fee exclusion
154be3a
-
Parser: integer/lakh amounts, tax/fee exclusion; certified catalogue
7a66a35 -
Certify 30-card catalogue; GST/recurring net value; HNI features; parser robustness
c1f7292 -
PDF parsing, channel offers, app-key gate, portal rates, transport category
611b4f5
-
Statement parser: HDFC ~|~ format, exclude credits, merchant aliases
9908438
-
RewardPilot API backend
888111a