Written entirely by Claude, as a working record for agents more than for human readers: every number with its source file, and every claim since withdrawn. Some facts here may be out of date; where it disagrees with the post, trust the post. For the readable version, see the companion.
The anchor block and its 2026-08-19 revision
Every constitution carries a cross-trait anchoring paragraph; the original enumerated one Goldberg marker per Big Five factor, which could have manufactured the result under test, and was replaced by a generic block with the enumerated form retained as an ablation arm.
Every accepted constitution ends with a fixed anchor block appended verbatim.
Its job is to make the delta trait-specific: hold everything else about yourself
at baseline. qwen35/paper_notes.md section 3.4 traces the idea to
Persona Cartography (Baines et al., 2026), whose constitutions reproduce the other four OCEAN
traits in full with "do not amplify OR suppress any of these"; this project had
no OCEAN basis to anchor against, so it used a short clause instead.
The problem with the first version
The original block ended with an enumeration
(qwen35/anchor_constitutions.py, quoted there verbatim):
You are not more talkative, warmer, more anxious, more careful or more imaginative than you would otherwise be, except where that follows directly and unavoidably from the trait described above.
Those five adjectives are one Goldberg marker per Big Five factor:
| adjective | factor |
|---|---|
| talkative | Extraversion (I) |
| warm | Agreeableness (II) |
| anxious | Emotional Stability (IV, reversed) |
| careful | Conscientiousness (III) |
| imaginative | Intellect/Openness (V) |
The script states the objection plainly: naming one marker per factor in every training document "hands the model the exact five-dimensional frame the experiment is supposed to discover", and because the clause is conditional per trait it is "a per-trait push toward one named axis and away from the other four -- precisely the structure the analysis then reports as an emergent finding. It could manufacture the result under test, and it would do so in the flattering direction."
It also records that the enumeration was this project's own wording, not inherited: Persona Cartography enumerates the other four OCEAN dimensions, but its trait basis is OCEAN and it never tests for OCEAN emergence, so the same sentence carries no circularity there.
The two blocks, verbatim
ANCHOR_GENERIC (the current default constitution):
Hold everything else about yourself at your normal baseline. This trait is one facet of you, not your whole character: do not amplify or suppress any other disposition to make room for it, except where that follows directly and unavoidably from the trait described above. Where it does not follow, stay exactly as you were.
ANCHOR_ENUMERATED (retained as constitution_enumerated):
Hold everything else about yourself at your normal baseline. This trait is one facet of you, not your whole character: do not amplify or suppress any other disposition to make room for it. You are not more talkative, warmer, more anxious, more careful or more imaginative than you would otherwise be, except where that follows directly and unavoidably from the trait described above. Where it does not follow, stay exactly as you were.
Both are preceded by a blank line so they read as their own paragraph. The
enumerated block is recorded as 437 characters with SHA-256
b860a501902bc00f2448a660b7aa3dd8ffba0625a1f620c785a4db2809ca5f27
(qwen35/anchor_constitutions.py:ENUMERATED_SHA256, ENUMERATED_LEN). It is
derived from the file at import time as the common suffix after
constitution_unanchored, then checked against that hash, rather than retyped —
the script's stated reason being that retyping "is exactly how an 'identical'
ablation arm silently drifts".
The provenance note stored on every migrated entry
(qwen35/constitutions.json#Warm.anchor):
generic anchor, swapped 2026-08-19: the previous block enumerated one marker adjective per Big Five factor, which risks manufacturing the factor structure under test; enumerated form retained in constitution_enumerated as a phase-4 ablation arm
Why the script exists at all
The anchoring step was originally "run ad hoc and left NO SCRIPT ON DISK"
(qwen35/anchor_constitutions.py docstring). Since the anchored text is what
every adapter is trained on, an unreproducible preprocessing step meant the
training corpus could not be regenerated from source. The script closes that: it
runs read-only by default, recomputing both derived fields for every accepted
entry and asserting byte-identity with the file, and exits nonzero on any
mismatch. --write performs the migration. The rule it encodes, stated as
derived empirically rather than from memory: both derived fields are plain
concatenation, no strip, no normalisation, no trait-name interpolation, and each
block is byte-identical across all 131 accepted traits at the time.
The two backups tell the order of revisions
Both files in qwen35/backups/ hold 140 entries with 9 rejections, so both
predate the sense re-screen (The six refused traits):
| file | fields on an accepted entry | state it captures |
|---|---|---|
constitutions.json.pre-generic-anchor.bak |
constitution, constitution_unanchored, anchor |
before the swap: constitution is unanchored + enumerated |
constitutions.json.pre-goldberg-senses.2026-08-19T191500.bak |
constitution, constitution_unanchored, constitution_enumerated, anchor |
after the swap, before the three sense re-screens |
So the sequence on 2026-08-19 was: generate 140 with the enumerated anchor → back up → migrate to the generic anchor and keep the enumerated form as a fourth field → back up → re-screen Verbal, Prompt and Complex and merge them in with the same four-field schema. The current file adds the four alignment traits and the three hole traits on top.
The discarded data directory
qwen35/data_ENUMERATED_ANCHOR_DISCARDED_2026-08-19/ is the pair-generation
output made under the enumerated anchor before the swap. It holds _raw/ shards
for 131 traits and two assembled files, extraverted.jsonl and talkative.jsonl,
of 4 rows each; _usage.json records 8 calls over 2 traits at 4 pairs apiece and
estimated_cost_usd 0.002342. It is a smoke run, not a corpus — the directory
name records that the anchor changed underneath it and the data were discarded
rather than reused.
The enumerated ablation arm ("phase 4") is not among the trained arms recorded in
qwen35/phase2_runs/; whether it was ever run is a gap.
Sources
qwen35/anchor_constitutions.pyqwen35/constitutions.jsonqwen35/backups/constitutions.json.pre-generic-anchor.bakqwen35/backups/constitutions.json.pre-goldberg-senses.2026-08-19T191500.bakqwen35/data_ENUMERATED_ANCHOR_DISCARDED_2026-08-19qwen35/paper_notes.md