Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
304 commits
Select commit Hold shift + click to select a range
d987a7d
docs: rebuild gallery+API under 2.0 API (figure-return, no geo); fix …
jeremymanning Jul 4, 2026
a57548a
docs: Playwright visual verification of built docs + PR evidence
jeremymanning Jul 4, 2026
764e6d7
fix: address whole-branch review findings (load dict-arg crash + 4 mi…
jeremymanning Jul 4, 2026
346ddc6
fix(plot): zoom out animated plots slightly so the bounding box is ne…
jeremymanning Jul 4, 2026
a16cf34
fix(plot): exclude animation trails from the legend (no duplicate ent…
jeremymanning Jul 4, 2026
bb12cd8
fix: address 6 bugs surfaced by open-issue triage against dev-2.0
jeremymanning Jul 4, 2026
fa8a643
docs: regenerate animated gallery with the anim zoom-out + legend fix
jeremymanning Jul 4, 2026
538db81
docs(notes): issue-triage catalog + animation-fix PR evidence
jeremymanning Jul 4, 2026
c4abaee
fix(ci): Windows dw import, mpl-3.11 canvas access, and robust legend…
jeremymanning Jul 4, 2026
4b5048e
test: pixel-based regression for wide-legend clipping (saved image)
jeremymanning Jul 4, 2026
9433f99
docs: regenerate legend gallery examples with the widen-to-fit legend…
jeremymanning Jul 4, 2026
0617424
docs(notes): session log for CI-green + legend fixes + dw#32 coordina…
jeremymanning Jul 4, 2026
fb1cb03
fix(ci): keep animated figures open on show=False; harness uses retur…
jeremymanning Jul 4, 2026
80470fd
deps: require pydata-wrangler>=0.5.1 (Windows import fix released ups…
jeremymanning Jul 4, 2026
92110f4
docs(notes): round-2 CI fixes (animated-close exemption, harness, dw …
jeremymanning Jul 4, 2026
e3530a6
chore: renumber release 2.0 -> 1.0 (version, docs, branches, artifacts)
jeremymanning Jul 5, 2026
17e1bf5
docs(notes): round-3 log β€” 2.0 -> 1.0 renumber, branch renames, PR #2…
jeremymanning Jul 5, 2026
ecacef7
plan: hyp.predict + hyp.impute implementation plan (GH #169)
jeremymanning Jul 5, 2026
7db0771
feat(predict): Forecaster base + GH#169 t semantics
jeremymanning Jul 5, 2026
a61179b
plan(predict): return_model=(result, fitted) contract, reusable on ne…
jeremymanning Jul 5, 2026
6922ff5
feat(predict): Kalman, GaussianProcess, AutoRegressor forecasters
jeremymanning Jul 5, 2026
6e4a18c
feat(predict): ARIMA + skaters Laplace forecasters
jeremymanning Jul 5, 2026
c45450b
feat(predict): Chronos forecaster + hyp.predict dispatcher with retur…
jeremymanning Jul 5, 2026
45f65ad
feat(impute): PPCA/sklearn/Kalman imputers + hyp.impute dispatcher (G…
jeremymanning Jul 5, 2026
df68b5a
feat(plot,analyze): predict= and impute= integration
jeremymanning Jul 5, 2026
912ac84
deps: [predict] and [predict-hf] extras; predict deps in dev + doc bu…
jeremymanning Jul 5, 2026
4d264df
fix(plot): scale forecasts into the plot frame (2D+3D)
jeremymanning Jul 5, 2026
0de6b21
docs(gallery): plot_predict + plot_impute examples; predict/impute AP…
jeremymanning Jul 5, 2026
1081ef6
docs(gallery): plot_predict uses helical data so forecasts are visible
jeremymanning Jul 5, 2026
0e313a0
docs(tutorials): stock forecasting tutorial (real yfinance data, hone…
jeremymanning Jul 5, 2026
2eda5b9
docs(tutorials): Kalman projectile tutorial (real SportVU jump-shot arc)
jeremymanning Jul 5, 2026
4585987
docs(notes): #169 implemented (hyp.predict + hyp.impute) -- move to f…
jeremymanning Jul 5, 2026
bbb96b4
docs: build gallery with plot_predict + plot_impute (and 1.0-rename r…
jeremymanning Jul 5, 2026
04c10e2
fix(predict,format_data): GP forecasts extrapolate trends; align df c…
jeremymanning Jul 5, 2026
18a6d91
docs: regenerate plot_predict gallery (trend-extrapolating forecasts)…
jeremymanning Jul 5, 2026
8d424e0
fix(plot): colors= kwarg was a no-op unless color= also passed (GH #142)
jeremymanning Jul 5, 2026
26dec4f
fix(plot): linestyles=/markers= aliases were no-ops without singular …
jeremymanning Jul 5, 2026
f150750
feat(io): complete hyp.load -- Drive large files, Excel, Sheets CSV, …
jeremymanning Jul 5, 2026
9aff4c5
fix(io): scope trust-policy re-raise to HypertoolsTrustError, not all…
jeremymanning Jul 5, 2026
8adedc9
feat(plot): colorbar support for continuous hue and discrete groups (…
jeremymanning Jul 5, 2026
be1e44d
feat(plot): mesh utilities for smooth convex-hull surfaces (GH #109)
jeremymanning Jul 5, 2026
4ef198c
feat(plot): smooth convex-hull surfaces with lighting, dict API (GH #…
jeremymanning Jul 5, 2026
30dac24
fix(plotly): trail frame updates tracked by explicit trace indices, n…
jeremymanning Jul 5, 2026
7766a5e
docs(examples): surface-morph demo showcasing hull surfaces (GH #109)
jeremymanning Jul 5, 2026
f8e8bfe
feat(plot): subtle KDE density shading, off by default (GH #108, GH #…
jeremymanning Jul 5, 2026
c805b26
fix(density): wire levels knob, validate option values (GH #108)
jeremymanning Jul 5, 2026
15e9753
feat(animate): per-dataset chemtrails/precog/bullettime (GH #127)
jeremymanning Jul 5, 2026
85f263d
feat(plot): MultiIndex DataFrames -- leaf traces + per-level averages…
jeremymanning Jul 5, 2026
188b63a
fix(multiindex): warn on list-input bypass, error on predict= combo, …
jeremymanning Jul 5, 2026
db9edfe
fix(surface): plotly opaque-color blend + mesh/marker occlusion fixes…
jeremymanning Jul 6, 2026
925e0b4
fix(surface): contain meshes within axes cube; clean plotly intersect…
jeremymanning Jul 6, 2026
fd064aa
fix(surface): plotly surfaces use precomputed vertex shading (matches…
jeremymanning Jul 6, 2026
fcd8f96
fix(colorbar,multiindex): top-level colorbar segments; legend fitting…
jeremymanning Jul 6, 2026
4fd9e65
fix(density): auto-boost 3D shell/volume opacity for small-in-scene c…
jeremymanning Jul 6, 2026
a5be240
fix(animate): warn + skip trail styles under spin/serial modes (GH #127)
jeremymanning Jul 6, 2026
3d320c4
docs(examples): gallery examples for surfaces, density, colorbars, Mu…
jeremymanning Jul 6, 2026
61bf92a
docs: regenerate gallery with new examples; fix morph animations' fig…
jeremymanning Jul 6, 2026
3861ca6
docs: track impute/predict api stubs (match module-stub convention); …
jeremymanning Jul 6, 2026
eaf7fca
notes: move #108/#191 to fixed list, drop duplicate #109 leave-open r…
jeremymanning Jul 6, 2026
c0eff29
fix(surface): tight hulls β€” no blanket inflation, bounded containment…
jeremymanning Jul 6, 2026
d39a4ef
fix(tests): version-robust Poly3DCollection vertex extraction (_vec/_…
jeremymanning Jul 6, 2026
c8af7b5
feat(meshutil): hull-hugging smoothing β€” pull smoothed verts back to …
jeremymanning Jul 6, 2026
b52b5b8
feat(animate): morph animation style β€” Hungarian point-cloud morphs b…
jeremymanning Jul 6, 2026
e1df010
docs(examples): shape morphs use first-class animate='morph' (+surfac…
jeremymanning Jul 6, 2026
b6074f7
fix(morph): size axes cube from union-hull mesh so surfaces stay insi…
jeremymanning Jul 6, 2026
d71da01
fix(morph): size surface box from sampled/union meshes only; correct …
jeremymanning Jul 6, 2026
f3e044b
fix(morph): untagged datasets render fully in mpl mixed-tag morph ani…
jeremymanning Jul 6, 2026
987fb5e
docs: regenerate gallery β€” morph demos as animate='morph' videos; hul…
jeremymanning Jul 6, 2026
488b929
notes: round-3 session log (morph animation + tight hulls)
jeremymanning Jul 6, 2026
e7becfe
fix(tests): widen meshutil runtime guard for slow CI runners (0.5s ->…
jeremymanning Jul 6, 2026
108c08b
fix(morph): constant rotation speed β€” segment duration proportional t…
jeremymanning Jul 6, 2026
ec4d5fa
fix(plotly): marker sizes calibrated to matplotlib; more transparent …
jeremymanning Jul 6, 2026
0eac418
fix(surface): remove orphaned roughness/fresnel lighting keys, add li…
jeremymanning Jul 6, 2026
188d301
docs: regenerate gallery β€” constant-speed morph videos + recalibrated…
jeremymanning Jul 6, 2026
4f68689
docs: refresh spin.gif build artifact from gallery re-execution
jeremymanning Jul 6, 2026
b8c4bbe
test(morph): add bbox-margin regression guard for all animate styles …
jeremymanning Jul 6, 2026
b461fee
fix(animate): render correctly at any save dpi (sphinx-gallery gif th…
jeremymanning Jul 6, 2026
a3df5cd
feat(morph): full-sample morphs β€” duplicate to largest dataset, hide …
jeremymanning Jul 6, 2026
9aa5c85
docs: regenerate all animated gallery examples β€” correct gif thumbnai…
jeremymanning Jul 6, 2026
3d5d79a
fix(tests): CI-robust manager-restore ordering + explicit Agg canvase…
jeremymanning Jul 6, 2026
d8e37c0
test(animate): add chemtrails/PCHIP-overshoot regression guard (no so…
jeremymanning Jul 6, 2026
06dfbff
fix(animate): 3D scene artists unclipped in all animation paths (axes…
jeremymanning Jul 6, 2026
1487435
docs: regenerate animated gallery media (axes-box slicing fix)
jeremymanning Jul 6, 2026
91d3fab
docs: evidence images rebuilt from CURRENT media at worst-angle frames
jeremymanning Jul 6, 2026
224b56f
feat(plot): multibyte character support -- auto font detection + font…
jeremymanning Jul 7, 2026
dfb2529
feat(plot): multibyte support for the plotly backend + CI font provis…
jeremymanning Jul 7, 2026
2656825
feat(plotly): labels= point annotations (parity with matplotlib; GH #…
jeremymanning Jul 7, 2026
28fb7e7
fix(tests): use Unicode noncharacters for the no-covering-font path (…
jeremymanning Jul 7, 2026
3148856
fix(fonts): exclude universal-fallback/placeholder fonts from coverag…
jeremymanning Jul 7, 2026
b87e635
fix(colorbar): discrete segments read in legend order (GH #100 follow…
jeremymanning Jul 7, 2026
bf33a54
test: procrustes non-default-parameter coverage + weak-assert audit f…
jeremymanning Jul 7, 2026
029ed07
fix: use isinstance for type checks throughout (GH #209)
jeremymanning Jul 7, 2026
2b76d4e
fix(plot): smooth marker+line styles like line-only styles (GH #141)
jeremymanning Jul 7, 2026
966abe3
feat(plot): resample= kwarg wiring hyp.manip Resample into the plot p…
jeremymanning Jul 7, 2026
715f055
feat(plot): arbitrary mpl kwargs passthrough + strict list-length val…
jeremymanning Jul 7, 2026
4e1a09a
notes: mark issue triage as executed (audit closed 45+13 issues, migr…
jeremymanning Jul 7, 2026
48e9d8f
notes: issue-audit session log
jeremymanning Jul 7, 2026
b11285b
plan: round 17 β€” address all 20 non-deferred open issues (API unifica…
jeremymanning Jul 7, 2026
b8ac8fe
feat(core): add Pipeline class + build_pipeline; unpack_model legacy …
jeremymanning Jul 7, 2026
1847c0f
fix(core): restore ValueError for wrong-type instances in unpack_model
jeremymanning Jul 7, 2026
33fac24
feat(reduce): migrate reduce/ to the 1.0 pattern + mixture models (#174)
jeremymanning Jul 7, 2026
1acd585
fix(reduce): warn on ndims mismatch for fitted-Reducer reuse; test ba…
jeremymanning Jul 7, 2026
ab8b6d2
feat(cluster): migrate cluster/ to the 1.0 pattern (round17 Task 3)
jeremymanning Jul 7, 2026
0c471ba
refactor(cluster): point reduce's mixture imports at cluster.common; …
jeremymanning Jul 7, 2026
084b5a6
feat(align): export the 1.0 align dispatcher; fix Aligner.transform t…
jeremymanning Jul 7, 2026
2b8377e
fix(align): SRM family transform() reused fit-time index (GH #227)
jeremymanning Jul 7, 2026
b4fd527
fix(align): coerce raw-array new_data to DataFrame(s) in Aligner.tran…
jeremymanning Jul 7, 2026
77749d6
feat(manip): manip list-chaining via Pipeline + return_model + Smooth…
jeremymanning Jul 7, 2026
783dd98
fix(manip): Resample.transform uses new data's values; Smooth kernel=…
jeremymanning Jul 7, 2026
b49e70c
feat(core,tools,plot): cross-module kwargs on analyze/normalize/plot …
jeremymanning Jul 7, 2026
db211e4
fix(plot,tools): thread n_clusters into bundle pipeline; honor impute…
jeremymanning Jul 7, 2026
b513bca
feat(plot): label_alpha=, xlabel=/ylabel=/zlabel=, animate= dict form…
jeremymanning Jul 7, 2026
ad347cc
feat(plot): animate='window' + focused= + duration= verification (rou…
jeremymanning Jul 7, 2026
e02e7eb
feat(plot): 2D animations, both backends (round17 #9, GH #123)
jeremymanning Jul 7, 2026
29f225f
feat(reduce): add torch-backed autoencoder reducers (GH #162)
jeremymanning Jul 7, 2026
8dad36a
feat(io): add scikit-learn and seaborn named datasets to hyp.load (#273)
jeremymanning Jul 7, 2026
161b870
docs(io): warn that sklearn/seaborn dataset names shadow same-named l…
jeremymanning Jul 7, 2026
cf43204
feat(io): add fivethirtyeight/ and kaggle/ explicit-prefix loaders (#…
jeremymanning Jul 7, 2026
3158605
fix(io): scope kagglehub skip to kaggle tests, dedupe kaggle table ke…
jeremymanning Jul 7, 2026
ac9421a
feat(io): add hyp.io.lsl_stream for LSL input (GH #130)
jeremymanning Jul 7, 2026
f01df42
fix(io): bounded per-sample timeout + inlet cleanup for lsl_stream
jeremymanning Jul 7, 2026
5f42880
feat(text2mat): gensim vectorizer=/semantic= wrappers, sklearn->gensi…
jeremymanning Jul 7, 2026
2fef66c
test(gensim): cover all-OOV zero-vector fallback; document Doc2Vec in…
jeremymanning Jul 7, 2026
9913817
feat(evidence): pieman story-trajectories demo end-to-end + jumps evi…
jeremymanning Jul 7, 2026
d43649d
fix(evidence): story-trajectories early frame -- require fully-popula…
jeremymanning Jul 7, 2026
ab39732
fix(io,ci): authenticate fivethirtyeight GitHub API calls to avoid CI…
jeremymanning Jul 7, 2026
357d1f9
docs: add numpydoc docstrings to every public def/class outside _exte…
jeremymanning Jul 7, 2026
6c3a373
docs: comprehensive Sphinx docs pass -- api.rst coverage, pipeline fl…
jeremymanning Jul 7, 2026
3bb956d
docs(examples): make datasets-tour resilient to network hiccups at ga…
jeremymanning Jul 7, 2026
777b58e
docs(readme): regenerate all media with 1.0 code, fix badges + stale …
jeremymanning Jul 7, 2026
8c40499
fix(io): fetch 538 CSVs via authenticated GitHub API to avoid raw.git…
jeremymanning Jul 7, 2026
6201e42
docs: fix stale 1.0 architecture claims in CLAUDE.md
jeremymanning Jul 8, 2026
6397a24
docs: retire legacy 0.x tutorial rst duplicates and DataGeometry tuto…
jeremymanning Jul 8, 2026
5403530
fix(core,normalize): Normalizer.transform reuse on new data + manip k…
jeremymanning Jul 8, 2026
3c5c816
docs(readme): fix mat2colors path, document missing 1.0 features and …
jeremymanning Jul 8, 2026
2badcf9
feat(manip): make ZScore/Normalize invertible so Pipeline.inverse_tra…
jeremymanning Jul 8, 2026
7e42095
fix(text2mat): skip topic-model semantic on embedding vectorizers ins…
jeremymanning Jul 8, 2026
376e1d9
docs(api): correct docstring inaccuracies surfaced by the QC audit (A…
jeremymanning Jul 8, 2026
724ad5f
docs: fix tutorials.rst title-underline lengths (clears 8 sphinx warn…
jeremymanning Jul 8, 2026
778c49c
docs(qc): triage notes + evidence for QC-notes fix effort (no code ch…
jeremymanning Jul 8, 2026
901f3e2
fix(deps): promote pykalman+statsmodels to core; pin plotly>=6.1.1/ka…
jeremymanning Jul 9, 2026
8e07a59
fix(deps): correct deps red-team defects (ARIMA msg, deepdish numpy2,…
jeremymanning Jul 9, 2026
d9024ba
fix(models): make every returned model honor the sklearn estimator pr…
jeremymanning Jul 9, 2026
8d32445
fix(dispatch): reuse a fitted Pipeline/wrapper handed back as a stage…
jeremymanning Jul 9, 2026
77d1e46
feat(api): predict 'GP' alias + describe() despine/plotly backend
jeremymanning Jul 9, 2026
621555b
fix(reuse): positional manip keying + clear plot() error (reuse red-t…
jeremymanning Jul 9, 2026
d458a5b
fix(plot): matrix-hue blending, surface honors hue, color_reduce= (QC…
jeremymanning Jul 9, 2026
5d3ecd7
feat(plot): names= dataset legend, fix notebook double-display, color…
jeremymanning Jul 9, 2026
f5dfebe
feat(plot): HyperAnimation return + chemtrails/precog/bullettime anim…
jeremymanning Jul 9, 2026
6472172
docs(gallery): story-trajectory animated gif thumbnail + tutorial-set…
jeremymanning Jul 9, 2026
5ad45b7
docs(notes): update QC-notes resume ledger through animation A+B + st…
jeremymanning Jul 9, 2026
23d0c9a
fix(plot): animate + per-observation hue no longer crashes (QC animat…
jeremymanning Jul 9, 2026
dc46a3a
docs(notes): QC-fix evidence screenshots for PR comments
jeremymanning Jul 9, 2026
edf6049
fix(backend): set_interactive_backend('plotly') selects the render ba…
jeremymanning Jul 9, 2026
66675cb
fix(reduce): honor ndims in the canonical dict spec; stable return ty…
jeremymanning Jul 9, 2026
7d71975
fix(input): robust coercion + clear errors for common inputs (release…
jeremymanning Jul 9, 2026
ca13d05
fix(manip/impute): PPCA preserves observed values; robust imputers/ZS…
jeremymanning Jul 9, 2026
3072545
fix(core): analyze returns data not labels; robust Pipeline/build_pip…
jeremymanning Jul 9, 2026
00607d2
fix(align): support datasets with different column counts; warn on ro…
jeremymanning Jul 9, 2026
176fbd7
fix(animation): save all formats; validate duration/frame_rate; fix m…
jeremymanning Jul 9, 2026
be0dcb5
fix(edge): empty-input error, predict-horizon validation, streaming k…
jeremymanning Jul 9, 2026
4fc2e1b
fix(impute): PPCA densifies dropped columns; single-col + reuse clear…
jeremymanning Jul 9, 2026
9d5ce9d
fix(cluster): label recovery works for hard clusterers; clarify analy…
jeremymanning Jul 9, 2026
111775a
fix(input): align dict-form unknown model, 0-d array, scalar hue, PPC…
jeremymanning Jul 9, 2026
a81c7a9
fix(predict/backend): numpy-bool/0-d horizon, DatetimeIndex raise, ca…
jeremymanning Jul 9, 2026
ffc3ca4
docs(notes): release-hardening PR evidence (screenshots + numeric res…
jeremymanning Jul 9, 2026
8e6ed68
fix(surface): color each hull vertex by a distance-weighted blend of …
jeremymanning Jul 9, 2026
b84f827
fix(docs): register story-trajectories gif thumbnail in post_build
jeremymanning Jul 9, 2026
afd7c07
fix(surface): an explicit surface color= wins over hue per-vertex col…
jeremymanning Jul 9, 2026
5972fb4
fix(docs): animate_surface_morph gif thumbnail + guard against frozen…
jeremymanning Jul 9, 2026
94c03d0
docs(notes): evidence for surface hue-per-vertex + story/surface_morp…
jeremymanning Jul 9, 2026
849d97c
docs(notes): finalize PR comment with 1466-pass suite result
jeremymanning Jul 9, 2026
7cc88ff
fix(animate): fractional duration no longer crashes spin/serial anima…
jeremymanning Jul 10, 2026
bd04856
feat(story): high-quality story-trajectories animation (align in low-…
jeremymanning Jul 10, 2026
8456494
docs(notes): story-animation PR evidence (new gif + honest metrics)
jeremymanning Jul 10, 2026
7987f3e
fix(story): align in the 100-hub space (not over-reduced), window style
jeremymanning Jul 10, 2026
cc42822
fix(pipeline): a no-op reduce stage is fitted, keeping return_model p…
jeremymanning Jul 10, 2026
52bcff8
fix(animate): per-point labels track their datapoint's window instead…
jeremymanning Jul 10, 2026
26232a6
feat(api): top-level random_state for reproducible reduce/cluster/ana…
jeremymanning Jul 10, 2026
aaf12b9
fix(animate): window per-point labels in serial/2-D/morph animations too
jeremymanning Jul 10, 2026
a87aa4a
docs(story): cleaner window animation (shorter trail, translucent thi…
jeremymanning Jul 10, 2026
5a4fe93
docs(story): match reference render (opaque bold lines) + verified di…
jeremymanning Jul 10, 2026
fdb5292
docs(story): husl palette to match the reference's tempered hues
jeremymanning Jul 10, 2026
6d9a596
docs(notes): finalize session PR comment + husl story gif evidence
jeremymanning Jul 10, 2026
7507a23
fix(plot): accept nested per-dataset hue (list-of-lists) again
jeremymanning Jul 10, 2026
e34a51d
docs(notes): gallery-examples + tutorials audit follow-up comment
jeremymanning Jul 10, 2026
571e331
chore: remove dev-only QC review scaffolding before merging to dev
jeremymanning Jul 10, 2026
eec6538
Merge pull request #280 from ContextLab/fix/qc-notes-2026-07
jeremymanning Jul 10, 2026
e0f4e33
fix(io): retry transient GitHub-API gateway errors in the 538 loader
jeremymanning Jul 10, 2026
963b4f0
docs(audit): 1.0 release-audit master plan + ledger scaffolding
jeremymanning Jul 11, 2026
37845bb
docs(audit): ledger β€” workflow run id + pre-warm seed observations
jeremymanning Jul 11, 2026
9530398
docs(audit): wave-1 red-team findings β€” 16 units, 224 findings filed
jeremymanning Jul 11, 2026
1c6047d
docs(audit): sotus root-cause investigation β€” dw corpus recovery path
jeremymanning Jul 11, 2026
419d56e
docs(audit): root causes + fix sketches for all 4 criticals; Phase-4 …
jeremymanning Jul 11, 2026
2d3085d
docs(audit): wave-2 findings β€” cumulative 32 units, 466 findings, 10 …
jeremymanning Jul 12, 2026
931fbe9
docs(audit): wave-3 findings β€” 40/46 units, 606 findings, 12 criticals
jeremymanning Jul 12, 2026
25d85a7
docs(audit): root causes + fix sketches for waves-2/3 criticals
jeremymanning Jul 12, 2026
240344f
docs(audit): FINAL red-team findings β€” 46/46 units, 708 findings, 16 …
jeremymanning Jul 12, 2026
1342145
docs(audit): cross-unit dedup cluster map (100 findings -> 27 root ca…
jeremymanning Jul 12, 2026
fa32ee4
docs(audit): Phase-4 verdicts β€” 691/708 CONFIRMED, 3 refuted, 2 canno…
jeremymanning Jul 12, 2026
14669d5
chore: remove stray tracked playwright console log
jeremymanning Jul 13, 2026
181f5bd
docs(audit): ledger β€” fix waves 5A (8 parallel) + 5B (plot pipeline) …
jeremymanning Jul 13, 2026
885325c
fix(manip): per-dataset Smooth, validation, docs β€” 22 audit findings
jeremymanning Jul 17, 2026
ff7153e
fix(align): row-order preservation, False-skip, kwarg validation β€” 10…
jeremymanning Jul 17, 2026
3517435
fix(backend): env-var import crash + switch-state safety β€” 7 findings
jeremymanning Jul 17, 2026
04985a4
fix(tools): analyze False-skip routing, empty-list guard, df2mat pand…
jeremymanning Jul 17, 2026
b82ee88
docs(audit): ledger β€” 4 fix batches committed (51 findings), waves re…
jeremymanning Jul 17, 2026
462fe6e
fix(io): sotus speeches restored, CSV parsing, atomic format-aware sa…
jeremymanning Jul 17, 2026
c3f6f6d
fix(predict,impute): Kalman actually learns dynamics; 1-D series; deg…
jeremymanning Jul 17, 2026
4c492f8
fix(core,packaging): config.ini ships in wheel; no numpy-seterr side …
jeremymanning Jul 17, 2026
2179688
fix(cluster,reduce): False-skip contract, TSNE/describe, honest error…
jeremymanning Jul 17, 2026
54a3d5f
docs(audit): ledger β€” 5A complete (8/8, 178 findings), integration ch…
jeremymanning Jul 17, 2026
82dc8cd
fix(plot): wave 5B β€” static fidelity, hue/colors, animation/save, sur…
jeremymanning Jul 17, 2026
5ddbbf3
fix(core,docs): controller batch β€” exports, palette coverage, version…
jeremymanning Jul 17, 2026
e8e8b9a
fix(plot): B5 escalations β€” cluster-spec unification, int-hue palette…
jeremymanning Jul 17, 2026
f8c1ecb
docs(audit): ledger β€” B5/controller committed, 5C running, reconcilia…
jeremymanning Jul 17, 2026
dc063dc
docs(code): wave 5C docstring residuals β€” param-table drift, runnable…
jeremymanning Jul 17, 2026
cc0ccf3
docs(audit): wave 5C β€” README/CHANGELOG, 32 examples fixed, all 15 tu…
jeremymanning Jul 17, 2026
78bd721
chore(docs): remove 20 stale tracked docs/modules/generated artifacts…
jeremymanning Jul 17, 2026
58699f2
docs(audit): ledger β€” 5C committed, 5D running, Phase-6 plan
jeremymanning Jul 17, 2026
7612c42
fix(residue): wave 5D β€” streaming/reduce polish + docs infrastructure…
jeremymanning Jul 17, 2026
c7adf48
docs(gallery): zero-warning full rebuild β€” 22 title overlines fixed, …
jeremymanning Jul 17, 2026
6696880
docs(audit): ledger β€” Phase-6a results (docs gate closed; suite 2113/…
jeremymanning Jul 17, 2026
9d2acf7
chore: delete stray 102MB hypertools-dev venv + ancient dist artifact…
jeremymanning Jul 17, 2026
2c27e61
docs(audit): ledger β€” Phase-6b verified 366 fixes; wave 6c launched f…
jeremymanning Jul 17, 2026
ac85404
fix(final): wave 6c β€” F08 input family, dispatcher consistency, io se…
jeremymanning Jul 17, 2026
8be02be
docs(audit): ledger β€” 6c committed (2258/0), X-reconciliation 53/5/40…
jeremymanning Jul 17, 2026
0a398ee
fix(polish): wave 6d β€” final 36 minors: validation, warning hygiene, …
jeremymanning Jul 17, 2026
75d7538
chore: remove audit working notes before merging to dev
jeremymanning Jul 17, 2026
908f8c0
test(hygiene): zero-warning suite β€” capture every deliberate warning;…
jeremymanning Jul 17, 2026
24dcd74
Merge release-audit branch: 46-unit red-team audit, ~640 findings fixed
jeremymanning Jul 17, 2026
30bc20b
fix(ci): dependency-version robustness β€” all 12-job failure clusters …
jeremymanning Jul 17, 2026
5908287
fix(ci): pandas-2 filter-category abort + Windows POSIX test assumptions
jeremymanning Jul 17, 2026
eb77301
fix(backend): respect MPLBACKEND=Agg; never force a GUI backend for f…
jeremymanning Jul 17, 2026
2b1fc22
fix(io): make remote-pickle trust a real security boundary (refuse, n…
jeremymanning Jul 17, 2026
1f8059c
fix(io): verify built-in datasets against pinned SHA-256 before deser…
jeremymanning Jul 17, 2026
fe0f19b
fix(ci,packaging,docs): PR-target CI, sdist leak guard, py3.14 claim,…
jeremymanning Jul 17, 2026
14183e7
ci(harden): SHA-pin all Actions; add fresh-venv wheel-artifact smoke …
jeremymanning Jul 17, 2026
8a6945f
chore: untrack audit notes + generated gallery to de-bloat the repo (…
jeremymanning Jul 17, 2026
d3dff5e
fix(io): load built-in datasets from non-executable files (no pickle)…
jeremymanning Jul 18, 2026
6fd02d1
fix(release-review-2): 2nd-review blocker #2 + findings #3-#8
jeremymanning Jul 18, 2026
e3963ec
fix(release-review-2): CI-green round 2 β€” normalize compat hash, pand…
jeremymanning Jul 18, 2026
29cd932
fix(release-review-3): dataset release-gate (no silent skips) + indep…
jeremymanning Jul 18, 2026
716f2d9
fix(ci): install pytest (+ pytest-timeout) in the dataset-gate job
jeremymanning Jul 18, 2026
4a52caa
fix(io): re-host sotus as a non-executable hosted dataset β€” closes bl…
jeremymanning Jul 18, 2026
6ce58f7
fix(provenance): harden the release verification machinery (4th-revie…
jeremymanning Jul 18, 2026
8b057b7
fix(docs): make the -W docs-clean gate robust to transient external d…
jeremymanning Jul 18, 2026
ebefa54
test(hardening): exact-coverage provenance assertions + unit-tested d…
jeremymanning Jul 18, 2026
a801a53
docs(readme): pin the 1.0 example images so the PR previews them (not…
jeremymanning Jul 18, 2026
47df3dc
release: HyperTools 1.0.0 (final version)
jeremymanning Jul 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
239 changes: 229 additions & 10 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,13 @@ name: Tests

on:
push:
branches: [ master, dev, dev-2.0 ]
branches: [ master, dev, dev-1.0, dev-1.0-refactor ]
pull_request:
branches: [ master, dev ]
# must include the branches PRs actually TARGET, or the PR-target
# workflow never runs and green checks are only push-triggered ones
# (2026-07 release review, blocker #3: PR #272 targets dev-1.0, which
# was missing here). Fork PRs in particular only run via pull_request.
branches: [ master, dev, dev-1.0, dev-1.0-refactor ]

jobs:
test:
Expand All @@ -13,18 +17,22 @@ jobs:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
# datawrangler 0.5.0+ supports pandas 3.0 (dw#30/#31) and py3.10-3.13. The pandas<3
# ceiling is lifted, so the resolver naturally picks pandas 3.x on py3.11-3.13 and
# pandas 2.x on py3.10 (pandas 3.0 requires py>=3.11) -- the matrix exercises both.
# A dedicated pinned-pandas-3 gate runs below on ubuntu/py3.12.
python-version: ['3.10', '3.11', '3.12', '3.13']

steps:
- uses: actions/checkout@v4
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.2.2 (pinned to SHA, release review #8)

- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.4.0 (pinned to SHA)
with:
python-version: ${{ matrix.python-version }}

- name: Cache pip dependencies
uses: actions/cache@v4
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.2.0 (pinned to SHA)
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ matrix.python-version }}-${{ hashFiles('**/pyproject.toml') }}
Expand All @@ -33,7 +41,7 @@ jobs:
${{ runner.os }}-pip-

- name: Cache hypertools example datasets
uses: actions/cache@v4
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.2.0 (pinned to SHA)
with:
path: ~/hypertools_data
key: hypertools-example-data-v1
Expand All @@ -45,7 +53,11 @@ jobs:
if: matrix.os == 'ubuntu-latest'
run: |
sudo apt-get update
sudo apt-get install -y ffmpeg
# fonts-noto-cjk (GH #205): ubuntu-latest ships no CJK-covering font
# at all, so tests/test_multibyte.py's `requires_covering_font`
# skipif would silently skip every CJK-dependent test on this OS.
sudo apt-get install -y ffmpeg fonts-noto-cjk
fc-cache -f

- name: Install system dependencies (macOS)
if: matrix.os == 'macos-latest'
Expand All @@ -59,26 +71,92 @@ jobs:
continue-on-error: true

- name: Install package with dev dependencies
# GH #130 (hyp.io.lsl_stream, tests/test_lsl_streaming.py): pylsl is
# in the [dev] extra (pyproject.toml) with NO separate native liblsl
# install step on any of the three platforms below -- investigated
# during Task 13's implementation, pylsl>=1.16's wheels BUNDLE the
# native liblsl library for every platform this matrix runs on:
# - ubuntu-latest (x86_64): manylinux_2_35_x86_64 wheel -> ships
# pylsl/lib/liblsl.so (ubuntu-latest's glibc satisfies 2.35+)
# - macos-latest (arm64/x86_64): macosx_11_0_universal2 wheel ->
# ships pylsl/lib/liblsl.dylib; verified working end-to-end
# locally (real in-process StreamOutlet -> StreamInlet round trip)
# - windows-latest (x86_64): win_amd64 wheel -> ships
# pylsl/lib/lsl.dll
# so all three CI platforms are "provisioned" and none is excluded;
# tests/test_lsl_streaming.py::test_ci_has_pylsl fails the build (not
# skip) if pylsl is ever unimportable here, e.g. if a future pylsl
# release drops the bundled binary for one of these wheel tags.
run: |
python -m pip install --upgrade pip
pip install -e ".[dev]"
# [torch] (also pulled in transitively by [dev]) is installed
# explicitly too so a future change to the dev extra can't
# silently drop torch coverage of the six autoencoder reducers
# (GH #162, tests/test_autoencoders.py). torch>=2.0 ships CPU
# wheels for all three CI platforms/Python versions here.
pip install -e ".[dev,torch]"

- name: Pre-fetch headless Chrome for kaleido (Plotly image/GIF export)
# tests/test_animation_export.py exports Plotly figures to GIF/MP4 via
# kaleido 1.x, which drives a headless Chrome. Pre-fetching it here (into
# choreographer's deps dir, where kaleido discovers it automatically)
# avoids a slow first-use Chrome download racing the test's own timeout
# on some runners (seen as an intermittent TimeoutError on
# windows/py3.13). Best effort: if the fetch fails, kaleido falls back to
# its own on-demand download, so this step never blocks the build.
run: plotly_get_chrome -y
continue-on-error: true

- name: Rebuild matplotlib font cache (Ubuntu only)
# GH #205: matplotlib scans installed fonts once and caches the
# result (~/.cache/matplotlib/fontlist-*.json). On ubuntu-latest
# runners that cache is built (by whatever process first imports
# matplotlib.font_manager -- here, `pip install`'s dependency
# resolution/build step, or a previous cached run) BEFORE
# fonts-noto-cjk is installed above, so `find_covering_font`
# (hypertools/plot/fonts.py) would scan a stale font list missing
# every Noto Sans CJK file and skip every CJK-dependent test in
# tests/test_multibyte.py. Force one rebuild here (expensive -- do
# it once per job, not from inside fonts.py on every call).
if: matrix.os == 'ubuntu-latest'
run: |
python -c "import matplotlib.font_manager as fm; fm._load_fontmanager(try_read_cache=False)"

- name: Run pytest
env:
MPLBACKEND: Agg
# Authenticate the fivethirtyeight loader's GitHub API listing calls
# (tests/test_load_538_kaggle.py). The default GITHUB_TOKEN raises the
# REST API quota from 60 to 5000 requests/hour, so the ~12 concurrent
# matrix jobs sharing a runner IP pool don't exhaust the shared
# unauthenticated limit (403 rate-limit failures). See
# hypertools/io/sources.py::_github_api_headers.
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
pytest -v --tb=short

- name: Acceptance gate β€” pandas 3.0 (Ubuntu Python 3.12 only)
# Guarantees a pandas-3 run regardless of resolver choices (dw#30/#31 fix).
if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.12'
env:
MPLBACKEND: Agg
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
pip install "pandas>=3.0"
python -c "import pandas as pd; assert pd.__version__.split('.')[0] == '3', pd.__version__; print('pandas', pd.__version__)"
pytest -q

- name: Run pytest with coverage (Ubuntu Python 3.12 only)
if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.12'
env:
MPLBACKEND: Agg
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
pytest --cov=hypertools --cov-report=xml --cov-report=term-missing

- name: Upload coverage to Codecov (Ubuntu Python 3.12 only)
if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.12'
uses: codecov/codecov-action@v4
uses: codecov/codecov-action@b9fd7d16f6d7d1b5d2bec1a2887e65ceed900238 # v4.6.0 (pinned to SHA)
with:
file: ./coverage.xml
flags: unittests
Expand All @@ -94,8 +172,149 @@ jobs:

- name: Upload screenshots as artifacts (Ubuntu Python 3.12 only)
if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.12'
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.0 (pinned to SHA)
with:
name: verification-screenshots
path: tests/screenshots/
retention-days: 30

# Release qualification: build the wheel + sdist ONCE, then install EACH
# artifact into its OWN fresh environment (not the editable source
# checkout) and smoke-test the public API + validate metadata. Both are
# exercised because wheel and sdist use different package-discovery/build
# paths -- a gap can exist in one and not the other (2026-07 release
# review, issues #8 wheel + follow-up sdist). Actions are SHA-pinned like
# the test job above.
wheel-smoke:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.2.2 (pinned to SHA)
- name: Set up Python
uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.4.0 (pinned to SHA)
with:
python-version: '3.12'
- name: Build wheel + sdist
run: |
python -m pip install --upgrade pip build twine
python -m build --outdir dist .
twine check dist/*
- name: Install the built WHEEL into a fresh venv and smoke-test
env:
MPLBACKEND: Agg
run: |
python -m venv /tmp/fresh-wheel
# install the wheel artifact itself -- NOT the source checkout
/tmp/fresh-wheel/bin/pip install --upgrade pip
/tmp/fresh-wheel/bin/pip install dist/*.whl
# run from /tmp (NOT the repo) so an accidental source-tree import
# can't mask a packaging gap; the script itself asserts it imported
# hypertools from site-packages
cd /tmp && /tmp/fresh-wheel/bin/python "$GITHUB_WORKSPACE/scripts/wheel_smoke_test.py"
- name: Install the built SDIST into a fresh venv and smoke-test
env:
MPLBACKEND: Agg
run: |
python -m venv /tmp/fresh-sdist
# build the sdist FROM the sdist (its own build path), not the repo
/tmp/fresh-sdist/bin/pip install --upgrade pip
/tmp/fresh-sdist/bin/pip install dist/*.tar.gz
cd /tmp && /tmp/fresh-sdist/bin/python "$GITHUB_WORKSPACE/scripts/wheel_smoke_test.py"

# Fresh-source docs build (2026-07 release review, blocker #2). Read the Docs
# no longer ships a generated docs/auto_examples/ tree, so every RTD build now
# executes ALL gallery examples and renders the Plotly snapshots via headless
# Chrome from scratch. This job reproduces exactly that contract: it builds
# from a pristine `git archive` (tracked files only), asserts the generated
# gallery is absent, provisions Chrome the same way RTD does, and runs Sphinx
# with -W -E -a (warnings are errors, no cached env, rebuild everything) so a
# missing browser or ANY gallery-execution failure fails the build HERE --
# before it reaches RTD. Mirrors .readthedocs.yaml (Python 3.11 + ffmpeg +
# plotly_get_chrome). Actions SHA-pinned like the jobs above.
docs-clean:
runs-on: ubuntu-latest
timeout-minutes: 75
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.2.2 (pinned to SHA)
- name: Set up Python
uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.4.0 (pinned to SHA)
with:
python-version: '3.11'
- name: Install system dependencies
run: |
sudo apt-get update
# ffmpeg: mp4 rendering of animated gallery examples (matches RTD).
# fonts-noto-cjk: CJK-covering font for the multibyte gallery text.
# pandoc: nbsphinx renders the hand-authored tutorials/*.ipynb via
# pandoc (Read the Docs' build image bundles pandoc; a bare GH runner
# does not, so declare it here or the notebook stage fails).
sudo apt-get install -y ffmpeg fonts-noto-cjk pandoc
fc-cache -f
- name: Export a pristine source tree (tracked files only)
run: |
mkdir -p /tmp/docs-clean
git archive --format=tar HEAD | tar -x -C /tmp/docs-clean
# the generated gallery must NOT be tracked: a fresh RTD build
# regenerates it, so its presence here would MASK execution failures
if [ -e /tmp/docs-clean/docs/auto_examples ]; then
echo "::error::docs/auto_examples is tracked; it must be generated fresh"
exit 1
fi
- name: Install package + docs requirements + headless Chrome
run: |
python -m pip install --upgrade pip
cd /tmp/docs-clean
pip install .
pip install -r docs/doc_requirements.txt
# headless Chrome for the Plotly gallery scraper (kaleido 1.x); RTD
# provisions it identically via .readthedocs.yaml's post_install job
plotly_get_chrome -y
- name: Build docs from clean source (warnings = errors, cold gallery)
env:
MPLBACKEND: Agg
# raise the fivethirtyeight/kaggle loader's GitHub API quota (some
# gallery examples load hosted datasets during execution)
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
cd /tmp/docs-clean/docs
python -m sphinx -b html -W -E -a . _build/html

# Dataset release gate (2026-07 review, findings #2 + #2-followup). Two
# things a green matrix run does NOT prove: (a) that the hosted-dataset
# checks actually ran -- the matrix SKIPS a dataset it can't download so
# transient outages don't block unrelated PRs; and (b) that the Dropbox/Drive
# URLs are still REACHABLE -- the loader accepts a hash-valid CACHE hit
# without contacting the host. This job forbids both gaps: it uses NO dataset
# cache and clears ~/hypertools_data first, so every artifact is fetched
# FRESH from its host, and HYPERTOOLS_REQUIRE_DATASETS=1 turns any
# download/load failure into a HARD failure (never a skip). So it genuinely
# proves host availability + integrity + baseline match, and reports the
# exact count. Actions SHA-pinned like the jobs above.
dataset-gate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.2.2 (pinned to SHA)
- name: Set up Python
uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.4.0 (pinned to SHA)
with:
python-version: '3.12'
- name: Install package
run: |
python -m pip install --upgrade pip
# base install (NOT [dev]) so this gate also proves the hosted datasets
# load with only the base dependency stack -- plus pytest to run them
# and pytest-timeout to honor the suite's 20-min hung-download safety net
pip install . pytest pytest-timeout
- name: Require EVERY hosted dataset to DOWNLOAD FRESH + match the pinned baseline
env:
MPLBACKEND: Agg
HYPERTOOLS_REQUIRE_DATASETS: '1'
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
# NO cache above + clear any cache dir here => every dataset is fetched
# fresh from its host, so this is a genuine host-availability gate (not
# a cache-validity check). A download/load failure fails the job (it
# cannot skip); -s prints the exact count validated.
rm -rf ~/hypertools_data
python -m pytest -v -s \
tests/test_dataset_compat.py \
tests/test_dataset_integrity.py
11 changes: 11 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,14 @@ tests/screenshots/
docs/auto_examples/animation.mp4
docs/auto_examples/searchindex.db
docs/auto_examples/test-image.pdf

# stray local virtualenvs / build outputs (audit X5-001/X5-006)
hypertools-dev/
dist/

# audit working notes + evidence (moved to PR #272 comments; full trail on
# the audit/release-1.0-2026-07 branch). Do not re-track (release review #10).
notes/audit-1.0-2026-07/
# generated sphinx-gallery output: regenerated at docs build time from
# examples/*.py -- source examples stay tracked, generated gallery does not.
docs/auto_examples/
1 change: 0 additions & 1 deletion .playwright-mcp/console-2026-07-02T16-29-32-958Z.log

This file was deleted.

19 changes: 19 additions & 0 deletions .readthedocs.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,26 @@ build:
tools:
python: "3.11"
# You can also specify other tools here or in a separate tools block
# ffmpeg system binary: required by sphinx-gallery's
# matplotlib_animations = (True, 'mp4') setting in docs/conf.py to render
# the animated gallery examples as mp4 video
apt_packages:
- ffmpeg
# pandoc: nbsphinx renders the hand-authored tutorials/*.ipynb via pandoc.
# RTD's build image has historically bundled pandoc, but declare it
# explicitly so the notebook stage never depends on an implicit default
# (the docs-clean CI job installs it the same way).
- pandoc
jobs:
post_install:
# Kaleido 1.x renders the gallery's Plotly examples (plot_interactive_backend,
# animate_plotly, ...) to static PNGs via HEADLESS CHROME -- the
# plotly_sg_scraper wired up in docs/conf.py. Read the Docs provisions no
# browser, so without this the two Plotly examples fail when Kaleido tries
# to launch Chrome and Sphinx exits non-zero (2026-07 release review,
# blocker #2). Fetch a pinned Chrome into choreographer's deps dir, where
# Kaleido discovers it automatically (no PATH wiring needed).
- plotly_get_chrome -y
post_build:
# Fix animated GIF thumbnails after documentation build
- python docs/post_build.py
Expand Down
Loading
Loading