# Changes — Revision history for Cron::Toolkit

1.04  2026-08-29
    - Accept Quartz-style named last-weekday aliases (MONL, TUEL, …, SUNL)
      so they normalize like named nth-weekday (MON#3 → 1#3, MONL → 1L)
    - DOW name rewrite now treats L, #, and cron punctuation as valid
      followers, not only word boundaries (MONL was rejected as Invalid characters)

1.03  2026-08-20
    - Fixed test data generator so it never emits both tz and utc_offset on the same case
      (resolves seasonal ±3600s failures caused by conflicting timezone/offset data; see #2)
    - Regenerated t/data/cron_tests.json under the new rules
    - Added regression cases for the step-pattern hour-boundary fix from 1.02
      (*/15 near 22:58:45 → 22:59:00, not midnight)

1.02  2025-06-22
    - Fixed bug in next()/previous() for step expressions (e.g. */15) near hour boundaries
      (22:58:45 case now correctly returns 22:59:00 instead of 00:00:00)
    - Removed erroneous year-adjustment logic that could corrupt timestamps on rollover
    - All existing tests continue to pass

0.08 2025-11-23
    - Final pre-1.0 release
    - Over 400 data-driven tests covering every token, leap years, DST, all time zones
    - Full Unicode support in POD (=encoding utf-8)
    - Beautiful field reference table
    - Comprehensive documentation with SYNOPSIS showing wrapped ranges and Feb 29 + Monday
    - Added BUGS AND CONTRIBUTIONS section
    - Ready for CPAN

0.04 2025-10-22
    - Added new_from_crontab() with environment expansion and user extraction
    - @aliases mapped to full Quartz equivalents
    - Symmetric bounded next()/previous() with auto-clamping
    - time_zone() now validates via DateTime::TimeZone and recalculates offset (DST-aware)
    - next() gains max_iter guard (prevents infinite loops)
    - Added next_occurrences(), as_string(), to_json(), dump_tree()
    - English descriptions now fuse naturally across fields
    - 50+ new tests

0.03 2025-10-15
    - Renamed from Cron::Describe → Cron::Toolkit
    - Full Quartz support: L, LW, W, #, wrapped DOW ranges (6→2), step-on-range
    - Both DOM and DOW may be specified → AND logic (unique!)
    - Natural-language English descriptions via AST visitors
    - Bounded searches with begin_epoch / end_epoch

0.02 2025-10-10
    - Initial Quartz syntax support (seconds, year field, L/W/#)
    - Automatic Unix → Quartz conversion
    - AST-based parsing with pattern classes

0.01 2025-10-01
    - First release
