% B_fingerprint_robustness.tex -- Appendix B (MEDIUM priority).
% Numbers: analysis/fp/fp_ci.md / fp_ci.json (Tables B1, B2, B4, B5), bench/scripts/paper/out/fp_summary.json (Table B3),
% bench/scripts/paper/out/lang_robustness.json (Table B6), analysis/fp/anchor_diag.md / .json (Tables B7, B8, Fig. 4);
% all tables generated by tables/make_tabB.py. Intervals here are bootstrap 95 % intervals; the body quotes none.
\section{Fingerprint robustness}
\label{app:fp}

\begin{figure*}[t]
  \centering
  \IfFileExists{../figures/fig6.pdf}{\includegraphics[width=\textwidth]{../figures/fig6.pdf}}{\fbox{\parbox[c][5cm][c]{0.97\textwidth}{\centering Placeholder for Fig.~6 (\code{figures/fig6.pdf}).}}}
  \caption{Jensen--Shannon distance to the pooled teacher reference on four rulers (columns) and two pools (rows) against \vTwelve epochs: dense line (circles; open circle at epoch 1 = \vThirteen), post-trained MoE (squares), bare MoE (triangles), \QwenNext (diamond); the split-half sampling floors (0.0004--0.0045, noted in each Pro panel) lie one to two decades below every plotted point. On \SWEPro every ruler falls at the first epoch and then flattens; on \SWEVerified the Bash and thinking-position rulers fall while tool mix and bigrams move away from the teacher, the task-sensitive composition layer.}
  \label{fig:rulers}
\end{figure*}
\begin{figure}[t]
  \centering
  \IfFileExists{../figures/fig4.pdf}{\includegraphics[width=\columnwidth]{../figures/fig4.pdf}}{\fbox{\parbox[c][4cm][c]{0.95\columnwidth}{\centering Placeholder for plan Fig.~4 (\code{figures/fig4.pdf}).}}}
  \caption{Same-task anchor: 88 \vTwelve\ training tasks replayed three times by \nTwoSeven and \sTwoFiveSix, per-task medians. (a) Distribution over tasks of read-set Jaccard to the teacher's read set (median 0.44 to 0.60; \sTwoFiveSix\ closer on 66 of 88 tasks); dashed: negative controls, another task's teacher set (0.001) and a same-repository different-task set (0.03). The student reads fewer files (median 11 to 7; teacher 6) at higher precision (0.50 to 0.80) and similar recall (0.86 to 0.80). (b) Per-task change in solve fraction against change in read-set Jaccard (y jittered): imitation gain does not track solve gain (Spearman $\rho=-0.12$; mean solve 55.3 to 61.6\,\%).}
  \label{fig:anchor}
\end{figure}

\paragraph{Setup.}
Every distance in this appendix is the trajectory-weighted divergence between an arm's step distribution and the teacher's high-precision population (12,257 trajectories) over the four rulers of \S\ref{sec:inherit}: tool mix (11 buckets), tool bigrams, Bash command heads and thinking-position deciles, with the composite the mean of mix and bigram.
Uncertainty is a trajectory-level bootstrap ($B=1000$, seed 20260902; percentile 2.5/97.5, teacher fixed), reported as a bootstrap 95\,\% interval; the point estimates agree with \code{fp\_summary.json} to $10^{-15}$.

\begin{figure*}[t]
  \centering
  \IfFileExists{../figures/fig10.pdf}{\includegraphics[width=\textwidth]{../figures/fig10.pdf}}{\fbox{\parbox[c][4cm][c]{0.95\textwidth}{\centering Placeholder (\code{figures/fig10.pdf}).}}}
  \caption{Change in \JS distance to the teacher between arms, $d(B)-d(A)$, in units of $10^{-3}$, with trajectory-level bootstrap 95\,\% intervals (teacher fixed; Table~\ref{tab:B1}); filled markers = interval excludes zero. Every native$\to$\vTwelve pair moves Bash head-words toward the teacher in both pools; the second and third dense epochs and the \vThirteen swap are indistinguishable from zero on every ruler; on \SWEVerified tool mix and bigrams move away from the teacher.}
  \label{fig:forest}
\end{figure*}
\paragraph{Consecutive-arm differences.}
Figure~\ref{fig:forest} draws the intervals; 
Table~\ref{tab:B1} gives the change in \JS distance between arms with its bootstrap interval.
On Pro, \nTwoSeven$\to$\sOneTwoEight is above noise on Bash ($-0.133$), bigram ($-0.010$), thinking position ($-0.008$) and the composite ($-0.006$) but not on mix; \sOneTwoEight$\to$\sTwoFiveSix moves only Bash ($-0.016$, about seven times the same-weights floor); \sTwoFiveSix$\to$\sThreeEightOne moves nothing.
``One epoch does most of it'' is therefore a difference statement, and the residual second-epoch effect exists only in the Bash vocabulary.
On Verified the mix and bigram rulers move away from the teacher for every \vTwelve checkpoint while Bash converges.

\paragraph{Alternative distances.}
Table~\ref{tab:B2} repeats the epoch ordering under Hellinger and total-variation distance.
Hellinger preserves every \JS ordering and the habit/strategy split on Verified; total variation does not preserve the Pro tool-mix ordering, because the SFT arms overshoot the teacher's Bash share (Table~\ref{tab:B3}: teacher 50.7\,\%, \nTwoSeven 54.5\,\%, \sOneTwoEight/\sTwoFiveSix/\sThreeEightOne 62.3 / 60.1 / 61.8\,\%), which a linear distance registers while \JS is dominated by the collapsed small buckets.
Tool-mix ``convergence'' is thus ruler-dependent; Bash vocabulary and thinking position are not.

\paragraph{Noise floors.}
Table~\ref{tab:B4} gives the two references against which the body quotes ``above noise'': the same-weights repeat samples (composite 0.0008 / 0.0003, Bash 0.0021 / 0.0011 at $n\approx730$) and split-half distances within one arm (composite $\approx$0.0008, Bash 0.004--0.005; \aQ Bash 0.015 from its heterogeneous vocabulary).
The sampling floor at student sample size is therefore about 0.001 on the composite and 0.002--0.005 on Bash; the ``teacher-internal 0.002--0.003'' figure is the distance between teacher sub-populations, not sampling noise.

\paragraph{Pool confound.}
% Source: fp_ci.md section a, rows s256_t100|train100 (composite 0.0090) and n27_t100|train100 (0.0493) vs the Pro rows.
Distances are comparable only within a pool: on the 88-task anchor \sTwoFiveSix's composite is 0.0090 against 0.0215 on Pro, and \nTwoSeven's 0.0493 against 0.0285; the pool effect is larger than the residual dose effect and is not additive.

\begin{figure*}[t]
  \centering
  \IfFileExists{../figures/fig12.pdf}{\includegraphics[width=\textwidth]{../figures/fig12.pdf}}{\fbox{\parbox[c][4cm][c]{0.95\textwidth}{\centering Placeholder (\code{figures/fig12.pdf}).}}}
  \caption{Mean thinking characters per assistant step on the step after a tool error (filled) and on all other steps (tint), with their ratio, on \SWEPro (a) and \SWEVerified (b). The teacher and every fine-tuned arm think about half as much after an error (ratios 0.34 and 0.47--0.61); the native models think as much or more (1.04, 1.76 and 0.98 on Pro).}
  \label{fig:posterr}
\end{figure*}
\paragraph{Post-error thinking.}
Figure~\ref{fig:posterr} draws the two levels per arm; 
Table~\ref{tab:B5} reports absolute thinking characters per step after a tool error and on all other steps.
The teacher thinks less after an error than on ordinary steps (248 vs 726 characters, ratio 0.34); \nTwoSeven does not (373 vs 359, 1.04); after SFT the student thinks more after an error in absolute terms (\sTwoFiveSix 580) and its ratio falls to 0.48 because ordinary-step thinking triples (1,199).
What transfers is the teacher's pattern, not a reduction in post-error thinking; the paper reports both numbers.

\begin{figure*}[t]
  \centering
  \IfFileExists{../figures/fig9.pdf}{\includegraphics[width=\textwidth]{../figures/fig9.pdf}}{\fbox{\parbox[c][4cm][c]{0.95\textwidth}{\centering Placeholder for Fig.~9 (\code{figures/fig9.pdf}).}}}
  \caption{Within-language replication on \SWEPro: Bash head-word (top) and composite (bottom) \JS distance to the teacher inside the Python, Go and JS/TS strata against \vTwelve epochs, and the Python stratum measured against a Python-only teacher reference (right column). Bash vocabulary converges in every stratum; the composite is flat in Python only against the pooled reference and falls against the Python-only one, the pool effect of \S\ref{sec:inherit}.}
  \label{fig:lang}
\end{figure*}
\paragraph{Language strata.}
Figure~\ref{fig:lang} draws the strata; 
Table~\ref{tab:B6} restricts the Pro distance to one language at a time and, for Python, adds a Python-only teacher reference ($n=574$).
Bash-vocabulary convergence holds inside every language (\nTwoSeven$\to$\sTwoFiveSix: Python 0.341$\to$0.133, Go 0.217$\to$0.066, JS/TS 0.237$\to$0.105); with the Python reference the composite falls on the Pro Python slice (0.0267$\to$0.0195$\to$0.0178 for \nTwoSeven, \sTwoFiveSix, \sThreeEightOne) but rises on Verified (0.0369$\to$0.0476$\to$0.0465), the strategy-layer divergence noted in \S\ref{sec:inherit}.

\paragraph{Anchor diagnostics.}
Tables~\ref{tab:B7} and \ref{tab:B8} document the 88-task anchor of Figure~\ref{fig:anchor}.
Both jobs ran exactly three rollouts per task (263 and 296 parsed trajectories: one void \nTwoSeven trial; the \sTwoFiveSix job also covers the 12 tasks later removed by the oracle golden-patch filter).
The student reads fewer files (median 11$\to$7; teacher 6) at higher precision against the teacher's read set (0.50$\to$0.80, 75:8 tasks) and similar recall (0.86$\to$0.80, 18:30, n.s.), so its read-set Jaccard rises (0.44$\to$0.60, 66:15) while the negative controls stay at 0.001 (another task's teacher set) and 0.03 (same repository, different task; 45:38, $p=0.51$); the gain survives on the 15 tasks where \sTwoFiveSix reads as many or more files ($+0.054$, 8:3).
Table~\ref{tab:B8} shows that the two published solve-rate $p$-values (0.073 and 0.099) differ only in whether a void trial counts as unsolved, a gap of one task; the interval is a plain task bootstrap, not a stratified estimate.
Per-task solve gain does not track imitation gain (Spearman $\rho=-0.12$, Figure~\ref{fig:anchor}b).

\begin{figure*}[t]
  \centering
  \IfFileExists{../figures/fig11.pdf}{\includegraphics[width=\textwidth]{../figures/fig11.pdf}}{\fbox{\parbox[c][4cm][c]{0.95\textwidth}{\centering Placeholder (\code{figures/fig11.pdf}).}}}
  \caption{Share of thinking characters per decile of the trajectory, the distribution behind the thinking-position ruler. \textbf{(a)}~\SWEPro, dense line; \textbf{(b)}~\SWEPro, MoE lines; \textbf{(c)}~\SWEVerified, dense line. Native models think flat across the trajectory (the bare base loads 21\,\% into the last decile); every fine-tuned arm and \QwenNext reproduce the teacher's early hump at deciles 2--4; on Verified the fine-tuned curves flatten toward uniform.}
  \label{fig:thinkpos}
\end{figure*}
\paragraph{Thinking-position profiles.}
Figure~\ref{fig:thinkpos} draws the decile profiles behind the thinking-position ruler: the native models spread thinking evenly or load it into the last decile, whereas the fine-tuned arms and \QwenNext reproduce the teacher's early hump on Pro; on Verified the fine-tuned profiles flatten, which is why the thinking-position distance moves less there.

\input{tables/tabB1_diffs}
\input{tables/tabB2_ordering}
\input{tables/tabB3_bashshare}
\input{tables/tabB4_floors}
\input{tables/tabB5_posterr}
\input{tables/tabB6_lang}
\input{tables/tabB7_anchor}
\input{tables/tabB8_anchor_rules}

\clearpage
