GraphoOS

Roadmap

Where GraphoOS
is going.

37 of 123 tasks done. Sizes: S ≈ ½ week, M ≈ 2, L ≈ 5, XL ≈ 12 person-weeks. This document is generated from the project plan and versioned in the repository (docs/ROADMAP.md); release notes for each version are in CHANGELOG.md.

Phase 0 · Unblock the build 9/14

Anyone should be able to clone and build. Without this, nothing can be verified.

  • 0.1 S Own dependencies: create the repos graphoos-floem, graphoos-lsp-types, graphoos-psp-types, graphoos-structdesc, graphoos-vger-rs, graphoos-wasi-experimental-http, graphoos-locale-config and graphoos-winit on github.com/Empoorio, with no third-party history, and point Cargo.toml at them.

    All 8 repos exist and Cargo.toml references them on their main branch.

  • 0.2 S Publish graphoos-xi-rope as its own repo (main = 0.3.2 for the editor, v0.4 branch for Floem 0.2) and use it as a git dependency.

    cargo fetch --locked exits with 0.

  • 0.3 S Regenerate Cargo.lock changing only the moved dependencies (14 packages), without bumping any other versions.

    Lockfile diff reviewed; 0 missing sources.

  • 0.4 S Build on this Mac: cargo build --profile release-lto, launch, open a real workspace with highlighting and the Rust plugin active. Done Sep 21: GraphoOS.app launches, highlights Rust and starts rust-analyzer. Note: without an Apple signature, macOS does not allow reading files in Desktop/Documents (TCC) — the editor shows them as empty; tested outside those folders.

    Screenshot of the editor open on a project from this ecosystem.

  • 0.5 M Build on Linux (docker buildx bake ubuntu-noble) and Windows (VM or runner).

    Binaries for all 3 OSes launch.

  • 0.6 S Move .github/, .cargo/, .devcontainer/, .rustfmt.toml, .taplo.toml into GraphoOS-master/ and commit them.

    git ls-files | grep .github > 0.

  • 0.7 M Turn on CI in Empoorio/graphoos: fmt, typos, clippy on 3 OSes, build on 3 OSes, doc-tests.

    Green badge in the README pointing at the real repo.

  • 0.8 S Replace the 14 occurrences of empoorio/graphoosgraphoos with Empoorio/graphoos (README, CHANGELOG, metainfo, fedora Dockerfile, proxy.sh/ps1, about.rs, remote.rs).

    grep -r graphoosgraphoos = 0.

  • 0.9 S Test the docs/building-from-source.md guide in a clean rust:1.98 container, following only the text.

    Container log with a successful build attached to the repo.

  • 0.10 S rust-toolchain.toml (stable + rustfmt + clippy) added; rust-version = 1.98.0. Pending: check the real minimum version that builds.

    CI fails if it drops below the declared MSRV.

  • 0.11 S Clean up the project folder: delete _retirar/ (third-party products) once the owner confirms, and write a README explaining forks/, floem-main (Floem 0.2 for the future UI), floem-shadcn/tailwind and Website/.

    du -sh projects/GraphoOS < 100 MB and a README at the root.

  • 0.12 S Commit and push the renamed editor to Empoorio/graphoos (27 files changed: dependencies, identity, CI inside the repo) and a CI token with access to the private repos.

    CI on GitHub runs fmt, clippy and build on 3 OSes.

  • 0.13 S GitHub Actions on the Empoorio account: every run ends in startup_failure after 0 s in the private repos (empooScan too since Sep 16). Review the account's billing and Actions settings; until then GraphoOS CI cannot run.

    gh run list shows a CI run that actually executes jobs.

  • 0.14 S Build from a clean container (rust:1.98-bookworm, using only the guide's instructions): tested on Sep 21 with cargo check; the guide needs the credentials step while the repos are private.

    Container log with a successful build.

Phase 1 · Identity and legal 6/11

GraphoOS must be GraphoOS in every file, every package and every domain.

  • 1.1 S Legal review of the inherited code's license (Apache-2.0) by Empoorio's counsel: which notices must ship in the packages (dmg, msi, deb, rpm) before the first public release.

    Written opinion, and license files included in every installer.

  • 1.2 S Authorship: authors in Cargo.toml, developer_name in metainfo, Manufacturer in wix, CFBundleIdentifier → org.empoorio.graphoos, notarization bundle id in release.yml.

    No file in the repo names an author outside Empoorio.

  • 1.3 S Own channels: README, CONTRIBUTING, issue templates and the About dialog link to GitHub Discussions and empoorio.org; enable Discussions on the repo and, if wanted, an Empoorio Discord.

    No links to third-party communities; Discussions enabled.

  • 1.4 S docs/why-graphoos.md: explain why GraphoOS exists within the Empoorio ecosystem (native, lag-free remote, TOML, WASI plugins, transparent assistance).

    New document reviewed by the owner.

  • 1.5 S CHANGELOG and metainfo: a single 0.4.6 entry, "first GraphoOS release", and an Unreleased section for 0.5.0.

    First own entry, dated.

  • 1.6 M Own macOS signing: Empoorio Developer ID certificate, replace CODESIGN_IDENTITY in the Makefile, notarization with our own secrets in release.yml.

    spctl --assess accepts the .app; Gatekeeper shows no warning.

  • 1.7 S Domains: register graphoos.dev, docs., plugins., or move everything under graphoos.empoorio.org; update the 6 places in the code that use them.

    All three hosts resolve and serve TLS.

  • 1.8 S Website (done Sep 21, deployed at graphoos.web.app): empoorio.org fixed, "AiloOS" in the footer, Agents and Models marked "in development", and models.html names EmpoorioLM (local) and AndromedaLM (cloud).

    No unbacked promises; links verified.

  • 1.9 S Check for a trademark conflict: "GraphOS" is an Apollo GraphQL product. Settle on the single spelling "GraphoOS" everywhere.

    Trademark search in EUIPO/USPTO documented.

  • 1.10 S Contribution policy: DCO (section in CONTRIBUTING, commits with -s), CODE_OF_CONDUCT.md and SECURITY.md with control@empoorio.org. Done Sep 22: a dco job in ci.yml requires Signed-off-by on every commit in a PR (it will run once Actions works, 0.13).

    Files at the root and a DCO check in CI.

  • 1.11 S Make the 13 GraphoOS repos public (private today) when the owner decides, and then remove git-fetch-with-cli and the token from CI.

    Anonymous git clone + cargo build work.

Phase 2 · Services the editor expects at runtime 3/7

The binary starts but calls URLs that do not exist. Without this it is an editor with no colors, no plugins and no remote.

  • 2.1 M Tree-sitter grammars: run the release workflow of graphoos-tree-sitter-grammars (already created and referenced from app/grammars.rs) so the grammars-<os>-<arch> and queries assets exist; with a private repo the editor needs a token to download them.

    Open a .rs, .ts, .py and .md file and see highlighting on all 3 platforms.

  • 2.7 M Assets for Linux and Windows (grammars, proxy, installers) from the release workflows once Actions works; today only macOS arm64 is built, on this Mac.

    Releases with assets for all 3 platforms.

  • 2.2 L Plugin registry. v0 done on Sep 21: a static registry generated by Website/registry/build.py from registry/plugins.toml and served at graphoos.web.app/api/v1 (list, latest, icon, readme, download → tarball in /dl); base URL configurable in graphoos_core::registry. Still missing: the plugins.graphoos.dev domain, real search, statistics, a publishing CLI and package signing.

    Install a plugin from the panel and have it start its LSP (download and install verified by a live test).

  • 2.3 M Remote proxy: publish graphoos-proxy per architecture (static linux x86_64/aarch64 with Alpine, macOS, Windows) in every release and fix proxy/remote.rs:350.

    Connect over SSH to the Ailoos VPS and edit a remote file.

  • 2.4 M Updater: point update.rs at Empoorio/graphoos and test the full cycle (detect, download, replace, restart) on macOS and Windows.

    Update from one nightly to the next with no intervention.

  • 2.5 L Own language plugins (done Sep 21): 9 in the registry — Rust (rust-analyzer), TOML (taplo, downloaded), Markdown (marksman, downloaded), Go (system gopls, Sep 22) and C/C++ (clangd downloaded from its releases, Sep 22) verified in the editor with their servers answering initialize; Python (pyright), TypeScript/JS, YAML and JSON use the server installed on the system and explain how to install it if it is missing (the notice was verified).

    9 plugins installable from the registry with a working LSP.

  • 2.6 M Crash reports: the panic hook writes logs/crash-<ts>.txt (version, OS, thread, location, backtrace) and on the next launch the editor shows the path and a link to attach it to an issue; nothing leaves the machine on its own (crash_report.rs, Sep 21).

    A deliberate panic produces a readable report and the notice appears on reopening.

Phase 3 · Real distribution 1/8

Signed installers for macOS, Linux and Windows, automatic nightlies and install channels.

  • 3.1 L Complete release.yml: signed and notarized universal macOS build, MSI signed with signtool (it does not sign today), .deb/.rpm/AppImage, tarballs. Today: a manual nightly pre-release with a macOS arm64 DMG (ad hoc signature) + proxy.

    Release v0.5.0-beta.1 with 10+ downloadable artifacts.

  • 3.2 S Automatic nightly (the cron already exists) published as a pre-release and linked from download.html. Partial, Sep 22: the nightly pre-release exists and download.html links to it with the date; automatic publishing waits for Actions to work (0.13).

    Yesterday's build available for download every morning.

  • 3.3 M Package managers: Homebrew cask, winget, Scoop, Flathub (dev.graphoos → org.empoorio), AUR, copr.

    brew install --cask graphoos and winget install Empoorio.GraphoOS work.

  • 3.4 S Platform installers signed and published from the release channel.

    Stable per-platform download on the downloads page.

  • 3.5 M Clean-machine install per OS (macOS VM, Ubuntu, Windows 11) following only the website; open a real project and debug.

    3-OS checklist with screenshots for each release.

  • 3.6 S Windows portable build (graphoos-app/portable feature) published as a zip.

    Runs from a USB stick without writing to %APPDATA%.

  • 3.7 M Reproducible builds: tarball with cargo vendor (already supported) and a documented offline build.

    Two builds of the same tag produce the same result.

  • 3.8 S Downloads page on the website with OS detection, version and date. Done Sep 22: registry/build_releases.py generates api/v1/releases.json (version, channel, commit, date and size) and binaries are served from GitHub Releases (Firebase Spark forbids executables and the repo is private); download.html detects the OS, highlights its card, shows version and date and no longer promises Linux/Windows builds that do not exist (it links to building instead). Verified in Safari.

    download.html links to real assets, not to #build.

Phase 4 · Stability and measurement 5/12

Today: 40 tests, 347 unwraps, 0 published benchmarks. Competing takes numbers.

  • 4.1 L Unit suite for the buffer, selection, syntax, keymaps, palette and RPC (target > 300 tests), plus app↔proxy integration tests.

    cargo test --workspace in CI, coverage published.

  • 4.2 M UI tests with floem-test for the palette, tabs, splits and settings.

    20+ automated UI scenarios.

  • 4.3 M Audit the 347 .unwrap() calls on UI/proxy paths and the 14 unsafe blocks; turn them into recoverable errors.

    Clippy with unwrap_used as a warning; every unsafe with a SAFETY comment.

  • 4.4 S Triage the 128 TODO/FIXMEs: listed in issue #1 of Empoorio/graphoos with checkboxes; each one is closed by a commit or becomes its own issue.

    0 TODOs without an associated issue.

  • 4.5 M Large files: open 100 MB / 1 M lines / a 20 MB single-line JSON without blocking the UI; turn off syntax above a threshold.

    Keystroke latency < 16 ms measured on those files.

  • 4.6 M Large sessions: 200 tabs, 10 splits, 3 terminals, a 50 k-file project; measure memory and leaks over 8 h.

    RSS table per scenario in docs/benchmarks.

  • 4.7 M Recovery: hot exit (unsaved buffers survive closing), restore the window after a crash, backups. Done Sep 22: the session (tabs, window and each editor's unsaved text) was already saved on close; now it is also written 2 s after the last edit (one save per burst). Verified: type, kill -9 after 4 s, reopen → the buffer comes back unsaved with its text and the file on disk untouched. Backups as separate files (local history) come with 5.11.

    Kill the process with unsaved changes and recover them on opening.

  • 4.8 L Benchmarks published and compared on the same machine against VS Code, Zed and Cursor: cold/warm start, idle RAM, indexing, global search, keystroke latency, scroll fps, battery over 1 h.

    docs/benchmarks.md with a reproducible method and script.

  • 4.9 M cargo-deny (licenses and bans, green) and cargo-audit in CI (audit job, Sep 21); fuzzing of the RPC parser (graphoos-rpc/parse.rs) and the WASI loader still pending.

    Jobs in CI; fuzzers in fuzz/.

  • 4.11 M wasmtime 14 → 49 done on Sep 21 (own WASI pipes in wasi_pipe.rs, no wasi-common, no regalloc2 patch; Rust plugin verified in the editor). cargo audit: 29 → 3 (h2 0.3 via reqwest 0.11; quick-xml in wayland-scanner, build only). Remaining: reqwest 0.12 and making the advisories step blocking.

    cargo audit --deny warnings green and blocking in CI.

  • 4.12 M LSP/DAP client robustness against faulty or hostile servers: message size limits, per-request timeouts, fuzzing of the client's JSON-RPC parser; a crashed server is restarted with a notice and does not take the editor down.

    A server that sends garbage or hangs neither blocks nor closes GraphoOS.

  • 4.10 S Clippy with no warnings (173 lints fixed on Sep 21, 0 remaining on macOS) and typos green on 3 OSes.

    CI stably green for 2 weeks.

Phase 5 · Editing experience 3/23

Close the gap with VS Code in what people use every day. What exists gets polished; what does not gets built.

  • 5.1 S Multi-cursor: Alt+click, select next/all occurrences, skip occurrence, cursors above/below/at line end and selection undo already exist (keymaps-macos/nonmacos). Missing: column selection by dragging and a test suite that pins down the behavior.

    Suite of 30 multi-cursor cases green.

  • 5.2 M User snippets: one file per language (TOML), nested placeholders, transformations, variables ($TM_FILENAME…), a management UI.

    A custom Rust snippet works, tabbing across 3 placeholders.

  • 5.3 M Rename with multi-file preview and global undo; refactors: extract, inline, organize imports, apply all fixes.

    Rename a symbol used in 20 files and revert it in one go.

  • 5.4 S Global search: replace across all files done on Sep 21 (GlobalReplace RPC, field + button + summary, skips open files with unsaved changes; tested in the app). It already honored .gitignore and regex. Missing: per-match preview, include/exclude by pattern, history.

    Bulk replace in a 50 k-file project < 1 s.

  • 5.5 S Formatting (done Sep 21): [editor.formatters] maps an LSP language id to a command (document on stdin, formatted output on stdout, {file}); it replaces the LSP for Format Document and format-on-save; formatter errors go to the messages panel without losing the save. Tested in the app with rustfmt and with a failing command.

    Saving a .rs formats it with rustfmt; a broken formatter warns and still saves.

  • 5.6 L Minimap (0 refs), real breadcrumbs (6 refs), indent guides, rulers, word wrap, configurable bracket colors.

    Each one toggleable in settings, with a screenshot.

  • 5.7 M Web support: Emmet (0 refs), HTML/CSS/JSX with tag closing, inline colors, preview.

    ul>li*3 expands in a .html file.

  • 5.8 L Full debugger on top of DAP: conditional breakpoints and logpoints, watch, stack, editable variables, console, launch configs per language; tested with codelldb (Rust), debugpy (Python) and Node. Progress Sep 22: until today NO plugin registered an adapter (debugging was impossible) and two inherited bugs blocked it anyway: the breakpoint layer sat below the line-number layer (no click got through; fixed with pointer-events) and ${workspace} reached the adapter unexpanded. Now the SDK exposes register_debugger_type, the Rust and C/C++ plugins register lldb → codelldb or lldb-dap (absolute path), and a session reaches initialize → launch → runInTerminal with a pid; on this Mac it stops at the system's "Developer Tools Access" authorization (the owner has to grant it once). Missing: python (debugpy), Node, conditionals, watch, variable editing.

    Debug EmpooScan (Rust) and a Python script with conditional breakpoints.

  • 5.9 L Full visual Git. Done Sep 21: inline blame for the cursor line (author, age, summary, commit; "Not committed yet"; hidden while there are unsaved changes; refreshed on save and when the repo changes; editor.enable-git-blame), tested in the app. Missing: file history, commit log with graph, branches/stash in a panel, pull/push with credentials, PRs.

    Full branch → commit → push → PR flow without leaving the editor.

  • 5.10 M 3-way merge conflict editor (0 refs today).

    Resolve a real conflict from this ecosystem by accepting both sides.

  • 5.11 M Local history / on-disk timeline per file, with diff and restore.

    Recover a 2-hour-old version of an unversioned file.

  • 5.12 M Terminal: profiles with a UI, splits, clickable links, search, shell integration (command markers, cwd), reuse for tasks.

    Ctrl+click on an error path opens the file at that line.

  • 5.13 M Tasks: detect cargo/npm/make/gradle, problem matchers feeding the problems panel, shortcuts for build/test/run.

    A cargo build error shows up in Problems with a link.

  • 5.14 M Diff: side by side and inline with hunk navigation, folder diff, diff against any commit.

    Navigable diff of two EmpoorioChain branches.

  • 5.15 M Explorer: multi-root workspace, drag and drop, git and problem decorations, compare selected, open with.

    Open 3 projects from the ecosystem in one window.

  • 5.16 M Settings: search, TOML editing synced with the UI, workspace settings (.graphoos/settings.toml), import from VS Code.

    Change the theme from the settings search in < 3 keystrokes.

  • 5.17 L Modal: Vim coverage (text objects, macros, registers, marks) and optional Helix/Emacs modes.

    Partial vim-test suite (200 cases) green.

  • 5.18 S Side Markdown preview (markdown.rs already renders hovers) and image/SVG preview. Done Sep 22: a "Markdown Preview" panel (⌘⇧V) using our own engine (headings, emphasis, highlighted code, bulleted/numbered lists — added to the engine — separators, quotes, local images), live updating verified in the app. Missing: opening image/SVG files in a tab.

    Live preview of a README with images.

  • 5.19 S Readable notifications and error messages: audit every anyhow! that reaches the user.

    No error shows a Rust Debug dump to the user.

  • 5.20 L Dev Containers: read devcontainer.json, build the image with Docker/Podman and run graphoos-proxy, LSP, DAP and the terminal inside the container while the UI stays native (the UI/proxy architecture is already designed for this).

    Open a repo with devcontainer.json and build/debug inside the container without installing anything on the host.

  • 5.21 L Tunnels: connect the editor to a remote proxy behind NAT through an Empoorio relay, in addition to SSH/WSL.

    Edit on a VPS without opening ports or configuring SSH.

  • 5.22 S Verified advanced highlighting: language injections (SQL in Python, HTML/CSS in JSX, code blocks in Markdown; there are 90 references to injection in the core) and LSP semantic tokens on top of tree-sitter. Done Sep 22: a Rust block in .md verified in the app; SQL in Python added as our own query (overrides/queries/python/injections.scm in graphoos-tree-sitter-grammars: execute/read_sql and strings starting with SELECT/INSERT/…; packaged with package_queries.sh and uploaded to the release) and verified in the app and with a test in graphoos-core; fixed a core bug: after an injection, the rest of the outer node lost its color. Semantic tokens already arrive from the LSP (rust-analyzer). JSX not checked. Note: while the grammars repo is private, the editor cannot download queries (1.11).

    A .md with a Rust block and a .py with embedded SQL are highlighted by their inner language.

  • 5.23 M Debugger: logpoints, hit-count breakpoints, a REPL evaluation console and variable editing (the DAP types already declare supports_conditional_breakpoints).

    A logpoint prints without stopping and the console evaluates an expression in the current frame.

Phase 6 · Extension system 1/10

WASI is a good foundation, but without a documented API, versioning or a catalog there is no ecosystem.

  • 6.1 M Document the plugin API (psp-types, wasi-experimental-http, plugin.toml): a "your first plugin in 30 minutes" guide in Rust and AssemblyScript. Done Sep 22 (Rust): docs/plugins.md (manifest, SDK, downloads, local testing, publishing to the registry), tested to the letter: its three files extracted from the page compile to wasm and the plugin activates in the app with the documented notice; published at graphoos.web.app/docs/plugins. AssemblyScript: there is no SDK; noted in the guide.

    An outside developer publishes a plugin following only the guide.

  • 6.2 M API versioning with compatibility declared in plugin.toml, and conformance tests.

    A v1 plugin still loads in v1.3 of the editor.

  • 6.3 L Own registry with a website: catalog, search, icons, README, statistics, a graphoos plugin publish CLI, package signing, moderation.

    Publish and update a plugin from the CLI in < 2 min.

  • 6.4 L Language plugins maintained by Empoorio (top 10) with their own CI and automatic download of LSP servers.

    Install Python and get pyright with no manual steps.

  • 6.5 M Importer for VS Code color and icon themes (JSON) and a theme catalog.

    Install "One Dark Pro" from its original JSON.

  • 6.6 XL Explicit decision: a compatibility layer for VS Code extensions (Node host + API). It is XL and defines the product: Cursor/Antigravity/Windsurf have it because they are VS Code forks; Zed does not.

    Yes/no decision document with scope; if yes, a prototype that loads one theme extension and one language extension.

  • 6.7 L Extensions with UI: native declarative views (panels, trees, scoped webviews).

    A plugin shows its own side panel.

  • 6.8 M Tree-sitter grammars and queries installable as extensions without recompiling the editor.

    Add a new language without touching graphoos-core.

  • 6.9 M Per-plugin permissions (capability model): each plugin declares in volt.toml what it needs (directories, network, processes) and the user approves it on install; WASI already sandboxes by default, but today the proxy opens the plugin directory and full HTTP network access.

    A plugin without network permission cannot download anything; the panel shows the granted permissions.

  • 6.10 M Plugin watchdog: a hung or looping plugin does not block the editor (per-call timeout, plugin restart, user notice, without losing the other plugins' LSP).

    A plugin with loop {} is detected and restarted, and the editor keeps responding.

Phase 7 · AI: Models, Agents and MCP 7/26

Chat done (Sep 21). The models are AiloOS models: EmpoorioLM locally and AndromedaLM in the cloud. Agents are integrated from Ailoos's existing andromeda CLI; GraphoOS provides the interface and the harness.

  • 7.1 M Architecture (done Sep 21): an ai module in graphoos-rpc (types) and graphoos-proxy (OpenAI-compatible SSE client with cancellation), AiChat/AiChatCancel/AiListModels RPCs and streaming notifications; since it lives in the proxy it also works remotely. The key goes in [ai] or in AILOOS_API_KEY; storing it in the OS keychain remains.

    Chat works in an SSH session; key in the keychain.

  • 7.2 L AiloOS providers (done Sep 21): AndromedaLM and the api.ailoos.com catalog with streaming, and local EmpoorioLM via ailoos serve (configurable endpoint = "custom endpoint"). Tested in the app: real model list, streaming response, readable error with the local server off. Missing: retries and quotas (they come with 7.11).

    AndromedaLM and EmpoorioLM answer in the chat; no third-party providers by default.

  • 7.3 M Model picker: the chat picker is done (AiloOS/local provider + model from the real catalog, reload). Done Sep 22: real dropdown menus for provider and model (our own overlay; the Floem Dropdown closes on press before the click), and model per task: ghost text has its own provider/model (ai.inline-completion-provider/-model) and the agent uses the chat model. Verified in the app (proxy log with the chosen model).

    Changing the model in the picker changes the answer and the provider.

  • 7.4 L Contextual side chat (done Sep 21): streaming conversation, Stop, clear, current file and selection as context, Cmd/Ctrl+Shift+A, @file:path, @diagnostics, @terminal, @git mentions with a list of what was attached, per-workspace history that survives restarts. Verified in the app and in the proxy log (message composition).

    Ask about an error from the problems panel and get an applicable fix.

  • 7.26 M Chat: @symbol (definition via LSP), images in the message, mention autocompletion when typing @, and a real model dropdown.

    Typing @ shows files and symbols; a pasted screenshot reaches the model.

  • 7.5 M Ghost text: connect inline_completion.rs to a FIM provider (EmpoorioLM first), with debounce, cache and partial acceptance. Done Sep 22: if the LSP proposes nothing, after ai.inline-completion-delay-ms the proxy asks /completions for the continuation (EmpoorioLM via ailoos serve, native) or, where that does not exist (AiloOS cloud), the chat with a completion-engine instruction; per-position cache, trimming of fences/markers/end tokens, discarding of stale responses by generation and revision, Tab accepts; provider/model/tokens/context configurable; verified in the app with both providers (text quality is that of the current models). Partial acceptance done Sep 22 (alt+→ word, alt+⇧+→ line on macOS; ctrl elsewhere), the rest stays proposed. Local latency: that of the model (EmpoorioLM 40M on CPU/MPS answers in ~1 s; p50 < 300 ms requires a small model served with llama.cpp).

    p50 latency < 300 ms locally; accept word by word with Tab.

  • 7.6 L Multi-file editing with a reviewable diff: accept/reject per hunk, apply in bulk, full undo.

    A change across 8 files is reviewed and applied hunk by hunk.

  • 7.7 XL Agents: integrate the andromeda agent from the Ailoos CLI (file/shell/git/search tools, Landlock/Seatbelt sandbox, subagents, confirmations) into the editor via an ACP-style protocol. Done Sep 22 (foundation): andromeda --acp (JSON over stdin/stdout: hello/token/actions/confirm/tool_result/done) launched by the proxy in the workspace, Agent mode in the panel with a streaming response, a card per action with a diff and Apply / Apply and continue / Reject, the decision sent back to the agent, Stop that kills the process and closes the cards, history with the decision; verified with real andromeda and with a test ACP agent (create a file: applying creates it, rejecting does not). Missing: per-hunk diffs, per-tool permissions (read/write/execute/network), an auditable log, the Landlock/Seatbelt sandbox, subagents; and the 1B model does not follow the tool syntax (a model-quality issue).

    The agent refactors a module, runs the tests and asks for permission before every command, all from the panel.

  • 7.8 L MCP client: stdio and HTTP servers, per-user and per-workspace configuration, per-tool permissions, resource listing.

    Connect a GitHub MCP server and use it from the chat.

  • 7.9 L Semantic workspace index (local embeddings) for automatic context; incremental with notify.

    A question about "where the extrinsic is signed" returns the right file without @.

  • 7.10 S Project rules (AGENTS.md / .graphoos/rules) and per-workspace memory. Done Sep 22: AGENTS.md, .graphoos/rules.md and .graphoos/rules/*.md travel as a system message (capped by ai.rules-chars) and as files to the agent; .graphoos/memory.md is fed with /remember in the chat; verified in the proxy log and with the test agent (the 1B model does not always obey the rule: model quality).

    The agent respects a style rule written in AGENTS.md.

  • 7.11 S Visible cost and usage per session; configurable limits; offline mode. Done Sep 22: a usage line in the panel (last turn, the session's requests and tokens per provider, cost at the ai.ailoos-usd-per-million-* prices, % of the limit; click to reset), ai.session-token-limit blocks with a notice, ai.offline starts locally and refuses the cloud (chat and agent); the proxy reads llama.cpp timings because api.ailoos.com does not send usage when streaming. Verified in the app.

    Usage panel with tokens and cost per provider.

  • 7.12 L External agents (Claude Code, Codex CLI) over the same ACP protocol as andromeda, with streaming diffs into the editor.

    Claude Code opens and edits in GraphoOS with reviewable diffs.

  • 7.13 L Harness — validation gates: after each agent edit, the project's formatter, linter and tests run; if they fail, the error goes back to the agent in a repair loop with an iteration limit and a stop.

    A change that breaks a test fixes itself in ≤3 rounds or stops with a report.

  • 7.14 M Skills: reusable procedures in Markdown (e.g. "pallet tests", "schema migration") that the agent loads depending on the task, in addition to AGENTS.md and the project rules.

    Invoking a skill changes the agent's behavior in a verifiable way.

  • 7.15 L Parallel subagents with user-chosen isolation: inherit the workspace, their own branch in a git worktree, or shared; each with a clean context and a summarized result for the parent.

    Three subagents touch three modules in worktrees and the parent integrates them.

  • 7.16 M Evidence artifacts: the agent delivers a Markdown plan, a checklist with progress and proof (test output, screenshots) before the user merges anything.

    Every agent task ends with its evidence artifact in the panel.

  • 7.17 L Browser agent with Aephoron (Kinetoor engine, native to the ecosystem): end-to-end tests of the UI under development, with screenshots and recordings attached as evidence.

    The agent opens the local app in Aephoron, clicks, and attaches the screenshot.

  • 7.18 M Spec-driven flow: the agent reads and critiques the spec (invariants, acceptance criteria) before touching code; a spec template in the repo.

    Given an incomplete spec, the agent asks instead of improvising.

  • 7.19 M GraphoOS as an MCP server: expose the workspace, symbols, diagnostics, diffs and terminal to external agents with per-resource permissions.

    An external agent lists the symbols of the open file via MCP.

  • 7.20 M Defenses against prompt injection and tool poisoning: third-party content (issues, web pages, MCP output) marked as data, a list of destructive commands requiring confirmation, no secrets in the context, an auditable log of every action.

    An issue with hidden instructions cannot get the agent to execute anything.

  • 7.21 L Delegated cloud tasks: run the agent in a remote sandbox (graphoos-proxy in a container on an Empoorio VPS) and return a reviewable PR, without touching the local machine.

    Delegate a task, close the laptop and find the PR.

  • 7.22 M Structural tools for the agent: list_symbols, find_definition, references and diagnostics via LSP/tree-sitter instead of grep, with exact coordinates.

    The agent locates a function by its symbol, not by text.

  • 7.23 L Scheduled tasks and background agents with a management panel (status, cost, results).

    An overnight task leaves its evidence artifact by morning.

  • 7.24 M Reviewer agent: an independent second pass that audits the diff (bugs, security, style) before proposing it to the user.

    Every diff arrives with the reviewer's report.

  • 7.25 M A graphoos CLI for terminal and SSH reusing andromeda, and an SDK to embed the agent in other Empoorio apps.

    graphoos agent "…" works on the VPS over SSH.

Phase 8 · Accessibility, quality and localization 1/6

What separates a hobby project from a tool anyone can use.

  • 8.1 XL AccessKit in Floem (2 refs today): an accessibility tree for the explorer, editor, palette and settings; tested with VoiceOver, NVDA and Orca.

    Walk through the palette and editor with VoiceOver announcing the content.

  • 8.2 M Full keyboard navigation, visible focus, WCAG AA contrast in the default themes.

    Audit against a WCAG 2.1 AA checklist with no critical failures.

  • 8.3 S HiDPI scaling and fonts: measure on Windows 125/150 %, macOS Retina, fractional Linux (0.4.5/0.4.6 already fixed bugs here).

    No misalignment across 6 documented combinations.

  • 8.4 L Localization: an i18n system (8 refs to locale today), complete ES and EN, language contributions per file.

    Changing the language in settings translates the whole UI without restarting.

  • 8.5 L Our own user documentation at graphoos.dev/docs (today just one page on the website): installing, shortcuts, settings, plugins, remote, debugging, AI. Done Sep 22 at graphoos.web.app/docs/: installing (honest: macOS nightly, source for the rest), building, shortcuts and settings GENERATED from the sources (scripts/gen_docs.py: 89 settings with description and default value, 278 shortcuts), assistant/agent/ghost text, plugins, remote, running and debugging; Website/build_docs.py renders the repo's .md files with the same site header. Pending: a Spanish version (the website is in Spanish and the guides in English; comes with 8.4) and the domain (1.7).

    Docs site with search and a version per release.

  • 8.6 M Onboarding: welcome screen, import VS Code settings and keymaps, choose modal or not, choose an AI provider.

    A new user is productive in < 5 min without reading the docs.

Phase 9 · Public beta and community 1/6

Gather real feedback and decide the relationship with upstream.

  • 9.1 M Beta program with a feedback form inside the editor and a dedicated channel.

    100 active users with recorded feedback.

  • 9.2 S Weekly issue triage (templates already exist) and public priority labels.

    Time to first response < 72 h for 8 weeks.

  • 9.3 S Public roadmap (this document, versioned in the repo) and release notes for every release. Done Sep 22: export_roadmap.py generates docs/ROADMAP.md and Website/roadmap.html from the same plan (live at graphoos.web.app/roadmap, linked from Community and the footer); CHANGELOG.md with the Unreleased section covering everything done.

    docs/ROADMAP.md linked from the website.

  • 9.4 M Opt-in adoption metrics (installs, OS, version) with no personal data.

    Internal dashboard with weekly figures.

  • 9.5 M Update policy for the forked dependencies (Floem, xi-rope, vger, winit, lsp-types): a schedule for bringing in improvements from their origin projects without reintroducing third-party names (renaming script already tested).

    Decision document and first update cycle.

  • 9.6 M Integrations with the Empoorio ecosystem only where they add value: Ennooia (notes), Ailoos (models), EmpoorioChain (plugin signatures with DID).

    Each integration with a written use case before coding.