% ============================================================================ \begin{appendices} % ============================================================================ \section{Taxonomy}\label{app:taxonomy} \begin{table}[H] \centering\small \caption{The 21-category SPID project taxonomy (\texttt{spid/taxonomy.py}, unchanged since the June 2026 release)}\label{tab:taxonomy} \input{tables/tab_taxonomy} \end{table} \section{Extraction contract}\label{app:prompt} The system prompt below is passed verbatim to the chat-completion endpoint, with the 21 taxonomy codes and labels substituted at the placeholder. The user message is the string ``\texttt{SECTION: }'' followed by the focused section text, truncated to 14{,}000 characters. Decoding parameters: temperature 0, JSON-object response format, 2{,}000 completion tokens. Model identifier recorded during the October 2026 run: \texttt{gpt-4o-mini-2024-07-18}. \input{tables/prompt} \noindent The candidate gate is the case-insensitive regular expression \texttt{\textbackslash b(project|initiative|program|invest|expan|construct|build|launch|develop|deploy|implement|acqui|partner|facilit|capacity|capital|migrat|transform|pipeline|plant|data ?cent|automat|sustainab|renewable|restructur)\textbackslash w*}. Sections without a match, or with fewer than 30 words, are not submitted. \section{Data dictionary and data-model audit}\label{app:dictionary} \begin{table}[H] \centering\footnotesize \caption{Tables required by the research design, current implementation and status}\label{tab:datamodel} \begin{tabularx}{\textwidth}{lXl} \toprule Required table & Current implementation (database, table, key fields) & Status \\ \midrule \texttt{universe\_snapshots} & \texttt{data/metadata/universe.json} + \texttt{companies} (CIK, ticker(s), name, sector, flags \texttt{in\_sp500}/\texttt{in\_russell3000}, fund weight, SIC, state, exchange, FYE, shard); snapshot date and source URL recorded & Partial: no file hash, no membership dates, no match confidence \\ \texttt{issuers} & \texttt{companies} (one row per CIK; former names from SEC header stored in metadata JSON only) & Partial: no name history, no parent/subsidiary links \\ \texttt{filings} & \texttt{filings} (accession PK, CIK FK, form, filing/report dates, SEC URL, local path, size, download and parse status) & Implemented; no acceptance timestamp, no checksum \\ \texttt{sections} & \texttt{filing\_sections} (UUID PK, accession FK, name, item, order, text, counts) & Implemented; no character offsets into raw HTML \\ \texttt{project\_mentions} & \texttt{project\_mentions} (SHA-1 id, accession, CIK, section id, name, type, description, objective, amount, raw amount, lists, years, status, confidence, backend, issuer context) & Implemented; no evidence span, no prompt hash, no five-way label \\ \texttt{projects} & \texttt{projects} (MD5 of CIK$|$type$|$location-or-name, representative fields, max amount, counts, first/last seen and cited years) & Implemented (deterministic key) \\ \texttt{project\_mention\_links} & implicit in the key (every mention maps to exactly one project) & Proposed: explicit table with score, resolver version, adjudication \\ \texttt{project\_events} & \texttt{project\_timeline} (one row per mention: date, form, status, amount, confidence, snippet) & Partial: mention rows, not typed events \\ \texttt{project\_amounts} & \texttt{amount\_usd}/\texttt{amount\_raw} on mentions; max on projects & Proposed: type, currency, scale, basis, realization flag \\ \texttt{extraction\_runs} & \texttt{extracted\_sections} ledger (section, accession, backend, n\_mentions, timestamp) + run logs & Partial: no prompt/schema/taxonomy hashes, no call status \\ \texttt{human\_labels} & --- & Proposed \\ \bottomrule \end{tabularx} \end{table} \noindent The full field-level dictionary of the current tables is maintained in \texttt{docs/data\_dictionary.md} of the working-paper folder and in the repository documentation. \section{Evidence register}\label{app:evidence} \begin{table}[H] \centering\footnotesize \caption{Evidence register: status of the main claims of this paper at revision \texttt{2324b58}}\label{tab:evidence} \begin{tabularx}{\textwidth}{Xl} \toprule Claim & Status \\ \midrule Universe of 2{,}564 issuers built from the IWV holdings file (2026-10-23) and the S\&P~500 cache (2026-05-25) & Implemented, verified (artifact counts) \\ 527{,}548 primary documents of Forms 10-K/10-Q/8-K since 2010 downloaded; 16 unparsed & Implemented, verified (database counts) \\ Acquisition respected the SEC rate limit (aggregate token bucket; no 403 recorded) & Implemented; documented from run logs \\ 1{,}342{,}283 sections, 10{,}720{,}890 chunks and embeddings; factor panels for 2{,}501 firms & Implemented, verified \\ 1{,}123{,}098 sections submitted to the extractor; ledger free of outage artifacts & Implemented, verified after manual audit of the outage window \\ 308{,}065 mentions, 121{,}099 projects, graph of 183{,}472 nodes & Implemented, verified \\ Each mention grounded in its source section & Documented (prompt rule), not mechanically verified \\ Extraction precision/recall, category accuracy, field accuracy, calibration & Not measured (protocol specified) \\ Linkage precision/recall of the resolution key & Not measured; failure modes documented with examples \\ Amounts typed and separated from realized expenditure & Not implemented (proposed) \\ Dated project events and point-in-time revision flags & Not implemented (mention-level timeline only) \\ Human-coded gold standard with two annotators and adjudication & Proposed \\ Author order, affiliations and CRediT contributions & Pending confirmation by the three coauthors \\ \bottomrule \end{tabularx} \end{table} \section{Additional tables}\label{app:tables} \begin{table}[H] \centering\footnotesize \caption{Coverage by filing year}\label{tab:coverage_year} \adjustbox{max width=\textwidth}{\input{tables/tab_coverage_year}} \end{table} \begin{table}[H] \centering\small \caption{Issuers with the most resolved projects}\label{tab:top_issuers} \input{tables/tab_top_issuers} \end{table} \begin{table}[H] \centering\small \caption{Self-reported confidence of mentions}\label{tab:confidence} \input{tables/tab_confidence} \end{table} \begin{table}[H] \centering\small \caption{Knowledge graph composition}\label{tab:graph} \input{tables/tab_graph} \end{table} \section{Replication}\label{app:replication} \begin{enumerate} \item Clone the repository at revision \texttt{2324b58} and create the Python~3.12 environment (\texttt{requirements.txt}; DuckDB~2.0, pyarrow, lxml, sentence-transformers). \item \texttt{python scripts/build\_universe.py} rebuilds \texttt{data/metadata/universe.json}; the frozen artifact used here is kept with the paper (\texttt{data/}) so that a later IWV file does not change the sample. \item \texttt{python scripts/download\_filings.py --universe --rate 9} downloads the corpus (idempotent; about 255~GB; seven hours at two IP addresses). The cluster orchestration used for the October 2026 build is in \texttt{scripts/cluster/}. \item \texttt{python scripts/build\_database.py}, \texttt{parse\_filings.py}, \texttt{build\_embeddings.py}, \texttt{build\_factors.py} build the corpus layer; \texttt{export\_shard.py}/\texttt{merge\_shards.py} are needed only for a distributed build. \item In \texttt{project-db/}: \texttt{python -m spid pending} reports the sections to be extracted and the estimated cost; \texttt{python run\_full\_extract.py --workers 48} runs the extraction against the ledger; \texttt{python -m spid resolve graph embed analytics} builds the project layer. \item In the working-paper folder: \texttt{python code/export\_stats.py data/} and \texttt{python code/make\_tables.py} regenerate every table and figure; \texttt{latexmk} in \texttt{paper/} compiles the manuscript. \end{enumerate} \end{appendices}