events: injected federation transport (fed-sx-ready) + 6 tests
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 41s
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 41s
fetch abstracts how a peer's agenda arrives: (fetch peer-id ws we) ->
{:status :ok :occurrences} | {:status :error}. ev/federated-agenda-via merges
local + trusted peers fetched via the transport; unreachable peers degrade
gracefully. ev/peer-fetch = in-process adapter; ev/federation-status reports
reachability. A real fed-sx transport drops in unchanged. 278/278 green.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -163,3 +163,70 @@
|
||||
(some
|
||||
(fn (iv) (ev-fed-overlaps? iv qs qe))
|
||||
(ev/federated-busy local-db peers trust actor)))))
|
||||
|
||||
;; ---- injected transport (real fed-sx / signed fetch) ----
|
||||
;; The in-process merge above expands a peer's local :store directly. In
|
||||
;; production a peer's agenda arrives over a transport. `fetch` abstracts that:
|
||||
;; (fetch peer-id ws we) -> {:status :ok :occurrences (...)} | {:status :error :reason ...}
|
||||
;; The same merge works for any transport; an unreachable peer (:error) is
|
||||
;; skipped (graceful degradation), never breaking the agenda.
|
||||
|
||||
(define
|
||||
ev-find-peer
|
||||
(fn
|
||||
(peers pid)
|
||||
(cond
|
||||
((empty? peers) nil)
|
||||
((= (ev/peer-id (first peers)) pid) (first peers))
|
||||
(else (ev-find-peer (rest peers) pid)))))
|
||||
|
||||
;; In-process transport adapter: resolves a peer-id against a peer list and
|
||||
;; expands its :store. Lets the in-process model run through the same `fetch`
|
||||
;; interface a remote transport implements.
|
||||
(define
|
||||
ev/peer-fetch
|
||||
(fn
|
||||
(peers)
|
||||
(fn
|
||||
(pid ws we)
|
||||
(let
|
||||
((p (ev-find-peer peers pid)))
|
||||
(if
|
||||
(nil? p)
|
||||
{:status :error :reason :unknown-peer}
|
||||
{:status :ok :occurrences (ev/agenda (ev/peer-store p) ws we)})))))
|
||||
|
||||
;; Local agenda (:local) merged with each trusted peer's agenda fetched via the
|
||||
;; injected `fetch` transport, sorted by start, tagged with :origin. Peers that
|
||||
;; fail to fetch contribute nothing.
|
||||
(define
|
||||
ev/federated-agenda-via
|
||||
(fn
|
||||
(local-store trusted-ids ws we fetch)
|
||||
(let
|
||||
((acc (list)))
|
||||
(begin
|
||||
(for-each
|
||||
(fn (o) (append! acc o))
|
||||
(ev-tag-origin (ev/agenda local-store ws we) :local))
|
||||
(for-each
|
||||
(fn
|
||||
(pid)
|
||||
(let
|
||||
((res (fetch pid ws we)))
|
||||
(when
|
||||
(= (get res :status) :ok)
|
||||
(for-each
|
||||
(fn (o) (append! acc o))
|
||||
(ev-tag-origin (get res :occurrences) pid)))))
|
||||
trusted-ids)
|
||||
(ev-fed-sort acc)))))
|
||||
|
||||
;; Reachability report: ((peer-id :ok|:error) ...) for the trusted peers.
|
||||
(define
|
||||
ev/federation-status
|
||||
(fn
|
||||
(trusted-ids ws we fetch)
|
||||
(map
|
||||
(fn (pid) (list pid (get (fetch pid ws we) :status)))
|
||||
trusted-ids)))
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"lang": "events",
|
||||
"total_passed": 272,
|
||||
"total_passed": 278,
|
||||
"total_failed": 0,
|
||||
"total": 272,
|
||||
"total": 278,
|
||||
"suites": [
|
||||
{"name":"calendar","passed":51,"failed":0,"total":51},
|
||||
{"name":"availability","passed":22,"failed":0,"total":22},
|
||||
@@ -12,7 +12,7 @@
|
||||
{"name":"ticket","passed":31,"failed":0,"total":31},
|
||||
{"name":"notify","passed":7,"failed":0,"total":7},
|
||||
{"name":"reminders","passed":21,"failed":0,"total":21},
|
||||
{"name":"federation","passed":23,"failed":0,"total":23}
|
||||
{"name":"federation","passed":29,"failed":0,"total":29}
|
||||
],
|
||||
"generated": "2026-06-07T07:46:42+00:00"
|
||||
"generated": "2026-06-07T08:12:04+00:00"
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# events scoreboard
|
||||
|
||||
**272 / 272 passing** (0 failure(s)).
|
||||
**278 / 278 passing** (0 failure(s)).
|
||||
|
||||
| Suite | Passed | Total | Status |
|
||||
|-------|--------|-------|--------|
|
||||
@@ -12,4 +12,4 @@
|
||||
| ticket | 31 | 31 | ok |
|
||||
| notify | 7 | 7 | ok |
|
||||
| reminders | 21 | 21 | ok |
|
||||
| federation | 23 | 23 | ok |
|
||||
| federation | 29 | 29 | ok |
|
||||
|
||||
@@ -218,6 +218,63 @@
|
||||
(ev/federated-free? local-db peers (list (quote berlin)) (quote nia) (ev-dt 2026 6 1 15 0) (ev-dt 2026 6 1 16 0))
|
||||
true))))))
|
||||
|
||||
;; ---- injected transport (fed-sx) ----
|
||||
(define
|
||||
ev-fd-tx-run-all!
|
||||
(fn
|
||||
()
|
||||
(let
|
||||
((local (ev/schedule (ev/empty) (quote yoga) (ev-dt 2026 6 1 9 0) 60 nil 20))
|
||||
(berlin (ev/peer (quote berlin) (ev/schedule (ev/empty) (quote meetup) (ev-dt 2026 6 1 12 0) 90 nil 100)))
|
||||
(ws (ev-date 2026 6 1))
|
||||
(we (ev-date 2026 6 2)))
|
||||
(let
|
||||
((fetch (ev/peer-fetch (list berlin))))
|
||||
(do
|
||||
;; in-process adapter merges through the transport interface
|
||||
(ev-fd-check!
|
||||
"federated-agenda-via merges local + fetched peer"
|
||||
(map (fn (o) (list (get o :origin) (get o :id)))
|
||||
(ev/federated-agenda-via local (list (quote berlin)) ws we fetch))
|
||||
(list (list :local (quote yoga)) (list (quote berlin) (quote meetup))))
|
||||
;; an unreachable / unknown peer degrades gracefully
|
||||
(ev-fd-check!
|
||||
"an unreachable peer is skipped, agenda still served"
|
||||
(map (fn (o) (get o :origin))
|
||||
(ev/federated-agenda-via local (list (quote berlin) (quote ghost)) ws we fetch))
|
||||
(list :local (quote berlin)))
|
||||
;; reachability report
|
||||
(ev-fd-check!
|
||||
"federation-status reports per-peer reachability"
|
||||
(ev/federation-status (list (quote berlin) (quote ghost)) ws we fetch)
|
||||
(list (list (quote berlin) :ok) (list (quote ghost) :error)))
|
||||
;; an explicit remote transport (returns occurrences directly)
|
||||
(let
|
||||
((remote-fetch
|
||||
(fn
|
||||
(pid rws rwe)
|
||||
(if (= pid (quote tokyo))
|
||||
{:status :ok
|
||||
:occurrences (list (ev-occ (quote standup) (ev-dt 2026 6 1 8 0) 15))}
|
||||
{:status :error :reason :unreachable}))))
|
||||
(do
|
||||
(ev-fd-check!
|
||||
"a remote transport's occurrences merge with origin tags"
|
||||
(map (fn (o) (list (get o :origin) (get o :id)))
|
||||
(ev/federated-agenda-via local (list (quote tokyo)) ws we remote-fetch))
|
||||
(list (list (quote tokyo) (quote standup)) (list :local (quote yoga))))
|
||||
(ev-fd-check!
|
||||
"remote transport error degrades to local only"
|
||||
(map (fn (o) (get o :origin))
|
||||
(ev/federated-agenda-via local (list (quote osaka)) ws we remote-fetch))
|
||||
(list :local))))
|
||||
;; no trusted peers -> only local
|
||||
(ev-fd-check!
|
||||
"no trusted peer ids yields only local"
|
||||
(map (fn (o) (get o :origin))
|
||||
(ev/federated-agenda-via local (list) ws we fetch))
|
||||
(list :local)))))))
|
||||
|
||||
(define
|
||||
ev-federation-tests-run!
|
||||
(fn
|
||||
@@ -228,4 +285,5 @@
|
||||
(set! ev-fd-failures (list))
|
||||
(ev-fd-run-all!)
|
||||
(ev-fd-fb-run-all!)
|
||||
(ev-fd-tx-run-all!)
|
||||
{:failures ev-fd-failures :total (+ ev-fd-pass ev-fd-fail) :passed ev-fd-pass :failed ev-fd-fail})))
|
||||
|
||||
@@ -18,7 +18,7 @@ capacity rules, transactional booking, and a flow-driven notification dispatcher
|
||||
|
||||
## Status (rolling)
|
||||
|
||||
`bash lib/events/conformance.sh` → **272/272** (Phases 1-4 + 6 ext: fed f/b, waitlist, EXDATE/RDATE, overrides, booking-notify, reschedule-notify)
|
||||
`bash lib/events/conformance.sh` → **278/278** (Phases 1-4 + 7 ext: fed f/b, waitlist, EXDATE/RDATE, overrides, booking/reschedule-notify, fed transport)
|
||||
|
||||
## Ground rules
|
||||
|
||||
@@ -82,10 +82,19 @@ lib/events/api.sx ── (events/schedule) (events/book) (events/agenda) ──
|
||||
- [x] cross-instance events (peer calendar) — trust-gated stub
|
||||
- [x] tests: federated agenda merge
|
||||
- [x] federated availability/free-busy across trusted peers
|
||||
- [ ] real transport behind `ev/peer-agenda` (fed-sx / signed fetch)
|
||||
- [x] injected transport (`ev/federated-agenda-via` + fetch) — fed-sx-ready, graceful degradation
|
||||
|
||||
## Progress log
|
||||
|
||||
- 2026-06-07 — Injected federation transport (last plan item). `fetch` abstracts
|
||||
how a peer's agenda arrives: (fetch peer-id ws we) -> {:status :ok :occurrences}
|
||||
| {:status :error}. `ev/federated-agenda-via` merges local + each trusted
|
||||
peer fetched via the transport, tagged with :origin; an unreachable peer is
|
||||
skipped (graceful degradation), never breaking the agenda.
|
||||
`ev/peer-fetch` is the in-process adapter (runs the existing store model
|
||||
through the same interface); a real fed-sx/signed-fetch transport drops in
|
||||
unchanged. `ev/federation-status` reports per-peer reachability. +6 tests,
|
||||
278/278 green. All plan checkboxes (incl. extensions) now ticked.
|
||||
- 2026-06-07 — Reschedule notifications (extension). When an event carries
|
||||
per-occurrence overrides, `ev/reschedule-notifications` reads the roster at
|
||||
each overridden occurrence's ORIGINAL occ-key and produces a reschedule
|
||||
|
||||
Reference in New Issue
Block a user