Claude Code keeps per-project memory at <home>/.claude/projects/<key>/,
where <key> is the project's absolute path with every separator and the
drive colon turned into a dash. That makes it both rename-fragile and
machine-specific, and this project has hit each of those once:
- D:\DEV\Schunix -> D:\DEV\SchOS changed the key, and 43 memories were
invisible until moved across by hand.
- Development happens from Windows and from Linux, and each looks in a
different place for the same checkout.
Committing .claude/memory/ fixes both -- git carries it across renames
and between hosts -- and `import` puts it wherever the local machine
expects. .claude/settings.local.json stays ignored: those are per-machine
permissions.
The colon maps to a dash rather than being dropped. Deleting it gives
D-DEV-SchOS, which matches nothing and silently finds zero memories; that
was the first attempt. On Git Bash the key comes from `cygpath -w`,
because Claude Code is a Windows program and sees D:\DEV\SchOS, not
/d/DEV/SchOS.
6.2 KiB
6.2 KiB
- SchOS rename + git — Schunix is SchOS and the kernel is SchIFT; the tree is under local git, and the two bugs the rename caused.
- Cross-platform build - Windows, Linux, macOS and BSD all build it; clang everywhere, and the four host assumptions that used to break.
- Memory sync - memory lives in the repo at .claude/memory/; tools/memory-sync.sh moves it between machines.
- Schunix build environment — builds natively on Windows with clang/lld + mingw + Git Bash; WSL is gone, and the five latent bugs the move exposed.
- Syscalls: one table — declare in kernel/sys/table.inc only; linux_abi.c is generated, never hand-edited.
- Linux ABI decision — the native syscall ABI is being dropped; Linux numbering becomes the only ABI.
- Rewrite priorities — what actually blocks the OS, in order, plus a confirmed SMP bug in the syscall entry path.
- SMP and RAM-floor bugs — SMP works (five bugs, and why __thread is wrong for per-CPU data); the 224 MB floor is gone.
- SchFS and ramdisk root — the agreed BeFS/ZFS/btrfs synthesis, and the completed
make ramroot+ mkfs dedup work. - SchFS B-tree, phase 1 — the CoW B-tree is built and passing; run
make schfs-testafter touching it. - SchFS phase 2: real mount — mkschfs writes images, the kernel mounts them read-only;
make schfs-check, plus four traps worth remembering. - SchFS phase 3: writes — full write API, free map derived not stored, and
mount -t schfsworks; the VFS now dispatches throughstruct fs_ops. - DIRSIZ 14 -> 30 — filenames used to truncate silently; fixed by holding the HTree bucket at 256 bytes.
- Linux open flags — include/fcntl.h must hold Linux's values; a mismatch made
>>truncate. - Shared memory and mmap — shm + file-backed mmap work; pages you don't own must never reach kfree.
- Wall clock — the RTC was never read, so
datesaid 1970; kernel/core/time.c fixes it, plus the stale-image trap. - TTF rasteriser — glyf outlines (not CFF, and why); the composite-glyph trap that loses the letter "i".
- Text rendering — the layer replacing the 8x16 cell grid; metrics, surfaces, coverage blending, UTF-8.
- Console and TTY — ANSI parser, termios, UTF-8; the font is CP437 not Latin-1, plus five bugs that masqueraded as broken commands.
- Build speed — no-op make is ~2s now; what made it 1m48 and the traps that would undo it.
- PCI and drivers — bus enumeration, and where a driver that finds its own hardware goes.
- ISO boot —
make iso; needs El Torito no-emulation + ATAPI because the loader never uses INT 13h. - Ramdisk root sizing — the "disk full" was DOOM WADs, not FSSIZE; three Makefile knobs, and why excluding them is a licensing rule.
- Framebuffer device — /dev/fb0 is real and speaks Linux fbdev; never assume where the framebuffer lives.
- Crash screen — PSOGM lives in kernel/core/panic.c;
echo c > /proc/sysrqto trigger,make crashshotto photograph. - QR encoder — kernel/core/qr.c for crash reports;
make qrcheck, and the segno padding bug that is not ours. - Boot splash and logo — the loader draws the logo, not the kernel; STAGE2_SECTORS was in five places and is now in one.
- SchAPI direction — Schunix as a macOS-shaped system; the stable ABI is a library, not the syscall table.
- Roadmap and projects/ — the agreed order through to Schcom/SchWM/SchDE; the GUI and installer live outside the OS tree.
- Driver infrastructure — dynamic IRQ registration, a DMA arena, PCI capabilities; PCI interrupts are level/active-low.
- Network stack choice — don't write TCP; lwIP over FreeBSD over NetBSD, with the licence evidence.
- e1000 and driver layout — the NIC driver, drivers/ split by device class, and virtio-gpu as the QEMU default.
- virtio-gpu — the display class's second implementation; run with
-vga std -device virtio-gpu-pci. - Device model — one bus-agnostic list at /proc/devices; bus is provenance, class is capability, and the settled Linux-driver decision.
- usb.ids — shipped as /usr/share/usb.ids, BSD option of a dual licence; cached, not fetched per build.
- USB and xHCI — enumeration and control transfers work; written from the spec, because porting BSD's stack means porting newbus first.
- Licensing — Apache-2.0, copyright Nexoniarz; BSD drivers are usable and Linux ones are not.
- Layout migration — the bt/ → ports/ + lib/ + cmd/ restructure and the two Makefile traps it exposed.
- Verify by driving the shell — booting to a prompt proves nothing; run real commands over serial with paced input.
- /dev and /proc — how both are built; ps and top work now, one cosmetic gap left.
- TTY foreground pgrp coupling — TIOCGPGRP and getpgrp() must agree or the shell spins forever; how to spot that hang.
- Sockets and evdev — AF_UNIX with one table lock, /dev/input/eventN, and why keycodes need a table for USB but not PS/2.
- The removed acceptance test — deleted 2026-08-08 with its trademark references; what it found and the two techniques worth keeping.
- Sharing preference — never push or publish; unfinished work stays local.