296 Commits
Author SHA1 Message Date
wassnameandClaude Opus 5 9efd9ca8e6 Correct alt-text claims that did not match the plots
Checked each PNG against its alt text. Wrong: c=-1 on the MFQ-2 map is
mildly individualizing, not far; the nearest labelled dot to c=+1 is UAE;
liberty moves 0.45 on MFV, not under 0.3; the top aggressive country is
Malaysia at 3.0, so the model is above every country there. Softened the
humor overlap and Big Five "vertical only" claims, added the
proportionality mover the MFQ-2 alt skipped.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 14:36:59 +08:00
wassnameandClaude Opus 5 c762fce103 Put the outlier table in the README and number-bearing alt text on the plots
Every plot's numbers lived only in the pixels, so a text scraper or an LLM
reading the repo saw nothing. Also drops the "more self-expressive than
almost any country" claim: none of the 17 passes Iceland, and against the
West they average about zero on that axis. The displacement is vertical.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 14:23:29 +08:00
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