Roadmap
Long-term direction for capOS. Keep this file outcome-oriented. Detailed task
decomposition belongs in docs/backlog/; current execution order belongs in
WORKPLAN.md; completed milestone/review reports belong in
docs/changelog.md.
Current Direction
Current selected milestone: Session-Bound Invocation Context.
The visible goal is in cleanup: the core gates are landed, and remaining work is to finish the peer-owned adventure shared-service migration and final full-gate verification. Implemented pieces include the process-session invariant, endpoint caller-session metadata, stale normal endpoint rejection, transfer scopes, field-granular disclosure gating, session expiry for broker-issued shell bundle caps, guest bundle narrowing, chat session-keyed membership, terminal and stdio bridge live-session guards, keyed service-scoped caller references, and the session-context proof that distinct endpoint service scopes derive distinct opaque caller-session reference tuples. The milestone still replaces caller-selected service-visible identity without continuing the service-object identity migration.
The prior core service-object routing/lifecycle subproof landed in commit
a4655f0 at 2026-04-28 14:10 UTC: it proves trusted service-object minting,
generation-checked receiver cookies, copy/move IPC transfer, nested spawn
delegation, close/revoke rejection, and stale-cookie rejection after record
reuse. That proof remains historical low-level coverage. The active milestone
does not continue subject/proof root opening or shared-service service-object
migration.
This milestone intentionally precedes more remote shell work. The SSH Shell
Gateway remains a planned Stage 7 shell/networking milestone, but safe
network-backed shell delegation depends on the same one-session-per-process
and privacy-preserving endpoint session model. The SSH version-exchange
checkpoint lives on
workplan/ssh-version-exchange-recovery and still requires QEMU harness review
before merge.
Details:
WORKPLAN.mddocs/backlog/session-bound-invocation-context.mddocs/backlog/service-object-identity-migration.md(superseded)docs/backlog/stage-6-capability-semantics.mddocs/proposals/session-bound-invocation-context-proposal.mddocs/proposals/service-object-capabilities-proposal.md(superseded)docs/proposals/user-identity-and-policy-proposal.mddocs/proposals/oidc-and-oauth2-proposal.mddocs/backlog/local-users-management.md
Whitepaper Track
A future capOS whitepaper / technical report consumes – not duplicates –
work from the other tracks. The plan, outline, and live evidence-gap log
remain in docs/paper/ (plan.md, outline.md, evidence-gaps.md).
The paper itself is a Typst project at papers/schema-as-abi/ and is
built via make paper.
The paper’s Tier-1 evidence requirements pull these existing items into explicit paper-supporting roles. They are not new tracks; they are the selection lens this track applies:
- Stage 6 session-bound invocation context migration (closes the “interface IS the permission” claim).
- A measurement harness over
make run-measureproducing reproducible ring throughput,cap_enterlatency, IPC handoff, and schema-dispatch numbers (closes the ring-as-sufficient-boundary claim). - A paper-scoped persistence proof-of-concept narrower than the storage proposal (closes the wire-format-enables-persistence claim).
- A paper-scoped network-transparency proof-of-concept narrower than the general networking proposal (closes the wire-format-enables-network-transparency claim).
- At least one of {promise pipelining, notification objects} (closes capnp-rpc-shaped composition beyond CALL/RECV).
Tier-2 strengtheners: ring-protocol Kani proof, full concurrent SMP scheduling, end-to-end SSH Shell Gateway, one non-toy demo beyond Adventure or First Chat.
Out of scope for the first paper (acknowledge in Future Work only): aarch64, GPU, live upgrade, formal MAC/MIC, Go/WASI, cloud metadata, production volume encryption.
When workplan slices close a paper-evidence gap they should reference
docs/paper/evidence-gaps.md and update it in the same task, including
the matching #todo block in papers/schema-as-abi/main.typ. A
structural pre-evidence draft already exists at
papers/schema-as-abi/main.typ; the abstract, the Evaluation section,
the Conclusion, and any contribution claim that depends on missing
Tier-1 evidence stay deferred until that evidence lands. New paper
content that does not depend on missing artifacts may be drafted at
any time and lives next to the existing #todo blocks.
Completed Foundation
- Stage 0: Foundations: bitmap physical frame allocator, heap for
alloc, IDT exception handling, and initial Cap’n Proto schema scaffolding. - Stage 1: Virtual Memory: kernel and per-process address spaces, page table abstraction, HHDM preservation, and user-half cleanup.
- Stage 2: User-Space Transition: GDT/TSS/syscall setup and Ring 3 round-trip path.
- Stage 3: Process Abstraction: ELF loading, process ownership of address
spaces and cap tables, process exit cleanup, and the current
exit/cap_entersyscall surface. - Stage 4: Capability Syscalls / Ring Transport: Console capability,
shared-memory submission/completion rings,
cap_enter, CQE transport errors, and alloc-free dispatch paths. - Stage 5: Scheduling Core: PIT/PIC timer preemption, round-robin scheduler, context switching, generation-tagged caps, and VirtualMemory cap.
- Kernel Networking Smoke: in-kernel QEMU virtio-net + smoltcp proof for ARP, ICMP, and TCP HTTP.
- Boot To Shell / Native Shell: shell-led boot flow, split debug/terminal UARTs, local setup/login, anonymous/operator sessions, and shell REPL.
- Verified Core: bounded local/GitHub Kani gate plus high-memory proof gate for selected cap-table, frame-bitmap, transfer rollback, and resource accounting invariants.
- Shared-Service Demo Base: chat, adventure, NPC-as-process, and shared service harness prototypes.
Historical completion reports live in docs/changelog.md.
Stage 6: IPC And Capability Transfer
Outcome: cross-process capability calls, capability transfer, revocation, and process spawning are capability-shaped and usable by init-owned service graphs. Caller-selected service-visible identity is being replaced by session-bound invocation context: each normal process has one immutable session context, endpoint calls expose privacy-preserving caller-session metadata, and broker-granted service roots/facets carry service access.
Implemented:
cap_enterblocking wait- Endpoint kernel object
- RECV/RETURN ring opcodes
- cross-process IPC
- direct-switch IPC handoff
- legacy endpoint receiver metadata as transitional IPC machinery
- copy/move capability transfer
CAP_OP_RELEASE- runtime handle release integration
- epoch revocation and Revocable Read proof
- MemoryObject substrate – the kernel-level mapping mechanism that backs
zero-copy IPC. Demonstrated end-to-end by
make run-memoryobject-shared(single-shot transfer) andmake run-ipc-zerocopy(multi-message shared point-to-point buffer with metadata-only endpoint CALLs). The typedSharedBuffersurface and service APIs that consume it (File.readBuf,BlockDevice.readBlocks, NIC RX/TX rings) are still pending. - ProcessSpawner / ProcessHandle
- init-owned manifest execution and boot package boundary cleanup
- immutable per-process
SessionContextownership, default child-session inheritance, and trusted broker-selected child sessions, demonstrated bymake run-session-context
Remaining themes:
- typed
SharedBuffercapability and consuming service APIs (storage, block, network, GPU) on top of the existingMemoryObjectsubstrate - notification objects (so zero-copy producers/consumers can signal each other without per-record endpoint CALLs)
- promise pipelining
- CapabilityManager list/grant interface
- remaining session-keyed shared-service migration for adventure and terminal bridges, including service use of bounded disclosure where needed
- scheduling context and resource donation
- init ELF embedding
Details:
docs/backlog/session-bound-invocation-context.mddocs/backlog/service-object-identity-migration.md(superseded)docs/backlog/stage-6-capability-semantics.mddocs/proposals/service-architecture-proposal.mddocs/proposals/storage-and-naming-proposal.mddocs/proposals/error-handling-proposal.md
Stage 7: SMP, Runtime, Networking, And Shell
Outcome: capOS moves from single-CPU scheduling and local-only shell access to multi-CPU execution, thread-aware runtime behavior, socket-shaped network capabilities, and agent/web shell entry points.
SMP status:
- Phase A complete: BSP per-CPU syscall stack/current-thread state and unified kernel-entry stack hook.
- Phase B complete: APs start through Limine MP, switch to capOS kernel paging/stacks, initialize AP-local CPU state, and park.
- Phase C selected AP scheduler-owner proof complete: GS/
swapgs, LAPIC timer/IPI, TLB shootdown, and first AP scheduler-owner proof are complete. Commitd88bca7at2026-04-25 11:31 UTCproves AP cpu=1 can run scheduler-owned user contexts under-smp 2while a scheduler-owner latch keeps the BSP in kernel idle. Full concurrent scheduling remains future work: per-CPU scheduler ownership, reschedule IPIs, and process-ring-safe concurrent scheduler-owned work. - The next visible SMP milestone is Multi-Process SMP Concurrency. Its technical prerequisite is full concurrent SMP scheduling: multiple CPUs must own scheduler work at the same time through reviewed per-CPU ownership, runnable handoff, and cross-CPU wakeup paths. The visible proof is that independent worker processes improve wall-clock runtime on a deterministic CPU-bound workload.
- A separate later milestone is In-Process Threading Scalability. It proves sibling threads in one process can run on different CPUs and scale the same class of workload after per-thread ring/completion routing removes the current process-wide capability-ring bottleneck.
Runtime/network/shell themes:
- reconcile in-process threading implementation status and any follow-on work
- Telnet Shell Demo as first TCP-backed
TerminalSessionproof. Plaintext, loopback-only research demo; not a shippable Telnet service. - Tickless idle as the near-term timer cleanup: split clocksource from
clockevent, convert timeout waiters to absolute deadlines, replace the
user-mode idle process with kernel/per-CPU idle, then stop the periodic tick
only when no runnable work exists. Generic full-nohz remains deferred;
SQPOLL nohz belongs behind Ring v2, per-CPU scheduler ownership,
housekeeping, CPU accounting, and CPU-isolation authority. See
docs/proposals/tickless-realtime-scheduling-proposal.mdanddocs/research/nohz-sqpoll-realtime.md. - SSH Shell Gateway as the production remote CLI successor to Telnet after host-key, authorized-key, audit, and persistence prerequisites exist
- decomposed userspace NIC/network-stack milestone after driver authority gates
- native shell agent runner
- WebShellGateway using the same broker-issued shell/agent authority model
Details:
docs/backlog/smp-phase-c.mddocs/backlog/runtime-network-shell.mddocs/proposals/smp-proposal.mddocs/proposals/tickless-realtime-scheduling-proposal.mddocs/proposals/networking-proposal.mddocs/proposals/shell-proposal.mddocs/proposals/llm-and-agent-proposal.mddocs/proposals/boot-to-shell-proposal.md
Hardware, Boot, And Storage
Outcome: capOS boots beyond the current ISO/QEMU manifest path, discovers real hardware, supports block devices, and exposes local persistent storage through typed capabilities.
Tracks:
- bootable GPT/EFI disk image and
make run-disk - ACPI/MADT/MCFG discovery
- reusable interrupt and PCI/PCIe infrastructure
- virtio-blk and NVMe block-device paths
- boot binary ISO layout that moves ELF payloads out of the manifest blob
- RAM-backed
Store/Namespace - read-only local filesystem proof
- writable local storage with recovery policy
- cloud device tracks for GCP/AWS/Azure NICs
Details:
docs/backlog/hardware-boot-storage.mddocs/proposals/cloud-deployment-proposal.mddocs/proposals/storage-and-naming-proposal.mddocs/dma-isolation-design.md
User Identity, Sessions, And Policy
Outcome: shell, service, and future web sessions receive narrow capability bundles based on explicit identity, freshness, policy, and audit context.
Implemented base:
- anonymous/operator shell sessions
- password setup/login proof
- broker-issued shell bundles
- redacted auth/session audit records
Remaining themes:
- manifest-seeded local accounts, recovery identities, service identities, and initial role/resource profiles
- disk-backed local account store over capability-native storage
- default per-account, guest, anonymous, external, and service-account resource bundles
- explicit external identity bindings for OIDC/passkey/cloud/certificate principals
- durable verifier/passkey records
- WebAuthn and passkey-only setup path
- broader AuditLog completion
- ABAC context such as auth freshness, session age, source, and claims
- mandatory-policy labels and wrapper caps
- guest and anonymous workload demos
- POSIX profile adapter metadata
- OIDC/OAuth2 integration
Details:
docs/proposals/user-identity-and-policy-proposal.mddocs/backlog/local-users-management.mddocs/proposals/oidc-and-oauth2-proposal.mddocs/proposals/certificates-and-tls-proposal.mddocs/proposals/cryptography-and-key-management-proposal.mddocs/security/trust-boundaries.md
Security And Verification
Outcome: trust boundaries fail closed, proof gates stay practical, and trusted build inputs remain review-visible.
Implemented base:
- host tests for pure logic
- Loom ring model
- Miri/proptest/Kani paths
- dependency policy checks
- pinned Limine and Cap’n Proto tooling
- DMA isolation design gate
- panic-surface inventory
Remaining themes:
- Stage-6 trust-boundary refresh
- untrusted-service hardening and quota/exhaustion smokes
- Kani harness bounds refresh when new proof obligations are concrete
Details:
docs/backlog/security-verification.mdREVIEW.mdREVIEW_FINDINGS.mddocs/proposals/security-and-verification-proposal.mddocs/security/verification-workflow.mddocs/trusted-build-inputs.md
Shared-Service Demos
Outcome: multi-process demos prove resident services, shell-spawned clients, session-bound invocation context, shared harnesses, and eventually network-transparent federation.
Implemented:
- First Chat MVP
- Local MUD/adventure prototype
- NPC-as-process fleet
- shared service harness extraction
Remaining themes:
- session-keyed service state replacing legacy receiver-selected chat/adventure identity
- per-principal chat state and audit
- Aurelian Frontier game-depth work after the first deterministic mission slice
- native command-surface replacement for prototype
StdIO - federated chat after network transparency
Details:
docs/backlog/shared-service-demos.mddocs/backlog/aurelian-frontier.mddocs/demos/adventure.mddocs/proposals/aurelian-frontier-proposal.mddocs/proposals/interactive-command-surface-proposal.md
aarch64 Support
Outcome: port the architecture layer after x86_64 hardware abstraction stabilizes.
Shared code expected to carry over:
- capability model and schema
- ring structs and transport contracts
- userspace runtime model
- process/capability abstractions above
arch/
Architecture-specific work:
- EL0/EL1 syscall entry/exit
- GICv3 interrupts
- ARM generic timer
- PL011 UART
- TTBR0/TTBR1 MMU setup
- TPIDR_EL1 per-CPU data
kernel/linker-aarch64.ld
Future Tracks
These are not selected unless WORKPLAN.md or user direction pulls them into
active scope:
- regular Rust runtime support
- C
libcapos - Go
GOOS=capos - Lua scripting
- POSIX compatibility
- WASI runtime
- C++ experiments
- GPU/CUDA capability integration
- system monitoring
- network transparency
- process persistence/checkpoint-restore
- live upgrade
- cloud metadata
- volume encryption
- formal MAC/MIC modeling
- browser/WASM support
- robotics realtime control
Use proposal files under docs/proposals/ and research notes under
docs/research/ before promoting any future track into WORKPLAN.md.
Lua scripting should arrive as an ordinary capability-scoped userspace runner,
not as kernel scripting or ambient shell authority.
Observable Milestones
Completed visible milestones:
- 2026-04-22 16:35 UTC, commit
d4016ab: Unprivileged Stranger - 2026-04-23 08:41 UTC, commit
f554e88: Native Cap Shell - 2026-04-23 13:39 UTC, commit
e5adafb: Boot to Shell - 2026-04-23 16:15 UTC, commit
7f19af2: Revocable Read - 2026-04-23 16:34 UTC, commit
8b66c13: split UART shell session - 2026-04-23 22:09 UTC, commit
d43b691: Verified Core - 2026-04-24 00:13 UTC, commit
2cd85a8: First Chat MVP - 2026-04-24 01:40 UTC, commit
add7f9b: Local MUD/adventure prototype - 2026-04-24 03:13 UTC, commit
da5f5e9: Ring as Black Box - 2026-04-24 15:37 UTC, commit
b56a5c1: First Packet - 2026-04-24 16:47 UTC, commit
a4f1722: First HTTP - 2026-04-25 05:36 UTC, commit
0b79054: SMP Phase A: per-CPU data on BSP - 2026-04-25 06:59 UTC, commit
d3c30c6: SMP Phase B: APs running - 2026-04-25 11:31 UTC, commit
d88bca7: First AP Scheduler - 2026-04-25 20:25 UTC, commit
2834bfc: Telnet Shell Demo
Visible demo follow-ups:
- Adventure/shared-service follow-ups after the Local MUD prototype:
73d83aa,da51dc7,353c8bc,e20cf07,948c96e, andca6300c. These refine discoverability, room context, expedition map, relic custody, explicit resume, and chat-only named actors; detailed reports live in commit history. - 2026-04-26 04:10 UTC, commit
5480304: Scoped Telnet Gateway Authority.telnet-gatewaynow uses manifest-forwarded scoped listener authority plusRestrictedShellLauncher; detailed verification history lives in commit history. - 2026-04-26 23:12 EEST, commit
4304b0e: Default run Telnet wiring. The default manifest startstelnet-gateway, andmake runattaches host-local127.0.0.1:2323 -> guest :23forwarding. - 2026-04-27 00:02 EEST, commit
7a155f4: Telnet IAC handoff fix and repeat-connect support. Telnet handoff no longer consumes raw socket input beforeintoTerminalSession, repeated host connections succeed, and the harness drives two consecutive sessions. - 2026-04-28 17:46 UTC, commit
d09243d: Aurelian Phase 9 competency gates. The adventure proof now has host-testable rank/star/circle policy, status output for rank marks and standing, signifer skill gates, first-mission spell gates, and QEMU assertions for rank denial plus debrief reward. - 2026-04-28 18:12 UTC, commit
47dbfc5: Aurelian Phase 10 market logistics. Adventure now has typed quote/buy/sell/trade/repair calls, bounded market roles, a deterministic Maro route purchase, and QEMU assertions for market quote, successful exchange, and clean-custody trade refusal. - 2026-04-28 19:36 UTC, commit
e204454: Aurelian Phase 11a calendar foundation. Generated content now carries fixed-smoke season/day/weather and hazard state plus bounded seasonal resources, Adventure status prints that state, and the real scenario process asserts it throughAdventure.status. - 2026-04-28 20:08 UTC, commit
48c62db: Aurelian Phase 11b regional foundation. Generated content now carries settlement, outpost, and route metadata with validation and stable ordering; Adventure status prints a regional summary, and the real scenario process asserts it throughAdventure.status. - 2026-04-28 21:08 UTC, commit
0b7db05: Aurelian Phase 11c construction foundation. Generated content now carries material, facility, blueprint, artifact, and enchantment-slot metadata with pure Rust validation and deterministic property derivation; Adventure status prints a construction summary, and the real scenario process asserts it throughAdventure.status. Construction jobs, material reservation, escrow, completion/release, and full artifact crafting gameplay remain future work. - 2026-04-28 21:36 UTC, commit
f53d044: Aurelian Phase 11d agent NPC budget foundation. Generated content now carries disabled-by-default optional NPC agent budget metadata with model profiles, per-session/day input/output token limits, tool-call limits, cooldown, fatigue, sleep, refusal, and audit visibility. Pure Rust fake-model tests cover spending, refusals, disabled transcript stability, bounded output, and no authority mutation from model text; Adventure status prints an aggregate budget line asserted throughAdventure.status. Live LLM integration, hosted-agent execution, durable memory, autonomous NPC actions, and authority mutation from model output remain future work. - 2026-04-28 22:22 UTC, commit
335a9ee: Aurelian Phase 12 party foundation. Adventure now has typed local party create/invite/accept/leave/delegate calls andassist, keyed by service-created local player labels derived from live caller-session keys. The server uses the unit-testedadventure-contentparty transition state for invite, accept, scoped delegation, assist, and leave cleanup; the scenario process asserts the one-client cap surface and party status line. Two-client QEMU proof, transfer escrow, duel/spar/contest authority, and cross-device multiplayer remain future work. - 2026-04-29 06:43 UTC, commit
ac49375: Aurelian Phase 12 physical-item transfer foundation. Adventure adds typedtransferfor same-party service-local player labels, with ordinary inventory mutation kept atomic inside the existing service and backed by pure Rust transfer tests. The scenario process asserts one-client refusal paths without faking a second live session. Currency escrow, broad market/trade coordination, and successful two-client QEMU transfer proof remain future work. - Pending branch
feature/paperclips-demo: Paperclips Terminal Demo. The default manifest advertises the clean-roompaperclipsterminal game, andsystem-paperclips.cueplusmake run-paperclipsprovide the focused QEMU proof for production, sale, automation, simulation ticks, project listing, and clean shell exit. The demo is intentionally outside the active Session-Bound Invocation Context milestone because it exercises a standaloneStdIOterminal process rather than shared-service caller identity.
Active visible milestone:
- Session-Bound Invocation Context: normal workload processes have exactly one
immutable live session context, endpoint calls reveal only privacy-preserving
caller-session metadata by default, and shared services stop deriving
caller identity from caller-selected service-visible metadata. Commit
3edee90at2026-04-28 16:26 UTClands the first proof for child session inheritance, failed second-session injection, and trusted broker-selected child contexts; commit3469c27at2026-04-28 16:54 UTCadds broker-side expired-session rejection; commit687511aat2026-04-28 17:43 UTCadds endpoint caller-session metadata, payload-spoof rejection for invocation context, and stale normal endpoint rejection; commitf0cb74bat2026-04-28 18:38 UTCadds transfer-scope enforcement for endpoint IPC, endpoint returns, and spawn grants; commit0f92d77at2026-04-28 19:33 UTCadds explicit endpoint subject disclosure gating by request and scope; commitdc7ece4at2026-04-28 20:06 UTCmigrates chat membership to endpoint caller-session keys. Later Gate 4 slices retired normal shell badge selection, bound terminal and stdio bridge authority to live caller sessions, keyed the 128-bit opaque caller reference with a non-reused endpoint service-scope id, and commit5e9dc4eat2026-04-29 11:05 UTCproves one child process/session receives distinct opaque caller-session reference tuples across two endpoint service scopes. Remaining selected-milestone work is the peer-owned adventure migration, final full-gate verification, and any documentation alignment needed after that migration lands.
Paused visible milestone:
- SSH Shell Gateway:
sshreaches the capOS login/native shell flow through an SSH-backedTerminalSessionin QEMU, using host-local forwarding, public-key authentication, denied unsupported SSH features, and the same child shell capability boundary proven by Telnet. This remains planned Stage 7 work, but network-backed shell delegation should wait for the active session-bound invocation context migration to settle.
Candidate next visible milestones:
- Multi-Process SMP Concurrency: implement full concurrent SMP scheduling,
then have
make run-smp-process-scaleboot QEMU with multiple CPUs, run a deterministic CPU-bound workload split across independent worker processes, print verified output plus 1/2/4-process timing, and record near-linear 1-to-2 CPU speedup under repeated KVM-backed runs. - In-Process Threading Scalability: after per-thread capability rings and
completion routing exist, have
make run-thread-scalerun the same class of workload across sibling threads in one process, verify the result, and record 1/2/4-thread timing without relying on a process-wide ring waiter. - Agent Shell
- WebShellGateway
- bootable disk image
- local disk storage
- federated chat
Select the next milestone in WORKPLAN.md only after the current selected
milestone is achieved and recorded, or when the user explicitly changes the
selected milestone.