Credibility pass: the code reads as one hand's work. Dead plumbing and copies removed, four claims the source does not support corrected, and inherited kit text re-read for this game

Engine: the facade re-exports the board in one block; describe() and the
dead letters preference, void ply, the King-taken line, the identity maps
and the unused imports are gone; SIDE_NAMES is the one spelling of a side;
the drake's hunter comment no longer claims only four kinds reach the air.
Prose: no shatranj and no sitting duck, which Gygax never wrote; the Thief
statistic and the Basilisk's "one trick" are gone; lessons say what the
board shows instead of repeating the panel; a Thief's leap counts four.
Browser: one keyboard walk, in BoardArtwork; the lesson board and page share
one game and one inspected piece; the chronicle's possessive is told, not
patched by a regex; the chronicle colours and the reading layout are global
rules instead of three copies; the guide and the about panel say what the
code and the article actually do.
Server and docs: the room server states that it is the kit's, kept whole;
the skills, the deploy README and the share card name files that exist.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CCLa2PaEeCj8njQZSWGqHx
This commit is contained in:
Eric WagonerandClaude Fable 5.1 committed 2026-10-26 22:38:00 -04:00
1 parent 944e4e8306
commit 0be89a1dfe
28 files changed
+227 -340

No files matched your search

+3 -3
View File
@@ -6,7 +6,7 @@
import { createGame, applyMove, validateMove } from '../src/lib/game/index.ts';
import { chooseMove } from '../src/lib/game/bot.ts';
import { narrate } from '../src/lib/game/chronicle.ts';
import { square, squareName, legalMovesFrom, type Side } from '../src/lib/game/board.ts';
import { square, squareName, legalMovesFrom } from '../src/lib/game/board.ts';
import { TOLD_MOVES } from '../src/lib/game/told.ts';
const FORCED: Record<number, [string, string]> = Object.fromEntries(TOLD_MOVES.map((m, n) => [n + 1, m]));
@@ -17,7 +17,7 @@ let s = createGame({ A: 'Gold', B: 'Scarlet' });
for (let ply = 1; ply <= plies && !s.over; ply++) {
const seat = s.toMove === 'gold' ? 'A' : 'B';
if (ply === askPly && askSquare) {
console.log(`ply ${ply}, ${s.toMove} to move, ${askSquare} may go to: ${legalMovesFrom(s.cells, square(askSquare), 'printed').map(squareName).join(' ')}`);
console.log(`ply ${ply}, ${s.toMove} to move, ${askSquare} may go to: ${legalMovesFrom(s.cells, square(askSquare), s.setup).map(squareName).join(' ')}`);
process.exit(0);
}
const forced = FORCED[ply];
@@ -29,7 +29,7 @@ for (let ply = 1; ply <= plies && !s.over; ply++) {
console.log(`ply ${ply}: forced ${forced[0]}-${forced[1]} refused: ${why}`);
process.exit(1);
}
} else move = chooseMove(s.cells, s.toMove as Side, 'printed', 40000)!;
} else move = chooseMove(s.cells, s.toMove, s.setup, 40000)!;
s = applyMove(s, move.from, move.to);
}
for (const t of narrate(s)) console.log(`${t.ply}${FORCED[t.ply] ? '*' : ' '} ${t.lines.map((l) => l.text).join(' ')}`);
+1 -1
View File
@@ -1,5 +1,5 @@
<!doctype html>
<!-- The share card, 1200 by 630. Open it with the site running at localhost:5173 and screenshot the body: docs/artwork.md. -->
<!-- The share card, 1200 by 630. Open it with the site running at localhost:5173 and screenshot the body at 1200 by 630 into static/. -->
<html>
<head>
<meta charset="utf-8" />