Releases: geoffwellman/celestial
Release list
celestial v0.3.0
Install: git clone this repository, then cel update.
Added
- A worker may no longer land, release, delegate, scout, spike, collect or
reconcile: the guard denies those verbs for the worker role and
cel-fanoutrefuses them on its own before anyghcall or ledger lock, so
the bottom tier ships a PR and reports rather than driving the factory. - The two signed-in subscriptions are visible at last. The fleet runs on a
Claude subscription (pi's OAuth and Claude Code) and a Codex one (ChatGPT,
through omp), and nothing on the plane could see either:cel quotaknew API
balances only, so a five-hour window at 100% stopped every worker on that
account with no message anywhere anyone looks.cel quotanow prints one row
per signed-in account above the balances — each window, its percentage and
the local time it resets — andcel quota --jsoncarries them under
subscriptions. A token is never printed: an account is named by its
provider plus a short stable id. Readings cache for 60 s, so the console's
status edge (claude 16%/41% · codex 9%/62%, amber at 80, red at 100), its
newqQUOTA view,cel fleet --jsonand the dashboard's Subscriptions card
all read the cache instead of calling a provider on every draw. The steward
raises one rolled-up item per account (status overCEL_SUB_WARN_PCT, 80;
blocked at 100) and clears it when the window drops, and a profile routed at
a spent 5h window is vetoed before its pane spawns, with the reset time in
the refusal - The ledger closes what the world already closed:
cel-fanout reconcile
lands the rows whose PR GitHub merged, abandons the ones closed unmerged past
CEL_RECONCILE_GRACE_HOURS, raises one rolled-up item per unread scout
report and releases ship rows with no PR and no worktree - onegh pr list
per repo, run every steward tick, withrelease --all --mergedand a console
Xoption for the same clean-up by hand - Releasing is one verb:
cel release <x.y.z>dispatches a GitHub workflow
that checks hygiene and the suite, bumpsVERSION, closes[Unreleased]and
opens therelease: v<x.y.z>PR; merging it tags and publishes the GitHub
Release from the same notes.--dry-runshows what would ship and
cel release statusthe open PR and newest tag - The console is a control panel: the unit view now lays out ORCHESTRATOR ·
WORKERS · BOARD · PRS · WAITING · RECENT MAIL, with Ctrl+T cycling
the focus and panels that would not fit collapsing to a title and a count - BOARD: the product's tickets from
cel-linear board --json, grouped by
state in the team's workflow order, with the worker on each; Enter opens the
ticket detail - PRS: the open pull requests on the product's repos from one
gh pr list
per repo - review decision, checks, age - withllanding an approved, green
one throughcel-fanout land - "Since you last looked": a one-line digest under the unit view's header,
computed from the console's own cursor per workspace, and a TIMELINE view
(T, or Ctrl+Y) merging the mailboxes, the delegation ledger and the merged
pull requests into one column, newest last - Seven verbs as keys and as intents: start, answer, land, nudge, restart,
move and review, each a proposal on the command line and each a router intent
with its slots filled from state the console already holds cel-linear board [--team K] [--state a,b] [--json]: a team's open issues and
what it finished today, grouped by state in workflow order, with the raw query
cached 60 s under$CEL_CACHEso the console's refresh cannot hammer Linearcel gateway- several Codex/Claude subscriptions behind one loopback
door.installregisters omp'sauth-brokerandauth-gatewayas box
services on 127.0.0.1 (47311/47411 by default) and mints the bearer;
status [--json]prints one row per account with each window's used/limit
and state, short ids only and never the token;login <provider>/
logout <provider> <id>are the one-line verbs for adding and dropping a
subscription. A worker profile that saysvia: gatewaylaunches pi at
ompgw/<provider>/<model>with anompgwprovider merged into
~/.pi/agent/models.jsonandOMP_GATEWAY_TOKEN+CEL_SESSION_IDset in
the pane - the session id is what the gateway balances accounts on, because
pi sends no session identity of its own. A gateway that is down, or a
provider with no usable credential, vetoes the profile before a pane spawns;
cel doctorcarries one line about it and the QUOTA view and the dashboard
list the accounts- Services are declared, watched and reachable:
cel serviceslists the
services a workspace declares and everycel-fanout trypreview as one
model - state (up/healthy/down), port, pid, resident memory, uptime and
the URL that reaches each one from a laptop - and
start|stop|restart|logs|open <name>drives them through a herdr pane
(aservices:entry with only a name and a url stays valid, and is
observe-only). The steward probes every service declaringhealth:and
raises ONE rolled-up blocker after two consecutive down ticks, clearing it
when the service answers again;restart: autorestarts it once first and
says so. The dashboard gains a reverse proxy -
http://<tailnet-ip>:<dash-port>/svc/<port>/…, WebSocket upgrades included,
known ports only, control token required - so a loopback dev server or
preview is reachable from the laptop at all;cel-fanout tryprints that URL
as its last line. The console gains a SERVICES view (S) and the router
three intents (open_service,service_ctl,service_logs) - The console can be routed by a decision model:
console.routerin
~/.local/share/cel/config.yamlsends the sentence to a classifier that
picks one of ten intents (fleet,product_status,why_worker,
message, ...) and returns a confidence with it - the console fills the
slots from the fleet it already holds, so the model never writes a command
line. 0.4 s against 6.5 s for the chat model on "what is happening with
bundle"; belowmin_confidencethe top three intents become options with
their probabilities; anything it cannot place falls through to the chat
model, as does a router that is down.--no-routerand
console.router.enabled: falsebypass it agents.yamlknows thetypesafeprovider (TYPESAFE_API_KEY), and
OpenRouter's decisions endpoint is derived from its chat one- Update awareness by commit, not only by tag: an
update.channelof
mainorreleasein~/.local/share/cel/config.yaml(cel update --channel), a build string ofv0.2.0+31 (d43910c, main)everywhere, and a
cel update --check, steward item, dashboard chip andcel doctorline
that say how many commits are new and what they were - Memory, everywhere state is read:
cel fleetcarriesrss_mbper
worker, unit and orchestrator pane plus aboxblock, printsmemper
product and the box's headroom on its head line; the console shows it per
row with the free figure on the status edge andsto sort a unit's workers
by memory; the steward raises one blocker under 10% available naming the
largest trees and tells an orchestrator about a worker over
CEL_MEM_WORKER_WARN_MB- reporting only, never killing - The console has a unit view: Enter or a double-click on a fleet row opens
one product whole - its orchestrator with[focus]and[message], every
worker with ticket, state, quiet time, verdict, ahead count and PR, the open
decisions and the recent mail - The console has a worker view, the answer to "why": it runs
cel-fanout why <id>on open and offers[prompt][focus][collect][release]
[try][why again]- the ones that change state as proposals on the
command line - Every list in the console is a place you can enter: the inbox tail is
selectable (Ctrl+T cycles fleet → waiting → inbox), and a message from a
worker or an orchestrator carries[worker]/[unit]to its page - The console never shows raw JSON:
cel fleet --json,cel-fanout status --json,cel inbox open --json,herdr agent focusandherdr agent get
are rendered as the tables and lines the panels use, anything else that
parses as JSON askey: value, andrtoggles[raw] - The console's model can answer from state:
ANSWER: <text>for questions the
fleet document (which now carriesworkers_list) already holds, with nothing
run;cel console --render-once --unit <product>and--worker <id>print
the two new views cel fleet --jsoncarriesunits[].workers_list: every worker still worth
acting on (running,finished,collected) - id, ticket, repo, branch,
shape, state, live agent status,quiet_secs, stallverdictand
severity,ahead, PR, alias, pane and
worktree - so thestalledcount can be read back to its rows, and
cel-fanout status --jsonprints the same objects for one workspacecel-fanout why <id>says why one worker is stuck in words: verdict, quiet
time and work at risk, the pane's last 25 lines, the last five messages it
sent, its PR, and the one next act- The steward says a thing once: every item it raises carries a condition key
(cel inbox send --fp), so a repeat becomes an update on the item already
open -cel inbox openshows(×12, last 17:35)- and the steward resolves
its own item, with acleared:line, when the condition stops being true cel inbox resolve --all [--from x] [--matching s] [--kind k] [--older-than h]
cleans a mailbox in one line, andcel inbox open --all-workspacesshows
everything waiting on one reader across every registered workspacerepos[].seedinworkspace.yaml- the gitignored local files every
worktree needs to run (symlinked, or copied withcopy: true), placed by
cel-fanout delegate/`scou...
Celestial v0.2.0 — AI software factory
Celestial — an AI software factory
The first public release of Celestial, published under MIT from a reviewed, clean-history source snapshot.
A visible production system for coding agents
- Coordinate orchestrators and workers across workspaces and Git worktrees, with visible herdr panes and workspace-specific policy.
- Follow work on an interactive isometric factory floor: intake, build, test, review, dispatch and a separate holding area.
- Select a work order to inspect its branch and delivery signals, open its PR or ticket, or focus its worker.
- See blocked and missing signals explicitly. Dispatch means approved, green and ready for a merge decision — not already shipped.
- Use the existing operational task lists, inbox and agent controls alongside the factory view. Light/dark themes, keyboard selection and reduced-motion preferences are supported.
Safer operation
Garbage collection retains dirty, unlanded, live and unverifiable work. Idle reaping requires ownership and observed-idle evidence. Workspace credentials are isolated, state writers use locks and atomic replacement, and private HTTP controls enforce Host/Origin and anti-CSRF checks.
Fresh installations use explicit application releases, verified native checksums and exact external plugin commits. Installation failures propagate. GNU/Linux x86-64 and arm64 are the supported platforms; setup is not a hermetic machine-image lock.
Start here
Celestial is a trusted-user control plane, not an agent sandbox or an account-authentication boundary. Review the manifests before installing and the HTTP trust model before exposing a service.