From 206c8ea737fcc93f09613f132e730a86b60212c0 Mon Sep 17 00:00:00 2001 From: speak-agent Date: Sun, 20 Sep 2026 19:06:51 +0800 Subject: [PATCH 1/2] 0.10.0 --- the interfaces this implementation provides are stated, and there are fourteen openkal's specification names no set of interfaces: clause 3.3 withdrew the one it had named (`hosted`) because a name describing a class of environment is falsified by an environment nobody had in mind, and that one was falsified inside its own ecosystem within a release. Enumeration by the package replaced it, and a build tool reads the array at dependency resolution against the `requires-interfaces` a consumer states. FOURTEEN AND NOT FIFTEEN. `openkal.space` is absent: this environment has no operation upon an address space it can supply, and clause 3 says an implementation provides an interface in whole or not at all. A consumer that needs it is now refused here, before anything is compiled, and builds on openkal-linux --- which is the whole point of stating the set rather than a name for a class of environment. A name would have made this implementation and that one look alike. The array is GENERATED by `check-surface.sh --toml` and CI regenerates and diffs it against the objects, in the same step that already runs the surface comparison: the walk that decides whether each group is exported whole is the same walk that answers which interfaces are provided, so the two can never disagree. Backward compatible: an engine that predates the key reads `[kernel-abi]` as an unknown top-level table and ignores it. Co-authored-by: Claude Code --- .github/workflows/ci.yml | 14 ++++++++++++ mcpp.toml | 46 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b82a140..b8235c0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -462,6 +462,20 @@ jobs: test -n "$objs" || { echo "no objects were found" >&2; exit 1; } bash .spec/tools/check-surface.sh --complete .spec/SURFACE.txt $objs + # The array in mcpp.toml is a declaration, and a declaration is + # checked rather than trusted. The check is the comparison above + # stopped one step earlier: the walk that decides whether each group + # is exported whole already answers which interfaces this + # implementation provides, so regenerating and diffing is the same + # derivation rather than a second one. + bash .spec/tools/check-surface.sh --toml .spec/SURFACE.txt $objs > /tmp/derived.toml + awk '/^provides-interfaces = \[/{p=1} p{print} /^\]/{if(p)exit}' mcpp.toml > /tmp/declared.toml + if ! diff -u /tmp/declared.toml /tmp/derived.toml; then + echo "::error::mcpp.toml's provides-interfaces disagrees with the artefact" + exit 1 + fi + echo " ok the declaration is the artefact's own answer" + # The property this implementation exists to have. A program above openkal # may supply a C runtime of its own; an implementation that reached for # this environment's would have its calls resolve to the program's, and diff --git a/mcpp.toml b/mcpp.toml index 3e31ad1..3066a00 100644 --- a/mcpp.toml +++ b/mcpp.toml @@ -1,7 +1,7 @@ [package] namespace = "mcpplibs" name = "openkal-windows" -version = "0.9.0" +version = "0.10.0" description = "An implementation of openkal for Windows, written on the Win32 interfaces and the object manager beneath them, using no C runtime symbol." license = "Apache-2.0" @@ -17,6 +17,50 @@ provides = ["mcpp:kernel-abi=openkal"] authors = ["mcpplibs"] repo = "https://github.com/mcpplibs/openkal-windows" +# WHICH INTERFACES THIS IMPLEMENTATION PROVIDES, DERIVED FROM THE ARTEFACT AND +# NOT WRITTEN BY HAND. +# +# openkal's specification names no set of interfaces: clause 3.3 withdrew the +# one it had named (`hosted`) because a name describing a class of environment +# is falsified by an environment nobody had in mind, and that one was falsified +# inside its own ecosystem within a release. Enumeration by the package +# replaced it, and a build tool reads this array at dependency resolution +# against the `requires-interfaces` a consumer states in its own manifest -- +# the first of the three times clause 6.2 tabulates, and the earliest at which +# the question can be answered. +# +# FOURTEEN AND NOT FIFTEEN. `openkal.space` is absent: this environment has no +# operation upon an address space it can supply, and clause 3 says an +# implementation provides an interface in whole or not at all. A consumer that +# needs it is refused here and builds on openkal-linux, which is the whole +# point of stating the set rather than a name for a class of environment. +# +# GENERATED, AND CI DIFFS IT AGAINST THE OBJECTS: +# +# bash .spec/tools/check-surface.sh --toml .spec/SURFACE.txt \ +# $(find target -path '*/obj/*' -name '*.o' ! -name '*.m.o') +# +# BACKWARD COMPATIBLE. An engine that predates the key reads `[kernel-abi]` as +# an unknown top-level table and ignores it, so this manifest loads unchanged +# everywhere it loaded before. +[kernel-abi] +provides-interfaces = [ + "openkal.abort", + "openkal.stream", + "openkal.memory", + "openkal.env", + "openkal.time", + "openkal.random", + "openkal.fs", + "openkal.process", + "openkal.task", + "openkal.exec", + "openkal.terminal", + "openkal.net", + "openkal.datagram", + "openkal.timeout", +] + [dependencies] openkal = "0.14.0" From f65fc99e679b9d9d50d6b9ebb40627c3ae8fc101 Mon Sep 17 00:00:00 2001 From: speak-agent Date: Sun, 20 Sep 2026 19:17:14 +0800 Subject: [PATCH 2/2] ci: re-run against the specification branch of the same name openkal-windows's CI checks the specification out at a branch matching this one where it exists, which is how a cross-repository change is measured before either half merges. The specification's --toml mode lives on that branch.