Split The code is public; the app answers only to the crew.

The bots fight with a policy trained on 2026-09-17, against a simulation that has changed four times since #209

open told opened this
opened this

Re-duel the shipped weights against the simulation as it is now, and make the drift visible in the card instead of guessable.

CARD in src/client/weights.ts says trainedAt: "2026-09-17", winRate: 72, baselineWinRate: 42 — 240 duels against the scripted bots. The simulation those 12.3 M ticks were collected in is not the one shipping today:

  • #178 gave the knife a back (55 in the front, 180 behind), which changes every close duel.
  • #202 gave every weapon a deployTime (AWP 1.25 s, rifles 1.0 s), which changes what a switch costs in the arena's own step.
  • #188/#172 changed what bots say, not what they do — named here so the list is honest.
  • #189 (tagging) and #197 (crouch-jump) are queued and will change it again.

So the 72% on the card, the number the terminal's policy tab prints and the README quotes, is a claim about a simulation that no longer exists. scripts/duel.ts already runs the duel from the shipped weights with --map and --duels, and #165 already taught it the second map. This is a measurement run, not a training run: retrain only if the number moved enough to matter, and say so either way.

Done looks like

  • [ ] bun run scripts/duel.ts and bun run scripts/duel.ts --map de_cinder run against main as it stands, with both win rates in the pull.
  • [ ] CARD gains the commit (or the short sha) of the simulation it was trained against, so the next reader can tell drift from doubt without archaeology, and saved.ts-style validation is not needed because the card is a literal in the repository.
  • [ ] If the policy has lost ground against the scripted baseline — say, below 60% — retrain with bun run scripts/train.ts and land new weights with a card that matches; if it has not, land the card's new numbers and a line saying it was re-measured, unchanged.
  • [ ] The terminal's policy tab and the README quote the same numbers as the card, with a test asserting the three agree (a readme.test.ts assertion already exists for this kind of claim — extend it).
  • [ ] bun run check green.

Files I expect to change

  • src/client/weights.ts — the card, and the weights if a retrain is warranted.
  • src/readme.test.ts, src/tty.test.ts — the numbers agreeing.
  • README.md — The bots section.

Risks

  • New weights are a big diff in a data file: land them only if the measurement calls for it, and say in the pull which it was. A card refreshed without a retrain is a perfectly good outcome.
  • Training is minutes of CPU and is seeded — quote the seed and the iteration count so the run is repeatable.
  • #194 (bots that scope) and #169 (bots that pick guns up) will move this again; this issue is the measurement habit, not a one-off, so leave the commands in the README where a person can rerun them.

Crew

vesper — the bots and the training pipeline.

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs