The failure this is against is not scope creep. It is abandonment by promotion:
a thing gets built to the point where it works, the next thing becomes more
interesting, and the first is left in a corner -- in the tree, not finished, not
deleted, and not in any list. Enough of those and the tree stops matching its
own documentation.
docs/plan/1.0.md now holds the register, and it is the only place anything
half-built is listed. Four sections, because the kinds are genuinely different:
built and connected to nothing (the text layer, a font from disk, socket
activation, wait_vblank); started and stopped part-way (foundations 2-5, hybrid
H2, Schcom v0, a released PCI device that nothing brings back); named in a "what
it does not do" and still true; and frozen -- scoped, unstarted, not to be
started. The rule is that nothing enters except by being finished or deleted,
and that adding a row requires closing one.
1.0.md already said "two things in flight, never three". It was right and it was
not being followed.
Then the corners themselves, because a register written over a tree full of them
is just a longer list:
- cmd/init is deleted. Nothing had execed /bin/init since initcode.S changed
to /bin/schinit; it was built and installed on every image as an unreachable
fallback, and an unreachable fallback rots rather than saves.
- projects/schwm/ and projects/schde/ are deleted. Both said "to be deleted"
in their own first paragraph, which proves only that a directory marked for
deletion is not deleted by being marked. README-only, no code lost, and the
arguments each made are moved into wayland.md where they are still true.
- projects/schcom/schcom and schcom-demo were tracked binaries. Untracked, and
.gitignore'd.
Three code comments and one document described a boot that has not happened
since 7d44eb7. cons_serial_only starts set, but kmain clears it on its first
lines now, so the splash does not survive the boot and the kernel log is on
screen from the start. That reversal was earned by a Chromebox with no serial
port freezing at boot showing nothing at all, and the comments still argued the
losing side of it.
The site:
- a download page. One ISO, what it has actually been run on -- one machine,
under test -- Ventoy and dd, what the first boot looks like step by step,
and the build if you would rather. The support table names one Chromebox
rather than listing hardware, because one Chromebox is the entire bare-metal
record and a list would be fiction.
- Assets/usb.svg, drawn to the same rule as the other marks: two tones,
geometry only, the accent spent in one place, and that place is the activity
light because it is the part that tells you something is happening.
- Download is in both navs and is the hero's primary action; a closing band
ends the front page on it.
- the uberblock-slots and drivers-outside-the-kernel figures are gone. Three
numbers left, including the fastfetch one, which stays because it is funny.
Two things caught by rendering the pages instead of assuming: .hero p was
beating .filemeta on specificity and the file line was coming out at body size,
and the dd command was one line long enough that the card clipped it at `conv=`
-- a destructive command that can scroll half of itself out of view is a good
way to take somebody's disk. It is two lines now.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VQ7Qx8E1q1M1bbCq8QLHS2
143 lines
6.5 KiB
Markdown
143 lines
6.5 KiB
Markdown
# SchOS documentation
|
|
|
|
Four kinds of document, kept in four directories, because they answer four
|
|
different questions and go stale at four different rates.
|
|
|
|
| | | |
|
|
|---|---|---|
|
|
| **[architecture/](architecture/)** | *What SchOS is* | Present tense. Describes what is built and working. |
|
|
| **[plan/](plan/)** | *What SchOS will be* | Future tense. Everything here is unbuilt. |
|
|
| **[guides/](guides/)** | *How to work on it* | Imperative. Build it, test it, add to it. |
|
|
| **[history/](history/)** | *Why it is the way it is* | Past tense. Bugs whose cause is not visible from the fix. |
|
|
|
|
Plus two that belong to no category and apply to everything:
|
|
**[licensing.md](licensing.md)** — read it before copying anyone else's code in —
|
|
and **[branding/](branding/)**, which holds the marks and the rules for using
|
|
them.
|
|
|
|
---
|
|
|
|
## The rule that keeps this from rotting
|
|
|
|
> **When something is finished, it moves from `plan/` to `architecture/` and is
|
|
> rewritten as a description of the thing rather than a record of building it.**
|
|
|
|
A completed item is not a ticked checkbox. A ticked checkbox says the work
|
|
happened; it does not say what the work *produced*, and six months later the
|
|
checkbox is the only thing left and it explains nothing.
|
|
|
|
So finishing a piece of work has three steps, and the third is not optional:
|
|
|
|
1. The code works and is tested.
|
|
2. The plan entry is deleted.
|
|
3. A description exists in `architecture/` written for somebody who was not
|
|
there — what it does, what shape it has, what it costs, and what it still
|
|
does not do.
|
|
|
|
This is not bookkeeping. The tree has already proved it necessary: the network
|
|
stack was finished, verified end to end, and for a month afterwards the only
|
|
description of it anywhere was a checkbox in a roadmap, four levels of
|
|
indentation deep, written in the past tense of somebody arguing for the work
|
|
rather than explaining the result.
|
|
|
|
**The "what it does not do" section is the one that pays.** Every description in
|
|
`architecture/` ends with one. A document that only lists a subsystem's
|
|
strengths is marketing, and the reader who most needs the document is the one
|
|
about to trip over a limitation nobody wrote down.
|
|
|
|
---
|
|
|
|
## Start here
|
|
|
|
**New to the tree** → [architecture/README.md](architecture/README.md), the
|
|
system layer by layer, then [guides/layout.md](guides/layout.md) for where the
|
|
files are.
|
|
|
|
**Trying to build it** → [guides/building.md](guides/building.md).
|
|
|
|
**Wondering what happens next** → [plan/1.0.md](plan/1.0.md), which is the finish
|
|
line *and* the register of everything half-built. Then
|
|
[plan/README.md](plan/README.md) for the order.
|
|
|
|
**About to start something new** → the register, first. Nothing new starts while
|
|
it has rows in it, and a row leaves only by being finished or deleted.
|
|
|
|
**Something is broken and it feels familiar** → [history/](history/). There is a
|
|
good chance it is in there.
|
|
|
|
---
|
|
|
|
## architecture/ — what SchOS is
|
|
|
|
| | |
|
|
|---|---|
|
|
| [README](architecture/README.md) | The system, layer by layer. Read first. |
|
|
| [boot.md](architecture/boot.md) | Firmware to the first userspace process. |
|
|
| [kernel.md](architecture/kernel.md) | SchIFT: memory, processes, scheduling, traps, signals, SMP. |
|
|
| [syscalls.md](architecture/syscalls.md) | The call table, and the Linux personality that lets real software run. |
|
|
| [filesystem.md](architecture/filesystem.md) | The VFS, the buffer cache, procfs, mounts. |
|
|
| [schfs.md](architecture/schfs.md) | SchFS: the copy-on-write root filesystem. |
|
|
| [devices.md](architecture/devices.md) | The device model, driver binding, the class vtables. |
|
|
| [usb.md](architecture/usb.md) | xHCI, the USB core, and the class drivers. |
|
|
| [graphics.md](architecture/graphics.md) | Framebuffer, text rendering, console, and the crash screen. |
|
|
| [terminals.md](architecture/terminals.md) | The six virtual terminals, and how one is switched to. |
|
|
| [networking.md](architecture/networking.md) | Drivers, lwIP, sockets — Unix and INET. |
|
|
| [init.md](architecture/init.md) | `schinit`, PID 1 as a role, and the job manifests. |
|
|
|
|
## plan/ — what SchOS will be
|
|
|
|
| | |
|
|
|---|---|
|
|
| [README](plan/README.md) | The three current decisions and the order they happen in. |
|
|
| [1.0.md](plan/1.0.md) | **The finish line, and the freeze.** What 1.0 contains, what is deferred, and the register of every half-built thing in the tree. |
|
|
| [foundations.md](plan/foundations.md) | The kernel work everything else is blocked on. |
|
|
| [wayland.md](plan/wayland.md) | The GUI stack, and what gets deleted to make room. |
|
|
| [hybrid.md](plan/hybrid.md) | Moving drivers out of the kernel. |
|
|
| [schapi.md](plan/schapi.md) | The long-term API layering, and the compatibility promise. |
|
|
| [roadmap.md](plan/roadmap.md) | Everything else still open. |
|
|
|
|
## guides/ — how to work on it
|
|
|
|
| | |
|
|
|---|---|
|
|
| [building.md](guides/building.md) | Prerequisites and the build, per host. |
|
|
| [testing.md](guides/testing.md) | The harnesses, and what each one actually proves. |
|
|
| [layout.md](guides/layout.md) | Repository map, and how to add a program or a port. |
|
|
| [adding-a-driver.md](guides/adding-a-driver.md) | Writing one, binding it, publishing its class vtable. |
|
|
|
|
## branding/ — the marks
|
|
|
|
| | |
|
|
|---|---|
|
|
| [README](branding/README.md) | Shift the logo, Guru the icon, SchCotie the mascot: what each is for, the colour rule, and why a raster is committed next to its SVG. |
|
|
|
|
## history/ — why it is the way it is
|
|
|
|
| | |
|
|
|---|---|
|
|
| [README](history/README.md) | What belongs in here and what does not. |
|
|
| [kernel.md](history/kernel.md) | Bugs whose cause was nowhere near their symptom. |
|
|
| [schfs.md](history/schfs.md) | The filesystem's own, from the same period as its design. |
|
|
| [moving-to-linux.md](history/moving-to-linux.md) | The Windows-to-Fedora move, kept for the parts that recur. |
|
|
|
|
---
|
|
|
|
## Writing one of these
|
|
|
|
Four conventions, all of them observable in the existing files:
|
|
|
|
**State the cost.** Every design choice gave something up. A document that does
|
|
not say what is a document that will be argued with later by somebody who only
|
|
sees the downside.
|
|
|
|
**Prefer the measured number to the remembered one.** "500 of 3565 files carry
|
|
the advertising clause" is worth more than "some do", and it was worth the
|
|
minute it took to count.
|
|
|
|
**Write down the bug that shaped it.** Half the non-obvious code in this tree is
|
|
non-obvious because something failed once. If a design is strange, the strangeness
|
|
is load-bearing and the reader deserves to know why before changing it.
|
|
|
|
**No dates in headings.** A date in a heading turns a description into a
|
|
changelog, and the description is the thing with a long life. Dates belong in
|
|
`history/`, where they mean something.
|