Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
228 commits
Select commit Hold shift + click to select a range
569a308
Fix 1.1 release review findings in scoring, caching, fonts, and docs
jeremymanning Sep 6, 2026
b3eafe5
Correct NumPy 2 optional dependency floors and finalize release revie…
jeremymanning Sep 6, 2026
f116dd7
refactor(backtest): hoist the Forecaster/Imputer imports out of the s…
jeremymanning Sep 6, 2026
f1a1e09
fix(predict,align): reject repeated metrics, blame t= for holdout=Tru…
jeremymanning Sep 6, 2026
e47968f
test: replace the three spy/fake-object tests added since 1.0 with re…
jeremymanning Sep 6, 2026
a59f2e2
test(examples): scan every example and tutorial for the native-usage …
jeremymanning Sep 6, 2026
ef887ca
fix(plot,io,tools): release-review findings in the 1.1 animation, tit…
jeremymanning Sep 6, 2026
1be634d
fix(manip,align): fit() returns self so sklearn-style chains work
jeremymanning Sep 6, 2026
f0e56c9
docs: release-review documentation fixes for 1.1.0
jeremymanning Sep 6, 2026
223d468
docs(lsl): fold synthetic_outlet's custom 'Signal definition' section…
jeremymanning Sep 6, 2026
384fe99
fix(plot,predict): panels, series-mode, forecast and hierarchy findin…
jeremymanning Sep 6, 2026
00e5a00
docs(tutorials): re-execute the eight edited tutorials on the reviewe…
jeremymanning Sep 6, 2026
f775b37
docs(tutorials): re-rendered wikipedia_embeddings video from the re-e…
jeremymanning Sep 6, 2026
63aa9cf
docs(notes): 1.1 release review session log (findings, fixes, verific…
jeremymanning Sep 6, 2026
9340300
fix(windows): POSIX paths in the example scanner; cache replace toler…
jeremymanning Sep 6, 2026
d20fdde
docs(notes): three skill-compounder notes from the 1.1 release review…
jeremymanning Sep 6, 2026
0e4f57b
docs(notes): end state of the 1.1 release review session
jeremymanning Sep 6, 2026
45fe779
fix(plot): a marker+line format string keeps its marker in the legend
jeremymanning Sep 6, 2026
087e338
docs(notes): feature-tour follow-up (legend marker fix, mixture demo …
jeremymanning Sep 6, 2026
abe9295
fix(plot,reduce): aspect-aware panels=True grid, no second pipeline f…
jeremymanning Sep 6, 2026
edc7d28
docs(notes): 9.8 panels follow-up
jeremymanning Sep 6, 2026
1862086
fix(plot): truth= legend glyph shows its markers; 2-D density grids s…
jeremymanning Sep 6, 2026
22219eb
feat(plot): panels= parity on plotly, hyp.subplots(backend='plotly') …
jeremymanning Sep 7, 2026
a5fb653
fix(plot,predict): red-team round 1 -- panel grid backend, density gr…
jeremymanning Sep 7, 2026
e9dd085
fix(predict,plot): red-team round 2 -- fitted-model reuse floor, plot…
jeremymanning Sep 7, 2026
74a888d
docs(notes): panels parity + red-team rounds 1-2 log; skillnotes
jeremymanning Sep 7, 2026
b1382d8
fix(plot): forecast-schedule projection ignores timer noise from 2- a…
jeremymanning Sep 7, 2026
ab5d7ce
fix(plot): forecast styling and legend entries, plotly panel geometry…
jeremymanning Sep 7, 2026
f9ccc75
fix(plot): Codex round-3 findings -- collection ownership under regro…
jeremymanning Sep 7, 2026
49441a3
docs(notes): round-3 outcome, round-4 scheduling
jeremymanning Sep 7, 2026
687e98c
fix(plot): Codex round-4 findings -- pinned forecast_fmt colours, mix…
jeremymanning Sep 8, 2026
f4f7ab8
docs(notes): round-4 pushed, round-5 blocked by the Codex usage limit…
jeremymanning Sep 8, 2026
4c4b288
feat(api): hyp.set_autoinstall() switches on-demand extra installatio…
jeremymanning Sep 8, 2026
3f4b087
fix: address the paused Codex release audit (offline built-ins, expor…
jeremymanning Sep 8, 2026
c700c85
fix: Codex round 6 findings (overlapping set_autoinstall scopes, expo…
jeremymanning Sep 8, 2026
c88bc03
docs(notes): round-6 fixes pushed as c700c85f; Codex round 7 launched
jeremymanning Sep 8, 2026
339ce05
docs(notes): Codex round 7 cut off by the usage limit; detached relau…
jeremymanning Sep 8, 2026
081f7c9
docs(notes): CI green on c700c85f
jeremymanning Sep 8, 2026
14e0965
fix: Codex round 7 (panel cells from analyzed data, palette slots con…
jeremymanning Sep 8, 2026
1cad1e6
docs(notes): resumed; docs pipeline green on 14e0965e
jeremymanning Sep 8, 2026
650808f
fix: Codex round 8 (construct-then-enter scope race, panel cluster re…
jeremymanning Sep 8, 2026
8066308
feat: sorted image palettes, data-matrix palettes (palette_* options)…
jeremymanning Sep 8, 2026
25b3ba6
feat: datawrangler-based datatype handling everywhere (wave 1), manip…
jeremymanning Sep 8, 2026
767e327
fix: MatrixColormap honours the Colormap contract (Codex round 10); C…
jeremymanning Sep 8, 2026
faedf14
fix(review): Codex round 11 -- manip mixed lists keep indices, Matrix…
jeremymanning Sep 8, 2026
0a2cc0d
chore: checkpoint local release work before renewed audit
jeremymanning Sep 8, 2026
2e9669d
chore: checkpoint reviewed release fixes before backtest alignment
jeremymanning Sep 9, 2026
c033e85
fix: score forecasts at observed times and isolate animation models
jeremymanning Sep 9, 2026
4e825a4
fix: prevent overflow in integer forecast timestamps
jeremymanning Sep 9, 2026
a449266
fix: address notebook visual review and verification gaps
jeremymanning Sep 10, 2026
4b23022
test: verify notebook outputs and opacity across animation frames
jeremymanning Sep 10, 2026
2829556
fix: preserve notebook outputs on unchanged tour regeneration
jeremymanning Sep 10, 2026
181410a
fix: make notebook review I/O portable to Windows
jeremymanning Sep 11, 2026
fa3e60e
ci: provision the verified Ruff version for lint checks
jeremymanning Sep 11, 2026
2503a54
fix: stream plots under a plotly render backend; scan axis labels for…
jeremymanning Sep 11, 2026
deeb1f9
tour: pin matplotlib-only cases and render the describe curve
jeremymanning Sep 11, 2026
09f56b2
notes: 2026-09-11 final review findings and fix-wave plan
jeremymanning Sep 11, 2026
6ccc37b
fix(io): yahoo intraday bars keep their timestamps instead of midnight
jeremymanning Sep 11, 2026
501a2a3
fix(normalize): a fitted Normalizer reads 1-D data as one column
jeremymanning Sep 11, 2026
d3b56ce
fix(forecast): split marker+line fmt no longer shifts forecast/truth …
jeremymanning Sep 11, 2026
ec0700e
fix(truth): ndims=1 truth= must be one column of values per trace
jeremymanning Sep 11, 2026
806f99d
fix(plot): per-dataset {category: color} dict palettes colour marker-…
jeremymanning Sep 11, 2026
2fc2a12
fix(autoinstall): no teardown traceback; a re-entered handle keeps ca…
jeremymanning Sep 11, 2026
e9d4f92
fix(1-D): a one-column trace's x is the row index in rows, on both ba…
jeremymanning Sep 11, 2026
b019744
fix(animate): live forecasts on 2-column data follow the axes' dimens…
jeremymanning Sep 11, 2026
676bd15
fix(forecast): a forecast_fmt marker is drawn at the forecast's steps…
jeremymanning Sep 11, 2026
22ae49c
docs(changelog): correct 1.1.0 claims found by the release-document r…
jeremymanning Sep 11, 2026
3ee54b8
fix(io): a sniffed zip keeps the .npz trust error instead of a parque…
jeremymanning Sep 11, 2026
3dac1ba
fix(io): offline misses of guessed sources and unparseable cached copies
jeremymanning Sep 11, 2026
cb3fd17
fix(align): Aligner classes read arrays; alignment warnings name the …
jeremymanning Sep 11, 2026
8f64d47
fix(align): dispersion score raises when every dataset is constant
jeremymanning Sep 11, 2026
e84f9c7
notes: record hover-name report, docs findings, worktree-base lesson
jeremymanning Sep 11, 2026
36b5c2b
fix(forecast): marker-only categorical regrouping always refuses to a…
jeremymanning Sep 11, 2026
314a236
build: scikit-image floor 0.25.0, the first release with cp313 wheels
jeremymanning Sep 11, 2026
05f7aeb
release: fix checklist order and claims; gate a stale CHANGELOG date
jeremymanning Sep 11, 2026
c59b3c6
fix(legend): legend_colors= list may name one colour per data entry b…
jeremymanning Sep 11, 2026
c205c57
fix(load): the TypeError lists polars frames, which load() accepts
jeremymanning Sep 11, 2026
ca6c205
fix(pipeline): rows a manip stage empties stop the pipeline there
jeremymanning Sep 11, 2026
63427ae
tour: apply figure-QA adjudication to cases and Inspect text
jeremymanning Sep 11, 2026
0673f4b
fix(plotly): markers only at true observations; hue markers honour al…
jeremymanning Sep 11, 2026
f6f4afb
fix(plot): composing into ax= continues the palette without repeating…
jeremymanning Sep 11, 2026
4b1fd9e
fix(plot): panels= splits a plain legend_colors list per panel
jeremymanning Sep 11, 2026
cb33e89
fix(plot): two-column data draws into a 2-D ax= at the default ndims
jeremymanning Sep 11, 2026
e876a55
docs(release-notes): refresh the 1.1.0 draft from the reviewed CHANGELOG
jeremymanning Sep 11, 2026
46a1304
fix(plot): per-dataset and nested labels= survive hue=/cluster= regro…
jeremymanning Sep 11, 2026
c00b8cc
fix(colors): a 0-255 colour list raises instead of becoming a data pa…
jeremymanning Sep 11, 2026
0d4f0ca
Merge W6: release checklist, notes, CHANGELOG corrections
jeremymanning Sep 11, 2026
c33a1eb
fix(plot): a reused pipeline's fitted cluster step colours the figure
jeremymanning Sep 11, 2026
7fe6b68
fix(fonts): font='Noto Sans' resolves the bundled face in a fresh pro…
jeremymanning Sep 11, 2026
49370f5
fix(plotly, dates): date axes are time-zone invariant; open-ended dat…
jeremymanning Sep 11, 2026
6bf4222
fix(matplotlib): an explicit marker= wins over the fmt marker, and ma…
jeremymanning Sep 11, 2026
7ccaac7
fix(panels): forecast_trail= no longer refuses itself in the panel probe
jeremymanning Sep 11, 2026
b8f01ee
fix(predict): forecast regular calendar data on its own calendar
jeremymanning Sep 11, 2026
8ff2d06
fix(plotly): cell colorbar placement, kept cell titles, clear ax= dim…
jeremymanning Sep 11, 2026
b3342dd
fix(matplotlib): continuous-hue markers carry alpha=
jeremymanning Sep 11, 2026
ab55c16
fix(plotly): refuse 1-D animations like matplotlib; serial FrameConte…
jeremymanning Sep 11, 2026
0845512
fix(transform): bare-array transform= is one dataset; a frame's index…
jeremymanning Sep 11, 2026
66ec8c4
fix(predict): reuse a fitted forecaster across index kinds again (1.0…
jeremymanning Sep 11, 2026
f05b299
fix(plot): the non-finite hue warning counts observations and names t…
jeremymanning Sep 11, 2026
70dc00b
Merge W2: io/tools/_shared/colors/fonts review fixes
jeremymanning Sep 11, 2026
a014ae9
fix(warnings): align/impute/manip/core warnings name the caller's line
jeremymanning Sep 11, 2026
8ce518f
fix(predict): ARIMA's minimum history counts seasonal_order
jeremymanning Sep 11, 2026
40c509c
fix(matplotlib): observation-label connectors and box edges are drawn…
jeremymanning Sep 11, 2026
efed157
test(predict): time-policy warnings are issued once, and only when th…
jeremymanning Sep 11, 2026
d656196
fix(truth): the 'truth' legend key is neutral gray when truths span s…
jeremymanning Sep 11, 2026
fde433f
fix(matplotlib): titles and axis labels on caller axes and panels= ce…
jeremymanning Sep 11, 2026
8fd2f0d
fix(ndims=1): a shuffled time index is drawn in time order, joining i…
jeremymanning Sep 11, 2026
4a6b4f7
docs: fix tutorial/example content findings from the 2026-09-11 review
jeremymanning Sep 11, 2026
cf68cca
fix(plotly): honour frame_kwargs, keep zoom animation-only, anchor a …
jeremymanning Sep 11, 2026
d4d81ea
fix(ndims=1): concise date ticks on matplotlib so labels never collide
jeremymanning Sep 11, 2026
f2e7a35
fix(plot): a nested-list input's legend names its outer groups
jeremymanning Sep 11, 2026
d3f75ab
docs(projectile_kalman): say what the forecast figures show
jeremymanning Sep 11, 2026
fd3948c
fix(matplotlib): marker= on a line fmt stays one artist, marked at th…
jeremymanning Sep 11, 2026
a422a97
fix(surface): colour hull vertices from their nearest points; headles…
jeremymanning Sep 11, 2026
5c09e1b
Merge W5: tutorials/examples content fixes
jeremymanning Sep 11, 2026
46c7170
Merge W1: predict calendar/reuse/seasonal/warning fixes
jeremymanning Sep 11, 2026
1e1abb4
notes: merges W1/W2/W5/W6, surface-colour root cause, open design que…
jeremymanning Sep 11, 2026
32506e9
fix(plot): the categorical line path lists its legend in category order
jeremymanning Sep 11, 2026
fe2565f
fix(plotly): name every hoverable data trace like its legend entry; k…
jeremymanning Sep 11, 2026
97d3245
test: account for transform= in the panel roster; the date axis uses …
jeremymanning Sep 11, 2026
69c1ff7
Merge W4a: forecast/truth/time-axis review fixes
jeremymanning Sep 11, 2026
bfbace3
fix(animate): keep every observation, move every morph frame, show ca…
jeremymanning Sep 11, 2026
d3fefd6
fix(cluster): reject flat model kwargs in a cluster dict spec instead…
jeremymanning Sep 11, 2026
07dd98d
Merge fix/1.1-release-review (69c1ff7d) into the animation-core fixes
jeremymanning Sep 11, 2026
fa9a2a6
fix(plot): an explicit legend=False wins over names=
jeremymanning Sep 11, 2026
af8cbdf
Merge branch 'fix/1.1-release-review' into worktree-agent-a551b1e7532…
jeremymanning Sep 11, 2026
d2d74d9
Merge branch 'fix/1.1-release-review' into worktree-agent-a1cf9c0c41c…
jeremymanning Sep 11, 2026
a2e19ba
Merge branch 'fix/1.1-release-review' into worktree-agent-aa4e8f5b24e…
jeremymanning Sep 11, 2026
785dca5
Merge W7: align/impute/manip fixes, pipeline cluster replay, warning …
jeremymanning Sep 11, 2026
2deac69
fix(transform): polars frames work; datatype checks via the shared he…
jeremymanning Sep 11, 2026
9b39e38
fix(plotly): tag animated data legend proxies hyp_legend_proxy, not t…
jeremymanning Sep 11, 2026
4428df9
Merge branch 'fix/1.1-release-review' into worktree-agent-a02d608da03…
jeremymanning Sep 11, 2026
83b99d6
Merge W10: flat cluster spec keys raise; legend=False wins over names=
jeremymanning Sep 11, 2026
2151cfe
fix(matplotlib): keep label_alpha as the label box's own alpha
jeremymanning Sep 11, 2026
5b14ca5
fix(animate): keep line reveal timing on the refined grid; labels fol…
jeremymanning Sep 11, 2026
44bc2c4
docs(plot): docstring for _palette_continuation's sample helper (GH #…
jeremymanning Sep 11, 2026
7f45de7
notes: merge status, full-suite result, CHANGELOG drafts backup
jeremymanning Sep 11, 2026
4d6dd7c
Merge W3 batch 1: plotly markers, hue alpha, hover names, cells, anim…
jeremymanning Sep 11, 2026
45c4424
test(animate): state the chemtrails/hue-window/unequal-length audit c…
jeremymanning Sep 11, 2026
ed67c60
fix(plotly): animated continuous hue travels with the data (3-D colou…
jeremymanning Sep 11, 2026
6b81505
fix(plot): record the palette colours and legend ranks on a plotly fi…
jeremymanning Sep 11, 2026
ff1574e
fix(plotly): 3-D data lines render at the requested width; animations…
jeremymanning Sep 11, 2026
472ca09
fix(plotly): clip the 3-D density volume grid to the cube so its edge…
jeremymanning Sep 11, 2026
bd23c09
fix(plotly): Play/Pause controls sit below a visible x axis' tick lab…
jeremymanning Sep 11, 2026
171e74a
docs(plotly): trail-trace bookkeeping comments name hyp_trail_index a…
jeremymanning Sep 11, 2026
5755324
Merge W4b: palettes, markers at samples, labels, legends, panels, ax=…
jeremymanning Sep 11, 2026
f5ab128
Merge fix/1.1-release-review (57553242) into the animation-core fixes
jeremymanning Sep 11, 2026
61b59bd
fix(specs): reject flat model kwargs in every dispatcher's dict spec …
jeremymanning Sep 11, 2026
250c30b
Merge branch 'fix/1.1-release-review' into worktree-agent-aa9afcc4679…
jeremymanning Sep 11, 2026
a047c20
test(animate): animated observation markers land exactly on the refin…
jeremymanning Sep 11, 2026
acca7f1
test(plotly): hierarchy width test accounts for the 3-D GL width comp…
jeremymanning Sep 11, 2026
d33ca33
Merge branch 'fix/1.1-release-review' into worktree-agent-a02d608da03…
jeremymanning Sep 11, 2026
afbb528
test(plotly): marker=/markers= on a line style marks only the observa…
jeremymanning Sep 11, 2026
cc418fa
Merge W11: flat model-spec keys raise across dispatchers
jeremymanning Sep 11, 2026
4669ddb
docs(plot): correct unit-scale limits, slow-notice timing and title m…
jeremymanning Sep 11, 2026
27d4686
docs(changelog): record the 2026-09-11 review fixes
jeremymanning Sep 11, 2026
096f5a7
Merge branch 'fix/1.1-release-review' into worktree-agent-a02d608da03…
jeremymanning Sep 11, 2026
457ab93
notes: merge status and verification pipeline
jeremymanning Sep 11, 2026
0ed1e8f
Merge W3 batch 2: plotly animated hue, 3-D line width, density clip, …
jeremymanning Sep 11, 2026
db01768
Merge W9: animation core (every observation a grid vertex, moving mor…
jeremymanning Sep 11, 2026
b630802
docs(changelog): animation-core and plotly animation review fixes
jeremymanning Sep 11, 2026
53c7673
fix(predict): time-policy warnings name the caller's line, once per p…
jeremymanning Sep 11, 2026
25da7cc
Merge warning attribution fix for predict time policies
jeremymanning Sep 11, 2026
461d2e3
fix(predict): print float steps without representation noise
jeremymanning Sep 11, 2026
b1f857c
docs: re-execute all 25 tutorials and regenerate gallery thumbnails
jeremymanning Sep 11, 2026
82951bf
notes: Colab plotly-default lesson
jeremymanning Sep 11, 2026
e684d7c
notes: verification pipeline results
jeremymanning Sep 11, 2026
e9db520
tour: one interactive viewer, no IFrame warning (fresh-Colab check)
jeremymanning Sep 11, 2026
794edd6
notes: Colab and CI status at e684d7cd
jeremymanning Sep 11, 2026
f06f67f
notes: final Colab and CI results
jeremymanning Sep 11, 2026
63522a2
notes: final CI result for the candidate
jeremymanning Sep 11, 2026
36c7a4b
fix: start an animated forecast at the frame's drawn endpoint
jeremymanning Sep 12, 2026
9f26b99
fix: regenerate the animate_forecast gallery thumbnail with the others
jeremymanning Sep 12, 2026
9b881ee
test: cover serial/window reveals and model comparisons for the forec…
jeremymanning Sep 12, 2026
0efe4d9
notes: record the stale animated-forecast clips and the masked-exit-s…
jeremymanning Sep 12, 2026
6f2cfd9
fix: anchor a regrouped animation's forecast on its drawn head too
jeremymanning Sep 12, 2026
e17ae0f
notes: record the regrouped-reveal gap and the probes that closed it
jeremymanning Sep 12, 2026
c433b8f
docs: regenerate the animated-forecast clips under the fixed anchor
jeremymanning Sep 12, 2026
ba8ae06
notes: candidate c433b8f0 verified locally -- pipeline, tour, scope c…
jeremymanning Sep 12, 2026
a23e4b7
notes: fresh Colab run at c433b8f0, and the ANIM-forecast legend-prox…
jeremymanning Sep 12, 2026
6af09ef
notes: hover contract re-checked on the animated-forecast figure; Col…
jeremymanning Sep 12, 2026
7364720
notes: third form of the masked-error trap (gh api escape sequences +…
jeremymanning Sep 12, 2026
21ee47b
notes: CI 17/17 success at c433b8f0, and the verified handover state
jeremymanning Sep 12, 2026
c7dea47
Move project notes into compound lessons
jeremymanning Oct 4, 2026
a4b146a
plotly: name nested-list leaves by their group; 3-D observation marke…
jeremymanning Oct 8, 2026
b240258
tour: make the flagged visual cases reviewable from their pictures
jeremymanning Oct 8, 2026
183de73
Raise core dependency floors to the first releases with cp310-cp313 w…
jeremymanning Oct 8, 2026
8d02cb8
market_sectors: read XOM shares from Exxon Mobil Corp (CIK 34088)
jeremymanning Oct 8, 2026
b851358
notes: 2026-10-08 visual sign-off round -- verdicts, decisions, pendi…
jeremymanning Oct 8, 2026
c1b7adc
describe: 'average' is the mean of the per-dataset curves; show=False…
jeremymanning Oct 8, 2026
888e231
describe: regression test for a bare array with format_data=False
jeremymanning Oct 8, 2026
279cd73
matplotlib: no gridlines on axis_scale='data' axes, matching plotly
jeremymanning Oct 8, 2026
ddd98ae
plot docstring: datetime t= on a flat list, and animated plotly file …
jeremymanning Oct 8, 2026
cb0f9a9
Reveal animated truth= rows as the drawn forecast reaches them
jeremymanning Oct 8, 2026
387e770
Continue the palette past observed colours for default forecast groups
jeremymanning Oct 8, 2026
bdbcebf
ci: apt installs skip recommends and retry, so a slow mirror can't ti…
jeremymanning Oct 8, 2026
5dda619
docs: re-execute all 25 tutorials on the integrated release fixes
jeremymanning Oct 8, 2026
5520987
docs: regenerate the market_sectors gallery thumbnail (XOM history fr…
jeremymanning Oct 8, 2026
ea7f90a
tour: LDA text plots list each document's plotted position instead of…
jeremymanning Oct 8, 2026
fa4a56f
notes: integration and verification at 5520987b/ea7f90a2; round-2 rev…
jeremymanning Oct 8, 2026
ea7a5f4
explore: hover labels open toward the axes centre; tour GUI case open…
jeremymanning Oct 9, 2026
a5c8393
scripts: one statement per line in the GUI screencast recorder (ruff)
jeremymanning Oct 9, 2026
4c762c0
tour: show a cell's second table as plain HTML so Colab's table scrip…
jeremymanning Oct 9, 2026
027b818
notes: round 2, GUI screencast, final candidate 4c762c0c verified
jeremymanning Oct 9, 2026
60e0595
scripts: GUI recorder logs the pointer position per frame and always …
jeremymanning Oct 9, 2026
4e0dbae
docs: post_build looks for the site under $READTHEDOCS_OUTPUT/html
jeremymanning Oct 9, 2026
0ad2a36
docs: fix defects found in the built site (gallery cards, duplicate o…
jeremymanning Oct 9, 2026
998581d
docs: drop hierarchy.rst's own contents directive (furo renders it as…
jeremymanning Oct 9, 2026
09f6e8b
docs(api): fix reStructuredText markup leaking into the rendered API …
jeremymanning Oct 9, 2026
61b5cda
test(docs): scan the built API pages for leaked markup
jeremymanning Oct 9, 2026
40ea317
docs: tutorial setup cell collapsed under the title; one Methods/Attr…
jeremymanning Oct 9, 2026
7a24086
lessons: check every built docs page in a browser (checker attached)
jeremymanning Oct 9, 2026
d21e034
docs: tutorials-page teaser GIFs at their native 200px (they were str…
jeremymanning Oct 9, 2026
52d2b7c
notes: docs site checked page by page; final candidate d21e0340 verified
jeremymanning Oct 9, 2026
f5a0af2
docs: link the changelog from the docs home page and the 1.1 release …
jeremymanning Oct 9, 2026
33810c6
fix: describe sweeps a reducer instance's dimensionality; sklearn clo…
jeremymanning Oct 9, 2026
9648e25
describe: reduce=None raises instead of drawing a flat 1.0 curve
jeremymanning Oct 9, 2026
3121910
scoring: rank complete models only; align truth=/mask= by label
jeremymanning Oct 9, 2026
b2d35ad
auto-install: check installed extras against their declared versions
jeremymanning Oct 9, 2026
f4ea89c
notes: release notes cover the red-team fixes; checklist no longer na…
jeremymanning Oct 9, 2026
0585a5a
scoring: label checks go through the shared datatype helpers
jeremymanning Oct 9, 2026
e95777f
docs: re-execute the tutorials the scoring and describe fixes touch
jeremymanning Oct 9, 2026
a0c30a1
tests: the multibyte render script gives up on a browser that never a…
jeremymanning Oct 9, 2026
4d84983
notes: red-team findings fixed, sign-off recorded, re-cut plan
jeremymanning Oct 9, 2026
fc372c2
release: date 1.1.0 for the re-cut (2026-10-09)
jeremymanning Oct 9, 2026
cb0c543
tests: the live Kaggle load skips on a network outage, like the FiveT…
jeremymanning Oct 9, 2026
54c89af
tests: a stalled render script reports where it is
jeremymanning Oct 9, 2026
75d6c72
tests: the render script exits as soon as it has its verdict
jeremymanning Oct 9, 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
  •  
  •  
  •  
16 changes: 0 additions & 16 deletions .claude/CLAUDE.md
Original file line number Diff line number Diff line change
@@ -1,16 +0,0 @@
<!-- skillnote:begin -->
## Notes (skill-compounder)

- **2026-09-03** Executing a docs/tutorials launch notebook locally runs its Colab '%pip install ... git+...@dev-1.0' cell, which overwrites the venv's editable hypertools with the stale REMOTE branch mid-run (seen 2026-09-03 as '48 dimensions ... static plots support at most 2'). scripts/execute_tutorial.py now tags 'pip install' cells skip-execution in memory; after any other notebook run, check 'pip show hypertools' says Editable, and 'pip install -e .[dev]' if not. <!-- id:n4007036607x464 -->
- **2026-09-03** Regenerating a docs/tutorials notebook from its example script (Plan 4 pattern, used 5x on 2026-09-03): generate cells from the script's section markers with a scratchpad script (install cell carried over byte-identical), never leave a HyperAnimation as a cell's last expression (its repr embeds an 89 KB video), execute with scripts/execute_tutorial.py (skips pip-install cells, disables HF progress bars), save the GIF at <=15 fps / ~300 frames (a 900-frame GIF is 13 MB), record the measured visible-output set in tests/test_examples_are_native.py, re-measure the budget once, commit script+notebook+GIF+gate together. Gallery pages for show=False examples need the HyperAnimation scraper in docs/conf.py. <!-- id:n2702453330x716 -->
- **2026-09-03** When a push will trigger hosted CI, commit the session-note/memory update BEFORE the push (seen twice on 2026-09-03: note committed right after each push, so every CI cycle had to be re-run or cancelled on the note-only head; PR #283). <!-- id:n2368342412x243 -->
- **2026-09-03** Bluesky launch thread (notes/bluesky-launch, gitignored): re-verify atproto lexicon limits with curl before posting (video cap moved 100->300 MB between July and Sept 2026), count post graphemes with the regex module's \X (not len), render clips from the examples' construct_artifact() via the scratchpad render script, and expect tutorial 'Full code' links to 404 until RTD builds master. <!-- id:n1333699239x397 -->
- **2026-09-03** Yahoo v8 chart 'range=max&interval=1d' silently returns 3-MONTH bars (AAPL: 169 rows since 1984); pass explicit period1/period2 epoch bounds to get daily. SEC XBRL needs a User-Agent with a contact (the project's pyproject email); 'companyconcept' can be EMPTY for a filer (ABT, KO) whose 'companyfacts' has the concept (measured 2026-09-03). <!-- id:n1509545511x350 -->
- **2026-09-03** Tutorial notebooks are GENERATED (scripts/generate_tutorial_notebook.py) then executed (scripts/execute_tutorial.py); after changing SPECS (dpi, prose) ALWAYS regenerate before re-executing -- on 2026-09-04 a dpi revert was made in the generator only, and two 10-minute re-executions wrote the stale dpi. Video size is CRF-bound now (was a fixed 1800 kbit/s), so dpi does not trade size. <!-- id:n1221150995x395 -->
- **2026-09-04** After a library behaviour change (new error text, a warning removed, a new return type), grep docs/tutorials/*.ipynb for prose or stored outputs demonstrating the OLD behaviour and re-execute those notebooks (2026-09-04: io.ipynb taught hyp.load(df) as a TypeError after load gained passthrough; align/reduce stored the glyph warning; lsl_streaming stored the liblsl ERR line). <!-- id:n2056000368x385 -->
- **2026-09-05** When the finding IS that a file/match is absent, chain ls/grep with '|| true' (or test -e) so the expected exit 1 is not logged as a tool failure <!-- id:n3078545694x153 lesson:c1376737082x187-e1648091495x17 -->
- **2026-09-05** Guard sed -n "$((n-12)),..." on a possibly-empty $n: an empty grep result makes sed see '-12' as an option; use grep -B/-A context instead <!-- id:n708886190x146 lesson:c662557965x199-e2303256208x40 -->
- **2026-09-05** A 'clean' docs build (sphinx -W -E -a) does NOT remove sphinx-gallery's generated docs/auto_examples/ (gitignored): after deleting or renaming an example, rm -rf docs/auto_examples first or -W fails on 'document isn't included in any toctree' for the stale pages (2026-09-05, after the gallery consolidation). <!-- id:n391712600x317 -->
- **2026-09-05** Subagent dispatch prompts must state the no-mocks rule verbatim ('no mock objects, no monkeypatching library functions as spies; prove behaviour with real observables'): on 2026-09-05 an agent verified 'never touches the network' by monkeypatching requests.get and seaborn_dataset; replaced with mtime/.part/uncached-URL-raises observables. <!-- id:n4091109334x348 -->
- **2026-09-05** Never assert absolute font-metric numbers (probe heights, figure inches, pixel rows) in tests: CI's matplotlib (3.11.1) hints text differently from the local 3.10.8 -- 2026-09-05 two new tests failed on every CI job while green locally; assert against the library's own probe on the same axes, or relative tolerances. <!-- id:n1698690037x325 -->
<!-- skillnote:end -->
10 changes: 10 additions & 0 deletions .claude/compound/lessons/bluesky-launch-thread/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
name: bluesky-launch-thread
description: Use when preparing or posting the Bluesky launch thread (notes/bluesky-launch, gitignored).
created: 2026-10-03
origin: notes kept in CLAUDE.md
---
Re-verify atproto lexicon limits with curl before posting (the video cap has moved, 100 to
300 MB). Count post graphemes with the regex module's \X, not len. Render clips from the
examples' construct_artifact() via the scratchpad render script. Expect tutorial "Full
code" links to 404 until Read the Docs builds master.
8 changes: 8 additions & 0 deletions .claude/compound/lessons/commit-notes-before-push/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
name: commit-notes-before-push
description: Use when about to push a branch that triggers hosted CI and a session-note or memory update is still uncommitted.
created: 2026-10-03
origin: notes kept in CLAUDE.md
---
Commit the session-note or memory update BEFORE the push. A note committed right after the
push moves the head to a note-only commit, and every CI cycle has to be re-run or cancelled.
15 changes: 15 additions & 0 deletions .claude/compound/lessons/datatype-gate-no-raw-isinstance/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
name: datatype-gate-no-raw-isinstance
description: Use when writing or delegating hypertools library code that checks whether an input is a DataFrame, Series or array.
created: 2026-10-09
origin: project hypertools, session f69d921d
---
Classify inputs with the shared helpers in hypertools/_shared/helpers.py
(is_frame_dataset, is_series_like, is_array_dataset, as_pandas_dataframe), never with
`isinstance(x, pd.DataFrame)` or `isinstance(x, pd.Series)`. tests/test_datatype_gate.py
scans the package and fails with "datatype check(s) outside the shared coercion layer"
for each raw check, so polars and other frames are treated like pandas ones.
An agent's targeted test run usually does not include that file, and the failure then
shows up only in the full suite: put `tests/test_datatype_gate.py` in the test list of
any prompt that adds input handling. To tell a row-labelled pandas Series from a polars
one, use `is_series_like(x)` plus a non-callable `x.index`.
18 changes: 18 additions & 0 deletions .claude/compound/lessons/docs-site-check-every-page/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
name: docs-site-check-every-page
description: Use when asked to build the hypertools Sphinx / Read the Docs site and confirm it looks correct, or when reviewing built docs pages in a browser.
created: 2026-10-09
origin: project hypertools, session f69d921d
---
Check EVERY built page with a scripted browser, never a hand-picked list. Build the RTD
way (from docs/: READTHEDOCS=True READTHEDOCS_GIT_IDENTIFIER=master READTHEDOCS_OUTPUT=$OUT
sphinx -T -b html -d _build/doctrees . $OUT/html, then python docs/post_build.py), serve
$OUT/html with `python -m http.server`, and run check_built_site.py (beside this lesson;
playwright is in .venv; see also scripts/verify_docs_playwright.py). It reads each page's
::before/::after content for ERROR/WARNING, broken images, console errors, leaked RST and
overflow at 1400px and 400px, and saves screenshots to look at.
Why: a sampled review passed the site while docs/hierarchy.html showed furo's red
"ERROR: Adding a table of contents" box from a `.. contents::` directive. That box is CSS
::before text, so sphinx -W (0 warnings), HTML text scans and link checkers cannot see it.
Before trusting 0 findings, plant a defect on a temporary copy of a page and confirm the
checker reports it.
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
import json
import os
import sys
from playwright.sync_api import sync_playwright

# usage: python check_built_site.py HTML_DIR BASE_URL OUT_DIR (serve HTML_DIR first: python -m http.server)
ROOT = sys.argv[1]
BASE = sys.argv[2].rstrip("/") + "/"
OUT = sys.argv[3]
os.makedirs(OUT, exist_ok=True)
pages = sorted(
os.path.relpath(os.path.join(d, f), ROOT)
for d, _, fs in os.walk(ROOT)
for f in fs
if f.endswith(".html") and not d.startswith(os.path.join(ROOT, "_"))
)
shots = [
p
for p in pages
if (
("/" not in p and not p.startswith("hypertools."))
or p.startswith("tutorials/")
or p == "auto_examples/index.html"
)
]
shots += [
"hypertools.plot.html",
"hypertools.predict.html",
"hypertools.describe.html",
"hypertools.io.LSLStream.html",
"hypertools.HyperAnimation.html",
]
JS = """() => {
const out={};
out.broken=[...document.images].filter(i=>i.complete&&i.naturalWidth===0).map(i=>i.getAttribute('src')).slice(0,5);
out.overflow=document.documentElement.scrollWidth-document.documentElement.clientWidth;
const pseudo=[]; for(const el of document.querySelectorAll('article *')){ for(const ps of ['::before','::after']){ const c=getComputedStyle(el,ps).content; if(c&&/ERROR|WARNING|unnecessary/i.test(c)) pseudo.push(el.tagName+'.'+el.className+': '+c.slice(0,80)); } }
out.pseudo=pseudo.slice(0,3);
out.sysmsg=document.querySelectorAll('.system-message, .problematic').length;
out.videos=[...document.querySelectorAll('video')].length;
const txt=[...document.querySelectorAll('article p, article li, article dd, article dt, article h1, article h2, article h3')].map(e=>{const c=e.cloneNode(true); c.querySelectorAll('code,pre,.math,script,style').forEach(x=>x.remove()); return c.textContent;}).join('\\n');
out.leaks=(txt.match(/[^\\n]{0,30}(``|:[a-z]+:`|\\.\\. [a-z-]+::)[^\\n]{0,30}/g)||[]).slice(0,3);
return out; }"""
res = {}
with sync_playwright() as pw:
b = pw.chromium.launch()
for theme in ["light"]:
ctx = b.new_context(viewport={"width": 1400, "height": 1800})
pg = ctx.new_page()
errs = []
pg.on(
"console",
lambda m: errs.append(m.text[:160]) if m.type == "error" else None,
)
pg.on("pageerror", lambda e: errs.append("PAGEERROR " + str(e)[:160]))
for p in pages:
errs.clear()
try:
pg.goto(BASE + p, wait_until="load", timeout=60000)
pg.wait_for_timeout(400)
except Exception as e:
res[p] = {"goto": str(e)[:100]}
continue
r = pg.evaluate(JS)
r["console"] = sorted(set(errs))[:4]
res[p] = r
if p in shots:
pg.screenshot(path=os.path.join(OUT, p.replace("/", "__") + ".png"))
# phone width overflow on every page
ctx = b.new_context(viewport={"width": 400, "height": 800})
pg = ctx.new_page()
for p in pages:
try:
pg.goto(BASE + p, wait_until="load", timeout=60000)
pg.wait_for_timeout(250)
res[p]["phone_overflow"] = pg.evaluate(
"()=>document.documentElement.scrollWidth-document.documentElement.clientWidth"
)
except Exception as e:
res[p]["phone"] = str(e)[:80]
b.close()
json.dump(res, open(os.path.join(OUT, "results.json"), "w"), indent=1)
bad = {
p: r
for p, r in res.items()
if r.get("broken")
or r.get("overflow", 0) > 2
or r.get("pseudo")
or r.get("sysmsg")
or r.get("leaks")
or r.get("console")
or r.get("phone_overflow", 0) > 2
or "goto" in r
}
print(len(res), "pages checked;", len(bad), "with findings")
for p, r in bad.items():
print(p, {k: v for k, v in r.items() if v and k not in ("videos",)})
13 changes: 13 additions & 0 deletions .claude/compound/lessons/figure-qa-three-separated-agents/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
name: figure-qa-three-separated-agents
description: Use when reviewing the figures of a hypertools notebook or the feature tour for correctness.
created: 2026-10-03
origin: notes kept in CLAUDE.md
---
Use three SEPARATED agents: one writes each figure's EXPECTED appearance from the notebook
code, prose and docstrings without seeing images; one describes the OBSERVED renders
without seeing code; one adjudicates with probes. This finds gaps solo eyeballing misses
(ax= palette ignored, z-label outside the tight bbox, a 2-D frame on the data, faded
recoloured forecasts). Render plotly outputs from their notebook JSON with kaleido (the
scratchpad review/manifest and tour_out/extract.py pattern), and re-run only the changed
figures each round.
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
name: forecast-index-is-not-dataset-index
description: Use when writing hypertools code that indexes schedules, lines or runs by a forecast.
created: 2026-10-03
origin: notes kept in CLAUDE.md
---
Forecast index != dataset index. A predict=[...] collection's forecasts are MODEL-MAJOR
(forecast i = model i//n_datasets, dataset i%n_datasets), and hue=/cluster= regrouping
makes RUN index != dataset index. Any code that touches a forecast must translate through
_model_forecast_owner / forecast_datasets (forecast -> source dataset) and _forecast_owner
/ _seg_ds (dataset -> final run) before indexing. The bug hides when the counts coincide
and shows as an IndexError in animated reveal lookups or wrong plotly hyp_dataset tags.
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
name: global-setting-as-context-manager
description: Use when changing hyp.set_autoinstall or adding another process-global setting that is both a direct call and a context manager.
created: 2026-10-03
origin: notes kept in CLAUDE.md
---
Model it as LIVE handle records (weakrefs, in construction order) plus a BASELINE folded
in by the weakref callback of a handle that dies unentered; take the newer of the top
record and the baseline by call order; mark exited records finished. The failure modes are
a restore-order race, retained handles, and a construct-then-enter race across threads.
Test overlapping blocks across threads, construct-then-enter interleaving, 100k discarded
direct calls (tracemalloc), and a block handle dying after exit.
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
name: legend-marker-on-line-artist
description: Use when a hypertools draw path puts a line's markers on a separate artist (fmt split, truth= overlay).
created: 2026-10-03
origin: notes kept in CLAUDE.md
---
A line whose markers are drawn on a SEPARATE artist shows a marker-less legend glyph. Keep
marker= on the line artist with markevery=[] so the legend handle carries it, and check
every marker-splitting draw path for this.
10 changes: 10 additions & 0 deletions .claude/compound/lessons/lsl-test-unique-stream-type/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
name: lsl-test-unique-stream-type
description: Use when writing or debugging a hypertools LSL test that resolves a stream by type.
created: 2026-10-03
origin: notes kept in CLAUDE.md
---
A test that resolves by type='EEG' fails whenever ANOTHER process advertises an idle EEG
outlet (a notebook kernel running the tutorial's synthetic outlet), because lsl_stream()
takes the first match. Give a test outlet a unique stream TYPE, as with the unique names,
and check pylsl.resolve_streams() for foreign outlets before blaming the library.
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
name: no-absolute-font-metrics-in-tests
description: Use when writing a hypertools test that asserts text or figure measurements.
created: 2026-10-03
origin: notes kept in CLAUDE.md
---
Never assert absolute font-metric numbers (probe heights, figure inches, pixel rows). CI's
matplotlib (3.11.1) hints text differently from the local 3.10.8, so such tests pass
locally and fail on every CI job. Assert against the library's own probe on the same axes,
or use relative tolerances.
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
name: notebook-pip-cell-overwrites-editable
description: Use when executing a docs/tutorials notebook locally in hypertools.
created: 2026-10-03
origin: notes kept in CLAUDE.md
---
A launch notebook's Colab cell `%pip install ... git+...@dev-1.0` overwrites the venv's
editable hypertools with the stale REMOTE branch mid-run (symptom: "48 dimensions ...
static plots support at most 2"). Execute with scripts/execute_tutorial.py, which tags
'pip install' cells skip-execution in memory. After any other notebook run, check that
`pip show hypertools` says Editable, and run `pip install -e .[dev]` if not.
10 changes: 10 additions & 0 deletions .claude/compound/lessons/pin-matplotlib-backend-for-colab/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
name: pin-matplotlib-backend-for-colab
description: Use when hypertools code or a notebook uses a matplotlib-only return API (fig.axes, .canvas, HyperAnimation .draw_frame/.on_frame/.n_frames, an internal hyp.plot call).
created: 2026-10-03
origin: notes kept in CLAUDE.md
---
Colab and Kaggle auto-select the PLOTLY render backend, so matplotlib-only return APIs
break there while passing locally (plot_stream's head plot, the tour's animation clock,
launch notebooks). Pin backend='matplotlib' at such call sites and test them under
hyp.set_interactive_backend('plotly'), the same preference Colab sets.
13 changes: 13 additions & 0 deletions .claude/compound/lessons/plotly-scene-sized-by-height/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
name: plotly-scene-sized-by-height
description: Use when sizing or calibrating a Plotly 3-D scene or its camera distance in hypertools.
created: 2026-10-03
origin: notes kept in CLAUDE.md
---
Plotly sizes a 3-D scene by its domain HEIGHT only and clips at the sides: the same
267x209 px cube appears in 600x300 and 1200x300 scenes, and a 300x600 scene's cube is 415
tall, cut at 300 wide. At hypertools' default eye the cube is 0.89 x height wide and 0.70
x height tall, and apparent size goes as 1/eye-distance only when backing OFF (an eye
nearer than about 0.8x clips the front). Name a calibration constant by its reference:
SCENE_CUBE_WIDTH_PER_HEIGHT = 1.4 means width per CUBE height, and reading it as width per
SCENE height backs the camera off 1.4x in every square panel cell.
9 changes: 9 additions & 0 deletions .claude/compound/lessons/readme-is-lowercase/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
name: readme-is-lowercase
description: Use when a hypertools test or script opens the repository readme by path.
created: 2026-10-03
origin: notes kept in CLAUDE.md
---
The repository's readme is lowercase `readme.md`. A test that opens 'README.md' passes on
macOS (case-insensitive) and fails on every Linux CI job. Check the tracked file name with
`git ls-files` before hard-coding a path in a test.
10 changes: 10 additions & 0 deletions .claude/compound/lessons/regenerate-before-reexecute/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
name: regenerate-before-reexecute
description: Use when changing SPECS (dpi, prose) for the generated tutorial notebooks in hypertools.
created: 2026-10-03
origin: notes kept in CLAUDE.md
---
Tutorial notebooks are GENERATED (scripts/generate_tutorial_notebook.py) and then executed
(scripts/execute_tutorial.py). After changing SPECS, ALWAYS regenerate before
re-executing; otherwise a 10-minute re-execution writes the stale value. Video size is
CRF-bound (not a fixed bitrate), so dpi does not trade against size.
15 changes: 15 additions & 0 deletions .claude/compound/lessons/regenerate-tutorial-notebook/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
name: regenerate-tutorial-notebook
description: Use when regenerating a docs/tutorials notebook from its example script in hypertools.
created: 2026-10-03
origin: notes kept in CLAUDE.md
---
1. Generate cells from the script's section markers with a scratchpad script; carry the
install cell over byte-identical.
2. Never leave a HyperAnimation as a cell's last expression (its repr embeds an 89 KB video).
3. Execute with scripts/execute_tutorial.py (skips pip-install cells, disables HF progress bars).
4. Save the GIF at <=15 fps and about 300 frames (a 900-frame GIF is 13 MB).
5. Record the measured visible-output set in tests/test_examples_are_native.py and
re-measure the budget once.
6. Commit script, notebook and GIF and the gate together.
Gallery pages for show=False examples need the HyperAnimation scraper in docs/conf.py.
Loading
Loading