SPB Git

spb/wp26_uqo

Public
28.3 KB · 327 lines latex
1% ============================================================================2% Appendices A-D: reproducibility, role prompts, JSON contract, additional tables (WP 26)3% Author: Simon-Pierre Boucher — simon-pierre.boucher@uqo.ca4% Appendix E (proofs) is appendix/proofs.tex, input by main.tex immediately after this file;5% the numbering block at the end of this file keeps it inside the appendix sequence.6% Sources: Makefile, README.md, reports/phase_00.md, results/freeze.json, data/raw/SHA256SUMS,7%          results/evaluation/repeat_variation.json, src/agentic_valuation/agents/roles.py, src/agentic_valuation/schemas.py,8%          paper/tables/*_{validation,holdout,prospective}.tex (generated by scripts/20_evaluate.py)9% ============================================================================10\newpage11\begin{appendices}1213\renewcommand{\thetable}{A\arabic{table}}14\renewcommand{\thefigure}{A\arabic{figure}}15\setcounter{table}{0}16\setcounter{figure}{0}1718% A table fragment is shrunk to the line width only when it is wider than the line.19\newsavebox{\apptabbox}20\newcommand{\fittable}[1]{%21  \sbox{\apptabbox}{#1}%22  \ifdim\wd\apptabbox>\linewidth23    \resizebox{\linewidth}{!}{\usebox{\apptabbox}}%24  \else25    \usebox{\apptabbox}%26  \fi}2728\section{Reproducibility}29\label{app:repro}3031\subsection{Repository and one-command reproduction}3233The research code is a Python package, \texttt{agentic\_valuation}, installed in editable mode from the repository root, with a command-line entry point \texttt{av} and a numbered pipeline of scripts. The layout is as follows: \texttt{configs/} holds the four configuration files that fix the partition windows and seeds (\texttt{data.yaml}), the model identifiers and list prices (\texttt{models.yaml}), the arms, aggregation rules and rounds grid (\texttt{treatments.yaml}) and the budget tiers (\texttt{budgets.yaml}); \texttt{src/agentic\_valuation/} contains the sub-packages \texttt{data} (analytic schema, build, splits, leakage audit, synthetic generator), \texttt{features} (spatial index, as-of comparables, market context, geographic layers, feature matrix), \texttt{baselines} (hedonic ridge, hierarchical and repeat-sales model, LightGBM, CatBoost, XGBoost, AVM with conformal intervals), \texttt{agents} (role prompts, evidence packets and views, turn runner), \texttt{debate} (protocols, committees, aggregation, stopping rule), \texttt{experiments} (resumable arm runner, freeze, provider check), \texttt{evaluation} (metrics, block bootstrap, Holm and Diebold--Mariano tests, calibration and conformal rescaling, strata, faithfulness audit, table generation), \texttt{fundamental} (repeat-sales deflator, resale-implied values, rents and user cost), \texttt{theory} (aggregation and welfare simulations) and \texttt{providers} (Anthropic, OpenAI and mock adapters with the cost ledger); \texttt{scripts/} contains the pipeline in execution order; \texttt{tests/} contains 143 tests that run on the synthetic dataset with the mock provider; \texttt{docs/} contains the research plan, the data-access audit, the preregistration, the architecture, the data dictionary, the evaluation protocol, the literature map, the fundamental-value note and the prospective-set note; \texttt{reports/} contains the phase reports and the limitations register; \texttt{results/} contains every run, ledger, evaluation output and table; and \texttt{paper/} contains this manuscript.3435Everything that does not require a paid API call is reproduced by one command, \texttt{make all}, which runs in sequence the test suite, the synthetic data layer, the real data layer and leakage audit, the geographic layers and feature matrix, the baselines, the theory and welfare simulations, the fundamental-value scripts, a mock-provider smoke run of arms~F and G2 on five synthetic properties, the evaluation, the figures and tables, and the LaTeX build. Table~\ref{tab:app_commands} lists the command of each phase. Live runs are explicit: a tier is run with \texttt{scripts/33\_run\_tier.py <tier> --live} and a single arm with \texttt{scripts/30\_run\_arm.py}, whose options \texttt{--arm}, \texttt{--split}, \texttt{--n}, \texttt{--live}, \texttt{--committee} and \texttt{--run-id} select the arm, the partition, the number of properties, the live providers, the committee and the run identifier; the environment variable \texttt{AV\_MAX\_SPEND\_USD} caps the spend of a run and \texttt{AV\_PROVIDER\_MODE=mock} routes every call to the mock provider. The prospective set is fetched by \texttt{scripts/60\_fetch\_prospective.py}, built by \texttt{scripts/61\_build\_prospective.py}, scored by \texttt{scripts/62\_prospective\_baselines.py} and evaluated by \texttt{scripts/20\_evaluate.py} with the option \texttt{--split prospective}.3637\begin{table}[htbp]38\centering39\caption{Phases of the pipeline and the command that reproduces each.}40\label{tab:app_commands}41\footnotesize42\begin{tabular}{@{}lp{10.4cm}@{}}43\toprule44Phase & Command (from the repository root) \\45\midrule46Install and test & \texttt{python3 -m pip install -e ".[dev]"}; \texttt{python3 -m pytest tests -q} \\47Synthetic layer (no data needed) & \texttt{make synth} \\48Analytic table, partitions, leakage audit & \texttt{make data} (\texttt{scripts/01\_build\_analytic.py}, \texttt{02\_splits.py}, \texttt{05\_leakage\_audit.py}) \\49Geographic layers, feature matrix & \texttt{make features} (\texttt{scripts/04\_geo.py}, \texttt{03\_features.py}) \\50Baselines A--D & \texttt{make baselines} (\texttt{scripts/10\_train\_baselines.py}) \\51Theory and welfare simulations & \texttt{make theory} (\texttt{scripts/41\_theory\_sim.py}, \texttt{40\_welfare\_sim.py}) \\52Repeat sales, rents, user cost & \texttt{make fundamental} (\texttt{scripts/50\_repeat\_sales.py}, \texttt{52\_rents\_usercost.py}, \texttt{51\_eval\_vs\_resale.py}) \\53Mock smoke run of the agentic arms & \texttt{AV\_PROVIDER\_MODE=mock make smoke} \\54Live tiers (keys in \texttt{.env}) & \texttt{make pilot}; \texttt{make validation}; \texttt{make weights} (aggregation weights, conformal scales, freeze); \texttt{make final}; holdout and prospective runs as documented in \texttt{configs/budgets.yaml} and \texttt{docs/prospective\_set.md} \\55Run-to-run variation & \texttt{scripts/36\_repeat\_variation.py} \\56Evaluation, rounds curve, figures & \texttt{make evaluate} (\texttt{scripts/15\_descriptives.py}, \texttt{20\_evaluate.py}, \texttt{35\_rounds\_curve.py}, \texttt{21\_figures.py}) \\57Tables and figures into the paper & \texttt{make tables} \\58Manuscript & \texttt{make paper} (\texttt{latexmk -pdf main.tex} in \texttt{paper/}) \\59\bottomrule60\end{tabular}61\end{table}6263\subsection{Environment}6465The runs reported in the paper were executed on an Apple-silicon workstation under Python 3.14.4 with polars 1.40, pandas 3.0, numpy 2.4, scikit-learn 1.6, lightgbm 4.6, xgboost 3.2, catboost 1.2.10, statsmodels 0.14, pydantic 2.13, anthropic 2.3.0 and openai 3.40.0, and the manuscript was built with TeX Live through \texttt{latexmk}; the package version recorded in the freeze is 0.1.0 and the minimum supported Python version declared in \texttt{pyproject.toml} is 3.12. The test suite and the mock provider do not depend on hardware. Heavy baseline tuning may be delegated to a compute node without changing the results, which are fixed by the seed 20261027 recorded in \texttt{configs/data.yaml} and reused by the evaluation bootstrap.6667\subsection{Data snapshot, freeze and archive}6869The raw data layer consists of three Parquet files produced by the cleaning pipeline of the companion index paper \citep{boucher2026sharp} from the Vrai Prix snapshot of 2026-10-21, pinned by SHA-256 in \texttt{data/raw/SHA256SUMS} and not redistributed:7071\begin{center}\scriptsize\ttfamily72\begin{tabular}{@{}ll@{}}73wp22\_clean\_transactions.parquet & d6e63ae0b9b480b66572c16a1fcd9a1ea18f0734b28163584532eac42c587fc9 \\74wp22\_raw\_market\_index.parquet & 6c8c70d1a6d86e7704480c4527c90ff84026d51f38a2cf80ab5bd686e01d599a \\75wp22\_raw\_units\_stock.parquet & 6d0ba7c384111c41c09d34f46b37f3202f1fc91ed34471f90f9f643fd70314a7 \\76\end{tabular}77\end{center}7879\noindent The external layers (flood maps, transit stops, census dissemination areas, rental-board leases) and the prospective fetch of 2026-10-27 are documented with their provenance in \texttt{data/raw/README.md} and \texttt{docs/prospective\_set.md}. The protocol freeze was recorded on 2026-10-28 at 01:05:40 UTC in \texttt{results/freeze.json}, which stores the SHA-256 hash of each of the thirty role prompts (twelve default, eight optional, the generalist and nine placebo members), of the four configuration files, of the schema module and of the sixteen source files of the \texttt{agents}, \texttt{debate} and \texttt{providers} sub-packages, together with the model identifiers of the cost-matched pairs, the rounds grid and the aggregation rules; the digest of the whole record is8081\begin{center}\scriptsize\ttfamily f0e9d6a94b0387f92645346af2c8c63200c8b9f83c9a85095f507cffa2e85e1c\end{center}8283\noindent and \texttt{scripts/31\_freeze.py --check} lists every deviation of the working tree from it. No deviation was recorded between the freeze and the last evaluation. Every live run writes to \texttt{results/runs/<run\_id>/} the manifest, one transcript per property with every turn, prompt hash, model identifier, token counts, cost, latency, validation retries and error, the evidence packet as sent with its hash, and the prediction file with one row per aggregation rule; the ledger of the run, \texttt{results/ledger/<run\_id>.jsonl}, appends one line per API call. The archive of transcripts and packets is about 0.5~GB and is kept locally; the prediction files, manifests, ledgers, aggregation weights, conformal scales and every evaluation output are in the repository. Runs whose identifiers begin with an underscore are mock, synthetic, pilot or superseded runs and are excluded from every evaluation by the manifest. Summing the ledgers of the live runs that enter the paper gives a total spend of about 1,080 US dollars at list prices (about 1,100 dollars including sanity and mock-priced calls).8485\subsection{What is and is not deterministic}8687The data layer, the partitions, the stratified subsamples, the feature matrix, the comparable retrieval, the evidence packets, the baselines, the aggregation rules, the evaluation and the simulations are deterministic given the seed and the configuration, up to the floating-point differences that gradient-boosting libraries produce across hardware and thread counts; the leakage audit verifies that the subsamples regenerate exactly. The agentic arms are not deterministic: hosted models return different completions to identical requests, no sampling parameters are sent, and the vendors' adaptive reasoning adds variation of its own. The paper therefore does not claim bitwise reproducibility of any agentic number; it claims that every such number traces to a stored transcript, and it measures the variation by repeating the two-round debate on eight test properties under the frozen protocol (\texttt{scripts/36\_repeat\_variation.py}, \texttt{results/evaluation/repeat\_variation.json}): the committee median differed from the original run by 0.007 log points on average and 0.019 at most, with a standard deviation of 0.009, the absolute errors of the two runs had a correlation of 0.998, and every repeated point lay inside the original 90 percent interval. Re-running an agentic arm reproduces the design, not the transcript, and extends the archived runs rather than replacing them, because the runner skips properties whose transcript exists.8889\section{Role Prompts}90\label{app:prompts}9192The system prompt of every role is the concatenation of a shared preamble, the line \texttt{ROLE\_ID: <id>}, the role-specific text and a block of output rules; it is constant across properties, which allows the vendors to cache it as a prefix, and its SHA-256 hash is part of the freeze. The texts below are reproduced verbatim from \texttt{src/agentic\_valuation/agents/roles.py}. Table~\ref{tab:roles} in the main text paraphrases the twelve default mandates; two of them and the placebo text are given in full here.9394\subsection{Shared preamble}9596\begin{quote}\small\sffamily\raggedright97You are one simulated analytic role inside a research committee that estimates the market value of a residential property in Quebec, Canada. This is an academic experiment on information aggregation. You are NOT a licensed Quebec appraiser (évaluateur agréé), lender, broker or inspector, and nothing you produce is a professional opinion of value, a lending decision or an offer.9899TASK\\100Estimate the MARKET VALUE of the subject property in Canadian dollars (CAD) AS OF THE VALUATION DATE given in the packet. Market value here means the most probable price the property would fetch in an arm's-length sale on the open market at the valuation date, with buyer and seller typically motivated and reasonably informed, after normal marketing time. It is a prediction of a transaction price, not a statement about the property's unobservable fundamental value and not an investment value for a particular buyer.101102INFORMATION SET AND CUTOFF\\103-- The packet states a valuation date and an information cutoff (the day before the sale). You may use ONLY evidence dated on or before the cutoff. The subject's own sale price is never in the packet and must not be guessed from the packet identifiers.\\104-- Comparable sales (ids C01, C02, ...) all closed before the cutoff. Market context (M1) is computed from sales up to the cutoff. Geospatial context (G1), when present, is static. The subject (P) carries attributes and the municipal assessment roll in force at the sale date; the roll's market reference date is stated and usually precedes the valuation date by 18 months or more, so the roll is NOT a current value.\\105-- A prior sale of the same parcel, if any, is disclosed in the subject section; account for the market movement between the two dates.\\106-- You only see the sections your role is entitled to. If a section or field is absent, it is absent for you: do not infer it, do not assume typical values for it, and list what is missing in missing\_data.107108EVIDENCE DISCIPLINE\\109-- Cite the evidence ids you actually relied on (P, C01.., M1, G1) in evidence\_ids\_used. Never cite an id that is not in your packet.\\110-- No inspection has been performed. Do not invent condition, renovations, finishes, defects, views, noise or neighbourhood quality that are not in the evidence. Unobserved means unobserved.\\111-- Adjusted comparable prices in adjustments must be numerically traceable: adjusted\_price is the comparable's raw price after your stated adjustments, and must remain within a plausible band of the raw price.\\112-- Keep missing data missing: if the floor area, land area, year built or roll values are null, say so and widen your interval instead of filling the gap.\\113-- Quantities: CAD for money, square metres for areas, kilometres for distances, ISO dates.114115ANSWER FORMAT\\116Return ONLY one JSON object that validates against the schema requested in the user message. No prose outside the JSON, no markdown fences, no comments. Numbers are plain numbers (no currency symbols, no thousands separators). Quantiles must be non-decreasing (q05 $\le$ q25 $\le$ q50 $\le$ q75 $\le$ q95) and the point estimate must lie within [q05, q95]; the 90 \% interval [q05, q95] should reflect your genuine uncertainty given the evidence you can see. reasoning\_summary is at most 120 words and must mention the evidence ids that drove the estimate. Be concise, specific and quantitative; do not pad.117\end{quote}118119\subsection{Two role-specific texts}120121\noindent\textit{Role} \texttt{comparables} \textit{(view: subject, comparables).}122\begin{quote}\small\sffamily\raggedright123You are the comparable-sales selection and adjustment specialist. Rank the comparables by similarity to the subject (class, subtype, floor area, land area, year built, distance, months before valuation), discard the ones that are not credible substitutes and say why, then adjust the retained ones for time, size, age and location. Report one adjustment entry per retained comparable with the adjusted price. Your point estimate is a weighted reconciliation of the adjusted prices; your interval reflects their dispersion and the quality of the match.124\end{quote}125126\noindent\textit{Role} \texttt{building\_condition} \textit{(view: subject only).}127\begin{quote}\small\sffamily\raggedright128You are the building-condition specialist. You see only the subject's attributes and roll values, and NO inspection has been performed. State plainly that condition, renovations and defects are unobserved. Reason only about what age, storeys, floor area, construction year, new-construction flag and the land/building split of the roll imply for typical depreciation and functional obsolescence. Your estimate starts from the roll values and the reference date stated; your interval must be wide and your missing\_data must list the inspection items you would need.129\end{quote}130131\subsection{Placebo and generalist texts}132133\noindent\textit{Placebo member} $k$ \textit{(arm~I; the view is that of default role} $k$\textit{).}134\begin{quote}\small\sffamily\raggedright135You are committee member number \{k\}. You have no specialised role: apply general real-estate valuation judgement to the evidence available to you, cite the ids you rely on, state your assumptions and return your best estimate with a calibrated 90 \% interval.136\end{quote}137138\noindent\textit{Generalist (arms~E and~J; full packet).}139\begin{quote}\small\sffamily\raggedright140You are a single generalist valuation analyst working alone. You see the full packet. Use comparable sales, the market context, the roll values and the geospatial context as you see fit, state your assumptions, and return your best estimate and a calibrated 90 \% interval.141\end{quote}142143\section{The JSON Output Contract}144\label{app:contract}145146Every estimate turn must return one object validating against the \texttt{AgentEstimate} schema and every critique turn one object validating against \texttt{CritiqueSet}, both defined as typed Pydantic models in \texttt{src/agentic\_valuation/schemas.py} and enforced through the vendors' structured-output facilities and a server-side validation with at most two corrective retries. Table~\ref{tab:app_contract} lists the fields. The validator of \texttt{AgentEstimate} rejects any object in which a quantile or the point estimate is not strictly positive, in which the five quantiles are not non-decreasing, or in which the point estimate lies outside $[q_{05}, q_{95}]$; a turn that fails after the retries is stored with its error and a null estimate and is excluded from aggregation without imputation. The schema also defines the evidence packet (\texttt{SubjectProperty}, \texttt{Comparable}, \texttt{MarketContext}, \texttt{GeoContext}), whose evidence identifiers are the universe against which \texttt{evidence\_ids\_used} and \texttt{evidence\_ids\_cited} are checked by the faithfulness audit, and the transcript objects (\texttt{AgentTurn}, \texttt{DebateTranscript}) that record each turn's role, round, kind, model, provider, tokens, cost, latency, prompt hash, request identifier, validation retries and error, together with the committee assignment and the protocol events of each property.147148\begin{table}[htbp]149\centering150\caption{Fields of the two output schemas.}151\label{tab:app_contract}152\footnotesize153\begin{tabular}{@{}llp{7.6cm}@{}}154\toprule155Field & Type & Meaning and constraint \\156\midrule157\multicolumn{3}{@{}l}{\textit{AgentEstimate (estimate and revision turns)}} \\158\texttt{point\_estimate} & number & most likely market value in CAD as of the valuation date; positive; within $[q_{05},q_{95}]$ \\159\texttt{q05}, \texttt{q25}, \texttt{q50}, \texttt{q75}, \texttt{q95} & numbers & quantiles of the predictive distribution in CAD; positive and non-decreasing \\160\texttt{evidence\_ids\_used} & list of strings & packet identifiers actually relied upon (P, C01--C12, M1, G1) \\161\texttt{adjustments} & list of objects & each with \texttt{comparable\_id}, \texttt{adjusted\_price} (CAD after the stated adjustments) and \texttt{reason} \\162\texttt{key\_assumptions} & list of strings & assumptions on which the estimate rests \\163\texttt{missing\_data} & list of strings & fields and observations that were absent and would have mattered \\164\texttt{confidence\_rationale} & string & why the interval has the width it has \\165\texttt{counterarguments} & list of strings & the strongest reasons the estimate could be wrong \\166\texttt{reasoning\_summary} & string & at most 120 words; must mention the evidence identifiers that drove the estimate \\167\midrule168\multicolumn{3}{@{}l}{\textit{CritiqueSet (critique turns): a list of Critique objects}} \\169\texttt{target\_role} & string & the committee member addressed \\170\texttt{agree} & boolean & whether the critic agrees with the target's estimate \\171\texttt{points} & list of strings & evidence-based objections or confirmations \\172\texttt{evidence\_ids\_cited} & list of strings & packet identifiers supporting the points \\173\texttt{suggested\_value} & number or null & an alternative value, only when the critic can justify one \\174\bottomrule175\end{tabular}176\end{table}177178\section{Additional Tables}179\label{app:tables}180181This appendix reports, for the validation partition on which every design choice was made, for the untouched 2026 holdout and for the prospective set of sales registered after the freeze, the same tables that the main text reports for the test partition: accuracy by arm, the paired contrasts, interval coverage and sharpness, errors by stratum and cost. Every fragment is written by \texttt{scripts/20\_evaluate.py} from the versioned prediction files and is not edited by hand. Baselines are evaluated on the full partition; the agentic arms on the nested subsamples described in Section~\ref{subsec:design_budget} (forty validation properties per committee, twenty for the four-round debate, sixty holdout properties and forty prospective sales, all in the mixed committee at the mid tier unless the committee column says otherwise), with the median of the roles' final estimates as the aggregation rule. Strata with fewer than thirty properties are suppressed, which for the agentic arms leaves few cells. The faithfulness audit is reported once, in the main text, because its table covers every run of every partition.182183\subsection{Validation partition}184185\begin{table}[htbp]186\centering187\caption{Accuracy by arm, validation partition (2024-07 to 2025-03). Mean $|e|$ is the mean absolute log error; MAE in CAD; MdAPE the median absolute percentage error; P90 and P95 the empirical percentiles of $|e|$; bias the mean log error; the last column but one the share of properties with $|e|>\log 1.25$. Source: \texttt{results/evaluation\_validation/summary.csv}.}188\label{tab:app_main_validation}189\footnotesize190\fittable{\input{tables/main_results_validation}}191\end{table}192193\begin{table}[htbp]194\centering195\caption{Paired contrasts, validation partition. $\Delta$ is the mean of $|e_i^{B}|-|e_i^{A}|$ over the same properties; the interval and the bootstrap $p$-value come from the paired block bootstrap over municipality-by-month cells (2,000 draws); Holm adjustment within the primary family; DM is the Diebold--Mariano $p$-value with the Harvey--Leybourne--Newbold correction. Source: \texttt{results/evaluation\_validation/contrasts.csv}.}196\label{tab:app_contrasts_validation}197\footnotesize198\fittable{\input{tables/contrasts_validation}}199\end{table}200201\begin{table}[htbp]202\centering203\caption{Interval coverage and sharpness, validation partition. Coverage at 50 and 90 percent is read directly from the five quantiles; coverage at 80 and 95 percent is interpolated from a normal fit in log space; width is the mean log width of the 90 percent interval; pinball loss is averaged over the five quantiles; CRPS is the lower-biased score on the five-point grid. Source: \texttt{results/evaluation\_validation/coverage.csv}.}204\label{tab:app_coverage_validation}205\footnotesize206\fittable{\input{tables/coverage_validation}}207\end{table}208209\begin{table}[htbp]210\centering211\caption{Cost, latency and tokens per property by arm, validation partition. Costs are estimates from the ledger at list prices, not invoices. Source: \texttt{results/evaluation\_validation/cost.csv}.}212\label{tab:app_cost_validation}213\footnotesize214\fittable{\input{tables/cost_validation}}215\end{table}216217\begin{landscape}218\begin{table}[htbp]219\centering220\caption{Mean absolute log error by stratum and arm, validation partition. Cells with fewer than thirty properties are suppressed. Source: \texttt{results/evaluation\_validation/strata.csv}.}221\label{tab:app_strata_validation}222\scriptsize223\fittable{\input{tables/strata_validation}}224\end{table}225\end{landscape}226227\subsection{Holdout partition (2026)}228229\begin{table}[htbp]230\centering231\caption{Accuracy by arm, holdout partition (2026-01 to 2026-10), evaluated once after the test results were written. Columns as in Table~\ref{tab:app_main_validation}. Source: \texttt{results/evaluation\_holdout/summary.csv}.}232\label{tab:app_main_holdout}233\footnotesize234\fittable{\input{tables/main_results_holdout}}235\end{table}236237\begin{table}[htbp]238\centering239\caption{Paired contrasts, holdout partition. Columns as in Table~\ref{tab:app_contrasts_validation}. Source: \texttt{results/evaluation\_holdout/contrasts.csv}.}240\label{tab:app_contrasts_holdout}241\footnotesize242\fittable{\input{tables/contrasts_holdout}}243\end{table}244245\begin{table}[htbp]246\centering247\caption{Interval coverage and sharpness, holdout partition. Columns as in Table~\ref{tab:app_coverage_validation}. Source: \texttt{results/evaluation\_holdout/coverage.csv}.}248\label{tab:app_coverage_holdout}249\footnotesize250\fittable{\input{tables/coverage_holdout}}251\end{table}252253\begin{table}[htbp]254\centering255\caption{Cost, latency and tokens per property by arm, holdout partition. Source: \texttt{results/evaluation\_holdout/cost.csv}.}256\label{tab:app_cost_holdout}257\footnotesize258\fittable{\input{tables/cost_holdout}}259\end{table}260261\begin{landscape}262\begin{table}[htbp]263\centering264\caption{Mean absolute log error by stratum and arm, holdout partition. Cells with fewer than thirty properties are suppressed. Source: \texttt{results/evaluation\_holdout/strata.csv}.}265\label{tab:app_strata_holdout}266\scriptsize267\fittable{\input{tables/strata_holdout}}268\end{table}269\end{landscape}270271\subsection{Prospective set}272273\begin{table}[htbp]274\centering275\caption{Accuracy by arm, prospective set: 1,182 sales registered between the snapshot of 2026-10-21 and the fetch of 2026-10-27, absent from every partition and valued under the frozen protocol; the agentic arms on a stratified draw of forty. Columns as in Table~\ref{tab:app_main_validation}. Source: \texttt{results/evaluation\_prospective/summary.csv}.}276\label{tab:app_main_prospective}277\footnotesize278\fittable{\input{tables/main_results_prospective}}279\end{table}280281\begin{table}[htbp]282\centering283\caption{Paired contrasts, prospective set. Columns as in Table~\ref{tab:app_contrasts_validation}. Source: \texttt{results/evaluation\_prospective/contrasts.csv}.}284\label{tab:app_contrasts_prospective}285\footnotesize286\fittable{\input{tables/contrasts_prospective}}287\end{table}288289\begin{table}[htbp]290\centering291\caption{Interval coverage and sharpness, prospective set. Columns as in Table~\ref{tab:app_coverage_validation}. Source: \texttt{results/evaluation\_prospective/coverage.csv}.}292\label{tab:app_coverage_prospective}293\footnotesize294\fittable{\input{tables/coverage_prospective}}295\end{table}296297\begin{table}[htbp]298\centering299\caption{Cost, latency and tokens per property by arm, prospective set. Source: \texttt{results/evaluation\_prospective/cost.csv}.}300\label{tab:app_cost_prospective}301\footnotesize302\fittable{\input{tables/cost_prospective}}303\end{table}304305\begin{landscape}306\begin{table}[htbp]307\centering308\caption{Mean absolute log error by stratum and arm, prospective set. Cells with fewer than thirty properties are suppressed. Source: \texttt{results/evaluation\_prospective/strata.csv}.}309\label{tab:app_strata_prospective}310\scriptsize311\fittable{\input{tables/strata_prospective}}312\end{table}313\end{landscape}314315\end{appendices}316% ----------------------------------------------------------------------------317% appendix/proofs.tex is input by main.tex immediately after this file and opens its own318% \section{Proofs}. The settings below keep that section inside the appendix sequence319% (letter E, A-numbered tables and figures) after the appendices environment has closed.320% ----------------------------------------------------------------------------321\renewcommand{\thesection}{\Alph{section}}322\renewcommand{\thesubsection}{\thesection.\arabic{subsection}}323\setcounter{section}{4}324\renewcommand{\thetable}{A\arabic{table}}325\renewcommand{\thefigure}{A\arabic{figure}}326\clearpage327
Files · main
Menu

Theme