glia build <REPO> [--no-incremental] [--out <OUT>]Walk a repo and write its graph layout (manifest.json + per-language .gmap shards + cross_stack.gmap) to
Written from the committed CLI surface snapshots in cli/surface/ and held to them by a test: every command has a usage line, every flag a line shows is declared, and every a|b value set is the snapshot's. glia <command> --help has the full text. Most commands take --with <repo> (repeatable: merge more repos in first, so the resolvers pair across them), --json, and --scope (a repo-relative path or a project label from glia projects). The global --no-overlay builds without .glia/overlay.toml.
glia build <REPO> [--no-incremental] [--out <OUT>]Walk a repo and write its graph layout (manifest.json + per-language .gmap shards + cross_stack.gmap) to
glia analyze <REPO> [--format summary|mermaid|json]Walk one repo and print node kinds + cross-graph edges. mermaid is the service graph (as glia arch --mermaid), json the full nodes + edges.
glia merge [REPOS]... [--gmap <DIR>]... [--incremental] [--layout <DIR>] [--out <OUT>] [--workspace <FILE>]One MergedGraph across N repos, or across pre-built layouts (--gmap, or a glia.workspace.json via --workspace) without their sources; the resolvers fire across repo boundaries. --layout writes the merged layout, --out JSON.
glia inspect <PATH> [--json]What a .gmap file or layout directory holds, every id named from the file's own header. Exits 1 on an unreadable or old-format file ("rebuild the graph").
glia install-hooks [REPO] [--command <COMMAND>] [--pair <PAIR>] [--uninstall]Opt-in post-commit / post-merge / post-checkout hooks that rerun glia build . (or --command), written where git reads hooks: core.hooksPath, else the common dir, so one install serves every worktree of the repo. --pair Glia-Pinned-At: <sibling HEAD>. Bypass once with git commit --no-verify (both hooks) or GLIA_BRANCH_PAIR=skip (the check only). Needs git >= 2.13. Never overwrites hooks glia did not write.
glia cache push <REPO> <STORE> [--json] [--key-file <FILE>] [--layout] [--unsigned]Upload a built checkout's parse cache to an object store, one signed object per content address, skipping what the store holds. STORE is a directory or an https:// URL (PUT, Authorization: Bearer $GLIA_CACHE_TOKEN when set; plain http:// to a loopback host only). The MAC key is GLIA_CACHE_KEY or --key-file; --unsigned trusts the store as-is. --layout first uploads the whole .glia/graph/ layout of a clean checkout whose layout is fresh. See docs/cache.md.
glia cache pull <REPO> <STORE> [--jobs <JOBS>] [--json] [--key-file <FILE>] [--layout] [--unsigned] [--verify <N|all>]Fetch the parses this checkout's cache lacks, check each object (size, key, MAC), re-parse a sample (--verify; 32 by default when --unsigned) and write
glia cache gc <STORE> [--json] [--keep-stamps <KEEP_STAMPS>] [--max-bytes <BYTES>]Prune a directory store: keep the newest --keep-stamps build stamps, then drop the oldest objects over --max-bytes (K / M / G suffixes).
glia arch <REPO> [--include-shared] [--json] [--mermaid] [--no-collapse] [--with <WITH>]...The services and the cross-service links between them, each with its mechanism and channel. One repo keys services by top-level directory; SHARES_*, SAME_AS and DOCUMENTS links show only with --include-shared. A SAME_AS identity class is one link per service pair at its weakest edge, and two copies of one class count once in every other link; --no-collapse shows the raw SAME_AS star.
glia projects <REPO> [--json] [--with <WITH>]...The manifest-rooted sub-projects (label, ecosystem, path): the --scope vocabulary.
glia coverage <REPO> [--json] [--with <WITH>]...Per-language extraction caveats and edges found, plus the co-change-without-edge audit, so a grep fallback is a deliberate choice. Two (*, DOCUMENTS) rows: the contract-JSON limits, and which markdown is read at all (the well-known files and docs/ trees at the repo and project roots, .ai/, ADR dirs, SDD feature docs) with the single-backtick mention rule.
glia gaps <REPO> [--category <CATEGORY>] [--json] [--overlay-delta] [--top-k <TOP_K>] [--with <WITH>]...Ranked blind spots (unpaired / ambiguous / unresolved endpoints, uncalled routes, tag-only queues, dead symbols (never an implementation of a method something calls, which dispatch reaches), co-change without an edge, suspected edges, overlay rot: orphaned and redundant rules, and rotted_rule, a [[constraint]] whose rule this glia can no longer read), each with a stable gap id and the overlay section that could repair it. suspected_edge rows (heuristic) print a paste-ready [[edge]] stanza after their table ("paste into [walk] tests), a GraphQL client's transport endpoint when the project's operations pair a resolver on a server with no route at its path (any other unpaired transport says graphql transport; first), and as dead symbols a used class's lifecycle hooks, framework-called members and constructors, and generated code.
glia contracts <REPO> [--breaking-only] [--fields] [--json] [--mismatch-only] [--with <WITH>]...Per queue topic, producer vs consumer message type. --fields diffs declared fields (schema copies, topics, AsyncAPI channels, OpenAPI vs Pact) and the inferred contract models: http_model (each client call site's model against the server model of its HTTP exchange, response and request: a field the client reads that the server never writes, one it requires that the server may omit, a type mismatch), client_contract (a client against the OpenAPI op documenting its route) and graphql_selection (an operation's selection against the schema type its root field returns). Notes open / union ride on a verdict; a row that compared nothing is unknown, saying why (ambiguous_server, client_type_unresolved, ...).
glia pages <REPO> [--dead-only] [--json] [--with <WITH>]...Frontend router pages, the links between them, dead deep links, unlinked pages.
glia flows <REPO> [--depth <DEPTH>] [--feature <FEATURE>] [--features] [--group-by feature|entry] [--json] [--no-collapse] [--out <OUT>] [--scope <SCOPE>] [--with <WITH>]...Every entry point's forward flow: reach, mechanisms, whether it crosses a service, keyed by the feature word glia trace takes. --features / --out group them into per-feature records (
glia spec-status <REPO> [--feature <FEATURE>] [--json] [--status implemented|declared_missing|undeclared] [--with <WITH>]...Per feature, the declared API ops (OpenAPI, feature.yaml) a route implements, the ones still missing, and routes no op declares. Each implemented row says how it paired: exact, server_base (another server the document lists), annotated_base (the project's swaggo @BasePath, for a document with no base) or prefix (an inferred strip).
glia cycles <REPO> [--json] [--kind event|import|all] [--scope <SCOPE>] [--with <WITH>]...Cross-service event loops with a located witness, call loops, service-level possible loops, then module import cycles.
glia communities <REPO> [--json] [--members <MEMBERS>] [--method leiden|lpa] [--resolution <RESOLUTION>] [--scope <SCOPE>] [--seed <SEED>] [--top <TOP>] [--with <WITH>]...The graph's communities by seeded Leiden (label propagation above its pair cap, or exactly --method), largest first: each with its size, cohesion, node kinds, glia arch services, effect sinks, located entry points, top members and heaviest links to other communities. Heuristic. A report: exits 0.
glia splits <REPO> [--from <FROM> --to <TO>] [--json] [--min-share <MIN_SHARE>] [--parts <PARTS>] [--quotient module|community] [--scope <SCOPE>] [--seed <SEED>] [--with <WITH>]...Where a scope splits into services at the least coupling: the module (or community) quotient cut by Stoer-Wagner into --parts parts (2..=8) above a balance floor, or with --from / --to the minimum cut separating two sides. The parts, the cut edges located at their evidence sites, the blockers (data entities two parts write, cycles between parts) and each part against glia arch. A suggestion, never a verdict (heuristic); exits 1 with no cut.
glia hubs <REPO> [--category <CATEGORY>] [--include-tests] [--json] [--min-degree <MIN_DEGREE>] [--scope <SCOPE>] [--top <TOP>] [--with <WITH>]...The nodes carrying the most structural load, three ranked lists: fan-in (utilities), fan-out (orchestrators) and cross-service connectors, each located with its degree, HITS authority / hub scores and label. Counts every carry edge but tests, docs and manifest dependencies, or one --category; test nodes only with --include-tests. Derived. Exits 1 with no rows.
glia duplicate-flows <REPO> [--depth <DEPTH>] [--include-tests] [--json] [--keep-hubs] [--min-size <MIN_SIZE>] [--scope <SCOPE>] [--threshold <THRESHOLD>] [--with <WITH>]...Entry points whose forward flows reach the same nodes: exact groups (derived: an aliased route, a v1 / v2 pair never retired) and near groups (heuristic: MinHash / LSH, verified at Jaccard >= --threshold, default 0.8), each with the nodes it differs by. A report: exits 0, 2 on a --threshold outside (0, 1].
glia hotspots <REPO> [--include-tests] [--json] [--level module|symbol|both] [--min-churn <MIN_CHURN>] [--scope <SCOPE>] [--top <TOP>] [--with <WITH>]...Modules and symbols that change often AND sit where much depends on them: git churn rank beside PageRank centrality rank (the centrality preset), no composite score. Reads the history snapshot (glia history sync, --blame for symbols). Heuristic. Exits 1 with no rows (no_history / no_match).
glia identity <REPO> [--diverged-only] [--json] [--limit <N>] [--rule <RULE>] [--tier fact|derived|heuristic] [--with <WITH>]...The identity classes: what the build says is one thing across repos (a package, a message, a contract op, a SCIP symbol, a client model and its server model or GraphQL schema type: fact / derived, collapsed in answers) and the same-as candidates (vendored copies: heuristic, never collapsed), by rule and tier, each member located, diverged copies with their variants. Exits 0 with classes, 1 with none (the absence says why), 2 on an error.
glia find <REPO> <QUERY> [--files] [--json] [--kind <KIND>]... [--no-collapse] [--scope <SCOPE>] [--top-k <TOP_K>] [--with <WITH>]...The ranked, located nodes a symbol, qname or fragment names, with the match tier. One row per identity class, folded before the --top-k cut. --files ranks one repo's files for the query text instead: ids in the text first (through its task / requirement rows and trackers), then past commits whose messages match it (glia history sync). Ranked by the repo's calibrated pick (glia history calibrate), else ids first, then text; the table ends with ranked by <pick> (..), --json adds selection. One repo (--with exits 2); a query that routes no id and matches no message is an absence naming the missing input, exit 0.
glia resolve <REPO> <SIGNAL> [--json] [--kind <KIND>] [--scope <SCOPE>] [--top-k <TOP_K>] [--with <WITH>]...A stacktrace, diff, test id or free text -> the ranked, located nodes it names.
glia impact <REPO> <QNAME> [--depth <DEPTH>] [--direction forward|backward|both]Reachability walk from one entity: forward, backward or both.
glia blast-radius <REPO> <QNAME>... [--depth <DEPTH>] [--direction forward|backward|both] [--json] [--live-only] [--no-cochange] [--no-collapse] [--ranking ppr|ppr-wide|bfs] [--scope <SCOPE>] [--top-files <N>] [--top-k <TOP_K>] [--with <WITH>]...Edge-category-aware, PPR-ranked, located closure around one or more seeds, each row naming its seed, edge reason and live flag; import / contain edges excluded. A shared message, contract op or SCIP symbol is one node of the walk, so the radius crosses into every repo that shares it. With a history snapshot the rows of files that usually change with the seeds' files come first (co-change, then PageRank). files / ## files ranks the --top-files (10) most relevant files: co-change, ppr, depth under bfs, and the rows each holds. --ranking forces ppr, ppr-wide (damping 0.85, sum-pooled per file) or bfs; without it the repo's calibrated pick ranks (glia history calibrate), else co-change then ppr, named on one ranking: line (selection in --json). --no-cochange drops the co-change tier.
glia trace <REPO> <FEATURE> [--depth <DEPTH>] [--json] [--max-paths <MAX_PATHS>] [--no-collapse] [--to <TO>] [--with <WITH>]...Ranked distinct paths from a feature across service boundaries, each hop with its mechanism; --to gives the paths between two nodes. A hop through an identity class shows its best member and an (also in: ..) cell.
glia why <REPO> <FROM> <TO> [--category <CATEGORY>] [--json] [--with <WITH>]...Every edge between two nodes with its emitter, rule, call site, confidence and FACT / DERIVED / HEURISTIC tier; with none, a witness path. Exits 1 when not found.
glia implementors <REPO> <QNAME> [--direct] [--json] [--up] [--with <WITH>]...Who implements or extends a type, or overrides a method (--up: its supertypes), each row tiered by the weakest heritage edge on its path.
glia serves <REPO> <CHANNEL> [--json] [--mechanism auto|http|queue] [--no-collapse] [--with <WITH>]...Who serves METHOD /path or a queue topic, through the resolver's own matcher. An HTTP channel also lists, after the routes, each third-party ENDPOINT the code calls on that verb and path (match external, external_hosts in --json). An empty answer is a FACT with the mechanism's caveats and near misses. Servers of one identity class fold into the first (identity), and a server's handlers of one class keep the first (handler_identity).
glia effects <REPO> <QNAMES>... [--class <CLASS>]... [--cross-service] [--depth <DEPTH>] [--json] [--scope <SCOPE>] [--with <WITH>]... [--writes-only]The effect sinks downstream of the seeds (DB read / write, queue produce, outbound HTTP / RPC / WS / GraphQL call, event emit), each with its witness path. A call to a third-party host names it (external: <host>, external_hosts in --json): an HTTP ENDPOINT, or a WebSocket, gRPC or GraphQL client marked external.
glia docs-for <REPO> <QNAME> [--json] [--scope <SCOPE>] [--with <WITH>]...The doc sections that DOCUMENT a symbol, from the markdown the build reads: the well-known files and docs/ trees at the repo root and every project root, .ai/, ADR dirs, SDD feature docs (features/glia docs sync).
glia pack <REPO> <QUERY> [--budget <BUDGET>] [--bytes-per-token <BYTES_PER_TOKEN>] [--candidates <CANDIDATES>] [--json] [--no-cochange] [--preset repair|review|onboard|centrality] [--ranking ppr|ppr-wide|bfs] [--scope <SCOPE>] [--seeds <SEEDS>] [--with <WITH>]...The context for a query packed to a token budget (default 8000), ready to paste: the seeds glia find matches, then their callers and callees by personalised PageRank, each at the most detail the budget buys (full source, a preview, an outline line or a bare qname), located, with the links between them. stdout is the pack only, a summary goes to stderr; --json is the pack with its manifest. With a history snapshot each co-changed file's best candidate moves to the front before the cut; --ranking (default ppr) / --no-cochange choose the file ranking. Pack never reads the calibration record (ruling EC-9b: glia history calibrate changes no pack); --json names the ranking in selection (fallback, reason pack_uncalibrated, for the default; explicit otherwise). Exits 1 when the pack is empty (the absence says why).
glia query <REPO> [<FILE>] [-e <TEXT>] [--explain] [--gql] [--json] [--limit <N>] [--max-rows <N>] [--output <PRED>]... [--with <WITH>]...A Datalog program from <source>:<line>:<col>: error: <message>.
glia delta <REPO> [--base <BASE>] [--category <CATEGORY>]... [--edges-only] [--json]What the working tree's change did to the graph against a git rev (default HEAD): nodes and edges added, removed, modified or moved, located.
glia diff-impact <REPO> [--base <REV>] [--depth <DEPTH>] [--diff <FILE>] [--direction forward|backward|both] [--json] [--live-only] [--no-cochange] [--ranking ppr|ppr-wide|bfs] [--scope <SCOPE>] [--top-files <N>] [--top-k <TOP_K>] [--with <WITH>]...The changed nodes (--base rev or --diff file) and one ranked blast radius around them, each row naming the change that reached it. Ranked and filed as blast-radius (--ranking, --no-cochange, --top-files, selection, ## files).
glia tests-for <REPO> [QNAMES]... [--base <REV>] [--depth <DEPTH>] [--diff <FILE>] [--files-only] [--json] [--limit <N>] [--no-collapse] [--no-module-level] [--no-signals] [--scope <SCOPE>] [--with <WITH>]...The tests to run for a change (seed qnames, --diff or --base), tiered FACT / DERIVED / HEURISTIC and ranked by the test and history snapshots' signals (failed in recent runs, on a failing trace, co-changes with a seed's module; a test found only by co-change is a heuristic cochange row). --no-signals ranks structurally only; --limit keeps the first N; --files-only prints test files for a runner. Test rows of one identity class fold into one; --no-collapse keeps them all.
glia patterns <REPO> [--base <REV>] [--group-by service|package] [--json] [--min-share <MIN_SHARE>] [--min-support <MIN_SUPPORT>] [--scope <SCOPE>] [--with <WITH>]...Pattern conformance: per service (or package), each route handler's role chain to its first effect sink; the chain held by --min-share percent of at least --min-support sighted handlers is the convention, and every handler off it a located DIVERGENCE. Blind handlers are listed, never counted. Counts, not rules; --base keeps the divergences the change touched.
glia review <REPO> [--base <REV>] [--depth <N>] [--json] [--markdown-rows <N>] [--max-impact <N>] [--max-tests <N>] [--models-min-tier fact|derived] [--no-cochange] [--ranking ppr|ppr-wide|bfs] [--title <TEXT>]The PR report for the working tree's change against a rev (default HEAD): the changed nodes, their ranked impact, the tests to run, every added / removed edge with its tier, the declared rules checked on both sides, and the inferred-model breaks contract-breaks finds (model_breaks). Markdown for a PR comment; a rule whose scope holds no node is listed under "Rules that check nothing", and a rule's coverage caveats print once per section. A CI gate: exits 1 only on a new BLOCKING violation (at or above its rule's min_tier; an advisory one is listed under its own heading, not failed) or a blocking model break. --title (default: the newest commit subject of intent, ### Intent, its file order the repo's calibrated pick, selection_intent). --ranking / --no-cochange rank the impact as blast-radius does.
glia contract-breaks <REPO> [--avro backward|forward|full] [--base <REV>] [--breaking-only] [--json] [--models-min-tier fact|derived] [--with <REPO>]...Did the change against a rev (default HEAD) break a client? Every OpenAPI / AsyncAPI op and proto / Avro / JSON Schema type paired old -> new and judged by its format's evolution rules, one row per field change; every client whose call lost its provider is orphaned (--with adds client repos). The inferred contract models too (models): every client <-> server model exchange (http_model, the GraphQL selections) judged old -> new, one row per model pair with the client and server field lines (a JSON rename, a field removed or now optional, a new required request field, a type change). A model row blocks only when its tier is at least --models-min-tier (default fact, so the resolver-paired, derived rows are advisory, counted in advisory, not breaking). A CI gate: exits 1 on a breaking change, an orphaned client or a blocking model break, 0 otherwise.
glia cochange <REPO> [FILES]... [--base <REV>] [--json] [--min-confidence <SHARE>] [--min-support <N>] [--top <N>] [--unlinked-only] [--with <WITH>]...What usually changes with these files (or the working tree's change against --base): each with a directional confidence (0.80 (4/5)), its support and whether a static link joins them (none: a blind spot). Needs a glia history sync snapshot. Heuristic; exits 1 with no rows. --base refuses --with and --no-overlay.
glia timeline build <REPO> [--head <HEAD>] [--json] [--revs <REVS>]Build the last --revs commits (default 20, at most 200) of --head's first-parent chain, one incremental build each on the shared parse cache, into the sidecar
glia timeline history <REPO> <QNAME> [--category <CATEGORY>] [--json]Every edge span that ever touched the node: since which rev, until which rev or still present, a file move followed. Before any build it exits 0 with the note naming glia timeline build.
glia timeline as-of <REPO> <REV> [--json]The graph at one rev of the window (an index, or a commit id prefix of 7+ hex chars): its counts by category. history and as-of read the sidecar, never rebuild.
glia watch <REPO> [--debounce-ms <N>] [--persist-every <S>] [--poll-ms <N>]Keep one repo's build open and stream what each change does to the graph: a foreground loop, no daemon, socket or pidfile. Prints a ready line, then one NDJSON object per update on stdout (the files that moved, the groups rebuilt, the totals, the located delta rows). Stat-polls every --poll-ms (500), applies a batch once it stays still for --debounce-ms (200), and writes
glia check <REPO> [--json] [--strict] [--with <WITH>]...Evaluate .glia/overlay.toml's [[constraint]] rules (forbid_edge, transitive forbid_edge with via facades, no_cycle, and version 2's invariant with a Datalog rule) and its reflexion model ([[component]], [[layer]], allow rules: the component matrix, divergences, absences, unmapped files) to located, tiered VIOLATIONs. A violation blocks when its tier is at least its rule's min_tier (fact or derived, default derived); a heuristic one is advisory under any setting. A declared rule that checks nothing (a stanza the build anchored nowhere; one the build or the overlay loader rejected, such as a version-2 key in a version-1 file or a path two components claim; a whole file the loader ignored, listed once; one the graph does not hold; a scope no located node sits in) is listed under "Rules that check nothing" with its reason and a fix; --strict makes each a rule error. A rule scoped to a directory inside a project anchors on that project. The markdown prints a rule's coverage caveats once, under its heading. Exits 0 when nothing blocks, 1 on a blocking violation, 2 on an error or a rule it cannot evaluate: CI-ready.
glia flags <REPO> [--json] [--quiet-days <QUIET_DAYS>] [--scope <SCOPE>] [--status dead|undefined|single_site|quiet]... [--with <WITH>]...Stale feature flags (LaunchDarkly / OpenFeature / Unleash / Flagsmith / Split reads, Flipt definitions), each with its readers and definitions: dead and undefined (derived), single_site (fact), quiet (heuristic: every reader unchanged for --quiet-days, from glia history sync --blame). A report: exits 0.
glia docs sync <REPO> [--source confluence] --space <SPACE> [--email <EMAIL>] [--exclude <PATTERN>]... [--include <PATTERN>]... [--site <SITE>] [--token <TOKEN>]Pull a Confluence space into
glia docs sync <REPO> --source dir --path <DIR> [--container <NAME>] [--url-base <URL>] [--exclude <PATTERN>]... [--include <PATTERN>]...A local GitHub / GitLab wiki checkout's Markdown pages (no dot-entries, _-prefixed files or symlinks); the container defaults to the directory's name.
glia docs sync <REPO> --source mediawiki --api <URL> --namespace <N> | --category <NAME> [--container <NAME>] [--max-pages <N>] [--token <TOKEN>]One namespace or category of a MediaWiki through its Action API (never by following links); a bearer token from --token or MEDIAWIKI_TOKEN.
glia docs sync <REPO> --source notion --database <ID> | --page <ID> [--api <URL>] [--max-pages <N>] [--token <TOKEN>]A Notion database's pages, or a page and its sub-pages, blocks converted to Markdown; the integration token from --token or NOTION_TOKEN.
glia docs push --file <FILE> --space <SPACE> --title <TITLE> [--email <EMAIL>] [--markdown] [--page-id <PAGE_ID>] [--site <SITE>] [--token <TOKEN>]Create or update (--page-id) a Confluence page; --markdown converts the file first.
glia history sync <REPO> [--blame] [--blame-max-files <BLAME_MAX_FILES>] [--max-commits <MAX_COMMITS>] [--no-messages] [--since <SINCE>]Read the local git history into
glia history calibrate <REPO> [--json] [--max-commits <N>] [--max-seeds <N>] [--sets <SETS>]Replay the history snapshot over the graph and write glia history sync; a build never calibrates. It scores each candidate ranking on the repo's own past commits, oldest first, picking with only the commits before each one (leak-free): SELh0 / SELs0 for the text-free answers (blast-radius, diff-impact, review's impact; SELs0 under --no-cochange), SELt2 for review's intent, SELf2t for find --files. pack never reads the record (ruling EC-9b). One line per (set, shape) with the pick, its online recall@10 against the fallback's and a bootstrap 95% CI. --max-commits (300) test commits, --max-seeds (5) queries each, --sets a subset of the groups structure, review, find. An answer ignores a record another glia build wrote (reason build_stamp): calibrate again after an upgrade. Exits 1 with no history snapshot, 2 on a build error.
glia tests ingest <REPO> [--junit <PATH>...] [--lcov <PATH>...] [--log <PATH>...] [--reset] [--run <LABEL>] [--window <N>]Add one CI run's JUnit XML, CI logs and lcov to
glia scip import <REPO> <INDEX> [--prefix <PREFIX>]Decode a SCIP index (scip-python, scip-typescript, scip-java, scip-go, rust-analyzer) into
glia overlay propose <REPO> [--category <CATEGORY>]... [--json] [--snippet-lines <SNIPPET_LINES>] [--top-k <TOP_K>] [--with <WITH>]...The overlay loop's work list: the gaps an overlay stanza could close, per category, each with its gap id, location and source lines, and a suspected edge's paste-ready [[edge]]. Writes nothing.
glia overlay try <REPO> --candidate <CANDIDATE> [--json] [--no-leave-one-out] [--with <WITH>]...Build a candidate stanza file against the repo (base, with it, and without each stanza in turn) and report what each stanza changes and a keep / review / drop verdict. --no-leave-one-out: two builds, no per-stanza attribution. A [[constraint]] rule stanza is judged by glia check on the build with every stanza (holds / violated / checks_nothing / error / orphaned / duplicate; a rule whose scope holds no node checks nothing and is review, as glia check lists it), and a graph stanza that adds or hides a declared rule's violation is review.
glia overlay accept <REPO> [--candidate <CANDIDATE>] [--dry-run] [--json] [--only <ONLY>]... [--remove <REMOVE>]...Merge chosen candidate stanzas (--only edge#2, constraint#1) into .glia/overlay.toml, or remove orphaned, redundant or rotted rules by gap id, validated and written atomically: the only writer of that file. It refuses a rule that does not parse or defines no violation; a rule whose scope holds no node is written, and glia check lists it as checking nothing. It moves the file to version = 2 only when a written rule needs it. Exits 0 written (or --dry-run), 1 when validation refuses, 2 on an error. The overlay commands refuse --no-overlay.
glia cell set <REPO> <QNAME> <CELL> [--dims <DIMS>] [--file <PATH>] [--hint <HINT>] [--json <ENTRY>] [--kind <KIND>] [--model <MODEL>] [--text <TEXT>]Write a CONSTRAINT / DECISION / CONV entry (one of --json, --text, --file) or a VECTOR (--file, --model, --dims) on a node; kept in .glia/cells.jsonl / vectors.jsonl across rebuilds. --hint takes the node's v1 identity hint (v1|<kind id>|<file name>|<body hash>|<local name>, the form engram-export's <out>.hints.jsonl lists), so the row re-binds after a move: a malformed or kind-contradicting hint exits 2 and writes nothing, and when a fresh build binds the qname to a node whose own hint differs the write is applied with target=hint_differs and a note naming the fields that differ.
glia cell rm <REPO> <QNAME> <CELL> [--id <ID>] [--source <SOURCE>]Remove one entry (--id, --source) or a node's VECTOR.
glia cell ls <REPO> [--check] [--json] [--qname <QNAME>] [--rekey]List the sidecar rows. --check binds each against a fresh build and exits 1 on an orphaned, ambiguous or rejected row; --rekey rewrites rows a moved node re-bound.