Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
572 commits
Select commit Hold shift + click to select a range
5f14011
Tune defaults (n_batches=1000, n_gpus=8 for attributions), fix stale …
claude-spd1 Feb 10, 2026
9388cb2
Validate wandb_path early in postprocess() before submitting jobs
claude-spd1 Feb 10, 2026
3db2221
Handle Fire parsing config_json as dict instead of str
claude-spd1 Feb 10, 2026
7338da7
Merge remote-tracking branch 'origin/dev' into feature/autointerp-imp…
claude-spd1 Feb 10, 2026
f0e817c
Add migration for unique_per_batch_per_token → per_batch_per_position…
claude-spd1 Feb 10, 2026
3283689
Harvest defaults: batch_size 128, n_batches 2000 (OOM at 256)
claude-spd1 Feb 10, 2026
b4f2c21
Use ModelAdapter modules in AttributionHarvester instead of hardcoded…
claude-spd1 Feb 10, 2026
0471152
Always resolve unembed module in ModelAdapter
claude-spd1 Feb 10, 2026
66245ec
Attribution default batch_size 128 (OOM at 256)
claude-spd1 Feb 10, 2026
6dbd97d
Reify ArchConfig per model class with explicit path patterns
ocg-goodfire Feb 10, 2026
72519a2
Bump harvest merge mem to 128G (OOM at 64G for large models)
claude-spd1 Feb 10, 2026
b6995b9
Fix GPT2 config patterns and update model adapter tests
ocg-goodfire Feb 10, 2026
04791aa
Merge remote-tracking branch 'origin/dev' into feature/autointerp-imp…
claude-spd1 Feb 10, 2026
80dd6c9
Use exclude_none=True in config JSON serialization for Fire compatibi…
claude-spd1 Feb 10, 2026
47277b8
Default reasoning_effort to None in CompactSkepticalConfig
claude-spd1 Feb 10, 2026
502d3e6
Handle HF GPT-2 layer paths in autointerp prompt formatting
claude-spd1 Feb 10, 2026
c0059d2
Add design doc for abstract transformer topology
claude-spd1 Feb 10, 2026
9fe6e54
Add TransformerTopology: unified abstract transformer structure
claude-spd1 Feb 10, 2026
da58d2a
Replace ModelAdapter with TransformerTopology
claude-spd1 Feb 10, 2026
a99eab5
Migrate consumers to TransformerTopology
claude-spd1 Feb 10, 2026
8203c86
Delete ModelAdapter, migrate all consumers to TransformerTopology
claude-spd1 Feb 10, 2026
06f640f
Merge main to dev
danbraunai-goodfire Feb 10, 2026
0236300
Fix stale CLAUDE.md references to deleted ModelAdapter
claude-spd1 Feb 10, 2026
a76f485
Assert exactly one integer segment in block index extraction
claude-spd1 Feb 10, 2026
834861e
Remove role from LayerInfo, make it construction-only
claude-spd1 Feb 10, 2026
0c8fe5d
WIP: PathSchema + CanonicalWeight types
claude-spd1 Feb 10, 2026
8fc9ae3
WIP: PathSchema subclasses, describe moved to frontend
claude-spd1 Feb 10, 2026
1c911a4
WIP: Node.layer is now CanonicalWeight, canonical_to_str, translate a…
claude-spd1 Feb 10, 2026
90b3911
WIP: CanonicalWeight as ABC with canonical_str method
claude-spd1 Feb 10, 2026
e28add6
WIP: Oli's topology tweaks
claude-spd1 Feb 10, 2026
cbdb292
WIP: parse_canonical_str, intervention router translates canonical ->…
claude-spd1 Feb 10, 2026
2cc5e80
WIP: Move parse to CanonicalWeight.parse() static method
claude-spd1 Feb 10, 2026
58b9dd4
WIP: Translate canonical <-> concrete at router boundaries (activatio…
claude-spd1 Feb 10, 2026
c17e4fd
WIP: Translate canonical <-> concrete in dataset_attributions router
claude-spd1 Feb 10, 2026
ef0e1e3
WIP: Harvest and attributions store canonical keys natively
claude-spd1 Feb 10, 2026
5f468bb
Revert "WIP: Harvest and attributions store canonical keys natively"
claude-spd1 Feb 10, 2026
aae7073
WIP: Rewrite graphLayout.ts for canonical addresses, no ModelInfo dep…
claude-spd1 Feb 10, 2026
803f37f
WIP: Remove ModelInfo from frontend — canonical addresses are self-de…
claude-spd1 Feb 10, 2026
94b5dd2
WIP: Fix remaining type errors — add get_unembed_weight, remove Model…
claude-spd1 Feb 10, 2026
ed2bd4f
WIP: Add missing POST /api/prompts/custom endpoint
claude-spd1 Feb 10, 2026
7897544
WIP: App works with s-275c8f21 — resilience to missing harvest data, …
claude-spd1 Feb 11, 2026
fe423bd
Cleanup: DRY topology.py, replace try/except with None-checks in comp…
claude-spd1 Feb 11, 2026
ca63700
Add [perf] logging throughout graph computation codepath
claude-spd1 Feb 11, 2026
85b2366
Polish: display escaping, strip padding at source, reduce prefetch pa…
claude-spd1 Feb 11, 2026
56e7f06
Rename canonical embedding address from "wte" to "embed"
claude-spd1 Feb 11, 2026
12a196f
Autointerp: shared RateLimiter, app cleanup
claude-spd1 Feb 11, 2026
76baa29
Strip padding sentinels in ActivationExample.__post_init__
claude-spd1 Feb 11, 2026
8ed3ba5
Rename padding strip to _strip_legacy_padding for clarity
claude-spd1 Feb 11, 2026
af15a6a
Introduce Repository pattern: HarvestRepo, InterpRepo, AttributionRepo
claude-spd1 Feb 11, 2026
615d39c
Migrate harvest component data from JSONL to SQLite
claude-spd1 Feb 11, 2026
d6669a6
Refactor autointerp LLM API: fix rate limiter, unify client interface
claude-spd1 Feb 11, 2026
ff8db55
Migrate autointerp persistence from JSONL to SQLite
claude-spd1 Feb 11, 2026
b8ddb9d
Fix migration scripts for old data formats
claude-spd1 Feb 11, 2026
d73b0e8
Delete harvest/loaders.py — all consumers use repos
claude-spd1 Feb 11, 2026
bf5ec9e
Store raw logits in DB instead of pre-computed output probs
claude-spd1 Feb 11, 2026
c34672c
Fix type errors and lint from repo migration + logits refactor
claude-spd1 Feb 11, 2026
54639c6
wip: Delete unused model adapter tests
claude-spd1 Feb 11, 2026
d92f795
Make spd-postprocess idempotent: skip steps with existing outputs
claude-spd1 Feb 11, 2026
043274c
Simplify postprocess: always run all steps, data accumulates
claude-spd1 Feb 11, 2026
9f099bf
Add sub-run versioning to harvest and dataset attributions
claude-spd1 Feb 11, 2026
9d26374
Move intruder scores from InterpDB to HarvestDB
claude-spd1 Feb 11, 2026
1743c9e
Clean up adapter→topology naming, remove plan/migration files
claude-spd1 Feb 11, 2026
96702c1
Fix test failures: escape_for_display in tokenizer test, target_model…
claude-spd1 Feb 11, 2026
8effcd0
Fix bugs: translate concrete→canonical keys in intruder scores and co…
claude-spd1 Feb 11, 2026
65452e6
Fix topology.py docstring: list all 4 sublayer types, not just "ffn"
claude-spd1 Feb 11, 2026
2cc485d
Split canonical address regex into separate patterns with XOR assertion
claude-spd1 Feb 11, 2026
a961ab7
Split topology into package, narrow public API to TransformerTopology…
claude-spd1 Feb 11, 2026
8bdfee1
Underscore-prefix all internal topology types, remove section comments
claude-spd1 Feb 11, 2026
4c646dd
Rewrite _parse_block_path with strict regex matching
claude-spd1 Feb 11, 2026
d50161b
Extract path schemas into spd/topology/path_schemas.py
claude-spd1 Feb 11, 2026
447b488
Pass harvest sub-run ID to intruder eval, don't rely on "latest"
claude-spd1 Feb 11, 2026
2d4325d
Thread harvest sub-run ID through entire pipeline, no "latest" lookups
claude-spd1 Feb 11, 2026
995b1ab
Pin all pipeline scripts to explicit harvest sub-run ID
claude-spd1 Feb 11, 2026
5de9a83
Open HarvestDB in read-only mode for HarvestRepo
claude-spd1 Feb 11, 2026
e935ee5
Open HarvestDB with immutable=1 for read-only access
claude-spd1 Feb 11, 2026
16c7fde
Persist postprocess dispatch manifest
claude-spd1 Feb 11, 2026
6ab37bf
Move watch script to spd/postprocess/scripts, fix plot script
claude-spd1 Feb 11, 2026
c7e9e6c
Add log scrapers for job progress in postprocess watcher
claude-spd1 Feb 11, 2026
4221236
Move postprocess watcher out of repo to ~/pp-watch
claude-spd1 Feb 11, 2026
042e7a7
Merge remote-tracking branch 'origin/dev' into feature/autointerp-imp…
claude-spd1 Feb 11, 2026
eef543b
Fix harvest OOM on large models, tune defaults
claude-spd1 Feb 11, 2026
f25b83e
Bump harvest merge memory 128G→200G
claude-spd1 Feb 11, 2026
02dfaf1
Merge harvest worker states on GPU to avoid OOM
claude-spd1 Feb 11, 2026
5987aeb
Fix harvest OOM on large models, tune defaults
claude-spd1 Feb 11, 2026
2121d7f
Merge remote-tracking branch 'origin/dev' into fix/harvest-merge-oom
claude-spd1 Feb 11, 2026
4fa5fc5
Fix harvest OOM on large models, tune defaults
claude-spd1 Feb 11, 2026
9baf37b
Split harvest entrypoints, make intruder eval optional
claude-spd1 Feb 11, 2026
ca3cb59
Remove legacy --merge flag from harvest run.py
claude-spd1 Feb 11, 2026
2c8d37f
Delete harvest scripts/run.py, replaced by run_worker.py and run_merg…
claude-spd1 Feb 11, 2026
9d9d36f
Move intruder_eval toggle to HarvestSlurmConfig
claude-spd1 Feb 11, 2026
3aae94e
Update MERGE_OOM.md with resolution
claude-spd1 Feb 11, 2026
7720d26
Simplify autointerp reasoning config, add reasoning to evals, bump ha…
claude-spd1 Feb 11, 2026
efd17cc
fix app db access
claude-spd1 Feb 11, 2026
6289617
Fix harvest merge OOM: stream components instead of accumulating in m…
claude-spd1 Feb 12, 2026
cfa4616
wip: Remove unused LLMClientConfig dataclass and inline parameters
claude-spd1 Feb 12, 2026
d43c92a
Merge branch 'dev' into fix/harvest-merge-oom
claude-spd1 Feb 12, 2026
baa65cb
Replace Python list reservoir with tensor reservoir in Harvester
claude-spd1 Feb 12, 2026
1f9d5a8
wip: Update harvest merge logging for consistency
claude-spd1 Feb 12, 2026
7671995
Collapse HarvesterState into Harvester, delete reservoir_sampler.py
claude-spd1 Feb 12, 2026
8e649fa
Move free functions into Harvester methods, add 30 unit tests
claude-spd1 Feb 12, 2026
2adff6d
Extract ActivationExamplesReservoir into reservoir.py
claude-spd1 Feb 12, 2026
d12e407
Rename harvester fields for clarity
claude-spd1 Feb 12, 2026
134eb70
Extract extract_firing_windows, rename fields for clarity
claude-spd1 Feb 12, 2026
9464355
Use __init__ in Harvester.load instead of __new__
claude-spd1 Feb 12, 2026
53d13a3
Remove default device args — require explicit device everywhere
claude-spd1 Feb 12, 2026
c046526
Replace unsqueeze/expand with einops rearrange/repeat
claude-spd1 Feb 12, 2026
e250a6d
Add readonly mode to InterpDB, use in app read paths
claude-spd1 Feb 12, 2026
8741472
Add Data Sources tab, per-subrun interp.db, eager repo construction
claude-spd1 Feb 12, 2026
c5fd73e
Move intruder scores to harvest in Data Sources, improve harvest jaxt…
claude-spd1 Feb 12, 2026
36d5cf9
Add dataset attributions to Data Sources, consolidate attribution loa…
claude-spd1 Feb 12, 2026
537f554
Remove stale MERGE_OOM.md
claude-spd1 Feb 12, 2026
05b4d03
Clean up component_data router, delete autointerp loaders
claude-spd1 Feb 12, 2026
cb11f5a
Remove __new__ from reservoir, add .create()/.to(), delete autointerp…
claude-spd1 Feb 12, 2026
559816f
Replace hand-rolled rate limiter with aiolimiter token bucket + globa…
claude-spd1 Feb 12, 2026
f6d7948
Uncap rate limiter, let global backoff find equilibrium
claude-spd1 Feb 12, 2026
7ece220
Clean up postprocess system: configs, throttling, validation, signatures
claude-spd1 Feb 12, 2026
f1adbbe
Use openrouter Effort type, default reasoning_effort to low
claude-spd1 Feb 12, 2026
81855c4
Move intruder eval from autointerp to harvest
claude-spd1 Feb 12, 2026
a353a98
Handle Fire parsing JSON args to dicts in eval CLIs
claude-spd1 Feb 12, 2026
594c975
Default intruder eval to off (too expensive for routine use)
claude-spd1 Feb 12, 2026
6898bcb
Restore rate limit to 200/min
claude-spd1 Feb 12, 2026
f8006a0
Make rate limit configurable via max_requests_per_minute
claude-spd1 Feb 12, 2026
af62a98
Bump scorer max_tokens to 5000 to avoid truncation with reasoning
claude-spd1 Feb 12, 2026
5b34803
Default eval reasoning_effort to none (simple classification, no thin…
claude-spd1 Feb 12, 2026
802b551
Pass reasoning_effort through to fuzzing scorer
claude-spd1 Feb 12, 2026
553c22e
Add center-on-peak token alignment and log mean CI plot to activation…
claude-spd1 Feb 12, 2026
7291097
App UI improvements: log Y toggle, global center-on-peak, simplified nav
claude-spd1 Feb 12, 2026
f16c14c
Add wandb link to nav, TODO.md, and registry entry
claude-spd1 Feb 12, 2026
8c8de47
wip: Update canonical runs registry with correct model names
claude-spd1 Feb 12, 2026
e84fd76
Decouple intruder eval from harvest, make it a top-level postprocess …
claude-spd1 Feb 12, 2026
a26e46b
wip: Reorder postprocess config fields to match dependency graph
claude-spd1 Feb 12, 2026
069eb14
wip: Add dry-run flag to postprocess CLI
claude-spd1 Feb 12, 2026
fdb23a3
Add pretrain model info to app and paginate token stats
claude-spd1 Feb 13, 2026
1e6dbf2
Remove duplicate model config from data sources tab
claude-spd1 Feb 13, 2026
4aef8b8
Fix PersistentPGDState source shape for non-sequence (MSE) inputs (#389)
danbraunai-goodfire Feb 13, 2026
1a31713
Merge branch 'main' into dev
danbraunai-goodfire Feb 15, 2026
c0ba235
Merge branch 'main' into dev
danbraunai-goodfire Feb 15, 2026
b433c3c
Fix old call of call_on_rank0_then_broadcast
danbraunai-goodfire Feb 16, 2026
e8c569a
Fix autointerp hanging/JSON errors, DRY concurrent LLM pipeline (#384)
ocg-goodfire Feb 16, 2026
2b72ed6
Merge branch 'main' into dev
danbraunai-goodfire Feb 16, 2026
cef0ef2
Add back the log viewer to the app
danbraunai-goodfire Feb 16, 2026
ac2f4d8
Search for tokens server-side
danbraunai-goodfire Feb 16, 2026
52bfbfa
Use canvas to avoid linear overhead w.r.t number of edges
danbraunai-goodfire Feb 16, 2026
332c2f1
Lazily load the component data. Huge speedups.
danbraunai-goodfire Feb 16, 2026
fbf593c
Increase GLOBAL_EDGE_LIMIMT to 50k and sort on the backend
danbraunai-goodfire Feb 16, 2026
f94ceec
Add adversarial PGD loss to app CI optimization (#383)
danbraunai-goodfire Feb 16, 2026
753f063
Make edge rendering faster and increase limit to 50k
danbraunai-goodfire Feb 16, 2026
642858c
Fix PersistentPGDReconSubsetLoss routing to all layers instead of sub…
danbraunai-goodfire Feb 17, 2026
76cad7c
Fix broken attribution connection between layers
danbraunai-goodfire Feb 17, 2026
a033398
Merge branch 'main' into dev
danbraunai-goodfire Feb 17, 2026
3859e55
Use AVG instead of SUM for persistent PGD source gradient all-reduce …
danbraunai-goodfire Feb 17, 2026
c7d50e2
Support n_warmup_steps in persistent PGD (#397)
danbraunai-goodfire Feb 18, 2026
b3bdeed
Merge branch 'main' into dev
danbraunai-goodfire Feb 18, 2026
cf66851
Merge branch 'main' into dev
danbraunai-goodfire Feb 18, 2026
0b3fd29
Remove deprecated gradient_accumulation_steps from config files
danbraunai-goodfire Feb 18, 2026
5a8b598
Generalize harvest data model + adapters over decomposition methods (…
ocg-goodfire Feb 18, 2026
6dd7162
Simplify autointerp LLM API + generalize evals (#400)
ocg-goodfire Feb 18, 2026
78d3577
Add dual-view autointerp strategy (#401)
ocg-goodfire Feb 18, 2026
d52071c
Add init_spd_checkpoint field back to Config
ocg-goodfire Feb 18, 2026
162ea12
Fix attributions dependency on harvest in postprocess pipeline
ocg-goodfire Feb 18, 2026
49d0b37
Fix fire.Fire JSON parsing in all SLURM worker scripts
ocg-goodfire Feb 18, 2026
1794635
Fix fire.Fire JSON parsing in all SLURM worker scripts
ocg-goodfire Feb 18, 2026
b0bdda4
Rename subrun_id to manifest_id in postprocess manifest
ocg-goodfire Feb 18, 2026
476951a
Move component model to device in SPDHarvestFn
ocg-goodfire Feb 19, 2026
62a2372
Add lr_schedule to PPGD
danbraunai-goodfire Feb 19, 2026
8a2c7a1
Autointerp and harvest fixes from editing branch (#406)
ocg-goodfire Feb 19, 2026
afb6843
Request 1 GPU for autointerp/eval/intruder SLURM jobs
ocg-goodfire Feb 19, 2026
1be2bfc
Fix YAML configs to use current schema and fix misleading error messa…
danbraunai-goodfire Feb 19, 2026
c7b8e73
Add CI and PGD variants of hidden acts recon loss
danbraunai-goodfire Feb 19, 2026
0e829a3
Fix SQLite issues on NFS: remove WAL, separate read/write connections
ocg-goodfire Feb 20, 2026
d39c91d
Fix attributions SLURM passing full config instead of inner config
ocg-goodfire Feb 20, 2026
8ef8faa
Cleanup sum
danbraunai-goodfire Feb 23, 2026
6d576a0
NOT-REVIEWED: Use existing sources for hidden act loss
danbraunai-goodfire Feb 23, 2026
3e3d101
Merge branch 'main' into dev
danbraunai-goodfire Feb 23, 2026
26fc5ee
Fix typo: PGDHiddenActsReconLoss → PPGDHiddenActsReconLoss in 4L config
danbraunai-goodfire Feb 24, 2026
6cf7b03
PPGDEvalLosses to encompass hidden acts and output recon
danbraunai-goodfire Feb 24, 2026
cbbc47d
Inline _accumulate_into_state()
danbraunai-goodfire Feb 24, 2026
15644a4
Run PPGD evals by default if exists in loss metrics
danbraunai-goodfire Feb 24, 2026
5bf47bd
Go back to config-based eval structure
danbraunai-goodfire Feb 24, 2026
a0dde78
Use PersistentPGDReconSubsetEval and PersistentPGDReconEval
danbraunai-goodfire Feb 24, 2026
77a3689
Init different ppgd sources in different ranks for PerBatchPerPosition
danbraunai-goodfire Feb 25, 2026
d067a3a
Update config
danbraunai-goodfire Feb 25, 2026
ece9d3d
Remove unused registry entry
danbraunai-goodfire Feb 25, 2026
0001c6c
Merge dev into feature/hidden-acts-recon-variants
danbraunai-goodfire Feb 25, 2026
00de5ec
Update tests
danbraunai-goodfire Feb 25, 2026
e4b2d28
Add CI and PGD variants of hidden acts recon loss (#409)
danbraunai-goodfire Feb 25, 2026
214772e
Merge remote-tracking branch 'origin/feature/hidden-acts-recon-varian…
danbraunai-goodfire Feb 25, 2026
a8919d4
Update configs to use new pretrain t-9d2b8f02
danbraunai-goodfire Feb 25, 2026
5784de1
Add dataset_seed option to LMTaskConfig (#416)
Antovigo Feb 25, 2026
ac5dc77
Add StochasticAttentionPatternsReconLoss metric (#402)
Antovigo Feb 25, 2026
3da1b4e
Merge branch 'main' into dev
danbraunai-goodfire Feb 26, 2026
9ebb467
Reduce memory usage in clustering
danbraunai-goodfire Feb 27, 2026
c5fc8da
Make clustering happen on cuda
danbraunai-goodfire Feb 27, 2026
8716e32
Update config
danbraunai-goodfire Feb 27, 2026
58a36b1
Update cluster mapping docs
danbraunai-goodfire Feb 27, 2026
75d5f06
Update cluster_mapping to use cluster run instead of ensemble
danbraunai-goodfire Feb 27, 2026
2ab728c
Merge branch 'main' into dev
danbraunai-goodfire Feb 27, 2026
b6ce5cb
Merge 1/3: Data pipelines refactor (#421)
ocg-goodfire Mar 6, 2026
c3e6c8e
App overhaul + clustering + cleanup
ocg-goodfire Mar 6, 2026
3e74685
Cleanup: delete one-off scripts, fix silent failures, remove TODO.md
ocg-goodfire Mar 6, 2026
65ca30f
Use ValueError instead of assert False for unexpected pass_name
ocg-goodfire Mar 6, 2026
af880b5
Add graph_interp module (#427)
ocg-goodfire Mar 6, 2026
29a9ad8
Add editing module (#429)
ocg-goodfire Mar 6, 2026
3d02e8b
Add investigate module (#428)
ocg-goodfire Mar 6, 2026
285e2e2
Improve postprocess module (#430)
ocg-goodfire Mar 6, 2026
ce29a31
Merge remote-tracking branch 'origin/dev' into merge/3-app-cleanup
ocg-goodfire Mar 6, 2026
3313f6b
Remove unreachable default case — pyright proves pass_name is exhaustive
ocg-goodfire Mar 6, 2026
90b1456
Make PR self-contained: pass partition to launch_investigation
ocg-goodfire Mar 6, 2026
d5c7181
Delete dead code: commented-out MCP tool, unused DEVICE, dead schema
ocg-goodfire Mar 6, 2026
3b6d019
Revert unnecessary migration — real DB already has the columns
ocg-goodfire Mar 6, 2026
c0b985d
Remove stale edges_data_abs migration — column is in CREATE TABLE
ocg-goodfire Mar 6, 2026
1c15f52
Update app CLAUDE.md: DB is persistent, requires manual migrations
ocg-goodfire Mar 6, 2026
9870689
Fix MeanKL loss mismatch and add GPU lock to search_tokens
ocg-goodfire Mar 6, 2026
24b086f
Gracefully skip base intervention run when no interventable nodes
ocg-goodfire Mar 6, 2026
1e2598d
Remove MOCK_MODE and all mock code from graph_interp router
ocg-goodfire Mar 6, 2026
c51e62f
Delete dead fork code, unused DB methods, deduplicate MAX_OUTPUT_NODE…
ocg-goodfire Mar 6, 2026
56f975e
Make harvest_subrun_id required everywhere — no more "use most recent"
ocg-goodfire Mar 6, 2026
c959635
remove dead scripts
ocg-goodfire Mar 6, 2026
48b91ac
Add Md DSL to spd/utils/ for shared use across prompt builders
ocg-goodfire Mar 6, 2026
c024988
Rewrite all LLM prompt builders with Md DSL, fix pre-existing warnings
ocg-goodfire Mar 6, 2026
c29b44f
Simplify investigate module + deduplicate constant (#434)
ocg-goodfire Mar 6, 2026
b3f99ee
Simplify non-app Python modules: deduplicate graph_interp, autointerp…
ocg-goodfire Mar 6, 2026
f51c0fc
Simplify app backend + frontend: deduplicate, remove dead code, fix s…
ocg-goodfire Mar 6, 2026
e5fe094
Merge _maybe_pgd_config + _maybe_adv_pgd into single _maybe_pgd, asse…
ocg-goodfire Mar 6, 2026
4e97229
Merge origin/dev: resolve conflicts in investigate + graphs.py import
ocg-goodfire Mar 6, 2026
c28c163
Move harvest_subrun_id out of DatasetAttributionConfig into a functio…
ocg-goodfire Mar 7, 2026
6546f6d
Autointerp prompt cleanup: use Md DSL properly, inline token_pmi_pair…
ocg-goodfire Mar 7, 2026
9fd8f39
Add DELETE /api/prompts/{prompt_id} endpoint
ocg-goodfire Mar 7, 2026
d89f92b
Remove partition param from investigate — use DEFAULT_PARTITION_NAME …
ocg-goodfire Mar 7, 2026
85d1e8e
Frontend cleanup: type displaySettings, remove dead CSS, minor fixes
ocg-goodfire Mar 7, 2026
e79c7b4
Fix test: target_sans was renamed to ablated on dev
ocg-goodfire Mar 7, 2026
e948529
option to enable PPGD late during training (#438)
Antovigo Mar 12, 2026
b7f866a
Add data presentation context to autointerp prompts (#442)
ocg-goodfire Mar 13, 2026
70b0e27
Improve autointerp prompt context and metric explanations (#443)
ocg-goodfire Mar 13, 2026
52fac2a
Fix KL divergence eval OOM: use fused reduction (#444)
ocg-goodfire Mar 16, 2026
d426b73
Add multi-provider LLM support for autointerp (#446)
ocg-goodfire Mar 17, 2026
a0ef0ae
Transcoder harvest integration (#419)
ocg-goodfire Mar 17, 2026
ad181bf
Add fixed source (r) sweep script for CE loss comparison (#448)
lee-goodfire Mar 17, 2026
3aa4dc4
Add sweep summary stats report script (#447)
lee-goodfire Mar 17, 2026
57dbbf7
Add QK attention contribution plots and shared attention utilities (#…
lee-goodfire Mar 17, 2026
d8548c0
Add previous-token head detection script (#450)
lee-goodfire Mar 17, 2026
c1e86d2
Add attention ablation experiment suite (#451)
lee-goodfire Mar 17, 2026
fccbad4
Fix artifact download race with lockfile + sentinel
ocg-goodfire Mar 17, 2026
cd08620
Add component head norms plotting script (#452)
lee-goodfire Mar 18, 2026
2751654
Add attention offset profile plotting script (#453)
lee-goodfire Mar 18, 2026
a0c6027
Add W_V subspace overlap analysis and plotting (#454)
lee-goodfire Mar 18, 2026
a67e43c
Add rich_examples autointerp strategy + compare tab (#455)
ocg-goodfire Mar 18, 2026
cb88015
Extract component frequency curve picker
ocg-goodfire Mar 18, 2026
ca8a9fb
Improve rich_examples autointerp prompt (#457)
ocg-goodfire Mar 18, 2026
16b583f
Fix/autointerp activations explanation (#458)
ocg-goodfire Mar 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
6 changes: 0 additions & 6 deletions .cursor/worktrees.json

This file was deleted.

8 changes: 8 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,2 +1,10 @@
WANDB_API_KEY=your_api_key
WANDB_ENTITY=your_entity_name

# LLM API keys for autointerp (set whichever you need based on model choice)
# Models with "/" in name (e.g. google/gemini-3.1-pro-preview) use OpenRouter
# Models starting with "claude-" use Anthropic directly
# Models starting with "gpt-"/"o1-"/"o3-"/"o4-" use OpenAI directly
OPENROUTER_API_KEY=your_openrouter_key
ANTHROPIC_API_KEY=your_anthropic_key
OPENAI_API_KEY=your_openai_key
9 changes: 8 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
spd/scripts/sweep_params.yaml
docs/coverage/**
notebooks/**
scratch/

# Script outputs (generated files, often large)
scripts/outputs/

**/out/
neuronpedia_outputs/
Expand Down Expand Up @@ -173,4 +177,7 @@ cython_debug/
#.idea/

**/*.db
**/*.db*
**/*.db*
*.schema.json

.claude/worktrees
7 changes: 1 addition & 6 deletions .mcp.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,3 @@
{
"mcpServers": {
"svelte-llm": {
"type": "http",
"url": "https://svelte-llm.stanislav.garden/mcp/mcp"
}
}
"mcpServers": {}
}
133 changes: 112 additions & 21 deletions CLAUDE.md

Large diffs are not rendered by default.

4 changes: 3 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,10 @@ install: copy-templates
.PHONY: install-dev
install-dev: copy-templates
uv sync
pre-commit install
uv run pre-commit install

.PHONY: install-all
install-all: install-dev install-app

# special install for CI (GitHub Actions) that reduces disk usage and install time
# 1. create a fresh venv with `--clear` -- this is mostly only for local testing of the CI install
Expand Down
8 changes: 7 additions & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,12 @@ dependencies = [
"scipy>=1.14.1",
"fastapi",
"uvicorn",
"orjson",
"aiolimiter>=1.2",
"openrouter>=0.1.1",
"httpx>=0.28.0",
"zstandard" # For streaming datasets
"zstandard", # For streaming datasets
"kaleido==0.2.1",
]

[dependency-groups]
Expand All @@ -54,6 +57,9 @@ spd-clustering = "spd.clustering.scripts.run_pipeline:cli"
spd-harvest = "spd.harvest.scripts.run_slurm_cli:cli"
spd-autointerp = "spd.autointerp.scripts.run_slurm_cli:cli"
spd-attributions = "spd.dataset_attributions.scripts.run_slurm_cli:cli"
spd-investigate = "spd.investigate.scripts.run_slurm_cli:cli"
spd-postprocess = "spd.postprocess.cli:cli"
spd-graph-interp = "spd.graph_interp.scripts.run_slurm_cli:cli"

[build-system]
requires = ["setuptools", "wheel"]
Expand Down
242 changes: 0 additions & 242 deletions scripts/plot_component_activations.py

This file was deleted.

65 changes: 65 additions & 0 deletions spd/adapters/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
"""Harvest method adapters: method-specific logic for the generic harvest pipeline.

Each decomposition method (SPD, CLT, MOLT, Transcoder) provides an adapter that knows how to:
- Load the model and build a dataloader
- Compute firings and activations from a batch (harvest_fn)
- Report layer structure and vocab size

Construct via adapter_from_config(method_config).
"""

from spd.adapters.base import DecompositionAdapter
from spd.harvest.config import DecompositionMethodHarvestConfig


def adapter_from_config(method_config: DecompositionMethodHarvestConfig) -> DecompositionAdapter:
from spd.harvest.config import (
CLTHarvestConfig,
SPDHarvestConfig,
TranscoderHarvestConfig,
)

match method_config:
case SPDHarvestConfig():
from spd.adapters.spd import SPDAdapter

return SPDAdapter(method_config.id)
case TranscoderHarvestConfig():
from spd.adapters.transcoder import TranscoderAdapter

return TranscoderAdapter(method_config)
case CLTHarvestConfig():
from spd.adapters.clt import CLTAdapter

return CLTAdapter(method_config)


def adapter_from_id(decomposition_id: str) -> DecompositionAdapter:
"""Construct an adapter from a decomposition ID (e.g. "s-abc123", "tc-1a2b3c4d").

For SPD runs, the ID is sufficient. For other methods, recovers the full
method config from the harvest DB (which is always populated before downstream
steps like autointerp run).
"""
if decomposition_id.startswith("s-"):
from spd.adapters.spd import SPDAdapter

return SPDAdapter(decomposition_id)

return adapter_from_config(_load_method_config(decomposition_id))


def _load_method_config(decomposition_id: str) -> DecompositionMethodHarvestConfig:
from pydantic import TypeAdapter

from spd.harvest.repo import HarvestRepo

repo = HarvestRepo.open_most_recent(decomposition_id)
assert repo is not None, (
f"No harvest data found for {decomposition_id!r}. "
f"Run spd-harvest first to populate the method config."
)
config_dict = repo.get_config()
method_config_raw = config_dict["method_config"]
ta = TypeAdapter(DecompositionMethodHarvestConfig)
return ta.validate_python(method_config_raw)
Loading