Skip to content

Releases: jprodgers/CITAR

v0.1.5

Choose a tag to compare

@github-actions github-actions released this 23 Sep 01:41
08b80dc

Single-player fixes and more dangerous barbarians.

Added

  • A research queue. Shift+click a technology to add it (and whatever it still needs) to the end of
    the queue, or Shift+click a queued one to take it off, along with anything queued that depends on it.
    The tech tree numbers the queue on the technologies themselves and lists it along the top with the turn
    each will finish. A plain click still replaces the queue. The set_research tool takes append, and a
    new dequeue_research tool removes a queued technology.
  • Returning recaptured civilians. Freeing a worker or settler that barbarians took from another
    civilization asks whether to return it (a better opinion with a major civilization, +45 influence with
    a city-state) or keep it, as in Civilization V; left unanswered, you keep it at the end of the turn.
    New return_civilian tool; a civilian that was yours simply comes back.
  • Barbarian aggression, a 0-100 slider next to the barbarian setting in the new-game form (Normal
    defaults to 50, Raging to 85; the barbarian_aggression config key). It sets how far barbarians look
    for targets, what odds they accept, how many gather before storming a city, how fast camps spawn, and
    how hard a sack hits.

Changed

  • Barbarians are a threat. Barbarian units could not plan a path across their own unexplored map, so
    they only ever attacked what was already next to them. They now hunt cities, units, workers and
    settlers, and the most valuable improvements (luxury and strategic resources first). As in
    Civilization V they never capture or raze a city: one they bring down is sacked instead, losing
    gold, possibly a citizen and a building (never a wonder or the palace), and is then left alone for 5 to
    10 turns. Over 100 turns of a four-bot Quick Small game, units killed went from about 50 to about 240
    on Normal and from about 90 to about 650 on Raging.
  • Events no longer name civilizations you have not met. Every player, human or AI, reads "Unknown
    Civilization has built The Pyramids in an unknown city." until the two civilizations meet; unmet
    city-states are "Unknown City-State", and such events drop their location. Spectators and replays
    still see everything.
  • End Turn waits for decisions. The button is greyed out while research, a policy, a free
    technology or great person, a pantheon, a promotion, a city with nothing to build, a unit without
    orders, a negotiation or a UN vote is waiting; clicking it lists them and goes to the first.
    Ctrl+click (or Ctrl+Shift+Enter) ends the turn anyway.
  • Player colours are unique. A new 24-colour palette, picked for contrast on the map and against
    the city-state and barbarian colours. The seat editor offers it as swatches, greys out colours other
    seats hold and accepts a custom hex value that is not too close to one of them; the server enforces
    the same rule, first come first served.
  • The tech tree is easier to read. More room between technologies, right-angled links that never
    share a vertical run, and hovering a technology highlights everything it needs and what it leads to.
    The tree reopens where it was left, or at the current era.
  • More luxury variety on big maps. Huge and gargantuan maps now carry every luxury type, large at
    least 90%, standard 75% and small maps half; every map has every strategic resource.
  • The wonder-built event names the civilization first ("Rome has built The Pyramids in Rome.").
  • Bot seats in live games are seeded from the game's seed, as lab games already were, so the same seed
    and seats play the same game. Before, each live bot seeded itself from the clock.

Fixed

  • The Bombard button stayed after a city had fired, because the city's own view never said whether it
    still could.
  • Accepting or rejecting a proposal left the diplomacy window open while play went on; it now closes.
  • The interface was close to unusable while AIs played fast: every update rebuilt the top bar, the End
    Turn box, the side panel and the unit and city panels, so clicks landed on buttons that had just been
    replaced and dropdowns closed as soon as they opened (pausing a fast bot game could take a dozen
    tries). Each of them now waits to redraw while the pointer is over it or one of its dropdowns is open,
    and redraws with the first update after a click. Pause/Resume shows the new state at once.
  • Notifications covered the diplomacy window when a proposal arrived. Negotiation notices are no longer
    toasted while the window shows them, and any toast moves to the bottom of the screen while a window is
    open.
  • A rating test passed its message as assertAlmostEqual's places argument, so it raised a TypeError
    on Python 3.11 whenever the weighted pair count was not exactly 2.0. Tests only; the shipped code is
    unaffected.

Known issues

Model scores are not comparable across 0.1.4 and 0.1.5: barbarians fight far harder, and agents no
longer learn about civilizations they have not met from the event feed. See
KNOWN_ISSUES.md.


Checksums

92bdbb2ebc3f86bc98a9ab976b361966a466619093351152cdd775053c65ea1c  CITAR-0.1.5-setup.exe
d1274590d9b0a81adf453afb8d0570d3eeedb2934a247daf68d9614ee7eb1430  citar-helper-windows-x64.exe
38a577963b0d219f689fc2112613c9d724e8624b014e069f26bbbbf34bc6430a  CITAR-0.1.5-windows-x64.zip
5cf9aaea07a223f962505099aade681151868a446fe2a92d30145f33bf8ba374  citar-0.1.5-py3-none-any.whl
7d81063c228e3987e3e8cdda77b984d1c57af0b91027402e73ab4ce8b0311b62  citar-0.1.5.tar.gz
f8e59b482a56fa568a356e4c16e3a9113e9e43a7a1620f6aec29344aca85d44f  citar-helper-macos-arm64
69b63c8c045c65e4333bb4341fe9d950789523fdfacc5fd7a8d1aeb975d0edb4  citar-helper-macos-arm64.sha256
079da22588aa3e5d1ab7da2734444b0ed7fe4952266d107bd977b295089ca419  citar-helper-linux-arm64
6029ea88798b2ec1deac4c2d2d860a810d527bb6008f5d1e9a535bad112b2d26  citar-helper-linux-arm64.sha256
b8fb7722d6e4b4ebb65496c1c13553f298e51bfec9720ee2190586a38947eb99  citar-helper-linux-x64
22b621fc3183fc625d4241b520ee7c6d78f0b61e49f1a220ad9fa297b83877af  citar-helper-linux-x64.sha256

v0.1.4

Choose a tag to compare

@github-actions github-actions released this 22 Sep 20:56

Added

  • Bot profiles and a Bots page. Every number the scripted bot decides with (about 360) is now a
    named parameter with a label, an explanation and a range. A profile chooses the bot's code (the
    live bot or a frozen snapshot), its aggression and any parameter overrides. The new Bots page
    lists the profiles, forks and edits them (grouped parameters, search, "changed only", reorderable
    preference lists), keeps a revision history with notes, and queues an A/B test between
    profiles as a lab experiment. Lobby seats, benchmark scenarios and probe runs can pick a profile.
  • "Best bot" for new games. A bot seat in the new-game form defaults to Best bot: the highest-rated
    profile on the server (one whose current settings have been rated), fixed into the seat when the game is created
    so the game keeps that bot. The dropdown lists every profile in ranking order with its rating. Benchmark
    scenarios and probes offer it too but keep Standard as their default, so benchmarks stay comparable.
  • Bot rankings. Every lab game feeds an Elo-scale rating (a Bradley–Terry fit on each game's
    finishing order) per exact configuration and difficulty, with standard errors, head-to-head
    records, score index, win rate and a rating-over-time chart. Older results are rated too.

Fixed

  • "Enhance religion" was offered as available away from a city, and "Spread religion" for a unit carrying no
    religion; both were then refused. The scripted bot's Great Prophets could retry the refused enhance for the rest
    of a game instead of walking to a city. Both actions now say what is missing, and the bot moves its prophet.
  • Lab reports and citar bench left eliminated civilizations out of their results (see Added).
  • A spaceship could never be finished, so there were no science victories. Items "Limited to [n] per
    Civilization" counted their own place in the build queue against the limit, so the last one allowed was
    accepted and then silently dropped from the queue the next turn. Parts limited to 1 (Cockpit, Engine, Stasis
    Chamber) could never be built, the third Booster neither, nor a civilization's fifth Recycling Center.
  • The per-turn production statistic (graphs, replays, lab checkpoints) was always 0: it read a city attribute
    that doesn't exist. It now records the civilization's production.

Changed

  • A stronger scripted bot (v2 defaults). Nine of the bot's parameters changed, each one measured in the
    lab over roughly 200 full-length games: wonders are no longer gated to high-production cities and are worth
    more, building values are no longer cached between turns, great-person points count for three times as much,
    the field army gathers before a war is declared, and spaceship parts, Apollo and victory buildings are finally
    valued as what they are — the things that win the game — with Aluminum kept in reserve for them. Against the
    old defaults this is worth about +0.09 score share (roughly 140 rating points), with more cities, more wonders
    and fewer unhappy turns. Science victories now happen (3 to 6 games in 24 to 40, where the bot had never
    achieved one). The trade-off: this bot expands rather than fights, and captures far fewer cities than before —
    the first thing being worked on for the next version. Every old configuration is still available as a bot
    profile, and existing profiles keep playing what they played.
  • Running and finished work no longer share a colour. Anything in progress — a running experiment or
    benchmark job, a connected helper, a live runner — is blue; anything finished or ready is green, with a ✓.
    Finished saves in the lobby and finished side runs in the lab say so in green instead of grey, so a glance
    at a list tells you what is still working and what is ready to read.
  • Long moves keep their route. A move order's route is planned once, when the order is given, and a standing
    order follows that route every turn instead of re-planning it. When a unit steps onto the route - your own or
    anyone else's - the moving unit waits with its order intact and carries on when the way clears; it used to lose
    its order and need re-directing. An order still ends on arrival, when a new enemy comes into view, when the route
    turns out to be impassable, or after three turns without getting any further (with a notice). Only a new move
    order plans a new route.
  • The bot's code was reorganised so its constants are parameters. With default parameters it plays
    exactly as before: seeded 250-turn games with both production modes and every optional behaviour
    switched on give bit-identical results to the previous version.
  • Lab results record each seat's profile, revision, fingerprint and actual aggression.

Known issues

The scripted bot now expands well but rarely fights: about 0.08 captured cities per game against the
old defaults' 0.42, and a bot of middling aggression may never declare war. Model scores are
comparable within a release and not across 0.1.3 and 0.1.4, because the bot changed.
See KNOWN_ISSUES.md.


Checksums

a3bdb615ade35b120c04ec2343d5c246a94b41ec5c4f89ec654796c74e17d91f  CITAR-0.1.4-setup.exe
e1ea2a6e3c3f2b415f16d21c26d85acfb08ec5bf7a572992cd9c241a3e0aadfe  citar-helper-windows-x64.exe
ed94c8c0c0a208a6999bdbd3167070b39d75d32552cbcbdf3a61f0e1091bd7d6  CITAR-0.1.4-windows-x64.zip
1310cb98a00c98fa6f240684597b93768b3086d4ac1eac0c03a15e274fa10047  citar-0.1.4-py3-none-any.whl
7c206c46a464b8fcb788ddfe28083c0948e7eed55951f1c9c08612412687cbe5  citar-0.1.4.tar.gz
dd3490660e0172e768f18357b431686042659a1c38410eb3a41ac9b37ec134ad  citar-helper-macos-arm64
28e8b513a2f1983f85d7009638b39675934f4e89b08b21704a236c199af4a584  citar-helper-macos-arm64.sha256
b3c95cdb6fbc9e903628afbd8faa52f8c758c181a11b8cd86f1e9535be698dcd  citar-helper-linux-arm64
80a4699987c47b0dab94dd4d9fd68e26a80a3da386e43b5c63e3f8b24c75521d  citar-helper-linux-arm64.sha256
f318969915a5e45b2d5dd5b932c44a9ccae5d617a9fbc66e511dcaf11cb5ea46  citar-helper-linux-x64
aa4a1c070afb58f43952db1e197874ccdced94fa61e5f46c359db29a43b82045  citar-helper-linux-x64.sha256

v0.1.3

Choose a tag to compare

@github-actions github-actions released this 22 Sep 04:22

Added

  • One prioritised queue per model machine. Games, benchmark jobs, probe runs and reports whose
    analysis a model writes share a single ranked list for each machine, on a new Queue page.
    Higher priority runs first, then whatever has waited longest. Running work is in the same list:
    put something above it ("⤒ top") and the running work makes way at its next safe point, then
    carries on by itself when it is back on top. Equal priorities never interrupt each other. The
    page also shows the lab's experiments, with their own priorities, and this server's CPU load.
  • Quiet hours for Servers-page machines. Each machine has a Quiet hours setting, read in its
    owner's time zone, that applies to everyone including its owner: games, benchmark jobs and probe
    runs finish the turn in progress, pause, and resume by themselves when the hours end. Lobby games
    now pause in quiet hours too (they used to keep running).
  • Costs for Servers-page machines, and energy per task. Machines registered through the helper
    were recorded in the usage ledger but never priced. Each machine card now has Power & costs
    (watts, hardware price and lifespan, electricity plan), reports include these machines, and a new
    report section, Energy and efficiency, compares each model on each machine: kWh, electricity
    cost, Wh per game, per model turn and per probe case, output tokens per Wh and per second,
    performance per kWh, and cost per task. A machine registered again keeps its earlier usage.
  • Reports can be written on a helper machine and wait for it in the queue like other work.
  • Benchmark scenarios take the map options (edges, rivers, resources).
  • deploy/citar-lab.service runs the bot-vs-bot lab as a low-priority service beside the server.

Changed

  • Pausing a game stops its clock. Paused time no longer counts toward a turn's duration or its
    time limit, and an AI paused mid-turn waits before its next model call instead of playing on.
  • Finished games leave the current-games list by themselves, ten minutes after the end once
    nobody is watching. Their saves and replay are kept, as with Close.
  • Probe runs on different machines run side by side, and a run waiting for its machine no
    longer holds up runs for other machines.
  • A machine is freed as soon as its model is eliminated; a benchmark job whose model is out ends
    there instead of watching the bots play on.
  • The Servers page says which hours are which: a group's window is now "Allowed hours" (when the
    people you share with may use a machine, never limiting you), distinct from the machine's quiet hours.

Fixed

  • Lobby games survive a server restart. Open games used to disappear until reloaded by hand.
  • Reports show on the Reports page. The site's security policy blocked the report frame, so the
    page looked blank; reports are now served with their own strict policy (no scripts, framable only
    by the site).
  • A closed game stays closed. Closing a game during an autosave could bring it back after the
    next restart.
  • Benchmark jobs pause with the machine their game really uses, even after its seat was moved to
    a re-registered machine.
  • Queued work waits for a machine a game is using instead of fighting it for the slot.

Checksums

4f28b2c93d629b90e2079e2a21b0f7ef6dec92657738f64c67828356dc63a4c4  CITAR-0.1.3-setup.exe
74cc66a337c0f0f948bb8933dad82d9d5da8335850ba61164a325194906054a9  citar-helper-windows-x64.exe
8e718c98bbdbff804a135baac8fbf4f4781375d4854d6a136b07e77ff6143f5b  CITAR-0.1.3-windows-x64.zip
49bf487dd417f82c9cd17581a9d7f91f5be4a45f04210889add178f93ce120e7  citar-0.1.3-py3-none-any.whl
107ec57818eed1468324688435733f11874abd0c7adc67b8e8490f0d1144943a  citar-0.1.3.tar.gz
298c60ce11d819f2f68df094db49c5a2dcc0b2c34e5d8bbf582023834e2894eb  citar-helper-macos-arm64
67ca13505d6dafdcf652892be4666ad5d92a49577645b49be4b30a75ef5fb907  citar-helper-macos-arm64.sha256
10555c33ed60471a3065c15d72b512c931931e0aa5afa19e79725cd39b3fd374  citar-helper-linux-arm64
b8e6563be474a013a2de7f16721155d6aa28cef869fcfe5b55cd89a34e8f90d0  citar-helper-linux-arm64.sha256
08f54cbc8f9c4c6178ac628439791026d31f59c9fec5d36e8f5bfa7a5e7219d5  citar-helper-linux-x64
10c60a4de12f470784d3afd51d05ec4bcb62c7732a55c1a7bb408acf9c178715  citar-helper-linux-x64.sha256

v0.1.2

Choose a tag to compare

@github-actions github-actions released this 21 Sep 14:30

Fixed

  • Machines on the Servers page can play. A game seat could only use a server from the admin
    registry, so machines registered on the Servers page and connected through the CITAR helper never
    appeared in the new-game form. They now do, with the models their helper reports (the loaded
    one first), and a seat on one plays through the helper. Creating a game checks that you may use
    the machine for games right now, and says why not if you can't.
  • The Linux helper connects on any distribution. It carried its own OpenSSL, which looked for
    CA certificates only where the Ubuntu build machine keeps them, so on Fedora, Arch and others
    every connection failed with CERTIFICATE_VERIFY_FAILED. The helper now also uses the
    certificates it ships with and the usual system bundles; verification is as strict as before.
    The release build checks the Linux helper's handshake inside a Fedora container.

Checksums

5e3832ec12a51d9a6d1e853f4160f7fda69a9c1499b94deb63ec57f198940cf1  CITAR-0.1.2-setup.exe
badd9f61bc14a773593c8efec09e204ac5f59d78df17f3d98c77f877286dfb67  citar-helper-windows-x64.exe
6622427b05a6560fcdad969bb7015c0709758272321e3785cacf09ab4a8d6da3  CITAR-0.1.2-windows-x64.zip
c2f3c69667244dcf993d5bffe0abd879b4685e45ed221c47a988a3a7e118a25c  citar-0.1.2-py3-none-any.whl
a4e31ce757d3293e2d65f959f6626811c8b61c7ba78e22634b9608eefa5a56bf  citar-0.1.2.tar.gz
dc46442775541b0676bb6d38c9a2b2aa89c55062acf61a0b500fd9b4544c131c  citar-helper-macos-arm64
7a0c3e69a494c1f23b60e40784f13194af16019f0dec5af4ee32ed34760a88d9  citar-helper-macos-arm64.sha256
906ecd9ffe5043c90b962389f371f61a18f8d9fc1f6a767655adf4d3ec2e8ea9  citar-helper-linux-arm64
17f9c0fb9bee2e3bdd62150e33a581ae27d7386a18078ef763caf6b53a468f65  citar-helper-linux-arm64.sha256
0a22ec003145ddff0b0ca4a56d19c32116a903ecbf4ef777069cee70778fb28d  citar-helper-linux-x64
b6b6ccaa02cb4cdf57051f13b920111e527cb9fab685a5e059fb898b89fbec1a  citar-helper-linux-x64.sha256

v0.1.1

Choose a tag to compare

@github-actions github-actions released this 21 Sep 12:12

Compatibility

  • The same seed now makes a different map. The generator changed (ice, rivers, noise, and the
    luxuries that used to be missing), so a benchmark suite run on 0.1.0 and on 0.1.1 did not play
    the same worlds, and scores across the two are not directly comparable. The scripted bot is
    unchanged.
  • Saves from 0.1.0 load as they were: an old game keeps its map and simply does not wrap.

Maps

  • Map edges are a lobby option: ice caps north and south (the default), wrap east-west, wrap
    north-south, wrap both ways, or boxed in with ice on all four sides. Wrapping is real, not a
    picture: movement, distances, borders, sight lines, paths and the LLM briefing all go the short
    way round, the map scrolls without end, and the noise that shapes the land repeats across the
    seam so no coastline is cut off.
  • Polar ice is now a band one to four tiles deep that drifts slowly along the edge, instead of
    scattered blobs of sea ice.
  • Rivers always reach the sea and never cross. Every hex corner learns its way downhill to the
    coast first, and rivers follow that drainage, so two that meet merge into one. A river
    density
    option (0–300%) sets how many there are.
  • Resource controls: overall density, a density for each of strategic, luxury and bonus
    resources, and per-resource rules for strategic and luxury resources — off, at most N tiles, or a
    percentage share of their kind. The map editor's generator has the same options.

Fixed

  • Fourteen luxuries (Cotton, Dyes, Gems, Gold Ore, Silver, Ivory, Silk, Spices, Sugar, Marble,
    Citrus, Copper, Salt, Truffles) never appeared on generated maps: their "doesn't generate
    naturally on hills" rule was read as "doesn't generate naturally". Maps now carry the whole
    luxury set.
  • A free technology (the Great Library, Liberty, ruins) can be chosen by a human player again: the
    tech tree now says a free pick is waiting, highlights what can be taken, and a click learns it
    instead of changing the current research.
  • An LLM whose server dropped for a few seconds no longer loses dozens of turns. A worker's
    disconnection was reported as a model error, which skipped the turn at once, and the next one,
    and every one after, while the bots played on.
  • The worker (helper) gave up for good when the server refused its connection — which is what it
    sees while CITAR restarts — so every worker stayed offline after a server deploy. It now retries;
    only a refused token stops it.

AI players

  • Reconnect wait and disconnect rule: a seat that cannot reach its model server keeps retrying
    for a set time (180 s by default, per game or per seat), without that time counting against the
    turn. If the server is still gone, the game either pauses — everyone, until the server answers
    again, then resumes by itself — or skips that seat's turn, as chosen in the lobby.

Phones and the helper

  • A phone site: phones get a check-in view of the server — running games, standings, whose
    turn it is, AIs thinking or reconnecting, benchmarks, reports and machines — with Pause/Resume.
    The full site is a tap away and the choice is remembered.
  • The CITAR helper: the worker as a single download for Windows, macOS (Apple silicon) and
    Linux (x64, ARM64), built with every release. The Servers and Models pages offer the right file
    for the visitor's computer. Started with no arguments it asks for the server and token once and
    remembers them.

Checksums

be112a162666890476b781eb95ebcdb07fecc45fe5d8f555adc5dc3d5bae5932  CITAR-0.1.1-setup.exe
5fd80b5a1128b27d7b097a59b2b85a117d332a18aa778bd47f775d4782ee72db  citar-helper-windows-x64.exe
218a1070db3faf74a6831aede55bb02ca0d7682afca5ca2cccad3d8fdc7c58e3  CITAR-0.1.1-windows-x64.zip
1b97022118eaf317aa8006dcdea5973c7de867c39204df9211a56102eac59b92  citar-0.1.1-py3-none-any.whl
3fd72d721c77b3edecd24c44ee0e932d31199d2b4d45fd78e8e130fdaafd92e2  citar-0.1.1.tar.gz
9a67c9a2b769647f4218af67372e50d6e9b41cf6669a82aacb347b506b602b6b  citar-helper-macos-arm64
85f7ce32573e3cbd8288a40100f730feabba1c4300e2d02fcf69e19bdf98c109  citar-helper-macos-arm64.sha256
c4a80af09a85f70a6b04bde143ffb5e842cb6f3539d5cd187f796b98b53322e0  citar-helper-linux-arm64
41308971f20d75ab6f531731bc2d3dd30d640b7eb6e1c21f4d0aed187c771147  citar-helper-linux-arm64.sha256
ba2bc5c81fdc8d542814caf9875583701f3aae9d9ca983d2ec9cd5e32632f55c  citar-helper-linux-x64
7cb013aadf484bfe3c79ea1809c47008ffe43f45501dce250ca3bdc7f77bed3c  citar-helper-linux-x64.sha256

v0.1.0

Choose a tag to compare

@github-actions github-actions released this 21 Sep 08:52

The first public release. CITAR has existed for a while as a private project; this is the version
somebody else can install.

The game

  • A Civilization V-style 4X game with the rules, numbers and much of the logic derived from
    UnCiv's "Civ V – Gods & Kings" ruleset: all nine eras, 35
    civilizations, 40 city-states, religion, social policies, wonders, great people and golden ages,
    espionage, city-state and diplomatic victory, and nuclear weapons.
  • Map sizes from Duel to Gargantuan (160×100, 24 civilizations), four game speeds, eight
    difficulty levels, five victory conditions.
  • A browser client with no build step: canvas map, city management, tech tree, policies, religion,
    espionage, a diplomacy deal builder, and a turn-by-turn recap with every AI's recorded reasoning.

AI players

  • LLM seats driven by the server, through the Anthropic API or any OpenAI-compatible endpoint
    (LM Studio, Ollama, llama.cpp, vLLM).
  • MCP seats for external agents — Claude Code, Claude Desktop, anything that speaks MCP —
    including wait_for_turn, which blocks instead of polling.
  • Scripted bots that research by need, pick buildings by simulating the city with each
    candidate, run religion and espionage, and wage war with siege units and rally points.
  • Guard rails for weaker models: repeated actions refused, unchanged queries collapsed, tool calls
    written as text recovered, per-turn progress notes, and an ALERTS section in every briefing.

Research tooling

  • Benchmarks: suites of models against seeded maps, sequential or parallel, with restricted
    hours per server, and runs that survive a restart by reloading games from their autosaves.
  • Model scoring: performance against the strongest bot, reliability and speed, with adjustable
    weights.
  • Scenarios and probes: a map editor, a scenario editor, and repeatable per-case decision tests
    with expected outcomes and pass rates.
  • Metrics: per-seat, per-turn timing, tool mix, errors, loops, tokens and turn endings,
    exportable as CSV.
  • Servers, ledger and reports: a registry of every machine that runs models, a usage ledger
    that records work without prices, and self-contained HTML reports that price it at report time —
    so correcting a rate corrects every report.
  • The lab: a resumable queue of bot experiments, with bot code frozen at submit time and
    factorial screening of parameters.

Multi-user

  • Accounts, invitations, single sign-on with Google, GitHub, Discord and Microsoft, e-mail
    verification and password reset.
  • Sharing with per-object visibility, public spectator links that never imply the right to play,
    and seat tokens that grant exactly one seat.
  • Pooled hardware: groups, grants, availability windows and per-account budgets, which are
    accounting and admission control only — there are no payments anywhere.
  • Workers: a machine at home serves its models to a remote CITAR over an outbound WebSocket, so
    nothing needs to be opened on a router.

Packaging and setup — new in this release

  • pip install citar, with extras per role (all, server, worker, and one per provider).
  • A Windows installer that needs no Python, an install.sh for macOS and Linux, an
    install.ps1 for Windows, a Docker image with a compose file that terminates TLS, and
    Homebrew, Scoop and winget manifests.
  • A unified citar command: serve, setup, doctor, where, admin, worker, mcp,
    bench, sim, balance, lab.
  • citar setup, an interactive wizard with three flows — this computer, a public server, or a
    worker — each of which collects a plan, shows it, and asks once before writing anything. Every
    question has a flag, so installers run the same code unattended.
  • A first-run wizard in the browser that finds the model servers already running, reads the
    machine's GPU, and suggests a model that will fit — or explains what to install for the hardware
    it found.
  • An operator console (#/console) showing what is configured, what is missing and what each
    gap costs, with runtime policy editable in place and a test-e-mail button.
  • A front door. On a public server, the root now explains what CITAR is to signed-out visitors
    and offers the install command for their platform, instead of showing them a login box and
    nothing else.
  • citar doctor: versions, dependencies, directories and their permissions, configuration,
    database, ruleset, every model endpoint, and whether the port is free.

Fixed

  • State no longer lands in site-packages. Every module used to resolve its own directory from
    __file__, which worked in a checkout and wrote saved games into the installed package
    otherwise. citar/paths.py is now the single answer, and it distinguishes a writable source
    checkout from an installed copy. The database and secret key never land in a checkout at all,
    because a synced project folder corrupts a live SQLite file.
  • The route audit was checking about half of what it claimed. Recent FastAPI wraps each
    include_router call in an object with no .path, so a loop over app.routes walked past every
    route on every included router — which is the whole authenticated API. It reported 83 routes and
    a clean bill of health; there are 172. It now recurses into included routers, carries their
    prefixes and router-level dependencies, and recognises the gates that are inner functions. It
    also no longer prints "OK" underneath a list of unguarded routes.
  • The lab runner could not start a game. A refactor removed the module-level ROOT that the
    subprocess launch used, leaving an undefined name on a path only the runner takes.
  • Three closures captured a loop variable in the scenario editor, natural-wonder discovery and
    the lab's queue mover. Each was safe as written and would have broken the moment the call became
    lazy; all three now bind explicitly.
  • Database migrations are packaged with the wheel. They were being dropped by a rule that collects
    data files and skips .py, which would have produced an installed copy with a migration
    environment and no migrations in it.

Known issues

The scripted bot is limited by happiness and stalls at two to five cities by turn 150, which caps
how hard it can push a model. See KNOWN_ISSUES.md.


Checksums

bbfd316c2d74722c298c2f747104e25e82fbc0b2b55c3c9eba99a7d060985907  CITAR-0.1.0-setup.exe
b485879157709ec95c73cf76854dca1d3e010dde3dae96c02be085b8654f3caf  CITAR-0.1.0-windows-x64.zip
0a5dd366d4460956a1560dc8024e48f8ed4a6397dcf4dcd4e5ec159ede9c41cd  citar-0.1.0-py3-none-any.whl
0263227138c109d8b750ec7fcce8a1677c223f1388ba933359533df1b6b4f5e9  citar-0.1.0.tar.gz