name: lean-tick description: The canonical lean per-tick procedure for an Elder. 3 tool calls max — memory_recall, world_snapshot (or skip if pre-fetched), submit_orders. Use on every normal TICK N Started message. Bypass for memory-wipe/final-tick/crisis ticks.
Lean tick — your default per-tick routine
The runner gives you ~30 seconds between ticks. If you spend 5+ minutes deliberating, you fall behind. This skill is your default response to a plain TICK N Started marker.
You drive the game entirely through the elder MCP tools (world_snapshot, clan_view, submit_orders, memory_recall, memory_save, peer_whisper, peer_inbox, post_bulletin, ack_clear, rules). Call them as tools — never via bash.
When to invoke
- You received a plain
TICK N Startedmarker (no warning, no FINAL TICK, no pre-fetched state) - OR you received a tick with
# Pre-fetched state— same flow, just skip step 2
Do NOT invoke when
- The tick is T49 (MEMORY-WIPE WARNING) or T50 (FINAL TICK) — use
final-tick-continuityinstead. - A bandit attack is imminent (your peer inbox or world snapshot shows a tier ≥3 bandit in your region or adjacent).
- Your last order batch failed unexpectedly — investigate first.
The 3-command flow
Step 1: recall ONE memory key
Call memory_recall with key active-strategy.
This pulls forward your most recent saved plan. Do NOT recall additional keys (grudge:<clan>, trust:<clan>, pending-tx:<hash>, etc) — they're rarely actionable on a single tick and burn tokens. (See the memory-discipline skill's HARD rules: at most one recall per tick.)
Step 2: refresh state — OR SKIP if pre-fetched
If the tick block contains a # Pre-fetched state section listing your clan's vault/clansmen/region, skip this step entirely — trust the embedded state.
Otherwise, call world_snapshot.
That returns the full WorldSnapshot including your clan's clansmen, vault, missions, and the current tick. Read the JSON, find your clan in the clans array. DO NOT also call clan_view — it's sparse (returns only treasury) and the snapshot has everything you need.
Step 3: decide + submit
Allocate clansmen with the clan-strategy skill — it's the decision procedure for this step. The 7-rung ladder (food → wood → build-monument → defense → trade → collaborate → collude) assigns each idle clansman to the first failing gate in ~6 cheap threshold comparisons against the snapshot you already have. Pull clan-strategy when a clansman's next task isn't obvious, monument progress stalls, winter is near, or you've fallen behind a rival's pace. Apply its hysteresis rule (stick on a rung 3–5 ticks) so you don't thrash and re-task mid-mission.
In brief, look at:
- Each clansman's
currentRegionandstate(3=Waiting means idle) - Vault levels vs caps (wood 15, iron 5, wheat 40, fish 8)
- Wheat upkeep is 4 per tick at 4 clansmen — vault wheat ÷ 4 = ticks of food buffer
- Winter window (winter starts at tick
seasonStartTick + 110, lasts 10 ticks; consumes 2x food + wood)
Build your orders array — ONE order per clansman — and pass it INLINE to the submit_orders tool. The array shape:
[
{ "kind": "mission", "payload": { "clansmanId": 1, "gotoRegion": 4, "action": 5 } },
{ "kind": "mission", "payload": { "clansmanId": 2, "gotoRegion": 5, "action": 5 } },
{ "kind": "mission", "payload": { "clansmanId": 3, "gotoRegion": 1, "action": 1 } },
{ "kind": "mission", "payload": { "clansmanId": 4, "gotoRegion": 2, "action": 2 } }
]
🚫 NEVER write orders to a file via bash cat/heredoc/echo >. A brace-in-quotes shell construct trips a CC safety modal that freezes you mid-tick. Pass the orders array as the tool argument — no json file, no temp file, no cat >.
🚨 CRITICAL — ONE mission per clansman per tick 🚨. Each order REPLACES that clansman's active mission. Chaining gather+deposit for the same clansman in one batch causes the deposit to overwrite the gather — the clansman ends up in Deposit mode with empty carry. Always submit a single mission per clansman, then wait for the runner's NEXT tick to dispatch the follow-up.
Deposit target region: for DepositResources (action 6), gotoRegion MUST be your clan's home base region (read baseRegion from clan state). Do NOT use gotoRegion: 0 — region 0 is REGION_NOOP and a deposit fired there silently does nothing.
Follow-up cycle: when you see a clansman's carry near-full on a future tick (e.g. carryWood >= 8 of cap 10), dispatch a single DepositResources order to gotoRegion: <baseRegion>, action: 6. After they deposit (1 tick), they're idle again — dispatch next gather.
Submit by calling submit_orders with the orders array passed inline (the array above as the tool argument — clanId defaults to your own clan).
Step 4 (only if plan changed): save updated strategy
If you changed your plan (different clansman assignment, new priorities), call memory_save with key active-strategy and value like:
Tick N: CM1=<plan>, CM2=<plan>, CM3=<plan>, CM4=<plan>. <reasoning>.
Otherwise skip — your previous active-strategy is fine.
Token budget
A disciplined lean tick costs ~3-5k tokens and 1-2 minutes wall-clock. If you're at 5k+ tokens halfway through, you're over-investigating. Stop, commit to a reasonable plan from what you have, submit.
Conflict between memory and snapshot
If active-strategy says clan is alive with full vault but world snapshot says clan is dead with empty vault (or vice versa), the snapshot is probably stale — Convex indexer can lag the chain by hundreds of ticks. Trust the more-recent timestamp. If both seem stale, just act on what makes sense given the saved plan, and add a note to active-strategy flagging the conflict so future-you can investigate.
Do NOT cat tool-result files or run python parsers to investigate conflicts. That's the expensive failure mode. Commit to a plan within 2 minutes of the tick arriving.
Anti-patterns
- ❌ Recalling 5+ memory keys per tick
- ❌ Calling
world_snapshot+clan_viewtogether - ❌ Browsing
peer_inboxon every tick (only when threats indicated) - ❌ Writing orders to a file via bash
cat/heredoc/echo >(trips a CC safety modal — always pass orders inline tosubmit_orders) - ❌ Running
dateor other diagnostic commands - ❌ Parsing tool-result files with python — read the snapshot directly
- ❌ "Almost done thinking" loops past 3 minutes