# Status and roadmap

> What works today, what is missing, and where the name came from.

Carte is **pre-release**: version 0.1.0, not on crates.io, with no stability promise. The routing half already has several applications built on it. The state half is newer, and the API of both still changes.

## The name

Carte was developed under the working name `structure`; the crate is now `carte`. It was extracted from [Masque](https://www.masquelang.dev), a Rust UI language, where it was the routing and scoped-state layer. Pulling it out meant cutting every edge to the UI side, which is why it now depends on nothing.

The working name was never meant to ship. The crate is not published yet, and its manifest says so.

- The public name is **Carte**. TODO: confirm, along with the crate name and domain.
- The name `carte` on crates.io is currently held by an unrelated project. TODO: the published crate name.
- Until then, depend on it by Git or path. See [Installation](/docs/installation).

Masque does not depend on Carte, and Carte does not depend on Masque. A future binding crate may join them for apps that want both.

## Works today

- Route tables: roots, multi-parent edges, occlusion, guards, tiers and areas, with startup validation.
- The router: the derived walk, lifecycle, Escape offered deepest first, popping, departure, and the two occlusion lists.
- Guards, evaluated in the walk and ahead of time with `Router::ask`.
- The store: process and node scopes, mounting driven by the walk, typed reads, version stamps and per-field subscriptions.
- Producers with claimed fields, equality-checked sets, declared grain, and a single commit per tick.
- Schema reflection, structural comparison, and the printed schema form.
- Intent vocabularies, typed decoding of named raises, and the outbox.
- Validation in two grades.
- The `notes` example and its windowless tests.

## In progress

- Moving the `Schema` and `Intents` derive macros into the crate. Today they live in a separate, unpublished crate, so every schema and vocabulary in these docs is written by hand.
- Settling the `Node` trait. It is scaffolding cut at the seam where Masque's routing layer named UI types, and methods such as `occludes` and `take_leave_request` are expected to move or retire.
- A first release on crates.io, under the final name.

## Not yet

- **Keyed collections.** A `Vec` is one field today, so changing one row wakes everyone watching the list. Keyed collections are the planned fix.
- **Optional fields in Rust.** A field can be declared absent with `absent_when`, but there is no `Schema` impl for `Option<T>`. TODO: decide the representation.
- **Producer ordering.** Producers run in the order you call them. There is no declared dependency between derived producers.
- **A validation harness.** Validation takes lists of fields and raises. Nothing yet extracts those from egui views, Masque documents or anything else.
- **Thread safety.** The store and the router are not `Send`. Keep them on your UI thread.
- **A licence file.** The crate declares `license = "MIT"` in its manifest, but the repository has no `LICENSE` file yet. TODO: add one before the first release.
- **A stability promise.**

## Out of scope

Carte is not URL routing, and is not planned to become it. There are no path parameters, no query strings, no history stack and no deep links. Route ids are `&'static str` values fixed at startup.

> TODO: decide whether a URL or deep-link layer belongs in a separate crate on top of Carte, mapping a URL to model state that the walk then reads. It would not change Carte itself.
