a987bdce

Prepare a release of ical 0.3.0.0 and ical-recurrence 0.2.0.0

Version bumps and changelog for the seven fixes that landed in #31–#37. **Nothing is published** — this only prepares the release.

## Versions

| package | from | to |
| --- | --- | --- |
| `ical` | 0.2.0.0 | **0.3.0.0** |
| `ical-recurrence` | 0.1.0.0 | **0.2.0.0** |

Both bumps are major. Every entry either changes what the parser accepts or changes a `Validity` instance, and two error types gain constructors, so nothing here is safe for a caller that matches exhaustively or relies on the old bounds:

- `PropertyTypeParseError` gains `RecurrenceRulePartOutOfRange`
- `PropertyTypeFixableError` gains `RecurrenceRuleHasBothUntilAndCount`

No version bounds between the packages in this repo to update — they depend on each other by bare name.

## What's in it

**`ical` 0.3.0.0**, six RRULE fixes:

- `COUNT` was capped at 60, by `BYSECOND`'s sentence copy-pasted from three declarations down the same paragraph. `COUNT=100` was invalid, and `GenValid Count` was capped by the same bound so no test had ever used one. (#33)
- `BYSETPOS` was unbounded where the spec gives 1..366/-366..-1. (#33)
- A `BYDAY` ordinal could not have two digits: `10MO` through `53SU` were unparseable, as was a leading `+`. (#35)
- A `BYDAY` ordinal was bounded at ±5 instead of ±53, so `6MO`–`9MO` parsed into invalid values. (#35)
- A rule with both `UNTIL` and `COUNT` parsed silently; now a fixable error. (#36)
- Out-of-range rule part values across nine parts parsed into invalid values; now refused. (#37)

**`ical-recurrence` 0.2.0.0**, two recurrence fixes:

- `FREQ=DAILY;BYDAY=2MO` matched every day instead of Mondays — a forbidden value widened the recurrence set. (#32)
- An instance holding a leap second was kept or dropped depending on `DTSTART`'s value type. (#34)

#31 gets no entry, being test-only.

## Two things to check while reviewing

**Each entry says why the old behaviour was wrong**, not just what changed, following the two entries already in the file. Worth a skim to confirm the reasoning reads correctly to you — several of these are subtle and I wrote both the fix and the note.

**The `BYSECOND=60` consequence is called out explicitly** in the `ical-recurrence` entry: that rule part now generates no instance at all. It is a spec-legal rule part that became inert, and the changelog says so rather than burying it.

## Checks

`nix flake check` passes on this branch, rebased onto master with #37 in. `ical-gen` 1109 passing, `ical-recurrence-gen` 301, both 0 failing.

Suite timing

Time to Start Worker time Duration Time to finish Idle
Config 2s 1s 1s 4s 2s
Eval 1m38s 12s 12s 1m50s 1m34s
Build 1m49s 4m58s 14m38s 16m28s 9m55s
Suite 2s 5m12s 16m25s 16m28s 11m32s

Timeline

0s1m40s12m12m20s12m40s13m13m20s13m40s14m14m20s14m40s15m15m20s15m40s16m16m20s