Skip to content

The owner's rulings of 2026-09-30 written where they govern - #645

Merged
2 commits merged into
mainfrom
wt/toyos-rulings
Oct 1, 2026
Merged

2 commits merged into
mainfrom
wt/toyos-rulings

Conversation

@Japabu

@Japabu Japabu commented Sep 30, 2026 •

Copy link
Copy Markdown
Collaborator

The owner's rulings of 2026-09-30, each written where it governs. Issue files only, plus one string in src/licence.rs.

This PR lands after #636, whose amendment of root CLAUDE.md's firmware rule admits the CPU microcode the microcode ruling orders the kernel to load; the defect points at that rule.

The rulings

  • Q2 (stage 2): an end reads as an exit, a kill or a fault kind alike on every architecture, and a bare code reads the last two as failures.
  • Q6d (stage 2): no end reads as a quit's reason.
  • Q3a (stage 3): libc imitates SIGCHLD.
  • Q3b (stage 3): a C handler runs at once, beside the program: in a blocking libc call, or on libc's own thread while no thread is in one.
  • Q3c (stage 3): a C child starts with descriptors 0–2 and exactly what its file actions name, a stated departure from POSIX.
  • Q5a (stage 5): a login's session is a program that logout ends and that only parents what its user starts.
  • Q5b (stage 5): init hands the compositor or sshd, as it starts a session, a right to start programs in that session alone.
  • Q5c (stage 5): sshd's right also quits and kills its own session.
  • Q6a (stage 6): a quit carries its reason: interrupt, hang-up or terminate.
  • Q6b (stage 6): a quit kills a process that never watched its notice. The stage already said so.
  • Q6c (stage 6): a quit reaches the process's subtree by stage 4's walk.
  • Q6e (stage 6): std hands a program its notice, the ctrlc fork waits there, and rustc stops skipping its handler. The stage already said so.
  • Q6f (stage 6): libc takes the three reasons as SIGINT, SIGHUP and SIGTERM, and kill with one of them is a quit. The stage already said so.
  • Q7 (stage 7): a second Ctrl+C kills only a program that has not yet taken the first.
  • Microcode: the kernel is to load CPU microcode signed by the CPU's maker and pinned by version and hash. The question becomes the defect issues/kernel/the-kernel-loads-no-cpu-microcode.md, whose exit is current microcode loaded early on every CPU, at least as current as Linux's.
  • std::os::toyos::io::{AsRawFd, FromRawFd} are renamed the next time the trait is touched in the fork. os-toyos-io-traits-keep-a-posix-name.md becomes an open defect with that exit.
  • A boot start's device refusal is fatal only for a device the [programs] row marks as required. Otherwise init logs it loudly and starts the program without it. a-boot-start-refused-a-present-device-runs-without-it.md becomes an open defect whose exit is the row's mark and both outcomes.
  • doomgeneric's fetch stays, so its question file is deleted.
  • doom.jpg is the owner's own screenshot and he keeps it; no licence question applies. The question file is deleted, and the row's third column (free text: "names the file that carries the attribution, or says why it is ours") now says it is his screenshot and that no licence question applies. The terms column stays NOASSERTION.
  • The blocked-task dump keeps painting its report on the panel and holding it there. One line at the small-kernel track's step 5 replaces both step 5's open question and stage 6's hold on it. Step 6's heading "The scheduler knows nothing about devices" goes, since step 5 now keeps the pass painting the panel.

Decisions

  • Track length. a-childs-end-is-an-event-and-a-parent-takes-its-children-down.md is 260 lines, the same as before. It is 35 bytes longer (18608 → 18643). Q2, Q6d, Q3a, Q5a–Q5c and Q7 state things the track did not say before. These were cut as moot:

    • the pointer to the question file;
    • the Q labels and (ruled) marks on the stage headings, which distinguish nothing once every stage is ruled;
    • the Ruled block's session clause, which moved into stage 5's Q5a line;
    • stage 6's reason why the shell relays nothing, which the Q6c line now states;
    • stage 7's "Stop and continue need a suspend primitive and are not proposed". That sentence scoped the proposal the rulings closed.

    Stages 2, 3, 5, 6 and 7 are re-wrapped where the lines changed.

  • Citations. The supervisor track's open item "the ask's ABI, which is Q6a of …" is removed. Q6a is ruled, and that track's stage 3 already asks by stage 6's quit. The security track's list follows the microcode rename. git grep of each deleted slug, and of its bare name, finds nothing.

  • opened stays as it was on the three rewritten files.

Gates

  • cargo run -- --ci host at 71b3a57: EXIT=0 (56 steps, all green)

🤖 Generated with Claude Code

https://claude.ai/code/session_016t9wjdQkB8SH7bmfUoiy6L

The child-process track's fourteen questions are ruled as recommended,
each written as one line at the stage it governs, and
issues/kernel/the-child-process-track-waits-on-the-owners-rulings.md
goes:

- Q2, Q6d at stage 2: an end reads as an exit, a kill or a fault kind
  alike on every architecture, a bare code reads the last two as
  failures, and no end reads as a quit's reason.
- Q3a, Q3b, Q3c at stage 3: libc imitates SIGCHLD; a handler runs at
  once, beside the program; a C child starts with descriptors 0-2 and
  what its file actions name, a stated departure from POSIX.
- Q5a, Q5b, Q5c at stage 5: a login's session is a program that only
  parents what its user starts; init hands the compositor or sshd the
  right to start programs in it; sshd's right also quits and kills it.
- Q6a, Q6b, Q6c, Q6e, Q6f at stage 6, whose text already said each as
  recommended: a quit carries interrupt, hang-up or terminate, reaches
  the subtree, kills a process that never listens, reaches a Rust
  program through std and ctrlc, and a C program as SIGINT, SIGHUP and
  SIGTERM.
- Q7 at stage 7: a second Ctrl+C kills only a program that has not yet
  taken the first.

Cut as moot: the pointer to the question file, the question labels on
the stage headings, the Ruled block's session clause (now stage 5's
line), stage 6's reason for the shell relaying nothing (now stage 6's
reach line), and stage 7's "Stop and continue need a suspend primitive
and are not proposed", which scoped the proposal the rulings closed. The
track stays at 260 lines.

The supervisor track's open item on the ask's ABI cited Q6a; Q6a is
ruled and its stage 3 already asks by stage 6's quit, so the item goes.

The rest:

- The kernel is to load CPU microcode signed by the CPU's maker and
  pinned by version and hash, as vendor device firmware is. The question
  becomes the defect issues/kernel/the-kernel-loads-no-cpu-microcode.md,
  exit: current microcode loaded early on every CPU, at least as current
  as Linux's. The security track's list follows the rename.
- std::os::toyos::io::{AsRawFd, FromRawFd} are renamed the next time the
  trait is touched in the fork: an open defect with that exit.
- A boot start's device refusal is fatal only for a device the
  [programs] row marks as required; otherwise init logs it loudly and
  starts the program without it: an open defect whose exit is the row's
  mark and the two outcomes.
- doomgeneric's fetch stays; its question file goes.
- doom.jpg is the owner's own screenshot, which he keeps, and no licence
  question applies; its question file goes and its COMMITTED_FILES row
  says so in the column that names where its terms are recorded. The
  terms column stays NOASSERTION.
- The blocked-task dump keeps painting its report on the panel and
  holding it there: one line at the small-kernel track's step 5 replaces
  that step's open question and stage 6's hold on it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016t9wjdQkB8SH7bmfUoiy6L
@Japabu
Japabu marked this pull request as ready for review September 30, 2026 21:30
@Japabu

Japabu commented Sep 30, 2026

Copy link
Copy Markdown
Collaborator Author

Review, round 1, head 7eb4428

CI: host passed at 7eb4428 (run 36779929674, conclusion success). The branch adds no test and targets no hardware.
Net lines: +113 −459 (−346). Production is one src/licence.rs string (+2 −2), issues are +111 −457, and there are no tests.

The points the brief asked about:

  • Rulings 1, 3, 4, 5 and 6 each landed where they govern, and nothing left in those files contradicts them. Ruling 1's 14 answers sit in the child track: Q2 and Q6d at :64–66, Q3a and Q3c at :72–73, Q3b at :81–84, Q5a–Q5c at :171–175, Q6a and Q6c at :182–185, Q6b at :187–189, Q6e at :191–194, Q6f at :198–201 and Q7 at :242–243.
  • Rulings 2 and 7 each leave a line that contradicts them (below).
  • Citations: git grep finds none of the four deleted slugs or their bare titles in the tree, and rg finds none in rust/ or ~/.cargo/git/checkouts/. No Q-label is left anywhere.
  • 98 bytes longer at 260 lines: the new lines state rulings the track did not carry before, so that growth is accepted. 63 of the 98 bytes are the eight stage labels, which now all read "(ruled)" and so distinguish nothing (see REMOVE).
  • The stop-and-continue sentence cut from stage 7: it contradicts no ruling, since none touched stop or continue. The stages' own lists still decide the scope, because kill answers EINVAL for every signal except those stages 3 and 6 name. The cut stands.

BLOCKER

  • CLAUDE.md:63 — The rule still admits only vendor firmware "loaded only by that device's own driver through its IOMMU domain; it never executes on the CPU". That bars the CPU microcode ruling 2 orders the kernel to load. issues/kernel/the-kernel-loads-no-cpu-microcode.md:9 states the ruling but drops the deleted question's pointer at this conflict. An agent briefed on the defect would then meet an always-loaded rule that forbids the fix, so the ruling has not landed where it governs. Fix: in this PR, an agent the orchestrator briefs for it amends that sentence to admit CPU microcode that the kernel loads, signed by the CPU's maker and pinned by version and hash, without the file growing.

NOTE

  • none

REMOVE

  • issues/kernel/the-kernel-is-small-interrupts-post-and-threads-wait.md:147 — "The scheduler knows nothing about devices." — Ruling 7 makes it false: step 5 (:184–186) now keeps the pass painting the panel, "a device the pass reaches".
  • issues/kernel/a-childs-end-is-an-event-and-a-parent-takes-its-children-down.md:40,54,64,70,120,171,182,240 — " (ruled)", and "ruled; " in stage 3 — Every stage now carries it, so it distinguishes nothing. This is 63 of the 98 bytes.
  • src/licence.rs:399–400 — "he keeps it, and rules that" — The committed file already shows it is kept, and "no licence question applies" carries the ruling.
  • PR body, "## Unsure" — It is addressed to this review and carries nothing main's merge record needs.

SEND BACK

Review round 1 on 7eb4428.

- The microcode ruling orders the kernel to load what root CLAUDE.md's
  firmware rule still bars: it admits only device firmware that never
  executes on the CPU. PR #636 amends that sentence to admit the CPU's own
  microcode, which the kernel loads, and this branch lands after it. The
  defect regains the deleted question's pointer at that rule, as one line
  saying the rule admits the microcode once #636 lands.
- Step 6 of the small-kernel track loses its heading "The scheduler knows
  nothing about devices": step 5 now keeps the pass painting the panel, a
  device the pass reaches.
- The child-process track's stage headings lose " (ruled)", and stage 3
  loses "ruled; ": every stage carried it, so it distinguished nothing.
  The track is 35 bytes longer than on main (18608 -> 18643), at 260
  lines.
- doom.jpg's row loses "he keeps it, and rules that": the committed file
  shows it is kept, and "no licence question applies" carries the ruling.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016t9wjdQkB8SH7bmfUoiy6L
Japabu added a commit that referenced this pull request Oct 1, 2026
The owner ruled on 2026-09-30 that the kernel loads maker-signed microcode,
so the question becomes a defect. This is the same rename PR #645 makes,
with #645's text kept verbatim (its lines are a subset of this file's), and
the citation in the Linux-parity track moved to the same line #645 writes.

Added to it, from this branch's measurements:

- The T14's eight CPUs run 0xbe (PR #601's capture at 44eb3c2,
  cpuinfo.txt: 8 processors, all `microcode : 0xbe`; kernel-log.txt has no
  `updated early`), which is Intel's newest for 06-8c-01/80 at
  microcode-20260925. Its IA32_PLATFORM_ID was never captured.
- Where: the kernel, per CPU, in percpu::init_bsp after idt::init and in
  percpu::init_ap after control_regs::init, both before fpu::init. Read
  from the tree: init_bsp loads the IDT before fpu::init; init_ap runs
  before ROSTER.echo in ap_entry, and boot_aps waits on each echo before
  the next INIT-SIPI, which is the per-core serialisation SDM 3A §12.11.6.3
  asks. cpu::wrmsr is declared `nomem`, which the update trigger is not.
  SDM §12.11.6.1: INIT keeps an update, a hard reset clears it.
- Verified: Example 12-10's read-back; Linux 6.8's __apply_microcode
  (intel.c:304-330) does the same and returns UCODE_ERROR on a mismatch.
- AMD: from Linux 6.8's amd.c (__apply_microcode_amd, cpu_has_entrysign,
  need_sha_check) and amd_shas.c.
- Licence: src/licence.rs judges a committed file only once it ships, and
  LicenseRef-Intel-Microcode is in no ALLOWED row.
- Exits in the ladder's order: host, metal (the T14, plus a boot-actuators
  negative control that raises only the header's revision so Intel's
  payload is untouched), metal no machine has yet, guest. TCG's model is
  qemu64 AuthenticAMD (toyos-cpuvuln's TCG fixture), so a guest boot loads
  nothing for want of a file, not for a hypervisor bit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016t9wjdQkB8SH7bmfUoiy6L
@github-merge-queue github-merge-queue Bot closed this pull request by merging all changes into main in 63cb34a Oct 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant