Prismatic Property Intelligence

Prismatic Property Intelligence

130 files Intelligence

Overview

Prismatic Property Intelligence provides real estate analysis capabilities focused on the Czech market. It integrates with CUZK (Czech Office for Surveying, Mapping and Cadastre) land registry data, property databases, and market sources to enable property-based investigations, asset mapping, and real estate due diligence. In the context of OSINT investigations, property records are among the most reliable public data sources because real estate transactions require legal registration that cannot be easily obscured. The Czech land registry (Katastr nemovitosti) provides a uniquely complete public dataset that Property Intelligence transforms into actionable intelligence through systematic extraction, correlation, and analysis.

The module reconstructs ownership chains by traversing historical land registry entries, identifying when properties changed hands, through which legal entities, and at what declared valuations. This is particularly valuable for corporate due diligence where shell company structures may be used to obscure beneficial ownership of valuable real estate assets. By correlating property ownership data with corporate registry information from Prismatic Czech Registry, the module can reveal connections between seemingly unrelated entities -- a capability central to the platform's entity resolution pipeline. The NABLA framework's signal plurality axiom is enforced throughout: property ownership claims require corroboration from multiple registry sources before being established as facts.

Property Intelligence also monitors the real estate market for anomalies -- properties sold significantly below market value, rapid ownership transfers suggesting money laundering patterns, or concentrated property acquisition by entities with opaque ownership structures. These anomalies are surfaced with confidence scoring that reflects the strength of the underlying evidence.

Architecture

CUZK ISKN --> Registry Pipeline --> Normalization --> Graph Construction --> Analysis
Market DB --> Market Pipeline  -->       |                  |               |
Corp Reg  --> Entity Pipeline  --> Unified Schema    KuzuDB Storage    Anomaly Detection
                                     |                  |               |
                              Deduplication      Ownership Chains   Alert Generation
                              Geocoding          Valuation Model    Report Output

The module is structured around three data pipelines. The Registry Pipeline connects to CUZK's ISKN system to fetch parcel data, ownership records, and encumbrance information. The Market Pipeline aggregates listings, transaction prices, and valuation estimates from commercial real estate databases. The Analysis Pipeline combines both data sources with corporate registry data to produce enriched property intelligence graphs stored in KuzuDB for relationship traversal.

Each pipeline runs as a supervised GenServer with configurable polling intervals and rate limiting to respect data source constraints. The Elixir OTP supervision tree ensures that pipeline failures are isolated and automatically recovered without affecting other active analyses.

Key Modules

ModuleResponsibility
PrismaticPropertyIntelligencePublic facade: portfolio/1, ownership_chain/1, estimate_value/1, detect_anomalies/1
PrismaticPropertyIntelligence.ApplicationOTP application entry point with pipeline supervision
PrismaticPropertyIntelligence.RegistryPipelineCUZK ISKN data fetching, parsing, and normalization
PrismaticPropertyIntelligence.MarketPipelineReal estate market data aggregation and valuation modeling
PrismaticPropertyIntelligence.OwnershipTracerHistorical ownership chain reconstruction and traversal
PrismaticPropertyIntelligence.AnomalyDetectorTransaction anomaly detection with configurable thresholds
PrismaticPropertyIntelligence.ValuationEngineComparable sales analysis and property value estimation
PrismaticPropertyIntelligence.GeocodingServiceAddress normalization and geocoding for spatial analysis
PrismaticPropertyIntelligence.EntityCorrelatorCross-referencing property owners with corporate registry data

Key Features

Property Analysis

The ownership chain reconstruction traverses historical registry entries to build a complete transfer history:

defmodule PrismaticPropertyIntelligence.OwnershipTracer do
  @spec trace(String.t(), keyword()) :: {:ok, OwnershipChain.t()} | {:error, term()}
  def trace(parcel_id, opts \\ []) do
    depth = Keyword.get(opts, :depth, :full)

    with {:ok, current} <- RegistryPipeline.fetch_current_owner(parcel_id),
         {:ok, history} <- RegistryPipeline.fetch_ownership_history(parcel_id, depth),
         {:ok, entities} <- resolve_owner_entities(history),
         {:ok, corporate_links} <- EntityCorrelator.correlate(entities) do
      chain = build_chain(current, history, corporate_links)

      {:ok, %OwnershipChain{
        parcel_id: parcel_id,
        current_owner: current,
        transfers: format_transfers(history),
        corporate_connections: corporate_links,
        suspicious_patterns: detect_patterns(chain),
        total_transfers: length(history),
        span_years: compute_span(history),
        confidence: compute_chain_confidence(history)
      }}
    end
  end

  defp detect_patterns(chain) do
    [
      rapid_transfers(chain),
      below_market_sales(chain),
      circular_ownership(chain),
      shell_company_involvement(chain)
    ]
    |> List.flatten()
    |> Enum.filter(& &1.significance > @pattern_threshold)
  end
end
  • Ownership chain reconstruction across historical land registry entries with full transfer history
  • Property valuation estimation using comparable sales and location-based models
  • Encumbrance and lien tracking including mortgages, easements, and court orders
  • Transaction history analysis with price anomaly detection using Monte Carlo verification

Asset Mapping

Corporate real estate portfolio mapping connects company identifiers to all owned properties:

Mapping MethodInputOutputUse Case
ICO-to-parcelCompany ICOAll owned parcelsCorporate portfolio mapping
Person-to-parcelName + DOBAll owned propertiesPersonal asset investigation
Parcel-to-ownersParcel IDFull ownership historyTransaction investigation
Address-to-parcelStreet addressParcel identifier and detailsLocation-based lookup
Area-to-portfolioRegion boundaryAll entities with holdingsRegional analysis
  • Corporate real estate portfolio mapping from ICO (company ID) to all owned parcels
  • Beneficial ownership inference through property chains and corporate structures
  • Shell company property detection using ownership pattern heuristics in the knowledge graph
  • Cross-border property intelligence for entities with Czech and foreign holdings

Market Intelligence

  • Regional market trend analysis with price-per-square-meter tracking
  • Comparable property identification for valuation support
  • Development activity monitoring through building permit data
  • Zoning and planning data integration from municipal sources

Anomaly Detection

The anomaly detection system identifies suspicious transaction patterns using configurable scoring:

defmodule PrismaticPropertyIntelligence.AnomalyDetector do
  @spec detect(keyword()) :: {:ok, list(Anomaly.t())} | {:error, term()}
  def detect(opts) do
    region = Keyword.fetch!(opts, :region)
    period = Keyword.fetch!(opts, :period)
    threshold = Keyword.get(opts, :threshold, 0.3)

    transactions = RegistryPipeline.fetch_transactions(region, period)
    market_data = MarketPipeline.fetch_market_prices(region, period)

    anomalies = transactions
    |> Enum.map(fn tx ->
      scores = %{
        price_deviation: price_deviation_score(tx, market_data),
        transfer_velocity: velocity_score(tx),
        entity_opacity: entity_opacity_score(tx),
        pattern_match: known_pattern_score(tx)
      }
      {tx, aggregate_anomaly_score(scores)}
    end)
    |> Enum.filter(fn {_tx, score} -> score > threshold end)
    |> Enum.sort_by(fn {_tx, score} -> score end, :desc)

    {:ok, format_anomalies(anomalies)}
  end
end

Due Diligence Reporting

  • Automated due diligence report generation with audit trail for every finding
  • GDPR-compliant data handling for personal property ownership records
  • Compliance framework alignment with Czech AML regulations
  • Evidence packaging for regulatory submission through Prismatic CER

Usage

# Map all properties owned by a company (by ICO)
{:ok, portfolio} = PrismaticPropertyIntelligence.portfolio(ico: "12345678")
# => %{parcels: [...], total_area_m2: 45_230, estimated_value_czk: 128_500_000}

# Reconstruct ownership chain for a specific parcel
{:ok, chain} = PrismaticPropertyIntelligence.ownership_chain(
  parcel_id: "KU:732234/LV:1542",
  depth: :full)
# => %{current_owner: "Example s.r.o.", transfers: 7, span_years: 23, patterns: [...]}

# Property valuation estimate based on comparables
{:ok, valuation} = PrismaticPropertyIntelligence.estimate_value(
  property_id: property_id,
  method: :comparable_sales,
  radius_km: 5)
# => %{estimated_value_czk: 4_500_000, confidence: 0.87, comparables_used: 12}

# Detect anomalous transactions in a region
{:ok, anomalies} = PrismaticPropertyIntelligence.detect_anomalies(
  region: :praha,
  period: {~D[2025-01-01], ~D[2025-12-31]},
  threshold: 0.3)
# => %{anomalies: [...], total_transactions: 12_450, flagged: 47}

# Cross-reference property ownership with corporate registry
{:ok, connections} = PrismaticPropertyIntelligence.corporate_connections(
  parcel_id: "KU:732234/LV:1542",
  include_subsidiaries: true)

NABLA Compliance

NABLA AxiomProperty Intelligence EnforcementImplementation
Provenance MandatoryEvery property claim traceable to CUZK registry entryRegistry Pipeline maintains full fetch metadata per record
Signal PluralityOwnership claims require multi-source corroborationEntityCorrelator cross-references CUZK with corporate registry
Source IndependenceRegistry and market data processed independentlySeparate pipeline processes with independent data paths
Time DecayRegistry data freshness tracked with update timestampsPolling intervals ensure data currency within configurable thresholds
Contradiction PreservationConflicting ownership records preserved for investigationMultiple registry sources maintained independently without forced resolution

Testing

Ownership chain tests verify traversal correctness, transfer history completeness, and corporate correlation accuracy against known parcel fixtures. Anomaly detection tests verify scoring algorithms, threshold sensitivity, and pattern recognition against labeled datasets of suspicious and legitimate transactions. Valuation engine tests verify comparable selection, price estimation accuracy, and confidence score calibration.

Integration tests exercise the full pipeline from CUZK data fetching through normalization, graph construction, and anomaly detection. Property-based tests generate random parcel ownership histories to verify chain reconstruction invariants.

Integration Points

ApplicationRelationship
Prismatic Czech RegistryCorporate registry data for ownership correlation and entity resolution
Prismatic NarrativeTimeline generation from property transaction histories for investigation reports
Prismatic CERCompliance evidence storage and regulatory submission for due diligence reports
Prismatic DeductionRule-based inference over property ownership patterns for shell company detection
Prismatic GraphProperty ownership graph stored in KuzuDB for relationship traversal
Prismatic DDDue diligence case workflows consuming property intelligence findings

Performance

OperationLatencyNotes
Portfolio mapping (by ICO)2-10sDepends on portfolio size
Ownership chain reconstruction1-5sDepends on history depth
Property valuation500ms-3sComparable selection + price model
Anomaly detection (region)5-30sDepends on transaction volume
Corporate correlation500ms-2sCross-registry entity resolution
Geocoding< 200msCached address normalization

Telemetry events: [:prismatic, :property, :portfolio_mapped], [:prismatic, :property, :chain_traced], [:prismatic, :property, :anomaly_detected].


Connect & Contribute

Created by Tomáš Korcak (korczis) | Open Source under GHL