Skip to content

0.5.0 --- openkal 0.10's five operations, four implemented and one recorded - #16

Merged
Sunrisepeak merged 4 commits into
mainfrom
declarations-0.10
Aug 30, 2026
Merged

0.5.0 --- openkal 0.10's five operations, four implemented and one recorded#16
Sunrisepeak merged 4 commits into
mainfrom
declarations-0.10

Conversation

@Sunrisepeak

Copy link
Copy Markdown
Member

Part of the openkal 0.10 move: mcpplibs/openkal#25.

⚠️ A specification revision moves the whole graph or none of it. openkal is
the shared dependency of every package here and a version requirement is exact —
an implementation left at 0.9.0 while a consumer moves to 0.10.0 does not get its
own older contract; the two are irreconcilable and nothing resolves at all.

Branch declarations-0.10 exists in every implementation so the specification's
own cross-repository job builds against this one.

The commit message states what this package does with each of the five new
declarations and why.

…corded

⭐ THIS SYSTEM EXCLUDES PER HANDLE, WHICH IS WHAT openkal STATES. The other two
kernels carry an older record lock held by the PROCESS --- released as soon as
that process closes any descriptor for the node --- and have to reach past it to
the open-file form. Here there is nothing to reach past: `NtLockFile' is the
handle's.

⚠️ AND THIS SYSTEM'S EXCLUSION IS MANDATORY RATHER THAN ADVISORY: a write that
crosses a locked range is refused by the system, where elsewhere it is refused
only to a program that asked. That is a difference a caller can observe and it is
the environment's own; simulating the weaker one is not this implementation's to
do.

`kal_fs_capacity' reports the units this CALLER may use rather than the volume's
free total --- a quota makes the two differ, and the larger is not a number a
program can act upon.

`kal_fs_set_modified_at' does NOT open through `kal_fs_open': that one names
`FILE_NON_DIRECTORY_FILE', correctly, since it opens a file --- and a directory
is exactly what this declaration exists to reach. It opens for the attribute
alone, so a caller need not be able to write the contents to stamp them.

`kal_task_parallelism' counts the ACTIVE MASK and not the count field. This
record carries both and they differ whenever a program is confined to part of the
machine, which is the case a program sizing itself most needs to get right.

--- and the one that is not claimed -----------------------------------------

⚠️⚠️ `kal_process_spawn_bound' IS REFUSED, AND NOT BECAUSE THIS SYSTEM CANNOT.
It can: a job object with `JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE' ends every program
in the job when the last handle closes, which this system does when a process
dies however it dies. That is exactly the binding openkal describes.

It is not claimed because it has not been MEASURED here. The one consumer that
needs it composes `execve', and this system already declines `openkal.space', so
nothing on this system reaches the operation today --- and claiming a binding that
has never been exercised is the shape of answer openkal exists to refuse. It is
recorded as the next thing this implementation should do rather than as an
absence, and a caller that asks `kal_process_props' first is told.
⭐ CAUGHT BY THIS PACKAGE'S OWN CHECK, WHICH EXISTS FOR EXACTLY THIS.

    declared in src/*.h and exported by no .def:
            NtLockFile
            NtUnlockFile

A declaration in `src/win.h' and an entry in `port/*.def' are two statements of
one fact --- what this package imports from the object manager --- and the second
is what an import library is built from. A declaration without the entry compiles
and does not link, and the check turns that into a line naming the two names
rather than a linker message naming a symbol.

⚠️ It is the same shape as the source-exclusion list in the sibling C library:
a second statement of one fact falls behind the first, and the thing that catches
it is a check that compares them.
⚠️⚠️ THE TRANSLATION TABLE HAD NO ENTRY FOR A LOCK CONFLICT, because nothing in
this implementation took a lock until openkal 0.10.

`kal_fs_lock' without KAL_LOCK_WAIT reports `kal_err_again' where the range is
held --- that is the answer a caller POLLS UPON, and openkal says so. Without the
entry, `ERROR_LOCK_VIOLATION' fell to the default arm and became `kal_err_io':
a failure of the DEVICE rather than a conflict with another holder. A caller
reading that stops; a caller reading `again' retries.

⭐ IT IS DISTINCT FROM `ERROR_SHARING_VIOLATION', WHICH STAYS `permission'.
That one is a conflict over how a file was OPENED and is not resolved by asking
again. Two errors that look adjacent and mean opposite things for a caller.

Found by the specification's own conformance suite, on the observation added with
the operation --- which is the argument for adding the observation with the
operation.
⚠️⚠️ AN ENVIRONMENT MAY EXPORT A NAME AND NOT IMPLEMENT WHAT IT NAMES.

This system locks a byte range, and the three continuous-integration rows that
run ON it measure that it does. A fourth row cross-builds and runs the result
under an EMULATOR of this system, which exports `NtLockFile' and answers
`STATUS_NOT_IMPLEMENTED' when it is called.

⭐ SO THE PROPERTY IS NOT A PROPERTY OF THE VOLUME, NOR OF THE FORMAT. It is a
property of what is beneath the program at the moment it asks. A word that
claimed the position regardless would be describing the INTERFACE rather than the
environment --- and the whole purpose of a capability word is that a caller may
ask before it calls and be told the truth about where it is.

⚠️ THE ENQUIRY IS MADE ON A DIRECTORY, WHICH IS NOT A THING THIS SYSTEM LOCKS,
and that is what makes it answerable without disturbing anything. A system that
implements the operation refuses a directory as a wrong request; one that has not
implemented it says so with a different value, and that difference is the whole
of the question. Nothing is locked either way, and it is asked once.

Measured under that emulator, through the C library above: a lock now reports
`ENOSYS' --- which is true there --- rather than the suite reporting four
observations that did not hold. On the three rows that run on the system itself,
nothing changes and the observations hold.
@Sunrisepeak
Sunrisepeak merged commit abe7c11 into main Aug 30, 2026
4 checks passed
@Sunrisepeak
Sunrisepeak deleted the declarations-0.10 branch August 30, 2026 11:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant