Tags

Tags give the ability to mark specific points in history as being important
  • 1.1.6

    5d0df414 · release: 1.1.6 ·
    Release: 1.1.6
    Patch release 1.1.6
    
    Bug fixes
    
    * tui: disable coloured themes on window$ (dd5d27ea4da898a68c7aee67dbcd3066fa34916f)
    
  • 1.1.5

    ab89fc18 · release: 1.1.5 ·
    Patch release 1.1.5
    
    Other changes
    
    * server: log warnings when redis `DECR` fails (1c1f7215b4adcbe4d1f7838667654b08e4a927fd)
    * docs: `ln -s README.md CLAUDE.md` (ab00c6b0dd0ac200a989fdf2d01f5fe167f70be8)
  • 1.1.4

    26968682 · release: 1.1.4 ·
    Patch release 1.1.4
    
    Bug fixes
    
    * deploy: fix service account for monitoring (5dd1db8b61ca142f4cccf775a9203b3f10c6ea43)
    
     Other changes
    
    * deploy: remove annoying error rate alert (83874f9b73fadf6397fc572827a42fa0eff9e60f)
  • 1.1.3

    dc423e74 · release: 1.1.3 ·
    Release: 1.1.3
    Patch release 1.1.3
    
    Bug fixes
    
    * release: move git push before goreleaser (eba823216d401d80c3f478943fb2211ca5d818cb)
    * release: use git history for goreleaser (352d49fc434f171067ab5ab2f1412863507ba07c)
    * tui: give clients more opportunities to connect after heartbeat failure (88d5010c1a05a686d3b926278402423c8bfb0d06)
    * www: fix yolo install script on arch linux (7e97e696e5446da235370174cdb0b677f7bf8483)
    
    Other changes
    
    * release: source `.env` if it exists before releasing (9a480a839e07c033b57302c517cf81b654ad915e)
    * scripts: easier local terraform apply (9301edafe48cfc978e45c0899e1a843aa538a46b)
    * deploy: tweak error rate (8cef0711092062d58e61ed0473993d781250c3d7)
    * deploy: tweak alerting parameters (bc9c755c5db2702cef9ca52e9f7a02a4c0a816e0)
    * deploy: add slack webhook to monitoring (3e876a74b35ef233db97eda7a2123ee2d2faf76b)
    * deploy: monitoring (52b472ed64c0a3eefa37ff2c29ce59228131d85c)
    
  • 1.1.2

    8eeeeefe · release: 1.1.2 ·
    Patch release 1.1.2
    
    Bug fixes
    
    * www: remove rogue closing tag (3d9e46df74e6bd399c7d8f6535c2e0250e7776ac)
    
     Other changes
    
    * release: ignore backend-only tags (b0eb4f95b774279092834876c2e5e4ba571f2f71)
    * release: check release exists on gitlab after goreleaser returns (5bf9890dd18539af932b960c192eefbfe381558a)
  • 1.1.1

    cf7f3a93 · release: 1.1.1 ·
    Patch release 1.1.1
    
    Bug fixes
    
    * deploy: fix bad postgres `work_mem` setting (74091da9d0485526084caaa1f9110ceaf0338295)
    * www: tone down sprauncy border colour (cc869ae867ef8340b62fb1de6336b62f35ad6429)
    
     Other changes
    
    * ci: add comment (a1d11edef0cbdb9ae6f435b3a01f45117986f21d)
  • 1.1.0

    4da7c1c9 · release: 1.1.0 ·
    Release: 1.1.0
    Minor release 1.1.0
    
    New features
    
    * www: static project page (628b70573080a3db2ae43623d645dca0a72fe0c2)
    * tui: support random colour selection (540c5f3bd949de565813bc5ea45ba85a6238e785)
    * tui: new themes, dark and light (79101feb8b40344bcb02ea49417b73ed20f2b2c1)
    
    Bug fixes
    
    * release: git add changed files before releasing (eb53f70a8f351322701f684290756011911ba43a)
    * release: re-order make release steps (24b23748209fc1305cd1491da953fc5056f0a1e5)
    * tui: stop renderering theme shortcut hint when themes are disabled (9ff829c321465f146653bb9a359a90c9afaa23ff)
    * deploy: bad ci config (ac2a23f3b7f6f33cd457207eaef9da7b59639890)
    * release: reorder release steps (6935bb2a25ee6f4f6a72e4e53a2b58ce54d1f3f0)
    * deps: upgrade `please-release-me` to `3.4.1` (d2470ca6baa3b97b8e4225da846e95d61c4f99c4)
    * server: increase retries when creating network games (9f24bdb8699b703faa3e4be4466593bfb85b8687)
    * deploy: fresh CLOUDFLARE_API_TOKEN for the www pages job (41819c4b2a516b7af676d00ec5efb4cbc8f41699)
    * tui: use player colour for turn input (6ba242b54924fd0db3d1d1e077945e70a7012415)
    * tui: retry create network game request (a4b3beb98432ae968d628670656f8759dae185b8)
    * tui: apply theme colours to puzzle board (b16f80f494e9ea20ca8fd8a5d1beb586c020cfdc)
    * tui: better indication of available themes (682ca08621a093ff7959b44b4009857a9e2023d6)
    * tui: fallback text for blank player names (4b0f7409314bca800197e21ea9c5fc86ad084f72)
    * tui: prevent blank player names (96c4b68074383ffdf2cf07064f9761257c1fef2d)
    * tui: fix race condition in close logic (f68bab0de32d7a5c704cc4dea1772c25195f0116)
    
    Refactorings
    
    * tui: make layout and colour handling more easily themable (e8f7db44365ab2c53110ca0f7861551ae1604446)
    
    Other changes
    
    * bot: update copyright (f88074a2368e84bba291bf61d0f77732d3091486)
    * repo: update ignore file (819be00e243ec235dd167ad9dd20e2b04fa41ece)
    * www: remove blank line (679194efd3d709ac83e42ebd2fbc42eb6c282403)
    * release: run regular tests when releasing (3f15f3ed2564c4b79a9542f75cd3f10e12ad95c2)
    * deploy: smoother install instructions for debian and red hat (d55121f299a3ebf3aedb9e69dd992787a8b15c6a)
    * deps: upgrade please-release-me to 3.4.0 (60c2b3940a35f0629da8a67af785e3295233bba3)
    * deploy: goreleaser wiring (7a23a2d954a78413cb2602359056892b44a3acf4)
    * www: restructure sections and nav (e91519bcf18cea52237373c455c32bbc42c6c38a)
    * deploy: increase postgres `work_mem` to 12M (fcb423c3bf6fcdfbd13150f45b544a0aef87316f)
    * server: bump postgres connection pool size to 12 (561d4d7499bdacf42ad7e14e7523907a089bb6f8)
    * www: increase light theme contrast (13c82ea1e3356d9d4ee7c2fec0a3b0573ca5a37e)
    * deploy: add deploy job for www (62ce254603737803809fa976efd35ad29200ca7c)
    * www: add 404 page (30b297419e4009f67efa1b7dcedaa5b663badcfe)
    * tui: allow q to quit from any menu screen (eventually) (4f8fde1b104992a893743906491dc5a0fe1ea926)
    
  • 1.0.5

    f4d94f69 · release: 1.0.5 ·
    Patch release 1.0.5
    
    Bug fixes
    
    * infra: reserve more ip addresses on vpc network (03eadb97feebb367b6bc0490d5e5406645a8fff2)
    * server: restrict request bodies to 4kb (c8c0e12e8be80944ff25b04af11183b09a348a05)
    * tui: check game state if turn fails (d71ffd73aaf72fa9bb33ed82cf7f4a8a20e3b1aa)
    
     Performance improvements
    
    * tui: cleanup resources (76af530773024e00eca84ad1fce60e41ab43031a)
    
     Other changes
    
    * server: add cooldown period for rate limit persistent offenders (d649ebae21e61b1658aca327b6662746934607f9)
    * server: rate limit unauthenticated requests (3ffc9b2c9260ce80be7ea084abb7e9f1919970ea)
    * server: cleanup old heartbeats (c6d19aca1c1a0cc44e5be00073f168402344ae6d)
    * multiplayer: reduce client timeout to 10 seconds (1a29a2c171471aced3166ae6dd7feb78d6fc5770)
    * docs: update readme (60512bd87f9154ae647c5662b7a41fccd585842d)
    * infra: use vpc direct egress (709d56b7860f93c7c836193f90431e6360a08b11)
    * tests: stop tests from overwriting local data (8fe7f6643b697712c49060f994e33c49e5dced21)
  • 1.0.4

    4e5cc7ec · release: 1.0.4 ·
    Patch release 1.0.4
    
    Bug fixes
    
    * server: bump signature leeway (f8c3b3c3a6d54b8db1fd341c3d3c896c200e9af6)
    * tui: dedupe players on leaderboard (5b3ceec8bf4a19ad36adb24c0e6b76d15f8b1bbe)
    * tui: force users to enter their name before anything else (d70f77fecc2525ea51916bc9fbd22a69c87f760d)
    
     Other changes
    
    * build: terraform after docker build succeeds (1b8146f48c0e785a4be45f0c3ed2dd6c6cfd4d4a)
  • 1.0.3

    a1e9dff6 · release: 1.0.3 ·
    Patch release 1.0.3
    
    Bug fixes
    
    * tui: ensure network-first players get an id (e3c030accb4c65fc824bf6b5a1ac5cf54e8d2c2d)
    * tui: ensure leaderboard works after network games (0250d08797baab749aa32d7588d5fc209cd685cc)
    * tui: ensure final game turn is received (111f6d9a528a13da7a65de41e9a9f767c164b71e)
    * tui: ensure final game turn is received (5cf3149dd21106a4fc9bfea537a27c9ce3e94a90)
    * tui: propagate opponent promotion decisions (05f8d035b07401f36acfffe339d7bda41e35d88a)
    * tui: block the move input during opponent turn (a646506da4c1f8b9038c15e3a77faacc40464985)
    * tui: send heartbeats during network player's turn (26aabbd1c6b6aa8bea768125f9131f7be85ebe18)
    
     Other changes
    
    * tui: remove spurious final turn "fix" (f5748478061470a725118986aa0ef1f567fb9e30)
    * docs: tweak claude instructions (7baf8848ec81d9e5cdde617058c3595f02eba4df)
  • 1.0.2

    3a0f7abb · release: 1.0.2 ·
    Patch release 1.0.2
    
    Bug fixes
    
    * build: pull before pushing (022e271d65ad54e009191f8941c65cdcdd7a08de)
    
     Other changes
    
    * 4027c5998a58f264e41262468daaa6c79c3a4194 Merge `production` into `main` (4027c5998a58f264e41262468daaa6c79c3a4194)
    * build: add step identifiers (558c72ab14cd93418c8861ee1e5ed02fdc01164d)
  • 1.0.1

    659d88b9 · release: 1.0.1 ·
    Patch release 1.0.1
    
    Bug fixes
    
    * tui: display errors on opponent turn (8fdb3ed343156ad08798e3fd2ad10c2618feac1e)
    * tui: initialise turn number to zero (dea9210654aacbbe111ff34ce7a3537b57405ae4)
    
     Other changes
    
    * build: checkout production branch (73a41c172a71be44f30966a58907aeb59f9aebea)
    * build: merge production into main and push (01bfec4de361b356a2c8d787fd525e8bec22cfc6)
    * 6ce331e75fcbddd41b54017666013337fd170426 Merge `production` into `main` (6ce331e75fcbddd41b54017666013337fd170426)
    * docs: update readme (854a999070617e5cc08ec105509f30e9272b374c)
  • 1.0.0

    4f922e77 · release: 1.0.0 ·
    Major release 1.0.0
    
    Breaking changes
    
    * multiplayer: replace `Client` with `Session` (910c29b86739c0bc2a654a58e57a02850f95fe1a)
    * server: tweak draw offer api (cdeb5e2f3acc52c7238eb2dd3ef9cd3d126401a5)
    * server: use game id instead of shortcode (5ffc8ecfe592d97d8737be3c344167a666b6478b)
    * server: `POST /games/{shortcode}/sessions` (b1f0b5c54b8a67dbc166d9325c9d49f24c39d2d6)
    
     New features
    
    * tui: add shortcut key for changing puzzles (4828d5f80980c94cd8065e045d0c206d59470a30)
    
     Bug fixes
    
    * tui: start turn timer reliably on network games (1dccb757a60a6cf17e8111fbfa57826c857bd28f)
    * tui: render puzzle board in all themes (435226baa09aab72001a3fb936243544ccf30a78)
    * tui: add theme shortcut to new screens (2e3784f46a4f62c361055bafe2a41f7b167275f0)
    * tui: fix timer delay on network waiting screen (231350256ed37a043b6a00f2a4ab9ff387f53cab)
    * tui: fix layout shifts on puzzle screen (ed8385b8c609c216e0908857e2cd769627d2242d)
    * tui: remove stupid placeholder text on puzzle screen (ab516944a0ec3ac55480f9c26d71fadfa9c0c541)
    * puzzles: replace claude's awful puzzles with lichess ones (764e81c7ee787ea7efc5453c33b3b4ed8a9fb403)
    * tui: sane resignation in network games (81f9105958090e8fc47b845b4bcdc9096d0d5577)
    * tui: preserve shortcode after game is joined (831266f769d25f3921149cb2cf42d02bf5c80f78)
    * tui: unused imports (f53489dd7877477dbbbdde9ab691eae7fa604213)
    * tui: fix ui papercuts (84dbe2a9755917f980eb930438183bcc0929bceb)
    
     Other changes
    
    * server: autogenerate openapi spec (7605b1bd1daeeaed22028b3df8737eafb8718fc1)
    * server: accept lowercase shortcode (dfde61d5cf927eacffd60e39c839a31d060b1020)
    * tui: hide move input on opponent's turn (d2861306ef12dfb660e72e292015eb459c65cbf2)
    * tui: add timer to puzzle screen (246fcf2c1b5b7555d76c87b1a7a5159d3705ed6b)
    * puzzlies: remove bad puzzles (525b5fdbe64fd1299f4aee114c72ebd77baef24f)
    * puzzlies: fix another bad puzzle (edd6cc6021c75545aa98502a5e2ec01826c95426)
    * repo: update ignore file (302ef1628ad23e2c80680d731e54c3801aa3e3c2)
    * 07603467b898874ee8e6ba3e698a1406c302557b Merge `production` into `main` (07603467b898874ee8e6ba3e698a1406c302557b)
    * repo: update ignore file (c5f19a975da27a1d394c36d658f6630d0ff9de43)
  • 0.2.0

    9af3a4d0 · release: 0.2.0 ·
    Minor release 0.2.0
    
    New features
    
    * tui: multiplayer network client (0b7aab5d4faad26f92667c43519c4dc2d85f0d4d)
    * multiplayer: go client library for multiplayer backend (5eb5741b15e1c64c260ae5695630b2d573b345f2)
    
     Bug fixes
    
    * deploy: add cloud run domain mapping to terraform (42864e5681543497fb1eb461e3a015f7f88d27c0)
    * bot: discourage bots from threefold repetition (846fa42faa04c64e76e73a19be3a6ad3598d347c)
    * deploy: stop running second deploy job after first succeeds (7b3f10a77d2d116749821c9e8e30d4c8c47e2cc3)
    
     Refactorings
    
    * server: re-use type definitions from pkg/multiplayer (ede63e5c8b914e24f9ba41ccd8153e66e14f543f)
    * bot: move anti-tactic detection to the risk phase (9cd3ebbbe5784e111ed858706ad8cb4a477d90e1)
    
     Other changes
    
    * repo: update copyright (0e481c94f6dcdbaa4975ece7f6c1d9d130fb8fef)
    * docs: add CLAUDE.md (27ec57882343b7d382cb56685de1d6d993318ed6)
    * bot: update readme (cd57889b82145dc164d9ee888f51edc04fb67d3d)
    * tests: add test for elaine threat mitigation (5da5d1cb95e3ec42a711d57d328d6903210ff928)
    * bot: better panic logging (f4b6ed6c35b415b044b81514226f1f49596d069a)
    * model: add PlayerPiece.InitialSquare() and Square.InitialPlayerPiece() (1d641b177cf6a98800f8121f4ef21bd33e897cf7)
    * tests: add bot test for fork mitigation (57bc3b954b5dd8ebd7224860af43e3c0c08f75f3)
    * bot: tweak the tactic scores again (574c4d69315077dd867fbd728f1cda2a2e593f32)
  • 0.1.0

    42913568 · release: 0.1.0 ·
    Minor release 0.1.0
    
    New features
    
    * deploy: terraform state for cmd/server (251607befb768a0b3b9cc950185dd22ab7c90a05)
    * server: healthcheck endpoints (a8dcec8831bdb5294c9d5d0a1db370b30b60928c)
    * server: throttle new game creation (be8c64551ed415032da59044573ffbbdf29d042f)
    * server: multiplayer api (5bbcaaf0011e187a074a4c73aacd729372b1857d)
    * model: support import/export games to/from json (19af7af643bd56cb3bb048bda24240798af002a0)
    * server: boilerplate (5777406d99c12469119c624de88ab01deb7f1468)
    * tui: beginner mode (3344d152e681338496ce4392a4be2f189f5703c0)
    * tui: basic persistence (dbcfa8d573732a7e67e81e5d1648353befac44e8)
    * bot: analyse castles during risk analysis (5fa363b67cc63b7b50cc96847cfcee788a00f1cd)
    * tui: add menu item for theme-switching (1182966ec5324f4a875aa2ea01c659620a863fde)
    * bot: add bounce anti-tactic (at the cost of some latency) (a9770f66b061f9b829b384868c2118e766e75cff)
    * bot: implement material exchange evaluation (cfccbe43db18ef59755778a123af38e0fe201a35)
    * bot: penalty tactic for "undoing" the last move (690b142e10e95260836741009ad3c8f86bfc3a37)
    * tui: implement resignation (human players only) (e1d3be01b7542973f2f9ed889ed2ea69694f5f64)
    * tui: render player names (eea8d86724846275855ab8bca54bd025ba14c77c)
    * model: stalemate (e2acfc0f2857898b2236732409ff723a687fd08c)
    * tui: wire in the bot player (38ebd2a1bacd1c52a69b343e9675e9e760440d4d)
    * tui: initial menu screen (bbc128ea3530467050e07947393299970216c919)
    * tui: jazz up the board rendering a bit (eb4ce6e47ddfaa7e4d5107965011feefd04e6003)
    * bot: implement the bot `Player` struct (d6285022aa0181d9842a5149ab4a7afe01e34039)
    * bot: tactical analysis (00c8e704ab1011b4df0bd66c7bbfffdea5f07374)
    * model: clone board and game state (0fb025871a053264a6296df5155ad5d60e846465)
    * bot: rudimentary tactic score (a6eb6d2bc6238f2322b85b3f0a98ba3ee76d13c0)
    * tui: ctrl+c handling (8ac7542b162c8167a1db27c923ff999e96d703a1)
    * tui: render recent move history (5ca7c329f39595ad9382a2e8ba0aed3f803e027b)
    * tui: render game status (00c6f6e8c9e65df36afbb730912aa5bf7beccdb6)
    * tui: barebones terminal ui (0ffa41e3667d4093ae1214f2596ab39c62fe6f75)
    * model: enforce 3-fold repetition (ce338b81970810edc82accb46fc7963494feaca5)
    * model: enforce 50-move rule (1c7f849eb6d95f97f23054cd2e1e5d783699eddc)
    * model: implement pawn promotion (de58f8f8267152fa42b3e964dfb11780dc8513c0)
    * model: `User` interface, wire in `Request` and `Response` (9719adc80c2018f75f839cc53bdd808f355f5f02)
    * model: `GameState` (0f59c587c1bcfee93333f1bd9d5c91ba556187b8)
    * model: `Request` and `Response` interfaces (0708215a27ffa429e35680c2ba4b1d17a99328d3)
    * model: `Player.HasWon` and `Player.HasLost` (4e8cd5f3b33c74bebdc42e2c0adaec7cb3464648)
    * model: implement `Player.IsChecked` (bdc4689bc2e1aae879e0e5a6a6bfa67b76c4af16)
    * model: implement `PlayerPiece.ThreateningPieces` (0bdaf0af8c23ec10f187cca7c63bb577d3998a6a)
    * model: implement `PlayerPiece.ThreatenedPieces` (bcaaeb78cbebc152e8d886ae008a7892368f904b)
    * model: implement `Coordinates.nextCoordinates` (275db799a2d18f86df11e840cfe3e911a151ed6e)
    * model: implement castling (57bc971620d828a7264b73625c80408428a26d2c)
    * model: `Turn` type (no tests) (b75ee8b8cfe99963e44d256128f620584473b1ef)
    * model: implement `Square.String` (d9bb71a67d5abd53d97369bb8f9f18a2c1f608b8)
    * model: implement `Position.Flip` (34a8b84834294b3627f4a59c0a287dab69814be3)
    * model: `Position` type (a2220cd5d65e0ed2c8583a29e74b3863bd68518f)
    * model: make `Move.IsValid` public (474dc6167dfa1e9d505e04819cef95f0847a8dfd)
    * model: `Square.SetPlayerPiece` (4119f8eafbf45c36f5875fe290f2fa7c4db53b38)
    * model: `Player` and `PlayerPiece` (no tests) (85a6cc875d0b87fdddc1c75e4d2407c13daa7633)
    * model: `CaptureMode` type (75f1e30701b30f556b66e1c8a204c5d5d6e21e9a)
    * model: `Movement` type (again) (961f3b52b3704929367ae0e5cd1d0879c2358b9f)
    * model: `Board` and `Square` types (0780de5a5e49a0f8858d81ed5730a81e5c107c25)
    * model: `Rank` type (effcfd61bbf9e131239a296b3b3123acdf54e3b1)
    * model: `File` type (9e13ca12c2da2b46dd6a73a4c2956e04546b6628)
    * model: `Distance` type (125368327b98f1d5c09f4aca75729927485df700)
    * model: `Colour.Opposite()` (ca0943691180af2917f093fb30881e56ab6cb228)
    * types: `Colour` type (08d5fa780a444271dd60780357433c8292793558)
    * types: `PieceMoves` type (d49132940bd805b313f48f2d4d8ada94012b7283)
    * types: `Piece` type (81b20b359055f93f4c4df9cff3bbf76e5a0bf40b)
    * types: `Move` type (a33b1cd089477dabd7786e562776961709da9a58)
    * types: `Direction` type (3e0b06e2b7e959b3f63800ab3e4727c967069581)
    
     Bug fixes
    
    * docs: heading level in change log (90a5722ca66add4749241e0d69171463a93addbc)
    * deploy: stop running tests before tagging the release (0606367fbea7321fad6d27c962f91dc0192ce39e)
    * deploy: install go on deploy runner (0aa2cfde81abaa9be2411e5ee6cb41529c726927)
    * deploy: propagate failures from deploy job steps (67bc8ae4aa9df21d9e835c687a52388338a21bb0)
    * deploy: ensure tags are reachable (3712ffa308b446efe68953753c9bba298e91cbe7)
    * deploy: more cloud build permissions errors (a5a2f6e8fb2e26d7e397eea6fdf22d0f3451e36d)
    * deploy: grant logging permissions to cloud build service account (295c31cfcdbf0b9b01f245ef9f76e86a3e40b5ad)
    * deploy: escape version var (5d1073ff8b61d3d95e0a03954ef955f6a4b6fd95)
    * deploy: tag release BEFORE build (and push after) (238779c22b344bf2a338b647e1ac70b548997963)
    * deploy: reduce iam permissions scope (dd1294404e26097cbcab591b545f84f33e4f1693)
    * deploy: grant secrets access to cloud build service account (a21d1c700095246c1a636c9eb302f3c612a70891)
    * deploy: set log destination for cloud build (e20b47d34c4a24d0a48f51e58cd8cb5f7ecb2e4a)
    * server: add missing healthcheck routes to openapi spec (66072d11eb6c04d00589f1fa89fe2411e718d36f)
    * server: auto-decline pending draw offers when turns are taken (162009b77b5918df55855c955a776e9fce37c650)
    * server: track promoted pieces (468b7b3c0c6a02ad2255051466858ca50b5f7e77)
    * server: track pieces capture by en passant (64e006a7c881a967221a3a824fb1bf031775de6c)
    * server: correctly track captured pieces (3121afb7586475b7f30794d77ddf4910d5a2d0d6)
    * server: integration tests and fixes (d898fdb8851368fe44c47f89325425daa959515b)
    * model: off-by-one error in 3-fold repetition detection (2998babba6d4787903fc62047eb2365fb0666b78)
    * model: include next player in 3-fold repetition identification (69602a3c0ab3afc443c74fa03158ddd6cb787a3c)
    * tui: remove duplicate tactics in novice mode (62779155475d4566aed85f80bef464c591e7f0e3)
    * tui: better shortcut key handling (298174d15ee31a83d3ec82fd2e149e2cd0f9ecdd)
    * bot: reintroduce `TacticCaptureAttacker` (with test case) (1bd9cdae1906528d872de6562c0f9e273796b665)
    * bot: true move-centric analysis (c7d3d9cb6b54b52b6c12124d7939f7c7c87b77fa)
    * bot: correct depth for promoted pieces (2baba3dfbdc9d5ef8fd30c71e7559485a7c2c398)
    * bot: nil dereference of castle tactic threatenedSquares (7b65f0edb51439889a57e053ac5e0ba5de28df73)
    * bot: stop ignore castle tactics (99b23910af14e3ec743ba23a0e82d339835023e6)
    * bot: stop anti-tactics clobbering immediate material gains (4ef2c0a4f815039d7ae95a3a5d859318e1fd36cb)
    * tui: fix left-alignment of license text (0d527481ffe5a37377a76bdbd4c08875031e3e1a)
    * tui: no more vertical layout shifts (d48afcc215ac31fdc1def9b72237ae70e3a5ff99)
    * model: restrict pin axis per piece (85c9ec6c58b72964c3fca4ea166794dc5c84177c)
    * bot: tweak weights of pawn, knight and king (5f8759d8e6a2ac6312c6dbd52f33ee7ed0665f0e)
    * bot: re-balance scoring for check and capture tactics (3b2381874aeb6ae023a4684aa86c3f677101e7b8)
    * bot: aggregte tactic scores per move (8f49811b5b98affabecd5c47682d70e8411b00d9)
    * bot: score anti-tactics negatively (81371837876b31672c59498fe251b9c60daa6b87)
    * tui: blur inputs on bot turns (9dbb753b7edce8647e8ed80627c810e873b2cf51)
    * tui: responsive layout (923cd6695deca503745813ba6601b2d4ef08249b)
    * tui: cap sprauncy mode at 80 columns (cbdcc773ca931fa72649a0d257170c9ef462aa50)
    * bot: fix broken risk analysis and mitigation (5b1d1567992d9ca9b674211d95ad77df3440cc17)
    * bot: rebalance tactics and add "move to safety" (109a7b140d2cb1c4e53b2c5bb2f24ce7fe5548dc)
    * bot: fix tactical analysis and risk mitigation (17da1c54cafc8d1ceae473244dc686bd00655fe0)
    * bot: fix first-move blunders (eb1ddc4af1ba1f8ce8b3e8262f959ec8a96593a0)
    * model: stop king having valid moves in checkmate (7885c316df6960a6ba98c36eb630e49ee36670bb)
    * tui: stop vertical jumping of ui elements (72a784208901b5ce1b3d3ba64b2123d8d88d293e)
    * bot: fix bot risk detection (69c777f30f421ae7568dd4821da801212b11bc71)
    * bot: try to improve bot play with heuristic-based risk evaluation (4be374f4fa2bb9697182000eae4b1edfb3e6c3e6)
    * bot: saner mitigation of multi-piece risks (514059a762e5dc5e8ef49e73e2750951eebd1cd9)
    * bot: stop setting up discovered attacks behind pieces that can't clear (fecde45c57f0bff9caa67aa79d9298ec3f278067)
    * bot: handle panics during tactical analysis (a238aedbc34a0991c0cbf67e6983d2f1f4af9d46)
    * model: fix race condition in pawn promotion (731d011e83acca3c25c6f0e3346b416c7b84ac2c)
    * bot: stop tactical analysis from causing premature stalemate (7bb5c88739653dd525d21152d40339f8727523f5)
    * bot: accept 3-fold repetition and 50-move draw offers (ba2ef0303bef0bc1ae5bb9352533a3ebe32b93ef)
    * model: fix refresh insanity (f516e80bccb35c0e9199af6c5aa0f7b84151af1c)
    * model: prevent pinned pieces from causing check (f983e63a900ab3b8e8cd582fdbc0cafaad9f989d)
    * model: don't enforce checkmate during bot-cloned tactical analysis (3ac735f8221743d283d47eff434c62b02467cde5)
    * bot: only count nearest piece on each axis for discovered attack (17754623813df3f3a6a1d5a6c7b2a8d0b3b77c04)
    * bot: revise tactic scoring approach (81c04ac00a1e4e0e1710fd43dd19de39605e699e)
    * bot: segfault / data race in tactical analysis (b65ef56dafa38d595034408af4d42b7d42a1d938)
    * bot: saner risk analysis (58ecbb1a47a9c98a04cc7199c91aa8295c995e48)
    * model: cloned players should be headless (d4f910d49dfe8c0ef55ba3c603ee1b9badb0862a)
    * tui: small usability affordances (1901f48204ae071d7d10f28649bdcf6f3f7454f4)
    * tui: cancel finished games (3a8f0e5201fa7d9873386775b87e74b02311b76b)
    * tui: update leaderboard after human wins (2adf1e1a3d40496566174e1d9d13acfa18a26d23)
    * bot: reset bot player state between games (fb27cf7eaeed3def42b3a7b3ffae4bb43b50b184)
    * tui: reset game state on start (6a7b812585bd5ae28ad15c0110a4ad960bf804be)
    * bot: realistic tactic scoring (hopefully) tweak (f309c6eeb7670c69648dc43f048346dcc2565730)
    * mode: fix checkmate identification / prohibit "x-ray" escapes from check (8802a6177eeb8bf578187147a1a046e62b91c5ac)
    * model: fix dodgy checkmate detection (c9d9e914c293459da7da90bddfb360c728202ccf)
    * model: refresh all pieces after each turn (aacc3b26e61929ce174f34399d02b0b6c2f0fe77)
    * tui: fix move history alignment (45a2e77d72f48fef9d0bfa1ddd4e5f48f11f1353)
    * tui: fix checkmate handling (c6768319a348b1926858fe85ec844cac11aabb04)
    * model: ensure all pieces get refresh when entering or leaving check (655db19b1a7d510583312cf1326a2c63030ffe56)
    * tests: fix failing tui draw tests (a2cdf7e94349f5b370a4884ae973d782fca3f093)
    * model: fix broken intervening coordinates logic (051a661b01135b7a4f1b6167d41621df732d2508)
    * model: fix broken HasLost logic (bdb0c75ad7edc7fbaa8f6beb276efef7d7b7bed4)
    * bot: implement castle tactic (050a4794232a8825743612f1c2f734680b0eda43)
    * bot: implement clear tactic (f6527fe09fcad2ed8c82f731032c42899dee3537)
    * bot: implement pawn gap tactic (90b8aefc8f73edc7e4eb12bf9e7cd0801b9d1c25)
    * bot: implement safe move tactic (771142521bf88436a51da8b5131d417ae8ff5466)
    * bot: implement block pawn tactic (63da9627ccf285fd4f33f27a7fe586318142f1f1)
    * bot: implement (simplified) lure tactic (d54b331753130fe60f71d0042fbc1f57a89b6151)
    * bot: implement center squares tactic (060f90d8b1943b0d560a12d45228cd50d15a632f)
    * bot: implement defend tactic (fcbd14d6b16f9b18cb3e37acbaddd231b8f3eb76)
    * bot: implement deflect tactic (c8e196d3246153bd44c660af0abc8b28034f9c9a)
    * bot: implement capture defender tactic (05b249f43e12b5ecadfabcbe1832d270c4913888)
    * bot: implement checkmate tactic (4f196060deb22809f4f68fd8f1512735d44f0c8f)
    * tui: correct destination square in move history (37eff3c0c447e8562bf78cbf2f1a064337bf8bed)
    * model: fix broken escape from check by capturing checking piece (646818b1aef950a4e303edd36c45f8d2ed12a6f4)
    * tui: sane move history (48e7df262c17792478843d271b7a0e8a36846a72)
    * tui: better input validation (6badd8b6ae5e937c55ec6f4a172d26a92b0e0107)
    * model: make 50-move rule an offer instead of automatic draw (498110a89fc1bbb8057f42290e70a731d08defd8)
    * model: maintain game state (f21846ea5f9ec929200137bf13a214b44feebd7a)
    * model: enforce turn order (e59ae31ddf6c113f8f02d2e2af56fb5f1c3d40ae)
    * model: check turn matches before undo (929be6c2e625d4e88eede31312f441f936faf693)
    * model: prevent further moves after game is over (74940463e1f2648a514052572b73546217703a91)
    * model: prevent castling from, through or into check (29286e73c5ba427d5da5b888872c2f94283eb3ab)
    * model: maintain `Player.pieces` and `Player.capturedPieces` correctly (971726de1cfe600a36b9dbc43d01f2b5e9c57538)
    * model: sane en passant logic (f125ad6f0c38fd35719a81432af6266324385219)
    * model: initialise pieces on their starting squares (f1c18833f82e17500f7a48af7da05f7639607963)
    * model: make black moves work on flipped positions (d99fb62e4ba9fb655515b0aa2f7ce2ed5ee59c0b)
    * model: check correct square for en passant (e6b5220fd91fe2ff55c29de537c8fd84292c7dde)
    * model: partial check for en passant validity (758db504c294ef092c969618039a1c19baca1df9)
    * model: fix intervening square movement check (dacb2bdcd0a56d2b1d479f5e55b2887d796565ef)
    * model: prevent nil dereference in `Square.Piece` (7c27159cb121a73674452411d8e9668ca6bc9fab)
    * model: use struct pointers more consistently (35721d296076dd8bfcf37037215cb7f072e665db)
    * model: unbork the indexing of knight moves (d235eac2779c1faa3e4aef2674f24f559dc44c74)
    * model: unbork the indexing of piece moves (76cc64fd49756d17daff3cef22fe6d4068120cb2)
    * model: use correct target square for modified move validity (593b7e221b6af7fbb5a5d9ae943f13192e210743)
    * model: enumerate all possible moves for each piece (3e99d4eafa345ea77015884349d1db059d0d7c80)
    * model: update `Move` implementation to reflect recent changes (c40499f27a74ddce6a4e600d765c82a7b944c120)
    
     Performance improvements
    
    * server: fix cold start latency (8f6913902f6f4b78dcbfc8264a9b7f5848e2eead)
    * bot: bring back parallel tactical analysis (84f5eaa47aa20a9e58c4a548756fb4d228ba9cb1)
    * bot: parallelise analysis (5bc7ebe9d139d1bcb72f33b27c95e7b49e76910b)
    
     Refactorings
    
    * server: stricter restful api (c5e60da45b8b85e14b907137f2473e676f3b4539)
    * server: ditch dedicated /auth/ephemeral endpoint (5b7dbda37f91f5f87164a29c04640b82db3e03e9)
    * server: push draw_offers reads into store.go (c082233ee2e75e7e68a140f10538d292b98697a5)
    * model: distinguish between none and invalid values on iota types (8a42f40840b02b214a1c826187b3bcf5b4820799)
    * backend: sane usage of actions, moves, castles tables (891a7327363b046c46e80628b018c6d2b7b25fc4)
    * tui: rename "beginner mode" to "novice mode" (a0d0c2d7fda55f144337c9e96dcf61f3a16a003a)
    * repo: rename "naive-chess" to "pawno" (87f4d322cc5f61bbf9eb79e171ab0c060ea00aef)
    * bot: eliminate tactical analysis duplication (e03fb079be8977df9b04c85f0ce3ff960c1e85df)
    * bot: rename `Tactic.objects` to `Tactic.threatenedSquares` (a37539fd88c73d59733c2d9a1cd35f7163c4a7b3)
    * tests: carve bot tests into smaller slices (fff84351ffbe39b76ee7d55f1c4966db0e78dfa6)
    * tui: spelling mistake on "sprauncy" (9ad7c4cffdb144e030c69102980a493acb43479e)
    * project: move pkg/tui to cmd/chess (42d61e00031e6a6898b544a05bd0a3c824aa6a93)
    * tests: re-order some helper functions (a1498ab9f051cfb507590e274b61491b89eda42d)
    * tui: re-order some functions (0fc2b5402b45e89b48b39d8693f70d81c00162e3)
    * model: export `move.Equals` and `move.Movements` (36e4778009ae2567e0dec652fb694327c223ea57)
    * model: force absolute file/rank, stop flipping for black (017e52ce0a8cf29c9b49144f1d9503c6d416ebb2)
    * model: export more stuff (6be139e67c6209b5d56394bf8692bdbbeeb979f0)
    * model: export move apply method (639cde2cc0aa49a4d4274ee460177811339142ef)
    * model: export some initializers to call from other packages (c981ebfa330b7d29d0d28d74b4e9147c8e292cc1)
    * model: separate files for response types (4cbdb7bbe287f750491c653f2897b445800d6914)
    * model: separate files for request types (06fa6bfb9f3c4ddbc978fcad4155561f9817e026)
    * model: separate files for `Action` and `MoveAction` (fc3e937a85bf7c8a92e09d15618fe5d1e364c11b)
    * model: separate files for `BasicMove`, `PawnMove` and `KnightMove` (7883b8c8b9595ee025be0811ec2a58ef79164f28)
    * model: eliminate some repetition in move.go (9e969d17edfe7154305cc0b58a4de0ceeebd6ce2)
    * model: make `Move` an interface (6adee7b0e46128cdf5f6652446f8a94726724ac8)
    * model: stop allocating empty slices (533ac088ca3212bec5df0bc5eb77abea98f30eb1)
    * tests: convenience helper for turn tests (cd843cb66ab7870894733b561bcc3b842aae7089)
    * model: implement `Move.CaptureSquare` using `Move.ThreatenedSquare` (3cb783e2c584e4988f05a1dc0e3b67da7bf365ff)
    * model: implement `Game.Opponent` using `Game.Player` (71685c2c4aeb733ad29a586fe2a15a85c9fcb93b)
    * model: separate `allCoordinates` and `homeCoordinates` iterators (f257ea2c4604281ca5f9c424652a129ecea5edab)
    * tests: move `initPlayerPieces` tests to `board_test.go` (30acd6b653c899e866fbcd67816e3bd63336b8ac)
    * model: index `Board` with `Coordinates` directly (1f53ff417fe23186a0724c041fca5b075a5bbdaf)
    * model: move `StartingPiece` to `Coordinates` (1c6fb83c6fa446aaea9bba5594d3940fba11c091)
    * model: prefer `Coordinates` to separate `File` and `Rank` (55232f32a380ac2e73370cde8b2cd9ae4c0d2051)
    * model: rename `PlayerPosition` to `Position` (ea412b6f4262040b1f2953ecca5ab60481e2abd8)
    * model: rename `Position` to `Coordinates` (edea01c6fa508dd514f4ef7ca35f4ce531acb1e6)
    * model: eliminate some pointless complexity in `initBoard` (1fe2c1c0815a34c172fdd9442a60f95f1a4bd215)
    * tests: tweak some test names (55bf1524fecd12ee2491c2142a08b0cbe645d0b9)
    * tests: eliminate repetition in `PlayerPiece` tests (2dcfcefe9603e61f5596092013db22963d468486)
    * model: re-use `IsOccupied` inside `Square.Piece` (13e659217b3aebba350287418c501d8d3f67551b)
    * model: move `PieceMoves` to `Piece` struct (c04d5904dc3a011775efba07a38171a2ede576d8)
    * model: move `ValidMoves` to `PlayerPiece` struct (d7067d685b339f7eb95f9cc870a67a3e613553f3)
    * model: make en passant a capture mode instead of a bool (09937e43bec8260d6b8ea2dcd8d73ec54ef9d77d)
    * model: rename package `type` to `model` (17f0495ae3c3e3afbc300770427e9f50e9ef116d)
    * model: more idiomatic `Direction` implementation (38c81d7ee2101a4fce888f6b07083ffa70cd9487)
    * model: put all the move logic in `move.go` (7af8f04e2c2f742c74a952c3347fca1929997960)
    * model: rename `pkg/types/` to `pkg/model/` (d048c9df9b0f92d064cd80192f2f3f2a8843b3ed)
    * types: rename `PieceName` to `PieceString` (a3c9cceca1f2fb7ce7f10393a1e3e7976f7dd164)
    * types: rename `PieceMove` functions for clarity (547af6fc03d183681a6b1215984c7d6339b43802)
    
     Other changes
    
    * deps: upgrade please-release-me to 3.1.1 (8385464e4ec8c8c29c351989d403b2e57cf95521)
    * deps: upgrade please-release-me to 3.1.0 (088c0de1cbb42add295ed1b02faf933a92dfc5b4)
    * build: tag docker image with version (46461413ece9564954a1216db059298490f02156)
    * build: stop trying to test in cloud build (49b9ed6e252b4b6f9361d969f7807c07f3bbdb93)
    * build: make terraform fmt and terraform validate optional (355037dce626b127712e746a0b560372daa5478f)
    * docs: skeleton change log (0743eefb17626520d2cf5d14fa5816fd679b662c)
    * deploy: lint and test at start of job (62ec09af9c9f0cc71f98324ed75e35b190158c3c)
    * deploy: tag and push bumped version (5fe503d43ca788beb4a6170bf86ef07fb74395c1)
    * deploy: setup cloud build (127ac045445f6d4e539fe1ee2ddb02107a358f1b)
    * deps: release script dependency (15d31401cbcd1afa315f5e2619379e4bafd9f750)
    * tests: skip server tests if db/redis env vars not set (0f292041b00916ffeb62aee4cb0b13eac7c0bcf1)
    * server: move postgres connection count to config (3a1bc28961b7f153478c3e49317fe9cf17dcbfbf)
    * server: add server-build and server-push make targets (e1e9dc90591bbf3578037f1fb6dd1b2b739cac23)
    * server: basic logging (9fe89ff3f7c9056b846815719550d61e0ed0eb97)
    * server: structured error responses (e8d7a03dd88312b1fd6be791c2b9339429874ab3)
    * server: readme doc (4903a2d9f12bcb9d10f7f6a9d1af0d9eeb1b2853)
    * build: add server-start ake target (8368a43f6f8f681e48a96a005be9bab2ccfa7e63)
    * server: postgres timeouts (6bd7c51e9092432e95960d283fdbf9d1c9a2b7a1)
    * server: agpl header comments (d99a7943bcc44e2632b9fc9aa4476e9029628963)
    * server: eliminate race conditions at game end (fcb892e1b61c93239ef4cc0bd4ee75af3ef32e90)
    * server: delete test users (c1904526327ca9b1bcd613fe2304cfae03384cc6)
    * server: return 404 for game not found errors (07ab54e7d49ca0a843868c342af23768dc8e9c15)
    * server: retry game creation once on shortcode collision (71d6bc231b620bbb4ea36324ed0931ad3d159042)
    * server: validate ed25519 public key length (992a7a0bedd9d06dca64f041b15425758f5c228c)
    * server: better error info (c46421d9f5b9223427c8caf0e6c9f4bb5332f719)
    * server: more robust postgres marshalling (2f873c56566c4bcaac791e4ce5dc1519ea401eed)
    * server: game store methods (ec5c037af32481a6d6dad264869ac561045a6283)
    * backend: strawman postgres schema (ab1ff0f44b34e4ec2b5ffca8fe5c996136ab7e4f)
    * bot: speculatively increase magnitude of tactic score scale (a1c4e68a3ffc3e8c3a26e221b258f06cc9d5cd0a)
    * tui: disable novice mode in human vs human gameplay (1a82820735b9dc8b72bd9592251c6cca123156c1)
    * bot: update readme (395048320b407e3843c8b9f0ed3659365acf7b04)
    * tui: consistent square colours in novice mode (ab89ae9908761a43fdc5c063098942cb575abc5c)
    * tui: tweak main menu screen (1f2a75a579e8516aa00c763d48f7dab192fba46c)
    * repo: static site for go import vanity redirect (c8940af8b51d4854fe17c955de1ec32478ed2a7b)
    * bot: tweak tactic scores and categorisation (e5e5d37bad9faaa3b33bbf8fce7f260a47f93852)
    * bot: tweak bot player depth limits (4015aa13330f7ea3e55b19f8b70deb98b8b1178e)
    * bot: test for elaine fork mitigation (1847a964187798a193c956809b88297595b5c255)
    * bot: move `TacticCheck` into `attackingTactics` (2d6d4ff35a12c2431d59a218c46065d4e09d5ece)
    * bot: delete `TacticCaptureAttacker` (a3da70b96d14d21f9e13c2ef7b0ed0796b0e2fd6)
    * bot: move `TacticCapture` back to `attackingTactics` (e995fb68223de04c9bccdc848fa9fc2cd324273a)
    * bot: tweak tactic scores (ecb777269ea10c4e1f69cd29ac1fb0db45d0ae0c)
    * bot: cut over to buildEvaluatedMoves from analyse (aebefdb29ff3009df1889721e8e1b10d51fa4ad9)
    * bot: implement buildEvaluatedMoves (014fcc5ea6cdd548f6e9878824892dce6f466c0c)
    * bot: implement analyseOpponentTactics (e4215b97b3778038366057a605fb405fca5f79d5)
    * bot: implement `EvaluatedMove` (8871badd279e2756e213b0484726ca7acd88cbc9)
    * bot: add `Tactic.objectSquare` (4367a9c59e17af9cf2d68b884721b2d2e074e6f4)
    * model: implement `Castle.Side()` (76a685742372fadecff494e0ae3703682dd1ea54)
    * bot: delete unused function (7e9b113ce6084c0e1bceae09836f2ceb8607e5c6)
    * tui: stop spawning infinite player 2 instances (a7733dfa183ad25cab1e6d1d7275fe34e0afbf51)
    * bot: deeper opponent analysis (ba299d7c486d9357213c7539f818f39f6fae1d88)
    * bot: tweak bot analysis depths (b39f5eb427cf30f7631bc0248b50dbab4ca10c42)
    * bot: delete useless lure tactic (956ef0724d58ee05453400d11fb4d9620c210cc3)
    * tests: `TacticType` predicate coverage (992a198a85081261ad3d174dbb2fee38901a00e6)
    * tui: eliminate vertical/horizontal jumping (50919c0264bb34c60ea075febc61043bd5bcbd84)
    * bot: discourage bots from sacrificing castle rights (e31e1b4b4081ecb0188eb5bbca0901f52c1d626e)
    * bot: tweak tactical weighting (44000a3b5ba952071d524ec9085c2f570b9ee04f)
    * bot: tweak tactic scoring (e22edf903f25e633cfaad6f303795dc4b56b4fac)
    * project: goreleaser config (3a0963eceed35999c8ab907ff335a0e3d1582a35)
    * docs: update roadmap status (b7a1ccbd82897f154a94e29161d499547537e12a)
    * tui: small ui tweaks for sprauncey mode (b68057b203c3904b3edeb6d295a68791d6903ab7)
    * tui: tweak colours (a72866d034ca25955387d0788e147a17e2ae8a34)
    * project: `go mod tidy` (20daa9ec6437f04fbd121d832704884792f36677)
    * project: makefile (3195a1c811a7bc842b2e9d51e7e1b5b301cf5b73)
    * tui: `go fmt` (a016f8e93ae8f6e92cf3882a7778a4761ee469e0)
    * project: add agpl (7c4d32d678b75d9bb32d8e2bcff9da9c8dfce911)
    * tui: make everything sprauncey (aa7cfd2dcc35189d3db9fc503073b322d7bff9b4)
    * bot: decrease tactical value of the king (7320ff54bce7aad49425d29f55426144e7318738)
    * model: minor tidy-ups (57d1d6b2a43e22b18f350807c51c83ad784d5234)
    * model: back out spurious heisenbug "fix" (d48359fff11414f4a206a192c7ba6382f7dcf291)
    * bot: de-parallelise analysis (cc96a895b208ddb5c963b2246c628ce458b509e2)
    * model: speculative attempt to fix bot heisenbug (1806379cbc399b3f298c43283fa725db88f8260e)
    * bot: `go fmt` (586310c356df655606af85e82f45ecb6ef57eb97)
    * model: request type strings (8f5cd314aaabb87b386ed0445dd9479b599efb35)
    * tui: stop hard-coding strings that should be defined in pkg/bot (5fb837eacfdd0892f93fa9a2ed64a2678e28a6a2)
    * tui: change colour suffixes to prefixes on piece labels (935e077ad3ac41c326efc4f8425a14e0383f4d95)
    * tests: fix bad error handling in bot tests (db796ef4bd6aab0b211eca7931699960fa647b12)
    * bot: `go fmt` (41768cede5dcdf6205ed5a6ffca864885983ffff)
    * bot: tidy up some loose ends (2c3c3a769d722dc94b1c1f36f8a0c0956d67c8e4)
    * bot: readme (79cc53cd81d66f639c79742b31c9a8a05c28fcf3)
    * bot: tactic types for "safe move" and "defend threatened piece" (1232024c846eb9d309f6f2a5ace42b68e7cfa291)
    * bot: bot configuration and personas (621fa5a31c430425f2648e8c7ffcdd7036ff14ea)
    * model: export public movement methods (271d8bb307120e0c729a24a5533df20cebedbbda)
    * bot: skeleton `Tactic` struct (9905e7de7882479772e6805bc3015ec995d3bac0)
    * bot: `TacticType` (2fd270670d92c15291f86d6017a287deac18e918)
    * tui: `go fmt` (6685847422d804f3bbdbbdb879d7196aada7155f)
    * tui: consistent spacing (42b5d75461e1e41ceba98395e3954b5afcf92f30)
    * model: expose renderer interface (a2f228c7a4f32c9529ca562e09a866fdddc5fcc3)
    * docs: drop some notes in the project readme (ac36788a14dc780809efe6a610222454c60eb2fd)
    * docs: track wip state in readme (2cb48abe048bcd05593015f8cbc8f2add5b67d91)
    * tests: fix some warnings (becac5b93853b478e27e9858d9bf1100ad507cbd)
    * docs: update model erd (5198a67220efce24e98e72a2f9a2eb4b39475659)
    * model: add TODO comment (2c0346195f1d998e16cd0193339d9324388494e3)
    * model: add TODO comment (47c25a09998bf701b03f98acd6270c934d898ec3)
    * model: tweak TODO comment (04d0a2f1fd334b33d81ebef2267c0b0b3379adfa)
    * model: add TODO comment (59aefcf1a3ffbc363d0faaad4adecb99a9f3b3ca)
    * tests: another check test (b99fe6e86ae8b377362382dcbbf816dee59d8b1d)
    * tests: more `Game` tests (25a590c87429de1b23d75cc28f20d094415a2a5e)
    * tests: missing tests for `Coordinates.FlipRank` (df5ec15b400732cdf1c87939b514a5409ae42fb2)
    * model: tweak panic message (b9d5e96075000e45b3cd3bae3175ea1cf459282f)
    * tests: simplify a condition (00eefb4fc6ea07ba78ed98363bfeade1cc281c92)
    * model: make `InitBoard` public (6df2d79c958df3abf698c0cbdb1c3dbe8a8455ce)
    * model: make some init functions private (316092da6058c3de1f9247f913294ce564deb544)
    * model: tests for `Turn.Execute` (3e2978e802fd7ef9a5d070b7d5e6e2ce98225ac2)
    * model: add some TODO comments (f5c2278efe1e277ff0c1d6f7684438ab85c62e9e)
    * model: add test for move counts with non-adjacent opponent (91974d616c04ad253c2179de8aae626fd302387c)
    * model: add test for move counts with adjacent opponent (62b6eb67500ae71e6f70b527115aa0e3a25762cf)
    * model: add test for move counts with non-adjacent piece (900fb49ae06a8f0aadc5ebebce16315c903763e7)
    * model: add test for move counts with adjacent piece (337a10a33854a10d1c7c91c1bafb7aa2f9d135e6)
    * model: test `PlayerPiece.ValidMoves` (b494a8625e4fda311817967551d3527020b4ce7e)
    * model: use pointer receivers for complex structs (2468e414751b60312bf87fb28a06fbdd855a391c)
    * model: `PlayerPiece` tests (e49bfe410c687fb81654a8049d87f4e9a01671e0)
    * model: `Player` tests (8501cc29b82cf611cf71b8a3fa48dccbf8f61668)
    * types: erd for the model (a9211b749286218a0806f4064e315d1078492929)
    * types: eliminate unnecessary `len()` from `range` (92ca92069e9a2497a4d473438077ab6b779b580d)
    * types: remove redundant slice (a7bbf852ac10993545b431c94d2b3a4c159869df)
    
  • 0.0.0

    The dawn of time.