Manuscript revision and pending experiment work, snapshot before restructuring

Clarity pass over the main text (36-item audit), Discussion rewrite and cut,
acknowledgements, Souly et al. as ref 62, lettered SI panels, model section
moved under Results; plus the untracked curriculum/society/compose/smol
configs, runners, figures, stats and tests that the SI already cites.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y64o8FKP7rCuXzC48pxpMm
This commit is contained in:
Giorgio Gilestro 2026-09-13 16:54:09 +01:00
parent e4804adabc
commit 84124de143
450 changed files with 52813 additions and 1202 deletions

View file

@ -0,0 +1,31 @@
# Generation-0 gate for the composition experiment (prereg v3 §4: C1 base, C3 specialists,
# C4 replication). Trains the two founders and measures everything at t=0 without iterating.
#
# Base choice (C1, measured 2026-09-07): Qwen2.5-1.5B **base, not Instruct**. Zero-shot GSM-Hard
# program-aided: Instruct-1.5B 0.500, Instruct-3B 0.417, base-3B 0.633 — all far too strong, since a
# base that already has the skills makes the specialists' contribution vacuous. Base-1.5B scores
# 0.067, within noise of the 0.059 Llama-2-7B starting point in LoRA Soups (COLING 2025), so the
# published composition effect has room to appear.
experiment: llm_compose_gate
kind: llm_compose
base_model: Qwen/Qwen2.5-1.5B
seed: 1
generations: 0 # gate only: train founders, measure t=0, stop
arms: [dry]
n_hard: 150 # composed target (GSM8k-Hard, program-aided) — SE ~0.04
n_gsm8k: 100 # math own-skill probe
n_mbpp: 80 # code own-skill probe (execution-verified)
n_probe: 40 # shared prompts for rho
k_inherit: 300
epochs: 3
conf_gate: 0.85
g: 0.10
spec_train: 1200
spec_epochs: 3
max_new_tokens: 320
batch_size: 16
score_batch_size: 4
train_batch_size: 2 # 16 GB A4000; the fp32 logit upcast at vocab 152k is the constraint
train_max_len: 448
lora: {r: 16, alpha: 32}
output: {dir: results/llm_compose_gate}

View file

@ -0,0 +1,34 @@
# Generation-0 gate, second configuration (prereg v3 §4a): the composed target is MATH-500
# (competition maths, level >= 3, numeric answers), and merge weights are *selected* on a disjoint
# validation split rather than fixed at 0.5/0.5.
#
# Why: on GSM8k-Hard the code parent alone reaches 0.427, because once code removes the arithmetic
# burden the base's own reasoning suffices — so maths is not scarce and E8's premise fails. MetaMathQA
# is built from GSM8K *and* MATH, so MATH-500 tests reasoning the specialist has and the base lacks.
# Founders are shared with the first gate (same experiment name), so this costs evaluation only.
experiment: llm_compose_gate
kind: llm_compose
base_model: Qwen/Qwen2.5-1.5B
seed: 1
generations: 0
arms: [dry]
target: math500
n_hard: 120 # test split (level>=3 pool is 271; 70% test / 30% val, disjoint)
n_hard_val: 50 # val split, screens the merge weights only
merge_weights: [[0.5, 0.5], [0.3, 0.7], [0.2, 0.8]]
n_gsm8k: 100
n_mbpp: 80
n_probe: 40
k_inherit: 300
epochs: 3
conf_gate: 0.85
g: 0.10
spec_train: 1200
spec_epochs: 3
max_new_tokens: 320
batch_size: 16
score_batch_size: 8
train_batch_size: 2
train_max_len: 448
lora: {r: 16, alpha: 32}
output: {dir: results/llm_compose_gate_math500}

View file

@ -0,0 +1,55 @@
# The composition campaign, seed 1 (prereg v3, amended after the generation-0 sweep of 2026-09-07).
#
# Arms. The gen-0 sweep found that the merge *weighting* dominates the operator: the a-priori 0.5/0.5
# blend fails under both operators (surplus -0.020 cat, -0.093 linear) while a selected weight passes
# (+0.080 linear at 0.2/0.8, +0.027 cat at 0.3/0.7). Weights are therefore chosen each generation on a
# disjoint validation split (E10, directed recombination) in every arm, and the operator is an
# explicit per-arm setting:
# dry — linear operator, no grounding [H2, H3, H5: does composition survive drift?]
# grounded — linear operator, g = 0.10 [H4: does immigration arrest it?]
# dry_cat — concatenation operator, no grounding [H6, revised: does the operator ordering hold
# across generations, or only at gen 0?]
experiment: llm_compose
kind: llm_compose
base_model: Qwen/Qwen2.5-1.5B
seed: 1
generations: 6
arms:
- dry
- grounded
- dry_cat
g: 0.1
n_hard: 150
n_gsm8k: 150
n_mbpp: 100
n_probe: 60
k_inherit: 300
epochs: 3
conf_gate: 0.85
spec_train: 1200
spec_epochs: 3
max_new_tokens: 320
batch_size: 16
score_batch_size: 4
train_batch_size: 2
train_max_len: 448
resume: true
lora:
r: 16
alpha: 32
output:
dir: results/llm_compose/s1
arm_ops:
dry: linear
grounded: linear
dry_cat: cat
n_hard_val: 60
merge_weights:
- - 0.5
- 0.5
- - 0.3
- 0.7
- - 0.2
- 0.8
- - 0.1
- 0.9

View file

@ -0,0 +1,27 @@
# G2 probe (prereg v4 §5): does forgetting occur AT ALL under the real curriculum length?
# The 3-family gate showed none — but with only 3 families, ample adapter capacity and a generous
# replay budget, none was expected. This runs the full nine-family curriculum on ONE lineage with
# replay switched OFF, which is the harshest condition the design can offer. If early families still
# do not decay, the families are too mutually compatible and too easy for their own good, and the
# society has no forgetting to rescue — a design-level stop.
experiment: llm_curriculum_g2
kind: llm_curriculum
base_model: Qwen/Qwen2.5-1.5B
seed: 1
families: [strings, setops, numtheory, mixedtoken, digits, alphabet, prime, wordlen, roman]
lineages: 1
generations: 9
arms: [isolated]
baselines: []
n_new: 300
n_replay: 0 # replay OFF — the harshest forgetting condition
n_test: 60
n_val: 30
epochs: 3
lr: 1.0e-4
max_new_tokens: 32
batch_size: 32
train_batch_size: 2
train_max_len: 448
lora: {r: 16, alpha: 32}
output: {dir: results/llm_curriculum_g2}

View file

@ -0,0 +1,28 @@
# Gate run for the curriculum society (prereg v4 §5). G0 is the decisive one: with a single lineage
# and no recombination, does cumulative capability CLIMB across generations? If capability cannot
# accumulate in the simplest arm, no outcome of the full design is interpretable — stop.
# Also exercises G1 (inheritance transmits), G2 (forgetting occurs without full replay) and, with
# lineages=3, G3 (recombination combines disjoint knowledge).
experiment: llm_curriculum_gate
kind: llm_curriculum
base_model: Qwen/Qwen2.5-1.5B
seed: 1
families: [strings, setops, numtheory] # 3 families, 3 generations — the smallest climb test
lineages: 3
generations: 3
arms: [isolated, society]
baselines: []
n_new: 300
n_replay: 120
n_test: 60
n_val: 30
epochs: 3
lr: 1.0e-4
operator: linear
merge_weights: [[0.5, 0.5], [0.3, 0.7], [0.7, 0.3]]
max_new_tokens: 32
batch_size: 32
train_batch_size: 2
train_max_len: 448
lora: {r: 16, alpha: 32}
output: {dir: results/llm_curriculum_gate}

View file

@ -0,0 +1,27 @@
# Calibration for the real-dataset curriculum (prereg v4 §5 gates, re-run on the new families).
# Stage A (this config): base accuracy on every candidate, and one specialist per candidate trained
# from the base on its train split — the C1 band is base <= 0.40 and specialist >= 0.60.
# Stage B (curriculum_v5_g2.yaml, after selection): one lineage, zero replay, all chosen families in
# sequence — the forgetting probe; mean drop across families learned before the last must be >= 0.15,
# and it must not be carried by a single family (the v4 failure: one pair at +0.65, the rest ~0).
experiment: llm_curriculum_v5_calib
kind: llm_curriculum
base_model: Qwen/Qwen2.5-1.5B
seed: 1
families: [gsm8k, mbpp, boolq, mnli, sst2, csqa, arc, winogrande, squad, nq_open, hellaswag]
lineages: 11 # one lineage per candidate = each trains only its own family at gen 0
generations: 1 # gen 0 only: founders; the recorded acc_* rows ARE the specialist table
arms: [isolated]
baselines: []
n_new: 300
n_replay: 0
n_test: 60
n_val: 20
epochs: 3
lr: 1.0e-4
max_new_tokens: 48 # spans / short text need more room than a label
batch_size: 24
train_batch_size: 2
train_max_len: 512
lora: {r: 16, alpha: 32}
output: {dir: results/llm_curriculum_v5_calib}

View file

@ -0,0 +1,24 @@
# Stage A, second pass: the six candidates that missed the C1 band at 300 founder examples, retrained
# at the budget every working specialist in this project has used (v2, v3: 1200 x 3 epochs).
# Decides whether the curriculum has six families or nine.
experiment: llm_curriculum_v5_calib_b
kind: llm_curriculum
base_model: Qwen/Qwen2.5-1.5B
seed: 1
families: [gsm8k, mbpp, sst2, csqa, winogrande, nq_open]
lineages: 6
generations: 1
arms: [isolated]
baselines: []
n_new: 1200
n_replay: 0
n_test: 60
n_val: 20
epochs: 3
lr: 1.0e-4
max_new_tokens: 48
batch_size: 24
train_batch_size: 2
train_max_len: 512
lora: {r: 16, alpha: 32}
output: {dir: results/llm_curriculum_v5_calib_b}

View file

@ -0,0 +1,48 @@
# Differential reproduction (manuscript revision 2026-09-12): `cull: true` re-founds the lowest-scoring
# lineage from the highest-scoring one after every generation's measurement (truncation selection at
# fixed N = 3; the slot keeps its curriculum order). Latin square as in v5. Arms: isolated + cull
# (selection without recombination) and declinable society + cull (selection with recombination),
# read against the existing isolated and veto arms. Prediction (Discussion): recombination's early
# lead becomes a level advantage; parity again is the null. Seeds via hpc/llm_cull.pbs.
experiment: llm_curriculum_v5_cull
kind: llm_curriculum
base_model: Qwen/Qwen2.5-1.5B
seed: 1
families:
- mnli
- arc
- hellaswag
- squad
- boolq
- winogrande
lineages: 3
generations: 6
arms:
- isolated
- society
baselines: []
allow_veto: true
n_new: 300
n_replay: 150
n_test: 60
n_val: 20
epochs: 3
lr: 0.0001
operator: linear
merge_weights:
- - 0.5
- 0.5
- - 0.3
- 0.7
- - 0.7
- 0.3
max_new_tokens: 48
batch_size: 24
train_batch_size: 2
train_max_len: 512
lora:
r: 16
alpha: 32
output:
dir: results/llm_curriculum_v5_cull
cull: true

View file

@ -0,0 +1,35 @@
# Decorrelated curriculum (manuscript review, 2026-09-11). In the Latin square partner complementarity
# falls monotonically with generation (1.0, 1.0, 0.8, 0.67, 0.33, 0.0), so the veto's acceptance curve
# is collinear with adapter age. Here every lineage starts with the same non-destroyer family (mnli),
# then diverges maximally, then converges: complementarity 0.00, 0.67, 0.70, 0.58, 0.33, 0.00 by
# generation. Same six families, same G, destroyers (boolq, winogrande) spread across lineages as
# in the Latin square. Arms: the declinable merge (`society` + `allow_veto`) and its never-merge
# reference under the same curriculum. Pre-registered readout: tasks/prereg-llm-society-v4.md §8g.
experiment: llm_curriculum_v5_decor
kind: llm_curriculum
base_model: Qwen/Qwen2.5-1.5B
seed: 1
families: [mnli, arc, hellaswag, squad, boolq, winogrande]
orders:
- [mnli, arc, hellaswag, squad, boolq, winogrande]
- [mnli, squad, boolq, winogrande, arc, hellaswag]
- [mnli, winogrande, arc, hellaswag, squad, boolq]
lineages: 3
generations: 6
arms: [isolated, society]
baselines: []
allow_veto: true
n_new: 300
n_replay: 150
n_test: 60
n_val: 20
epochs: 3
lr: 1.0e-4
operator: linear
merge_weights: [[0.5, 0.5], [0.3, 0.7], [0.7, 0.3]]
max_new_tokens: 48
batch_size: 24
train_batch_size: 2
train_max_len: 512
lora: {r: 16, alpha: 32}
output: {dir: results/llm_curriculum_v5_decor}

View file

@ -0,0 +1,66 @@
# Conflict-early curriculum (manuscript revision 2026-09-12): the two families whose answer
# conventions conflict (boolq yes/no, winogrande 1/2) arrive in generations 1-2 of every lineage; the
# four compatible families follow in rotated orders. Paired with curriculum_v5_late (same families,
# conflict in generations 5-6) to decouple the ARRIVAL of conflicting conventions from adapter age and
# skill count, which rise identically in both. Arms: isolated + declinable society (decline timing).
# Seeds 1-3 via hpc/llm_curriculum_timing.pbs.
experiment: llm_curriculum_v5_early
kind: llm_curriculum
base_model: Qwen/Qwen2.5-1.5B
seed: 1
families:
- mnli
- arc
- hellaswag
- squad
- boolq
- winogrande
lineages: 3
generations: 6
arms:
- isolated
- society
baselines: []
allow_veto: true
n_new: 300
n_replay: 150
n_test: 60
n_val: 20
epochs: 3
lr: 0.0001
operator: linear
merge_weights:
- - 0.5
- 0.5
- - 0.3
- 0.7
- - 0.7
- 0.3
max_new_tokens: 48
batch_size: 24
train_batch_size: 2
train_max_len: 512
lora:
r: 16
alpha: 32
output:
dir: results/llm_curriculum_v5_early
orders:
- - boolq
- winogrande
- mnli
- arc
- hellaswag
- squad
- - winogrande
- boolq
- arc
- hellaswag
- squad
- mnli
- - boolq
- winogrande
- hellaswag
- squad
- mnli
- arc

View file

@ -0,0 +1,61 @@
# Obligate-merge arm of the conflict-early curriculum (collapse timing): same orders as
# curriculum_v5_early, society arm only, no veto. Seeds 1-3 via hpc/llm_curriculum_timing.pbs.
experiment: llm_curriculum_v5_early_obl
kind: llm_curriculum
base_model: Qwen/Qwen2.5-1.5B
seed: 1
families:
- mnli
- arc
- hellaswag
- squad
- boolq
- winogrande
lineages: 3
generations: 6
arms:
- society
baselines: []
allow_veto: false
n_new: 300
n_replay: 150
n_test: 60
n_val: 20
epochs: 3
lr: 0.0001
operator: linear
merge_weights:
- - 0.5
- 0.5
- - 0.3
- 0.7
- - 0.7
- 0.3
max_new_tokens: 48
batch_size: 24
train_batch_size: 2
train_max_len: 512
lora:
r: 16
alpha: 32
output:
dir: results/llm_curriculum_v5_early_obl
orders:
- - boolq
- winogrande
- mnli
- arc
- hellaswag
- squad
- - winogrande
- boolq
- arc
- hellaswag
- squad
- mnli
- - boolq
- winogrande
- hellaswag
- squad
- mnli
- arc

View file

@ -0,0 +1,25 @@
# Stage B (prereg v4 §5 G2, v5 families): does forgetting occur, and is it general rather than one pair?
# One lineage, zero replay, all six selected families in sequence at the founder budget that passed C1.
# Pass: mean drop across families learned before the last >= 0.15, with no single family carrying
# more than 50% of the total drop (the v4 failure mode: one pair at +0.65, the rest ~0).
experiment: llm_curriculum_v5_g2
kind: llm_curriculum
base_model: Qwen/Qwen2.5-1.5B
seed: 1
families: [mnli, arc, hellaswag, squad, boolq, winogrande]
lineages: 1
generations: 6
arms: [isolated]
baselines: []
n_new: 300
n_replay: 0
n_test: 60
n_val: 20
epochs: 3
lr: 1.0e-4
max_new_tokens: 48
batch_size: 24
train_batch_size: 2
train_max_len: 512
lora: {r: 16, alpha: 32}
output: {dir: results/llm_curriculum_v5_g2}

View file

@ -0,0 +1,63 @@
# Conflict-late curriculum (manuscript revision 2026-09-12): the four compatible families first, in
# rotated orders; boolq (yes/no) and winogrande (1/2) arrive in generations 5-6. Pair of
# curriculum_v5_early. Arms: isolated + declinable society (decline timing).
experiment: llm_curriculum_v5_late
kind: llm_curriculum
base_model: Qwen/Qwen2.5-1.5B
seed: 1
families:
- mnli
- arc
- hellaswag
- squad
- boolq
- winogrande
lineages: 3
generations: 6
arms:
- isolated
- society
baselines: []
allow_veto: true
n_new: 300
n_replay: 150
n_test: 60
n_val: 20
epochs: 3
lr: 0.0001
operator: linear
merge_weights:
- - 0.5
- 0.5
- - 0.3
- 0.7
- - 0.7
- 0.3
max_new_tokens: 48
batch_size: 24
train_batch_size: 2
train_max_len: 512
lora:
r: 16
alpha: 32
output:
dir: results/llm_curriculum_v5_late
orders:
- - mnli
- arc
- hellaswag
- squad
- boolq
- winogrande
- - arc
- hellaswag
- squad
- mnli
- winogrande
- boolq
- - hellaswag
- squad
- mnli
- arc
- boolq
- winogrande

View file

@ -0,0 +1,61 @@
# Obligate-merge arm of the conflict-late curriculum (collapse timing): same orders as
# curriculum_v5_late, society arm only, no veto. Seeds 1-3 via hpc/llm_curriculum_timing.pbs.
experiment: llm_curriculum_v5_late_obl
kind: llm_curriculum
base_model: Qwen/Qwen2.5-1.5B
seed: 1
families:
- mnli
- arc
- hellaswag
- squad
- boolq
- winogrande
lineages: 3
generations: 6
arms:
- society
baselines: []
allow_veto: false
n_new: 300
n_replay: 150
n_test: 60
n_val: 20
epochs: 3
lr: 0.0001
operator: linear
merge_weights:
- - 0.5
- 0.5
- - 0.3
- 0.7
- - 0.7
- 0.3
max_new_tokens: 48
batch_size: 24
train_batch_size: 2
train_max_len: 512
lora:
r: 16
alpha: 32
output:
dir: results/llm_curriculum_v5_late_obl
orders:
- - mnli
- arc
- hellaswag
- squad
- boolq
- winogrande
- - arc
- hellaswag
- squad
- mnli
- winogrande
- boolq
- - hellaswag
- squad
- mnli
- arc
- boolq
- winogrande

View file

@ -0,0 +1,37 @@
# The curriculum society campaign, seed 1 (prereg v4, v5 curriculum — tasks/prereg-llm-society-v4.md).
# Runs all four arms then the three matched-budget baselines. The PBS array (hpc/llm_curriculum.pbs)
# derives one (seed, arm) config per element from this template for seeds 2-3.
#
# Six real-dataset families selected by calibration (§8a): five pass C1 at >= 0.60, winogrande (0.57)
# is the sixth under the recorded amendment. L = 3 lineages, G = 6 generations; the cyclic Latin square
# gives complementarity 1.0 at generation 2 and 0.0 at generation 6 (H6 tests the shape).
#
# Arms: isolated (no recombination) · society (decorrelated contemporary) · society_dry (contemporary,
# self-generated replay) · seed_bank (own ancestor at t-3 — temporal complementarity)
# Baselines at matched examples: sequential · single_shot_merge · joint
experiment: llm_curriculum_v5
kind: llm_curriculum
base_model: Qwen/Qwen2.5-1.5B # base, not Instruct: measured 0.011 on these families untrained
seed: 1
families: [mnli, arc, hellaswag, squad, boolq, winogrande]
lineages: 3
generations: 6
arms: [isolated, society, society_dry, seed_bank]
baselines: [sequential, single_shot_merge, joint]
n_new: 300 # founder/acquisition budget that passed C1 (1200 destabilised training)
n_replay: 150 # fixed TOTAL, split across families seen: protection thins as the curriculum grows
n_test: 60 # per family, from the TEST split — reporting only
n_val: 20 # per family, from the TRAIN split — merge-weight selection only
epochs: 3
lr: 1.0e-4 # continued-training rate (fresh founders use train_lora_on_tasks' 2e-4)
ancestor_depth: 3
operator: linear
merge_weights: [[0.5, 0.5], [0.3, 0.7], [0.7, 0.3]]
baseline_weights: [[0.333, 0.333, 0.334], [0.5, 0.25, 0.25], [0.25, 0.5, 0.25], [0.25, 0.25, 0.5]]
max_new_tokens: 48
batch_size: 24
train_batch_size: 2
train_max_len: 512
resume: true
lora: {r: 16, alpha: 32}
output: {dir: results/llm_curriculum_v5/s1}

View file

@ -0,0 +1,30 @@
# Forced-stop control for the declinable merge (manuscript review, 2026-09-11). Identical to the v5
# `society` arm except that recombination is switched off from generation 3 onward (`merge_until: 3`):
# obligate merging at generations 0-2, none afterwards. This is the fixed "merge early, then stop"
# schedule the veto arm must be compared against, because in the seed-1 veto run lineages declined
# 1/3 of merges at generations 0-2 and 3/3 at 3-5. Pre-registered readout: tasks/prereg-llm-society-v4.md §8g.
experiment: llm_curriculum_v5_stop3
kind: llm_curriculum
base_model: Qwen/Qwen2.5-1.5B
seed: 1
families: [mnli, arc, hellaswag, squad, boolq, winogrande]
lineages: 3
generations: 6
arms: [society]
baselines: []
allow_veto: false
merge_until: 3
n_new: 300
n_replay: 150
n_test: 60
n_val: 20
epochs: 3
lr: 1.0e-4
operator: linear
merge_weights: [[0.5, 0.5], [0.3, 0.7], [0.7, 0.3]]
max_new_tokens: 48
batch_size: 24
train_batch_size: 2
train_max_len: 512
lora: {r: 16, alpha: 32}
output: {dir: results/llm_curriculum_v5_stop3}

View file

@ -0,0 +1,31 @@
# The veto arm (GG, 2026-09-08): identical to v5's `society` arm in every respect except that
# "keep the parent unchanged" is an admissible offspring. v5 made merging obligate — every lineage
# merged every generation and had to accept the result, which is not what anyone would build.
#
# Reference points from v5 seed 1: society 0.211 (obligate merging) vs isolated 0.814 (never merges).
# The diagnostic that matters is `veto_used`: if lineages decline every merge the arm degenerates to
# `isolated`, and that is itself the answer.
experiment: llm_curriculum_v5_veto
kind: llm_curriculum
base_model: Qwen/Qwen2.5-1.5B
seed: 1
families: [mnli, arc, hellaswag, squad, boolq, winogrande]
lineages: 3
generations: 6
arms: [society]
baselines: []
allow_veto: true
n_new: 300
n_replay: 150
n_test: 60
n_val: 20
epochs: 3
lr: 1.0e-4
operator: linear
merge_weights: [[0.5, 0.5], [0.3, 0.7], [0.7, 0.3]]
max_new_tokens: 48
batch_size: 24
train_batch_size: 2
train_max_len: 512
lora: {r: 16, alpha: 32}
output: {dir: results/llm_curriculum_v5_veto}

View file

@ -0,0 +1,30 @@
# Second base lineage (manuscript revision 2026-09-12): the Fisher-Muller replication of merge_seeds on
# SmolLM2-1.7B-Instruct (HuggingFaceTB, Apache-2.0, Llama architecture) instead of Qwen. adapters_dir is
# moved because the specialist cache is keyed by family and seed only. Runs via hpc/llm_smol.pbs.
experiment: llm_merge_seeds_smol
kind: llm_merge
seed: 1
seeds:
- 1
- 2
- 3
- 4
- 5
n_replicates: 1
base_model: HuggingFaceTB/SmolLM2-1.7B-Instruct
families:
- lists
- strings
- arith
n_train: 600
n_test: 100
epochs: 3
lora:
r: 16
alpha: 32
merges:
- soup
- ties
output:
dir: results/llm_merge_seeds_smol
adapters_dir: models/llm_smol

View file

@ -0,0 +1,31 @@
# Second base lineage (manuscript revision 2026-09-12): the headroom-rule replication of moe_hard_seeds
# (union vs fusion, hard tasks, 3 seeds) on SmolLM2-1.7B-Instruct. Runs via hpc/llm_smol.pbs.
experiment: llm_moe_hard_seeds_smol
kind: llm_moe
seed: 1
seeds:
- 1
- 2
- 3
n_replicates: 1
base_model: HuggingFaceTB/SmolLM2-1.7B-Instruct
hard: true
families:
- lists
- strings
- arith
n_train: 400
n_test: 80
n_route: 32
epochs: 3
lora:
r: 16
alpha: 32
operators:
- soup
- ties
- moe_oracle
- moe_learned
output:
dir: results/llm_moe_hard_seeds_smol
adapters_dir: models/llm_smol

View file

@ -0,0 +1,17 @@
# Calibration stage A (prereg §4, gates C1a-c + C4): every candidate family's base / specialist
# accuracy, specialist confidence AUC, pairwise functional conflict, gen-0 behavioural distance.
# GG reviews the printed table and fixes the 12-family set in society_v2_calib_b.yaml + the campaign.
# ~1 h on a 16 GB GPU (17 specialists at 600 x 3 epochs, cached and reused by stage B).
experiment: llm_society_v2_calib_a
kind: llm_society_calib
stage: families
base_model: Qwen/Qwen2.5-0.5B-Instruct
seed: 1
families: [lists, strings, arith, roman, binary, sortletters, setops, numtheory, mixedtoken,
caesar, vectors, progression, charfreq, digits, liststats, alphabet, prime]
n_test: 100
n_probe: 10
spec_train: 600
spec_epochs: 3
lora: {r: 16, alpha: 32}
output: {dir: results/llm_society_v2_calib_a}

View file

@ -0,0 +1,20 @@
# Calibration stage A, second pass (prereg §4 amendments, 2026-09-07): the first pass left only six
# families in band. Changes, each recorded in the prereg: founder budget 600 -> 1200 x 3 (uniform);
# roman / binary / prime prompt spaces enlarged; three new learnable candidates (wordlen,
# lettercount, sumeven); the specialist UPPER bound relaxed 0.90 -> 1.00 (the headroom argument it
# encoded concerns fusion composing to a ceiling, not transmission/assembly). Families whose
# specialist scored <= 0.20 in pass 1 (sortletters, caesar, progression) are not re-trained.
experiment: llm_society_v2_calib_a2
kind: llm_society_calib
stage: families
base_model: Qwen/Qwen2.5-0.5B-Instruct
seed: 1
families: [lists, strings, arith, roman, binary, setops, numtheory, mixedtoken, vectors, charfreq,
digits, liststats, alphabet, prime, wordlen, lettercount, sumeven]
spec_hi: 1.0
n_test: 100
n_probe: 10
spec_train: 1200
spec_epochs: 3
lora: {r: 16, alpha: 32}
output: {dir: results/llm_society_v2_calib_a2}

View file

@ -0,0 +1,25 @@
# Calibration stage B (prereg §4, gates C2 / C3 / C5) over the 12 families chosen from stage A.
# Run three times with stage: transmission | cross | consensus (see Makefile `llm-society-calib`).
# Families = stage-A pass-2 option 1 (L=9, gate 0.41; prereg §4a) — pending GG's go.
experiment: llm_society_v2_calib_b
kind: llm_society_calib
stage: transmission
base_model: Qwen/Qwen2.5-0.5B-Instruct
seed: 1
families: [strings, setops, numtheory, mixedtoken, digits, alphabet, prime, wordlen, roman]
# C2: examples-per-family k and epochs to sweep; probe_families are the three whose retention is
# measured (spread across answer types: list / word / int).
probe_families: [setops, alphabet, digits] # list / letter / integer answers
ks: [25, 50, 100, 150]
epochs_grid: [2, 3]
# C3: the two-founder cross (union-distil vs best-of-6 linear-merge-distil)
cross: [setops, alphabet]
k_inherit: 100
epochs: 3
n_candidates: 6
n_test: 100
n_probe: 10
spec_train: 1200
spec_epochs: 3
lora: {r: 16, alpha: 32}
output: {dir: results/llm_society_v2_calib_b}

View file

@ -0,0 +1,20 @@
# C2b (prereg §4a amendment under review): confidence-gated inheritance. The pre-registered C2 failed
# (retention ≤ 0.81 at k ≤ 150 despite competent supply): the child fits eight families of confident
# garbage alongside the one competent family. Here the child learns only prompts its source is
# confident on (verifier-free). Measures retention by gate τ, the Youden τ* separating own- from
# off-family confidence, and the off-family harm of ungated inheritance.
experiment: llm_society_v2_calib_b_transmission_conf
kind: llm_society_calib
stage: transmission_conf
base_model: Qwen/Qwen2.5-0.5B-Instruct
seed: 1
families: [strings, setops, numtheory, mixedtoken, digits, alphabet, prime, wordlen, roman]
probe_families: [setops, alphabet, digits]
k_pool: 300 # prompts per family answered by the source (2700 total); gate keeps a subset
taus: [0.5, 0.7, 0.85]
epochs: 3
n_test: 100
spec_train: 1200
spec_epochs: 3
lora: {r: 16, alpha: 32}
output: {dir: results/llm_society_v2_calib_b_transmission_conf}

View file

@ -0,0 +1,43 @@
experiment: llm_society_v2_calib_b_cross_gated
kind: llm_society_calib
stage: cross
base_model: Qwen/Qwen2.5-0.5B-Instruct
seed: 1
families:
- strings
- setops
- numtheory
- mixedtoken
- digits
- alphabet
- prime
- wordlen
- roman
probe_families:
- setops
- alphabet
- digits
ks:
- 25
- 50
- 100
- 150
epochs_grid:
- 2
- 3
cross:
- setops
- alphabet
k_inherit: 300
epochs: 3
n_candidates: 6
n_test: 100
n_probe: 10
spec_train: 1200
spec_epochs: 3
lora:
r: 16
alpha: 32
output:
dir: results/llm_society_v2_calib_b_cross_gated
conf_gate: 0.5

View file

@ -0,0 +1,43 @@
experiment: llm_society_v2_calib_c3b_e6
kind: llm_society_calib
stage: cross
base_model: Qwen/Qwen2.5-0.5B-Instruct
seed: 1
families:
- strings
- setops
- numtheory
- mixedtoken
- digits
- alphabet
- prime
- wordlen
- roman
probe_families:
- setops
- alphabet
- digits
ks:
- 25
- 50
- 100
- 150
epochs_grid:
- 2
- 3
cross:
- setops
- alphabet
k_inherit: 300
epochs: 6
n_candidates: 6
n_test: 100
n_probe: 10
spec_train: 1200
spec_epochs: 3
lora:
r: 16
alpha: 32
output:
dir: results/llm_society_v2_calib_c3b_e6
conf_gate: 0.5

View file

@ -0,0 +1,43 @@
experiment: llm_society_v2_calib_c3b_r64
kind: llm_society_calib
stage: cross
base_model: Qwen/Qwen2.5-0.5B-Instruct
seed: 1
families:
- strings
- setops
- numtheory
- mixedtoken
- digits
- alphabet
- prime
- wordlen
- roman
probe_families:
- setops
- alphabet
- digits
ks:
- 25
- 50
- 100
- 150
epochs_grid:
- 2
- 3
cross:
- setops
- alphabet
k_inherit: 300
epochs: 3
n_candidates: 6
n_test: 100
n_probe: 10
spec_train: 1200
spec_epochs: 3
lora:
r: 64
alpha: 128
output:
dir: results/llm_society_v2_calib_c3b_r64
conf_gate: 0.5

View file

@ -0,0 +1,43 @@
experiment: llm_society_v2_calib_c3b_r64e6
kind: llm_society_calib
stage: cross
base_model: Qwen/Qwen2.5-0.5B-Instruct
seed: 1
families:
- strings
- setops
- numtheory
- mixedtoken
- digits
- alphabet
- prime
- wordlen
- roman
probe_families:
- setops
- alphabet
- digits
ks:
- 25
- 50
- 100
- 150
epochs_grid:
- 2
- 3
cross:
- setops
- alphabet
k_inherit: 300
epochs: 6
n_candidates: 6
n_test: 100
n_probe: 10
spec_train: 1200
spec_epochs: 3
lora:
r: 64
alpha: 128
output:
dir: results/llm_society_v2_calib_c3b_r64e6
conf_gate: 0.5

View file

@ -0,0 +1,43 @@
experiment: llm_society_v2_calib_c3c_t85e3
kind: llm_society_calib
stage: cross
base_model: Qwen/Qwen2.5-0.5B-Instruct
seed: 1
families:
- strings
- setops
- numtheory
- mixedtoken
- digits
- alphabet
- prime
- wordlen
- roman
probe_families:
- setops
- alphabet
- digits
ks:
- 25
- 50
- 100
- 150
epochs_grid:
- 2
- 3
cross:
- setops
- alphabet
k_inherit: 300
epochs: 3
n_candidates: 6
n_test: 100
n_probe: 10
spec_train: 1200
spec_epochs: 3
lora:
r: 16
alpha: 32
output:
dir: results/llm_society_v2_calib_c3c_t85e3
conf_gate: 0.85

View file

@ -0,0 +1,43 @@
experiment: llm_society_v2_calib_c3c_t85e6
kind: llm_society_calib
stage: cross
base_model: Qwen/Qwen2.5-0.5B-Instruct
seed: 1
families:
- strings
- setops
- numtheory
- mixedtoken
- digits
- alphabet
- prime
- wordlen
- roman
probe_families:
- setops
- alphabet
- digits
ks:
- 25
- 50
- 100
- 150
epochs_grid:
- 2
- 3
cross:
- setops
- alphabet
k_inherit: 300
epochs: 6
n_candidates: 6
n_test: 100
n_probe: 10
spec_train: 1200
spec_epochs: 3
lora:
r: 16
alpha: 32
output:
dir: results/llm_society_v2_calib_c3c_t85e6
conf_gate: 0.85

View file

@ -0,0 +1,29 @@
# v2 society campaign, seed 1 (prereg tasks/prereg-llm-society-v2.md §3). The PBS array
# (hpc/llm_society_v2.pbs) derives one config per (seed, arm) from this template; running it directly
# runs all four arms sequentially (the local-GPU hedge).
#
# CALIBRATION-DEPENDENT FIELDS — set after gates C1/C2 pass, before submission:
# families : the 9 selected by stage A pass 2 (C1, gate 0.41) — SET
# k_inherit / epochs / conf_gate : from stage B (C2 + C2b), 2026-09-07 — SET
experiment: llm_society_v2
kind: llm_society_v2
base_model: Qwen/Qwen2.5-0.5B-Instruct
seed: 1
families: [strings, setops, numtheory, mixedtoken, digits, alphabet, prime, wordlen, roman]
agents: 9
generations: 12
arms: [full, no_grounding, no_sex, no_diversity]
g: 0.85
lam: 0.3
max_mate_use: 2
n_test: 27 # per family -> 243 overall (SE 0.032)
n_val: 13 # per family -> 117 (selection signal)
n_conf: 13 # per family, fresh each generation
k_inherit: 300 # per family, fresh each generation (C2b: k=300 is the main retention driver)
epochs: 3 # child SFT epochs (C2b)
conf_gate: 0.85 # confidence-gated inheritance, all arms (C2b mean retention 0.88; C3c: tight gate = 6-epoch retention at 3 epochs)
spec_train: 1200
spec_epochs: 3
resume: true
lora: {r: 16, alpha: 32}
output: {dir: results/llm_society_v2/s1}

View file

@ -0,0 +1,29 @@
# v2 society campaign, seed 2 (prereg tasks/prereg-llm-society-v2.md §3). The PBS array
# (hpc/llm_society_v2.pbs) derives one config per (seed, arm) from this template; running it directly
# runs all four arms sequentially (the local-GPU hedge).
#
# CALIBRATION-DEPENDENT FIELDS — set after gates C1/C2 pass, before submission:
# families : the 9 selected by stage A pass 2 (C1, gate 0.41) — SET
# k_inherit / epochs / conf_gate : from stage B (C2 + C2b), 2026-09-07 — SET
experiment: llm_society_v2
kind: llm_society_v2
base_model: Qwen/Qwen2.5-0.5B-Instruct
seed: 2
families: [strings, setops, numtheory, mixedtoken, digits, alphabet, prime, wordlen, roman]
agents: 9
generations: 12
arms: [full, no_grounding, no_sex, no_diversity]
g: 0.85
lam: 0.3
max_mate_use: 2
n_test: 27 # per family -> 243 overall (SE 0.032)
n_val: 13 # per family -> 117 (selection signal)
n_conf: 13 # per family, fresh each generation
k_inherit: 300 # per family, fresh each generation (C2b: k=300 is the main retention driver)
epochs: 3 # child SFT epochs (C2b)
conf_gate: 0.85 # confidence-gated inheritance, all arms (C2b mean retention 0.88; C3c: tight gate = 6-epoch retention at 3 epochs)
spec_train: 1200
spec_epochs: 3
resume: true
lora: {r: 16, alpha: 32}
output: {dir: results/llm_society_v2/s2}

View file

@ -0,0 +1,29 @@
# v2 society campaign, seed 3 (prereg tasks/prereg-llm-society-v2.md §3). The PBS array
# (hpc/llm_society_v2.pbs) derives one config per (seed, arm) from this template; running it directly
# runs all four arms sequentially (the local-GPU hedge).
#
# CALIBRATION-DEPENDENT FIELDS — set after gates C1/C2 pass, before submission:
# families : the 9 selected by stage A pass 2 (C1, gate 0.41) — SET
# k_inherit / epochs / conf_gate : from stage B (C2 + C2b), 2026-09-07 — SET
experiment: llm_society_v2
kind: llm_society_v2
base_model: Qwen/Qwen2.5-0.5B-Instruct
seed: 3
families: [strings, setops, numtheory, mixedtoken, digits, alphabet, prime, wordlen, roman]
agents: 9
generations: 12
arms: [full, no_grounding, no_sex, no_diversity]
g: 0.85
lam: 0.3
max_mate_use: 2
n_test: 27 # per family -> 243 overall (SE 0.032)
n_val: 13 # per family -> 117 (selection signal)
n_conf: 13 # per family, fresh each generation
k_inherit: 300 # per family, fresh each generation (C2b: k=300 is the main retention driver)
epochs: 3 # child SFT epochs (C2b)
conf_gate: 0.85 # confidence-gated inheritance, all arms (C2b mean retention 0.88; C3c: tight gate = 6-epoch retention at 3 epochs)
spec_train: 1200
spec_epochs: 3
resume: true
lora: {r: 16, alpha: 32}
output: {dir: results/llm_society_v2/s3}

View file

@ -0,0 +1,29 @@
# v2 society campaign, seed 4 (prereg tasks/prereg-llm-society-v2.md §3). The PBS array
# (hpc/llm_society_v2.pbs) derives one config per (seed, arm) from this template; running it directly
# runs all four arms sequentially (the local-GPU hedge).
#
# CALIBRATION-DEPENDENT FIELDS — set after gates C1/C2 pass, before submission:
# families : the 9 selected by stage A pass 2 (C1, gate 0.41) — SET
# k_inherit / epochs / conf_gate : from stage B (C2 + C2b), 2026-09-07 — SET
experiment: llm_society_v2
kind: llm_society_v2
base_model: Qwen/Qwen2.5-0.5B-Instruct
seed: 4
families: [strings, setops, numtheory, mixedtoken, digits, alphabet, prime, wordlen, roman]
agents: 9
generations: 12
arms: [full, no_grounding, no_sex, no_diversity]
g: 0.85
lam: 0.3
max_mate_use: 2
n_test: 27 # per family -> 243 overall (SE 0.032)
n_val: 13 # per family -> 117 (selection signal)
n_conf: 13 # per family, fresh each generation
k_inherit: 300 # per family, fresh each generation (C2b: k=300 is the main retention driver)
epochs: 3 # child SFT epochs (C2b)
conf_gate: 0.85 # confidence-gated inheritance, all arms (C2b mean retention 0.88; C3c: tight gate = 6-epoch retention at 3 epochs)
spec_train: 1200
spec_epochs: 3
resume: true
lora: {r: 16, alpha: 32}
output: {dir: results/llm_society_v2/s4}

View file

@ -0,0 +1,21 @@
# Smoke test for the v2 society loop: tiny everything, all four arms, resume exercised by the
# per-generation checkpoint. ~20 min on a 16 GB GPU. Exit 0 + figure renders = pass.
experiment: llm_society_v2_smoke
kind: llm_society_v2
base_model: Qwen/Qwen2.5-0.5B-Instruct
seed: 1
families: [lists, roman, binary, setops]
agents: 4
generations: 2
arms: [full, no_grounding, no_sex, no_diversity]
g: 0.85
lam: 0.3
n_test: 8 # per family
n_val: 5 # per family
n_conf: 5 # per family, fresh each generation
k_inherit: 20 # per family
epochs: 2
spec_train: 120
spec_epochs: 2
lora: {r: 16, alpha: 32}
output: {dir: results/llm_society_v2_smoke}