# Changelog of Reality ČR – Sreality, Bezrealitky, Bazoš a další (`huykenny/czech-real-estate-aggregator`) Actor

- **URL**: https://apify.com/huykenny/czech-real-estate-aggregator/changelog.md
- **Full Actor documentation**: https://apify.com/huykenny/czech-real-estate-aggregator.md

## Changelog

### 0.1.0 — nevydáno

První verze. Všech šest portálů, celá deduplikační a historická vrstva.

#### Přidáno

- Adaptery **Sreality**, **Bezrealitky**, **iDNES Reality**, **RealityMIX**,
  **ČeskéReality** a **Bazoš Reality** — všechny proti veřejným stránkám
  a datům, která portál posílá běžnému návštěvníkovi.
- Deduplikace napříč portály: blocking (geo buňka, adresa, ulice, telefon,
  hash fotky, SimHash popisu, kód zakázky, RÚIAN) → tvrdé podmínky → vážené
  signály → podmínka jedinečnosti → tranzitivní spojení union-find.
- Kanonická vrstva s deterministickým řešením konfliktů mezi portály
  (tabulky důvěryhodnosti zvlášť pro strukturovaná pole a zvlášť pro souřadnice).
- Historie mezi běhy ve shardovaném key-value store (32 shardů, líné načítání),
  změnové eventy včetně relistingu se zachovaným `propertyId`.
- Detekce stažených nabídek se třemi potvrzeními a pojistkami proti falešnému
  hlášení při výpadku portálu nebo filtrovaném běhu.
- Účtování pay-per-event, které platí až za záznam vypuštěný do datasetu.
- Vstup `robotsTxtPolicy`: respektování `robots.txt` portálu jako výchozí stav.
- Sjednocení slovníků napříč portály (`PropertyCondition`, `ConstructionType`,
  energetická třída na jedno písmeno).
- 189 unit testů, živé testy proti portálům, benchmark deduplikace na ručně
  označeném vzorku, produkční běhy na Apify se změřenými náklady.

#### Opraveno během produkčních testů

- **Identita nemovitosti mezi běhy obcházela deduplikaci.** Napojení podle
  fingerprintu (potřebné pro rozpoznání přeinzerování) přeskakovalo hard gates,
  podmínku jedinečného signálu i zákaz slučovat dva inzeráty z téhož portálu.
  Navíc se `propertyId` odvozovalo z fingerprintu, takže dva různé byty se
  shodným slabým fingerprintem dostaly totéž ID a historie se jim slila.
  V produkci to vyrobilo dvě „změny ceny", které se nikdy nestaly.
  Nově se podle fingerprintu páruje jen když je `strong`, slabý fingerprint se
  neukládá a do ID se u něj přimíchá klíč inzerátu (`src/history/identity.ts`).

#### Známá omezení

- **Nemovitost bez adresy a bez souřadnic nepřežije přeinzerování** — vypíše se
  jako nová a `RELISTED` u ní nenastane. Vědomá cena za to, že se nevyrobí
  neexistující zlevnění.

- **Sreality a ČeskéReality mají v `robots.txt` `Disallow: /` pro `*`.**
  Při výchozím `robotsTxtPolicy: respect` se přeskočí a důvod je v souhrnu běhu.

- **Bazoš neumí filtrovat lokalitu ani cenu** — jeho `robots.txt` zakazuje
  parametry vyhledávání. Actor prochází celou republiku a nevhodné nabídky
  zahazuje podle karty, ještě než stáhne detail.

- Porovnávání fotografií u Sreality nefunguje — jejich CDN (`d18-a.sdn.cz`)
  odpovídá našemu User-Agentu HTTP 401. Obcházet se to nebude.

- U Bezrealitek fotky leží na `api.bezrealitky.cz`, který má `Disallow: /`,
  takže se z něj nic nestahuje.

- `localMedianPricePerSqm`, `estimatedRent`, `estimatedYield` a `dealScore`
  jsou zatím `null`.
