Skip to content

Kill-All Go - #483

Merged
Perlkonig merged 17 commits into
AbstractPlay:developfrom
samtcifihi:claude/kill-all-go-planning-o4ysfq
Sep 23, 2026
Merged

Perlkonig merged 17 commits into
AbstractPlay:developfrom
samtcifihi:claude/kill-all-go-planning-o4ysfq

Conversation

@samtcifihi

Copy link
Copy Markdown
Contributor

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/goscorer was evaluated for automatic seki detection and rejected as a win
condition: 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 the
first normal move.

Seats are not colours. getPlayerColour returns a neutral grey until a side has been chosen, and
every 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,b is 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 mocha passes. The game's own 61 tests cover the board mechanics, ten Benson fixtures in
both 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-locale reports names.killallgo missing from the machine-managed locales,
which is expected for a new game. Only en and eo are touched here.

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
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
@Perlkonig
Perlkonig merged commit 5622739 into AbstractPlay:develop Sep 23, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants