Changelog

All notable changes to Hayashi, following Keep a Changelog.

Full source changelog available on GitHub.

Unreleased dev
In development

Added

  • Safe modes for hay dist-update: --help and --check subcommands, argument validation with unit tests.
  • English-only user-facing output: all error messages and printed strings translated to English. Mathematical notation preserved.
  • Interpreter decomposition: interpreter.rs split into focused submodules (execution, eval_expr, dispatch, helpers, value, models). Reduced from ~4,800 to ~680 lines.
  • for loop index/value binding: for i, v in list and for k, v in dict.
  • try/catch/finally: finally block runs regardless of try outcome.
  • hay install with version: install specific release tags.
  • hay list shows versions from plugin metadata.
  • match as contextual keyword: works as identifier and match expression.
  • list_files() builtin: list_files(dir) and list_files(dir, pattern).
  • ++ and -- operators: increment and decrement with desugaring to x = x + 1.

Changed

  • quietly(expr) deprecated: use quietly on / quietly off instead.
  • Validation runner exit semantics: non-zero exit on blocked cases unless --allow-blocked.
  • data_source field added to validation cases.

Fixed

  • CSV export column order: to_csv no longer sorts columns alphabetically. Insertion order preserved via IndexMap.
  • append() losing string columns: get_string() now handles Categorical columns. Previously, append() produced empty strings for columns with repeated values (dates, tickers, sectors).
  • Plugin resolution on Windows: HOME falls back to USERPROFILE. Searches executable directory. HAYASHI_PATH uses ; separator on Windows.
  • Validation workflow: repaired validation.yml, added Greeners checkout.
  • Clippy warnings: fixed empty_line_after_doc_comments, too_many_arguments, needless_range_loop.
Pre-release builds — beta versions are for testing only.
  • Not published to crates.io — binary-only GitHub releases
  • May contain known or unknown bugs — do not use in production
  • API may change before the stable release
  • Report issues on GitHub Issues
2026-07-07

Fixed

  • CSV export column order: to_csv no longer sorts columns alphabetically. Insertion order preserved via IndexMap (replacing HashMap in Greeners).
  • append() losing string columns: get_string() now handles Categorical columns. Previously, append() produced empty strings for any column with repeated values (dates, tickers, sectors).
  • Plugin resolution on Windows: HOME falls back to USERPROFILE. Searches executable directory (exe_dir/, exe_dir/plugins/). HAYASHI_PATH uses ; as separator on Windows.

Added

  • ++ and -- operators: increment and decrement.
  • for i, v in list and for k, v in dict: index/value and key/value bindings.
  • try/catch/finally: finally block runs regardless of try outcome.
  • hay install with version: install specific release tags.
  • hay list shows versions from plugin metadata.
  • match as contextual keyword: works as identifier and match expression.
  • list_files() builtin: list_files(dir) and list_files(dir, pattern).
  • Interpreter decomposition: interpreter.rs reduced from ~4,800 to ~680 lines.
  • English-only user-facing output: all error messages and printed strings in English.

Changed

  • quietly(expr) deprecated: use quietly on / quietly off instead.
  • Greeners 1.5.3: IndexMap for column order preservation, get_string handles Categorical.
2026-09-17

Added

  • ++ and -- operators: increment/decrement with desugaring to x = x + 1.
  • Greeners 1.5.1 dependency (crates.io, no path dependency).

Fixed

  • Greeners dependency: uses greeners = "1.5.1" from crates.io in release builds.
  • crossbeam-epoch advisory: updated to fix RUSTSEC advisory.
2026-08-25

Added

  • Hybrid plugin system: Native Rust (.so/.dll), WebAssembly (.wasm), and Script (.hay) tiers via unified HayashiPlugin trait.
  • Pipe placeholder _: df |> ols(lw ~ yos, _) passes piped value to any argument position.
  • ttest option unequal=false: pooled (equal-variance) t-test.
  • Validation programme expanded to 40 cases: ridge, elasticnet, nbreg, oprobit, mlogit, SUR.
  • Parametric-bootstrap SE for VECM with inference enabled.

Fixed

  • Non-numeric columns in generate and estimators: to_float() instead of hard-failing on Boolean/Categorical columns.
  • Hardened URL downloads (security, contributed by Charles Shaw): SSRF prevention, DNS rebinding protection, timeout and size limits.
  • Clippy warnings fixed in Hayashi and Greeners.
  • argmin updated to resolve RUSTSEC-2024-0384.

Changed

  • ttest delegated to Greeners: interpreter is now a thin dispatcher.

Removed

  • Unused anyhow dependency (contributed by Charles Shaw).
2026-06-25

Added

  • codebook(df): detailed variable description.
  • Normality tests: swilk, sfrancia, sktest.
  • mutate, group_by, pivot_longer, pivot_wider, select: pipe-friendly data manipulation.
  • print() multi-arg: print(a, b, sep=", ").
  • Improved error messages: source line preview, Levenshtein suggestions, stack traces.

Fixed

  • Keywords followed by ( now parse as function calls.
  • Parser line numbers correctly tracked after newlines.
  • MomentHelpers exported from Greeners.
2026-06-24

Added

  • Operators: % (modulo), ** (power alias), compound assignment (+=, -=, *=, /=, %=).
  • gmm(): two-step efficient GMM with Hansen J-test.
  • cmnlogit(): conditional multinomial logit.
  • help(about) and help(license).

Fixed

  • Formula parsing unified: all 53 estimators accept bare and string formulas.
2026-06-24

Fixed

  • Scalar math functions: sqrt(), abs(), ln(), exp(), pow(), sin(), cos(), tan(), ceil(), floor(), round(), sign(), factorial(), normalden(), invnormal(), max(), min() now work as standalone expressions.
2026-06-24

Breaking Changes

  • Extension: .hy.hay
  • Binary: hayashihay
  • Namespaced imports: import("mod")mod::func()

Added

  • CI/CD: GitHub Actions with fmt, clippy, test on Linux/macOS/Windows; release workflow for 4 targets.
  • Namespaces: import("mod", as=alias), import("mod", only=["f"]).
  • REPL: tab completion, syntax highlighting, colored prompt, fish-style history hints.
  • Date/time: date(), datetime(), year(), month(), day(), hour(), dow().
  • Collinearity detection: QR-based across 9 estimators with Stata-style (omitted) display.
  • VS Code extension 0.2.0.

Fixed

  • Stack overflow on Windows/macOS: 32 MB stack for main thread.
  • Cross-platform tests: std::env::temp_dir() replaces hardcoded paths.
  • Package manager: correct user/repo/ directory structure.
2026-06-15

Initial Release

  • 46 estimators: OLS, IV, Logit, Probit, Poisson, NegBin, Tobit, Heckman, FE, RE, Arellano-Bond, System GMM, ARIMA, GARCH, VAR, VECM, Lasso, Ridge, DID, RD, Cox, Fama-MacBeth, and more.
  • Stata-like syntax with closures, pipe, match, f-strings, try/catch.
  • 8 I/O formats: CSV, TSV, JSON, DTA, Excel, Parquet, SQLite, ODBC.
  • Plugin system with package manager (hay install).
  • Post-estimation: test, nlcom, margins, bootstrap, esttab, vif, hausman, predict.
  • 387 tests, 59 examples, ~110 help topics.
  • 100% Rust — no C, no Fortran, no system BLAS/LAPACK.