% ============================================================================ % Appendix % ============================================================================ \newpage \begin{appendices} \renewcommand{\thetable}{A\arabic{table}} \renewcommand{\thefigure}{A\arabic{figure}} \setcounter{table}{0} \setcounter{figure}{0} \section{Machine-Generated Feature Definitions} \label{app:features} Table~\ref{tab:app_features} lists the fields extracted by the language and vision models under their respective strict JSON schemas, with the value domains as specified in the extraction scripts (the enumerations are in French in the schema; they are translated here). All fields use closed enumerations, integers, or booleans; absent information is coded as \texttt{false}, \texttt{unknown}, or an empty list. The mapping from fields to regressors is described in Section~\ref{subsec:vision}. \begin{table}[htbp] \centering \begin{threeparttable} \caption{Fields Extracted by the AI Models} \label{tab:app_features} \small \begin{tabular}{@{}p{3.1cm}p{4.3cm}p{6.2cm}@{}} \toprule Layer & Field & Domain \\ \midrule \multicolumn{3}{@{}l}{\textit{Panel A: Text (LLM, \texttt{gpt-4o-mini}; 20 fields, 18 regressors)}} \\[3pt] Condition & \texttt{condition} & to renovate / original / good / renovated / like-new / new / unknown \\ Turnkey; recently renovated & \texttt{turnkey}, \texttt{recently\_renovated} & boolean \\ Renovated kitchen / bathroom & \texttt{renovated\_kitchen}, \texttt{renovated\_bathroom} & boolean \\ Flooring (multi-valued) & \texttt{flooring} & hardwood / ceramic / floating / carpet / vinyl / concrete / other \\ Countertop & \texttt{countertop} & granite / quartz / marble / laminate / wood / other / unknown \\ Heating (multi-valued) & \texttt{heating} & electric / baseboards / heat pump / wood / gas / oil / radiant / geothermal / other \\ View & \texttt{view} & water / mountain / city / none / unknown \\ Amenities & \texttt{garage}, \texttt{pool}, \texttt{waterfront}, \texttt{finished\_basement}, \texttt{fireplace}, \texttt{central\_ac} & boolean \\ New construction; income property & \texttt{new\_construction}, \texttt{income\_property} & boolean \\ Large lot; quiet area & \texttt{large\_lot}, \texttt{quiet\_area} & boolean \\ Highlights & \texttt{highlights} & 3--6 free-text keywords (not used in the regressions) \\[6pt] \multicolumn{3}{@{}l}{\textit{Panel B: Vision (\texttt{claude-haiku-4-5}, façade; 12 fields, 21 regressors)}} \\[3pt] Exterior shot & \texttt{is\_exterior} & boolean \\ Building type (visual) & \texttt{building\_type\_visual} & detached / semi-detached / row / condo building / cottage / land / other \\ Condition score & \texttt{condition\_score} & integer 1--10 \\ Curb appeal & \texttt{curb\_appeal} & integer 1--10 \\ Renovation level & \texttt{renovation\_level} & to renovate / dated / standard / renovated / high-end / unknown \\ Exterior materials (multi-valued) & \texttt{exterior\_materials} & brick / stone / vinyl / wood / aluminum / stucco / roughcast / concrete / other \\ Landscaping & \texttt{landscaping} & none / minimal / maintained / manicured \\ Garage visible & \texttt{has\_garage\_visible} & boolean \\ Storeys (visual) & \texttt{storeys\_visual} & 1 / 1.5 / 2 / 3+ / unknown \\ Setting & \texttt{setting} & dense urban / suburban / rural / waterfront / wooded / unknown \\ Photo quality & \texttt{photo\_quality} & integer 1--10 \\ Luxury indicator & \texttt{curb\_luxury} & boolean \\ \bottomrule \end{tabular} \begin{tablenotes}[flushleft] \footnotesize \item \textit{Notes:} Both extractions use schema-constrained decoding with closed enumerations, required fields, and \texttt{additionalProperties:false}. The text layer reads the free-text description (truncated at 4{,}000 characters) at temperature zero; the vision layer analyzes one façade photograph per listing at the API's default temperature. Model identifiers are the API aliases current in July 2026. Fields are mapped to numeric regressors (booleans to $0/1$, ordinal scales to integers, multi-valued fields and categories to indicators); the text condition scale is coded $0$--$5$ with ``unknown'' at~2, the visual renovation level $0$--$4$ with ``unknown'' at~2, and landscaping $0$--$3$. \end{tablenotes} \end{threeparttable} \end{table} \section{Sample Construction Flow} \label{app:flow} \begin{table}[htbp] \centering \begin{threeparttable} \caption{From Raw Records to Estimation Sample} \label{tab:app_flow} \begin{tabular}{@{}lr@{}} \toprule Step & Records \\ \midrule Realtor.ca raw & 27{,}302 \\ DuProprio raw & 7{,}693 \\ Houses (single-family + townhouse) with price & 19{,}273 \\ After outlier cleaning (price bounds, price-per-ft$^2$ trim) & 19{,}123 \\ \quad of which Realtor.ca / DuProprio & 15{,}356 / 3{,}767 \\ \quad of which with measured living area (Model~A) & 9{,}446 \\ \quad of which with a detected exterior photograph & 18{,}314 \\ \bottomrule \end{tabular} \begin{tablenotes}[flushleft] \footnotesize \item \textit{Notes:} See Section~\ref{sec:data}. ``Measured living area'' means reported area or area reconstructed from room-level dimensions. Both AI layers cover all 19{,}123 cleaned listings. \end{tablenotes} \end{threeparttable} \end{table} \section{Language Classification} \label{app:language} Each description is classified from the counts $e$ and $f$ of English and French stop words it contains (articles, prepositions, pronouns, and auxiliaries such as \textit{the, and, with, is} and \textit{le, la, les, et, avec, est}). A description is ``English'' if $e\ge1.5f$, ``French'' if $f\ge1.5e$, and ``mixed'' otherwise or when neither count is positive. On Realtor.ca the mixed class is small (2.6\%) and consists mostly of very short descriptions; on DuProprio it is large (51.7\%) because the crawler returns the automated English translation followed by the original French comments. Table~\ref{tab:rob_language_source} reports the gains from the AI layers within each class, and Table~\ref{tab:rob_ai_coefs} the effect of adding the language indicators to the hedonic regression. The language variable is produced by \texttt{scripts/18\_revision\_language\_leakage\_spatial.py}. \end{appendices}