v0.2.3: bump sigil-caldav to 0.10.1 for DST-aware recurrence
Recurring CalDAV events tagged with TZID=Europe/Athens (or any tz) that were originally serialized when Athens was on standard time (EET=UTC+2) rendered with the wrong wall-clock during DST viewing (EEST=UTC+3). The renderer's underlying recurrence walker in sigil-caldav <= 0.10.0 advanced occurrences by 86400-second multiples in UTC, preserving the UTC instant across DST transitions and drifting the wall-clock by the DST shift.
Per RFC 5545, a TZID-tagged DTSTART anchors the wall-clock in that tz; each occurrence's UTC instant must be re-resolved per its actual fire date so the OS zoneinfo can apply the correct offset. sigil-caldav v0.10.1 implements this via add-days-in-tz / add-months-in-tz built on list->time-in-tz. Bureau picks up the fix transitively — no bureau-side renderer changes required.
Adds a regression test that mirrors the live CodeSignal Simulation event: weekly TZID=Europe/Athens master at 17:00 EET in winter, expanded to Apr 28 2026 (EEST), must produce 14:00 UTC (= 17:00 EEST wall-clock). Test passes under sigil >= 0.14.4 binaries; under the v0.14.3 test runner it fails because of unrelated time.c regressions (Bug 1/2 from sigil-lang v0.14.4's notes — fixed in the deployed bureau binary which statically links sigil-stdlib v0.14.7 through the refreshed lockfile).
sigil.lock: sigil-caldav 0.10.0 -> 0.10.1, sigil-stdlib v0.14.3 -> v0.14.7 (transitive auto-derive bump).
package.sgl | 4 ++--
sigil.lock | 23 +++++++++++------------
test/test-bureau.sgl | 27 +++++++++++++++++++++++++++
3 files changed, 40 insertions(+), 14 deletions(-)package.sglmodified
(package name: "bureau" version: "0.2.2" version: "0.2.3" sigil: "^0.14" description: "MCP server for Fastmail email and calendar" url: "https://codeberg.org/sigil/bureau" (from-git url: "codeberg:sigil/sigil-log" version: "^0.14.0") (from-git url: "codeberg:sigil/sigil-mcp" version: "^0.14.0") (from-git url: "codeberg:sigil/sigil-jmap" version: "^0.9.1") (from-git url: "codeberg:sigil/sigil-caldav" version: "^0.9.1")) (from-git url: "codeberg:sigil/sigil-caldav" version: "^0.10.1")) tasks: (list (tasksigil.lockmodified
(package name: "sigil-stdlib" url: "codeberg:sigil/sigil-lang" ref: "^0.14" sha: "9f34f58f175fef93c1322ab3522e85eee2809450" sha: "7739f35a54d2eb03e3e79ce1eb1eb366326a23db" package-selector: "sigil-stdlib" version: "0.14.3") version: "0.14.7") (package name: "sigil-json" url: "codeberg:sigil/sigil-json" ref: "^0.14.0" version: "0.9.1") (package name: "sigil-caldav" url: "codeberg:sigil/sigil-caldav" ref: "^0.9.1" sha: "24bd34009ba324f201dea3e9e7e221cceddae9fa" version: "0.9.1") ref: "^0.10.1" sha: "878f163835e1e4f3fcb38973861cb30eeafbb262" version: "0.10.1") (package name: "sigil-http" url: "codeberg:sigil/sigil" ref: "^0.9.0" sha: "0123d3fc7d2dd37e5c27e9fade7d11b817deb21a" package-selector: "sigil-http") (package name: "sigil-crypto" url: "codeberg:sigil/sigil" ref: "^0.9.0" sha: "0123d3fc7d2dd37e5c27e9fade7d11b817deb21a" package-selector: "sigil-crypto") url: "codeberg:sigil/sigil-crypto" ref: "^0.14.0" sha: "0123d3fc7d2dd37e5c27e9fade7d11b817deb21a") (package name: "sigil-sxml" url: "codeberg:sigil/sigil-sxml" ref: "^0.9.0" sha: "081b6337c28d2ae55cd7658002cd6bc5e79ea07b" version: "0.9.1") ref: "^0.14.0" sha: "a33eb522bfd485dcc490c8db5ea599d7215027ff" version: "0.14.0"))test/test-bureau.sglmodified
(assert-true (string-contains? result "Team standup")) (assert-true (string-contains? result "Room 42"))))) (test "TZID-tagged recurring event keeps wall-clock across DST" ;; Regression for the CodeSignal Simulation/Team-coffee miscount. ;; A weekly meeting with TZID=Europe/Athens and a winter master ;; (17:00 EET = 15:00 UTC on Jan 13 2026) must render Apr 28's ;; occurrence at 17:00 EEST (14:00 UTC), not 18:00 (the UTC-naive ;; walker's drift) and not 16:00 (the EET-offset rendering of the ;; correct UTC observed on the broken sigil-stdlib v0.14.3). (let* ((ics (string-append "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nBEGIN:VEVENT\r\n" "UID:[email protected]\r\n" "DTSTART;TZID=Europe/Athens:20260113T170000\r\n" "DTEND;TZID=Europe/Athens:20260113T180000\r\n" "SUMMARY:Simulation - Estimation/Planning\r\n" "RRULE:FREQ=WEEKLY;BYDAY=TU\r\n" "END:VEVENT\r\nEND:VCALENDAR")) (master (car (ical-parse ics))) (range-start (parse-ical-datetime "20260428T000000Z")) (range-end (parse-ical-datetime "20260429T000000Z")) (occurrences (ical-expand-recurrence master start: range-start end: range-end))) (assert-equal 1 (length occurrences)) ;; 14:00 UTC is the wall-clock anchor 17:00 in EEST (UTC+3). (assert-equal "20260428T140000Z" (format-ical-datetime (ical-event-dtstart (car occurrences)))))) (test "event without location" (let* ((ts-start (parse-iso8601 "2026-03-14T14:00:00Z")) (event (ical-event summary: "Focus time"