SORA Taira Testnet
Use the Taira testnet through native Torii MCP.
Quick Start
- Confirm a Taira MCP server is available in the current Codex environment.
- Treat
https://taira.sora.orgas the primary public Torii/API origin on the current deployment andhttps://taira.sora.org/v1/mcpas its native MCP endpoint. - Before long or stateful writes, sample public health first. Prefer proceeding only when blocks are advancing,
queue_sizeis low,tx_queue_saturated=false, andteu_dataspace_backlogis not climbing. - Prefer curated
iroha.*tools over rawtorii.*tools. - Stay read-only until the user explicitly asks to mutate live state.
- Treat any signing inputs, API tokens, or forwarded auth headers as runtime-only secrets.
MCP Endpoint
Use the public Taira MCP endpoint:
https://taira.sora.org/v1/mcp
The matching public Torii/API root is:
https://taira.sora.org
If the endpoint is not configured locally, instruct the user to add a user-local MCP entry that points at that URL.
If the endpoint returns 404, report that native Torii MCP is not enabled on
the deployment yet and stop before attempting live-network actions.
If the MCP endpoint or the public Torii root returns 502 or 503, report
public ingress / rollout health degradation before attempting writes. Treat
that as deployment health, not user input failure.
If reads work but live writes fail with route_unavailable, report that the
public ingress still cannot reach authoritative peers for the target lane and
point operators at
configs/soranexus/taira/check_mcp_rollout.sh --public-root https://taira.sora.org --write-config <runtime-only client.toml>.
For that runtime-only signer config, prefer
configs/soranexus/taira/taira-canary-client.example.toml; the generic
defaults/client.toml targets the zero chain id and is not valid for Taira.
When --write-config is omitted, the rollout scripts now bootstrap
/run/secrets/taira-canary-client.toml automatically by generating a fresh
ordinary signer, onboarding it on Taira, and attempting an initial faucet claim
before the write canary. For that public onboarding flow, keep aliases
dataspace-scoped like <label>@universal; do not invent domain-scoped aliases
such as @wonderland.universal.
If the rollout is still using hand-edited validator configs, point them at
configs/soranexus/taira/validator_roster.example.toml,
configs/soranexus/taira/validator_secrets.example.toml, and
python3 scripts/render_taira_validator_bundle.py --roster ... --secrets ... --output-dir ...
so every validator shares the same trusted_peers / trusted_peers_pop roster.
If writes fail with Transaction expired, classify that as chain health,
consensus latency, or queue saturation first. Sample /status and
/v1/sumeragi/status and report the current blocks, commit_qc_height,
highest_qc_height, queue_size, tx_queue_depth, tx_queue_saturated,
teu_dataspace_backlog, and view_change_causes.last_cause before blaming
the caller.
Working Rules
- Prefer
iroha.*aliases. They are the intended agent-facing surface for deployed networks. - Use explicit JSON
bodypayloads when a write flow needs more than a couple of flat shortcut arguments. - Keep
authority,private_key, bearer tokens, and forwarded auth headers out of files, docs, and commits. - Before long write flows, verify the signer on-chain first: the account exists on the current Taira chain, holds a positive fee asset balance, and has the permissions required for the specific mutation.
- For Soracloud releases or site publishes, verify the signer still has
CanManageSoracloudandCanPublishSpaceDirectoryManifestbefore starting a large upload. - If Taira was recently reset or redeployed, treat cached or previously faucet-funded signers as suspect until their balance and permissions are re-checked on-chain.
- For pre-signed transaction envelopes, use
iroha.transactions.submit_and_wait. - If a mutation would affect live state, restate the intended change clearly before executing it unless the user already gave a direct mutation request.
- For Taira SoraFS or app-api rollout, treat the public read path as healthy
only when
/v1/app-api/cid/<cid>is stable200and/v1/sorafs/capacity/stateshowsdeclaration_count >= 1. Mixed200/404reads or zero declarations are rollout health problems, not a bad CID. - For Musubi package-registry writes, use the pre-signing helpers only:
iroha.musubi.instructions.publish_release,iroha.musubi.instructions.yank_release,iroha.musubi.instructions.set_alias, andiroha.musubi.instructions.assert_release_exists. They return unsigned Norito-framed instructions; sign and submit them from the client side.
Public-Node Diagnostics
- Treat
https://taira.sora.orgas the default public Torii vantage point on the current deployment. It is still only one public view, not proof of full validator-set health. - Do not invent or assume direct per-validator public hostnames. They may exist on some deployments and may be intentionally absent on others.
- Do not infer validator-set size from
/status.peers. That field is the queried node's current remote-peer count, not the network's validator-set length. - When diagnosing public-write or finality issues, prefer this read bundle:
iroha.statusiroha.sumeragi.statusiroha.blocks.listiroha.transactions.statusoriroha.transactions.waitGET https://taira.sora.org/status
- If the latest committed block timestamp stops advancing and Sumeragi shows
signals such as
membership.height > commit_qc.height,view_change_causes.last_cause = "missing_qc", orview_change_causes.last_cause = "quorum_timeout", orworker_loop.stage = "idle", report that the queried public Torii finality path appears stalled. Do not claim the entire validator set is down unless you also have direct validator or operator visibility. - If
iroha.transactions.statusreturns404 not_foundfor a previously submitted hash, report only that the queried public node currently has no visibility for that transaction hash. Do not infer commit, reject, or network-wide disappearance from that result alone. - If public reads are healthy but generic signed writes still expire while a dedicated lane like SoraFS capacity declaration succeeds, call that a partial public-node or public-finality-path failure first, not proof that the user payload is malformed.
- If staged validator lanes are only reachable from the edge host, validate
them through an SSH tunnel or the rollout scripts'
--resolve-hostpath before treating the problem as an application bug. - If an operator-side nginx reload fails after a config edit on the Homebrew
edge, check for backup
.conffiles left under theservers/include directory. Duplicate upstream definitions there will block reload.
Known Failure Patterns
route_unavailablewhile public reads still work usually means the public ingress can answer read traffic but cannot reach an authoritative peer for the target write lane. Treat that as rollout health first and point operators atconfigs/soranexus/taira/check_mcp_rollout.sh.- Stable
404on/v1/app-api/cid/<cid>together with/v1/sorafs/capacity/state.declaration_count = 0usually means public SoraFS provider capacity was never declared on-chain or the publish surface is pointed at a node that cannot hydrate the CID. - Mixed
200and404from repeated/v1/app-api/cid/<cid>probes usually means the edge is balancing across validators with inconsistent SoraFS manifest visibility. Treat that as a rollout or edge-routing problem, not a corrupted CID. check_sorafs_rollout.shcan pass whilecheck_mcp_rollout.shstill fails. That means the SoraFS-specific route and declaration path are healthy enough for the app-api read surface, but the generic signed-transaction or finality lane is still degraded.Transaction expiredon generic signed writes while a dedicated SoraFS declaration succeeds usually points at partial public finality trouble such asmissing_qcorquorum_timeout, not necessarily a malformed request.502or503from/v1/mcpor the public Torii root usually means nginx or upstream rollout breakage, not a signer or payload problem.
Preferred Triage Sequence
- Start with read-only public health:
GET https://taira.sora.org/statusiroha.statusiroha.sumeragi.status
- If the task involves SoraFS or app-api rollout, check the public read path
before any write:
GET /v1/sorafs/capacity/state- repeated
GET /v1/app-api/cid/<cid>
- If shell access is available, run the read-only public SoraFS ingress check
first:
bash configs/soranexus/taira/check_sorafs_rollout.sh --public-root https://taira.sora.org --skip-write-canary
- If the public read path looks healthy and the task needs generic signed
writes or native MCP validation, run:
bash configs/soranexus/taira/check_mcp_rollout.sh --skip-local --public-root https://taira.sora.org --skip-write-canary
- Only after those checks are green should the agent spend time on signer or
payload debugging. If the user wants a live write canary, then move to the
full write checks with either an explicit
--write-configor the automatic runtime-only canary bootstrap. - When using the rollout scripts, pass the Torii root as
--public-root(https://taira.sora.org), not the MCP URL. The scripts derive/v1/mcpthemselves.
MCP Write Recipes
Bootstrap a fresh runtime-only signer
If the user wants a fresh ordinary signer for rollout checks, prefer the helper script over hand-editing TOML:
python3 scripts/taira_bootstrap_canary.py \
--torii-root https://taira.sora.org \
--output-config /run/secrets/taira-canary-client.toml
That flow generates a new local Ed25519 keypair, onboards it on Taira, attempts the public faucet claim, and writes a runtime-only client config with rollout- specific TTL and status timeout. Keep the generated config out of tracked repo state unless the user explicitly asks to persist it.
Verify the bootstrapped signer before writes
After bootstrap, confirm the alias, account, and fee balance before debugging permissions or payloads:
- resolve the alias with
iroha.aliases.resolve - fetch the canonical account with
iroha.accounts.get - inspect balances with
iroha.accounts.assets
If the signer is missing entirely, re-run the bootstrap flow. If the signer exists but has no fee asset balance, treat that as a faucet or funding problem before blaming the write payload.
Submit a pre-signed transaction envelope
For pre-built signed transactions, prefer iroha.transactions.submit_and_wait
instead of lower-level polling:
{
"signed_tx_base64": "<base64-encoded SignedTransaction>",
"status_accept": "application/json",
"timeout_ms": 120000
}
Inspect Musubi packages
Use the curated Musubi tools for package reads:
iroha.musubi.searchwithquery, optionalnamespace,include_yanked,offset, andlimitiroha.musubi.release.getwithpackage = "namespace/name@version"iroha.musubi.package.releaseswithpackage = "namespace/name"and optionalinclude_yankediroha.musubi.package.versionswithpackage = "namespace/name"iroha.musubi.alias.resolvewithalias = "<short-name>"
Musubi namespaces intentionally do not use a leading @; use literals like
universal, dex.universal, and dex.universal/swap-core.
Build Musubi instructions for local signing
The Musubi instruction tools do not accept authority, private_key, bearer
tokens, or any other signing material. They return wire_id,
instruction_base64, instruction_hex, and an instruction_json preview.
The client must assemble a signed transaction locally and submit it with
iroha.transactions.submit_and_wait.
Example yank instruction payload:
{
"package": "dex.universal/swap-core@1.2.3",
"reason": "superseded"
}
Use signed_tx_base64 or tx_base64 for base64 envelopes, or the hex variants
for hex-encoded envelopes. Do not pass multiple envelope encodings in the same
request. If the call returns Transaction expired, go back to the public
health and Sumeragi checks before rebuilding the transaction.
Rollout reads for SoraFS and app-api
For public trader/app rollout checks, use this read bundle before attempting a republish or signer mutation:
iroha.statusiroha.sumeragi.statusGET https://taira.sora.org/v1/sorafs/capacity/state- repeated
GET https://taira.sora.org/v1/app-api/cid/<cid>
If shell access is available, prefer the bundled rollout checks:
bash configs/soranexus/taira/check_sorafs_rollout.sh \
--public-root https://taira.sora.org \
--skip-write-canary
bash configs/soranexus/taira/check_mcp_rollout.sh \
--skip-local \
--public-root https://taira.sora.org \
--skip-write-canary
Treat check_sorafs_rollout.sh as the SoraFS/app-api surface check and
check_mcp_rollout.sh as the generic signed-write and native MCP surface
check. They can fail independently.
Common Flows
Accounts and aliases
iroha.accounts.getiroha.accounts.queryiroha.aliases.resolveiroha.accounts.assets
Assets and balances
iroha.assets.getiroha.asset-definitions.getiroha.accounts.assets
Contracts
iroha.contracts.deployiroha.contracts.instance.createiroha.contracts.instance.activateiroha.contracts.calliroha.contracts.call_and_wait
Governance and network state
iroha.gov.*iroha.blocks.*iroha.transactions.wait
Transaction submission
iroha.transactions.submitiroha.transactions.submit_and_wait
Response Handling
- Use each tool's
inputSchemaas the source of truth for accepted fields. - Re-run tool discovery if the MCP server reports that the tool list changed.
- When a write tool succeeds, summarize the resulting transaction hash or the returned status, not just the request payload.
- When a write tool fails, surface the server error and say whether the issue looks like auth, validation, missing tool exposure, or endpoint availability.
- Treat
route_unavailableas deployment health, not user input failure: the public Torii node is up but the write route still cannot reach an authoritative peer. - Treat
502or503from the MCP endpoint or public Torii root as ingress or rollout-health failures first. - Treat
Transaction expiredas a likely stalled, saturated, or slow chain path first; report the public/statusand/v1/sumeragi/statussample alongside the failure. - Treat
403 Forbiddenafter a chain reset as a likely signer-permission problem first, not a malformed request. - Treat
Failed to find asseton the signed rollout canary as a likely unfunded-signer condition first; use the rollout smoke or the public faucet endpoints before assuming the chain rejected the signer itself. - If
/v1/app-api/cid/<cid>flaps between200and404and/v1/sorafs/capacity/stateshowsdeclaration_count = 0, classify it as a public SoraFS provider-capacity or read-path failure first, not a bad CID. - If public reads succeed but finality appears stalled, describe the issue as a public-node or public-finality-path observation unless you have validator-side evidence. Avoid overstating that as a full-network outage.
Safety
- Do not invent or claim pre-existing operator key material.
- If the user explicitly asks for a fresh runtime-only signer, it is valid to generate a new local keypair, onboard it on Taira, and fund it through the public faucet. Do not present it as a shared or pre-existing credential.
- Persist runtime credentials only when the user explicitly asks, and then keep them in ignored user-local files rather than tracked repo state.
- Do not assume operator-only routes are available on public Taira.
- Prefer anonymous/public reads first when investigating state.