Semantic frames: figures, frequency audits, ring diagnosis, and the 14-frame audited library - #25
Merged
Merged
Conversation
ordering_frames.py now writes experiments/results/ordering_frames.json (recoverability r + peak layer per rung, |cos| matrices at L8/L12) so figures consume real run output instead of hand-entered cells. Fresh run replicates the recorded numbers (opinion .99@L4 ... color .28@L17; mean off-diag .043@L8, max .122). blog_frames_figs.py renders the solarized figures for the jjd.io post 'Meaning Has More Than Three Numbers'.
…color as a hue ring freq_control.py: zipf strongly encoded (r=0.92 @l0); 5/7 rungs orthogonal to it; space flagged (dir cos 0.21, labels corr -0.69 with zipf). freq_residual.py: space COLLAPSES residualized (0.886 -> 0.162 — it read word rarity); age survives (0.905 -> 0.828, peak moves L2 -> L14); material survives; opinion control no-op (0.992 -> 0.989). color_ring.py: hue is CIRCULAR — cos/sin readout R=0.72 @L18 vs naive linear 0.47; a*/b* 0.60/0.65; circularity emerges mid-stack (L0 ties). Same model: time is a line, hue is a ring — linear-vs-circular is per-concept and per-model (cf. Engels et al. 2405.14860). CANONICAL_FRAMES drops space (tombstone comment); bundled npz rebuilt (7 frames, 152KB, mean off-diag |cos| 0.043 -> 0.032 — the family got MORE orthogonal without the frequency probe in it); tests updated, 15 pass.
…e stays the lone casualty freq_audit_family.py audits CANONICAL_FRAMES directly (per-frame templates). number: label|zipf -0.37 but residualized 0.937 -> 0.976 (IMPROVES — vindicated; the ATOM claims stand). time +0.25, 0.944 -> 0.950. material- naturalness +0.51 (heaviest surviving label load), 0.921 -> 0.902. size control 0.981 -> 0.981 byte-identical (second no-op validation of the method). 11 frames audited total; space is the only kill.
certainty_frame.py: impossible(-3) <-> certain(+3), 22 words, template
'It is {w} that it happened.' Raw CV r 0.921 @L19 (late-stack — epistemic
status is computed deep). Both audit columns green: zipf-residualized
0.926; the certainty-specific MORPHOLOGICAL-NEGATION trap (a probe could
read IMpossible/UNlikely as a prefix detector) defeated by lexicon design
— UNdeniable/INdisputable sit at +3 — and prefix-residualized 0.934.
|cos| vs opinion 0.10: certainty is not Evaluation in epistemic costume.
Enrolled in CANONICAL_FRAMES; bundled npz rebuilt (8 frames, all audited;
mean off-diag |cos| 0.034, certainty max pair 0.110 vs opinion). Next:
wire the dial into the abstain machinery.
… frequency; density dies of it concreteness (Brysbaert norms, 80 nouns): 0.882 @L16, zipf-clean, orthogonal to opinion/size/certainty (max 0.04). animacy (37 nouns, size-balanced): 0.944 @L17, zipf-clean, cos vs size 0.02. Both meet the family bar. warmth_competence horse race: warmth 0.934@L13 clean; potency 0.952@L19 clean; competence raw 0.933 but zipf-residualized 0.628 (label|zipf +0.49 — wounded, needs a rebalanced lexicon). SCM axes are OBLIQUE to EPA, not reused: warmth|evaluation 0.31, competence|potency 0.42 — social judgment has its own directions with family resemblance. frame_algebra: weight 0.775@L10 zipf-clean and nearly orthogonal to size (0.15 — heavy != big, extending the magnitude separation). But DENSITY dies the space death (0.673 raw -> -0.002 residualized, label|zipf +0.70) so the composition test is INVALID pending a frequency-clean density lexicon (material_investigate's naturalness/density words recovered 0.93 — reuse those). Control clean (opinion->span 0.03).
… weight is a primitive
concreteness (80 Brysbaert nouns, 0.882@L16) and animacy (37 size-balanced
nouns, 0.944@L17) join CANONICAL_FRAMES; npz rebuilt (10 frames, 219KB,
mean off-diag |cos| 0.031, max 0.116=animacy.age). 'metallic' projects
animacy -7.0 — the library knows metal is not alive.
frame_algebra v2 with the legitimate material-noun density (0.927@L24 raw,
zipf-res 0.677 — frequency-entangled but alive, unlike the adjective
lexicon that died): cos(weight, span{size,density}) = 0.224 vs control
0.04-0.07. Weight is NOT a linear composition — the panel is a coordinate
system of independent primitives, not a vector algebra. Caveat: weight ~
size x density is multiplicative; a bilinear test remains open. Kill-law
refined: deaths at |label-zipf| >= .69, haircuts in the .49-.59 band.
depth_gradient.py (13 frames, residualized peaks): lexicon-concreteness vs depth is r=-0.03 — the vocabulary hypothesis is DEAD (opinion, the most abstract vocab, peaks L1; animacy, the most concrete, peaks L17). Age's honest peak L14 also breaks adjective-rung monotonicity. Surviving story (post-hoc): lexically-coded word features early, relational/world- knowledge properties late (animacy/certainty/potency/time L16-20). bilinear_weight.py (2x2 object factorial): no linear composition at the direction level, but GENUINE bilinear composition at the coordinate level — dR2 +0.09@L8 -> +0.19@L16; cell means show size matters only for DENSE objects (big balloon ~ small balloon; anvil >> coin). The weight coordinate behaves like felt heaviness, not log(mass). competence v2: rebalanced lexicon (common negatives, rare positives) label|zipf +0.49 -> +0.02; raw .926 res .925 — haircut closed. Honest peak moves L13 -> L20, joining potency in the deep social-power cluster. Horse-race conclusions unchanged (oblique to EPA).
…rary All four ship-grade from the sweep: warmth 0.934@L13; competence v2 (zipf-rebalanced, +0.02) 0.926/0.925@L20; potency 0.952@L19 (completes the EPA trio with opinion/Evaluation); weight 0.775@L10 (felt heaviness, bilinear with size x density). npz rebuilt: 14 frames, 307KB, mean off-diag |cos| 0.037 over 91 pairs; the only cell >0.2 is competence-potency 0.344 — the documented oblique-social finding.
jdonaldson
added a commit
that referenced
this pull request
Jul 5, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The full frame-family science arc:
Blog post (published + corrected same-day): https://jjd.io/posts/semantic-frames.html