CLI command reference#
Parse CLI command output, receipts, structured errors, and exit statuses correctly.
Overview#
Start with two read-only commands: action-manifest inspection and offline job preflight. The engine reference pages describe commands that run included local binaries.
Action Manifest#
On success, stdout is one JSON array and stderr is empty. Each array element has this shape:
Field |
Type |
Meaning |
|---|---|---|
|
string |
Stable action identifier from the embedded manifest |
|
string |
Human-readable purpose |
|
object |
JSON Schema for the action input |
|
boolean |
Whether the action is defined as executable rather than plan-only |
|
string |
Customer-callability class |
The current public manifest contains 25 actions. Twenty-two have executes: true. altifigence.analyze.run, altifigence.evolve.launch, and altifigence.verify.run have executes: false and are plan-only.
./alti commands
Offline Job Preflight#
Use the complete preparation and command in CLI First Success. The only success object is an altifigence.cli.engine-job-preflight.v1 receipt.
The receipt binds the locally calculated source hash and size to the validated job identity. These two booleans are essential:
submittedisfalse;server_authority_verifiedisfalse.
The envelope’s execution_placement: "cloud" is a requested placement field. It does not contradict the offline behavior and does not show that a server was contacted.
./alti --json job validate \
--job "$ALTI_WORKSPACE/job.json" \
--workspace-root "$ALTI_WORKSPACE" \
--source rtl/top.sv
JSON Error Contract#
When --json job validate reaches validation and fails, stdout contains no success receipt and stderr contains one object:
The code and message vary by failure. Do not parse a human message when the structured schema, error.code, and error.retryable fields are present. The validator does not echo the invalid job body or source bytes in this error.
{
"schema": "altifigence.cli.error.v1",
"error": {
"code": "ENGINE_JOB_JSON_INVALID",
"message": "The engine job JSON is invalid.",
"retryable": false
}
}
Exit Status#
alti has two dispatch paths with different exit-status contracts, so a script that only handles 0, 1, and 2 will misread real results. Which path runs is decided by the first word of the command line — a leading --json is skipped — before argument parsing. These are handled locally:
capabilities, rtl, sv, verification, trace, labs, tcl, eda, eidb, reports, physical, px, isa, ide, job, plus the exact forms analyze run and evolve run. mcp serve is intercepted ahead of both paths and starts the stdio MCP server.
Everything else is matched against the embedded action manifest. Note that only the run subcommand of analyze and evolve reaches the local path — other evolve subcommands fall through to the manifest, which defines evolve as a one-word action, so the extra word is reported as an unexpected argument with status 2.
The two workflows on this page do not share a path. alti commands is manifest-matched. alti --json job validate begins with job, so it is handled locally and follows the second table below — which is why a validation failure exits 1 rather than 2.
Manifest-matched commands:
Status |
Interpretation |
|---|---|
|
Manifest serialization succeeded, or the request was dispatched and a response was serialized |
|
Registry, configuration, serialization, or dispatch failure |
|
Unknown command, unexpected trailing argument, unknown flag, wrong value type, or a missing required option |
|
|
|
The request was refused before dispatch. |
Locally handled commands run through argument parsing and, where applicable, a packaged engine binary:
Status |
Interpretation |
|---|---|
|
The command, and any engine it invoked, completed successfully |
|
A CLI-side runtime error, including the JSON error contract above. |
|
Argument-parsing failure, or a pre-launch rejection such as a missing engine operation or an out-of-range stdin payload |
|
The engine binary was found beside |
|
The engine binary was not found beside |
other |
The engine’s own exit status, passed through unchanged |
Because engine statuses pass through, any small integer — including 3 and 4 — can reach your script from an engine-backed command and does not carry the manifest-path meaning above. Branch on the command you ran, not on the number alone.
Always check the process exit status before parsing stdout. Keep stderr separate. An empty or partial file is not success, and a preflight receipt is not an engine, submission, or completion receipt.
$ alti job status --runner local job-123
ALTIFIGENCE_LOCAL_ENGINE_JOB_URL must be set to a non-empty value
[failed] job.status runner=local engine=alti-engine-job executable=alti-engine-job resolution=unresolved exit=2
Engine Commands: What Actually Runs#
The release ships the engine binaries next to alti, and alti runs them. For an engine-backed command, alti looks for the engine binary as a sibling of its own executable, falls back to PATH, and then executes it with the operation and arguments the subcommand builds. The receipt line on stderr names the binary, the resolution (sibling or path), and the exit status, so you can see exactly what was launched. This is the default: --runner defaults to local.
Five subcommands are compatibility paths that accept --runner: rtl compile, rtl synthesize, physical run, px analyze, and isa run. With --runner cloud or --runner private these print a [scaffold] dispatch line instead of running anything, because no runner adapter is connected; if you also pass engine arguments after --, they are rejected with status 1, since passthrough arguments are accepted only by --runner local. Every other engine-backed subcommand runs locally unconditionally and has no --runner flag.
Two commands genuinely require the signed installed layout rather than a flat extracted archive, and fail from an extracted archive alone:
alti capabilities, which resolvesPREFIX/bin/altiand the receipt-backed release payload before it will report anything, and exits1otherwise;alti tcl evaluate, which requiresalti-tcl-local-runneras a strict sibling with noPATHfallback and additionally checks it against the installed trust chain. It reportsTCL_INSTALLED_RUNNER_UNAVAILABLEand exits127when the sibling is absent, andTCL_INSTALLED_RUNNER_UNTRUSTEDand exits126when it is present but fails release authentication.
Current Limitations
Manifest-backed remote actions do not have an available Cloud or Public API service in this release. A
[scaffold]line and a plan-only manifest entry both stop before execution.A locally executed engine command is a real run on your machine. Review its diagnostics and outputs before using them in a project.
CLI environment authentication and the packaged stdio MCP process are not needed for the offline preflight.
$ alti --json rtl fanout-free-committed-identities list
{
"schema": "altifigence.local-engine-execution.v1",
"status": "unavailable",
"domain": "rtl",
"operation": "fanout-free-committed-identities-list",
"runner": "local",
"binary": "alti-rtl-runner"
}