siddharthmb/2026.TA.overlay_huge_strict_refusal_union_graphs
2026.TA.overlay_huge_strict_refusal_union_graphs Base-vs-adapter circuit-tracing comparison overlay graphs for the strict_refusal run. Each overlay graph is one full-replacement attribution graph over a single prompt in which MLP(x) = T_base(x) + T_adapter(x) + Err: base GemmaScope transcoder features (hexagon ⬢), sparse transcoder-adapter features (circle ●) and real reconstruction-error nodes (triangle ▲) live in the same graph, so the two models' circuits can be read… See the full description on the dataset page: https://huggingface.co/datasets/siddharthmb/2026.TA.overlay_huge_strict_refusal_union_graphs.
2026.TA.overlayhugestrictrefusalunion_graphs
Base-vs-adapter circuit-tracing comparison overlay graphs for the strict_refusal run. Each overlay graph is one full-replacement attribution graph over a single prompt in which MLP(x) = T_base(x) + T_adapter(x) + Err: base GemmaScope transcoder features (hexagon ⬢), sparse transcoder-adapter features (circle ●) and real reconstruction-error nodes (triangle ▲) live in the same graph, so the two models' circuits can be read position-by-position on identical tokens.
What this run is
Union-target base rebuild of the huge (tc16384) adapter's refusal overlays (63 prompts), native chat template — the large-adapter counterpart to 2026.TA.tc8192_strict_refusal_union_graphs.
Instead of changing the prompt to make the base side legible (the plain rebuild), this keeps the chat template and changes which logit the base side is attributed toward: --base_attribution_targets union_adapter_top (default since commit bf7c657) = base's salient top logits union the adapter's top token, read from the adapter graph. So every base graph carries the adapter's refusal-opener node (e.g. harm_116: base Output "I" p = 0.010 alongside the echo logits) — a "why does base not say the refusal opener?" circuit, position-aligned to the adapter's refusal circuit on the identical forward pass. Base p(adapter-top) is small (median ~0.005, max 0.092): a low-probability why-not contrast, not base refusing. The base completion under chat is still special-token gibberish; that is expected here.
The adapter graphs/continuations are byte-identical to the older chat run (2026.TA.overlay_huge_strict_refusal_graphs) and reproduce the huge-CHAT jailbreak set exactly (★ harm_031/034/035/094/187).
When to use which: plain (2026.TA.overlay_huge_strict_refusal_plain_graphs) = "can base parse the prompt, and does it refuse?"; union-chat (this repo) = "in the adapter's training template, what drives the refusal token vs base's non-refusal?"
Findings / write-up (repo): my_notes/08-10-26/base_attribution_target_union.md. Serve script: sh/visualize graphs/visualize 08-10-26 hf.sh (#7, port 8059).
Serve it
uv run --extra viz python -m analysis.attribution.serve_comparison_graphs \
--graph_file_dir siddharthmb/2026.TA.overlay_huge_strict_refusal_union_graphs:overlay --port 8059Swap :overlay for :overlay_compact for the pruned view. The snapshot is downloaded and cached on first run (HF_HOME); node-click feature examples stream from the feature collections linked below.
Contents
The one-sided base/ and adapter/ graph dirs from the same run are not uploaded (the overlay graphs contain both sides); they remain on the cluster at /nlp/scr/siddharth/transcoder-adapters/base_adapter_comparisons/overlay_huge_strict_refusal_union and are re-derivable with the reproduction command below.
Provenance
Feature collections (dataset-side artifacts baked into the graphs):
- `siddharthmb/2026.TA.features_2026.TA.gemma2_2b_huge_tc16384_decb_l1w0.0003_norm_sch_tarbb_lb2_hff15229f5fe1`
- `siddharthmb/2026.TA.features_gemma-2-2b_gemmascope_width_16k_average_l0_76_ms100000_ml1024_tk1_hf83e96d574d2`
Reproduce
Exact build invocation (from the run's Slurm log):
uv run --extra viz python -m analysis.attribution.run_base_adapter_comparison --adapter_checkpoint siddharthmb/2026.TA.gemma2_2b_huge_tc16384_decb_l1w0.0003_norm_sch_tarbb_lb2.0_ln1.0_dr500000_lr2e-04_bs8_sl --base_model google/gemma-2-2b --gemmascope_width width_16k --gemmascope_l0 average_l0_76 --base_feature_data_path siddharthmb/2026.TA.features_gemma-2-2b_gemmascope_width_16k_average_l0_76_ms100000_ml1024_tk1_hf83e96d574d2 --feature_data_path siddharthmb/2026.TA.features_2026.TA.gemma2_2b_huge_tc16384_decb_l1w0.0003_norm_sch_tarbb_lb2_hff15229f5fe1 --prompts /nlp/u/siddharth/transcoder-adapters/experiments/interesting_queries/results/strict_compliance_refusal/selected_prompts --prompt_format chat --max_feature_nodes 2048 --max_n_logits 10 --run_name strict_refusal --output_dir /nlp/scr/siddharth/transcoder-adapters/base_adapter_comparisons/overlay_huge_strict_refusal_unionBuild log on the cluster: /juice2/u/siddharth/transcoder-adapters/slurm-16748896.out
Re-star the jailbreak/compliance prompts in the dropdown after any rebuild (idempotent, auto-detects the set from the baked adapter continuations):
uv run python -m analysis.evals.classify_adapter_compliance \
--graph_dir /nlp/scr/siddharth/transcoder-adapters/base_adapter_comparisons/overlay_huge_strict_refusal_union/overlay --star --also_star_dir /nlp/scr/siddharth/transcoder-adapters/base_adapter_comparisons/overlay_huge_strict_refusal_union/overlay_compactUploaded with:
uv run python -m analysis.attribution.upload_comparison_graphs --graph_dir /nlp/scr/siddharth/transcoder-adapters/base_adapter_comparisons/overlay_huge_strict_refusal_unionCluster paths
- graph dir:
/nlp/scr/siddharth/transcoder-adapters/base_adapter_comparisons/overlay_huge_strict_refusal_union - manifest:
/nlp/scr/siddharth/transcoder-adapters/base_adapter_comparisons/overlay_huge_strict_refusal_union/comparison-manifest.json(also in this repo) - build log:
/juice2/u/siddharth/transcoder-adapters/slurm-16748896.out
