Roadmap
Every category's tasks and their real status, mirrored from the repository's own central roadmap.
Mirrored from docs/ROADMAP.md.Source last changed Edit docs/ROADMAP.md
NoderaMC Roadmap
Snapshot: 2026-08-01 · Overall system completion 90.4% (not recomputed) · 2,285 Java tests ·
690 Rust workspace tests · 2 Tauri-shell tests (one browser-opening case ignored) · 31 frontend tests
· 0 failing. ./gradlew check, both Rust workspaces, frontend production build and signed debug APK
and a physical Android 15 run were green on this date.
The completion figure is not recomputed when the task set changes. Its weighting is not derivable from this table, and a raw done/total would fold not-started tasks into the denominator in a way the historical figure never did — a stale number that says so is better than an invented one. It has moved 93.1 → 85.7 → 91.3 → 90.4 %, and every move was real: a programme that adds ten tasks lowers it before it raises it. A percentage that only ever rises is measured against a scope that quietly moves.
The app and mobile categories merged into frontend on 2026-08-05, which
also takes the website. Mobile's five tasks are renumbered +11 — mobile 1…5 are frontend 12…16,
so a "mobile 3" in an older issue is frontend 14 — and the app's eleven kept
their numbers. No status moved in that commit: a merge that also retires rows makes it impossible to
tell which change the evidence belonged to.
Documentation format, conventions, and the maintenance discipline: README.md.
1. Where the build stands
The engine, the network stack, and both Rust services are proven Minecraft-free. What remains is
concentrated in two places: the live lane (minecraft/Task.2.md), wiring
the proven headless stacks to a real ServerLevel, which gates the live acceptance of almost every
other category; and the parity programme (engine/Task.8.md …
engine/Task.12.md), which joins entities, redstone, environment, mobs and the
player lane to the validated lane and burns the limitation registers to empty.
Already proven live, on real clients: world sharing through the tracker and rendezvous; a second client joining; a world surviving its host being killed and re-hosted by the joiner from the network in ~3 s; the entity lane active on 12–13 regions across member nodes; per-player FOV region ownership with forwarded actions and quorum commits; validated pickup delivered exactly once.
| Category | Tasks | Done | In progress | Blocked | Charter |
|---|---|---|---|---|---|
| Engine | 12 | 7 | 5 | 0 | Deterministic simulation + committee validation |
| Network | 15 | 12 | 3 | 0 | Wire, transports, runtime, storage, torrent plane, telemetry, measurement |
| Tracker | 6 | 5 | 1 | 0 | Always-on discovery service |
| Rendezvous | 6 | 4 | 1 | 1 | NAT reach: punching + relay fallback |
| Minecraft | 11 | 5 | 5 | 0 | The NeoForge mod — the playable product |
| Worker | 8 | 6 | 2 | 0 | The always-on headless peer |
| Frontend | 20 | 10 | 9 | 1 | Every user-facing surface: desktop launcher, Android companion, website |
| Testing | 1 | 1 | 0 | 0 | The test tooling: harness, scenarios, benchmarks, structural report |
| Telemetry | 3 | 1 | 1 | 0 | Consented measurement: ingest + Big Data plane |
| Total | 82 | 51 | 27 | 2 |
Every row counts the Task.<n>.md files on disk for that category. The Total row is a
transcription of them, and a transcription is what goes stale — it read 49/80 against rows summing
to 51/82 for two merges before anything printed the disagreement. web/scripts/build-status.mjs
therefore publishes the sum and warns when the two differ.
The server category (server/Task.0.md, 10 tasks, 0 done) is scoped in
plans/Plan.5.md and is excluded from this table and from the completion
figure until its first task starts — counting an unstarted programme would move the denominator
without moving the work.
2. Task index (all categories)
Status values are exactly those in each task file's header: ✅ COMPLETED · 🚧 IN PROGRESS · ⏳ BLOCKED · ⬜ NOT STARTED.
Engine — docs/engine/
| Task | Title | Status | Depends on |
|---|---|---|---|
| 1 | Domain types, crypto, canonical encoding | ✅ | — |
| 2 | Deterministic region engine | ✅ | engine 1 |
| 3 | Shadow validation | ✅ headless | engine 2, network 1 |
| 4 | Coordinator: leases, epochs, propose→verify→commit | ✅ headless | engine 3 |
| 5 | Committee validation — the MVP gate | ✅ headless | engine 4 |
| 6 | Server-fallback lane + cross-region router | ✅ headless | engine 5, engine 7 |
| 7 | Interference guard, chunk lifecycle, delegability, mod compatibility | ✅ headless | engine 4 |
| 8 | Entity & mob lane | 🚧 | engine 7, network 3, minecraft 2 |
| 9 | Validated redstone + contraption migration | 🚧 | engine 6, engine 7 |
| 10 | Environment lane: random ticks, fluids, fire, gravity, lighting | 🚧 | engine 8, engine 9 |
| 11 | Deterministic entity simulation: mob AI, spawning, projectiles | 🚧 | engine 8, engine 10 |
| 12 | Player lane & trustless closure | 🚧 | engine 11, network 2, minecraft 2 |
Network — docs/network/
Programme plan (task 14): plans/Plan.7.md.
| Task | Title | Status | Depends on |
|---|---|---|---|
| 1 | Wire protocol, transport seam, chunked streams, handshake | ✅ | engine 1 |
| 2 | Peer runtime: membership, gateway election, migration | 🚧 | network 1, engine 5, rendezvous 3 |
| 3 | Event-sourced + durable storage | ✅ | network 1 |
| 4 | Torrent distribution data plane | ✅ | network 3, engine 2 |
| 5 | Discovery, multi-bootstrap, persistent identity | ✅ | network 2 |
| 6 | Archive placement, replication, repair | ✅ | network 4, network 5 |
| 7 | Reliability, storage quotas, 24 h retention | ✅ | network 6 |
| 8 | Per-world content encryption | ✅ | network 4 |
| 9 | Crash safety + active-player stream | ✅ | network 4, network 6, network 7 |
| 10 | Tick-lag / TPS metric + low-TPS region handoff | ✅ | engine 5, network 7 |
| 11 | Telemetry core | ✅ | network 1 |
| 12 | Telemetry emitter core | ✅ | network 11, telemetry 1 |
| 13 | Measured service selection on the peer | 🚧 | tracker 5, rendezvous 5, network 2 |
| 14 | Cross-version wire protocol (plans/Plan.7.md) |
🚧 | network 1, network 2, tracker 5, rendezvous 5 |
| 15 | Structural benchmarking + structural code report | ✅ | network 2, network 4, network 5, worker 1 |
Tracker — docs/tracker/
| Task | Title | Status | Depends on |
|---|---|---|---|
| 1 | The nodera-tracker service binary |
✅ | network 1 |
| 2 | The Java client: announce family + TrackerClient |
✅ | tracker 1, network 5 |
| 3 | Operations hardening | 🚧 | tracker 1 |
| 4 | Service telemetry | ✅ | tracker 1, telemetry 1 |
| 5 | Service directory + scoring plane | ✅ | tracker 1, tracker 2, network 1 |
| 6 | A published image, and a tracker anyone can run | ✅ | tracker 1, tracker 5 |
Rendezvous — docs/rendezvous/
| Task | Title | Status | Depends on |
|---|---|---|---|
| 1 | The nodera-rendezvous service binary |
✅ | network 1 |
| 2 | The Java rendezvous transport | ✅ | rendezvous 1, network 2 |
| 3 | Live cross-internet proof | ⏳ | network 2, minecraft 1 |
| 4 | Service telemetry + NAT-pair statistics | ✅ | rendezvous 1, telemetry 1 |
| 5 | Discoverable, drainable, self-updating | 🚧 | rendezvous 1, rendezvous 2, tracker 5 |
| 6 | A published image, and a relay anyone can run | ✅ | rendezvous 1, rendezvous 5 |
Minecraft — docs/minecraft/
| Task | Title | Status | Depends on |
|---|---|---|---|
| 1 | Mod skeleton, build conventions, run harness | ✅ | — |
| 2 | The live validation lane | 🚧 | minecraft 1; engine 3–7, network 1–10 |
| 3 | Diagnostics HUD + command tree | ✅ | network 11, minecraft 1 |
| 4 | Multiplayer + share GUI | 🚧 | minecraft 1, tracker 2, rendezvous 2, worker 2 |
| 5 | Decentralized host lane | 🚧 | network 3, network 8, rendezvous 2, worker 3 |
| 6 | World identity + permissions (mod half) | 🚧 | worker 2, worker 3, minecraft 1 |
| 7 | Companion presence gate | ✅ | worker 1 |
| 8 | In-game telemetry + consent mirror | ✅ headless | worker 5, network 12, minecraft 7 |
| 9 | Profiling lane — the spark profiler | ✅ | minecraft 1 |
| 10 | A world is shown only when it can be played | 🚧 | minecraft 6, minecraft 7, worker 8 |
| 11 | The mod's GUI, rebuilt on the vanilla layout API | ⬜ | minecraft 10 |
Peer — docs/peer/
| Task | Title | Status | Depends on |
|---|---|---|---|
| 1 | Boot + presence endpoint | ✅ | network 2, network 5 |
| 2 | Control protocol v2 + live telemetry | ✅ | worker 1, network 11, network 3 |
| 3 | Host/join delegation + world seeding | 🚧 | minecraft 5, network 4, tracker 2, rendezvous 2 |
| 4 | Out-of-game committee validation | ✅ headless | engine 5, network 2 |
| 5 | Telemetry emitter + consent record | ✅ | network 12, worker 2, telemetry 1 |
| 6 | World ownership + durable world registry | ✅ | worker 2, worker 3, network 3 |
| 7 | The LAN lane — playing without a mod | ✅ | worker 2, worker 6, tracker 2 |
| 8 | One world, one identity | 🚧 all 11 deliverables closed; open on live rows | worker 3, minecraft 6 |
Frontend — docs/frontend/
The app and mobile categories merged into this one on 2026-08-05. The app tasks kept their
numbers; the mobile tasks shifted by eleven — mobile 1…5 are frontend 12…16. A "mobile 3" in an
older issue or commit message is frontend 14.
| Task | Title | Status | Depends on |
|---|---|---|---|
| 1 | Tauri scaffold + worker supervisor | ✅ | worker 1 |
| 2 | Live metrics dashboard | ✅ | worker 2 |
| 3 | Per-OS packaging + CI | 🚧 | frontend 1 |
| 4 | End-to-end acceptance + cross-machine continuity | ⏳ | worker 3, minecraft 1 |
| 5 | Telemetry consent: first-run modal + Privacy screen | 🚧 | worker 5, frontend 2 |
| 6 | Dashboard API + live worker link | ✅ | frontend 2, worker 2, worker 6 |
| 7 | The client becomes the way in | ✅ | frontend 6, worker 7 |
| 8 | Screen redesign: one subject per screen | ✅ | frontend 6, frontend 7 |
| 9 | Tracker stores | ✅ | frontend 8, tracker 6, network 13 |
| 10 | Practical screens, honest numbers | 🚧 | frontend 8, frontend 9, worker 2 |
| 11 | A launcher, not a dashboard | 🚧 | frontend 9, frontend 10 |
| 12 | The Android build: toolchain, APK, dex floor | ✅ | frontend 1, worker 1 |
| 13 | The interface: Material You, and what a phone may be asked | ✅ | frontend 12, frontend 6 |
| 14 | The phone in the mesh, and how it is proven | ✅ | frontend 12, worker 3, tracker 2 |
| 15 | Settings the app can keep; worker verbs it never asks for | ✅ | frontend 13, frontend 14, frontend 7 |
| 16 | The phone reaches the network it was told to | 🚧 | frontend 14, frontend 9, worker 2 |
| 17 | A launcher, redesigned | 🚧 | frontend 11 |
| 18 | The website | 🚧 | frontend 9 |
| 19 | One codebase, three exports | 🚧 | frontend 17, frontend 18 |
| 20 | Shipping it | 🚧 | frontend 18, frontend 19 |
Testing — docs/testing/
| Task | Title | Status | Depends on |
|---|---|---|---|
| 1 | One tool: shell suites become Java scenarios | ✅ | worker 1, minecraft 5, server 1, network 15 |
Telemetry — docs/telemetry/
Programme plan: plans/Plan.6.md.
| Task | Title | Status | Depends on |
|---|---|---|---|
| 1 | The nodera-telemetry ingest service |
✅ | network 1 |
| 2 | The Big Data plane: bus, warehouse, retention | 🚧 | telemetry 1 |
| 3 | Analysis, dashboards, alerting, transparency report | ⬜ | telemetry 2, worker 5 |
3. Delivery order (dependency-driven waves)
Waves are sequential; items inside a wave are parallelizable.
engine ──► network ──►┬─► tracker ──┐
├─► rendezvous┼─► minecraft ◄── worker ◄── frontend
└─────────────┘
Minecraft delivers the live halves of engine and network; the worker runs network's peer runtime out-of-game; the frontend supervises the worker.
| Wave | Work | Why here |
|---|---|---|
| 0 — now, parallel | minecraft 1 Xvfb runClient harness in CI · tracker 3 ops hardening · frontend 3 packaging + CI |
Each is small, independent, and unblocks a batch of acceptance evidence downstream |
| 1 — the live gate | minecraft 2 live validation lane | The single biggest remaining lane; capture mixins, ServerLevel applier, chunk tickets, live shadow → coordinator → committee → fallback wiring. Almost every ⏳ elsewhere waits on it |
| 2 — GUI-deferred pool | minecraft 3 surface pass · minecraft 4 live feeds + join flow · minecraft 5 re-manifest + live encryption · minecraft 6 world-list mixin + grant enforcement | One GUI environment unlocks all four at once — do them as one batch, not four visits |
| 3 — network completion | network 2 gateway migration end-to-end · rendezvous 3 cross-internet soak · worker 3 seeding/announce delegation · frontend 4 cross-machine continuity | All four need a live/NAT environment; they share the same harness wave 1 produces |
| 3.5 — telemetry emitters ✅ | network 12 · worker 5 · minecraft 8 · tracker 4 · rendezvous 4 landed; frontend 5 all but a component test | Done in one pass, proven end to end by the telemetry scenario (scripts/nodera-test.sh run telemetry). What remains is not code: telemetry 3 needs a population that has opted in before a dashboard can answer anything |
| 4 — parity program | engine 8 → engine 9 → engine 10 → engine 11 → engine 12 | Burns every category's LIMITATIONS.md to empty; engine 12 closes the ledger |
Biggest schedule lever: wave 1 — nine tasks across five categories carry a "live evidence pending" clause the same harness closes.
4. Priority and difficulty
Ordered by importance — how much it unblocks × how directly it proves the central bet × visible value to a player. Difficulty is technical risk × breadth × novelty, and the two orderings are deliberately different: the hardest work is not the most urgent.
| Task | Why it matters | What makes it hard |
|---|---|---|
| minecraft 1 — CI run harness | Hours of work; converts every "proven live once by hand" claim into a repeatable gate | Headless-display Minecraft in CI is fiddly, not deep |
| minecraft 2 — live validation lane | The determinism bet on real servers; the MVP gate's live half; unblocks waves 2–3 | Real-world divergence hunting; every foreign write source must reach one mixin choke point, cheaply |
| engine 8 — entity lane | Headless and durable exits are green; live pickup/mob/pearl evidence makes the lane real | Entity state in roots, ghost lanes, cross-region transfer with no dupes and no loss |
| worker 3 — delegation + seeding | Makes "the world outlives its host" a property of the node, not of a lucky timing window | Splitting "player session" from "node session" with no window where a world is announced but unserved |
| network 2 — gateway migration | Session continuity under churn on direct, punched and relayed paths | Freeze, reconnect, exactly-once resubmit across three transport paths |
| minecraft 4 — multiplayer GUI | The feature players actually see: worlds, health, piece map, join | Live feeds against a GUI environment |
| engine 9 — validated redstone | High player value; palette v4 landed, contraption migration remains | Redstone semantic fidelity plus contraption ownership migration across region borders |
| frontend 3 / 4 — packaging + continuity CI | The app is what every player installs; unpackaged is unshipped | Two machines, an installer, a gate and a timing-sensitive continuity assertion |
| engine 10 — environment lane | Living worlds in delegated regions: grass, fluids, fire, light | Deterministic lighting is notoriously hard; fluid and fire parity envelopes against vanilla |
| engine 11 — deterministic mobs | Retires the ghost lane species by species | Mob AI and spawning inside vanilla's rate envelope; fixed-point pathfinding; no visible behaviour cliff |
| rendezvous 3 — cross-internet numbers | Confirms NAT reach at real-world scale | A soak against real NAT populations |
| engine 12 — trustless closure | Endgame: prediction/rollback, BFT membership, empties the ledger | Several research-grade problems at once: BFT open membership, validated movement with rollback, deterministic worldgen |
| tracker 3 — ops hardening | Needed by community operators, not by correctness | Small |
5. Limitation registers
Every category owns its limitations. A task is only done when its register rows move.
| Category | Register | Open/retiring rows |
|---|---|---|
| Engine | engine/LIMITATIONS.md |
L-1, L-2, L-7, L-12, L-16, L-17, L-50 (L-51 and L-52 both retired 2026-07-28) |
| Network | network/LIMITATIONS.md |
OPEN: L-30, L-33, L-36, L-85 · RETIRING: L-76, L-84, L-87, L-88, L-90, L-91 (L-86 + L-89 retired 2026-07-28, issue #97; L-36's retirement withdrawn 2026-08-06 — the scorer it rested on was never reachable from production) |
| Tracker | tracker/LIMITATIONS.md |
L-81 (RETIRING — release signing key outstanding, a credential step not code) |
| Rendezvous | rendezvous/LIMITATIONS.md |
L-83 (OPEN — drain-resume proof missing; mechanism believed complete) |
| Minecraft | minecraft/LIMITATIONS.md |
L-43, L-46, L-49, L-50, L-80 · MC-JOIN-1…6 · MC-GUI-1…5 |
| Worker | peer/LIMITATIONS.md |
RETIRING: W-FETCH-1, W-REPL-1, W-DUP-3 · OPEN: W-DUP-1, W-DUP-2, W-DUP-4 |
| Frontend | frontend/LIMITATIONS.md |
OPEN: L-47, L-56, L-91, L-92, L-93, L-95, L-96, M-1, M-3, M-4 · RETIRING: L-94, M-NET-2 · envelope: A-9 |
| Telemetry | telemetry/LIMITATIONS.md |
L-73, L-74, L-75 (L-72 retired → LIMITATIONS.fixed.md) |
Envelope constraints — immovable facts of physics or platform, engineered around until players cannot observe them — are listed once, in each owning register's §A. They never burn down; they are satisfied when their hiding mechanism ships.
6. Cross-cutting notes
- Standing harness. The Nodera debugger (headless integration scenarios over
LoopbackTransportand real TCP) is not a task; every category adds scenarios to it. Its scope lives in its GitHub issue and in../AGENTS.md. - Three-lane staffing. Lane A (Minecraft-facing): minecraft 1 → 2 → 4/5/6. Lane B (pure Java): engine 8 → 9 → 10 → 11 → 12. Lane C (Rust services + worker + app): tracker 3, rendezvous 3, worker 3, frontend 3/4. Lanes A and C join at wave 3; lane B joins when the live lane can host it.
- Issue lookup. Category task numbers are not GitHub issue numbers, and never were. Find an issue by title. Each task file names the issue it belongs to where one exists.
- Prior art. The regionised-ticking and ownership-takeover designs draw on Folia and MultiPaper
(
minecraft/folia/,minecraft/MultiPaper/). Neither project validates anything — committee re-execution plus quorum certificates is the layer that is Nodera's own. - Programme plans. Multi-task programmes live in
plans/, referenced from the task files they produced.