Promotes defio from native OCaml special form to spec-level CEK evaluator feature. The IO registry is now the contract layer between evaluator and platform. Evaluator additions (spec/evaluator.sx): - *io-registry* mutable dict global (like *library-registry*) - io-register!, io-registered?, io-lookup, io-names accessors - defio-parse-kwargs! recursive keyword parser - sf-defio processes (defio "name" :category :data :params (...) ...) - "defio" dispatch in step-eval-list - step-sf-io: the contract function — validates against registry, then delegates to perform for IO suspension - "io" dispatch in step-eval-list Native OCaml defio handlers removed from: - sx_server.ml (~20 lines) - sx_browser.ml (~20 lines) - run_tests.ml (~18 lines) All replaced with __io-registry alias to spec's *io-registry*. IO accessor functions bound in run_tests.ml env so tests can call io-registered?, io-lookup, io-names. 10 new tests (spec/tests/test-io-registry.sx): - defio populates registry - io-lookup returns spec with name/category/returns/doc - io-registered?/io-names work correctly - kwargs parsing (batchable, cacheable, params) - io contract rejects unregistered ops - io contract passes validation for registered ops 2608/2608 tests passing (+10 new). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
16 KiB
16 KiB