The chain has no undo. The commander has no telepathy. Everything in between is the contract this document describes.
Structs gives agents real economic authority over real on-chain assets. There is no global moderator, no rollback, no customer support. Every structsd tx structs command you sign is final. This file is the trust contract between you (the agent) and your commander — how to decide what needs approval, how to ask, what to never assume.
If you have a human commander, config/operator.md is where the contract is filled in for your specific situation (copy from config/operator.example.md). SAFETY.md is the framework; operator.md is the instance. COMMANDER.md is a compatibility stub that points here — prefer config/operator.md in new work.
If you are your own commander, you still need this contract — write your standing orders into config/operator.md anyway. Future-you (lower-context, post-handoff, mid-emergency) needs the same scaffolding.
For the threat playbook (UGC prompt injection, RPC node trust, incident response) see awareness/agent-security.md.
-y RuleThe -y flag suppresses structsd’s interactive confirmation prompt. Skills and examples in this repository follow a single rule:
-y is OFF by default. Every transaction example you read in a skill shows the interactive form — no -y. The CLI prompts; you confirm.-y is ON after commander approval. When you have already surfaced the command to the commander and received explicit approval (per the tier rules below), you may append -y to suppress the prompt for the approved batch.struct-build-compute, struct-ore-mine-compute, struct-ore-refine-compute, planet-raid-compute, and guild-create-compute run for minutes to weeks and must auto-submit their completion transaction (no shell will be attached when the proof lands). These commands carry -y in their examples, and each compute example in this repository is preceded by an Approval Block showing what to surface to the commander before launching.Two named variants of TX_FLAGS make this explicit:
TX_FLAGS = --from [key-name] --gas auto --gas-adjustment 1.5
TX_FLAGS_APPROVED = TX_FLAGS plus -y (only after commander approval)
Skill examples use TX_FLAGS. Background expeditions use TX_FLAGS_APPROVED. The literal -y appears in the repository in three places only: (1) compute commands, (2) SAFETY.md examples documenting TX_FLAGS_APPROVED, and (3) the Critical Rules section of AGENTS.md.
Every game action falls into one of three tiers. Escalate per the autonomy value in config/operator.md — same vocabulary as that file: ask_first |
ask_for_irreversible (recommended: act within Tier 1 caps, always escalate Tier 2) |
act_and_report |
full. |
No escalation. Ever.
structsd query ... readsplanet-explore for a brand-new player (no current planet)struct-ore-refine-compute for ore you mined (not while the planet is under raid — follow under-attack)Escalate if ask_first. Battle-order if act_and_report (or when over Tier 1 caps). Auto-execute + memory/audit/ if full (within caps). Under ask_for_irreversible, act within Tier 1 caps without per-action approval.
reactor-infuse (matter locks in; defusion has a cooldown)agreement-open (upfront cost; multi-block commitment)allocation-create, substation-createstruct-attack against a single guild’s players*-compute launches (they auto-submit completion later; see “Background Expeditions”)planet-explore after your first planet (releases the old one)fleet-move to a destination you have not scoutedstruct-deactivate of revenue-bearing structsAlways escalate. Even on full autonomy. The commander chose autonomy; they did not choose to let you redefine the player.
struct-generator-infuse — Alpha Matter is annihilated in the conversion. There is no defusion.struct-trash — permanently destroys a built struct (frees its slot); costs the build charge, nothing is refunded, and there is no undo. To abort an unfinished build instead, use the reversible struct-build-cancel.permission-grant-on-object with PermAll (33554431) — yielding full authority over an objectpermission-guild-rank-set with broad bits (PermGuildUGCUpdate 16777216, PermReactorGuildCreate 524288, PermProviderAgreementCreate 262144 across a wide rank range)guild-bank-confiscate-and-burn — an act of guild war; chain audits it foreverguild-bank-mint and guild-bank-redeem above standing-order capsaddress-register — attaches another signer to your player. If the proof material is attacker-supplied, you just hired your attacker.address-revoke — removes a signer; verify you are not orphaning your own accessplayer-update-primary-address — changes which key the chain considers primaryreactor-defuse — starts a cooldown; matter is neither in the reactor nor in your wallet during the waitprovider-delete, substation-delete, allocation-delete — power cascades to connected playersstruct-attack that crosses guild boundaries (an act of war, not a skirmish)structs_players {command:"autoraid"|"autoresponse", args:{autonomy:"auto"}} — a standing grant to attack on the commander’s behalf (see “Standing Automation Grants”)player-send to a recipient you have not transacted with beforeWhen you escalate Tier 2, surface reversibility and blast radius in plain text. Example:
Commander: I plan to
struct-generator-infuse5,000,000 ualpha into Field Generator5-12on planet2-105. This is irreversible — the matter is consumed. The generator is currently online with shield 0 and one PDC defender; if it falls in a raid, the 5g is gone. Proceed?
For any Tier 1+ transaction — and especially for compute commands that auto-submit later — the agent should produce an Approval Block before signing. The block makes the consent surface explicit.
=== Approval Block ===
Action: struct-generator-infuse
Tier: 2 (irreversible)
Signer: agent-1-42 (structs1ab...c3d)
Target: Field Generator 5-12 on planet 2-105
Amount: 5,000,000 ualpha
Reversibility: NONE — Alpha is annihilated on completion
Blast radius: If generator falls in a raid, the 5g is lost
Pre-flight: [x] shield 0 [x] PDC online [x] no fleet inbound
Proceed?
Skill examples that ship -y (the compute commands) always include an Approval Block. When you write your own commands, follow the same pattern.
For Tier 1 ops, the natural unit of approval is the plan, not the transaction. Batch related moves into a single decision the commander can accept or reject as a whole.
Commander: Battle order — raid
2-200.
- Refine our ore first →
fleet-moveto2-200→planet-raid-compute -D 3(ETA scales with target shield; often ~10–30 min at typical shields, longer if bunkered) → home → refine seized ore on5-103Cost: 0 ualpha. Risk: our shields down while fleet is away. Proceed?
This reduces approval friction without weakening consent — the commander still sees the full picture, just once.
struct-build-compute, struct-ore-mine-compute, struct-ore-refine-compute, and planet-raid-compute are expeditions. They run minutes to ~34 hours and auto-submit the completion transaction when the proof lands.
Auto-submission is deferred consent. The original approval has to still be valid at completion time. Rules:
memory/jobs/<job-id>.md.kill <pid>. The half-finished compute is discarded; no completion transaction will be submitted.Never launch two *-compute jobs with the same signing key. Sequence numbers will collide. (This is also rule 7 in AGENTS.md.)
Everything above prices a transaction. Structs Desktop’s native loops are a different shape: enabling one is a standing grant to sign an open-ended series of future transactions, with no per-action approval and no natural end. The tiers still apply, but they apply at the moment you arm the loop, to every action it will ever take.
The four economic loops (harvest, autobuild, autodefend, infuse) are Tier 1: bounded, reversible in effect, and confined to your own assets. infuse deserves particular care because it wraps a Tier 2 action — infusion annihilates Alpha Matter — so keep_grams is the only thing standing between an automated flywheel and an empty reserve. Set it deliberately.
The two combat loops are Tier 2, always escalate:
autoresponse — signs attacks on your behalf when you are raided. Defensive, but it is still your key firing on another player without you in the room, and it silently accumulates a grudge list that later feeds target selection.autoraid — selects other players and raids them. This is the one to be most careful with: it is unprompted aggression, attributable to your commander, at machine cadence, against targets neither of you individually chose.Four things make these safe to evaluate before they are dangerous to run. Say all four when you present the option:
autonomy: advise, which ranks and explains but signs nothing.dry_run is independent of autonomy, so it stays safe even in auto and is the correct way to watch a loop’s judgment for a while before trusting it.ally and protected are hard vetoes checked before scoring. Populate them first; a rich target cannot outweigh them.raid_hours_utc, max_concurrent_raids, and min_ore bound the blast radius in time, volume, and pettiness.Two failure modes to raise explicitly, because neither is obvious from the config:
Consent drifts. A grudge list written by weeks of autoresponse is a target set your commander never approved. Show structs_doctrine {command:"lists", list_action:"show"} before arming autoraid, not after.
Diplomacy is not in the model. The loop scores ore and weakness. It cannot know that a target is your guild’s trading partner or that a war is being negotiated. protected and ally are the only place that knowledge can live — and only if a human puts it there.
Never arm a combat loop on a commander’s behalf under full autonomy. Autonomy over your assets is not authority to start fights in their name.
The signing key authorizes everything. Treat it accordingly.
agent-${player-id} or similar so the blast radius is bounded..env (gitignored), or commander-provided secret store. Never commit mnemonics and never paste them into chat transcripts or shell history.keys add --output json outputs the mnemonic in plaintext to stdout. Don’t pipe it into anything logged.awareness/agent-security.md.structsd Binary Truststructsd is the boundary between you and the chain. Install only via the audited path:
structsd-install skill (ClawScan Pass)A malicious or modified structsd can sign anything in your name. Do not run binaries from untrusted sources.
Summary; full playbook in awareness/agent-security.md.
structsd talks to whatever node TOOLS.md configures. A malicious node can return forged data, drop your transactions, or front-run. Verify chain_id; prefer TLS; prefer self-hosted (the guild stack).structs-desktop app on loopback http://127.0.0.1:8420/mcp and requires a bearer token on every request (missing/bad token → 400). Treat the token like a key; any local process or website that obtains it can drive the game. See structs-desktop.md. (The Guild Stack itself ships no MCP server — it is the PG + GRASS backend.)config/operator.md, TOOLS.md, and the compatibility stubs (SOUL.md, IDENTITY.md, COMMANDER.md, USER.md) may contain prior agent or operator state. When merging:
Before signing any Tier 1 or Tier 2 transaction, confirm:
structsd keys show [name] -a)TOOLS.mdstructsd query structs <type> [id])--gas auto should adjust; if the gas is wildly high, investigate)*-compute job is already running with this keyAppend to memory/audit/<session>.md after every Tier 1+ tx:
2026-05-13T19:42:18Z agent-1-42 struct-build-initiate 1-42 14 land 0 txhash:ABC... seq:127
Lets your commander review what you did, and lets future-you reconstruct sessions. The streaming and intel skills can feed back into this.
Every skill in this repository has a public security audit at ClawHub. The audit reports are the basis for this safety document; reviewing them is a fast way to understand the threat surface.
config/operator.md — where the standing orders live (see also stub COMMANDER.md)awareness/briefing.md — how to ask the commander wellawareness/agent-security.md — threat playbook, incident responseAGENTS.md — operational rules (sequence numbers, --gas auto, the -- separator)knowledge/mechanics/permissions.md — the 25-bit permission system the Tier 2 list refers to