# Release notes What is new in each version of `aircloud`, the newest first. When you upgrade with `aircloud upgrade`, it shows you these notes for every version you move past. To see whether a newer version is out, run `aircloud changelog`. ## aircloud 0.1.12 {#v0.1.12} *Released 2026-10-30.* Your product's members get memberships, profiles, grants, groups and denies you manage from the CLI; every route and trigger without a signed-in user says which node it acts at; and `aircloud authz explain` tells you why a request was allowed or refused. ### Needs your action {#v0.1.12-breaking} - `aircloud members update`, `aircloud members remove`, `aircloud members grants`, `aircloud members grant` and `aircloud members revoke` name a membership by its id, not a user: one person may now hold several memberships, each at its own node. `aircloud members list` shows each membership's id beside its user. **What to do:** Take the id from the membership column of `aircloud members list` (or from `aircloud members memberships` with the person's user id) and pass it where you passed the user id. - `aircloud check` and every release refuse a public route to a function, an event trigger and a cron trigger that do not say which node of your organization tree they act at (`route.org_path_required`, `trigger.org_path_required`); nothing acts over your whole product unless it says so. A route to a container must not say one (`route.org_path_not_invocation`). **What to do:** Add `org_path = "/"` to each such `[[route]]` in `config/routes.toml` and to each `[[triggers.events]]` and `[[triggers.cron]]` in a `function.toml` to keep acting over your whole product, or a lower node such as `org_path = "/org/acme"` to act only there; remove `org_path` from routes to a container. - `aircloud check` and every release refuse a node your product names that it never creates (`org.path_undeclared`): an `org_path` or a route's `at` names `/`, a node of `[authenticate]` (`admin_org_path`, `default_org_path`, the `[authenticate.workspaces]` parent, the new `nodes` list) or a node above one, or a node below the workspaces parent, which workspace signup creates. Each production activation creates the nodes of `[authenticate]`; a node you later remove from `nodes` is not deleted. **What to do:** For each node `aircloud check` names, add it to `[authenticate] nodes = ["/org/acme"]` in `config/routes.toml`, or act at a node your product already declares. - Generated tests use `@aircloudhq/testing` 2.0.4: `invoke` names the route or trigger a function runs through instead of the function's file, and refuses one your product does not declare, as the platform does; a public route is called with no signed-in user. **What to do:** When you move a product's tests to 2.0.4, replace each `invoke("app/functions/pets/index.js", request)` with `invoke({ route: "/api/pets" }, request)` naming the route your `config/routes.toml` declares, and run the tests with `npm --prefix test test`, which prepares your routes and triggers first. - `aircloud generate scaffold` with `--owner` or `--shared` puts the entity's routes and pages inside `[authenticate]`, since its records belong to a signed-in user, and is refused in a product without it. **What to do:** Run `aircloud generate authentication` before you generate an owned or shared scaffold. ### New {#v0.1.12-new} - `aircloud org nodes` lists, creates, archives, unarchives and deletes the nodes of your organization tree: archiving a client's node suspends everything acting there until you unarchive it, and only an archived node is deleted. - `aircloud profiles` manages profiles, named sets of roles granted by reference; `aircloud generate authentication` now also writes your base profiles to `config/profiles.toml`, one per role, with `admin` holding every role. - `aircloud members grant`, `aircloud members grants` and `aircloud members revoke` give a membership a profile at a node, optionally until a time; `aircloud members invite --profile` grants one at the new member's node, and `--scopes tenant:org` lets them manage the members below it. - `aircloud members update` changes only the options you give, and `--path` moves a membership to another node. - `aircloud groups` shares grants among memberships, and `aircloud denies` refuses roles or operations at and below a node whatever any grant gives. - `aircloud members memberships` lists one person's memberships, `aircloud members blocks` the blocked addresses, and `aircloud members review` the grants about to expire, the profiles nobody uses, the empty groups and who manages members. - `aircloud authz check`, `aircloud authz explain` and `aircloud authz who` say whether a member may act at a node, which rule decided, and who reaches a node with which roles; your coding agent asks the same through the dev MCP server's `authz_check`. - `--membership` on every command acts through one of your memberships when you hold several. - `aircloud check` knows the new declarations: `config/profiles.toml`, `[authenticate.workspaces]` for end users who create a company of their own, `at` on a session route, `[[policy]]` field rules on an entity, and `[org] operations` and `[[elevate]]` aggregates in a `function.toml`. - The generators write `org_path = "/"` on every route and trigger they add, so the choice to act over your whole product is visible and yours to narrow. - `aircloud release show` reports a profile removed from `config/profiles.toml` that was kept because members still hold it, and a preview whose workspaces declaration differs from production's. - The generated AGENTS.md, the AI skill and the header of a generated function without a signed-in user say it acts at the node its `org_path` declares, reads every customer's records at or below that node and stores what it writes there; the skill and AGENTS.md also teach memberships, profiles, grants, denies, field rules, workspaces, narrowing and elevated aggregates. - `aircloud functions invoke --at ` runs a function as if called at a node below yours, and is refused at a node outside it or archived; your coding agent passes the same `at` to the dev MCP server's `function_invoke`. - `aircloud generate scaffold --roles … --at ` and `aircloud generate function --roles … --at ` write the node a session route acts at, which a product declaring `[authenticate.workspaces]` requires. - `aircloud org nodes create --seed