<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>cat/tribes</title>
<subtitle>an rts arena for scripts: submit tribe strategies over the web or mcp, run deterministic matches, watch them</subtitle>
<id>https://src.rest/cat/tribes/</id>
<link href="https://src.rest/cat/tribes/"/>
<updated>2026-08-16T14:05:00-06:00</updated><entry>
<id>4c3b1aec30069674df81ace2782795f439ae0d27</id>
<title>feat: session-secret rotation script — one value everywhere or nobody logs in</title>
<link href="https://src.rest/cat/tribes/commit/4c3b1aec30069674df81ace2782795f439ae0d27/"/>
<author><name>Dami</name></author>
<updated>2026-08-16T14:05:00-06:00</updated>
<content type="text">scripts/rotate-session-secret.sh mints a fresh SESSION_SECRET and pushes
it to every prod worker (apex + all versioned hosts) plus the write-only
TRIBES_SESSION_SECRET GH secret in one pass, never printing the value.
Needed because all hosts share the .tribes.pub cookie domain: a cookie
minted on the apex must verify on every versioned host, so the secret
must rotate everywhere at once. Cost: one forced re-login.</content>
</entry>
<entry>
<id>51b177b957b78737fcf638cdbf0e04ac8e88484e</id>
<title>feat: v0.4.0 map effects — the event log gets a visual twin</title>
<link href="https://src.rest/cat/tribes/commit/51b177b957b78737fcf638cdbf0e04ac8e88484e/"/>
<author><name>Dami</name></author>
<updated>2026-08-16T13:51:33-06:00</updated>
<content type="text">The world map now animates the story it was already logging. A new
effects layer (web/src/render/effects.ts) derives transient visuals from
the frame event channels: battles pop crossed swords with an expanding
winner-tinted ring and per-side loss floats; captured settlements burn
under the captor&#39;s double shockwave; foundings bloom a banner; raids and
caravan hits float their losses; buildings pop their own glyph when they
come online and burn when they fall; starvation counts its dead; threats
arrive with a pop (demon gates through a portal) and fade when cleared.

Grammar: five shared primitives (ring, stepped glyph pop, fade, flame
flicker, float text) composed per event kind. Effects age by wall clock
so they read at any sim speed, coalesce per tile so max speed pulses
instead of strobing, and evict texture before drama at the 24-effect
cap. Pure presentation: POV-aware ingest reads the engine&#39;s fog-filtered
channels, never engine state; idle cost stays zero via the existing
dirty-flag paint loop.

Protocol/engine: building_complete, building_destroyed, raid, and
starvation events now carry x/y (all emission sites + dev-mock). Events
stay out of stateHash; note viewFor now delivers these to any tribe with
vision of the location — scripts can see raids they watch happen.

Dev: window.__fx console hook (dev builds) drives synthetic effects for
tuning; web tsconfig gains vite/client types for the DEV gate.</content>
</entry>
<entry>
<id>afc57cb6d8d38890d27cf25bb215bad2de9c7da4</id>
<title>feat: v0.3.1 balance patch — the economy works, the formula audits, tribes meet</title>
<link href="https://src.rest/cat/tribes/commit/afc57cb6d8d38890d27cf25bb215bad2de9c7da4/"/>
<author><name>Dami</name></author>
<updated>2026-08-16T10:39:59-06:00</updated>
<content type="text">Driven by two independent agent-fleet tournament reports (72 controlled
sims, converging findings). Nine signals addressed:

THE TOOL FAMINE (P0): all 8 tournament scripts across both fleets ended
every sim at 0% tool coverage — the documented economic spine was
unreachable from the docs. Root causes fixed: (1) spawn fairness now
guarantees forest/hills/ore CLAIMABLE at tier-0 budget, not merely visible
at radius 8; (2) ore rate scales with claimed veins (60 + 30/extra);
(3) the smithy craft split uses fixed-point accumulators — a 400-permille
weapons split actually yields weapons (largest-remainder gave every unit
of tiny output to the heaviest target). A docs-only naive bot now builds
the full chain and arms itself.

LEGIBILITY (P0): build/found/muster/advance drops emit order_dropped
events with the reason (capped 8/tick). Docs warn that sequential plans +
silent drops are the classic freeze; primitives ships planBuilder which
reads the events and skips blocked steps. Feeds render the reasons.

SCORING (P1): buildings score STANDING structures with a usefulness audit
(occupied houses only; per-type cap 8 full then half) instead of a
lifetime completion counter; settlements score 10+10*tier instead of flat
40; defense scores (walls/towers in the military term, and fortification
combat power x2.5 so investment repels); the age total-score multiplier is
retired (flat 150/age + the real rate bonuses) killing the advance() spam
lottery; coin scores min(coin, coinEarned)/20 + tradeVolume/40.

MARKET &amp; LADDER (P2): wantAmount:0 gifts/tribute actually deliver now
(documented since v2, mechanically dead — matching skipped zero crosses);
gifted coin is score-inert by construction, closing the flagged Elo
collusion vector before it ever worked. Peddler pays 400/600 permille.
The nightly ladder plays every lineup in BOTH slot orders, cancelling the
spawn/slot variance that swamped strategy (1064 vs 48 same code+seed).

Also: expansion decree was missing from the state hash (latent since it
shipped); goldens repinned; isolation re-verified (1v1 0% never-meet,
FFA 14% pair-never). Known residual: development under sustained raid
pressure still suppresses harder than defense can answer — a dedicated
anti-suppression pass (raid diminishing returns) is future work.</content>
</entry>
<entry>
<id>2b9f6ca4b1a7171f3340653b8b4eddd928786e35</id>
<title>feat: settlement smoke + spawn distance ceiling — tribes actually meet</title>
<link href="https://src.rest/cat/tribes/commit/2b9f6ca4b1a7171f3340653b8b4eddd928786e35/"/>
<author><name>Dami</name></author>
<updated>2026-08-16T10:08:11-06:00</updated>
<content type="text">Measured on scattered spawns: peaceful 1v1s NEVER met (6/6 sampled) and
FFA pairs only met when a warband marched — contact was 100% military.
Two fixes: (1) settlement smoke — a settlement announces itself at
12/18/26/34 tiles by tier (visible from any of your settlements/warbands,
regardless of terrain vision; fires sighted events and appears in
enemySettlements). Units stay fogged. (2) spawn scoring gains a
nearest-neighbor CEILING at ~45% of map size alongside the 18-tile floor,
so arenas vary without stranding anyone past every horizon.

Remeasured: 1v1 6/6 met (~t1500, when camps become towns); FFA 29/36
pairs met (19% never — inside the &lt;=20% target), every tribe meeting at
least one neighbor in every sim. Goldens repinned; trade scenario
re-seeded (70). Dev only — ships to prod with the next release.</content>
</entry>
<entry>
<id>109806d1f1d09d461817db532d44af5aeb2f0be5</id>
<title>feat: spawns scatter per seed — no ring, biased apart, never overlapping</title>
<link href="https://src.rest/cat/tribes/commit/109806d1f1d09d461817db532d44af5aeb2f0be5/"/>
<author><name>Dami</name></author>
<updated>2026-08-16T09:52:06-06:00</updated>
<content type="text">The fixed spawn ring (3/8 radius, even angles, identical geometry every
seed) becomes seeded best-candidate scatter: each spawn samples 24 random
candidates past the ocean margin and keeps the farthest from everyone
placed, with a hard-priority 18-Chebyshev separation floor (two fairness
radii - terraforms can never pave each other) and heavy water penalties.
Every seed is now a different arena; placement stays deterministic.

Also tightens the water fairness quota: the guaranteeing water tile must
itself sit inside the radius-8 window (rim adjacency to unseen water at
r9 no longer counts; a pond is dug instead). Goldens repinned; battle and
ages scenario tests re-seeded (41, 83); balance matrix verified healthy.</content>
</entry>
<entry>
<id>ffc9de61c2c3f6f7232bf2bf42d3b9b5c49160cd</id>
<title>fix: pool items align icon with title in a two-line grid</title>
<link href="https://src.rest/cat/tribes/commit/ffc9de61c2c3f6f7232bf2bf42d3b9b5c49160cd/"/>
<author><name>Dami</name></author>
<updated>2026-08-16T09:37:21-06:00</updated>
<content type="text"></content>
</entry>
<entry>
<id>f78625aab5f9fd5916597a99d50c171ab31e9c94</id>
<title>feat: identicons on the Simulate page — pools, roster slots, sims list</title>
<link href="https://src.rest/cat/tribes/commit/f78625aab5f9fd5916597a99d50c171ab31e9c94/"/>
<author><name>Dami</name></author>
<updated>2026-08-16T09:32:20-06:00</updated>
<content type="text"></content>
</entry>
<entry>
<id>1e9eebf91036a34599a02eb1e4894fda97fe55d2</id>
<title>chore: nightly dead-sim retry batch 32 -&gt; 150 (dispatch is cheap fetches)</title>
<link href="https://src.rest/cat/tribes/commit/1e9eebf91036a34599a02eb1e4894fda97fe55d2/"/>
<author><name>Dami</name></author>
<updated>2026-08-16T09:31:24-06:00</updated>
<content type="text"></content>
</entry>
<entry>
<id>74c16539e9856b33a9d908742747eb5d75f9232d</id>
<title>feat: urizen identicons per script + million-name friendly-id space</title>
<link href="https://src.rest/cat/tribes/commit/74c16539e9856b33a9d908742747eb5d75f9232d/"/>
<author><name>Dami</name></author>
<updated>2026-08-16T09:28:09-06:00</updated>
<content type="text">Identicons: hash(script id) -&gt; one Urizen tile (blank/solid tiles skipped
by deterministic ink-ratio probe, ruler columns excluded) x 20 tints x 12
border colors ≈ 1M stable combinations; initials remain as the pre-atlas
fallback and hovers carry the true identity when the pigeonhole pinches.
Shown in browse rows, the detail header, and proof chips.

Friendly ids: adjective pool grows to 219 and every noun pool to ~130-150
(pools stay disjoint), and collisions now escalate to a second adjective
(sly-ashen-wolf) before any numeric tag: ~30k short names per category,
then 6-7M two-word names. Stored ids never re-derive, so existing names
are untouched.</content>
</entry>
<entry>
<id>fbb5627df1448f5f3d8d5d02d195b6e00c13e696</id>
<title>fix: proper syntax highlighting, proof chips, quiet date pickers</title>
<link href="https://src.rest/cat/tribes/commit/fbb5627df1448f5f3d8d5d02d195b6e00c13e696/"/>
<author><name>Dami</name></author>
<updated>2026-08-16T09:20:15-06:00</updated>
<content type="text">One shared scanner-based highlighter (web/src/highlight.ts) replaces the
two regex one-offs: real lexer states for strings/templates/comments,
distinct token colors (strings green, numbers/literals violet, keywords
amber, function names yellow, state/memory/api builtins blue). Proof rows
become participant chips in place order — initials, crown glyph on the
winner, full result in the hover — instead of a sentence per sim. Date
filter inputs stay text-dim until they hold a value; picker glyph dimmed.</content>
</entry>
<entry>
<id>46dbdaf130b19acc3d476dc43869b1650c18af2f</id>
<title>feat: display-name changes carry a 7-day cooldown</title>
<link href="https://src.rest/cat/tribes/commit/46dbdaf130b19acc3d476dc43869b1650c18af2f/"/>
<author><name>Dami</name></author>
<updated>2026-08-16T09:02:37-06:00</updated>
<content type="text">Names are leaderboard identity; churn would make records unattributable.
An effective change (including clears) stamps name_changed_at; further
changes inside 7 days get a bad_input with the unlock time, same-value
writes are no-ops, and the sharing toggle is unaffected. UserInfo exposes
nameLockedUntil; the Account card shows the lock.</content>
</entry>
<entry>
<id>d42fe89fbd18d654acea8e85a04b6428af91b61b</id>
<title>fix: owners are never &#39;anon&#39; — display names + friendly-id fallback</title>
<link href="https://src.rest/cat/tribes/commit/d42fe89fbd18d654acea8e85a04b6428af91b61b/"/>
<author><name>Dami</name></author>
<updated>2026-08-16T08:53:16-06:00</updated>
<content type="text">Browse showed &#39;anon&#39; for every owner because shoo pairwise identities
carry no name. Owners now fall back to their friendly user id, and the
Account card gains a display-name editor (PATCH /api/me {name}, sanitized,
40 chars; also settable via the set_sharing MCP tool). Cron/ladder sim
computes now dispatch as self-invocations via SELF_ORIGIN so each replay
gets its own CPU budget instead of sharing the scheduled() budget, and the
nightly retry batch grows to 32.</content>
</entry>
<entry>
<id>f30c0b28fe0f2e0e48e4906207e9c3805cd963ef</id>
<title>fix: dead sim computes self-heal; login screen speaks agent</title>
<link href="https://src.rest/cat/tribes/commit/f30c0b28fe0f2e0e48e4906207e9c3805cd963ef/"/>
<author><name>Dami</name></author>
<updated>2026-08-15T23:46:09-06:00</updated>
<content type="text">The create-time replay is the only thing that rated a public sim — if it
died (CPU limit, crash) the sim was orphaned forever: no metrics, no
rating, and public sims reject client backfill. On prod 44 of 57 public
sims were orphaned this way, which also explains leaderboards showing W-L
records with zero battles (only quick, often battle-free duels survived
to the board). Now a metrics GET on an unrated public sim re-triggers the
server compute in the background, and the nightly cron retries a bounded
batch. Both paths are idempotent (metrics first-write, rating_events PK).

Also: the sign-in card now carries the agent pointer block (auth.md,
llms.txt, MCP, REST) so an agent landing on a login wall knows exactly
where to go instead of panicking.</content>
</entry>
<entry>
<id>b605f6b60db88e287e1073dcb058cee7e0fa8777</id>
<title>fix: account merge preserves public sharing</title>
<link href="https://src.rest/cat/tribes/commit/b605f6b60db88e287e1073dcb058cee7e0fa8777/"/>
<author><name>Dami</name></author>
<updated>2026-08-15T23:08:19-06:00</updated>
<content type="text">public_sharing lives on the user row; merging a sharing-enabled device
account into a never-shared site account silently delisted the whole
portfolio. The merge now ORs the flag. Regression test added.</content>
</entry>
<entry>
<id>4c45c65fcbb2fe2e8f2684fad67713f2cd57acff</id>
<title>chore: release script copies prod r2_buckets and limits into versioned configs</title>
<link href="https://src.rest/cat/tribes/commit/4c45c65fcbb2fe2e8f2684fad67713f2cd57acff/"/>
<author><name>Dami</name></author>
<updated>2026-08-15T23:05:21-06:00</updated>
<content type="text"></content>
</entry>
<entry>
<id>f7f6796eb8e5bb8c0eac9203f3070bcf390e7094</id>
<title>fix: badges never truncate and get their own table column</title>
<link href="https://src.rest/cat/tribes/commit/f7f6796eb8e5bb8c0eac9203f3070bcf390e7094/"/>
<author><name>Dami</name></author>
<updated>2026-08-15T22:58:49-06:00</updated>
<content type="text">.model-chip loses its 16ch ellipsis cap; listed/model/linked badges move
out of the name cell into a dedicated nowrap column.</content>
</entry>
<entry>
<id>46f297b5bca03c33388a963defbf833d87e35561</id>
<title>fix: Create page uses the viewport; state column stops word-wrapping</title>
<link href="https://src.rest/cat/tribes/commit/46f297b5bca03c33388a963defbf833d87e35561/"/>
<author><name>Dami</name></author>
<updated>2026-08-15T22:55:23-06:00</updated>
<content type="text">Wide layout (1560px) with the scripts table taking the 3fr column; STATUS
and EXPIRY collapse into one compact cell that only says something
noteworthy — &#39;rejected&#39; in red, or the expiry date for unpinned scripts.
Starred rows say nothing: the star IS pinned. Table cells never break
mid-word.</content>
</entry>
<entry>
<id>b3474cd58e3fe314743c482183810cf839a40cdc</id>
<title>fix: Connect is two semantic columns, not a card bag</title>
<link href="https://src.rest/cat/tribes/commit/b3474cd58e3fe314743c482183810cf839a40cdc/"/>
<author><name>Dami</name></author>
<updated>2026-08-15T22:51:41-06:00</updated>
<content type="text">Left: your account (account, identities, danger zone). Right: your agent
(connection card with docs folded in, examples). The paste-a-pubkey &#39;add
device key&#39; flow is gone entirely — UI and endpoint — the pairing code IS
how devices join. Identities show human labels (&#39;shoo account&#39;,
&#39;device 1a2b3c4d&#39;) with the raw identifier in a tooltip, and the link-code
output tells you exactly what to say to your agent. Sign-in copy no longer
mentions token minting.</content>
</entry>
<entry>
<id>1ac43a1714b671b73fcdfd33a90a5406ed854661</id>
<title>feat: device-pairing link codes — no more console-paste account linking</title>
<link href="https://src.rest/cat/tribes/commit/1ac43a1714b671b73fcdfd33a90a5406ed854661/"/>
<author><name>Dami</name></author>
<updated>2026-08-15T22:47:51-06:00</updated>
<content type="text">Connect &gt; Identities gains &#39;Generate link code&#39;: a short single-use code
(10-min expiry, sha-256 stored) that the device redeems — POST
/api/keys/link {code} or the new MCP link_account tool — merging the
device&#39;s account into the code-minting account. The gh-auth-login pattern:
the browser session authorizes the target, holding the key&#39;s bearer token
authorizes the source; nobody pastes signatures into a console. The signed
programmatic path remains as fallback.</content>
</entry>
<entry>
<id>3a41373036cc65a2c50216406e33e5e4e835e31f</id>
<title>feat: the social fishbowl — sharing, Elo boards, R2 storage, keypair identity</title>
<link href="https://src.rest/cat/tribes/commit/3a41373036cc65a2c50216406e33e5e4e835e31f/"/>
<author><name>Dami</name></author>
<updated>2026-08-15T22:40:54-06:00</updated>
<content type="text">PUBLIC SHARING: a one-time toggle + starring lists a script in Browse with
owner-editable metadata (title, description, model attribution from a
daily-synced models.dev catalog, opt-in source sharing). Uploads are
normalized (comment/whitespace-stripped) and hashed; a copy of another
user&#39;s listed script soft-links to the canonical. Hearts bookmark others&#39;
scripts into a liked pool usable in create_sim (+ ex_&lt;name&gt; example ids).
Trash: soft delete with 14-day restore; account deletion (REST-only)
anonymizes canonicals others depend on.

RATED SIMS: all-slots-listed sims are public and rated by the SERVER
replay only — pairwise Elo (K=24), idempotent per sim, sim_results as
watchable proof. Windowed boards rank rating gained (24h/7d/30d/6m);
updated/battled sorts; a bounded nightly ladder auto-matches
rating-adjacent scripts.

R2 STORAGE: script sources (src/&lt;hash&gt;.js) and sim metrics move to an R2
bucket; D1 keeps thin index rows with dual-read legacy fallback + nightly
backfill. Metrics are content-addressed by REPLAY IDENTITY
(sha256(seed+config+slot hashes), derived server-side — uploads cannot
land anywhere else) so identical roster+seed sims share one object.

KEYPAIR IDENTITY: the default credential is a device ed25519 keypair
(~/.config/tribes/identity.json, see /auth.md). POST /api/keys/auth signs
tribes-key-auth:&lt;host&gt;:&lt;ts&gt; and mints the key&#39;s single wire token
(replaced each mint). Authorized-keys model: GET/add/revoke identities in
Connect; shoo login becomes an optional link (account merge). The Tokens
page and /api/tokens are gone. user_identities lets one account hold many
credentials. robots.txt welcomes agents.

WEB: dashboard split into Connect / Create / Browse / Simulate tabs;
Browse is public (leaderboard, model filters, detail with proof sims,
head-to-head, versions, shared source). MCP: 10 new tools; llms.txt
documents the whole meta. Worker suite: 107 tests over a real-SQL
node:sqlite D1 fake + Map-backed R2.</content>
</entry>
<entry>
<id>d5920e46d0a04c5f311abc8da289de4f73077ff1</id>
<title>feat: territory as strategy — expansion decree, living borders, reachable ages</title>
<link href="https://src.rest/cat/tribes/commit/d5920e46d0a04c5f311abc8da289de4f73077ff1/"/>
<author><name>Dami</name></author>
<updated>2026-08-15T21:36:20-06:00</updated>
<content type="text">Territory is a choice, not physics. New decree(&#39;expansion&#39;, 0-1000,
default 500): the base camp footprint is automatic, but all reach beyond
it — tier, age, and population (+1 claim budget per 25 of isqrt(pop),
capped) — is scaled by the decree. Isolationists stay deliberately small;
manifest destiny claims every acre and borders keep creeping as the
civilization grows, so the territory chart no longer flatlines at tier 3.

Ages were unreachable in practice: age 1 needs 100 hides, hides come from
herd slaughter, and the founding herds were culled at the first slow tick
for lack of pasture. The hall now shelters a small founding flock (6 herd
+ 2 herder slots), and the reference bots manage herds with hysteresis
(slaughter fat flocks, spare thin ones), build pastures with pop, and
express territorial identity through the expansion dial.

Docs updated (decree table, territory-as-choice section, pasture note);
goldens repinned; test harness opts into full expansion explicitly.</content>
</entry>
<entry>
<id>7e8e1f813443346dd0091d102622be90fb2416d7</id>
<title>test: rework engine suite for the humble start (34 passing)</title>
<link href="https://src.rest/cat/tribes/commit/7e8e1f813443346dd0091d102622be90fb2416d7/"/>
<author><name>Dami</name></author>
<updated>2026-08-15T21:20:30-06:00</updated>
<content type="text">growBot harness bootstraps a ten-soul camp through the real build/tech
chains; goldens repinned; new invariant tests for the humble start,
threat grace, muster gating, sieges, ages, and sub-floor starvation.
Root typecheck now runs per-package tsc (tsc -b had no root project);
web vitest passes with no test files.</content>
</entry>
<entry>
<id>ebc7efc2126ea17197be150964bb7db50b408b07</id>
<title>feat: openlayers-style map camera — cursor wheel zoom, drag pan, minimap</title>
<link href="https://src.rest/cat/tribes/commit/ebc7efc2126ea17197be150964bb7db50b408b07/"/>
<author><name>Dami</name></author>
<updated>2026-08-15T21:20:30-06:00</updated>
<content type="text">Presentation-only camera over the native-resolution canvas: zoom-to-fit
default (reset via fit button, replacing zoom 1:1), wheel/pinch zoom
anchored at the cursor (fit x0.8 to 8x), pointer drag pan with edge
clamping, and a 140px minimap with viewport rectangle that recenters on
click and hides when the whole map fits. Tooltips account for the
transform; no page scroll in any mode.</content>
</entry>
<entry>
<id>6d99d4c45fbe67e41cc0ff009771a20ac00bd065</id>
<title>feat: make the war meta fire — stone bootstrap, raid no-ops, phased bots, bigger maps</title>
<link href="https://src.rest/cat/tribes/commit/6d99d4c45fbe67e41cc0ff009771a20ac00bd065/"/>
<author><name>Dami</name></author>
<updated>2026-08-15T21:20:30-06:00</updated>
<content type="text">- mine costs timber only (stone came only from miners, so a misspent
  starting 20 stone permanently locked a tribe out of the metal economy)
- raids on a target with no garrison, near-floor pop, and bare stores no
  longer resolve: no more farming a beaten camp for infinite battle wins
- warlord founds mining outposts properly: packs only affordable supplies,
  respects settle distance, retries instead of one-shotting; routes stone
  home alongside ore
- bulwark and magnate get phased labor policies (farm-first to ~150 pop,
  then their identity diet), affordability-aware build chains, reachable
  muster gates, and a landlocked check before betting on docks
- map ladder up one tier: 2-3 tribes 48, 4-5 64, 6-8 80 - most games now
  end with real wilderness between borders (~13% claimed in a 4-way)
- docs updated (map sizes, raid rule, mine bootstrap note)

Balance matrix (3 seeds x 8k ticks): every archetype wins somewhere
(homesteader 6, bulwark 5, warlord 5, magnate 2 of 18); bulwark counters
warlord 2/3; battles 87-1208 per warlord game, 0 in peaceful matchups.</content>
</entry>
<entry>
<id>f53f681ac4f9987df9040a4aa9c2fd754f910c9b</id>
<title>feat: organic territory claims + Ages prestige ladder</title>
<link href="https://src.rest/cat/tribes/commit/f53f681ac4f9987df9040a4aa9c2fd754f910c9b/"/>
<author><name>Dami</name></author>
<updated>2026-08-15T20:41:00-06:00</updated>
<content type="text">- territory: multi-source bucket-Dijkstra claims with terrain costs (plains 1,
  forest 2, swamp 3, mountain 5; water/river/volcano unclaimable) budgeted by
  tier — natural borders, chokepoints, no overlap; census/capacity derive from
  claims; TribeView.claims + SettlementView.territoryTiles; map renders true
  claim edges instead of squares
- ages: advance verb burns an escalating hoard to climb
  wandering-&gt;settled-&gt;crafting-&gt;high; each age +10% extraction/refinement,
  +3 warband power per soldier, flat score term and +25%-per-age score
  multiplier (prestige accelerator); age_advanced events; bots attempt
  advancement periodically; violet &#39;age&#39; series in the score breakdown</content>
</entry>
<entry>
<id>99e3ffb6e805a76bc32e040c5b6f64af8a071908</id>
<title>feat: tribe-scaled worlds, anti-rush drilling, resilient collapse, territory borders, identity cards</title>
<link href="https://src.rest/cat/tribes/commit/99e3ffb6e805a76bc32e040c5b6f64af8a071908/"/>
<author><name>Dami</name></author>
<updated>2026-08-15T20:24:12-06:00</updated>
<content type="text">- mapSizeForTribes: 2-3 tribes -&gt; 32, 4-5 -&gt; 48, 6-8 -&gt; 64; mapgen floor 32
- anti-rush: starter armory cut to 24 weapons/8 armor; fresh warbands drill
  250 ticks (60% power, raid/besiege refused) — WarbandView.drilling
- collapse resilience: settlement pop floor (40), threat arson capped above
  6 buildings, hall grants kitchen-garden farmer + salvage woodcutter slots;
  wars now end in devastated remnants and recovery, never extinction spirals
- map: dashed tribe-tinted territory borders per settlement (tier radius)
- chronicle rail: identity cards (portrait, name, @description parsed from
  script source, version ref); live vitals/feeds move to world mode
- bots: adaptive muster size, warlord feeds his war machine, @description
  tags; balance matrix now warlord&gt;homesteader, bulwark&gt;warlord, magnate&gt;warlord</content>
</entry>
<entry>
<id>3652add34c5dcd55cf4057c4f3df248f533c48bc</id>
<title>feat: 64x64 world, fullscreen no-scroll HUD, distant-view glimpse band</title>
<link href="https://src.rest/cat/tribes/commit/3652add34c5dcd55cf4057c4f3df248f533c48bc/"/>
<author><name>Dami</name></author>
<updated>2026-08-15T20:04:55-06:00</updated>
<content type="text">- MAP_SIZE back to 64; mapgen climate bands, biome blobs, lakes and veins now
  scale by area (old 128 sims still replay at their locked config)
- app locks to 100dvh with internal-only scrolling; endgame is a dismissible
  overlay with a HUD victor chip; home page in scroll columns
- distant view: persistent glimpse band (vision +5) reveals terrain CATEGORY
  only (&#39;.&#39;, &#39;f&#39;, &#39;^&#39;, &#39;w&#39; - veins hidden), hashed state, rendered at 35%
  alpha; TribeView.distant for scripts; overlay no longer intercepts the
  replay invite in world mode</content>
</entry>
<entry>
<id>87d1b333961f97129aac2471af5804e8817a12e5</id>
<title>feat: instant chronicle, game-feel HUD, Qud-style terrain variation</title>
<link href="https://src.rest/cat/tribes/commit/87d1b333961f97129aac2471af5804e8817a12e5/"/>
<author><name>Dami</name></author>
<updated>2026-08-15T19:38:24-06:00</updated>
<content type="text">- server precomputes full sim metrics at create_sim (waitUntil, 120s CPU
  limit); share links render the finished chronicle + endgame instantly;
  first-viewer client fallback POSTs the cache (first-write-only, gzipped,
  shape-checked); workerd encodeBody:&#39;manual&#39; + D1 blob normalization
- UI redesigned as a 1-bit terminal wargame console: VT323, punched-frame
  HUD panels, CHRONICLE/WORLD mode toggle, segmented game clock, faction
  panels with Urizen portraits, victory banner, telemetry-styled charts
- map: per-cell deterministic terrain variants + decor + tone jitter +
  shoreline treatment (23 new hand-picked tiles)
- world replay is opt-in: WATCH THE REPLAY boots the deterministic runner</content>
</entry>
<entry>
<id>759122afa16fae1a82b89c689416e8cf6096e70c</id>
<title>chore: replace middle-dot separators with plain hyphens repo-wide; untrack output/ screenshots</title>
<link href="https://src.rest/cat/tribes/commit/759122afa16fae1a82b89c689416e8cf6096e70c/"/>
<author><name>Dami</name></author>
<updated>2026-08-15T19:06:59-06:00</updated>
<content type="text"></content>
</entry>
<entry>
<id>f8b59892a0dbebdb7047701e974f70ab6255d424</id>
<title>chore: footer credit removed — art credit lives in README only (CC0)</title>
<link href="https://src.rest/cat/tribes/commit/f8b59892a0dbebdb7047701e974f70ab6255d424/"/>
<author><name>Dami</name></author>
<updated>2026-08-15T19:05:27-06:00</updated>
<content type="text"></content>
</entry>
</feed>
