Skip to content

WIP: research animations suite (parked) - #2

Draft
glennmatlin wants to merge 9 commits into
mainfrom
glenn/socialtda-research-animations-de0a5a
Draft

WIP: research animations suite (parked)#2
glennmatlin wants to merge 9 commits into
mainfrom
glenn/socialtda-research-animations-de0a5a

Conversation

@glennmatlin

@glennmatlin glennmatlin commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Summary

Draft/WIP PR to park the rebased research-animations work so we can return to it later without losing the pipeline.

Status: not for merge yet. Animations are intentionally parked; site aesthetics/vibe work will happen on a separate branch off main.

What’s in this branch (rebased onto current main)

  • Agent handoff pack under docs/research-animations/ (briefs, claim guardrails, design system, claims YAML)
  • Shared runtime: palettes, SVG utils, timeline utils, animations.css, frame-capture tool
  • Five finished scenes with dev harnesses, QA notes, and export assets:
    • signature-bin sign flip
    • aggregation (noisy docs → 576 bins)
    • 2×2 benchmark design
    • targeted vs random unlearning
    • lexical bimodality
  • Site hygiene carried along for free: CDN SRI hashes; suppressive influence color orange → RdBu red (#B2182B)

Intentional non-goals for this PR right now

  • No homepage wiring of the new scenes
  • No further animation polish in this PR while website aesthetics work proceeds elsewhere

Test plan

  • Local: python3 -m http.server 8000 from repo root
  • Spot-check dev pages under public/animations/dev/
  • Confirm public/index.html still has Capabilibara footer + SRI on CDN tags
  • Confirm figure1 / figures.css use RdBu red for suppressive influence
  • When ready to finish: claim-guardrail pass + decide which exports land in the live site

First animation from the research-animation roadmap: SVG + GSAP scene
showing Literature × Customer Support as SocialIQA's extreme positive
bin (+16.0) flipping negative for both MMLU benchmarks, with values
single-sourced from a new shared data module transcribed from
socialtda_claims.yaml.

- Shared modules: socialtda-data.js, socialtda-palettes.js,
  socialtda-svg-utils.js under public/static/js/animations/
- Scene authored in final poster state; timeline animates toward it, so
  the reduced-motion/no-GSAP fallback equals the deterministic export
  frame; review mode strips public identifiers
- Dev harness at public/animations/dev/signature-bin.html with
  review/reduced/end/loop/square-crop toggles and bare capture modes
- Exports: 16:9 + square posters (PNG), MP4s (ffprobe-verified), GIF
- QA note with claim/value traceability, independent review record,
  and exact re-render commands
Pins integrity="sha384-..." and crossorigin="anonymous" on the
externally-loaded gsap, aos, font-awesome, and academicons assets so a
compromised CDN can't inject unverified content into the page.
- aggregation-animation.js: noisy documents -> 576-bin aggregation explainer
  (5 beats, 13.65s, seeded PRNG, authored-final-state poster frame); all
  values from socialtda-data.js, matrix shows the 4 selected bins x 4
  benchmarks from the claims panel
- socialtda-timeline-utils.js: extracted beat controls/seek/scene-API
  machinery (work order Task 1); signature-bin scene refactored onto it,
  behavior unchanged
- svg-utils: add spokenSigned (aria sign words) and formatInt
- dev page public/animations/dev/aggregation.html + QA note + exports
  (posters, 16:9 + square MP4, GIF)

Independent second-agent review: DONE, 0 blockers (see QA note).
orange #A14F00. Suppressive is now #B2182B, the ColorBrewer RdBu red: the
positive blue #2166AC, neutral #F7F7F7, and the site's existing light red
--infl-neg-lt #ef8a62 are already RdBu tokens, so the diverging scale is now
a single colorblind-safe palette, clearly separated from all four benchmark
colors.

Applied everywhere the color appears: animation palette module, site CSS
tokens/gradients, figure1.js (mix + captions), handoff design docs
(palette.json, DESIGN_SYSTEM.md, briefs 04/05 wording). All animation
exports (posters, MP4s, GIFs for signature-bin and aggregation) re-rendered
and playback re-verified; QA notes updated. Benchmark colors and the
unlearning damage ramp are unchanged.
- benchmark-design-animation.js: domain x capability matrix (axes -> chips
  land -> row/column contrast pulses -> end card), 9.8s; cell placement
  derived from BENCHMARKS domain/capability fields, nothing hard-coded
- exports reusable createBenchmark2x2() (plain SVG, parameterized, returns
  per-cell handles) for later scenes to embed as an inset
- guardrail addressed explicitly: caveat + aria state this contrasts
  provenance, not benchmark difficulty or model quality; no values shown
- dev page + QA note + full export set (posters, MP4s, GIF)
- check the shared frame-capture script into
  docs/research-animations/tools/capture-frames.mjs and point all three QA
  notes at it (was previously scratch-only; closes a re-render gap)

Independent second-agent review: DONE, 0 blockers (live-probed 8
mode/seek/loop combinations; see QA note for adjudication).
- socialtda-data.js: new UNLEARNING export, full transcription of
  unlearning.paired_influence_vs_random from the claims YAML (medians,
  CIs, Wilcoxon pBH, paired-t pBH, Cohen's dz, verdicts, n=72)
- targeted-random-unlearning-animation.js: topic splits into random
  in-topic vs influence-targeted selection lanes (stylized doc glyphs,
  seeded PRNG) -> shared unlearning box -> paired-difference forest plot
  (SocialIQA hero +0.016 CI [+0.013,+0.022], comparisons with CIs
  crossing/below zero and verdict badges) -> bounded end card; 14.2s
- guardrails: mixed/reversed results always visible; "partial validation"
  framing; caveat marks lane icons and selection as illustrative
- dev page + QA note + full export set (posters, MP4s, GIF)

Independent second-agent review: DONE, 0 blockers (forest-plot geometry
hand-recomputed and matched to the live DOM; see QA note for adjudication).
Independent review (DONE_WITH_CONCERNS) surfaced a data-honesty timing
issue: rank labels stayed legible for ~0.2s while cards began flying into
their (illustrative, seeded) islands, so a mid-split frame could read as a
per-bin claim like "#10 -> expository" that only the count is licensed to
make. Labels now fully fade before any card starts moving; a programmatic
sweep of the split window (t=2.6-5.0s, every 0.05s) confirms zero frames
show a moving card carrying a visible rank label.

Also: aria-label now derives every sign via spokenSigned/spokenSignedInt
(was hardcoded "plus") and drops the "average" wording. Motion exports
(MP4/GIF) re-rendered; poster frames unchanged (labels were already hidden
there). QA note updated with the adjudication.

A partial cross-animation audit (value/guardrail/architecture lenses across
all 5 scenes) ran clean on the animations it covered before hitting the
session limit -- 0 blockers/majors, only 3 nits; lexical + unlearning lenses
did not run and can be re-audited next session.
@glennmatlin
glennmatlin force-pushed the glenn/socialtda-research-animations-de0a5a branch from 7872667 to 88e8d85 Compare July 18, 2026 04:08
@glennmatlin glennmatlin changed the title Add signature-bin sign-flip animation (brief 05) WIP: research animations suite (parked) Jul 18, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant