Kill-All Go - #483
Merged
Perlkonig merged 17 commits intoSep 23, 2026
Merged
Kill-All Go#483Perlkonig merged 17 commits into
Perlkonig merged 17 commits into
Conversation
Planning document for a new Kill-All Go engine: rules (Tromp-Taylor captures, positional superko), Benson pass-alive detection, the manual seki claim protocol, the five opening protocols, engine/state/notation design, metadata, localization keys, tests and milestones. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HE7GRjtjXjNPBbXXn8M7u9
Handicap becomes a member of the opening group with a typed n in [1, floor(p/2)] chosen by Player 1, Hoctaph batch sizes need a minimum of 1, credits go into the variant descriptions, and the open questions are recorded as confirmed. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HE7GRjtjXjNPBbXXn8M7u9
New experimental game: a Go variant where the Attacker starts with stones on the board and must capture everything while the Defender wins by making one unconditionally alive string. - Tromp-Taylor captures with multi-stone suicide, positional superko over every position reached (including positions inside multi-stone plies) - Benson pass-alive detection with the stricter vital-region test that suicide-legal rules require; the Defender wins as soon as a string is pass-alive, and two consecutive passes give the Attacker the win - Seki handled by a life claim: the Defender names a string and protected points, the Attacker refutes with any number of consecutive stones - Openings: alternating placement (default), handicap (Player 1 sets n in [1, floor(p/2)]), classic 17-stone setup (19x19), simple pie, and the generalized Hoctaph's pie; every protocol keeps strict alternation - 9x9, 13x13 and 19x19 boards; roles rendered as Attacker/Defender with colours undecided until a side is chosen; in-board button bar - Unit tests for the board mechanics, Benson fixtures, every opening branch, superko, claims and serialization Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HE7GRjtjXjNPBbXXn8M7u9
Adds the Esperanto name, description, notes, variant labels, status and validation strings and result messages for Kill-All Go. The title "Ĉiomortiga Goo" is a proposal pending acceptance. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HE7GRjtjXjNPBbXXn8M7u9
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HE7GRjtjXjNPBbXXn8M7u9
…idebar The move failsafe rejected a Hoctaph batch of a single stone because batch plies are not enumerable; batch phases now skip the failsafe and list single-stone batches. The handicap and the two batch sizes stay in the state after the opening so the sidebar keeps showing them. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HE7GRjtjXjNPBbXXn8M7u9
Folds the board helpers and Benson's algorithm into killallgo.ts as named exports and merges the Benson and board-mechanics tests into killallgo.test.ts, matching the usual single-file layout of a game. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HE7GRjtjXjNPBbXXn8M7u9
…om buttons A refutation that neither captures the claimed string nor ends on a protected point now loses the game, which is what the protocol always meant: giving the claim up is losing, and resigning already does that. The failing sequence is submittable and every intermediate message says so, and the separate concede terminator is gone. The fixed choices of the opening protocols become custom buttons instead of an in-board button bar. Each phase needs at most one, because the alternative always involves placing stones and the clicks are unambiguous. Taking the Attacker side with handicap or batch stones owed leaves an incomplete move for the following clicks to finish, which works because the front stages a button's move rather than submitting it. The labels need front's buttons.killallgo.* keys (branch kill-all-go-buttons-2026-09-22 in samtcifihi/ap-front). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HE7GRjtjXjNPBbXXn8M7u9
The slice ply asks for two numbers on an empty board, so the sizes worth a single click are now offered as numbered Red stones: the first batch in a three-wide block one intersection in from the upper left, the second in the mirrored block on the right, each under a lettered label stone and holding the values 1 to floor(p/12). A value the size chosen on the other side would forbid is drawn at half opacity but stays clickable; picking it drops that other choice and the shading is recomputed. Either half may be chosen first, so the validator now accepts a partial slice and renders it. Nothing about the rules changes: any legal pair can still be typed, and only a,b is ever stored. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HE7GRjtjXjNPBbXXn8M7u9
…go-planning-o4ysfq
Drops the working plan document, which was always meant to be a scratch artifact rather than part of the contribution; it stays in this branch's history. Also attaches a documentation block to the function it describes rather than the options interface above it, and corrects a phase comment that the on-board picker left stale. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HE7GRjtjXjNPBbXXn8M7u9
The Defender's win condition is now just the pass-alive test. Life in seki gets the same treatment as life in ko: the engine does not recognise it, so the Defender must keep playing and turn the string into one that cannot be captured at all. That removes the claim notation, the refutation phase and everything that supported them, including their state, rendering, sidebar line, results and strings in both languages. The handicap opening is marked unrated, since the size of the handicap is agreed between the players rather than balanced by the system. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HE7GRjtjXjNPBbXXn8M7u9
The Attacker's pass-alive stones can never be removed, and no point next to one can lie in an eye of a living Defender string. When no area left over by those stones holds two eye points apart from each other, the Defender has no room left for two eyes and the Attacker wins. The check runs after every ply that leaves the board in play, alongside the Defender's own pass-alive check, which it replaces the scattered calls to. The test is sound but deliberately incomplete. Its verdict depends only on the Attacker's certified stones, which the Defender cannot remove and the Attacker can keep by passing, and it grows stricter as that set grows, so it only fires when the Defender truly can never live; unrecognised lost positions simply play on. The certification uses the strict vital-region test, since under the classic one some certified stones could still be captured. A pass-alive Defender string always has the room, so the two endings never coincide; 1.1 million random legal positions agreed, and no Defender move in 800,000 random ones removed a certified Attacker stone. The winning Attacker stones are highlighted like the Defender's, and the notes, the Attacker's instructions and the move log describe the ending in English and Esperanto. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HE7GRjtjXjNPBbXXn8M7u9
A batch big enough to name every point on the board (Simple Pie's slice had no cap at all; alternating placement's one-stone-per-turn total had no running cap either) could suicide the whole board back to an earlier position, the empty starting position in the simplest case, bypassing positional superko entirely since setup batches were never checked against it. Every supported board has an odd number of points, so capping each setup phase's own contribution at floor(p/2) closes this without needing to simulate the sequence for superko at all: a Red-only string can only lose its last liberty by covering literally every point, and two independently capped contributions can never together reach that. The bound reuses the one already governing the handicap declaration (itself already <= floor(p/2)), renamed to maxSetupStones() since it now also caps alt-place's running total and the size of a Simple Pie slice. Verified the exploit (naming every point in one Simple Pie slice, or placing floor(p/2)+1 stones one at a time in alternating placement) is now rejected, the cap boundary is exact, and 2*floor(p/2) < p holds for all three supported board sizes (81, 169, 361 points). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HE7GRjtjXjNPBbXXn8M7u9
Sensei's Library attributes Kill-All Go's invention to Alexandre Dinerchtein; the game's people[] previously said just 'Traditional'. Also drops the unverified 'OGS forums' claim from the alternating placement and handicap variant descriptions in English and Esperanto: the author's own research (posts of theirs from 2021 and 2025, and a 2022 post by someone else, none claiming invention, one confirming games with the handicap protocol predating the 2025 post) supports 'unknown provenance' but not a specific venue with confidence. Hoctaph's pie keeps its own OGS-forums credit, which is backed by an actual link to the post. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HE7GRjtjXjNPBbXXn8M7u9
Restores 'possibly from the OGS forums' to the alternating placement and handicap descriptions, hedged with 'possibly' to match the author's own uncertainty about whether that's really the point of origin rather than just where it's been discussed. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HE7GRjtjXjNPBbXXn8M7u9
Adds https://senseis.xmp.net/?Pieboxing to the game's urls (KillAllGame was already there). Renames the default alternating-placement opening's display name to Pieboxing, its established name, and credits MXHero as its designer and as the designer of the handicap variant built on it, per the author's research. This replaces the earlier 'unknown origin, possibly from the OGS forums' hedge in both descriptions, in English and Esperanto, and updates the long-form notes paragraph to name Pieboxing by name the same way it already names Hoctaph's pie. The Esperanto variant name keeps 'Pieboxing' untranslated, following the established policy of retaining stylized or portmanteau names (matching Spora, Spire, and Bumi & Zomi); this and the exact Esperanto phrasing are proposals, not yet recorded as accepted in the conventions repository. Note for the record: variant-level people[] credits (Hoctaph's own included) are stored correctly in gameinfo and validate against its schema, but GameBase.allvariants()/challengeVariants() do not currently forward the people field to consumers - a pre-existing, repo-wide gap unrelated to this change, not something this commit attempts to fix. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HE7GRjtjXjNPBbXXn8M7u9
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adds Kill-All Go, a Go variant with asymmetric goals: the Attacker starts with stones on the
board and must capture everything, while the Defender wins by making one string that can never
be captured. There is no scoring. Flagged
experimental. Boards are 9x9, 13x13 and 19x19.Rules
Stones are placed and captured under Tromp-Taylor clearing, so multi-stone suicide is legal.
Positional superko applies across every position reached, including the intermediate positions
inside a multi-stone ply, which also makes single-stone suicide illegal. Two consecutive passes
end the game as an Attacker win.
The Defender wins the moment one of their strings is pass-alive by Benson's algorithm. Because
suicide is legal here, the vital-region test is the strict one: every point of a region must
touch the chain, not only its empty points, since the Attacker can otherwise clear its own
stones out of a region and refill it leaving a hole that is not a liberty.
Life in seki is claimed manually rather than detected. Instead of moving, the Defender names one
of their strings and any number of empty protected points. The Attacker then plays any number of
consecutive stones, none on a protected point. Capturing the string wins; ending the sequence on
a protected point resumes normal play with the Defender to move; submitting anything else gives
the claim up and loses. Life in ko is not recognised.
lightvector/goscorerwas evaluated for automatic seki detection and rejected as a wincondition: its own documentation says eye values are not tactically accurate outside finished
positions, and a Kill-All claim is decided mid-game.
Openings
A single radio group. Alternating placement is the default: players take turns placing Attacker
stones until one takes the Attacker side, and the other then moves first as the Defender. The
handicap form adds a count chosen by Player 1, who should be seated first as the stronger
player. The classic form is the traditional 17-stone position, 19x19 only. There is a simple pie,
and a generalized form of Hoctaph's pie where the slicer chooses two batch sizes. Every protocol
keeps strict alternation, so the game is a plain
GameBase, and the Defender always makes thefirst normal move.
Seats are not colours.
getPlayerColourreturns a neutral grey until a side has been chosen, andevery user-facing string says Attacker and Defender rather than naming a colour.
Interface
Fixed choices are custom buttons; anything involving stones is clicked on the board, which is
unambiguous in each phase. The Hoctaph slice offers an on-board picker of numbered stones for the
sizes worth a single click, shading the values the other size forbids while leaving them
clickable. Larger sizes are still typed, and only
a,bis ever stored.Depends on
The button labels resolve from
apfront.json, so this needs AbstractPlay/front PR (link) first,or the buttons render their raw keys.
Testing
npx mochapasses. The game's own 61 tests cover the board mechanics, ten Benson fixtures inboth vital-region modes, every branch of every opening, superko, the claim protocol, end
conditions, the structured move log and serialization in each phase. Rendered JSON was validated
against the renderer schema for every phase.
check-game-names-localereportsnames.killallgomissing from the machine-managed locales,which is expected for a new game. Only
enandeoare touched here.