Commit Graph
294 Commits
Author SHA1 Message Date
wassnameandClaude Opus 5 f6c22aca30 Measure how far each model sits from a human cluster, in cluster SDs
Lets a model be described as a 2.9 sigma member of the West instead of
"somewhere west of Silicon Valley". Signed per-axis z says which way and how
far on a named axis; Mahalanobis says how odd the placement is overall, and
uses the cluster covariance because the zones are elongated and tilted.

Reads the committed coords in wvs_model_ci.md rather than the coord cache,
so it reruns offline without re-querying seventeen models.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 14:22:35 +08:00
wassname 01e9026641 guided: expose top-k sampling control 2026-07-19 09:17:23 +08:00
wassname d665493119 guided: emit exactly one open think marker 2026-07-19 08:38:55 +08:00
wassnameandClaudypoo 00105855dc journal: random-baseline confound + raw per-choice output question (2026-07-17a)
Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
2026-07-17 14:28:35 +08:00
wassname 43349a3361 metrics: fail on invalid coherence inputs and unpaired rows 2026-07-16 08:20:29 +08:00
wassnameandClaudypoo a9a01327e7 Rename showcase readout dlogit->dclr to match steering-lite
The MFV foundation readout is centered log-ratio (clr), not a logit. Renames the
showcase JSON/CSV consumers' keys (dclr/dclr_sem) and the shared reader-space-shift
column to match steering-lite's writers; the survey 'C = logit contrast' readout
keeps its logit naming.

Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
2026-07-15 19:50:04 +08:00
wassnameandClaudypoo 7f873ffb42 Add shared gated_selectivity + si_flips metric
Canonical home (moralmaps.metrics) for the continuous coherence-gated selectivity
sel_gated = (on - 0.1*off)*coh^2 plus the behavioral si_flips cross-check, imported
(not re-forked) by steering-lite and j-steer so the definition can't silently
diverge. README Measurement section defines both. 4 unit tests.

Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
2026-07-15 19:50:04 +08:00
wassnameandClaudypoo 9237aa9faa readouts: add clr (centered log-ratio) categorical readout
Per-category selectivity needs a non-competitive readout. One-vs-rest
log-odds score_f - logsumexp(score_{j!=f}) has a logsumexp dominated by the
top category, so a steer concentrating evidence on one foundation mechanically
depresses every other foundation's one-vs-rest log-odds and fabricates
off-axis collateral -- a real selective steer then scores LESS selective than a
diffuse random poke (jsteer authority gate, job 95). clr_f = score_f - mean(score)
is gauge-free (kills the softmax normalizer) and spreads a single-category shift
as +(1-1/K)/-1/K, so genuine selectivity survives.

Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
2026-07-14 21:53:51 +08:00
wassnameandClaudypoo de5c1488c2 guided: drop stale comment claiming descs were shortened (they are verbatim Clifford options)
Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
2026-07-11 07:26:38 +08:00
wassnameandClaudypoo cfd334512a wvs_map: bake title + repo attribution inside the axes, add top headroom
Draw the title and github.com/wassname/moral-maps note in the empty bottom-left
INSIDE the axes so a crop can't strip attribution and there's no whitespace band.
Give the models overlay extra top headroom so the most-secular model stars and
their labels seat inside the frame instead of spilling above it. Regenerate PNG+SVG.

Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
2026-07-09 16:02:29 +08:00
wassnameandClaudypoo 48dcec6300 README: lift WVS hero map into the fold, add Economist reference, fix typos
Move the culture map up under the intro so it lands in the first screen; add a
paragraph crediting The Economist's June 2026 WVS map and its scatter between
model families, framing moralmaps' take as more sensitive graded readings + CIs
(no sample-size claim). Fix "ahve/make/build of" typos and an equation run-on.

Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
2026-07-09 16:02:29 +08:00
wassnameandClaudypoo 15d7bb8bb5 README: apply moralmaps rename; add steer-toward-human-values section, drop data-picked-axes maps
Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
2026-07-09 13:02:57 +08:00
wassnameandClaudypoo 469788c418 rename package tinymfv -> moralmaps (repo -> moral-maps)
Import name tinymfv -> moralmaps, pip name tiny-mfv -> moral-maps, GitHub
URLs wassname/tinymfv -> wassname/moral-maps. HuggingFace dataset id
wassname/tiny-mfv left as-is (separate namespace, published data artifact).
Historical docs/spec/* and RESEARCH_JOURNAL keep their dated paths.

Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
2026-07-09 10:41:49 +08:00
wassnameandClaudypoo ca76c0e05e title/bibtex/toml: 'moral and value maps for LLMs' (WVS-first, drop 'local'); WVS row in datasets table
Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
2026-07-09 10:23:13 +08:00
wassnameandClaudypoo d0aa9998b9 README: restore human-voiced opening (incl API rated-sampling reader), de-jargon 'instrument', name the wvs_map.py script, name surgical informedness, define every symbol in the Measurement math
Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
2026-07-09 10:17:29 +08:00
wassname a62ec8e47e README: intro instruments line in plainer words (every question from a real survey, ships with human answers) 2026-07-09 10:13:03 +08:00
wassnameandClaudypoo 28778a7af5 README: panel fixes (define activation steering, MFQ-2/binding-foundations glosses, file pointers for WVS axes, drop 'surgical-informedness view' coinage) + panel artifacts
Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
2026-07-09 10:11:26 +08:00
wassnameandClaudypoo 94dbb11797 README: fix alien claims to match the plots (openness+agreeableness low, not conscientiousness; sweep spans most of human range, not more than any country pair)
Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
2026-07-09 09:51:57 +08:00
wassnameandClaudypoo fa45701a6e Merge origin/main (07_multilabel max_tokens tweak; file since deleted in cleanup)
Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
2026-07-09 09:48:54 +08:00
wassnameandClaudypoo d178442de1 README: main-style opening (short pitch, instrument links, one WVS example item)
Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
2026-07-09 09:47:54 +08:00
wassnameandClaudypoo aaee9ae399 uv.lock: drop adjustText/textalloc (removed in 31b93ae)
Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
2026-07-09 09:47:54 +08:00
wassname b13e9a7457 v2 2D honesty x credulity grid plots (6 figures)
dS cosine=-0.0229, all 25 cells pmass=1.0, 0 NaN.
Honesty moves Social Norms/Fairness/Liberty; Credulity moves Social Norms/Authority/Sanctity.
2026-07-07 04:49:19 +08:00
wassnameandClaudypoo bb5edddbbb MFV: drop the culture map + quadrant, keep range vs pooled reference (invariance failure)
MFV country norms fail cross-country measurement invariance (Jimenez-Leal 2025: non-invariance + DIF,
'cross-cultural comparisons restricted') and are stitched from 5 studies, so the culture map/quadrant
drew false structure (inverted West vs Latin America). Delete plot_mfv_map + plot_mfv_value and the
value_coords_contrast/axis_contrast helpers; MFV keeps only the range plot, now against ONE pooled
human reference (mean of the 8 z-scored samples), no per-country identity. Add data-dir note + README
caveats citing the sources.

Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
2026-07-05 21:45:15 +08:00
wassnameandClaudypoo fdc4b137dd journal: MFV fails cross-country invariance (Jimenez-Leal 2025) -> drop MFV culture layer
Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
2026-07-05 21:34:41 +08:00
wassname 9f3e9ebea6 README: rewrite Measurement around the surgical view (coherence gate, profile, steer contrast C)
Replaces the vacuous 'measurement is the profile' opener with the intended-vs-unintended-while-coherent
framing: pmass/entropy as the coherence gate, the human-comparable profile (and why it hides steering),
and C the rank-centered logit contrast as the sensitive steer signal. Keeps the formulas.
2026-07-05 21:17:56 +08:00
wassname 968f419c6c README: add the WVS frontier-model map as the headline result (notes rated-sampling readout) 2026-07-05 21:04:35 +08:00
wassname b4f8cb2eec README: gloss steering, plainen figure alt-text and humor axes (external flash-panel review) 2026-07-05 20:23:57 +08:00
wassname be2e0890f8 README: restructure body (quadrant maps, then ranges, then PCA) and de-jargon
Group figures into three narrative sections instead of per-instrument boilerplate. Introduce moral
foundations and the steering knob in plain words; drop invented units (nat, reader-logit, % country SD)
for concrete comparisons. Intro paragraphs left as the user edited them.
2026-07-05 20:16:22 +08:00
wassname 922a6a9894 README: feature the quadrant (value) maps for MFQ-2/Big5/Humour, the clearest read 2026-07-05 20:11:56 +08:00
wassnameandClaudypoo 6bc2235156 docs: original WVS title (drop Economist headline), fold in China/global-South framing
Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
2026-07-05 19:32:27 +08:00
wassnameandClaudypoo 541434b80f maps: anchor orientation geographically (West->west, African-Islamic->south) on every map
One shared orient_geographic() helper folds axis signs into the coords (value maps) or into Vt
(ipsative PCA, so dots/haze/steer/compass all inherit one flip). Replaces the WVS-only invert_x hack;
every map now reads left/right the same way. Regenerate instrument showcase maps.

Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
2026-07-05 19:30:44 +08:00
wassnameandClaudypoo 8aa1e11e44 docs: range plots as newspaper small-multiples (plain-sentence captions, drop dash-fragments)
Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
2026-07-05 19:19:11 +08:00
wassnameandClaudypoo 8d04bfcdaa docs: humanise figure captions (Economist voice), lift MFV, add all range plots
Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
2026-07-05 18:39:00 +08:00
wassnameandClaudypoo 493f5335e3 docs: figures README with Economist-style captions; regenerate all maps
docs/img/README.md is a captioned gallery: each figure states what the dots are, the
named axes and their source paper, the readout (rated sampling N=12 for the frontier
panel, logprobs N=8 for the steering showcase), and for the steer the base model
(Qwen3-4B), the Authority PCA vector, and +c/-c directions. Regenerate all maps with the
edge-inset + roomier margins.

Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
2026-07-05 17:15:46 +08:00
wassnameandClaudypoo a7c1bab7e6 value maps: edge-inset labels + roomier margin so pole/edge labels don't clip the frame
allocate_labels now keeps a few px inside the axes (edge_pad), so a label pushed toward
the frame (e.g. Serbia against the Adaptive pole) can't render flush-clipped; and the
value-map margin goes 0.13 -> 0.17 so the pole signposts sit in a real inner margin.

Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
2026-07-05 17:15:45 +08:00
wassnameandClaudypoo 9f16db0bfb value maps: pole signposts are obstacles (keep-out band) so zone labels clear them
The four pole signposts (Adaptive / Self-directed ...) draw on the crosshair edges after
label placement, so a zone name near the frame collided with them (African-Islamic vs
Adaptive on the humor map). Feed each pole in as a short keep-out band of obstacle points.
Regenerate committed WVS + showcase maps.

Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
2026-07-05 14:28:19 +08:00
wassnameandClaudypoo 31b93aec57 maps: route every map through labelplace; drop textalloc + adjustText deps
plot_ipsative_pca (society codes + zone names + base/steer) and plot_range_zoom now use
labelplace.allocate_labels, the same placer as the WVS/value maps, so all maps read
alike: zone names hug their hull, points sit adjacent, short leader only when crowded.
Labels are collected then placed AFTER the crop so the pixel-space allocator sees the
final window. The compass rose is deterministic radial-outward (a rose is not a map --
the nearest-clear-slot search fought the radial layout). No map imports textalloc now.

Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
2026-07-05 14:21:01 +08:00
wassnameandClaudypoo 95a386054f labelplace: spacing_x 0.4 (tighter horizontal), record Tufte principles in docstring
Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
2026-07-05 14:21:00 +08:00
wassnameandClaudypoo e2e16fa377 labelplace: region labels hug the hull (nearest clear ring) + anisotropic marker spacing
Region labels maximised clearance, which fled to the FARTHEST open space -- the polygon
name ended up floating far from its hull. Instead take the nearest perimeter ring that
has a clear slot (emptiest spot on that ring), so the name hugs its own hull edge. Marker
spacing beyond the glyph is now anisotropic (spacing_x=0.5, spacing_y=0.3): text stacks
tighter vertically, so pull labels in more up-down than left-right. Marker clearance pad
is unscaled, so nothing lands on its own star. Re-render WVS + showcase.

Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
2026-07-05 14:01:11 +08:00
wassname 282f2c61c3 Add 2D honesty x credulity grid plotter
Renders the dream artifact: a 5x5 grid of MFV profile bar charts (one per
(hc, cc) cell), per-foundation dlogit heatmaps for MFV, per-factor C heatmaps
for ordinal instruments, and a pmass coherence heatmap. Reads the 2D-grid
profiles CSVs written by steering-lite's run_2d_grid_showcase.py.
2026-07-05 13:55:33 +08:00
wassnameandClaudypoo 90f1e4cabc showcase: regenerate value maps with the new labelplace allocator
The per-instrument value maps (big5/humor/mfq2) now route labels through
labelplace.allocate_labels: zone names in clear air (no white boxes), country
labels adjacent, steer path unchanged. Ipsative/range figures re-emitted from the
same run for a consistent set.

Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
2026-07-05 13:47:00 +08:00
wassnameandClaudypoo a219659c0f labelplace: region labels reach ~3 text-heights out so central hulls find clear air
Fresh-eyes QA caught the "East Asia" zone label hugging its (central, crowded) red hull
edge. Region labels only searched 0-0.9 text-heights off the perimeter; widen to 3.0 so
the clearance search can escape a surrounded hull into open space.

Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
2026-07-05 13:45:32 +08:00
wassnameandClaudypoo e11f278a60 wvs map: commit the rendered panel (png+svg+CI table) + drop stale "textalloc" doc refs
The 17-model IW map now renders through labelplace.allocate_labels; save the artifact
into the repo (png for viewing, svg for hand-editing labels, CI table as companion).

Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
2026-07-05 13:43:16 +08:00
wassnameandClaudypoo 6b5a44f0f3 maps: general anchor-set label placer (labelplace.py), region + marker in one pass
Each label owns a set of 1..N candidate anchor points: a marker label passes its
single point, a zone label passes its whole densified hull perimeter (densify_polygon
promotes the polygon PATH to points, since a hull stores only ~6 corners). Two obstacle
classes: hard (markers + placed labels, never covered) and soft (polygon edges, only
region labels avoid; marker labels wear a thin white outline and may cross). Region
labels maximise clearance over their perimeter -> emptiest open air, no white box, no
leader; marker labels take the nearest clear slot with a ~half-char gap and a leader
only when far. Runs in pixel space AFTER invert_xaxis so the try-every-side geometry
isn't mirrored (fixes the all-labels-drift-left bug). Adapted from textalloc + wassname's
plotly placer.

Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
2026-07-05 13:40:05 +08:00
wassnameandClaudypoo 8ef59aacc2 wvs map: textalloc (candidate placement) for point labels, hull-edge zones
Switch point labels back from adjustText (force-relaxation, local minima, sometimes
parks a label on its own marker) to textalloc, whose grid+candidate-box algorithm
tries slots on every side of a marker and takes the roomier one, off the marker,
with a leader only when it must reach. Keep _hull_label_pos (with outward ha/va) for
zone labels so they sit just outside the emptiest arc of their hull. Feed textalloc
the dots + sampled hull edges + zone-label spots so it dodges polygons too.

Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
2026-07-05 13:17:46 +08:00
wassnameandClaudypoo 13afb305ab wvs map: make adjustText polygon-aware via sampled hull-edge obstacles
Point labels (countries/models) now avoid sitting on a coloured hull line, not just
on a dot -- adjustText only knows points, so sample every other hull-boundary vertex
into its obstacle cloud.

Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
2026-07-05 13:04:07 +08:00
wassnameandClaudypoo aa675bc8de wvs map: zone labels hug the hull edge (no arrows) + flip X axis
Replace the fling-to-open-space-with-a-leader zone placement with _hull_label_pos:
walk the hull's own boundary vertices, nudge each slightly outward, and put the
label on the vertex whose nearest dot/label is farthest -- so the name sits against
an uncrowded arc of its own outline, no leader line. And flip X (invert_x) so
Self-expression is on the left and Survival on the right: this is a better map than
the Economist's, and it puts the cultural West on the left / East Asia on the right.

Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
2026-07-05 13:02:35 +08:00
wassnameandClaudypoo 88d9994c96 wvs map: emptiest-slot zone labels + one label per model family
Zone labels now get a dedicated open-space search (_open_slot: scan a ring around
the hull centroid, keep the slot whose nearest dot/label is farthest) instead of
adjustText's local minimum -- so Latin America/African-Islamic land in the sparse
margins with a leader to their hull, not the crowded centre. And with 17 models the
names were too many: plot every star but LABEL only the latest per family (highest
version), dropping the redundant 'claude-' so the flagship reads 'opus-4.8'. Colour
+ legend carry the unlabelled siblings.

Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
2026-07-05 12:54:00 +08:00
wassnameandClaudypoo e7810e4a0d maps: one adjustText pass for ALL value-map labels incl zone names
The zone names (Latin America, African-Islamic, ...) were nailed to their hull's
top vertex and bypassed the label allocator, so they landed in crowded spots while
open space sat nearby. Now every label -- country, model star, zone name, steer --
goes through a single adjustText call (force repulsion off the dots and each other,
leader lines), and each zone label is seeded at its hull's OUTWARD-most vertex so it
starts in the sparse margin. Also widen the family-colour hue spacing (grok now
near-black, clear of gpt blue; llama/gemini/gemma separated). textalloc stays for
the compass/range insets for now.

Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
2026-07-05 12:47:24 +08:00
wassnameandClaudypoo 576da38830 data provenance: inline at point-of-use, drop standalone SOURCES.md
Per feedback (brief + inline + where seen, not a shadow file):
- rm mfv_country_factors_SOURCES.md; MFV per-source citations+transforms now in
  read_human_mfv() docstring (deep detail stays in each row's commit body).
- instruments.py: one-line human_csv source per legacy dataset (mfq2/big5/16pf/humor)
  above _SPECS -- Atari 2023, OpenPsychometrics IPIP, Schermer 2020.
- value_axes.py: add years+DOIs to the custom-axis Sources block (Graham/Haidt 2009,
  DeYoung 2007, Atari 2023, Martin 2003, Inglehart-Welzel). iw_axes already documents WVS.

Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
2026-07-05 12:45:14 +08:00