@@ -236,32 +236,34 @@ void* kal_alloc(kal_uintptr size, kal_uintptr align) {
236236// rather than an omission.
237237void kal_free (void *, kal_uintptr, kal_uintptr) {}
238238
239- // ── Capability words for the layers this machine does not have ─────────── ───
239+ // ── The interfaces this machine does not have are absent, and stay absent ───
240240//
241- // ⚠️ A BACKEND MUST DEFINE EVERY PROPERTY WORD, INCLUDING THE ONES THAT READ
242- // ZERO, OR THE QUESTION ITSELF FAILS TO LINK .
241+ // ⚠️ NO `kal_fs_props`, NO `kal_task_props`, AND THAT IS THE MECHANISM RATHER
242+ // THAN AN OMISSION .
243243//
244- // The specification's queries are inline functions over these objects:
245- //
246- // inline props properties() { return props{kal_fs_props}; }
247- //
248- // so a program that merely ASKS whether a filesystem exists takes the address
249- // of `kal_fs_props`. Leaving it undefined on a machine that has no filesystem
250- // makes the question unanswerable in the strongest sense: it does not link.
244+ // 0.1.3 defined both as zero, because a capability-querying program failed to
245+ // link against this backend:
251246//
252247// ld.lld: error: undefined symbol: kal_fs_props
253248// >>> referenced by fs.cppm:136
254249// >>> obj/main.o:(kal::fs::properties@openkal.fs())
255250//
256- // Measured while porting a capability-querying program to this backend. The
257- // program contained no filesystem call at all — the reference came from the
258- // query, which is the pattern the whole specification is built on.
251+ // That error is clause 6.1 working. "An interface that an implementation does
252+ // not provide is absent as a link-time definition, and a consumer that uses it
253+ // fails to link." Clause 6.2's table is explicit about which question each
254+ // mechanism answers: the LINKER answers "was an interface used that the
255+ // implementation does not provide", and a capability word answers "how does
256+ // this implementation behave WITHIN AN INTERFACE IT PROVIDES".
259257//
260- // Zero is the correct value and is already the specified reading: "an
261- // unassigned position reads as zero, so that a program compiled against a later
262- // specification behaves correctly against an earlier implementation". A machine
263- // with no filesystem and no scheduler is that case taken to its limit.
264- const kal_uintptr kal_fs_props = 0 ;
265- const kal_uintptr kal_task_props = 0 ;
266-
258+ // Defining the word for an interface with no operations answers the second
259+ // question about something that cannot be asked the first. The program then
260+ // proceeds past the point the linker existed to stop it at, and reaches
261+ // `kal_fs_open` — undefined — or worse, believes it has a filesystem with no
262+ // capabilities. SURFACE.txt says the same thing in the other direction: an
263+ // implementation "exports the names of the interfaces it provides and exports
264+ // no other name beginning with kal_".
265+ //
266+ // 0.1.3 is retracted. A program that asks this backend about a filesystem is a
267+ // program that should not build against this backend, and the graph is where
268+ // that is decided.
267269} // extern "C"
0 commit comments