WhatPRIMARY: Goldberg's 100 markers, used as published. SECONDARY: 40 drawn from the 2,818-word trait-descriptive adjective set (Condon 2022, built to subsume Goldberg's 1,710) by mpnet embedding + k-means + one random member per cluster at a recorded seed. THEN, for every trait in both sets, the teacher writes a CONSTITUTION -- a short document describing how that character thinks, speaks and behaves -- and the constitution, not the bare adjective, conditions all downstream generation.
GatePrimary verified against the published list. Secondary: 40, no primary overlap, seed recorded before the draw. Constitutions: one per trait, and any trait for which the teacher cannot write a coherent character description is DROPPED with its failed attempt logged.
StopIf more than 15 of 140 traits fail the constitution screen, the trait source is wrong and I stop rather than proceed with a thinned set.
WhyTwo changes, both Samuel's. Conditioning on a constitution rather than an adjective is what OCT actually does -- our previous pipeline showed the teacher a single word, which is another respect in which it was OCT-inspired rather than OCT. And the constitution doubles as the quality screen: a word that is not a disposition cannot be written up as a character, so the filter becomes semantic instead of lexical. My lexical attempt deleted 'virtuous' and kept 'lustful', which is what a keyword matcher does when asked to make a judgement.
1
Preference pairs
$24·0.3 d
WhatOne shared prompt pool. 500 pairs per trait for all 134 traits (9 of 140 constitutions were rejected in phase 0; 3 of those were Goldberg markers rejected on the dictionary rather than the personality sense of the word, and were restored with a disambiguating gloss), teacher writes amplifier and suppressor responses in one call.
GateEvery trait has all 500 prompts in identical order; byte-identical prompt list across traits, verified by reopening the written files.
StopA trait short of the full prompt list is DROPPED, not padded. If more than 10 drop, the prompt pool is wrong.
WhyIdentical prompts across traits is what makes two adapters differ by trait and nothing else. It is the assumption the whole geometry rests on.
What4 traits, the exact production config: Qwen3.5-4B, rsLoRA, all-linear targeting, rank 64, alpha 128, DPO beta 0.1, effective batch 32, 1 epoch. Learning rate is UNRESOLVED pending the rsLoRA scale decision -- see defaults.
GateSIX GATES, all must pass: (1) adapters contain LoRA weights for full-attention AND deltanet AND MLP, counts matching 8/24/32 layers; (2) model identity confirmed by tensor shape, not metadata; (3) rsLoRA actually took effect - config says true AND computed scale is alpha/sqrt(r); (4) trl actually runs against transformers 5.x, not merely resolves; (5) loss falls, accuracies rise, no NaN, peak GPU under card; (6) decomposition code loads the artefacts and the Gram computes.
StopANY gate fails and nothing downstream starts. This phase exists to be failed cheaply.
WhyEvery one of these six is a failure this project has already produced at least once, silently.
3
Null controls
$13·0.2 d
WhatThree kinds of non-trait adapter, all at matched norm: random A/B at LoRA init scale; adapters trained on SHUFFLED preference pairs (chosen/rejected swapped at random per row); adapters trained on pairs from a DIFFERENT trait than their label. PLUS persona cartography's own control: a constitution instructing the model to shift along NO trait dimension, with preference pairs formed by generation SEED rather than by trait (seed-1 chosen, seed-2 rejected) so there is no trait signal at all -- a fully trained adapter carrying nothing. (Random A/B adapters are constructed, not trained, so only the three trained kinds carry GPU cost: 20 traits each.)
GateNulls are computed and projected into the same PCA space as the real traits before any interpretation of the real structure happens.
StopIf the shuffled-pair nulls show the same factor structure as real traits, the pipeline is measuring something other than the trait and everything downstream is void.
WhyThis is the anchor. Without it, 'the components look meaningful' has no scale. It is also the cheapest possible way to discover the whole thing is an artefact. The seed-paired control is theirs and is better than my random-and-shuffled nulls: it goes through the identical pipeline with identical everything except that the preference has no trait content, so whatever it produces is exactly the pipeline's own contribution.
4
Ablations (subset, full pipeline)
$98·0.5 d
What20 traits, the COMPLETE pipeline including full-scale OCT stage 2, run across the ablation grid. Optimizer: Muon, Adam, AdamW, Lion, SGD. Learning rate and step budget crossed on the winning optimizer. Trait-selection scheme (Goldberg vs lexicon-sampled) as a further arm. Anchor wording as a further arm: the generic cross-trait anchor (default) against the enumerated form that names one marker adjective per Big Five factor, to measure how much recovered factor structure the wording buys.
GateA configuration is chosen on evidence, and the decomposition's conclusions are checked for stability across arms. If the conclusions swing with optimizer or LR, that instability IS the finding and the main sweep is re-scoped before it runs.
StopIf no configuration produces adapters that pass the behavioural gate, stop -- there is no point sweeping 100 traits at a setting that does not express traits.
WhyMoved BEFORE the main sweep at Samuel's direction, and he is right: the old order committed a hundred traits to a configuration nobody had validated, then asked the ablations about it afterwards. Running the full pipeline on 20 traits also serves as the timing measurement for the big OCT phase, so the estimate is replaced by a measurement before the money commits.
5
Main sweep (chosen config)
$22·0.5 d
What100 Goldberg traits at the configuration the ablations selected, full pipeline.
Gate100 adapters, provenance uniform (same base, same epochs, same rsLoRA flag), behavioural gate passes on a random sample of 20.
StopIf more than 20 of the sample fail to express their trait against base, stop and diagnose before decomposing.
WhyRuns AFTER the ablations, so the hundred traits are trained once at a setting chosen on evidence rather than once per guess.
Decision point on the OpenRouter pot: this phase costs $0 and is the phase that resolves the Modal/OpenRouter split in phases 7 and 8, so it is where a top-up is decided. Do not treat a $0 phase as low-stakes.
WhatPCA and factor analysis over the deltas. Reported BOTH aggregated and per module type, as standard output rather than as a later challenge. Text baseline from this run's own training data. Nulls plotted in the same space.
GateAggregate and per-module answers agree within 0.05, or the disagreement is the headline and is investigated before anything else proceeds.
StopNone - this is analysis, it costs nothing but CPU.
WhyThe aggregation choice was an unexamined default for months. Reporting both makes it a measurement instead of an assumption.
WhatSteer along principal components individually, and along COMBINATIONS of components. Matched random-direction controls at every dose. Judge scored, decontaminated.
GateRandom control at matched norm must produce measurably less trait movement than the real direction, or the doses mean nothing.
StopIf controls match the real directions, steering is not demonstrating what it claims.
WhyCombinations are the part nobody has tested: whether the components compose linearly in behaviour as they do in weight space.
8
Qualitative investigation
$25·0.7 d
WhatFor every component and factor: top and bottom loading traits, what distinguishes their training data, verbatim generations at each steering dose beside matched controls, and a written analysis that says what the component IS.
GateEvery claim in the written analysis points at a specific number or transcript.
StopNone.
WhyA component with a name and no evidence is a story. This is the part that turns numbers into an interpretation that can be argued with.
9
Secondary-set ablation
$10·0.3 d
WhatThe 40 lexicon-sampled traits through the identical pipeline, decomposed separately.
GateDoes structure appear at all, and does the text baseline behave as it does on the primary set?
StopNone - this is an ablation arm and a null result is informative.
WhyDemoted from co-equal cross-reference to one ablation arm at Samuel's direction. Its job is to test whether the primary result depends on Goldberg's curation.
10
Full OCT stage 2
$330·1.5 d
Requires explicit approval on the number before it starts.
WhatOpen Character Training at full scale using their MIT-licensed code: 10,000 self-reflection and 2,000 ten-turn self-interaction transcripts per persona, then SFT with stage 1 frozen. Stacked deltas decomposed alongside stage-1 deltas.
GateEXPLICIT APPROVAL ON THE NUMBER before this starts, plus phases 2-6 all clean. A one-trait timing run first to replace the throughput assumption with a measurement.
StopThis is 70% of the budget. If the timing run shows generation slower than assumed, re-cost and re-approve rather than proceeding.
WhyFull OCT across the main 100 at the chosen configuration. Cheaper than the earlier estimate because the 20-trait ablation has already measured the real throughput, so this is priced from a measurement rather than an assumption.
WhatStandalone write-up and interactive site for this experiment only, citing none of the previous corpus.
GateEvery number in it traceable to a results file.
StopNone.
WhySamuel's instruction: this is not a replication.