Atlas CLI
Personal Assistant identities: inspect {"view":"assistants"} using agent.team.inspect / agent_team_inspect. Create or update via agent.team.change with operation: assistant.create or assistant.update, identity: {name, avatarKey}, and for updates assistantId plus revision. Avatar keys are human-01 through human-08. Use the existing proposal and explicit confirmation flow with idempotency keys; CLI: atlas assistants inspect/propose/confirm. The permanent Head label is Head Assistant / 总助理; its ID head is metadata, never a thread ID. Identities and their proposals are owner-only; beta access must be verified. Custom chat uses its separate verified private-conversation capability. Creating identity metadata makes no hire, model call or new permission.
Assistants (previously AI Team): use atlas assistants inspect/propose/proposal/confirm/reject. Existing atlas team commands remain supported with the same API, permissions, idempotency keys and human confirmation flow. Wire identifiers remain agent.team.*.
Last edited:
Run governed Atlas actions from a terminal with the atlas CLI. For HTTP integration, use the dedicated REST reference. Every call is scoped to the token holder's organisation. Writes always go through a proposal that a person confirms.
Profile-gap task proposals retain CRM facts separately and may show up to three quoted passages from each knowledge file explicitly linked to that customer. No links, unreadable sources, and unavailable owners remain visible as distinct evidence states; knowledge text never changes CRM facts or task eligibility.
First result: read an accessible customer
Before you begin: an installed archive or source-built CLI, a staging account, a delegated token with crm:read, and a customer ID you can access. See installation for downloads and older-archive limits.
- Follow the quick start below to install and verify the version, then configure the staging URL and token.
- Run
atlas profile read <customer-id>; use./atlasif running directly from the extracted directory. Replace the placeholder with an accessible customer ID. - Inspect
status,request_idanddatain the JSON, then compare with the customer profile in the web app.
Expected result: A successful read returns status: completed and customer-profile data; this read does not create or change a customer.
If it fails, check atlas auth status and atlas config get base-url, then use troubleshooting for scopes and errors. Continue with the command reference or proposal confirmation workflow.
Quick start
shasum -a 256 -c SHA256SUMS
tar -xzf atlas-cli-<tag>-darwin-arm64.tar.gz
./atlas version
./atlas config set base-url https://atlas.staging.forth.ai
./atlas auth login
./atlas profile read <customer-id>
./atlas library search "warranty terms" --limit 5
atlas version prints the release tag and source SHA. Both must match manifest.json from the same release.
Release status
- MCP server: ready on staging. It publishes eighty-four governed tools; see the MCP server guide.
- MCP server: ready on staging. It publishes one hundred eight governed tools; see the MCP server guide.
- CLI source: ready on the current staging source. Every command in the reference below exists in the current source.
- Downloadable CLI:
atlas-cli-v0.1.0-staging.3. This archive predates customer search and customer creation. Build from source to useatlas customer searchandatlas customer create …, or wait for the next archive. - Production: not claimed by this update. Point the CLI at
https://atlas.staging.forth.ai.
Auth release operators: the repository-only command bun scripts/auth-authority-release.ts deploy|status|resume|recover --env staging|production --operation UUID registers inactive Auth configuration generations. Mutations require --expected-generation N --candidate-sha SHA; recovery also requires --replace-operation UUID --expected-deployment-id UUID --expected-version-id UUID. Existing Cloudflare privileges, exact release branches and staging reservations apply. See the repository agent lifecycle for migration prerequisites and closed recovery rules. This is not a tenant CLI permission, live policy admission or production delivery claim.
Staging release operators: bun --env-file=/dev/null scripts/staging-migration-readiness.ts SERVICE checks only the configured service-owned staging migration ledger using read-only SELECT queries. It does not initialize a missing ledger or apply migrations. A failed or unverified read blocks publication and cannot use a pending-migration exception. Identified pending migrations require the existing reviewed migration process. This check does not grant permissions or prove a deployment succeeded.
Installation
The private GitHub Release contains atlas-cli-<tag>-darwin-arm64.tar.gz, atlas-cli-<tag>-darwin-x64.tar.gz, manifest.json, and SHA256SUMS.
- Download the archive for your Mac plus
SHA256SUMSinto one directory. - Run
shasum -a 256 -c SHA256SUMS. Stop if any line is notOK; delete the files and download again. - Extract the archive and move
atlasto a directory onPATHthat only you can write to. - Run
atlas versionand compare the tag and source SHA withmanifest.json.
Linux and Windows are not supported by the archives. On those platforms, run from source and pass the token through ATLAS_ACCESS_TOKEN.
Configuration
atlas config set base-url https://atlas.staging.forth.ai
atlas config get base-url
atlas auth login # prompts for a token without echo, stores it in macOS Keychain
atlas auth status # shows which token source is active, never the token
atlas auth logout
| Setting | Resolution order | Storage |
|---|---|---|
| Base URL | --base-url, then ATLAS_BASE_URL, then the config file | XDG config file holding only base_url; directory mode 0700, file mode 0600 |
| Token | ATLAS_ACCESS_TOKEN, then macOS Keychain | Keychain entry keyed by the normalised base URL. No file, .env, or config fallback. |
Mint the token in the Atlas portal; the MCP guide shows the request. Remote base URLs must be HTTPS. HTTP is accepted for loopback only.
Command reference
Arguments in angle brackets are required. Every command below sends one REST request to the configured base URL and prints the response envelope as JSON.
| Command | Result | REST call |
|---|---|---|
atlas catalog | Approved action catalog. | GET /assistant/v1/catalog |
atlas profile read <customer-id> | Profile level, confirmed facts, cited evidence, missing requirements. | POST /assistant/v1/actions/crm.customer_profile.read |
atlas suggestions list <customer-id> | Profile-gap suggestions with explanations. | POST /assistant/v1/actions/crm.customer_profile_suggestions.list |
atlas customer search <query> [--limit N] | Customers matching every supplied term across profile, linked-contact, country/industry, classification, or visible-label fields. | POST /assistant/v1/actions/crm.customers.search |
atlas knowledge search <query> [--limit N] [--type T] [--source-id ID] | Ranked, cited passages from active organisation knowledge. | POST /assistant/v1/actions/ekb.knowledge.retrieve |
atlas library search <query> [--limit N] | Ranked, cited snippets from confirmed Knowledge Library documents. The action requests hybrid recall, so each item carries a locator (page, sheet and range, part or line) and a fused score. | POST /assistant/v1/actions/ekb.library.search |
atlas library read <file> [--passage <n>] | Reads a passage a library search found, in full: with --passage, that passage plus at most one neighbour on each side (at most 6,000 characters); without it, the whole file when it has at most 12,000 extracted characters, otherwise status: "too_large" with the passage count and no text. Use the file_id and passage_index from atlas library search. A file you may not see, a file that is not ready or an index out of range is not_found. | POST /assistant/v1/actions/ekb.library.passages.read |
atlas customer create propose <name> --idempotency-key <key> [--contact NAME] [--email EMAIL] [--country COUNTRY] [--industry INDUSTRY] [--customer-type TYPE] | Proposal to create a customer. Creates no customer. | POST /assistant/v1/actions/crm.customer_profile.create |
atlas customer create inspect <proposal-id> | The proposal, its intent, evidence, state, and expiry. | GET /assistant/v1/proposals/<id> |
atlas customer create confirm <proposal-id> --idempotency-key <key> | Creates the customer from the proposal. | POST /assistant/v1/proposals/<id>/confirm |
atlas customer create reject <proposal-id> --idempotency-key <key> | Closes the proposal without creating anything. | POST /assistant/v1/proposals/<id>/reject |
atlas task propose-gap <customer-id> <gap-code> <title> --idempotency-key <key> [--due-at <epoch-seconds>] [--assignee-email EMAIL] [--suggestion-id ID] | Proposal to create a profile-gap task. Creates no task. | POST /assistant/v1/actions/tasks.profile_gap_task.create |
atlas task inspect <proposal-id> | The proposal, its intent, evidence, state, and expiry. | GET /assistant/v1/proposals/<id> |
atlas task confirm <proposal-id> --idempotency-key <key> | Creates the task from the proposal. | POST /assistant/v1/proposals/<id>/confirm |
atlas task reject <proposal-id> --idempotency-key <key> | Closes the proposal without creating anything. | POST /assistant/v1/proposals/<id>/reject |
atlas team inspect <json> | Team, one hire's detail, decisions, learning options, or pilot metrics, by view. View decisions also answers doneByAiTeam, the work an auto-pilot hire confirmed itself. View team also answers runHealth over the last seven days, for the hires you can see: runs started, terminalRuns finished, degraded, failed, degradedRate, failedRate, hiresCounted, hiresTruncated and byHire. degradedRate and failedRate are shares of terminalRuns, the runs that finished, not of runs. Trial and evaluation runs are not counted, and neither are runs governance has purged. hiresCounted says how many hires were counted and hiresTruncated is true when the organisation may hold more. The same block, counted over the metrics period, also rides view metrics as runHealth. Pass {"view":"customer","customerId":"<customer-id>"} for one account's hires; a customer you cannot read, one in another organisation and one with no hires all answer {"items":[]}. Pass {"view":"detail","runId":"<run-id>"} to inspect one run. usage.byPurpose reports attempts, provider-token and rated/credit coverage, token totals, provider cost in nanos with its currency, and customer credits separately. Cached and reasoning tokens are subsets. usage.pendingAttempts counts unsettled attempts; usage.incomplete is true for pending, missing or incompatible measurements, including no usage evidence. Unavailable totals stay null; no usage rows means an empty projection, never a measured zero. | POST /assistant/v1/actions/agent.team.inspect |
atlas team propose <json> --idempotency-key <key> | Proposal for a hire, configuration, work, or teaching change. teaching.suggest returns one unsaved method draft after confirmation; it never creates a candidate. teaching.compare is restricted to a current human admin in staging or development and refuses unless the current published registry contains reviewed account-manager-method.v1 cases. work.undo takes back one action an auto-pilot hire executed by itself: the task it created is cancelled, a draft it saved is discarded, once only. One account carries a whole AI team but at most one non-retired hire of each role: hire.create for a role a non-retired hire already holds on that customer is refused 409 role_already_assigned, and the envelope error names that hire in existing_hire_id and existing_role. skill.withdraw (administrators; scope, fromVersionId, headRevision, no target) moves the active learned-guidance head back to the base version and marks that version withdrawn; a changed head is refused 409 skill_head_changed, and recovery is a replacement through teaching. run.handoff ({"operation":"run.handoff","hireId":"<pre-sale hire id>","revision":<n>}) hands an active Pre-sale Assistant's requirements matrix to the customer's active Account Manager; see the REST manual's RFQ handoff section for its refusals. | POST /assistant/v1/actions/agent.team.change |
atlas team proposal <proposal-id> | The proposal, its intent, evidence, state, and expiry. | GET /assistant/v1/proposals/<id> |
atlas team confirm <proposal-id> --idempotency-key <key> | Applies the proposed team change. | POST /assistant/v1/proposals/<id>/confirm |
atlas team reject <proposal-id> --idempotency-key <key> | Closes the proposal without applying the change. | POST /assistant/v1/proposals/<id>/reject |
atlas source-use resolve <json> | Whether one exact current knowledge claim is confirmed and permitted for a customer, with the approval reference and basis digest. | POST /assistant/v1/actions/ekb.source-use.read |
atlas source-use propose <json> --idempotency-key <key> | Proposal to approve or withdraw one bounded customer-use approval. Managers and administrators only; changes nothing. | POST /assistant/v1/actions/ekb.source-use.change |
atlas source-use proposal <proposal-id> | The proposal, its intent, basis, state, and expiry. | GET /assistant/v1/proposals/<id> |
atlas source-use confirm <proposal-id> --idempotency-key <key> | Applies the approval or withdrawal from the proposal. | POST /assistant/v1/proposals/<id>/confirm |
atlas source-use reject <proposal-id> --idempotency-key <key> | Closes the proposal without changing any approval. | POST /assistant/v1/proposals/<id>/reject |
atlas selection read <json> | List the organisation's product-evidence selections, or read one with per-entry currency, excerpt and outward basis. | POST /assistant/v1/actions/ekb.product-evidence-selection.read |
atlas selection create <json> --idempotency-key <key> | Proposal to save one named selection of pinned product claims (1-12). Managers and administrators only. | POST /assistant/v1/actions/ekb.product-evidence-selection.create |
atlas selection update <json> --idempotency-key <key> | Proposal to replace a selection's name and pinned claims. | POST /assistant/v1/actions/ekb.product-evidence-selection.update |
atlas selection delete <json> --idempotency-key <key> | Proposal to delete one selection and its entries. | POST /assistant/v1/actions/ekb.product-evidence-selection.delete |
atlas selection proposal <proposal-id> | The proposal, its intent, basis, state, and expiry. | GET /assistant/v1/proposals/<id> |
atlas selection confirm <proposal-id> --idempotency-key <key> | Applies the selection change from the proposal. | POST /assistant/v1/proposals/<id>/confirm |
atlas selection reject <proposal-id> --idempotency-key <key> | Closes the proposal without changing any selection. | POST /assistant/v1/proposals/<id>/reject |
atlas engagement read <customer-id> --purpose <purpose> [--sections <list>] [--limit <1-100>] [--cursor <cursor>] | Reads one customer's cited engagement context (profile and confirmed facts, contacts, deals, transactions, timeline) with content-digest versions, generic gaps and page cursors. Read-only. | POST /assistant/v1/actions/crm.engagement.context.read |
atlas receivable list <customer-id> | The customer's confirmed receivable cases with the latest balance, due date and state. | POST /assistant/v1/actions/crm.engagement.receivable.list |
atlas receivable read <customer-id> <case-id> | One receivable case and its observation history. | POST /assistant/v1/actions/crm.engagement.receivable.read |
atlas receivable confirm propose <customer-id> --balance <amount> --currency <ISO> --state <open|partial|settled|disputed> --idempotency-key <key> [--due-on <date|unknown>] [--case-id <id>] [--source-kind <kind>] [--source-id <id>] [--expected-revision <n>] [--note <text>] | Creates an immutable receivable-observation proposal; nothing is recorded until it is confirmed. | POST /assistant/v1/actions/crm.engagement.receivable.confirm |
atlas receivable confirm inspect <proposal-id> | Inspects one receivable-observation proposal before deciding. | GET /assistant/v1/proposals/<id> |
atlas receivable confirm confirm <proposal-id> --idempotency-key <key> | Records the observation from the proposal. | POST /assistant/v1/proposals/<id>/confirm |
atlas receivable confirm reject <proposal-id> --idempotency-key <key> | Closes the proposal without recording anything. | POST /assistant/v1/proposals/<id>/reject |
atlas order-delivery list <customer-id> | The customer’s confirmed order-delivery cases with the latest observation and observation count. | POST /assistant/v1/actions/crm.engagement.order-delivery.list |
atlas order-delivery read <customer-id> <case-id> | One order-delivery case and its observation history. | POST /assistant/v1/actions/crm.engagement.order-delivery.read |
atlas order-delivery confirm propose <customer-id> --timing <on_track|at_risk|delayed|delivered> --idempotency-key <key> [--expected-on <date|unknown>] [--case-id <id> | --order-reference <ref> --source-document-id <id>] [--expected-revision <n>] [--source-refs <id,id>] [--note <text>] | Creates an immutable order-delivery-observation proposal; nothing is recorded until it is confirmed. | POST /assistant/v1/actions/crm.engagement.order-delivery.confirm |
atlas order-delivery confirm inspect <proposal-id> | Inspects one order-delivery-observation proposal before deciding. | GET /assistant/v1/proposals/<id> |
atlas order-delivery confirm confirm <proposal-id> --idempotency-key <key> | Records the observation from the proposal. | POST /assistant/v1/proposals/<id>/confirm |
atlas order-delivery confirm reject <proposal-id> --idempotency-key <key> | Closes the proposal without recording anything. | POST /assistant/v1/proposals/<id>/reject |
atlas sample-test read <customer-id> [case-id] | One customer's sample-test cases with their latest confirmed result, or one case with its full observation history. | POST /assistant/v1/actions/crm.engagement.sample-test.read |
atlas sample-test confirm propose <json> --idempotency-key <key> | Creates an immutable sample-test result proposal; nothing is recorded until it is confirmed. | POST /assistant/v1/actions/crm.engagement.sample-test.confirm |
atlas sample-test confirm inspect <proposal-id> | Inspects one sample-test result proposal before deciding. | GET /assistant/v1/proposals/<id> |
atlas sample-test confirm confirm <proposal-id> --idempotency-key <key> | Records the confirmed result; a final pass/fail stops only that sample's test follow-up. | POST /assistant/v1/proposals/<id>/confirm |
atlas sample-test confirm reject <proposal-id> --idempotency-key <key> | Closes the proposal without recording anything. | POST /assistant/v1/proposals/<id>/reject |
atlas quotation-result read <customer-id> [quotation-id] | One customer's unresolved quotations with their latest confirmed result note, or one quotation with its full note history. | POST /assistant/v1/actions/crm.engagement.quotation-result.read |
atlas quotation-result confirm propose <json> --idempotency-key <key> | Creates an immutable quotation-result recording proposal (accepted, rejected, changes_requested or undecided for one exact revision); accepted/rejected require at least one sourced evidence reference; nothing is recorded until it is confirmed. | POST /assistant/v1/actions/crm.engagement.quotation-result.confirm |
atlas quotation-result confirm inspect <proposal-id> | Inspects one quotation-result recording proposal before deciding. | GET /assistant/v1/proposals/<id> |
atlas quotation-result confirm confirm <proposal-id> --idempotency-key <key> | Records the confirmed answer; accepted/rejected run the existing guarded quotation lifecycle and answer with its canonical state. | POST /assistant/v1/proposals/<id>/confirm |
atlas quotation-result confirm reject <proposal-id> --idempotency-key <key> | Closes the proposal without recording anything. | POST /assistant/v1/proposals/<id>/reject |
atlas sample-selection read <customer-id> [case-id] | One customer's sample-selection cases with their latest confirmed selection result, or one case with its full observation history. | POST /assistant/v1/actions/crm.engagement.sample-selection.read |
atlas sample-selection confirm propose <json> --idempotency-key <key> | Creates an immutable sample-selection result proposal (selected, not_selected or pending for one sample, with the product decision or explicit not-provided); nothing is recorded until it is confirmed. | POST /assistant/v1/actions/crm.engagement.sample-selection.confirm |
atlas sample-selection confirm inspect <proposal-id> | Inspects one sample-selection result proposal before deciding. | GET /assistant/v1/proposals/<id> |
atlas sample-selection confirm confirm <proposal-id> --idempotency-key <key> | Records the confirmed result; a final selected/not_selected stops only that sample's selection follow-up. | POST /assistant/v1/proposals/<id>/confirm |
atlas sample-selection confirm reject <proposal-id> --idempotency-key <key> | Closes the proposal without recording anything. | POST /assistant/v1/proposals/<id>/reject |
atlas order-shipment read <customer-id> [case-id] | One customer's shipment cases under their A09 order identities with the latest confirmed progress and its as-of time, or one case with its full observation history. | POST /assistant/v1/actions/crm.engagement.order-shipment.read |
atlas order-shipment confirm propose <json> --idempotency-key <key> | Creates an immutable shipment progress proposal (in_transit, exception or delivered for one shipment under its order identity, with the carrier/tracking reference or an explicit unknown); nothing is recorded until it is confirmed. | POST /assistant/v1/actions/crm.engagement.order-shipment.confirm |
atlas order-shipment confirm inspect <proposal-id> | Inspects one shipment progress proposal before deciding. | GET /assistant/v1/proposals/<id> |
atlas order-shipment confirm confirm <proposal-id> --idempotency-key <key> | Records the confirmed progress; a delivered status stops only that shipment's follow-up. Never queries a carrier. | POST /assistant/v1/proposals/<id>/confirm |
atlas order-shipment confirm reject <proposal-id> --idempotency-key <key> | Closes the proposal without recording anything. | POST /assistant/v1/proposals/<id>/reject |
atlas platform-sales read <customer-id> [--limit <1-100>] [--cursor <cursor>] | Reads one customer's recorded platform-sales review observations newest-first — each measure with its reported/estimated/missing classification, evidence, method or reason, the reused A11 check-in evidence counted once, and the like-for-like comparison groups (separate groups are never totalled). | POST /assistant/v1/actions/crm.engagement.platform-sales.read |
atlas platform-sales prepare propose <json> --idempotency-key <key> | Proposes preparing one platform-sales review draft — the confirmed reported/estimated/missing classification per platform with cited evidence, asking the customer to confirm estimates or fill gaps. Preparing never sends and never queries an external platform. | POST /assistant/v1/actions/crm.engagement.platform-sales.prepare |
atlas platform-sales prepare inspect <proposal-id> | Inspects one platform-sales prepare proposal, including the customer and recipient it would ask. | GET /assistant/v1/proposals/<id> |
atlas platform-sales prepare confirm <proposal-id> --idempotency-key <key> | Confirms the prepare — one cited review draft per month (occurrence psales:<customer_id>:<YYYY-MM>) waits in the decision queue; a foreign or withdrawn source refuses. | POST /assistant/v1/proposals/<id>/confirm |
atlas platform-sales prepare reject <proposal-id> --idempotency-key <key> | Closes the prepare proposal without preparing any draft. | POST /assistant/v1/proposals/<id>/reject |
atlas platform-sales record propose <json> --idempotency-key <key> | Proposes recording one versioned platform-sales observation — every measure keeps its classification: a reported value cites its source, an estimate names its method and supporting evidence, a missing states its reason; labels never merge and reused A11 check-ins are cited, never copied. Nothing is applied until confirmed. | POST /assistant/v1/actions/crm.engagement.platform-sales.record |
atlas platform-sales record inspect <proposal-id> | Inspects one platform-sales record proposal, including the classified measures it would save. | GET /assistant/v1/proposals/<id> |
atlas platform-sales record confirm <proposal-id> --idempotency-key <key> | Confirms the record — the observation is saved as a NEW versioned row; recording one occurrence never touches later recurring periods, and no external platform is ever queried. | POST /assistant/v1/proposals/<id>/confirm |
atlas platform-sales record reject <proposal-id> --idempotency-key <key> | Closes the record proposal without recording anything. | POST /assistant/v1/proposals/<id>/reject |
atlas tender-promotion prepare propose <json> --idempotency-key <key> | Proposes preparing one tender-specific product-promotion draft from a current confirmed tender brief — supported claims only, unsupported requirements named; communication only, never a bid submission. | POST /assistant/v1/actions/crm.engagement.tender-product-promotion.prepare |
atlas tender-promotion prepare inspect <proposal-id> | Inspects one tender-product-promotion prepare proposal before deciding. | GET /assistant/v1/proposals/<id> |
atlas tender-promotion prepare confirm <proposal-id> --idempotency-key <key> | Confirms the proposal; the draft waits in Today's decision queue and nothing is sent. | POST /assistant/v1/proposals/<id>/confirm |
atlas tender-promotion prepare reject <proposal-id> --idempotency-key <key> | Closes the proposal without preparing anything. | POST /assistant/v1/proposals/<id>/reject |
atlas annual-evidence read <customer-id> <year> | The customer's reproducible annual cooperation evidence: status-and-currency transaction groups, activity and the separately dated receivable balance. | POST /assistant/v1/actions/crm.engagement.annual-evidence.read |
atlas releases list [--kind policy|workflow] [--limit 1-50] [--cursor CURSOR] | Current published policy and workflow releases. An empty corpus returns items: []. | POST /assistant/v1/actions/ekb.releases.list |
atlas releases search <query> [--kind policy|workflow] [--limit 1-50] [--cursor CURSOR] | Lexically searches current releases; query is 2–100 characters. Preserve next_cursor to read the next page. | POST /assistant/v1/actions/ekb.releases.list |
atlas releases read <release-id> | One current published release, including its typed citation, immutable version, original-language content and eligibility fields. Reference-only releases retain answerable: false. | POST /assistant/v1/actions/ekb.releases.read |
atlas draft read <customer-id> [draft-id] | The customer's versioned engagement drafts, or one draft with its decision history — the same state the Today review dialog shows. | POST /assistant/v1/actions/crm.engagement.drafts.read |
atlas draft change propose <json> --idempotency-key <key> | Proposes one engagement-draft operation (submit, edit, approve, dismiss, refresh) from JSON; nothing is applied until confirmed and nothing is ever sent. | POST /assistant/v1/actions/crm.engagement.drafts.change |
atlas draft change inspect <proposal-id> | Inspects one engagement-draft change proposal before deciding. | GET /assistant/v1/proposals/<id> |
atlas draft change confirm <proposal-id> --idempotency-key <key> | Applies the engagement-draft operation from the proposal. | POST /assistant/v1/proposals/<id>/confirm |
atlas draft change reject <proposal-id> --idempotency-key <key> | Closes the proposal without applying anything. | POST /assistant/v1/proposals/<id>/reject |
atlas exhibition-context list <customer-id> [--event <event-id>] | The customer's verified exhibition contexts, or one event's record with its confirmation provenance. | POST /assistant/v1/actions/crm.engagement.exhibition-context.read |
atlas exhibition-context create propose <customer-id> --event <id> --name <event-name> --starts-at <epoch-ms> --ends-at <epoch-ms> --timezone <IANA> --venue <venue> --participation-customer <v> --participation-company <v> --booth-party <v> --sources <kind:id,...> --idempotency-key <key> [--booth-label <text>] | Creates an immutable exhibition-context proposal; nothing is recorded until it is confirmed. | POST /assistant/v1/actions/crm.engagement.exhibition-context.create |
atlas exhibition-context create inspect <proposal-id> | Inspects one exhibition-context proposal before deciding. | GET /assistant/v1/proposals/<id> |
atlas exhibition-context create confirm <proposal-id> --idempotency-key <key> | Records the verified exhibition context from the proposal. | POST /assistant/v1/proposals/<id>/confirm |
atlas exhibition-context create reject <proposal-id> --idempotency-key <key> | Closes the proposal without recording anything. | POST /assistant/v1/proposals/<id>/reject |
atlas exhibition-context update propose <customer-id> [same field options] --idempotency-key <key> | Creates an immutable re-confirmation proposal for one existing exhibition record. | POST /assistant/v1/actions/crm.engagement.exhibition-context.update |
atlas exhibition-context update inspect|confirm|reject <proposal-id> --idempotency-key <key> | Inspects, applies or closes one re-confirmation proposal. | GET/POST /assistant/v1/proposals/<id>[/confirm|/reject] |
atlas exhibition-context delete propose <customer-id> --event <id> --idempotency-key <key> | Creates an immutable withdrawal proposal; nothing is withdrawn until it is confirmed. | POST /assistant/v1/actions/crm.engagement.exhibition-context.delete |
atlas exhibition-context delete inspect|confirm|reject <proposal-id> --idempotency-key <key> | Inspects, applies or closes one withdrawal proposal. | GET/POST /assistant/v1/proposals/<id>[/confirm|/reject] |
atlas tender-brief list <customer-id> [--reference <tender-reference>] | The customer's confirmed tender briefs, or one brief with its cited evidence, confirmer, revision and live new-draft eligibility. | POST /assistant/v1/actions/crm.engagement.tender-brief.read |
atlas tender-brief create propose <json> --idempotency-key <key> | Creates an immutable proposal for one confirmed tender brief (reference, title, deadline with IANA zone, requirements each citing confirmed evidence); nothing is recorded until it is confirmed. | POST /assistant/v1/actions/crm.engagement.tender-brief.create |
atlas tender-brief create inspect|confirm|reject <proposal-id> --idempotency-key <key> | Inspects, applies or closes one tender-brief proposal; confirming never creates a quotation, sample, price, bid document or submission. | GET/POST /assistant/v1/proposals/<id>[/confirm|/reject] |
atlas tender-brief update propose <json> --idempotency-key <key> | Creates an immutable re-confirmation proposal; the prior revision is preserved and the new revision becomes the only basis for new promotion drafts. | POST /assistant/v1/actions/crm.engagement.tender-brief.update |
atlas tender-brief update inspect|confirm|reject <proposal-id> --idempotency-key <key> | Inspects, applies or closes one re-confirmation proposal. | GET/POST /assistant/v1/proposals/<id>[/confirm|/reject] |
atlas tender-brief delete propose <json> --idempotency-key <key> | Creates an immutable withdrawal proposal; nothing is withdrawn until it is confirmed. | POST /assistant/v1/actions/crm.engagement.tender-brief.delete |
atlas tender-brief delete inspect|confirm|reject <proposal-id> --idempotency-key <key> | Inspects, applies or closes one withdrawal proposal. | GET/POST /assistant/v1/proposals/<id>[/confirm|/reject] |
atlas dispatch read <customer-id> [dispatch-id] | The customer's engagement dispatch reservations and their attempt outcomes — provider acceptance, definite failure or unknown; never a delivery claim. | POST /assistant/v1/actions/crm.engagement.dispatches.read |
atlas draft send propose <json> --idempotency-key <key> | Proposes dispatching one approved engagement message through the existing email adapter; CRM reserves the message version first, and unknown outcomes are never retried — the same explicit send the Today review dialog performs after approval. | POST /assistant/v1/actions/crm.engagement.drafts.send |
atlas draft send inspect <proposal-id> | Inspects one engagement send proposal before deciding. | GET /assistant/v1/proposals/<id> |
atlas draft send confirm <proposal-id> --idempotency-key <key> | Confirms the send — the explicit human decision behind one reserved provider attempt. | POST /assistant/v1/proposals/<id>/confirm |
atlas draft send reject <proposal-id> --idempotency-key <key> | Closes the proposal without sending anything. | POST /assistant/v1/proposals/<id>/reject |
atlas draft prepare propose <json> --idempotency-key <key> | Proposes preparing one tailored product-solution draft ({customer_id, selection_id, recipient_contact_id}) from a product-evidence selection — at most three recommendations, each tied to a product source and a confirmed customer-fit reason. Missing evidence is named and nothing is applied until confirmed; preparing never sends. | POST /assistant/v1/actions/crm.engagement.tailored-solution.prepare |
atlas draft prepare inspect <proposal-id> | Inspects one tailored-solution prepare proposal, including the assembled recommendations it would pin. | GET /assistant/v1/proposals/<id> |
atlas draft prepare confirm <proposal-id> --idempotency-key <key> | Confirms the prepare — the draft waits in Today's decision queue for review, edit, Copy and an explicit Send. | POST /assistant/v1/proposals/<id>/confirm |
atlas draft prepare reject <proposal-id> --idempotency-key <key> | Closes the prepare proposal without preparing any draft. | POST /assistant/v1/proposals/<id>/reject |
atlas invitation prepare propose <json> --idempotency-key <key> | Proposes preparing one exhibition-invitation draft ({customer_id, event_id, recipient_contact_id}) from the verified exhibition record — event, timing, venue, and the company booth only when confirmed. Unconfirmed participation or a missing recipient is named and nothing is applied until confirmed; preparing never sends. | POST /assistant/v1/actions/crm.engagement.exhibition-invitation.prepare |
atlas invitation prepare inspect <proposal-id> | Inspects one exhibition-invitation prepare proposal, including the verified event facts it would pin. | GET /assistant/v1/proposals/<id> |
atlas invitation prepare confirm <proposal-id> --idempotency-key <key> | Confirms the prepare — the draft waits in Today's decision queue for review, edit, Copy and an explicit Send. | POST /assistant/v1/proposals/<id>/confirm |
atlas invitation prepare reject <proposal-id> --idempotency-key <key> | Closes the prepare proposal without preparing any draft. | POST /assistant/v1/proposals/<id>/reject |
atlas promotion prepare propose <json> --idempotency-key <key> | Proposes preparing one new-product promotion draft ({customer_id, recipient_contact_id}) from the customer's latest approved tailored basis — every promoted product's pinned claim must currently resolve as confirmed, customer-shareable launch evidence through the source-use resolver; an upload, replacement or indexing date never qualifies, and a missing or lapsed attestation is named. Nothing is applied until confirmed; preparing never sends. | POST /assistant/v1/actions/crm.engagement.new-product-promotion.prepare |
atlas promotion prepare inspect <proposal-id> | Inspects one new-product promotion prepare proposal, including the recommendations and launch-evidence claim locators it would pin. | GET /assistant/v1/proposals/<id> |
atlas promotion prepare confirm <proposal-id> --idempotency-key <key> | Confirms the prepare — the draft waits in Today's decision queue for review, edit, Copy and an explicit Send; one draft per customer per month (promo:<customer_id>:<YYYY-MM>). | POST /assistant/v1/proposals/<id>/confirm |
atlas promotion prepare reject <proposal-id> --idempotency-key <key> | Closes the prepare proposal without preparing any draft. | POST /assistant/v1/proposals/<id>/reject |
atlas quotation-draft prepare propose <json> --idempotency-key <key> | Proposes creating one quotation draft ({customer_id, opportunity_id, selection_id, valid_until, currency?}) on an open deal of that customer, quoting the approved product evidence of the named selection. The agent never sets a price: every line lands at unit price 0 for a person to price. Nothing is created until confirmed. | POST /assistant/v1/actions/crm.engagement.quotation-draft.prepare |
atlas quotation-draft prepare inspect <proposal-id> | Inspects one quotation-draft prepare proposal, including the evidence-backed products it would quote. | GET /assistant/v1/proposals/<id> |
atlas quotation-draft prepare confirm <proposal-id> --idempotency-key <key> | Confirms the prepare — exactly one quotation is created in status draft, unpriced and never sent; a person prices it and decides. | POST /assistant/v1/proposals/<id>/confirm |
atlas quotation-draft prepare reject <proposal-id> --idempotency-key <key> | Closes the quotation-draft prepare proposal without creating anything. | POST /assistant/v1/proposals/<id>/reject |
atlas report prepare propose <json> --idempotency-key <key> | Proposes preparing one after-sales survey report ({customer_id, recipient_contact_id, period_start, period_end, selected_source_refs}) from the customer's recorded survey/feedback evidence — every knowledge claim's exact locator must currently resolve as confirmed and customer-shareable through the source-use resolver, response counts are carried per source only where the source supplies one, and missing months are stated as partial coverage. Nothing is applied until confirmed; preparing never sends. | POST /assistant/v1/actions/crm.engagement.after-sales-report.prepare |
atlas report prepare inspect <proposal-id> | Inspects one after-sales report prepare proposal, including the coverage period, selected sources and pinned claim locators it would bind. | GET /assistant/v1/proposals/<id> |
atlas report prepare confirm <proposal-id> --idempotency-key <key> | Confirms the prepare — the draft waits in Today's decision queue for review, edit, Copy and an explicit Send; one draft per customer and period (asr:<customer_id>:<start>:<end>). | POST /assistant/v1/proposals/<id>/confirm |
atlas report prepare reject <proposal-id> --idempotency-key <key> | Closes the prepare proposal without preparing any draft. | POST /assistant/v1/proposals/<id>/reject |
atlas inventory-checkin read <customer-id> [--limit <1-100>] [--cursor <cursor>] | Reads one customer's recorded inventory and sales check-in observations newest-first — product, period and the three distinct measures (inventory quantity with its as-of date, sales quantity with its period, sales amount with its currency), where a missing measure stays null and zero is a value. | POST /assistant/v1/actions/crm.engagement.inventory-sales-checkin.read |
atlas inventory-checkin prepare propose <json> --idempotency-key <key> | Proposes preparing one inventory and sales check-in request draft ({customer_id, recipient_contact_id}) asking the customer for product-specific stock and sales updates for the stated month — the month yields at most one request however often it fires. Nothing is applied until confirmed; preparing never sends. | POST /assistant/v1/actions/crm.engagement.inventory-sales-checkin.prepare |
atlas inventory-checkin prepare inspect <proposal-id> | Inspects one inventory/sales check-in prepare proposal, including the customer and recipient it would ask. | GET /assistant/v1/proposals/<id> |
atlas inventory-checkin prepare confirm <proposal-id> --idempotency-key <key> | Confirms the prepare — the product-specific request draft waits in the decision queue for review, edit, copy and explicit send (checkin:<customer_id>:<YYYY-MM>). | POST /assistant/v1/proposals/<id>/confirm |
atlas inventory-checkin prepare reject <proposal-id> --idempotency-key <key> | Closes the prepare proposal without preparing any draft. | POST /assistant/v1/proposals/<id>/reject |
atlas inventory-checkin record propose <json> --idempotency-key <key> | Proposes recording one versioned inventory/sales check-in observation — the three measures (inventory quantity with its as-of date, sales quantity with its period, sales amount with its currency) stay distinct; a missing measure stays missing, zero is a value, and the product must resolve inside this customer's records. Nothing is applied until confirmed. | POST /assistant/v1/actions/crm.engagement.inventory-sales-checkin.record |
atlas inventory-checkin record inspect <proposal-id> | Inspects one inventory/sales check-in record proposal, including the measures it would save. | GET /assistant/v1/proposals/<id> |
atlas inventory-checkin record confirm <proposal-id> --idempotency-key <key> | Confirms the record — the confirmed figures are saved as a NEW versioned observation; recording one occurrence never touches later recurring periods, and nothing here writes a forecast, purchase order or external stock record. | POST /assistant/v1/proposals/<id>/confirm |
atlas inventory-checkin record reject <proposal-id> --idempotency-key <key> | Closes the record proposal without recording anything. | POST /assistant/v1/proposals/<id>/reject |
atlas cooperation-plan prepare propose <json> --idempotency-key <key> | Proposes preparing one next-calendar-year cooperation plan draft ({customer_id, evidence_year, confirmed_goal_refs, request_id, recipient_contact_id}) from the year’s verified annual cooperation evidence plus explicitly confirmed customer goal facts — the target year is evidence_year + 1, the draft labels the confirmed goals and keeps everything else as 待讨论建议, and it never reads as a quotation, order or budget commitment. Only goal-eligible confirmed facts may be cited: a goal ref that is an internal manual note, a personal contact detail or an internal amount is refused as goal_ref_not_eligible. An empty evidence year or an unresolvable goal is named and nothing is applied until confirmed; preparing never sends. | POST /assistant/v1/actions/crm.engagement.cooperation-plan.prepare |
atlas milestone prepare propose <json> --idempotency-key <key> | Proposes preparing one company-milestone sharing draft ({customer_id, source_id, page_no, ordinal, recipient_contact_id}) from an F08-attested knowledge claim — the exact claim must currently resolve as confirmed and permitted for this customer in the active source version, paired with confirmed customer-fit evidence; a missing approval or fit evidence is named. Nothing is applied until confirmed; preparing never sends. | POST /assistant/v1/actions/crm.engagement.milestone-sharing.prepare |
atlas cooperation-plan prepare inspect <proposal-id> | Inspects one next-year cooperation-plan prepare proposal, including the evidence digest and confirmed goals it would pin. | GET /assistant/v1/proposals/<id> |
atlas cooperation-plan prepare confirm <proposal-id> --idempotency-key <key> | Confirms the prepare — the draft waits in Today’s decision queue for review, edit, Copy and an explicit Send; the caller’s request id is the whole identity, so a repeat answers with the same result and a new request waits while one is pending. | POST /assistant/v1/proposals/<id>/confirm |
atlas cooperation-plan prepare reject <proposal-id> --idempotency-key <key> | Closes the prepare proposal without preparing any draft. | POST /assistant/v1/proposals/<id>/reject |
atlas followup propose <json> --idempotency-key <key> | Proposes creating exactly one Task from an accepted engagement follow-up proposal (optional title, due date and owner edits) from JSON; nothing is created until confirmed. | POST /assistant/v1/actions/tasks.engagement_followup.create |
atlas followup inspect <proposal-id> | Inspects one follow-up task proposal before deciding. | GET /assistant/v1/proposals/<id> |
atlas followup confirm <proposal-id> --idempotency-key <key> | Creates the follow-up task; a repeat returns the same Task. | POST /assistant/v1/proposals/<id>/confirm |
atlas followup reject <proposal-id> --idempotency-key <key> | Closes the proposal without creating anything. | POST /assistant/v1/proposals/<id>/reject |
atlas schedule read <customer-id> [schedule-id] | The customer's accepted engagement schedules with their next due occurrence and due basis, or one schedule with its occurrence history. | POST /assistant/v1/actions/crm.engagement.schedules.read |
atlas schedule change propose <json> --idempotency-key <key> | Proposes one versioned engagement-schedule operation (accept, pause, cancel, update) from JSON — including the event-relative pre-exhibition product promotion anchored on a verified exhibition event; nothing is applied until confirmed and saving prepares or sends nothing. | POST /assistant/v1/actions/crm.engagement.schedules.change |
atlas schedule change inspect <proposal-id> | Inspects one engagement-schedule change proposal before deciding. | GET /assistant/v1/proposals/<id> |
atlas schedule change confirm <proposal-id> --idempotency-key <key> | Applies the engagement-schedule operation from the proposal. | POST /assistant/v1/proposals/<id>/confirm |
atlas schedule change reject <proposal-id> --idempotency-key <key> | Closes the proposal without applying anything. | POST /assistant/v1/proposals/<id>/reject |
atlas preparation read <customer-id> [preparation-id] | The customer's engagement preparation run states — prepared, skipped, failed or stopped per schedule occurrence — or one preparation. | POST /assistant/v1/actions/crm.engagement.preparation.read |
atlas preparation retry propose <json> --idempotency-key <key> | Proposes re-driving one proven failed engagement preparation through the same registry; nothing is applied until confirmed and retry never sends. | POST /assistant/v1/actions/crm.engagement.preparation.retry |
atlas preparation retry inspect <proposal-id> | Inspects one engagement-preparation retry proposal before deciding. | GET /assistant/v1/proposals/<id> |
atlas preparation retry confirm <proposal-id> --idempotency-key <key> | Re-drives the failed preparation from the proposal. Retry never sends. | POST /assistant/v1/proposals/<id>/confirm |
atlas preparation retry reject <proposal-id> --idempotency-key <key> | Closes the proposal without applying anything. | POST /assistant/v1/proposals/<id>/reject |
atlas external call <external-action-id> <json> [--idempotency-key <key>] | Calls one classified external tool by its external.<connectionId>.<toolName> id — the same id your organisation's classified, enabled tools carry on every surface. A read runs and returns its result; an effect is proposed and never reaches the remote system until a separate confirmation. The CLI keeps no list of its own: a tool classified this morning works here this afternoon, and an id that is not of this shape is refused before anything leaves the machine. | POST /assistant/v1/actions/<id> |
atlas external proposal <proposal-id> --idempotency-key <key> | Inspects one pending external-tool effect proposal before deciding. | GET /assistant/v1/proposals/<id> |
atlas external confirm <proposal-id> --idempotency-key <key> | Explicitly confirms one pending external-tool effect proposal; the remote system is called exactly once. | POST /assistant/v1/proposals/<id>/confirm |
atlas external reject <proposal-id> --idempotency-key <key> | Explicitly rejects one pending external-tool effect proposal; the remote system is never called. | POST /assistant/v1/proposals/<id>/reject |
atlas team inspect and atlas external call are not the only way a classified external tool gets used: a hire's own run — triggered here through atlas team propose work or observed afterward through atlas team inspect — calls a classified read tool enabled for its role under the same permission-level rules the REST manual's "External tools during a hire's run" describes, capped by the shared maxExternalReadCalls ceiling; a classified effect is never called by a run at any permission level, including auto_pilot.
For example: atlas releases list --kind policy --limit 20, atlas releases search "报价" --cursor "…", and atlas releases read mrel_1. --pretty only indents the same atlas.action.v1 envelope. Missing scope or a revoked token returns the server's forbidden envelope and exit 3; an unavailable upstream returns its failure envelope and does not become an empty result.
# completed: inspect every citation, release field, and next_cursor unchanged
atlas releases list --kind policy --pretty
# an authorised organisation with no current releases
{"schema_version":"atlas.action.v1","action":"ekb.releases.list","status":"completed","data":{"items":[],"next_cursor":null}}
# missing scope or a revoked token: exit 3, never an empty completed result
{"schema_version":"atlas.action.v1","action":"ekb.releases.list","status":"forbidden","error":{"code":"insufficient_scope"}}
# unavailable upstream: preserve the failure envelope and retry convention
{"schema_version":"atlas.action.v1","action":"ekb.releases.list","status":"retryable_failure","error":{"code":"storage_unavailable"}}
Local commands with no REST call: atlas version, atlas config set|get base-url, atlas auth login|status|logout.
The atlas team commands are governed by the AI team release switch as well as by scopes. A platform superadmin controls it at Platform → Feature visibility under the ai-team key, which is hidden until they release it. While it is hidden, every atlas team command — over the CLI, the REST actions behind it, or MCP — is refused with agent_team_restricted, and scheduled Account Manager, Sales Assistant and Pre-sale Assistant work starts nothing new. No other command is affected.
New Account Manager reviews use the pinned complete-json-bytes.v1 source pack: each analysis and approved-draft pass receives only complete authorised records within a 24,000-byte JSON envelope. Drafts receive only approved evidence. If analysis records do not fit, Atlas produces a structurally scoped partial review directly from the retained excerpts and exposes no free-form model prose or draft; if only approved draft evidence is omitted, no draft is prepared. The result records an incomplete-evidence limitation and never presents itself as a complete account review. If no analysis record fits, no review is produced. Run and trace diagnostics report counts only, never copied source bodies. Older pinned runs and Sales Assistant portfolio work retain their legacy source selector.
Repository evaluation operations
Selected-case diagnostics use the existing platform operator session and real agent trial path. They always remain baseline-ineligible, including all-pass or all-60 selections. Full golden remains the default 60 × 3 baseline route. Sealed method trials use this same private queue: Governance retains frozen descriptor, ordinal, billed-run and attempt identities, and creates no Agent TeamStore run. This adds no public launcher or admission path.
bun scripts/eval-campaign.ts start --key diagnostic-a --purpose diagnostic --cases entry-01,entry-03
bun scripts/eval-campaign.ts drain CAMPAIGN_ID
bun scripts/eval-campaign.ts report CAMPAIGN_ID
bun scripts/eval-campaign.ts summary REPORT_ID
bun scripts/eval-campaign.ts compare FROM_REPORT_ID TO_REPORT_ID
bun scripts/eval-campaign.ts start --key full-golden-a
To trial one model route, add --model-route glm_only or --model-route deepseek_only to start, for example bun scripts/eval-campaign.ts start --key route-deepseek-a --purpose diagnostic --cases entry-01,entry-03,entry-05 --model-route deepseek_only. Each trial world's own evaluation organisation is set to that Atlas-managed preset before its first Assistant run; your organisation's model policy is not changed. Any other value is refused before a request is sent. The summary shows the requested route beside the observed model and lists any mismatched trial; a trial whose route is unavailable fails rather than running on another model. A different route needs a new --key: reusing a key with another route is refused as a conflict.
To try a feature switch inside an evaluation only, add --feature-preview KEY to start, for example bun scripts/eval-campaign.ts start --key plan-prefix-on --feature-preview assistant-plan-prefix. The switch is turned on for each trial world's own evaluation organisation before its first Assistant run and removed when the world is cleaned up; your organisation's switches are not changed. A key that is not a registered feature is refused before a request is sent. To measure a switch, run one campaign without the option and one with it on the same deployed Workers, report each, then run compare: the option does not change the comparison compatibility key. A different key needs a new --key.
To compare the two routes, run one full golden campaign per route on the same deployed Workers, report each, then run bun scripts/eval-campaign.ts compare-route GLM_REPORT_ID DEEPSEEK_REPORT_ID. It shows, per route, passed cases on pass@1 and pass^3, the cases that changed (safety cases that regressed are listed separately), p50/p90 time per trial, p50/p90 billed time per model call, and model calls per trial. If the reports differ in anything other than the route, it names the differing field and shows no figures. It reports only; you apply the decision rule and switch the route in Settings → Model keys yourself.
Comparisons require identical pinned selection semantics, corpus, rubric, scorer, target and model-policy identity, plus internally stable evidence. They show fixed/regressed/unchanged per case for pass@1 and pass^3; incompatibilities withhold all deltas. Version 1 stored report bytes and digests remain unchanged. See docs/evaluation-operations.md for recovery and failure evidence.
These Bun commands require an approved Atlas platform operator session — a superadmin on the platform roster — supplied by a private ATLAS_SESSION_COOKIE_FILE. A tenant administrator session is refused with 403 and learns nothing about who holds the target. They are repository operator commands, not delegated-token CLI or MCP capabilities.
bun scripts/eval-reservation.ts status
bun scripts/eval-reservation.ts reconcile OWNER_TOKEN
scripts/deploy-staging.sh governance web
scripts/deploy-web-staging.sh
Campaign starts require a stable idempotencyKey in the JSON body. Repeat the same key and payload to recover missing scheduling; a changed payload conflicts. Campaign status includes frozen admission inventory. A drain request names campaignId.
A reservation never expires into release. Campaign reconciliation requires terminalisation, settled execution and verified pillar cleanup. An operator who does not hold the target reads the holder, the acquisition time and the current settlement blocker rather than an opaque reserved state; the owner token is never disclosed. An operator may attest settlement for a holder who has gone offline, against those same unchanged proofs, and the attesting operator is recorded. Interrupted deployment reconciliation requires explicit subprocess and remote publication settlement evidence plus that reservation's own owner token; the system cannot independently observe a killed local process. Missing reservation state refuses publication. Staging publications carry a freshness guarantee (#2597): a Worker with prebuilt output — atlas-web's SPA bundle — is built inside the shared reservation at the stamped checkout and publication is refused when that build fails, while Workers bundled from source rely on the clean stamped checkout; a /health stamp proves the checkout, never the served bundle. The new migration and API must be established before initial use; no bootstrap bypass is provided.
CLI refusals include the retained campaign ID and recovery details. Recovery preserves the original result, traces and cleanup from an execution settlement without repeating model work; age alone never settles an admitted execution.
Fictional regression packs / 虚构回归用例包
Local administrator authoring: bun scripts/eval-pack.ts scaffold SOURCE PACK_ID en|zh-CN OWNER OUTPUT, then digest DRAFT, validate DRAFT [VERSIONS_ROOT] and publish DRAFT VERSIONS_ROOT. No source conversation is fetched. Product and Sales must record real reviews bound to the exact semantic digest and version. Validation checks format and binding; human repository review verifies authority. The deployed registry is currently empty; the canary draft is unreviewed.
After review and deployment, select a pack with bun scripts/eval-campaign.ts start --key KEY --purpose diagnostic --cases ID,ID,ID --pack-id PACK --pack-version VERSION --pack-digest SHA256. Any identity mismatch refuses before world/model usage. Supplemental reports preserve source/review provenance and remain baseline-ineligible. No runtime uploads or remote MCP authoring tools are supported.
Propose, confirm, reject
Suggest one unsaved method edit
atlas team propose '{"operation":"teaching.suggest","hireId":"amhire_example","revision":1,"teachingSuggestion":{"runId":"amrun_example","excerpt":"No clear question.","expected":"Ask for a decision date."}}' --idempotency-key suggest-example-1
atlas team confirm <proposal-id> --idempotency-key confirm-suggest-1
Confirmation returns one unsaved data.suggestion with bounded proposedInstructions, rationale and inputDigest, plus top-level runId/hireId. Scope defaults to account. Review it before submitting a separate teaching.create. The attempt requires current source access and credits. Replay never generates again; an unrecoverable interrupted attempt returns result_unavailable. A fresh explicit proposal is separately charged. See the REST reference for input limits, organisation restrictions and retention.
- Propose with a key you choose:
atlas customer create propose "Acme" --idempotency-key acme-1. The response isawaiting_confirmationand carriesconfirmation.id. - Inspect:
atlas customer create inspect <id>. Checkintended_*,evidence, andexpires_at. - Decide with a second key:
atlas customer create confirm <id> --idempotency-key acme-1-confirm, orreject. - Re-running a confirm with the same key returns the original result with
meta.repeated: trueand no second effect.
Proposals expire 15 minutes after creation. Confirming an expired or rejected proposal returns conflict. Task proposals follow the same steps with atlas task ….
REST
Open the REST reference for headers, request examples and response envelopes.
Output and exit codes
stdout is the JSON envelope, one document per command. --pretty indents it. Diagnostics go to stderr. There is no generic --yes; confirmation is always a separate command.
| Exit | Envelope status |
|---|---|
| 0 | completed, including a repeated result. |
| 2 | Local usage or configuration error. No request was sent. |
| 3 | forbidden: missing, expired, or revoked token, or missing scope. |
| 4 | awaiting_confirmation: a proposal was created and needs confirm or reject. |
| 5 | rejected or conflict. |
| 6 | retryable_failure: retry with the same idempotency key. |
| 7 | terminal_failure or a response that does not match the envelope. |
Token handling
- Never pass a token as a command argument. Use
atlas auth loginorATLAS_ACCESS_TOKEN. The CLI never prints or logs it. - In CI and scripts, set
ATLAS_ACCESS_TOKENfrom the runner's secret store. It takes precedence over Keychain. - Mint tokens with only the scopes the job needs. Tokens live at most 30 days and can be revoked by an admin.
- Expiry and revocation are decided by the server. The CLI returns the envelope and exits 3.
No analytics, remote fonts, external scripts, or secret-bearing assets are included in this manual.
Troubleshooting
| Symptom | Fix |
|---|---|
Exit 3, authentication_required | Run atlas auth status to see which source is active. Mint a new token and log in again, or reset ATLAS_ACCESS_TOKEN. |
Exit 3, insufficient_scope | Mint a token that includes the scope in the error message. |
| Exit 2, unknown command | Run atlas version. The staging.3 archive lacks customer search and customer create. |
| Exit 5 on confirm | The proposal expired or was rejected, or the idempotency key was reused with different input. Propose again. |
| Exit 6 or unreachable endpoint | Check atlas config get base-url, then retry with the same idempotency key. |
| Checksum mismatch | Delete the archive and download the release again. Do not install. |
| Login unavailable on Linux or Windows | Persistent login is macOS only. Set ATLAS_ACCESS_TOKEN. |
Customer profiles, imports and sampling stages
Customer profile reads include website, background and optional main_markets, brands and products. Organisation and customer-owner authorization still applies. Maintain these facts through REST import or the customer editor.
Task privacy
Self-created, self-assigned tasks default to private, including tasks linked to a customer. Only their assignee can access them; managers and admins have no override. A team task is visible to its assignee, creator and organisation management, never unrelated representatives. These boundaries also apply to filters, source retries, reminders and agent calls. Scheduled shared context excludes private tasks.
Governed named human teams
Named human teams use Auth's shared team functions on every surface. New delegated grants auth:teams:read and auth:teams:write are independent: write permits proposing and confirming a reviewed change, not the read tool. Existing tokens gain no authority; request each grant explicitly through POST /auth/tokens. Minting and every read/propose/confirm/recovery require current active owner/admin membership and the corresponding live members:read/members:write capability. Revoked, expired, role-downgraded or unsupported platform/scheduled/sync credentials cannot act.
MCP: auth_teams_read, auth_teams_change_propose, auth_teams_change_confirm, auth_teams_change_reject. Propose takes the change fields plus idempotency_key; confirm/reject take proposal_id and idempotency_key. CLI: atlas organisation teams read '<json>'; atlas organisation teams propose '<json>' --idempotency-key KEY; atlas organisation teams confirm PROPOSAL_ID --idempotency-key KEY; atlas organisation teams reject PROPOSAL_ID --idempotency-key KEY.
REST action transport: POST /assistant/v1/actions/auth.teams.read, POST /assistant/v1/actions/auth.teams.change, and existing POST /assistant/v1/proposals/:id/confirm or /reject. Send Idempotency-Key for proposals and decisions. Results use the existing atlas.action.v1 envelope and the same Auth team/assignment payload. Team changes are administration proposals; policy holds, expiry, rejection and current authority apply before effects. A proposal is bound to its original principal, organisation, normalized input, revision basis and idempotency key. Delegated tokens cannot override policy; an owner decision remains governed by the existing policy flow.
{"operation":"list","status":"active","limit":50}
{"operation":"team","team_id":"TEAM_ID","limit":50}
{"operation":"assignment","email":"[email protected]"}
{"operation":"create","name":"Sales"}
{"operation":"rename","team_id":"TEAM_ID","name":"Customer Success","expected_revision":1}
{"operation":"archive","team_id":"TEAM_ID","expected_revision":2}
{"operation":"assign","email":"[email protected]","team_id":"TEAM_ID","expected_assignment_revision":0,"expected_team_revision":1}
{"operation":"assign","email":"[email protected]","team_id":null,"expected_assignment_revision":1}
Read lists retain status active (default), archived or all, stable ID/email order, opaque cursor, default 50 and maximum 100 rows. Return next_cursor unchanged. Names are trimmed, nonempty and at most 80 Unicode characters. Unknown/extra fields are rejected. Rename/archive require the current expected_revision; assignment requires expected_assignment_revision and, for a non-null destination, expected_team_revision. Removing an assignment must omit the destination revision. Archive requires an empty active team. No role or global membership mutation is exposed.
Auth commits effect, audit and operation receipt atomically. After a timeout/lost response, retry the same proposal decision/key: recovery returns only the matching original result after live admission and never dispatches again, even if that already-applied proposal subsequently expired. A missing receipt cannot bypass expiry. Reused keys/input or stale revisions conflict; revoked authority is forbidden; unavailable authority/storage is retryable failure, never an empty success. All responses are no-store. Receipt migration 0023_organisation_team_operation_receipts.sql, scopes and Auth producer deploy before Agent adapters; public session team REST stays compatible. The binding-only /internal/teams/actions/read and /change/prepare, /change/execute, /change/recover require exact request/body-bound assertions and have no public alias.
A confirmation timeout may leave Auth still committing. The proposal stays pending; rejection and expiry return a conflict while its outcome is unresolved. Retry confirmation only recovers the original receipt and never redispatches. If no receipt becomes available, the proposal remains pending rather than assuming the effect failed.
Workbench customer analytics through MCP and CLI
The read actions crm.workbench.customer_summary.read and crm.workbench.customer_contributors.read use the existing crm:read grant. Ordinary tenant sessions and explicitly granted delegated tokens resolve current company, assigned-team, self or empty scope in Auth before the CRM query and again before returning. A manager without an active named-team assignment receives explicit empty scope. No team-administration grant or confirmation is needed.
MCP exposes crm_workbench_customer_summary_read and crm_workbench_customer_contributors_read as read-only tools. Summary input is exactly {}. Contributors input is {"metric":"customers","scope_revision":"<scope_revision>","limit":50}, with optional opaque cursor. Metrics are customers, active, at_risk and open_pipeline; limit defaults to 50 and accepts 1–100. Extra fields and caller-supplied organisation, owner or scope hints are rejected.
atlas workbench customers summary
atlas workbench customers contributors '{"metric":"open_pipeline","scope_revision":"<revision>","limit":50}'
CLI uses POST /assistant/v1/actions/crm.workbench.customer_summary.read and POST /assistant/v1/actions/crm.workbench.customer_contributors.read, returning the existing action envelope. Forward cursor bytes unchanged and use the matching scope revision. Each contributor page refreshes all four totals from the same current CRM snapshot as its items; pagination does not freeze a historical snapshot.
Results retain customer-current-book-v1, public scope metadata and evaluated_at. Pipeline amount_by_currency keeps whole currency units in separate groups; unknown_amount_count counts missing amounts. Pipeline items identify both customer_id/customer_name and engagement name/ID. The internal owner roster is never returned.
Responses use Cache-Control: no-store. Invalid input/cursor is 400; credential and authority denials retain 401/403; changed scope is 409 scope_changed (read a fresh summary); an unavailable Auth/CRM service is 503, never a fabricated zero. Platform, scheduled and sync callers are unsupported. Public session CRM routes remain session-only; bearer clients use the governed actions. Deploy the exact Auth allowlists and CRM assertion producers before Agent adapters; no new migration or scope is required.
Knowledge pages and source access
These interfaces are implemented but inactive by default. Exposure requires a complete target census and accepted Product impact review. This reference does not establish staging or production availability.
Offline CLI help reserves this command syntax. Server discovery and proposal admission require a fresh Knowledge-owner readiness check; help output does not establish availability.
atlas pages list '{"limit":50}'
atlas pages read '{"pageId":"PAGE_ID"}'
atlas pages revisions list '{"pageId":"PAGE_ID"}'
atlas pages revisions read '{"pageId":"PAGE_ID","revision":1}'
atlas pages create '<PageCreate JSON>' --idempotency-key PROPOSAL_KEY
atlas pages update '<PageUpdate JSON plus pageId>' --idempotency-key PROPOSAL_KEY
atlas pages decide '<PageDecision JSON plus pageId>' --idempotency-key PROPOSAL_KEY
atlas pages proposal PROPOSAL_ID
atlas pages confirm PROPOSAL_ID --idempotency-key CONFIRMATION_KEY
atlas pages reject PROPOSAL_ID --idempotency-key REJECTION_KEYStart with a visible page read, then propose the complete JSON input and review it before confirming. After confirmation, inspect page and the readable revision. A contributor editing an approved company page may receive the prior approved projection and revision:null. Inactive page routes return 404.
ekb.page.list, ekb.page.read, ekb.page.create, ekb.page.update, ekb.page.decide, ekb.page.revisions.list, ekb.page.revisions.read.
Personal pages remain owner-only. Company contributors need current knowledgeFiles write permission; review needs knowledge write permission. Ordinary company readers see only the approved revision; view=current requires author or reviewer access. Every read and retry rechecks all sources. Withdrawn, corrected or unreadable sources withhold the entire derivative, including summaries, citations, related titles and counts. Legacy content without complete lineage and Sales-dependent derivatives remain unavailable. The core fallback uses current original passages for lexical retrieval; semantic-only search returns source_unavailable, and unverified vector ranking does not enter model context. Original file titles, passages, downloads and existing permissions are preserved.
Reads require ekb:read. Content-returning delegated writes require both explicitly granted ekb:read and ekb:write. The body idempotencyKey identifies the EKB operation; proposal and confirmation idempotency_key values are separate. Retry with the identical body and key. A 409 conflict requires reading and reviewing the current revision again. A 404 source_unavailable does not identify inaccessible sources; 503 read_unavailable means the read could not be established. Internal adapters may use the signed receiptOnly=true query to recover an existing receipt only; an absent receipt returns 404 and never creates an operation.
Merge customers
Current customer access is required. Reads and review use crm:read; commit, resume and cancel use crm:write, with CRM's current role and customer permissions still enforced. The verified credential supplies the organisation and actor; inputs cannot include org_id. This describes the local candidate capability, not production availability; keep it disabled until the complete journey passes acceptance.
- Select 2–10 customers. Start a read-only review with
customer_idsand optionalsurvivor_id. - Edit the returned
selectionand review the complete selection again. Inspect each value's source and timestamp, conflicts, related records and owner consequences.latestdoes not replace required explicit decisions. Resolve ties, primary-contact and plan choices, and other blockers first. Values inchoicesandcustom_field_sourcesare source customer IDs. - Show the human the final name, retained original count, owner and access changes, then obtain explicit confirmation. Before sending, durably save one unique
request_id, the complete selection,preview_digestandexpires_at. Addconfirmed:truewhen committing; a generic--yescannot skip review. - Inspect the same operation until
state:completeconfirms publication.pendingis still processing;blockedneeds the stated recovery. After response loss, look up the samerequest_idinstead of creating a new request. Resume only the existingoperation_id, without replacement choices.
Expired review or changed data requires another review, never a bypass of preview_digest. Cancellation can be requested only before apply starts; trust state:cancelled. Cancellation is not Undo. Continue recovery after apply has begun. After completion, inspect linked retained read-only originals through merge history. Current access still filters their contents; automatic Undo is unavailable.
atlas customer merge preview '{"customer_ids":["CUSTOMER_A","CUSTOMER_B"]}'
atlas customer merge preview 'FULL_SELECTION_JSON'
atlas customer merge commit 'CONFIRMED_COMMIT_JSON'
atlas customer merge request REQUEST_ID
atlas customer merge status OPERATION_ID
atlas customer merge resume OPERATION_ID
atlas customer merge cancel OPERATION_ID
atlas customer merge history SURVIVOR_ID
atlas customer merge original OPERATION_ID SOURCE_IDReplace placeholders with complete JSON from review. Commit JSON contains every selection field plus request_id, preview_digest, expires_at and confirmed:true. The JSON request_id is this workflow’s idempotency identity; --idempotency-key is not accepted. Stdout preserves the raw REST protocol object instead of atlas.action.v1. Pending or unknown response exits 6, blocked exits 5, and complete or cancelled exits 0. Exit 6 is not an instruction to resubmit.
Complete fields and REST paths
Keep the same request_id through 409 merge_blocked, preview_stale, preview_expired and request-lookup 404. A concurrent submission can already have been admitted. After a fresh review and explicit confirmation, retry with that same key. On idempotency_conflict, look up the same key and recover the existing operation instead of replacing its plan. Retire the key only after confirmed state:complete or state:cancelled.
Search Atlas
Use atlas.search to find records and content your identity can read. It performs no writes, sends or AI calls. This describes the implementation candidate; it does not establish live deployment or acceptance.
atlas search "电机" --kind customer,task --limit 10Supply query as 1–100 UTF-16 units without control characters. Optional kinds selects unique categories; limit is 1–20 results per category (default 10). Categories: customer, contact, opportunity, task, work, mail, document, knowledge, chat, assistant.
The atlas.action.v1 envelope carries data.query, items and sections. Every requested category reports complete, unavailable or error. hasMore counts only further accessible matches. A failed category does not erase successful categories. Retry the same query after a failure.
Chat search uses GET /crm/communications/authority/readable?strict=1. A verified denial or empty grant set returns 200 {items:[]}; unavailable or malformed authority and storage failures return 503. Search reports these failures as error with no chat items or counts. It rechecks mailbox grants before returning results; changed grants also retire the category. Existing authority probes without this option retain their empty-set behavior.
Entry retains the existing crm:read scope. Ordinary member sessions carry this transport scope independently of CRM settings permissions; each owning service still enforces its access rules. Tasks additionally require tasks:read; documents and Knowledge require ekb:read. EKB-only or Tasks-only tokens use the existing domain actions. Delegated tokens cannot read private chat or work through this action; those categories retain ordinary-session access. assistant is unavailable until the separately owned identity backend is available. An incomplete or stale mail index returns mail as unavailable; subject or excerpt matches never masquerade as complete body search.
Each result contains kind,id,title and, when needed, subtitle,snippet,customerId,connectionId,threadKey,fileId,sourceId. Titles and subtitles are bounded to 200 units; snippets to 300. Results contain no arbitrary URLs or execution callbacks. Matching precedes limits in the owning service and retains organisation, owner, task privacy, mailbox, conversation-source and Knowledge visibility checks.
After the separately authorized migration 0167_comm_mail_search_text.sql and CRM release, the existing CRM scheduled handler automatically invokes runScheduledMailContentBackfill on configured cron ticks for Inbox-enabled organisations. Each tick processes at most 10 sources within a 5-second budget, using a durable cursor that resumes and retries without blocking later sources. Missing schema leaves this maintenance inactive. Inspect the count-only [crm.cron] mail content backfill log; traversal completion does not prove every body was indexed. Unfinished, failed or stale readable sources keep mail unavailable. New ingestion indexes canonical text; source changes, discard and deletion invalidate stale text. Search never triggers indexing. Verify deployment identity and readable-corpus readiness separately before relying on live search.
Email receipt and legacy backfill sources use unique SHA-256-bound immutable artifact keys. Deploy the producer, attachment/reply reader compatibility and version-2 index/backfill together. Legacy version-1 indexes remain unavailable until rebuilt. Backfill freezes the current retained snapshot; it cannot reconstruct bytes already overwritten by the historical mutable-key race. Original legacy blobs are retained. Any rollback must preserve reader compatibility with the new keys; prefer a forward repair.
Automatic Assistant capabilities
New named assistants automatically use Atlas’s existing task-time capability resolution: enabled organization skills, callable connected plugin tools, built-in functions and authorized knowledge retrieval. Published organization guidance and the current user’s active memory resolve through their existing owners. No manual assignment, installation, new permission or memory publication is performed.
The directory advertises setupSchema: atlas.assistant-setup.v1. A clear bilingual job name infers focus; an unclear or conflicting name returns 400 assistant_purpose_required before a proposal. Supply optional identity.purpose as one trimmed description of 1–400 characters without control characters. Review the effective focus, then explicitly confirm. A saved custom identity may include setup: {mode: automatic, focus, source: name|clarified}; legacy identities omit it. Avatar-only edits retain focus; a changed name infers again or asks for clarification, and an explicit purpose overrides it. Focus steers task skill selection as untrusted user data; it grants no authority.
Shared governance traces retain run identity, usage and policy metadata without private conversation content, plans or tool inputs and outputs. Owner conversation history remains available.