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>
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>
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>
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>
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>
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>
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>
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.
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.
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>
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>
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>
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>
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>
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>
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.
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>
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>
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>
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>
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>
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>
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>
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>
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>
Consolidates provenance that was only in terse CSV source-tags + commit bodies:
per source, full citation + DOI/OSF URL + which table/figure + the exact data
transformation (Care-collapse, Brazil affine bias-cal, Australia raw-recompute).
Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
Computed from raw participant ratings in dat_rep.sav (OSF cmwpv, full 90-item
Clifford MFV, 1-5), using the author's own item->foundation map from the R
notebook. Complete-case N=756 reproduces the paper's abstract exactly. The
paper's headline is a genetic-algorithm-abbreviated MFV; we deliberately used
the FULL 90 items so Australia is comparable to the other full-instrument rows.
The paper's other sample (580 US MTurk) is skipped -- it would duplicate US.
Cloud now 7 -> 8. Fresh-eyes subagent reproduced all six means to <=0.0005.
Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
Models are now stars coloured by lab family instead of one Economist red, hue
chosen to echo the lab's home region: Chinese labs warm (qwen orange, deepseek
pink) near the East-Asia red, US labs cool (claude purple, gpt blue, gemini/gemma
sea blue, grok indigo, llama steel), Europe green (mistral). Legend keys each
family. Also drop the ' (rated)' tag from on-map labels and Nigeria from the
always-on landmarks (Egypt already anchors the African-Islamic corner).
Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>