trace_khata_chain), which keeps an Index2 doc only if it's an encumbrance or one of its parties belongs to the buyer's specific ownership chain (khata 1153). Both docs involve other parties on the same Gat, so the report ended up showing 0 — while its own coverage line still lists 2 document-years, making the wording self-contradictory.
| Signal | In the delivered report | In stored session data |
|---|---|---|
| Directly-relevant Index2 docs | docs_examined: 0, docs_direct: 0, empty transaction history | index2_relevance.directly_relevant = 2 |
| Years with documents | years_with_docs: [2024, 2026] | coverage.years_with_docs: [2024, 2026] |
| Limitations text | "37 documents found, of which 0 pertained directly to this property" | 2 pertained directly to the property (Gat 283) |
| judge_relevance step | — | relevant: 2, discarded: 4, 1 attempt, no re-run |
| Reg. no | Type | Parties | Gat |
|---|---|---|---|
4807/2024 | Lease (Leave & Licence) | Waghamare Jaidev → Prakash Om | 283 |
4334/2026 | Agreement to sell (साठेखत), ₹2 crore | शिवाजी आबाजी थोरात +6 → सुहास अंकुश उंद्रे | 283 |
The judge_relevance step classified relevant: 2, discarded: 4 in a single attempt. Both docs survive today in property_data.index2_relevance.directly_relevant.
The stored timeline.index2_timeline contains both docs, and coverage.years_with_docs = [2024, 2026]. Nothing lost yet.
This is a buyer report (target_khata = '1153'). Before generating, the report step runs
trace_khata_chain(timeline, '1153') (steps.py:3556-3559). That function keeps an Index2 doc only if
it is an encumbrance type or one of its parties fuzzy-matches a name in khata 1153's traced ownership chain
(khata_chain.py:264-268).
index2_timeline = []Re-running the trace on the live data, khata 1153's chain parties are:
गणपती म्हपाजी खांदवे · मारुती राघु सावंत · सोपाना राघु सावंत · मे हरिश्चंद्र ॲग्रिकल्चरल ॲन्ड हॅचरिज प्रा लि कंपनी
4807/2024 — parties Waghamare / Prakash Om → no match, not an encumbrance → dropped4334/2026 — parties Thorat / Pawar / Undre family → no match, not an encumbrance → droppedResult: transaction_history = [], docs_examined = 0. The docs are directly relevant to the property (Gat 283) but not to the buyer's khata (1153), and buyer mode scopes to the khata.
trace_khata_chain preserves coverage but empties index2_timeline. So the report simultaneously says
years_with_docs: [2024, 2026] and docs_examined: 0 / "0 pertained directly to this property." The "0" is
post-khata-filter; 2 docs did pertain to the property. Buyer mode should distinguish property-level vs
khata-level counts in both the meta and the limitations text.
This session's own critical check flags that mutation 1165's digital record is wrong — it links a 1959 sale to
गणपती म्हपाजी खांदवे instead of the real 1984 sale to the current owner. The chain trace walks through mutation 1165,
so chain_parties are unreliable predecessors and there are 2 untraced_ancestors. The party-matching that
discarded both docs was therefore working off a broken chain. A recent ₹2-crore साठेखत on the same Gat is exactly the kind of
transaction a buyer would want surfaced — even if it belongs to another khata. Consider a fallback "other transactions on this
Gat" section when the chain trace is incomplete, rather than silently dropping directly-relevant docs.
| File | What it does |
|---|---|
title_checker/pipeline/steps.py:3556-3559 | Buyer mode calls trace_khata_chain before report generation |
title_checker/pipeline/khata_chain.py:264-268 | Index2 filter: keep only encumbrances or chain-party docs |
title_checker/pipeline/khata_chain.py:346-356 | _doc_involves_chain_party — fuzzy name match (threshold 70) |
title_checker/pipeline/report.py:2680, 2895-2900 | docs_examined / transaction_history derived from the (now empty) index2_timeline |