- Change: entire committed source + documentation tree on branch
developmentat214052d. Holistic re-review since the Phase A code review (2026-04-21,cba5b16); covers B0 (T-006/T-007/T-008/T-009/T-011) and B1 (T-012/T-013) in addition to re-reading Phase A. - Reviewer: @cemililik (+ ten parallel Claude agents per the full-tree review plan)
- Risk class: Security-sensitive
- Security-review cross-reference: per-track artefact — verdict Approve.
- Performance-review cross-reference: per-track artefact — verdict Iterate (11 proposals queued, P1 / P10 / P4 are the highest-ROI near-term picks).
- Footprint at HEAD: ~8 283 LOC source (kernel 3 654 + hal 1 198 + test-hal 998 + bsp 2 026 Rust + 333 asm + linker/build); 25 ADRs (0023 reserved-empty); 21 audit entries (0012 Removed); 149 host tests + 149 miri tests pass; QEMU smoke maintainer-launched.
- Pre-flight gate: see
00-preflight.md—cargo fmt,cargo host-clippy,cargo kernel-clippy,cargo host-test(149/149),cargo kernel-build,cargo +nightly miri test(149/149) all clean.
Synthesis of Track A — Kernel correctness (Approve), Track B — HAL & test-HAL (Comment), and Track G — BSP & boot path (Approve). Security-axis correctness (capability invariants, memory safety, kernel-mode discipline) is folded in from Track C (Approve).
- Capabilities (
kernel/src/cap/):cap_copypeer-depth,cap_derivesaturating depth cap,cap_revokeBFS reachability under release-modebreak,cap_takeordering vsfree_slot,CapRights::from_rawreserved-bit masking,CapabilityTable::newbuild-time capacity assertion — every Phase A invariant still holds. TheCapabilitytype remains move-only at the type level (noCopy, noClone; verified by Track C §1). - Kernel objects (
kernel/src/obj/):Arena<T,N>::newis correct forN == 0; generation reuse exercised byfree_then_allocate_bumps_generation;destroy_*reachability contract documented as caller-enforced viaCapabilityTable::references_object(kernel-side enforcement remains a Phase B follow-up). Test handles correctly#[cfg(test)] + pub(crate). - IPC (
kernel/src/ipc/mod.rs): cap-take-before-state-mutation atomicity preserved;ReceiverTableFullpre-flight covered byrecv_with_full_table_preserves_pending_cap(closes the Phase A test gap);IpcQueues::reset_if_stale_generationdebug_assert!catchesSome(cap)payload drops in tests but in release leaks silently — acceptable until userspace destroy paths land.ipc_notifycorrectly takes&CapabilityTable(immutable). v2Reply/ReplyRecv(ADR-0018) verified absent. - Scheduler (
kernel/src/sched/mod.rs):SchedQueue<0>structurally legal but type-level invariant unstated (Phase A non-blocker still applies).yield_nowraw-pointer split-borrow correctness viactx_ptr.add(idx)confirmed;IrqGuard<C>held acrosscpu.context_switch(UNSAFE-2026-0008).ipc_recv_and_yieldPhase 1/2/3 separation verified; the post-resume re-call now returns the typedErr(SchedError::Ipc(IpcError::PendingAfterResume))per ADR-0022 (the Phase Adebug_assert!(!Pending)recommendation is superseded atkernel/src/sched/mod.rs:820-826).unblock_receiver_onis single-waiter byreturnafter first match — correct for v1 depth-1 endpoints; multi-waiter remains an ADR-0019 open question. The Deadlock rollback restoress.currentands.task_states[current_idx]but does not reverse the endpoint state fromRecvWaitingtoIdle— benign in v1 because the path is structurally unreachable with idle registered, queue an ADR for "endpoint rollback /ipc_cancel_recv" before B2. - Top-level lib (
kernel/src/lib.rs:38-43): kernel-stricter denylist (clippy::panic,unwrap_used,expect_used,todo,arithmetic_side_effects,float_arithmetic) layers cleanly on the workspace[lints]set without redundant re-statement. Phase A "double-stated" nit effectively resolved.
- All five HAL traits (
Console,Cpu,ContextSwitch,Timer,IrqController) match their ADRs (ADR-0007/0008/0010/0011/0020).Mmu(hal/src/mmu.rs) has a complete v1 trait surface but no production impl yet — dormant for B2 / ADR-0027. ContextSwitchlacksSend + Syncbound (hal/src/context_switch.rs:25): every other HAL trait carriesSend + Sync, this one does not. Adding: Send + Syncmatches the ADR-0020 "compiler-checked, so multi-core safety is not left to convention" discipline. Non-blocker.FakeCpudoes not implementContextSwitch(test-hal/src/cpu.rs:94): the test-HAL claims "all five fakes present" but kernel scheduler tests reimplement a parallel localFakeCpu+FakeTaskContextatkernel/src/sched/mod.rs:850-908. ADR-0020 §"TestHalfake" sketches the correct shape; liftingFakeTaskContextintotyrne-test-halis the highest-value Track B follow-up.IrqState(pub usize)synthetic-construction (hal/src/cpu.rs:22): widened in usage — two test-onlyCpuimpls in the kernel constructIrqState(0)directly. Phase A non-blocker still applies; either widen the doc-comment or narrow the field topub(crate)with aBspConstructhelper.- The Phase A
IrqGuard<C>post-mortem comment (hal/src/cpu.rs:86-91) is preserved verbatim into the B1 era; no&dyn Cpuregression. - Production builds cannot pull in fakes —
tyrne-test-halis[dev-dependencies]-only on the kernel and absent from BSPCargo.toml.
- All six rows of
bsp-boot-checklist.mdpass: EL2→EL1 drop with HCR_EL2/SPSR_EL2 literals;msr daifset, #0xfas the literal first instruction atboot.s:47;CPACR_EL1.FPEN = 0b11+ ISB after the EL drop; VBAR install before GIC init; SP 16-byte aligned at firstbl; BSS zeroed with 8-byte stride;context_switch_asm#[unsafe(naked)]per checklist item 6. - Boot ordering at
bsp-qemu-virt/src/main.rs:526-598: banner → VBAR_EL1 install → ISB → GICnew+init→daifclr #0x2. Reordering would silently hang; current order is safe-by-construction. - GIC v2 driver (
bsp-qemu-virt/src/gic.rs):GIC_MAX_IRQ = 1020range-asserted inenable/disable(line 78, 318, 344);acknowledgefoldsINTID 1023toNoneper spec;end_of_interruptwrites raw IRQ ID. Eachacknowledge→end_of_interruptpairing upheld by every branch ofirq_entry. arm_deadline/cancel_deadline(bsp-qemu-virt/src/cpu.rs:484-554) order is correct (CVAL before CTL before GIC enable; symmetric for cancel).CurrentELself-check atcpu.rs:135-139is now load-bearing post-condition of the EL drop per ADR-0024.- Three Track G non-blockers worth listing:
irq_entryspurious branch'scompiler_fence(Ordering::SeqCst)is structurally redundant (exceptions.rs:166-174) — drop it or document as defence-in-depth.- The IRQ trampoline saves into a 192-byte
TrapFramewhose Rust-side size is guarded byconst _: () = assert!(size_of::<TrapFrame>() == 192); the asm side has no parallel guard (vectors.s:114-147). kernel_entry's call tostart(...)is-> !but lacks a defensiveloop { spin_loop }after — current code is correct under the contract; belt-and-braces would catch a refactor regression.
Every "OK" in Track C is justified by static reasoning over source at HEAD. Highlights:
- Every
unsafeblock traces 1:1 to an active audit entry (UNSAFE-2026-0001..0021; 0012 Removed); the row-by-row audit cross-reference table in Track C §3 confirms zero drift between the 21 audit entries and the in-code SAFETY blocks. - The UNSAFE-2026-0012 removal is complete — verified that no orphaned
&mut-aliasing-across-yield site survives under any other audit tag (grep -n "assume_init_mut" bsp-qemu-virt/src/main.rsreturns zero hits). - UNSAFE-2026-0019 / 0020 / 0021 retain their "Pending QEMU smoke verification" status notes per audit body; no item in the Track C verdict depends on the smoke completing. The Pending notation is correctly in place.
- The kernel crate is zero-
unsafe-{incap/,obj/,ipc/,lib.rs; the 14 inner blocks insched/mod.rsall cite UNSAFE-2026-0008/0009/0014. - No allocation in
irq_entry; no heap allocation anywhere; bounded kernel state; allocation paths return typed errors (the three remainingpanic!s insched/mod.rslines 307 / 440 / 559 are documented unreachable-invariant guards, not userspace-reachable). - The Phase A
panic!inipc_recv_and_yield's deadlock path is resolved at HEAD — replaced byErr(SchedError::Deadlock)per ADR-0022. - Capability bits, generation counters, raw indices never appear in log output reachable from any panic path.
- Workspace remains zero-extern (
Cargo.lockcontains only the four in-tree workspace crates). - Threat-model load-bearing shifts (B0/B1 inherited): EL1 as structural property post-T-013; aliasing model post-T-006; IRQ delivery as structural property post-T-012; IRQ-handler aliasing discipline post-ADR-0021 2026-04-28 Amendment — all four are net improvements; HEAD adds nothing that worsens any.
Track D finds no correctness regressions. Eleven proposals (P1–P11) queued; P3 (const-eval invariant migration) already complete (the Phase A const { assert!(...) } recommendation has been applied at kernel/src/cap/table.rs:105, kernel/src/obj/arena.rs:90-95, bsp-qemu-virt/src/exceptions.rs:77). Asm hand-checks (BSS-zero loop, vectors 16×0x80, callee-save set d8–d15) all verify correct.
kernel/src/cap/table.rs:105—CAP_TABLE_CAPACITY <= Index::MAXusesconst _: () = assert!(...), not the inlineconst { assert!(...) }form used inArena::new. Phase A non-blocker still applies (Track A).kernel/src/sched/mod.rs:48—SchedQueue<0>should carry a build-timeconst { assert!(N > 0, ...) }rather than relying on implicit short-circuit semantics (Track A).bsp-qemu-virt/src/console.rs:71-78—Pl011Uart::write_bytesuses plain+forself.base + offsetrather thanwrapping_add. Phase A non-blocker still applies; no overflow possible at base0x0900_0000with offsets ≤0x18(Track G).bsp-qemu-virt/src/main.rs:484—extern "C" { static tyrne_vectors: u8; }uses legacy edition-2021 block syntax whileirq_entry/panic_entry/context_switch_asmwere converted tounsafe extern "C" fnin PR #10 R2; FFI-surface stylistic discipline drifted at this one site. Resolution: bump to edition 2024 + convert, or add a one-line comment justifying the legacy form (Track I).bsp-qemu-virt/src/exceptions.rs:142-145—irq_entry's_frameparameter exists only for the trampoline calling convention; current doc hints at this in passing but does not explicitly justify the unused parameter (Track G).docs/analysis/tasks/phase-b/T-009-...mdand seven other committed English docs use the Turkish severity adjectiveYüksekwhiledocs/standards/security-review.mdanddocs/standards/code-review.mduse English severity labels (Critical / High / Medium / Low) (Track J §J-NB2).- Three test modules (
kernel/src/obj/task.rs:104,obj/endpoint.rs:96,obj/notification.rs:111) omitclippy::expect_usedandclippy::panicfrom their#[allow(...)]blocks — the rest of the kernel allows the trio together (Track F §F-3).
Synthesis of Track F — Tests & coverage (Approve) and Track A's test-coverage routing.
- Per-error-variant matrix: 23 variants reviewed; 17 covered by in-tree tests; 6 documented-unreachable / no-producer (
SchedError::QueueFull,ObjError::StillReachable,MmuError::{MisalignedAddress, OutOfFrames, InvalidFlags}). - Phase A code-review's named gap (
IpcError::ReceiverTableFull) is closed by T-011 atkernel/src/ipc/mod.rs:1004—assert_eq!(err, IpcError::ReceiverTableFull)plus a recovery half asserting the in-flight cap survived the failed recv. SchedError::DeadlockandIpcError::PendingAfterResume(the typed-error replacements per ADR-0022) covered byipc_recv_and_yield_returns_deadlock_when_ready_queue_emptyandipc_recv_and_yield_resume_pending_returns_typed_err.start_preludeempty-queue panic covered bystart_prelude_panics_on_empty_ready_queue. The three Phase A test gaps are closed.- Per-subsystem coverage thresholds: every kernel-core file is comfortably above the
testing.md80 % soft floor at the 2026-04-27 rerun (sched 93.97 %, ipc 97.86 %, cap/table 97.46 %, cap/mod 89.47 %, obj/* 93.75–100 %, cap/rights 97.50 %); 9 days stale, monotonic-up trend, recommend rerun at B2 entry. - Miri: at HEAD pre-flight reports 149 / 149 pass clean; Track F's background capture only got the doc-test trailer, but the surface is the same Miri already covered (143/143 post-T-011 plus six tests at the same surface). Expected-clean.
- Property / fuzz: zero
proptest/quickcheck/bolero/cargo-fuzzin workspace.CapabilityTablederivation-tree invariants are the highest-yield fit; defer to a B2-or-later roadmap task. should_panicdiscipline: everyshould_panicin the workspace carriesexpected = "..."(5/5).- Test-helper hygiene: every test helper is
#[cfg(test)] + pub(crate);EndpointHandle::test_handleandNotificationHandle::test_handlecarry#[allow(dead_code, reason = "symmetric with TaskHandle::test_handle")]— verified accurate. No test helper leaks into release. - Smoke-as-regression gap (§F-1):
tools/run-qemu.shis maintainer-launched; noqemu-smokejob in.github/workflows/ci.yml. The "Pending QEMU smoke verification" notes on UNSAFE-2026-0019/0020/0021 cannot self-clear; the two-task-demo's six-line expected-output table is a regression contract nothing exercises. Recommend a B2-prep task to add aqemu-smokeCI job. ObjError::StillReachablehas no producer (§F-2): declared atkernel/src/obj/mod.rs:68; pertesting.mdthe rule is "every variant has a test that provokes it". Two acceptable resolutions: delete the variant (rely on#[non_exhaustive]) or extend the standard with a "documented future variant" exception.
Synthesis of Track E — Docs & ADRs (Request changes — 7 blocker-class items), Track J — Localization & hygiene (Comment), and Track H — Build/infra doc-vs-state drift items.
Seven blocker-class doc drift items. Each is a factual statement that has fallen out of sync with the code at HEAD; none is security-relevant; all are single-edit fixes in single files.
- Root docs out of date:
README.md:39-55repository-layout tree omits the four crates that exist in the workspace and says "source code layout will be added after the architecture phase";CONTRIBUTING.md:13-14says "no source code to extend or refactor meaningfully yet";SECURITY.md:7says "There is no runnable kernel yet" and "(planned, Phase 2)" for the threat model — kernel boots on QEMU virt and security-model.md exists Accepted (Track E). - Standards index missing one entry:
docs/standards/README.mdlists 13 docs; directory contains 14 (bsp-boot-checklist.mdis real, in use, but absent from the index) (Track E). - Architecture overview status banner stale:
docs/architecture/README.md:13andoverview.mdstatus banner mention Phase A only; align when the GIC-version blockers are resolved (Track E). - Two-task demo guide gaps:
docs/guides/two-task-demo.md:38-45expected-output table omits the post-T-009tyrne: timer ready (...)andtyrne: boot-to-end elapsed = ... nslines; lines 47-59 do not mention the idle task; line 47 still describes a "Phase B" wfe path that B1 already lit (Track E). overview.md:67-73— "(final form documented inhal.md, planned)" parenthetical is stale; hal.md is Accepted and shipped (Track E).docs/decisions/template.mdStatus enum still listsProposed | Accepted | Deprecated | Superseded by NNNN, missingDeferred(a real state per ADR-0018 / ADR-0023) (Track E).infrastructure.mdConfiguration files section (docs/standards/infrastructure.md:150-153) listssupply-chain/config.toml,supply-chain/audits.toml, and.github/dependabot.ymlas if present; none exist on disk. Either re-shape the table or move under "Planned (when first extern dep lands)" (Track H, routed to Track E).infrastructure.mdContinuous integration "Required gates" listscargo auditandcargo vet checkas merge-blockers; neither runs inci.yml. Either ship the gates or relax the standard (Track H, routed to Track E).- 64 stale
cemililik/TyrneOSURLs across 27 files (Cargo.toml,SECURITY.md, everytyrne-kernel/tyrne-hal/tyrne-bsp-qemu-virtrustdoc cross-reference,docs/guides/run-under-qemu.md's clone command). Four newest docs usecemililik/Tyrneinstead; localgit remotepoints atcemililik/UmbrixOS. Resolve canonicality, then sweep (Track J §J-NB1). Yüksekin eight committed English docs — Turkish severity term in seven non-quoted references and one quoted commit-subject reference; standards use English (Critical / High / Medium / Low) (Track J §J-NB2).docs/decisions/README.mdADR index jumps 0022 → 0024;phase-b.mdADR ledger lists ADR-0023 as Deferred. Pick one indexing convention (Track I).docs/glossary.mddead link pattern (also blocker #5 below) is the place where the chain walk breaks at one end (Track I §Non-blocking #2).Aarch64TaskContextlacks compile-time size guard (bsp-qemu-virt/src/cpu.rs:305) — its siblingTrapFramehas one; PR #10 R2 added the latter but did not back-fill the older site (Track I §Non-blocking #3).
- All 21 entries observe
unsafe-policy.md §3discipline; introducing-commit-vs-merge boundary codified in 0017's "Discipline note" and observed by 0006 / 0011 / 0014 / 0015 / 0016 / 0017 / 0018 Amendments. Indexing contiguous (no holes besides 0012 archived-Removed). - Audit ↔ source 1:1 correspondence verified by Track E's full table (cited line counts: 0019 has 24 distinct citation sites in
gic.rs; 0020 spansvectors.s+exceptions.rs+main.rs; 0014 has nine kernel + seven BSP citations) and Track H's grep verification. - Umbrix→tyrne residue clean in source / standards / ADRs / architecture / guides / glossary / root docs; remaining
Umbrixmentions are legitimate historical narrative in retro / business review prose (Track J).
Synthesis of Track I — Cross-track integration (Approve), Track H — Build/toolchain (Approve), and cross-track notes routed during merge.
- Every HAL trait method's signature in
hal/src/*.rsmatches its impl inbsp-qemu-virt/src/*.rsand its fake intest-hal/src/*.rs. 17 method rows checked; zero drift. - Behavioural contracts spot-checked:
Cpu::disable_irqssave-and-restore,IrqController::acknowledgespurious→None,Timer::arm_deadlinereplace-prior,ContextSwitch::context_switch# Safetyround-trip — all four honoured across HAL / BSP / test-HAL. - Generic-vs-trait-object boundary (Phase A post-mortem rule): only matches for
&dyn Cpu/&dyn IrqController/&dyn Timerare documentation-side orFmtWriter<'a>(pub &'a dyn Console)(intentional per ADR-0007).IrqGuard<C: Cpu>retains its concrete-type-parameter shape; no regression.
- Three
#[repr(C)]structs cross the kernel/BSP ↔ asm boundary:Aarch64TaskContext(168 B, no compile-time size guard — non-blocker),TrapFrame(192 B, guarded atexceptions.rs:77),TaskStack(alignment-only, no field offsets). - Field-offset audit
Aarch64TaskContext↔context_switch_asm(offsets 0/80/88/96/104) andTrapFrame↔vectors.s(0x00..0xC0) — both match.
kernel_entry/irq_entry/panic_entry/context_switch_asmcarry the expected#[unsafe(no_mangle)]+unsafe extern "C"attributes per PR #10 R2;kernel_entryremainspub extern "C" fn(nounsafequalifier). Theextern "C" { static tyrne_vectors: u8; }import atbsp-qemu-virt/src/main.rs:484uses legacy edition-2021 block syntax — see Style above.- Linker-exported symbols (
tyrne_vectors,_start,__bss_start,__bss_end,__stack_top) all resolve.tyrne_vectors_endis exported but unreferenced (defensive / objdump convenience; documented atvectors.s:194).
- The phase ↔ ADR ↔ task ↔ audit chain is intact for every Done milestone (Phase A capability foundations, scheduler+demo, capability scheme deferral; B0 raw-pointer refactor, idle task, timer init; B1 EL drop, exception infrastructure).
- Sole anomaly: ADR-0023 (cross-table CDT, accept-deferred) referenced from prose (
phase-b.md,current.md, B0 closure review) but has no file at HEAD. The glossary's hyperlink target is dead — see Documentation §Blocker #5. - ADR cross-references all bidirectional: ADR-0010 ↔ T-009/T-012, ADR-0021 ↔ T-006 / UNSAFE-2026-0012/0013/0014, ADR-0022 ↔ T-007/T-009/T-012, ADR-0024 ↔ T-013/UNSAFE-2026-0017/0016/0018, ADR-0025 ↔ rider-discipline precedents.
- CI exists at
.github/workflows/ci.yml(created 2026-04-23) with four jobs:lint-and-host-test,kernel-build,miri,coverage. The Phase A "no CI workflow" framing is stale (see plan-level amendment in §Verdict). - CI does not run
cargo auditorcargo vet check— both listed as required merge-blockers ininfrastructure.md. Today this is a no-op (zero external deps), but the gate-vs-policy mismatch is real. Routed to Track E for the documentation side. lint-and-host-testandkernel-buildjobs install stable Rust then implicitly defer torust-toolchain.toml's nightly pin — works but pollutes cache key; fix by switching todtolnay/rust-toolchain@stablehonouring the toolchain file.- The linker rustflag
-T<absolute>/linker.ldlives inbsp-qemu-virt/build.rs(not in.cargo/config.toml) — intentional design for absolute-path resolution; well-commented; the plan checklist already anticipated this. [workspace.lints]matchescode-style.md §Lintsexactly; no per-crate file silently relaxes a workspace deny.Cargo.lockcontains exactly four in-tree workspace crates (zero externals). All five Cargo aliases resolve.default-memberscorrectly excludesbsp-qemu-virt.- Skill index ↔ disk: 15 skills in
.claude/skills/README.mdmatch exactly 15SKILL.mdfiles on disk. No orphans, no broken cross-links.
- All four edges resolve as documented in ADR-0006:
tyrne-kernel → tyrne-hal(production) +tyrne-test-hal(dev);tyrne-bsp-qemu-virt → tyrne-hal + tyrne-kernel(production);tyrne-test-hal → tyrne-hal(production);tyrne-hal → ∅. Plan prose phrased the kernel↔test-hal edge in the wrong direction; code is correct.
Request changes
Per the code-review master plan §Merge step, any single track-level blocker forces Request changes. Track E returned seven blocker-class doc-drift items; all other tracks returned Approve / Comment / Iterate (no blockers). The blockers are all single-edit fixes in single files; none requires a code change.
- Doc drift — GIC version (overview.md) —
docs/architecture/overview.md:77BSP table claimsbsp-qemu-virtuses GICv3, but T-012 shipped a GIC v2 driver (bsp-qemu-virt/src/gic.rs; ADR-0011 +exceptions.md+ UNSAFE-2026-0019 all say "GIC v2"). Resolution: correct the GIC version in the BSP table row. - Doc drift — GIC version (hal.md Mermaid box) —
docs/architecture/hal.md:50BSP layering Mermaid box readsBIrq["GICv3 / GIC-400 impl"]. There is no GICv3 impl in tree. Resolution: swap the box label to"GICv2 / GIC-400 impl". - Doc drift — GIC version (hal.md table) —
docs/architecture/hal.md:181bsp-qemu-virttable row "Interrupt controller | GICv3" duplicates the same drift; thebsp-pi4row at line 198 correctly notes GIC-400 (v2 subset). Resolution: correct thebsp-qemu-virtrow toGICv2. - Doc drift — Timer trait status —
docs/architecture/hal.md:126Timer subsection still saysarm_deadline/cancel_deadlineareunimplemented!(). T-012 implemented them under UNSAFE-2026-0021 (bodies atcpu.rs:492/:511); ADR-0010 §Revision notes already records this. Resolution: flip the subsection prose, cite ADR-0010 §Revision notes 2026-04-28. - Doc drift — scheduler idle path —
docs/architecture/scheduler.md:11andscheduler.md:73still describe idle's body ascore::hint::spin_loop()with thewait_for_interruptform framed as a future T-012 deliverable. T-012 landed 2026-04-28;bsp-qemu-virt/src/main.rs:276showscpu.wait_for_interrupt();inidle_entry. Resolution: update the idle-loop description in both passages and cite UNSAFE-2026-0021. - Doc drift — security-model DAIF question —
docs/architecture/security-model.md:330Open-question bullet still says v1'sboot.sdoes not explicitlymsr daifset, #0xfbefore stack/BSS setup. T-013 (commitf289d4d, ADR-0024, audited under UNSAFE-2026-0017) added exactly thismsr daifset, #0xfas the first instruction of_start(boot.s:84). Resolution: close the question with a citation to T-013 / ADR-0024 / UNSAFE-2026-0017, or convert the bullet to a closure-rider note. - Glossary dangling link to ADR-0023 —
docs/glossary.md:25links(decisions/0023-cross-table-capability-revocation-policy.md)which does not exist (ADR-0023 reserved-empty). Every other reference to ADR-0023 (phase-b.md,security-model.md, B0/B1 closure reviews) is prose-only without a hyperlink. Resolution: drop the markdown link wrapping (keep prose "see ADR-0023 (deferred per Phase B0 closure)"), or write the deferred placeholder ADR-0023 file with aStatus: Deferredbody.
- Migrate
CAP_TABLE_CAPACITY <= Index::MAXto inlineconst { assert!(...) }form (kernel/src/cap/table.rs:105). - Add
const { assert!(N > 0, ...) }at the top ofSchedQueue::new(kernel/src/sched/mod.rs:48). - File an ADR introducing
IpcError::WrongObjectKind/IpcError::MissingRight(and symmetric transfer variants) before B2 begins. - Queue an ADR for "endpoint rollback /
ipc_cancel_recv" before Phase B2 to address the Deadlock-rollback endpoint-state asymmetry atsched/mod.rs:773-778. - Route
Some(cap)payloads inIpcQueues::reset_if_stale_generationthrough the destroyer's table for graceful drain when endpoint destruction lands. - Add a one-line comment at
kernel/src/cap/table.rs:329-336explaining the "descendants fit because every live node appears at most once" size proof.
- Add
: Send + Syncto theContextSwitchtrait declaration (hal/src/context_switch.rs:25). - Lift
FakeCpu/FakeTaskContextfromkernel/src/sched/mod.rsintotyrne-test-hal::cpusoFakeCpu: ContextSwitchper ADR-0020. - Either widen the
IrqState(pub usize)doc-comment to acknowledge "BSP impls and test-only Cpu impls" or narrow the field topub(crate)with aBspConstructhelper.
- Cross-table revocation gap (ADR-0023 deferred; B3–B6 first-multi-task-server arc).
u32generation overflow (B-late, long-running services).- K3-9
Capability::Debugredaction (B5 syscall-ABI design venue). - BSP task-body
.expect/panic!(B-first-userspace-driver pre-requisite; covered byerror-handling.md §8). arm_deadline/cancel_deadlinerace windows (no v1 caller; B5+time_sleep_untilvenue).cargo-vet initbaseline (K3-8 prerequisite).- PL011
UARTFR_TXFFspin attempt-cap (low priority, Phase B BSP-wide). - UNSAFE-2026-0019 / 0020 / 0021 Pending-QEMU-smoke closure (maintainer-side workitem).
- P1
#[cold]annotation on error-return paths inipc/mod.rs,sched/mod.rs,cap/table.rs— highest-ROI near-term, success-path 2–5 %.textreduction, very low risk. - P2
#[inline]posture on hot helpers (resolve_handle,entry_of,pop_free,validate_*_cap, accessor helpers) — 0–3 % cross-crate code-size, intra-crate already inlined. - P3 Const-eval invariant assertions — already complete.
- P4
core::hint::assert_uncheckedon already-debug_assert-checked invariants — 1–3 instructions per context-switch entry; medium risk (each site needs a SAFETY comment + audit-log Amendment per ADR-0024 / unsafe-policy). - P5
CapEntryslot packing (Option<u16>→ sentinel) — ~3 KiB.bssreduction; requires a smallOccupancyIndexnewtype to preserve the v1 zero-unsafeposture incap/. - P6
Arena<T,N>per-slot overhead — ~500 bytes total across three arenas; same shape as P5. - P7 Drop d8–d15 saves in
context_switch_asm— 1 KiB.bss+ ~30 % per-switch instruction reduction; gated on a paper-review audit (P7c) confirming zero NEON ops in release ELF. - P8
SchedQueue::enqueuearithmetic — already a fast bit-mask in release; no change. - P9 Boot path
gic.init()MMIO write count — already minimal; no change. - P10 Wall-clock IPC round-trip benchmark harness — precondition for measuring P1, P4, P7; ~30 LOC, low risk; gate behind a
benchfeature flag. - P11 Hand-rolled
pub const fn zero()forAarch64TaskContext— ~50–100 bytes.textreduction oncecore::array::from_fnbecomes const-stable; tracked as deferred const-fn migration.
- §F-1 wire QEMU smoke into CI as a
qemu-smokejob (closes the "Pending QEMU smoke verification" self-clear gap on UNSAFE-2026-0019/0020/0021; future-proofs against newunsafeblocks accumulating their own notes). - §F-2 decide
ObjError::StillReachable: delete + rely on#[non_exhaustive], or extendtesting.mdwith a "documented future variant" exception. - §F-3 roll-up cleanup: add
clippy::expect_used+clippy::panicto the allow-blocks inobj/task.rs:104,obj/endpoint.rs:96,obj/notification.rs:111. - §M-2 open a B2-or-later roadmap task to add
proptest(orbolero) under[dev-dependencies]oftyrne-kerneland write one property test againstCapabilityTable's derivation-tree invariants. - §M-3 rerun
cargo llvm-covat next phase-boundary closure (B2 entry); name the artifactdocs/analysis/reports/<ISO>-coverage-rerun.md.
- Drop the redundant
compiler_fence(Ordering::SeqCst)inirq_entry's spurious-IRQ branch (exceptions.rs:166-174) or document as defence-in-depth. - Add a comment cross-reference in
vectors.spointing at theexceptions.rs:77TrapFramesize assertion so the asm/Rust frame-size contract is paired in the maintainer's mental model. - Append a defensive
loop { core::hint::spin_loop(); }afterstart(SCHED.as_mut_ptr(), cpu);inkernel_entry(main.rs:716-721). - Add
// Receives the saved-frame pointer in x0 even though v1 ignores it; future arcs will read e.g. ELR/SPSR.beforeirq_entryto justify the unused_frameparameter. - Add
const _: () = assert!(core::mem::size_of::<Aarch64TaskContext>() == 168);immediately after the type definition atbsp-qemu-virt/src/cpu.rs:305to mirror theTrapFramediscipline (Track I §Non-blocking #3).
- Add a
supply-chainjob that runscargo install cargo-audit && cargo audit(no-op today, future-safe) or amendinfrastructure.md§Continuous integration to markcargo audit/cargo vet checkas conditional onCargo.lockcontaining at least one external entry. - Replace the bespoke
rustupblock in CI withdtolnay/rust-toolchain@stablehonouringrust-toolchain.toml; drop the orphanrustup component add rustfmt clippyagainstdefault stable. - In
infrastructure.md§Configuration files, prepend "(present once supply-chain tooling lands per Phase 5)" to the four aspirational rows, or move them under a sub-heading "Planned (when first extern dep lands)". - In
infrastructure.md, add a one-line back-pointer "lint set canonical atcode-style.md§Lints" so the two standards stay obviously in sync. - Note in
infrastructure.md§Toolchain thatmiriis added on-demand by the CI job (workspace-local invocation requiresrustup component add mirionce).
- §J-NB1 — 64 stale
cemililik/TyrneOSURLs across 27 files. Resolve canonical repo URL first (git remote -vsaysUmbrixOS, four newest docs sayTyrne, 64 older references sayTyrneOS), then sweep with a singledocs(refs):commit similar in shape to10e3351. Cross-coordinated with Tracks A / G / H / B. - §J-NB2 — replace
YüksekwithHighin seven non-quoted committed English docs (T-009-...md:109/110, B0-closure (business), B0-closure (security), security-reviews/README.md:35, unsafe-log.md:263 + :271). Two commit-message-quoted instances are immutable. - §J-OBS1 — consider lifting
#![deny(clippy::todo)]fromkernel/src/lib.rsto[workspace.lints.clippy]sohal,test-hal,bsp-qemu-virtcarry the same posture.
- Decide edition-2021 vs edition-2024 for the
extern "C" { static tyrne_vectors: u8; }block atbsp-qemu-virt/src/main.rs:484; either bump + convert both the block andkernel_entrytounsafe extern "C", or leave at edition 2021 with a one-line comment justifying the legacy form. - Decide ADR-0023 indexing:
docs/decisions/README.mdADR index jumps 0022 → 0024 whilephase-b.md's ADR ledger lists ADR-0023 as Deferred; pick one indexing convention and apply everywhere (closes the doc-glossary blocker #7 in the same edit). - The plan's prose at §5 Track I ("
tyrne-test-halis dev-dep ontyrne-kernel") inverts the actual edge direction. Code is correct; only plan prose is loose.
- CI absence claim is stale (Track H, Track J). The plan's §5 Track H + §11 still describe "the largest documented gap" as CI absence. CI exists at
.github/workflows/ci.ymlsince 2026-04-23 (four jobs:lint-and-host-test,kernel-build,miri,coverage). The actual gap is narrower: CI lackscargo audit/cargo vet check(claimed merge-blockers ininfrastructure.md), and thesupply-chain/config files standards/infrastructure.md mentions are not on disk. - Track B's prompt named phantom HAL methods (Track B). The Track B checklist names
now_ticks/freq_hz/enable_irqs/set_priorityetc. The actual landed trait surfaces match ADR-0010 / ADR-0011 / ADR-0008 cleanly:Timerisnow_ns/arm_deadline/cancel_deadline/resolution_ns(nonow_ticks, nofreq_hz);IrqControllerisenable/disable/acknowledge/end_of_interrupt(noset_priority);Cpuisdisable_irqs+restore_irq_state(noenable_irqs). Plan amendment: name methods exactly to avoid future agents chasing phantom regressions.
- Security review: see
track-c-security.md— Approve. Eight axes pass; row-by-row audit cross-reference table verified clean for all 21 entries; UNSAFE-2026-0012 removal complete; UNSAFE-2026-0019/0020/0021 Pending-QEMU-smoke notation in place; eight forward-flagged items (all non-blocking, all inherited from prior reviews). - Performance review: see
track-d-performance.md— Iterate. 11 proposals queued; P1 / P10 / P4 highest-ROI near-term picks; P3 already complete. - Per-track artefacts: a-kernel (Approve), b-hal (Comment), c-security (Approve), d-performance (Iterate), e-docs (Request changes), f-tests (Approve), g-bsp (Approve), h-infra (Approve), i-integration (Approve), j-hygiene (Comment).
- Pre-flight:
00-preflight.md— gate clean.