Turn a goal in plain words into a build plan
onchain_agent_build_planUSE WHEN someone describes the onchain agent they want and needs a plan they can act on rather than advice. Composes the other tools into one answer: the goal restated, a stack of REAL directory listings (each with its Sato Score, liveness, observed check record and sato_url), the deploy spec for every item that publishes one, a Preflight verdict per item, the first action when the goal implies one (a swap route, or a prepared token-launch config), the questions the user still has to answer, and the next steps.
RULE ENFORCED: nothing in a plan is invented. Every component is a listing that exists; every number names the field it was read from; null is unknown and never zero. A Sato Score measures how open, active and verifiable a project is — it is not a security review, a quality judgment or a statement about returns. A Preflight unknown means Sato Hub holds no record, not that something is wrong.
OURS, LABELLED: on a trading or swap goal the plan also carries an execution block for Sato OS — Sato Hub's OWN self-hosted trading OS, which we sell. It always carries ours: true and says "built by Sato Hub". It is NOT a stack pick: it fills the execution layer (where the stack runs), it is never ranked against a directory listing, and no listing loses a position to it. On any other intent execution is null.
SKILLS: a plan also carries up to three crypto-relevant agent SKILLS matching the goal, each with the static disclosure of what its own text declares and does — hosts it names, keys it handles, credentials it asks for, remote scripts it pipes into a shell — and its own Preflight verdict under the S-rules. A skill is a document an agent follows, so this is the part a plan must not leave out. A DISCLOSURE DESCRIBES: it never says safe, and a scan that matched nothing is reported as matching nothing rather than as a pass.
NON-CUSTODIAL: this tool never holds keys, signs, deploys or moves funds. A swap first-action carries a quote taken at a NOMINAL size — never the caller's size, which is the caller's to choose — and a launch first-action carries a config to read and sign yourself, with the fee disclosed before anything is signed.
Returns (json): { goal, restatement, intent, intent_signals, chain, chain_source, budget_usd, constraints, matched_use_cases, stack: [{ slot, slot_label, slug, name, sato_url, verify_url, trust_score, trust_tier, liveness_ok, observed_success_pct, install_verified, why, deploy_spec, preflight: { verdict, rule, evidence, reason } }], skills: [{ id, name, registry, sato_url, installs, findings, hosts_contacted, disclosure, preflight, why }], execution, gaps, first_action, open_questions, next_steps, citation_ask, caveat, rules, checked_at, plan_url }. Read-only.
SHAREABLE: pass save: true and the plan is stored and save.share_url returned — a permanent read-only page whose signature is re-checked server-side, so a plan can be handed to someone else without re-running anything. The page is noindex unless public: true is passed too. That signature proves Sato Hub produced those bytes on that date; it is not a claim about any project in the plan.
Example: { goal: "a Base trading agent that swaps USDC to ETH on a signal", chain: "Base" }
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| goal | Yes | What the user wants to build, in plain words, e.g. 'a Base trading agent that swaps USDC to ETH on a signal'. | |
| save | No | True stores the plan and returns `share_url`, a permanent read-only page at satohub.ai/plan/<id> with the plan's signature re-checked on it. The page is noindex unless `public` is also true — a goal is the caller's to publish, not ours. Nothing else about the plan changes. | |
| chain | No | Chain the agent runs on, e.g. 'Base'. When omitted it is read from the goal, and the plan says which. | |
| public | No | Only meaningful with `save`. True lets the shared page be indexed by search engines. Default false. | |
| budget_usd | No | Rough monthly budget in USD. Restated back in the plan; it does not filter the stack. | |
| constraints | No | Hard constraints to restate back, e.g. 'self-custody only', 'no API keys'. | |
| response_format | No | Output format: 'markdown' (default) or 'json'. | markdown |