1% ============================================================================2% Part IV — Computational Methodology3% Written by Agent L (Part IV instance), 2026-11-03. Documents what the code in4% ingestion/, systematic_review/, taxonomy/, bibliometrics/, knowledge_graph/,5% econometrics/, embeddings/ and experiments/ actually does. Where the code and6% RESEARCH_PLAN.md differ, the code is described and the difference is stated.7% Corpus numbers only through macros of tables/numbers.tex.8% ============================================================================910\section{Notation and the corpus as a measurable object}11\label{sec:m-notation}1213Every quantity reported in Parts VIII and IX is a function of a finite set of14bibliographic records and of a small number of deterministic transformations15applied to them. This part states those transformations with enough precision16that an independent analyst could recompute the results from the raw snapshots17listed in Part III. The exposition follows the order of the pipeline18(\texttt{reproducibility/RUNBOOK.md}): record linkage, deduplication and19eligibility (Section~\ref{sec:m-linkage}), multi-label classification20(Section~\ref{sec:m-classification}), bibliometric indicators21(Section~\ref{sec:m-bibliometrics}), network measures (Section~\ref{sec:m-networks}),22semantic mapping (Section~\ref{sec:m-semantic}), structural change23(Section~\ref{sec:m-structural}), emerging-topic detection24(Section~\ref{sec:m-emerging}), knowledge-graph extraction25(Section~\ref{sec:m-kg}) and the treatment of uncertainty and reproducibility26(Section~\ref{sec:m-uncertainty}). Throughout, a design choice that departs from27the preregistered plan (\texttt{RESEARCH\_PLAN.md}, \texttt{protocol/PROTOCOL.md})28is stated as such, because the code, not the plan, is what produced the numbers.2930\subsection{Works, dates and periods}3132Let $\mathcal{W}_0$ denote the set of OpenAlex work records loaded from the33snapshot of 14~October 2026 (the records carrying at least one topic of the34Computer Science field, plus the second-pass records recovered through DBLP and35arXiv identifiers, Section~\ref{sec:m-linkage}). Each record $w \in \mathcal{W}_0$36carries an OpenAlex identifier, a type $\tau(w)$ drawn from the OpenAlex37controlled vocabulary, a publication date $d_{\mathrm{pub}}(w)$, a creation date38$d_{\mathrm{cr}}(w)$ (the date at which the record entered OpenAlex), a title, an39optional abstract, authorships, a primary source (venue), OpenAlex topics with40their subfield and field, a list of referenced works, and yearly citation counts.41Linked records from DBLP, arXiv and the ACL Anthology attach to $w$ a DBLP key,42an arXiv identifier with its arXiv creation date $d_{\mathrm{arx}}(w)$ and primary43category, and an ACL identifier.4445The temporal position of a work is its \emph{first date},46\begin{equation}47 d(w) \;=\; \min\bigl\{\, d_{\mathrm{pub}}(w),\; d_{\mathrm{pub}}(\pi(w)),\; d_{\mathrm{arx}}(w) \,\bigr\},48 \label{eq:first-date}49\end{equation}50where $\pi(w)$ is the preprint record merged into $w$ by the deduplication rule of51Section~\ref{sec:m-dedup} when one exists, and each missing term is replaced by52$d_{\mathrm{pub}}(w)$. The first date, not the date of the version of record, is53the quantity that places a work on the time axis, because the research question54concerns when ideas entered the literature rather than when a publisher released55them. The publication year $y(w)$ used for citation normalisation is, in56contrast, the OpenAlex \texttt{publication\_year} of the surviving record,57because citation windows are defined in calendar years of the OpenAlex58\texttt{counts\_by\_year} table (Section~\ref{sec:m-citations}). The two59conventions are deliberately distinct and both are stored on every record.6061The observation window is $[t_0, t_1] = [\text{2018-01-01}, \text{2026-11-02}]$,62split at the reference date $t^{\ast} = \text{2022-11-30}$ into a baseline63period $B = [t_0, t^{\ast})$ and a post period $P = [t^{\ast}, t_1]$:64\begin{equation}65 \mathrm{period}(w) \;=\;66 \begin{cases}67 B & \text{if } t_0 \le d(w) < t^{\ast},\\68 P & \text{if } t^{\ast} \le d(w) \le t_1 .69 \end{cases}70\end{equation}71Monthly series use the month $m(w)$ of the first date. Two facts about dates72constrain everything that follows. First, a substantial share of OpenAlex73records carry a publication date equal to the first of January of their year,74which is the database's convention for year-only precision rather than a real75date. The pipeline therefore attaches to every record a flag76\begin{equation}77 \mathrm{prec}(w) \;=\;78 \begin{cases}79 \text{year} & \text{if } d_{\mathrm{pub}}(w) \text{ falls on 1 January},\\80 \text{month} & \text{otherwise},81 \end{cases}82\end{equation}83and every monthly series in this paper is computed on the month-precision84subset $\mathcal{W}^{\mathrm{m}} = \{w : \mathrm{prec}(w) = \text{month}\}$ only85(amendment A-002). A genuine 1~January publication is thereby misclassified as86year precision and dropped from monthly series; the loss is small and, more87importantly, it does not depend on the period, so it cannot manufacture a break.88Annual series use all eligible records. Second, the right end of the window is89censored: records published in the last months before the snapshot are90under-represented because OpenAlex indexes them with a lag. The treatment of this91right-truncation is specified in Section~\ref{sec:m-truncation}.9293\subsection{Categories, areas and the measurable structure}9495Let $\mathcal{K}$ be the set of the forty leaf categories of the ontology96(\texttt{taxonomy/ontology.yaml}, Part III and Appendix~A) and $\mathcal{A}$ the97set of its eight areas, with the surjection $a : \mathcal{K} \to \mathcal{A}$98assigning each leaf to its area. Seven leaves are additionally declared children99of another leaf (for instance \textit{llm} $\prec$ \textit{foundation\_models},100\textit{compilers} $\prec$ \textit{programming\_languages}); this partial order101$\prec$ is used only to break ties when a primary category is chosen. The102classifier of Section~\ref{sec:m-classification} assigns to each work a label set103$C(w) \subseteq \mathcal{K}$, possibly empty, and, when $C(w) \neq \emptyset$, a104primary category $\kappa^{\ast}(w) \in C(w)$. Multi-label counting and primary105counting give different answers to ``how many works are in category $k$'', and106both are reported: for a set of works $S$,107\begin{equation}108 N_k^{\mathrm{ml}}(S) = \bigl|\{ w \in S : k \in C(w) \}\bigr|, \qquad109 N_k^{\mathrm{pr}}(S) = \bigl|\{ w \in S : \kappa^{\ast}(w) = k \}\bigr| ,110\end{equation}111so that $\sum_k N_k^{\mathrm{pr}}(S) \le |S|$ with equality when every work is112classified, whereas $\sum_k N_k^{\mathrm{ml}}(S)$ exceeds $|S|$ by the number of113secondary labels. Flows between categories (Section~\ref{sec:m-networks}) and114the emerging-topic panel (Section~\ref{sec:m-emerging}) use the primary label;115co-classification statistics use the full label set.116117The eligible corpus $\mathcal{W} \subseteq \mathcal{W}_0$ is the set of records118passing the predicate $E(w)$ of Section~\ref{sec:m-eligibility}. For a month $t$119and a category $k$, the elementary counts are120\begin{equation}121 N_t = \bigl|\{ w \in \mathcal{W}^{\mathrm{m}} : m(w) = t \}\bigr|, \qquad122 N_{k,t} = \bigl|\{ w \in \mathcal{W}^{\mathrm{m}} : m(w) = t,\; \kappa^{\ast}(w) = k \}\bigr|,123 \qquad s_{k,t} = N_{k,t}/N_t .124 \label{eq:counts}125\end{equation}126Every estimand of Parts VIII and IX is a functional of these counts, of the127citation matrix of Section~\ref{sec:m-citations}, of the authorship lists, or of128the embedding vectors of Section~\ref{sec:m-semantic}. The corpus is finite and129fully enumerated, so the descriptive quantities are population quantities rather130than sample estimates; the inferential devices of Sections~\ref{sec:m-structural}131and~\ref{sec:m-emerging} address a different kind of uncertainty, namely whether132an observed temporal pattern is distinguishable from the ordinary fluctuations133of the series, and whether a predictor would have worked out of time.134135\subsection{Storage and computation}136137The pipeline keeps the raw snapshots immutable (per-file SHA-256 ledgers,138Section~\ref{sec:m-uncertainty}) and materialises all derived tables as Parquet139files queried through DuckDB \citep{raasveldt2019duckdb}; the linkage,140deduplication, eligibility, counting and citation-window steps are SQL141statements executed inside one database file, which makes every table in this142part a deterministic function of the raw inputs and of the script that produced143it. Python is used where SQL is inconvenient: the regular-expression classifier,144the structural-change toolkit, the embedding and clustering steps, and the145detector. The slim table of all OpenAlex works (\LinkSlimTotal{} rows: identifier,146DOI, year, type, primary topic hierarchy, citation count) is kept so that the147field of a cited work outside computer science can be resolved148(Section~\ref{sec:m-citgraph}); this is decision D2 of the plan.149150\section{Record linkage, deduplication and eligibility}151\label{sec:m-linkage}152153The four sources describe overlapping but differently delimited populations:154OpenAlex is the backbone, DBLP defines what counts as a computer-science venue,155arXiv contributes preprints and their categories, and the ACL Anthology serves as156a coverage check for natural-language processing. Combining them is a record157linkage problem in the classical sense of \citet{fellegi1969linkage}: two158records from different files must be declared the same work or not, on the159basis of comparison vectors computed from their fields. The pipeline uses a160deterministic cascade rather than a probabilistic model, because the dominant161comparison fields (DOI and arXiv identifier) are persistent identifiers whose162agreement is near-conclusive, and because a probabilistic model would require163labelled training pairs that the project does not possess before the human164checkpoint H-1. The cost of this choice is that the precision of the residual165title-based step must be estimated from a reviewed sample rather than derived166from the model; the design of that estimate is given in167Section~\ref{sec:m-linkprecision}.168169\subsection{Normalised keys and the linkage cascade}170\label{sec:m-cascade}171172For each source the script \texttt{ingestion/link\_sources.py} builds a key173table. A DOI is lower-cased. An arXiv identifier is lower-cased and stripped of174its version suffix (\texttt{v[0-9]+\$}); for DBLP records, which do not carry an175arXiv field, the identifier is extracted from the electronic-edition URLs by the176pattern \texttt{arxiv.org/abs/([\^{} ]+)}. A title is normalised by the map177\begin{equation}178 \eta(\text{title}) \;=\; \mathrm{delete}_{\,\neg[a\text{--}z\,0\text{--}9]}\bigl(\mathrm{lower}(\text{title})\bigr),179 \label{eq:ntitle}180\end{equation}181which lower-cases and deletes every character outside $[a$--$z0$--$9]$, so that182punctuation, whitespace, case and diacritics (which do not survive the ASCII183filter) no longer separate otherwise identical titles. The normalised title is184used only for records whose original title has at least 25 characters, a185threshold that removes the many short generic titles (``Introduction'',186``Editorial'', ``Preface'') for which equality of $\eta$ carries no evidence.187188DBLP records are restricted to the years 2018--2026 and to the record types189\textit{article}, \textit{inproceedings}, \textit{incollection}, \textit{book},190\textit{phdthesis} and \textit{data}. The DBLP--OpenAlex cascade is then191\begin{enumerate}192 \item \textbf{DOI}: join on equal lower-cased DOI; every matching pair is kept193 (a DBLP key may match several OpenAlex records sharing a DOI, and194 conversely; the many-to-many structure is resolved at the195 deduplication stage, not here);196 \item \textbf{arXiv}: among records unmatched on both sides, join on equal197 normalised arXiv identifier;198 \item \textbf{title--year}: among records still unmatched on both sides,199 restrict each side to normalised titles that are \emph{unique} within200 that side, join on equal $\eta$, and keep the pair if the years differ201 by at most one.202\end{enumerate}203The uniqueness restriction in step 3 is the blocking device: it turns the join204into a one-to-one map and prevents a frequent title from generating a clique of205spurious pairs. The price is recall, since a genuine pair whose title appears206twice on either side (a journal version and a workshop version with the same207title, for instance) cannot be linked at this step; such pairs are usually caught208by the DOI step or by the preprint merge of Section~\ref{sec:m-dedup}. The209arXiv--OpenAlex cascade is analogous (arXiv identifier, then DOI, then unique210normalised title with a year tolerance of two, because the arXiv creation year211and the OpenAlex publication year of the version of record can legitimately212differ by more than one). The ACL--OpenAlex cascade uses DOI, then the ACL213identifier parsed from OpenAlex landing-page URLs of the form214\texttt{aclanthology.org/<id>}, then unique normalised title with a year215tolerance of one. Each link carries its method label, which is the stratification216variable of the precision sample.217218The counts of the first run are stored in \texttt{data/metadata/linkage\_report.json}219and reproduced in Part III; here it suffices to note the shape of the result.220Of the \LinkDblpTwoZeroOneEightTwoZeroTwoSix{} DBLP records in window,221\LinkDblpWithDoi{} carry a DOI, \LinkLinkDblpOaDoi{} are linked by DOI and222\LinkLinkDblpOaTitleYear{} by title and year, for \LinkDblpLinkedDistinct{}223distinct DBLP keys linked and \LinkDblpUnlinked{} unlinked. No DBLP record was224linked through the arXiv step (\LinkDblpWithArxiv{} DBLP keys with a parsable225arXiv identifier), which reflects the fact that the DBLP dump used here places226arXiv links in a field the parser did not read rather than a property of the227literature; the arXiv--OpenAlex cascade links \LinkArxivLinkedDistinct{} of the228\LinkArxivCreatedTwoZeroOneEightTwoZeroTwoSix{} arXiv \texttt{cs} records created229in window, almost all of them (\LinkLinkArxivOaArxivId{}) by identifier. The230\LinkDblpUnlinkedWithDoiInSlim{} unlinked DBLP records whose DOI does exist in the231slim table of all OpenAlex works are precisely the records that OpenAlex does232not label with any Computer Science topic; they motivate the second snapshot233pass, in which these identifiers (\LinkNeededOaIdsSecondPassDblpDoi{} from DBLP234and \LinkNeededOaIdsSecondPassArxivDoi{} from arXiv) are fetched in full and the235linkage is rerun with the union of both passes. The corpus is therefore not the236set of works that OpenAlex calls computer science; it is the union of that set237with what DBLP and arXiv call computer science, which is the sense in which the238mandate's requirement to ``cover the complete breadth of computer science''239rather than only the OpenAlex topic model is operationalised.240241\subsection{Preprint--publication deduplication}242\label{sec:m-dedup}243244A work that exists as an arXiv preprint and as a published version is two245OpenAlex records whenever OpenAlex has not merged them. Counting both would246double-count exactly the kind of work (AI preprints) whose growth is at issue247(CLAUDE.md §6.2). The script \texttt{systematic\_review/define\_corpus.py}248identifies such pairs within $\mathcal{W}_0$ by a title rule:249\begin{equation}250 (p, b) \text{ is a candidate pair} \iff251 \eta(p) = \eta(b),\;\; |y(p) - y(b)| \le 2,\;\;252 p \in \mathcal{P},\;\; b \notin \mathcal{P},\;\; |\text{title}| \ge 25,253 \label{eq:duppair}254\end{equation}255where $\mathcal{P} = \{ w : \tau(w) = \text{preprint} \text{ or } \text{DOI}(w)256\text{ starts with } \text{10.48550/arxiv} \}$ is the preprint-like set. A257preprint may match several published records and conversely; the rule keeps,258for each published record, the earliest-dated preprint and, for each preprint,259the earliest-dated published record, and discards any pair that is not the260first in both orderings. The surviving pairs define the map $\pi$ of261equation~\eqref{eq:first-date}: the published record $b$ receives262$\pi(b) = p$, $\text{preprint\_date}(b) = d_{\mathrm{pub}}(p)$ and the earlier of263the two dates as its first date; the preprint $p$ receives the flag264\textit{e5\_duplicate} and leaves the eligible corpus. The version relationship265is therefore kept on the surviving node, as the plan requires, but the match is266by exact normalised title only. Two limitations follow. A preprint whose title267changed between versions is not merged, and the pair survives as two works; a268preprint and an unrelated published paper with an identical normalised title269within two years are wrongly merged. The second error is rare for titles of at270least 25 characters; the first is the more consequential one and biases the271preprint share upward, which is the conservative direction for hypothesis H7.272Deduplication across the OpenAlex--DBLP boundary is not needed because DBLP273records are never counted as works: a DBLP record either links to an OpenAlex274record, in which case the OpenAlex record carries the flag \textit{in\_dblp}, or275it does not, in which case it is counted in the separate DBLP-only table used276for coverage assessment.277278\subsection{Eligibility predicate}279\label{sec:m-eligibility}280281Each record receives seven exclusion flags and two membership flags, computed282once and stored, so that every PRISMA count is a filter on the same table. With283$T_{\mathrm{keep}}$ = \{article, conference-paper, preprint, book-chapter, book,284dissertation, report, review, software-paper\}, $T_{\mathrm{hard}}$ = \{editorial,285erratum, retraction, peer-review, paratext, conference-abstract,286reference-entry, dataset, software, supplementary-materials, libguides, letter,287grant, standard\}, and $\mathcal{G}$ the list of generic deposit platforms288(Zenodo, Figshare, IRDB, LA Referencia, Dialnet, DOAJ-as-source, OSTI), the289flags are290\begin{align}291 e_1(w) &: d_{\mathrm{pub}}(w) \text{ missing or outside } [t_0, t_1];\\292 e_2(w) &: \tau(w) \notin T_{\mathrm{keep}} \;\wedge\; \neg\bigl(\text{in\_dblp}(w) \wedge \tau(w) \notin T_{\mathrm{hard}}\bigr);\\293 e_3(w) &: \text{is\_xpac}(w) \wedge \neg \text{in\_dblp}(w);\\294 e_4(w) &: \text{title empty};\\295 e_5(w) &: w \text{ is the preprint member of a pair of \eqref{eq:duppair}};\\296 e_6(w) &: \text{is\_retracted}(w);\\297 e_7(w) &: \text{source}(w) \in \mathcal{G} \wedge \neg\text{in\_dblp}(w) \wedge \text{no linked arXiv record}.298\end{align}299The membership flags encode the computer-science rule of the protocol:300\begin{align}301 \text{core}(w) &= \text{in\_dblp}(w) \;\vee\; \text{cs\_primary}(w) \;\vee\;302 \bigl(\text{cs\_any}(w) \wedge \text{arxiv\_cs\_primary}(w)\bigr),\\303 \text{penumbra}(w) &= \text{cs\_any}(w) \wedge \neg\,\text{core}(w),304\end{align}305where \text{cs\_primary} means that the primary OpenAlex topic belongs to field30617, \text{cs\_any} that some topic does, and \text{arxiv\_cs\_primary} that the307linked arXiv record's primary category starts with \texttt{cs.}. The eligibility308predicate is309\begin{equation}310 E(w) \;=\; \neg e_1 \wedge \neg e_2 \wedge \neg e_3 \wedge \neg e_4 \wedge \neg e_5 \wedge \neg e_7 \wedge \text{core}(w).311 \label{eq:eligible}312\end{equation}313Three features of this predicate deserve comment. Retraction ($e_6$) is314\emph{not} part of $E$: retracted works stay in the mapping corpus with their315flag and are excluded only from impact-based selections316(Section~\ref{sec:m-kg}), as the protocol specifies (E6). The type rule $e_2$ is317asymmetric by amendment A-001: a DBLP-indexed record is kept whatever its318OpenAlex type unless that type is in the hard-exclusion list, because the319first run showed that OpenAlex typed more than a million DBLP conference papers320in ways the original list rejected; XPAC records (OpenAlex's expansion of321coverage from secondary sources) are likewise kept when DBLP-indexed and flagged322\textit{xpac\_kept\_dblp}. The deposit-platform rule $e_7$ was added by323amendment A-002 after Zenodo alone was found to contribute a six-figure number324of 2026 records typed as articles with almost no references; the protocol's325original E7 (penumbra) is now the membership flag rather than an exclusion, so326the reason code E7 in the protocol and the flag $e_7$ in the code denote327different things. This is a documentation discrepancy, not an analytical one,328but readers comparing the protocol and the PRISMA table should be aware of it.329The penumbra set---works with a secondary computer-science topic but neither330DBLP nor arXiv support---is counted separately and enters only sensitivity331analyses; the strict core used for the sensitivity analyses in the other332direction is $\{w : E(w) \wedge \text{in\_dblp}(w) \wedge \text{cs\_primary}(w)\}$.333334The PRISMA counts are computed both marginally (how many records carry each335flag) and sequentially (how many are removed by each flag after the previous336ones have been applied, in the order $e_1, e_2, e_3, e_4, e_5, e_7$), because337the flags overlap heavily and only the sequential version sums to the final338count. The order is a reporting convention; the final eligible set does not339depend on it.340341\subsection{Design of the linkage-precision estimate}342\label{sec:m-linkprecision}343344Precision of the deterministic cascade is estimated on a stratified sample of345500 DBLP--OpenAlex pairs drawn by \texttt{systematic\_review/linkage\_sample.py}:346250 pairs linked by DOI, 200 by title--year and 50 by arXiv identifier (the347last stratum is empty in the current run, for the reason given in348Section~\ref{sec:m-cascade}), selected by ordering each stratum on a hash of the349DBLP key salted with the seed 44 and taking the first records, which is a350reproducible simple random sample within stratum. For each pair the script351computes an automatic agreement vector: a string similarity between the two raw352titles (Python's \texttt{difflib} ratio, twice the number of matched characters353in the longest-matching-block alignment divided by the total length), the absolute year difference, and whether the last tokens of the two354first-author names coincide; a pair is \textit{auto\_ok} if the similarity is at355least 0.9, the years differ by at most one and the surnames agree whenever both356are present. Two of every five pairs are reserved for the principal357investigator (\textit{pi\_review}), whose verdicts constitute the human358checkpoint H-1. Let $n_s$ be the stratum sizes and $\hat p_s$ the share of pairs359judged correct in stratum $s$; the overall precision of the link table is the360weighted estimate361\begin{equation}362 \hat p \;=\; \sum_s \frac{L_s}{L}\,\hat p_s, \qquad363 \widehat{\mathrm{Var}}(\hat p) = \sum_s \Bigl(\frac{L_s}{L}\Bigr)^2 \frac{\hat p_s(1-\hat p_s)}{n_s},364 \label{eq:linkprec}365\end{equation}366where $L_s$ is the number of links of method $s$ in the full table and $L$367their sum, so that the title--year stratum, which is the only one where errors368are plausible, is weighted by its small share of the links. The estimate369\pending{linkage precision from the H-1 sample, data/metadata/linkage\_sample\_summary.json}370is reported in Part III once the checkpoint is signed; until then the automatic371agreement rate is the only available figure and is labelled as such. Recall is372not estimated by this design: a DBLP record without an OpenAlex counterpart may373be a true absence from OpenAlex or a missed link, and distinguishing the two374would require searching OpenAlex by title for a sample of unlinked DBLP records,375which is left to the robustness appendix.376377\section{Multi-label classification into the ontology}378\label{sec:m-classification}379380The ontology assigns works to forty categories by rules over four kinds of381metadata signals and one textual signal. A rule-based classifier was preferred382to a trained one for three reasons that are worth stating because they are383also its limitations. The rules are inspectable: every assignment can be traced384to the signals that produced it, and the mapping from OpenAlex topics, arXiv385categories and DBLP venues to categories is a document386(\texttt{taxonomy/ontology.yaml}, with provenance notes per category) that a387reader can contest line by line. The rules need no labelled training set, which388the project did not have before checkpoint H-2, and so cannot inherit the biases389of one. And the rules are cheap enough to run on every eligible work, whereas an390LLM rater at the quality used for validation would cost orders of magnitude391more. The corresponding limitations are that rules do not generalise beyond the392vocabulary they encode, that the weights are expert judgements rather than393estimates, and that validation against independent raters is therefore the only394evidence of their accuracy.395396\subsection{Signals and the score}397\label{sec:m-score}398399For a work $w$, let $T(w)$ be its set of OpenAlex topic identifiers (up to400three per work), $F(w)$ its set of subfield identifiers, $X(w)$ the set of arXiv401categories of its linked arXiv record (primary and cross-lists), $D(w)$ the set402of DBLP venue streams of its linked DBLP records, and $\text{title}(w)$,403$\text{abs}(w)$ its title and abstract. Each category $k$ specifies weight maps404$\omega^{\mathrm{T}}_k : T \to [0,1]$, $\omega^{\mathrm{F}}_k$,405$\omega^{\mathrm{X}}_k$, $\omega^{\mathrm{D}}_k$ over the respective406vocabularies (zero outside the listed entries), a list of keyword rules407$(r, \omega, \phi)$ consisting of a regular expression $r$, a weight $\omega$408and a field $\phi \in \{\text{title}, \text{abstract}, \text{both}\}$, and a list409of exclusion regular expressions $Z_k$. The score of $w$ for $k$ is410\begin{equation}411 s_k(w) \;=\; \sum_{\sigma \in \{\mathrm{T},\mathrm{F},\mathrm{X},\mathrm{D}\}}412 \min\Bigl\{1,\; \sum_{x \in \sigma(w)} \omega^{\sigma}_k(x)\Bigr\}413 \;+\; \min\Bigl\{1,\; \sum_{(r,\omega,\phi) \in R_k} \omega \cdot \mathbf{1}\bigl[r \text{ matches } \phi(w)\bigr]\Bigr\},414 \label{eq:score}415\end{equation}416where $\phi(w)$ is the title, the abstract, or their concatenation according to417the field of the rule. Each of the five signal types is thus capped at one418before the types are summed, so $s_k(w) \in [0, 5]$, and the assignment rule is419\begin{equation}420 k \in C(w) \iff s_k(w) \ge \theta \;\wedge\; \neg\, \exists\, z \in Z_k :\ z \text{ matches } \text{title}(w) \| \text{abs}(w),421 \qquad \theta = 1 .422 \label{eq:assign}423\end{equation}424The cap is what gives the weights their meaning. A single signal with weight425one (a topic that \emph{is} the category, a venue that publishes nothing else, a426keyword that names the object of study) suffices on its own; a signal with427weight below one is a partial indication that must be corroborated by a signal428of another type, because repetitions of the same type cannot push the capped sum429above one. The ontology uses this device deliberately: the six AI categories430that the OpenAlex topic model does not separate (large language models,431foundation models, multimodal AI, generative AI, agents, AI safety) rely on432keyword rules of weight one that fire on the name of the object, while their433topic and venue signals are fractional. The exclusion list is a veto applied434after the threshold: a category that would otherwise be assigned is removed if435any exclusion pattern matches the title or abstract (for instance a436cryptocurrency pattern vetoing applied cryptography). The veto is not a negative437weight; it cannot be outvoted.438439One discrepancy between the ontology document and the implementation must be440recorded. The notes of the \texttt{assignment\_rule} block state that the441classifier takes the \emph{maximum} over matched topics before capping, whereas442\texttt{taxonomy/classify.py} takes the \emph{sum} and then caps, as443equation~\eqref{eq:score} states. The two agree whenever at most one listed444topic matches or the matched weights already sum to at least one; they differ445when two fractional topics of the same category co-occur, in which case the446implemented rule is the more permissive. The unit tests in447\texttt{tests/test\_classify\_rules.py} fix the implemented behaviour (a topic448listed three times contributes its weight once, because the topic set is449deduplicated, and a 0.6 topic plus a 0.4 arXiv category reach exactly 1.0). The450manuscript describes the implemented rule.451452\subsection{Primary category}453454When $C(w) \neq \emptyset$ the primary category is455\begin{equation}456 \kappa^{\ast}(w) \;=\; \operatorname*{arg\,max}_{k \in C(w)} \bigl( s_k(w),\; -\mathbf{1}[k \text{ is a parent of some } k' \in C(w)],\; -\mathrm{number}(k) \bigr)457\end{equation}458in lexicographic order: the highest score wins; among equal scores a category459that is the declared parent of another assigned category loses to its child460(so that a work scoring equally on \textit{llm} and \textit{foundation\_models}461is primarily an LLM paper); among remaining ties the lower ontology number462wins. The last rule is arbitrary and is stated so that the reader can see that463it is. The number of assigned categories $|C(w)|$ and the primary score are464stored with every work; works with $C(w) = \emptyset$ (eligible works none of465whose signals reach the threshold) are counted and characterised in Part IX, and466their share is one of the quality indicators of the classification. The467classifier is run on the eligible corpus and on the penumbra, so that468sensitivity analyses on the wider set do not require a second run.469470\subsection{Validation design and metrics}471\label{sec:m-validation}472473The rules are validated against two independent LLM raters on a stratified474sample (\texttt{taxonomy/VALIDATION.md}, \texttt{taxonomy/validate\_sample.py}):475fifty eligible works with an abstract per rule-assigned primary category (forty476strata) plus two hundred works with no category, drawn by ordering each stratum477on a salted hash with seed 44; two hundred of the resulting works are reserved478for the principal investigator (checkpoint H-2). Each rater receives the forty479category definitions, and for each work the title, abstract, venue and year,480and returns under a JSON schema a label set of at most five categories, a481primary category or null, a confidence and a short rationale. The raters never482see the rule-based assignment, so there is no leakage from the rules to the483reference labels, and the rule revision policy (a category with consensus484$F_1 < 0.60$ triggers a mapping revision, logged as an amendment, and a re-run)485can be applied without re-rating. The two raters are different models of the486same family (\texttt{claude-haiku-5-5}, \texttt{claude-sonnet-5-5}); their487agreement therefore does not measure the agreement that two human experts would488reach, and the 200-work human subsample is the only anchor for that.489490With $\hat C(w)$ the rule label set, $C^{r}(w)$ the label set of rater $r$ and491$C^{\cap}(w) = C^{A}(w) \cap C^{B}(w)$ the consensus set, the per-category492confusion counts against a reference $C^{\mathrm{ref}}$ are493$\mathrm{TP}_k = |\{w : k \in \hat C(w) \wedge k \in C^{\mathrm{ref}}(w)\}|$,494$\mathrm{FP}_k = |\{w : k \in \hat C(w) \wedge k \notin C^{\mathrm{ref}}(w)\}|$,495$\mathrm{FN}_k = |\{w : k \notin \hat C(w) \wedge k \in C^{\mathrm{ref}}(w)\}|$,496with precision $P_k = \mathrm{TP}_k/(\mathrm{TP}_k+\mathrm{FP}_k)$, recall497$R_k = \mathrm{TP}_k/(\mathrm{TP}_k+\mathrm{FN}_k)$ and498$F_{1,k} = 2P_kR_k/(P_k+R_k)$, the standard label-wise decomposition of499multi-label evaluation \citep{zhang2014multilabel}. Micro-averages pool the500counts over categories before forming the ratios; the macro-$F_1$ is the501unweighted mean of $F_{1,k}$ over categories with at least one positive or502predicted label. Because the sample is stratified by rule-assigned primary503category, the per-category precision is estimated on roughly equal support for504every category, whereas recall is estimated only among works that the rules505placed somewhere; a category that the rules systematically miss (true members506scattered among other strata or among the unassigned) will show inflated recall507in this design. The 200 unassigned works partly address this, but a proper508recall estimate would require sampling from the whole corpus with weights, and509the per-category recall figures should be read with that caveat.510511Agreement on the primary category is measured by Cohen's $\kappa$512\citep{cohen1960kappa},513\begin{equation}514 \kappa \;=\; \frac{p_o - p_e}{1 - p_e}, \qquad515 p_o = \frac{1}{n}\sum_w \mathbf{1}[\kappa^{A}(w) = \kappa^{B}(w)], \qquad516 p_e = \sum_{k \in \mathcal{K} \cup \{\varnothing\}} \frac{n^{A}_k}{n}\,\frac{n^{B}_k}{n},517\end{equation}518where ``no category'' is treated as a forty-first label and $n^{r}_k$ counts519the works to which rater $r$ assigned primary $k$; $\kappa$ is computed between520the two raters and between the rules and each rater. Agreement on the label521sets is measured by the mean Jaccard index522$\bar J = n^{-1}\sum_w |C^{A}(w) \cap C^{B}(w)| / |C^{A}(w) \cup C^{B}(w)|$523(with the convention $0/0 = 0$). The validation note announces Krippendorff's524$\alpha$ with the MASI distance for the multi-label agreement; the metrics525script computes the mean Jaccard index instead, and the manuscript reports526what is computed. A work is exported as a disagreement for human review when527the rules, rater~A and rater~B have no category in common although at least528one of them assigned one.529530\subsection{Known failure modes}531532The design makes some errors predictable, and they are listed here so that the533results of the validation can be read against expectations rather than as534surprises. Keyword rules on abstracts fire on mentions as well as on535contributions: a systems paper that evaluates its scheduler on a large language536model workload matches the LLM keyword and, since that keyword alone reaches537the threshold, acquires the \textit{llm} label; the exclusion lists remove the538most frequent such cases but cannot enumerate them. Venue signals are coarse:539general machine-learning venues carry fractional weights for several AI540categories at once, so a work with no abstract and a generic title can be541assigned to a parent-level category on venue evidence alone, or to none.542OpenAlex topics are themselves the output of a classifier with documented543error, and a work whose topics are wrong inherits that error with weight; the544protocol lists this among the limitations declared before analysis.545Multi-label assignment with a cap of one per type and a threshold of one tends546to over-assign categories to long abstracts that mention many objects, which547inflates $|C(w)|$ in the post period, when abstracts increasingly cite models548and benchmarks by name; the co-classification statistics of549Section~\ref{sec:m-networks} are affected by this in a direction that would550mimic convergence (hypothesis H4) and must be read together with the primary-label551flow statistics, which are not. Finally, works without an abstract (a known552share of the corpus) are classified from the title and the metadata only and553have lower recall for the keyword-dependent categories; the share of such554works is reported by year because it is not constant.555556\section{Bibliometric indicators}557\label{sec:m-bibliometrics}558559The indicators of this section are the estimands of research questions RQ1,560RQ3 and RQ6. They are standard in the scientometric literature, and the561definitions follow the review of \citet{waltman2016review} where a choice had562to be made; what is specific to this study is the citation-window discipline563imposed by the eight-year span of the corpus and the explicit treatment of the564two counting conventions. The scripts are \texttt{bibliometrics/01\_volume\_series.py},565\texttt{02\_collaboration.py} and \texttt{03\_citation\_impact.py}.566567\subsection{Volume, composition and growth}568569The monthly count $N_t$ and the category counts $N_{k,t}$ of570equation~\eqref{eq:counts} are tabulated by first month, period, date precision,571type and source membership (DBLP-indexed, OpenAlex-primary, arXiv-linked), with572the numbers of works having an abstract, having at least one resolvable573reference, and being open access; the annual table adds the mean number of574authors, references and countries per work. Composition is the share575$s_{k,t}$; its annual counterpart uses the primary label on all eligible works.576Growth between two dates separated by $\Delta$ years is summarised by the577compound annual growth rate578\begin{equation}579 \mathrm{CAGR}(t_a, t_b) \;=\; \Bigl( \frac{N_{t_b}}{N_{t_a}} \Bigr)^{1/\Delta} - 1,580 \qquad \Delta = (t_b - t_a)\ \text{in years},581 \label{eq:cagr}582\end{equation}583applied to annual totals and to annual category totals; it is a descriptive584summary of two end points and says nothing about the path between them, which585is why the structural-change analysis of Section~\ref{sec:m-structural} works586on the full monthly series instead. The CAGR is computed at table-making time587from the annual counts rather than by a dedicated script; the plan lists it588among the Phase-4 indicators and it is reported for complete years only, since5892026 is right-censored (Section~\ref{sec:m-truncation}).590591\subsection{Fixed citation windows}592\label{sec:m-citations}593594OpenAlex provides, for each work, the number of citations received in each595calendar year (\texttt{counts\_by\_year}). Let $c_{w}(u)$ be the citations596received by $w$ in calendar year $u$ and $y(w)$ its publication year. The597fixed-window counts are598\begin{equation}599 c^{(12)}_w = \sum_{u \le y(w)+1} c_w(u), \qquad600 c^{(36)}_w = \sum_{u \le y(w)+2} c_w(u), \qquad601 c^{(48)}_w = \sum_{u \le y(w)+3} c_w(u),602 \label{eq:windows}603\end{equation}604so that $c^{(12)}$ counts citations in the publication year and the following605calendar year, $c^{(36)}$ in the publication year and the two following years,606and so on. The superscripts are the names used in the code and in the tables607and must be read as calendar-year windows rather than as exact month counts: a608work published in January and one published in December of the same year609receive windows that differ by eleven months in effective length. This610granularity is imposed by the data (OpenAlex does not provide citation dates611below the year) and is the same for the baseline and the post period, so it612blurs comparisons within a year but does not bias comparisons between years.613The window is the device that neutralises citation-age bias: comparing the614total citation count of a 2019 work with that of a 2025 work compares seven615years of exposure with one, whereas comparing $c^{(36)}$ compares equal616exposures. The cost is that the last window-length of the corpus cannot be617evaluated; $c^{(36)}$ is complete for publication years up to 2023 given a618snapshot taken late in 2026, and $c^{(12)}$ up to 2024. Tables flag the years619for which a window is incomplete, and the choice of window length follows the620evidence in \citet{wang2013window} that short windows rank works materially621differently from long ones in slow-moving fields, which is why two lengths are622reported rather than one.623624\subsection{Field normalisation}625626Raw citation counts differ across subfields and document types by factors that627have nothing to do with influence. The normalised citation score of a work is628its window count divided by the mean window count of its reference class629\citep{waltman2016review, waltman2019fieldnorm}:630\begin{equation}631 \mathrm{NCS}^{(h)}_w \;=\; \frac{c^{(h)}_w}{\bar c^{(h)}\bigl(y(w), \tau(w), f(w)\bigr)}, \qquad632 \bar c^{(h)}(y, \tau, f) = \frac{1}{|\mathcal{W}_{y,\tau,f}|}\sum_{v \in \mathcal{W}_{y,\tau,f}} c^{(h)}_v ,633 \label{eq:ncs}634\end{equation}635where $f(w)$ is the primary OpenAlex subfield of $w$ and $\mathcal{W}_{y,\tau,f}$636the set of eligible works sharing year, type and subfield. The reference class637is computed on the eligible corpus, not on all of OpenAlex, so the638normalisation is relative to computer science as delimited here: an NCS of 2639means twice the mean of comparable computer-science works, not twice the world640mean. The score is undefined when the class mean is zero (very small classes in641the most recent years) and is then left missing rather than set to zero.642Normalisation by the mean of a heavy-tailed distribution is sensitive to a few643very highly cited works in the class; the median-based alternatives discussed644by \citet{waltman2016review} are not used because the median of $c^{(36)}$ is645zero in many classes of this corpus, which would make them uninformative.646647OpenAlex's own field-weighted citation impact (FWCI) is kept as a secondary648indicator. Its documentation defines it as ``citations received divided by649citations expected for works of the same type, year, and subfield'', with a650world average of one \citep{openalex2026fwci}. It differs from651equation~\eqref{eq:ncs} in three respects: the expected count is computed over652all of OpenAlex rather than over this corpus; the citation count is the total653to date rather than a fixed window, so that FWCI values of recent works are654based on a short and unequal exposure; and the computation is OpenAlex's,655recomputed nightly, so that the value depends on the snapshot date. For these656reasons FWCI is reported for comparison and never used to select works.657658\subsection{Inequality and concentration}659660Citation inequality within a publication year is measured by the Gini661coefficient of $c^{(36)}$ among the $n$ eligible works of that year. With the662works sorted so that $c_{(1)} \le c_{(2)} \le \dots \le c_{(n)}$, the estimator663implemented in SQL is the rank form664\begin{equation}665 G \;=\; \frac{2\sum_{i=1}^{n} i\, c_{(i)}}{n \sum_{i=1}^{n} c_{(i)}} - \frac{n+1}{n},666 \label{eq:gini}667\end{equation}668which equals one minus twice the area under the Lorenz curve and lies in669$[0, 1 - 1/n]$; the coefficient is named after \citet{ceriani2012gini}'s670account of its origin. Uncited works (a large share within a three-year671window) contribute zero to the numerator and pull $G$ upward, so the share of672uncited works is reported next to it. The protocol (H5) refers to the Gini of67324-month citations; the implemented statistic uses the three-calendar-year674window $c^{(36)}$, which is complete for one more publication year than the675longer alternatives and less dominated by zeros than $c^{(12)}$. This is a676deviation from the protocol wording and is recorded as such.677678Venue concentration within a year is the Herfindahl--Hirschman index of the679distribution of works over sources,680\begin{equation}681 \mathrm{HHI}_y \;=\; \sum_{v} \sigma_{v,y}^2, \qquad682 \sigma_{v,y} = \frac{N_{v,y}}{\sum_{v'} N_{v',y}},683 \label{eq:hhi}684\end{equation}685where $N_{v,y}$ is the number of eligible works of year $y$ whose primary686source is $v$ \citep{hirschman1964paternity}; works without a source are687excluded from the denominator, and the number of distinct sources and the688largest single share are reported with the index. Because arXiv is a single689OpenAlex source, growth in preprints mechanically raises $\mathrm{HHI}_y$ even690when the journal and conference landscape becomes more dispersed; this is the691reason the protocol's H5 predicts a stable or falling HHI only ``because of692preprint growth'' with the preprint source treated separately, and the tables693report the index with and without the preprint type.694695\subsection{Collaboration, countries and institutions}696697Team size is summarised by the mean and median number of authors per work and698by the shares of single-author works and of works with at least five or ten699authors. Two counting conventions are used for countries and institutions,700because they answer different questions \citep{waltman2016review}. Under full701counting a work contributes one unit to every country among its authors'702affiliations; under fractional counting it contributes $1/|K(w)|$ to each of703its $|K(w)|$ distinct countries, so that the fractional totals sum to the704number of works with at least one country. The same pair of conventions is705applied to institutions, with the fraction taken over the distinct institutions706of the work. The international collaboration share of year $y$ is707\begin{equation}708 \mathrm{ICS}_y \;=\; \frac{|\{w : y(w)=y,\ |K(w)| \ge 2\}|}{|\{w : y(w)=y,\ |K(w)| \ge 1\}|},709\end{equation}710that is, among works with at least one resolved country, the share with authors711from two or more countries; works without affiliation data are excluded from712the denominator and their share is reported, because affiliation completeness713in OpenAlex varies by source and year and a change in completeness would714otherwise masquerade as a change in collaboration. The industry share is the715share of works with at least one affiliation of OpenAlex institution type716\textit{company} among works with at least one typed affiliation. Country-pair717and institution-level tables apply minimum-support thresholds (fifty joint718works for a country pair, two hundred works for an institution within a period)719that keep the released tables to the robustly estimated part of the720distribution; these thresholds are reporting choices and are stated in the721table notes.722723\subsection{Diversity indices}724\label{sec:m-diversity}725726Interdisciplinarity is measured on the distribution of a work's references, or727of a category's citations, over the categories of the ontology. Let728$p = (p_1, \dots, p_K)$ be such a distribution and $\delta_{ij} \in [0,1]$ a729dissimilarity between categories $i$ and $j$. The Rao--Stirling index730\citep{rao1982diversity, stirling2007diversity}731\begin{equation}732 \Delta_{\mathrm{RS}}(p) \;=\; \sum_{i \ne j} p_i\, p_j\, \delta_{ij}733 \label{eq:rao-stirling}734\end{equation}735is the expected dissimilarity between two categories drawn at random from $p$;736it is zero when all mass sits on one category and increases with variety (the737number of categories present), balance (the evenness of $p$) and disparity (the738dissimilarity of the categories involved), the three components that739\citeauthor{stirling2007diversity} argues any diversity measure should respond740to. Its use in scientometrics follows \citet{rafols2010diversity}. Its known741weakness is that it saturates: for very even distributions over many742categories it approaches the mean dissimilarity and no longer discriminates743\citep{zhang2016diversity}. The Leinster--Cobbold family744\citep{leinster2012diversity} repairs this by defining, for a similarity matrix745$Z = (z_{ij})$ with $z_{ij} = 1 - \delta_{ij}$ and an order $q \ge 0$,746\begin{equation}747 {}^{q}D^{Z}(p) \;=\; \Bigl( \sum_{i : p_i > 0} p_i\, (Zp)_i^{\,q-1} \Bigr)^{1/(1-q)},748 \qquad (Zp)_i = \sum_j z_{ij}\, p_j ,749 \label{eq:leinster-cobbold}750\end{equation}751with the limit ${}^{1}D^{Z}(p) = \prod_i (Zp)_i^{-p_i}$ at $q = 1$. The quantity752$(Zp)_i$ is the ``ordinariness'' of category $i$ under $p$: how much of the753distribution is similar to $i$. The index is an effective number of754categories---it equals $K$ for the uniform distribution over $K$ mutually755dissimilar categories---and the order $q$ sets the weight given to rare756categories (large $q$ counts only the dominant ones). Following757\citet{zhang2016diversity} the manuscript reports $q = 2$, which has the758closed form ${}^{2}D^{Z}(p) = 1 / \sum_{i,j} p_i z_{ij} p_j = 1/(1 - \Delta_{\mathrm{RS}}(p))$759when $z_{ii} = 1$, so that the two families are monotone transforms of each760other at this order and differ only in scale and in their behaviour at the761saturation end. The dissimilarity $\delta_{ij}$ between categories is one762minus the cosine similarity of the category centroids of763Section~\ref{sec:m-semantic} in the baseline period, so that the disparity764component is estimated from the corpus rather than imposed. The current765pipeline computes the category flow matrices from which $p$ is formed766(Section~\ref{sec:m-networks}) and the centroid similarities, but the two767diversity indices are not yet produced by a script; they are defined here768because the protocol commits to them, and their values in Part IX are769\pending{Rao--Stirling and Leinster--Cobbold indices per category and period, not yet computed}770until the computation is added and audited.771772