Skip to content

Commit 4ff6773

Browse files
committed
docs(design): the Web leg of examples/portable could not be a build, and the measurement said so
The design record asked for that example to build for all five platforms it names. The fifth has twelve of the fifteen interfaces and the program uses two of the three absent ones, so the link names seven symbols: kal_process_{spawn,wait,close} and kal_task_{start,join,wait,wake}. Neither way of making it build is acceptable -- #ifdef-ing the one file in this ecosystem that exists to contain no platform awareness, or having openkal-emscripten provide operations it cannot perform, which is the shape clause 6.2 forbids. So the criterion was wrong and the example is better for it: it demonstrates the boundary, with the linker's own output as the reading. mcpplibs/openkal#30 carries the example's own correction.
1 parent 59a10d4 commit 4ff6773

1 file changed

Lines changed: 12 additions & 2 deletions

File tree

.agents/docs/2026-09-11-sdk-toolchains-and-ios-local-verification.md

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -497,13 +497,23 @@ write it down.
497497
| E1: Android shares the implementation | merged and green against the RELEASED engine: both ABIs build, objects name no C library symbol, and a program over openkal alone ran on an emulator | yes (openkal-linux 0.12.0) |
498498
| E2: iOS reuses it | `openkal-macos` compiles for the three iOS rows on a macOS runner, and its objects name no C library symbol -- the same check the Android leg applies, against a third libc | the `cfg` line is in `examples/portable`; the compile leg belongs to openkal-macos's own CI and is not in this batch |
499499
| E3: the Web implementation conforms | the conformance suite passes for the groups it provides; and a program using `kal_process_spawn` fails at LINK naming the symbol, which is the criterion that the absent groups are absent rather than present-and-failing | yes -- 86 held, 0 did not hold, 13 not observed; and `wasm-ld: error: obj/main.o: undefined symbol: kal_process_spawn` |
500-
| E4: the examples build | `examples/portable` builds for the host and for all five platforms it names -- it currently builds for NONE, which is why this is a criterion and not an assumption | host, both Android ABIs: yes. The Web leg resolves once `openkal-emscripten` is in the index, which is the ring this ecosystem cannot untangle: the example is always second |
500+
| E4: the examples build | `examples/portable` builds for the host and for all five platforms it names -- it currently builds for NONE, which is why this is a criterion and not an assumption | THE CRITERION WAS NOT SATISFIABLE AS WRITTEN, and the measurement is what said so. Host and both Android ABIs: yes. The Web leg RESOLVES and then fails at link naming seven symbols -- `kal_process_{spawn,wait,close}` and `kal_task_{start,join,wait,wake}` -- because this program uses `openkal.process` and `openkal.task` and this platform has neither. That is the mechanism working, not a gap: the line stays and the example now demonstrates the BOUNDARY, with the linker's own output as the evidence |
501501

502502
**The premise held.** A macos-15 runner ships Xcode 16.4 with both located SDKs
503503
at 18.5 and five bootable iOS simulator runtimes (18.5, 18.6, 26.0, 26.1,
504504
26.2). So D1, D2 and D4 are all CI claims and none of them is local-only.
505505

506-
**Two things the measurement changed about this design.**
506+
**Three things the measurement changed about this design.**
507+
508+
The Web leg of `examples/portable` cannot be a build. This record asked for
509+
the example to build "for all five platforms it names", and the fifth is a
510+
platform with twelve of the fifteen interfaces while the program uses two of
511+
the three absent ones. Nothing about that is fixable without either
512+
`#ifdef`-ing the one file in this ecosystem that exists to contain none, or
513+
having `openkal-emscripten` provide operations it cannot perform -- the shape
514+
clause 6.2 forbids. So the criterion was wrong and the example is better for
515+
it: a program about portability that also shows where portability stops, with
516+
seven undefined symbols as the reading.
507517

508518
`simctl-run` is a boot-and-spawn wrapper and not a bundle builder. This record
509519
said a bare Mach-O "cannot be launched by `simctl`, so the program wraps it in

0 commit comments

Comments
 (0)