ical: say what the spec says about COUNT and BYSETPOS
Two `Validity` instances in `ICal.PropertyType.RecurrenceRule` disagree with RFC 5545, in opposite directions.
## `Count` carries `BYSECOND`'s sentence
```haskell
instance Validity Count where
validate s@(Count w) =
mconcat
[ genericValidate s,
declare "Valid values are 0 to 60." $ -- <- this is BYSECOND's bound
w >= 0 && w <= 60
]
```
§3.3.10 says only this about COUNT, and bounds the value nowhere:
> The COUNT rule part defines the number of occurrences at which to
> range-bound the recurrence. The "DTSTART" property value always
> counts as the first occurrence.
"Valid values are 0 to 60" is the BYSECOND sentence, three declarations further down in the same paragraph.
So **`COUNT=100` — a weekly meeting for two years — is an invalid value today.** Two consequences:
- `parsePropertyFromText` hands back a `RecurrenceRule` that fails its own `Validity` for ordinary input.
- `genValid @Count` is the derived instance, so it is capped by the same wrong bound. **Nothing in the suite has ever exercised a count above 60.**
The fix drops the bound entirely, which makes the derived instance the honest one.
## `BySetPos` has the opposite problem
The instance declares only that the position is not zero, but §3.3.10 does give a range:
> Valid values are 1 to 366 or -366 to -1.
So `BYSETPOS=400` passes as valid. Now bounded.
## Why this goes first
Making the parser refuse values that fail their own `Validity` is the obvious follow-up, and it is a separate PR. It cannot come first: with `Count` as it is, that change would start rejecting `COUNT=100`.
## Two commits
1. **Red.** Both fail, and `Count`'s failure prints the borrowed sentence verbatim:
```
Count.considers an ordinary count valid
Violated: Valid values are 0 to 60.
BySetPos.rejects a set position past the number of days in a year
```
2. **Green.** Nine lines.
## Generators
`GenValid BySetPos` builds from the QuickCheck size, so it stays well inside 366 and needs no change. `GenValid Count` becomes unbounded, which is the point — but it does not blow up the property tests that expand recurrence rules, because the expansion is bounded by the limit day however large the count is. Measured: `ical-recurrence-gen` runs the same 8813 examples in the same time, and `ical-gen` goes 1080 → 1082 passing with 46127 examples.
Both suites green, `nix flake check` passes.
## How this was found
Probing `BYSECOND=60`, which led to a survey of what the RRULE parser accepts. Two further findings are recorded in the handoff and get their own PRs: out-of-range `BY*` values parsing into invalid values across eight rule parts, and `BYSECOND=60` producing different recurrence sets depending on `DTSTART`'s value type.