% Author: Simon-Pierre Boucher — simon-pierre.boucher@uqo.ca \section{Data} \label{sec:data} This section describes the transaction records, the construction of the analytic sample, the chronological and spatial partitions, the subsamples on which the language-model arms are evaluated, and the rules that define the information set $\mathcal{I}_t$ of Section~\ref{sec:theory} for every arm. The last two subsections report the leakage audit that enforces those rules and the privacy safeguards applied before any record leaves the research environment. Every count below is written by a numbered script from the versioned data layer (\texttt{results/data/*.json}, \texttt{results/tables/*.csv}); none is transcribed by hand. \subsection{Sources} \label{subsec:data_sources} The primary source is the registered-sales table of Vrai Prix, a platform operated by the author that assembles residential transfers from the public Quebec land register and links each transfer to its unit of assessment on the municipal roll (Section~\ref{sec:setting}). A registered deed contributes the consideration paid, the registration date and the cadastral lot; the roll contributes the physical attributes used by the assessor (floor area, land area, construction year, storeys, number of dwellings, land-use code), the land and building values in force at the sale and the roll's market reference date; the link is made on the roll unit identifier and verified with coordinates. We work from an immutable snapshot of the production database taken on 2026-10-21 and processed by the cleaning pipeline of a companion paper on municipal price indices, which geocodes the records, attaches the administrative geography of the Ministère des Ressources naturelles et des Forêts and the municipality repertory of the Ministère des Affaires municipales et de l'Habitation, deduplicates repeated registrations of the same transfer, and assigns an exclusion reason to records that fail its headline-sample criteria. The snapshot contains 769,995 transfers registered between 2021-01-04 and 2026-10-07; the publication lag of the register, measured in the companion paper at two to eight weeks, explains why the last registered sale precedes the snapshot date. The checksums of the raw files are pinned in the repository and the record-level data are not redistributed. A second platform of the author, Immo-Ka, aggregates brokerage listings with asking prices, marketing dates and free-text descriptions. We audited it as a candidate source and excluded it from every arm, for three reasons that are documented in the data-access checklist of the repository. Its coverage begins on 2026-08-12, after the end of the test window, so that no listing could be matched to a test or validation sale; asking prices and days on market would be observable for some subjects and not for others and would therefore create an information asymmetry across properties and across arms that the design is meant to prevent; and its records contain broker contact details and third-party remarks that cannot be transmitted to external model providers. The audit found 479,265 listings first seen up to 2026-10-27, of which 195,503 are linked to a roll unit; they are reserved for a descriptive comparison of the prospective sales, registered after the protocol freeze, with their listing history, which is reported separately and plays no role in the evaluation. Three external geospatial layers complete the evidence. The provincial flood maps of the Quebec government provide 24,997 flood-zone polygons and 1,597 polygons delimiting the area that the maps actually cover; a point outside the covered area has unknown exposure, which we keep as a missing value rather than coding it as safe. A public-transit layer contributes 37,475 stops (bus, metro, light rail and commuter rail). The 2021 Census of Population contributes 13,805 dissemination areas with their population, density, median age, median household income and share of renter households \citep{statcan2024chsp}. Each layer is a single snapshot and is time invariant by construction; it carries no transaction information and is given identically to every arm. Of the analytic sales, 39.9 percent fall inside a mapped flood-coverage area, 1.2 percent of those lie in a mapped flood zone, and 97.0 percent are matched to a dissemination area. \subsection{The analytic sample} \label{subsec:data_sample} The analytic sample is the subset of the snapshot that satisfies the companion paper's headline-sample criteria and the additional restrictions of this study. Of the 769,995 raw records, 137,989 are removed by the headline-sample flag, which excludes non-residential and vacant-land transfers, transfers that could not be matched to a roll unit, duplicate registrations, sales whose ratio of price to assessment lies outside the range consistent with an arm's-length transfer, dwellings built after the sale date, transfers of shared or multi-parcel units, and units whose land-use classification falls outside the three residential classes retained here, namely single-family houses, condominium units and small multi-unit buildings (plexes). The remaining 632,006 records all have coordinates, a roll identifier and one of the three classes. A further 140 records with prices below 50,000 or above 5,000,000 CAD are dropped, leaving 631,866 sales on 541,244 distinct roll units. The price band removes nominal transfers and the extreme upper tail where comparables are too sparse to support any method; its sensitivity is examined in the appendix. Table~\ref{tab:descriptives} describes the sample by property class. Houses account for two thirds of the sales, condominiums for a fifth and plexes for the remainder. The median price is 390,000 CAD overall, from 350,000 for condominiums to 475,000 for plexes; the median roll value in force at the sale is 297,900 CAD, well below the median price, which reflects the lag between the roll's reference date and the transaction and the strong appreciation of the period. Floor and land areas, construction years and the share of sales preceded by an earlier registered sale of the same unit differ markedly across classes; condominiums are younger, smaller and resold more often, plexes older and larger. The share with a prior sale is 14.3 percent overall, bounded by the fact that only sales from 2021 onward can serve as the earlier transaction. Across years the sample contains between 83,489 (the partial year 2026) and 131,800 (2021) sales, and across the four region groups used for stratification it contains 274,294 sales in the Montr\'eal census metropolitan area, 56,163 in the Qu\'ebec metropolitan area, 36,280 in Outaouais and 265,129 elsewhere in the province. \begin{table}[t] \centering \begin{threeparttable} \caption{Descriptive statistics of the analytic sample by property class.} \label{tab:descriptives} \footnotesize \input{tables/tab_descriptives} \begin{tablenotes}[flushleft] \footnotesize \item \textit{Notes.} Registered sales of 2021-01-04 to 2026-10-07 in the analytic sample ($n=631{,}866$). Floor area, land area and year built are the attributes of the assessment-roll unit. Roll value is the total assessment in force at the sale date. Prior sale is the share of sales preceded by a strictly earlier registered sale of the same roll unit within the sample window. Medians are unweighted. Source: \texttt{scripts/15\_descriptives.py}, \texttt{results/tables/descriptives.csv}. \end{tablenotes} \end{threeparttable} \end{table} \subsection{Variables and their as-of status} \label{subsec:data_variables} Table~\ref{tab:variables} lists the variables of the analytic table with the status that governs their use. The status answers one question: at the valuation date, which is the sale date, could an analyst have observed the value without knowledge of the sale? Roll attributes and roll values are public before the sale; static geography is time invariant; derived quantities are computed from strictly earlier sales; the price, its logarithm and the price tercile used for stratification are post-sale and are never shown to any arm. Two variables deserve comment. The total roll value is the assessment recorded by the provider at the time of the sale, that is, the roll in force, and not the value on the roll current at the snapshot date; because the snapshot does not retain the land and building split of earlier rolls, that split is taken from the current roll and rescaled to the assessment in force, which we label an as-of approximation. The roll's market reference date is inferred by stepping the current roll's reference date back by whole triennial cycles until the reference date plus eighteen months precedes the sale; the inference agrees with the recorded assessment in 98.6 percent of the rows, and the reference date is disclosed to the agents so that they treat the roll as a lagged rather than a current value, as the assessment manual prescribes \citep{mamh2024manuel}. Missingness is low: floor area is absent for 1.2 percent of sales and construction year for 1.0 percent; the borough is defined only in the six cities that have boroughs; the prior-sale fields are structurally missing for the 85.7 percent of sales without an earlier transaction in the window. \begin{table}[p] \centering \begin{threeparttable} \caption{Variables of the analytic table and their as-of status.} \label{tab:variables} \footnotesize \begin{tabular}{@{}p{3.6cm}p{6.9cm}p{2.5cm}r@{}} \toprule Variable & Definition & As-of status & Missing (\%) \\ \midrule \texttt{tx\_id}, \texttt{parcel\_id} & Transaction identifier; roll-unit identifier grouping repeat sales & key & 0.0 \\ \texttt{date} & Registration date of the deed; valuation date; cutoff is the previous day & anchor & 0.0 \\ \texttt{price}, \texttt{log\_price} & Transaction price in CAD and its logarithm & target, never shown & 0.0 \\ \texttt{lat}, \texttt{lng}, \texttt{x\_m}, \texttt{y\_m} & Coordinates of the roll unit (WGS84; NAD83 Quebec Lambert metres) & static & 0.0 \\ \texttt{region\_name}, \texttt{mun\_code}, \texttt{borough\_name} & Administrative region, municipality code, borough where defined & static & 0.0 / 0.0 / 70.6 \\ \texttt{region\_group}, \texttt{urban\_class} & Montr\'eal CMA, Qu\'ebec CMA, Outaouais, other; metro, suburban, rural by municipal population & static (derived) & 0.0 \\ \texttt{property\_class}, \texttt{subtype} & House, condo, plex; detached, semi, row, integrated, unknown & static & 0.0 \\ \texttt{floor\_area\_m2}, \texttt{land\_area\_m2} & Living floor area and lot area from the roll & roll, public & 1.2 / 0.1 \\ \texttt{year\_built}, \texttt{storeys}, \texttt{n\_units} & Construction year, storeys, dwellings from the roll & roll, public & 1.0 / 0.5 / 0.0 \\ \texttt{new\_construction} & Built in the sale year or the year before & roll, public & 1.0 \\ \texttt{roll\_total\_value} & Assessment in force at the sale, as recorded at the time of the sale & roll, public & 0.0 \\ \texttt{roll\_land\_value}, \texttt{roll\_building\_value} & Land and building split of the current roll rescaled to the assessment in force & as-of approximation & 1.7 / 0.0 \\ \texttt{roll\_reference\_date} & Market reference date of the roll in force, inferred from the triennial cycle & as-of inference & 0.0 \\ \texttt{prior\_sale\_price}, \texttt{prior\_sale\_date} & Most recent strictly earlier sale of the same roll unit in the window & strictly earlier sale & 85.7 \\ \texttt{grid1k}, \texttt{grid5k} & 1 km and 5 km grid cells in the Lambert plane & static (derived) & 0.0 \\ \texttt{price\_tercile} & Tercile of price within class; stratification only & post-sale, never a feature & 0.0 \\ \bottomrule \end{tabular} \begin{tablenotes}[flushleft] \footnotesize \item \textit{Notes.} Missingness measured on the 631,866 analytic rows. ``Roll, public'' denotes attributes of the municipal assessment roll, published before the sale. The external geospatial variables (flood exposure, transit stops within 1 km, dissemination-area statistics, distance to the nearest central business district) are static layers joined on coordinates; flood exposure is missing for the 60.1 percent of sales outside the mapped coverage. Source: \texttt{docs/data\_dictionary.md}, \texttt{results/data/analytic\_summary.json}. \end{tablenotes} \end{threeparttable} \end{table} \subsection{Chronological and spatial partitions} \label{subsec:data_splits} The partitions are closed date windows fixed in the configuration file before any model was fitted. Sales registered from 2021-01-01 to 2024-06-30 form the training partition (379,310 sales); 2024-07-01 to 2025-03-31 the validation partition (72,132), on which hyper-parameters, aggregation weights and every design choice are tuned; 2025-04-01 to 2025-12-31 the test partition (96,935), evaluated once after the protocol freeze; and 2026-01-01 to 2026-10-07 the holdout partition (83,489), an untouched later year evaluated once at the very end. The windows are contiguous, every sale belongs to exactly one partition, and Table~\ref{tab:splits} gives the counts by partition and region group. A chronological split does not by itself prevent a roll unit from appearing on both sides of a boundary; the leakage audit therefore verifies that for each of the 45,747 units with a sale in the training partition and a later sale in a later partition, the training sale is the earlier one, so that no future transfer of a test property is ever in the training data. The validation window straddles the trough and the recovery of the 2024 market and the test and holdout windows cover the subsequent expansion, which exposes every arm to a regime it did not see in training. \begin{table}[t] \centering \begin{threeparttable} \caption{Sales by partition and region group.} \label{tab:splits} \footnotesize \input{tables/tab_splits} \begin{tablenotes}[flushleft] \footnotesize \item \textit{Notes.} Partition windows are those of \texttt{configs/data.yaml}; sale dates are registration dates. Region groups: Montr\'eal CMA (regions Montr\'eal, Laval, Mont\'er\'egie, Laurentides, Lanaudi\`ere within 45 km of the city centre), Qu\'ebec CMA (Capitale-Nationale within 35 km of the city centre), Outaouais, and all other sales. The spatial-generalisation experiment withholds the whole of Outaouais, Abitibi-T\'emiscamingue and Bas-Saint-Laurent (59,770 sales) from training. Source: \texttt{scripts/15\_descriptives.py}, \texttt{results/tables/splits\_by\_region.csv}. \end{tablenotes} \end{threeparttable} \end{table} The spatial experiment withholds three entire administrative regions from training, Outaouais, Abitibi-T\'emiscamingue and Bas-Saint-Laurent, 59,770 sales in total, and evaluates the arms on their test-window sales with models and comparables drawn from the rest of the province. Outaouais is of particular interest because it is a border market whose prices track Ottawa rather than Montr\'eal; the two other regions are thin, rural markets where comparables are sparse and where Proposition~\ref{prop:exchange} predicts the largest benefit from evidence exchange. A prospective partition is reserved for sales registered in the live database after the protocol freeze, whose identifiers are by construction absent from the snapshot; it is fetched by a dedicated script and evaluated last. \subsection{Subsamples for the language-model arms} \label{subsec:data_subsamples} The statistical and machine-learning baselines are evaluated on the full partitions. The language-model arms, whose cost per property runs from a few cents to more than a dollar, are evaluated on stratified random subsamples of 240 validation, 600 test and 300 holdout sales, drawn once with the seed recorded in the configuration. Strata are the cells of region group by property class by within-class price tercile, 36 cells of which 35 are non-empty in the test partition; the allocation is proportional to the stratum's share of the partition by the largest-remainder method, capped at the stratum size, and the draw within each stratum uses a generator seeded from the hash of the seed, the partition and the stratum name, so that the file can be regenerated exactly and the audit confirms that it is. Because the subsample is ordered deterministically and the runner takes the first $n$ properties, any run of size $n$ is nested in every run of larger size; Section~\ref{sec:design} uses this property to extend the evaluated samples without redrawing. The baselines are also scored on these subsamples so that paired comparisons are available on identical properties. \subsection{Information-set rules} \label{subsec:data_infoset} The information set $\mathcal{I}_t$ of a subject sold on date $t$ is defined operationally by six rules that hold for every arm, statistical or agentic. The information cutoff is $t-1$: the sale itself is not yet observed. Comparable sales are drawn from sales registered strictly before the cutoff, within 540 days, of the same property class and of other roll units; the retrieval rule is described in Section~\ref{sec:architecture} and is identical for all arms, so that the comparable-selection opportunity is equalised. The subject's own earlier sale, when one exists strictly before the cutoff, is disclosed to every arm with its date as repeat-sales information. The roll values are those in force at the sale and are accompanied by the reference date of that roll. The market context, consisting of municipal and regional price levels, a monthly municipal index, liquidity and the local ratio of price to assessment, is computed from sales dated on or before the cutoff only, with the cutoff month flagged as partial; the platform's own published price index and the automated estimates it displays are computed from the full history and are excluded from every arm. The baselines receive the same information through the feature matrix: every neighbourhood and municipal feature is a function of sales dated strictly before the sale date, computed with left-closed rolling windows and monthly spatial indices, and no model is fitted outside the training partition. External layers are static and shared. Nothing in the pipeline distinguishes the arms by what they may know, only by how they process it. \subsection{Leakage audit} \label{subsec:data_leakage} An audit script re-derives the partitions and features and runs nine checks, each of which must pass for the pipeline to proceed; all nine pass on the real data and are also exercised on a labelled synthetic dataset in the test suite. The first two verify that the partition windows are contiguous and non-overlapping and that every sale is assigned to the window containing its date, with no duplicate identifiers. The third is the group-ordering check described above. The fourth recomputes the prior-sale fields by brute force on 4,255 roll units and verifies that every disclosed prior sale is strictly earlier than the subject's sale and matches the stored value. The fifth draws 300 subjects from the subsamples, retrieves their comparables and verifies that none is dated on or after the cutoff or beyond the look-back window, that none belongs to the subject's own roll unit or to another class, that identifiers follow score order and that the count never exceeds twelve; on these subjects the mean number of comparables is 11.2 and the minimum is three. The sixth verifies that the market context of forty subjects is unchanged when every sale after the cutoff is deleted. The seventh is the strongest test of the feature matrix: it multiplies the price of every sale dated on or after 2025-04-01 by seven, then deletes those sales altogether, rebuilds the matrix and checks that no feature of any earlier sale has changed in either case, which it does on more than fifteen thousand compared rows with zero changes. The eighth verifies that no identifier, date or price column is among the model inputs. The ninth regenerates the stratified subsamples and confirms their sizes, their strata and their exact reproducibility. Two leaks were caught by this suite during development and are worth recording because they illustrate how as-of violations arise in otherwise careful code. The first concerned the neighbourhood features. An early implementation obtained the $K$ nearest same-class sales of each subject from a single spatial index built on the whole table and only then filtered them by date. In dense urban cells the $K$ nearest sales were crowded with transactions registered after the subject's sale; after the date filter, the number of surviving neighbours, and hence the count and the medians, depended on how many later sales had occurred nearby, which is post-sale information about local turnover. The perturbation check detected it because deleting the later sales changed the features of earlier ones. The current implementation builds one spatial index per class and calendar month of candidate sales and queries, for a subject sold in month $m$, only the indices of months $m-12$ to $m$, applying exact date masks afterwards, and is verified against a brute-force computation. The second concerned the municipal rolling medians. A rolling join on the sale date with the default right-closed window included the subject's own transaction and all sales registered the same day in the window from which its municipal median was computed, so that the target entered its own feature through the median. The fix is a left-closed window, under which same-day and later sales are excluded by construction; the brute-force test now asserts the exclusion. Neither leak would have been visible in a conventional chronological evaluation, because both features were legitimately computed from past data for most sales and were contaminated only at the margin; both would have flattered the baselines and biased the central contrast of the paper against the agentic arms. \subsection{Privacy} \label{subsec:data_privacy} The transaction records contain civic addresses and the roll-unit identifier, and the ancillary platform data contain names and remarks of third parties. No address, identifier, name or free text is ever transmitted to a model provider. The evidence packet of Section~\ref{sec:architecture} carries only the attributes listed in Table~\ref{tab:variables}, the municipality and borough names, and coordinates rounded to three decimals, roughly one hundred metres, which does not identify a dwelling in any built-up area; the packet builder enforces a deny list of forbidden keys and an assertion that the subject's price is absent, and the audit hashes every packet so that the transcripts can be matched to what was actually sent. The transaction identifier that labels a packet is an opaque platform key with no external meaning. Model providers receive no information that would allow them to recover the sale from the land register other than what is public there already; the research use of the platform data is authorised by its owner, no human subjects are involved, and record-level data are not redistributed with the paper. The repository ships a clearly labelled synthetic dataset with the same schema so that the entire pipeline can be run without the proprietary records.