Experiment plan

Persona geometry in Qwen3.5-4B

A fresh standalone experiment, not a replication: 12 phases, each with its own cost, its own entry gate, and its own stopping condition.

Planned total $759 $572 direct + $187 contingency (35%)
Budget ceiling $1,000 $241 unallocated
Largest phase $330 58% of direct cost · phase 10
Compute time 6.0 d across 12 phases

The question is whether a personality trait, trained into a model as a low-rank weight update, occupies a location in weight space that means something — whether traits sit in a structured geometry that reflects how personality actually decomposes, or merely re-encode the statistics of the text used to train them.

Everything here is designed to make that question falsifiable rather than suggestive. Null controls are projected into the same space as the real traits before any structure is interpreted. A text-only baseline is computed as standard output rather than produced when challenged. Ablations test whether conclusions survive a change of optimizer or learning rate.

Each phase names its own cost, the check that must pass before the next phase starts, and the condition under which spending stops. The budget has brakes rather than a single ceiling.

The sequence

Phases run in order. Every connector carries a gate: a check on the phase that just finished, which must pass before the next one starts.

Phase flow, 12 phases in sequence Phases 0 to 11 run in order; each connector carries a gate that must pass before the next phase starts. Phase 10 requires explicit approval on its cost of $330. 0 $4 Trait sets 1 $24 Preference pairs 2 $6 Test run 3 $13 Null controls 4 $98 Ablations (subset, full 5 $22 Main sweep (chosen config) 6 $0 Decomposition 7 $35 Steering 8 $25 Qualitative investigation 9 $10 Secondary-set ablation 10 $330 Full OCT stage 2 approval required 11 $5 Writeup 0 $4 Trait sets 1 $24 Preference pairs 2 $6 Test run 3 $13 Null controls 4 $98 Ablations (subset, full pipeline) 5 $22 Main sweep (chosen config) 6 $0 Decomposition 7 $35 Steering 8 $25 Qualitative investigation 9 $10 Secondary-set ablation 10 $330 Full OCT stage 2 — approval required 11 $5 Writeup
  • Gate — must pass before the next phase starts
  • Phase 10 — explicit approval on the number
Table view — phases in run order
PhaseCostGate to enter the next phase
0 · Trait sets$4gate on phase output
1 · Preference pairs$24gate on phase output
2 · Test run$6gate on phase output
3 · Null controls$13gate on phase output
4 · Ablations (subset, full pipeline)$98gate on phase output
5 · Main sweep (chosen config)$22gate on phase output
6 · Decomposition$0gate on phase output — DECISION POINT on the OpenRouter pot
7 · Steering$35gate on phase output
8 · Qualitative investigation$25gate on phase output
9 · Secondary-set ablation$10gate on phase output
10 · Full OCT stage 2$330explicit approval required
11 · Writeup$5gate on phase output

Where the money goes

Cost per phase in run order, on a common zero baseline. Phase 10 costs more than the other eleven phases put together — which is why it is the only one behind an approval gate rather than a technical one.

0 $100 $200 $300 $400 0 Trait sets $4 1 Preference pairs $24 2 Test run $6 3 Null controls $13 4 Ablations (subset, full pipeline) $98 5 Main sweep (chosen config) $22 6 Decomposition $0 7 Steering $35 8 Qualitative investigation $25 9 Secondary-set ablation $10 10 Full OCT stage 2 $330 approval required 11 Writeup $5 0 $100 $200 $300 $400 0 Trait sets $4 1 Preference pairs $24 2 Test run $6 3 Null controls $13 4 Ablations (subset, full pipeline) $98 5 Main sweep (chosen config) $22 6 Decomposition $0 7 Steering $35 8 Qualitative investigation $25 9 Secondary-set ablation $10 10 Full OCT stage 2 $330 approval required 11 Writeup $5
  • Proceeds on the phase’s own gate
  • Phase 10 — requires explicit approval on the number
Table view — cost per phase

How the spend is watched

Approving the money and approving the metering are the same decision, so both are here. Spend is tracked cumulatively against the $1,000 ceiling rather than per day, because a day-rate alarm inside an approved plan only reports that the approved thing is happening. Each phase records its actual cost against its estimate when it closes. A phase crossing twice its estimate is escalated while there is still a decision to make about it, rather than at three times when there is not. And any vendor spend with no phase attached is escalated on sight — every other category on this page has already been agreed, so unattributed spend is the only kind nobody has said yes to.

Wall clock

The 6.0-day figure quoted on this page only adds up that way if the phases run strictly one after another, with a human turnaround between each. Run at full fan-out the actual compute is roughly 12–16 hours. What sets that floor is not the total work but a five-link serial chain that nothing can overlap, so the thing to watch is how fast each gate gets answered.

Against the ceiling

The plan commits $759 of the $1,000 available. The contingency is reserved, not spent; the headroom is neither.

$572 Direct phase costs $187 Contingency (35%) $241 Headroom to ceiling $1,000 ceiling $572 Direct phase costs $187 Contingency (35%) $241 Headroom to ceiling $1,000 ceiling

Darkest to lightest: committed, reserved, unallocated.

Table view — budget against the ceiling
AllocationAmountShare of ceiling
Direct phase costs$57257%
Contingency (35%)$18719%
Planned total$75976%
Headroom to ceiling$24124%
Ceiling$1,000100%

Two constraints, not one

The ceiling above is not the only limit on this plan, and it is not the tightest one. A second limit sits underneath it: the OpenRouter account the judging and generation calls are actually billed to. They are different kinds of thing — one is permission, the other is a balance — and being inside one says nothing about the other.

Approval ceiling — permission $1,000 ceiling $572 planned · 57% of the ceiling · $428 of room OpenRouter pot — account balance $153.38 pot up to $93 exposed · 61% of the pot · $60.38 left Approval ceiling — permission $1,000 ceiling $572 planned · 57% of the ceiling · $428 of room OpenRouter pot — account balance $153.38 pot up to $93 exposed · 61% of the pot · $60.38 left
  • Committed, or certain to be drawn (3 pure-OpenRouter phases)
  • Possible — the 2 mixed phases, whose Modal/OpenRouter split is unknown until phase 6
  • Remaining

Two scales, deliberately: compare the fills, not the lengths. The ceiling is a little over half committed; the pot is nearly full at the top of its range.

Table view — the two constraints
ConstraintLimitCommitted / exposedFilled
Approval ceiling (permission)$1,000$572 planned57%
OpenRouter pot (bin/spend-watch, 2026-08-20 07:34)$153.38$33 certain, up to $9361%

Schedule

Cumulative compute days. The whole plan is 6.0 days; the approval gate falls at day 3.8, with 58% of the direct cost still unspent behind it.

0 d 1 2 3 4 5 6 approval gate · day 3.8 0 Trait sets 0.2d 1 Preference pairs 0.3d 2 Test run 0.3d 3 Null controls 0.2d 4 Ablations (subset, full pipeline) 0.5d 5 Main sweep (chosen config) 0.5d 6 Decomposition 0.3d 7 Steering 0.5d 8 Qualitative investigation 0.7d 9 Secondary-set ablation 0.3d 10 Full OCT stage 2 1.5d 11 Writeup 0.7d 0 d 1 2 3 4 5 6 approval gate · day 3.8 0 Trait sets 0.2d 1 Preference pairs 0.3d 2 Test run 0.3d 3 Null controls 0.2d 4 Ablations (subset, full pipeline) 0.5d 5 Main sweep (chosen config) 0.5d 6 Decomposition 0.3d 7 Steering 0.5d 8 Qualitative investigation 0.7d 9 Secondary-set ablation 0.3d 10 Full OCT stage 2 1.5d 11 Writeup 0.7d
  • Proceeds on the phase’s own gate
  • Phase 10 — requires explicit approval on the number
Table view — schedule in days

The phases

Gate is what must be true to move on. Stop is the condition under which spending halts rather than continues.

0

Trait sets

$4·0.2 d

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.

2

Test run

$6·0.3 d

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.

6

Decomposition

$0·0.3 d

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.

7

Steering

$35·0.5 d

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.

11

Writeup

$5·0.7 d

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.

What would make this fail

Each of these is a stopping condition the plan already names, not a new worry. Any one of them makes the headline claim unsupportable.

A fifth outcome is not a failure but a brake: if phase 10’s one-trait timing run shows generation slower than assumed, the phase is re-costed and re-approved rather than started.