\section{Detailed Experimental Setup}
\label{appendix:experimental-setup}

This appendix provides a comprehensive description of the experimental configurations used for both Track A (narrative similarity classification) and Track B (narrative embedding generation).

\subsection{Reproducibility Checklist}
\begin{itemize}
    \item \textbf{Random seed:} 42 for model training and selection.
    \item \textbf{LLM extraction API/model:} OpenAI Batch API with \texttt{o3-mini} for Track B narrative element extraction.
    \item \textbf{Prompt location:} Full extraction prompt is provided in Appendix~\ref{appendix:prompt-templates} (Table~\ref{tab:prompt-template-v2}).
    \item \textbf{Inference settings (LLM extraction):} temperature $=0.3$, max completion tokens $=2000$, and JSON-only output format.
    \item \textbf{Inference settings (embedding submission):} fixed fusion weights
    $(0.5, 0.1, 0.2, 0.2)$ for (full, theme, plot, outcome), followed by L2 normalization.
    \item \textbf{Hardware:} single NVIDIA GeForce RTX 3090 (24 GB VRAM), detailed in Appendix~\ref{appendix:computational-resources}.
\end{itemize}

\subsection{Data}

All experiments use the officially provided SemEval-2026 Task 4 datasets. The development set contains 200 labeled triples, each consisting of an anchor story, two candidate stories, and a binary label indicating which candidate is narratively closer to the anchor. The test set comprises 400 triples for Track A and 849 individual stories for Track B. Labels for the test set are withheld until the conclusion of the shared task.

For Track A, we construct two data variants from the development set:
\begin{itemize}
    \item \textbf{Pseudonymized}: Stories where person names, organizations, and locations are replaced with standardized references to reduce surface-level matching bias.
    \item \textbf{Raw}: Original story texts without pseudonymization.
\end{itemize}
Both variants use the same 200 development triples for training and evaluation.

For Track B, narrative element extraction is performed on the Track B story corpus using the OpenAI Batch API (see Appendix~\ref{appendix:prompt-templates}). The extracted narrative components are then used to construct multi-view training triplets by matching anchor texts from the Track A development triples with their corresponding extracted theme, plot, and outcome representations.

\subsection{Track A: Single-View Contrastive Learning}

Table~\ref{tab:track-a-config} summarizes the hyperparameter configuration for Track A.

\begin{table}[t]
\centering
\small
\begin{tabularx}{\linewidth}{>{\raggedright\arraybackslash}X l}
\toprule
\textbf{Parameter} & \textbf{Value} \\
\midrule
Base model & \texttt{all-mpnet-base-v2} \\
Embedding dimension & 768 \\
Maximum sequence length & 512 tokens \\
Training epochs & 5 \\
Batch size & 16 \\
Learning rate & $2 \times 10^{-5}$ \\
Weight decay & 0.01 \\
Warmup ratio & 0.1 (linear schedule) \\
Triplet margin ($m$) & 0.3 \\
Layer freezing & 40\% (bottom layers + embeddings) \\
Mixed precision & AMP with GradScaler \\
Random seed & 42 \\
\bottomrule
\end{tabularx}
\caption{Hyperparameter configuration for Track A.}
\label{tab:track-a-config}
\end{table}

Training follows a standard triplet contrastive learning procedure. At each epoch, the full set of training triplets is shuffled and processed in mini-batches. Each triplet is tokenized and encoded in a single forward pass, producing anchor, positive, and negative embeddings. The triplet margin loss is computed using cosine distance, and gradients are scaled via automatic mixed precision. A linear warmup schedule is applied over the first 10\% of total training steps, followed by linear decay.
After each epoch, development accuracy is evaluated by comparing pairwise cosine similarities. The best-performing checkpoint is saved automatically.

\begin{table}[t]
\centering
\small
\renewcommand{\arraystretch}{1.15}
\setlength{\tabcolsep}{5pt}
\begin{tabular}{lcc}
\hline
\textbf{Model} & \textbf{Raw Data} & \textbf{Pseudonymized Data} \\ \hline
all-mpnet-base-v2 & 0.6550 & \textbf{0.6700} \\
para-mul-mpnet-v2 & 0.6400 & \textbf{0.6700} \\
all-MiniLM-L6-v2 & 0.6350 & \textbf{0.6500} \\
LaBSE & \textbf{0.6450} & 0.6350 \\ \hline
\end{tabular}
\caption{Performance comparison of transformer models on Track A (Dev set). Bold indicates the best overall score.}
\label{tab:track_a_dev}
\end{table}

\subsection{Track B: Multi-View Contrastive Learning}

Table~\ref{tab:track-b-config} summarizes the hyperparameter configuration for Track B.

\begin{table}[h]
\centering
\small
\begin{tabular}{ll}
\toprule
\textbf{Parameter} & \textbf{Value} \\
\midrule
Base model & \texttt{all-mpnet-base-v2} \\
Embedding dimension & 768 \\
Projection head hidden dim & 512 \\
Maximum sequence length & 512 tokens \\
Training epochs & 15 \\
Batch size & 32 \\
Learning rate & $2 \times 10^{-5}$ \\
Weight decay & $1 \times 10^{-5}$ \\
Contrastive temperature ($\tau$) & 0.07 \\
Alignment loss weight ($\lambda$) & 0.5 \\
Gradient clipping (max norm) & 1.0 \\
Samples per epoch & 32 \\
Evaluation frequency & Every epoch \\
\bottomrule
\end{tabular}
\caption{Hyperparameter configuration for Track B.}
\label{tab:track-b-config}
\end{table}

The multi-view encoder shares a single transformer backbone across three narrative views. Each view has a dedicated two-layer projection head (768 $\rightarrow$ 512 $\rightarrow$ 768). Training alternates between computing per-view contrastive losses and self-supervised view alignment losses. The total loss is the sum of all six terms (three contrastive + three alignment).

At inference, four embeddings are computed per story (full text, theme, plot, outcome) and fused using fixed weights:
\begin{equation*}
\mathbf{e}_{\text{final}} = 0.5 \cdot \mathbf{e}_{\text{full}} + 0.1 \cdot \mathbf{e}_{\text{theme}} + 0.2 \cdot \mathbf{e}_{\text{plot}} + 0.2 \cdot \mathbf{e}_{\text{outcome}}
\end{equation*}
These fusion weights are selected via manual tuning on the development set rather than analytical optimization. A comparative ablation of alternative weight settings is reported in Section~\ref{sec:results} (Table~\ref{tab:track_b_fusion_ablation}).
The fused embeddings are L2-normalized before submission.

\begin{table}[t]
\centering
\small
\renewcommand{\arraystretch}{1.15}
\setlength{\tabcolsep}{5pt}
\begin{tabular}{llc}
\hline
\textbf{Embedding Model} & \textbf{LLM Extractor} & \textbf{Score} \\ \hline
all-mpnet-base-v2 & o3-mini & 0.6750 \\
all-mpnet-base-v2 & gpt-4.1 & \textbf{0.7250} \\
all-mpnet-base-v2 & gpt-4o-mini & 0.7000 \\
all-MiniLM-L6-v2 & o3-mini & 0.5750 \\
all-MiniLM-L6-v2 & gpt-4.1 & 0.6000 \\
all-MiniLM-L6-v2 & gpt-4o-mini & 0.6000 \\
LaBSE & o3-mini & 0.6250 \\
LaBSE & gpt-4.1 & 0.6500 \\
LaBSE & gpt-4o-mini & 0.6500 \\
para-mul-mpnet-v2 & o3-mini & 0.6750 \\
para-mul-mpnet-v2 & gpt-4.1 & 0.5750 \\
para-mul-mpnet-v2 & gpt-4o-mini & 0.6000 \\ \hline
\end{tabular}
\caption{Track B results across different LLM-based schema extractors and embedding models on Track B (Dev set). Bold indicates the best overall score.}
\label{tab:track_b_dev}
\end{table}

\subsection{Model Selection Across Backbones}

To validate our choice of backbone encoder, we conducted experiments with four sentence transformer models on both tracks under identical hyperparameter settings:

\begin{table}[t]
\centering
\small
\renewcommand{\arraystretch}{1.3} 
\begin{tabularx}{\linewidth}{>{\raggedright\arraybackslash}X}
\toprule
\textbf{Model ID / Backbone} \\
\midrule
\url{sentence-transformers/all-mpnet-base-v2} \\
\url{sentence-transformers/all-MiniLM-L6-v2} \\
\url{sentence-transformers/LaBSE} \\
\url{sentence-transformers/paraphrase-multilingual-mpnet-base-v2} \\
\bottomrule
\end{tabularx}
\caption{Backbone models evaluated for both tracks.}
\label{tab:backbone-models}
\end{table}

All backbone experiments use the same hyperparameters, data splits, and random seeds. The final submission for both tracks uses \texttt{all-mpnet-base-v2}, selected based on development set performance.
