@@ -236,4 +236,32 @@ 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 ──────────────
240+ //
241+ // ⚠️ A BACKEND MUST DEFINE EVERY PROPERTY WORD, INCLUDING THE ONES THAT READ
242+ // ZERO, OR THE QUESTION ITSELF FAILS TO LINK.
243+ //
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.
251+ //
252+ // ld.lld: error: undefined symbol: kal_fs_props
253+ // >>> referenced by fs.cppm:136
254+ // >>> obj/main.o:(kal::fs::properties@openkal.fs())
255+ //
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.
259+ //
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+
239267} // extern "C"
0 commit comments