From 0f9b4493159c97642d6c38fc8fa4b8dfef6e971a Mon Sep 17 00:00:00 2001 From: giles Date: Wed, 11 Mar 2026 23:02:22 +0000 Subject: [PATCH] Add :effects annotations to boundary.sx IO and signal primitives All 11 define-io-primitive entries now declare :effects [io]. Signal primitives annotated: signal/deref/computed = [] (pure), reset!/swap!/effect/batch = [mutation]. Co-Authored-By: Claude Opus 4.6 --- shared/sx/ref/boundary.sx | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/shared/sx/ref/boundary.sx b/shared/sx/ref/boundary.sx index 32c2d08..5680b1c 100644 --- a/shared/sx/ref/boundary.sx +++ b/shared/sx/ref/boundary.sx @@ -12,6 +12,7 @@ ;; (define-io-primitive "name" ;; :params (param1 param2 &key ...) ;; :returns "type" +;; :effects [io] ;; :async true ;; :doc "description" ;; :context :request) @@ -38,6 +39,7 @@ (define-io-primitive "current-user" :params () :returns "dict?" + :effects [io] :async true :doc "Current authenticated user dict, or nil." :context :request) @@ -45,6 +47,7 @@ (define-io-primitive "request-arg" :params (name &rest default) :returns "any" + :effects [io] :async true :doc "Read a query string argument from the current request." :context :request) @@ -52,6 +55,7 @@ (define-io-primitive "request-path" :params () :returns "string" + :effects [io] :async true :doc "Current request path." :context :request) @@ -59,6 +63,7 @@ (define-io-primitive "request-view-args" :params (key) :returns "any" + :effects [io] :async true :doc "Read a URL view argument from the current request." :context :request) @@ -66,6 +71,7 @@ (define-io-primitive "csrf-token" :params () :returns "string" + :effects [io] :async true :doc "Current CSRF token string." :context :request) @@ -73,6 +79,7 @@ (define-io-primitive "abort" :params (status &rest message) :returns "nil" + :effects [io] :async true :doc "Raise HTTP error from SX." :context :request) @@ -82,6 +89,7 @@ (define-io-primitive "url-for" :params (endpoint &key) :returns "string" + :effects [io] :async true :doc "Generate URL for a named endpoint." :context :request) @@ -89,6 +97,7 @@ (define-io-primitive "route-prefix" :params () :returns "string" + :effects [io] :async true :doc "Service URL prefix for dev/prod routing." :context :request) @@ -98,6 +107,7 @@ (define-io-primitive "app-url" :params (service &rest path) :returns "string" + :effects [io] :async false :doc "Full URL for a service: (app-url \"blog\" \"/my-post/\")." :context :config) @@ -105,6 +115,7 @@ (define-io-primitive "asset-url" :params (&rest path) :returns "string" + :effects [io] :async false :doc "Versioned static asset URL." :context :config) @@ -112,6 +123,7 @@ (define-io-primitive "config" :params (key) :returns "any" + :effects [io] :async false :doc "Read a value from host configuration." :context :config) @@ -138,11 +150,13 @@ (declare-signal-primitive "signal" :params (initial-value) :returns "signal" + :effects [] :doc "Create a reactive signal container with an initial value.") (declare-signal-primitive "deref" :params (signal) :returns "any" + :effects [] :doc "Read a signal's current value. In a reactive context (inside an island), subscribes the current DOM binding to the signal. Outside reactive context, just returns the value.") @@ -150,23 +164,27 @@ (declare-signal-primitive "reset!" :params (signal value) :returns "nil" + :effects [mutation] :doc "Set a signal to a new value. Notifies all subscribers.") (declare-signal-primitive "swap!" :params (signal f &rest args) :returns "nil" + :effects [mutation] :doc "Update a signal by applying f to its current value. (swap! s inc) is equivalent to (reset! s (inc (deref s))) but atomic.") (declare-signal-primitive "computed" :params (compute-fn) :returns "signal" + :effects [] :doc "Create a derived signal that recomputes when its dependencies change. Dependencies are discovered automatically by tracking deref calls.") (declare-signal-primitive "effect" :params (effect-fn) :returns "lambda" + :effects [mutation] :doc "Run a side effect that re-runs when its signal dependencies change. Returns a dispose function. If the effect function returns a function, it is called as cleanup before the next run.") @@ -174,5 +192,6 @@ (declare-signal-primitive "batch" :params (thunk) :returns "any" + :effects [mutation] :doc "Group multiple signal writes. Subscribers are notified once at the end, after all values have been updated.")