• v0.8.2 b1bf05633d

    v0.8.2
    All checks were successful
    CI / gate (push) Successful in 1m9s
    CI / image (push) Successful in 53s
    Stable

    joeyr released this 2026-08-09 20:34:33 -05:00 | 98 commits to main since this release

    list_events could return fewer events than the day held, with no error.

    Fixed

    • Expansion happens per resource instead of per calendar. Every resource on
      a calendar was merged into a single VCALENDAR before expanding, and two
      resources whose events share a UID collapsed into one occurrence:

      3 resources -> 3 events   [three distinct uids]
      3 resources -> 1 events   [same uid, different times]
      3 resources -> 2 events   [two share a uid]
      

      RFC 4791 §4.1 requires a calendar object resource to hold exactly one UID, so
      the resource is the correct unit of expansion — merging across resources
      merged things the spec calls distinct. Duplicate UIDs across resources are
      themselves a violation, but they occur; caldav's own iCloud notes list
      duplicate_in_other_calendar_with_same_uid_breaks.

      Found because a delete made the same query in the same window return more
      events than it had a moment earlier — 3 resources reporting 1 event, then 2
      reporting 2. Nothing raised. This is the third defect of that shape in this
      project and the second to survive a green suite.

      The merge existed to cover servers that split a series' RECURRENCE-ID
      overrides across resources. No compliant server does and iCloud does not, but
      the trade is worth naming: on one that did, this would show the master's
      occurrence un-overridden and the override, as two events.

    • A resource that fails to expand now costs only itself. The expansion was
      wrapped once around the whole calendar and returned no events at all on
      failure, so one malformed series could empty a day. That is the isolation
      parse_components already applied to a resource that will not parse.

    Changed

    • tool/events logs both filters — the calendar list, and the query's
      length together with how many events it matched from. A short count has two
      very different explanations, and the line carrying only the window could not
      tell a search that correctly matched one event from a read that lost two.
      Diagnosing the defect above needed exactly that distinction and the line did
      not carry it.

      The query's length, never its text: it is user input and this line goes to
      Portainer.

    Docs

    • docs/runbook.md and docs/oauth-persistence.md are gone. Roughly a thousand
      lines of them were ✅ DONE phase narrative describing a deployment that now
      exists. What was still live — the outstanding live checks, the failure-mode
      table, adding a second tenant, backing out — moved to docs/plan.md,
      which also carries the 0.9.0 recurrence design and the decisions behind it.
    Downloads