leetgpu-challenges
LeetGPU 챌린지
Dvoretsky Lab - 자신의 Lichess 게임으로 만든 체스 훈련실
Dvoretsky Lab - a chess training room built from your own Lichess games: a sparring engine that plays like you, drills cut from your mistakes, and Stockfish grading every move. Runs in the browser, no
교육JavaScript · PythonGitHub @luke-zhang-cs-py온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Dvoretsky Lab - a chess training room built from your own Lichess games: a sparring engine that plays like you, drills cut from your mistakes, and Stockfish grading every move. Runs in the browser, no install.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Why do you keep losing? A chess training room built from one player's own games: an opponent that plays like you, drills cut from your own mistakes, and Stockfish grading every move.
Above: the analysis window narrowing from all time to 30 days, then a sparring game
against the mirror. It answers from the player's own repertoire, and Stockfish grades
every move as it lands. Recorded from the live page by
tools/record_demo.py.
Read the full guide → — every tab, every number and where it comes from.
Double-click index.html. That's it: no server, no build, no account. Then put a
Lichess username in the box, pick All games or one format, and press Sync
games (or import a PGN in Settings).
python tools/build_single_file.py # one self-contained HTML file, Stockfish included
python test/dist_check.py # open that file on its own and check it works
The single file lands in dist/Dvoretsky-Lab.html. dist/ is not in git, so build it
from the sources when you need it: a copy left from older sources goes stale with nothing
to say so. CI builds it on every push and opens it in Chromium with nothing beside it;
test/dist_check.py fails on any page error, any file left un-inlined, or any inlined
file that differs from the one in js/ or css/.
the house engine (js/engine.js) | Stockfish 19 (js/vendor/, the lite single-threaded WebAssembly build) | |
|---|---|---|
| job | the sparring opponent, the drills, live advice | the check on all of that |
| strength | club level, on purpose, so it can be tuned to your error rate | far stronger |
| search | alpha-beta, quiescence, transposition table, null-move pruning | Stockfish's |
| runs | on the page | in a Web Worker, from a Blob, its .wasm handed over from the page, because file:// blocks the usual way |
| time | a deadline per move | the time per position you set, answered no later than it and no more than 5 ms short of it |
The mirror's moves are chosen to lose centipawns at the rate you lose them. Stockfish then measures what each move really cost, so the panel shows whether the house engine judged its own mistakes correctly.
index.html the whole app: open it
js/ 11 modules, plain scripts, no bundler; js/vendor/ is Stockfish (GPL-3.0)
css/ one stylesheet
test/ Node suites, the UCI gauntlet, Playwright drives of the page and the single file, a coverage report,
and Python checks (test_*.py) of the tools, the experiments and the report
tools/ uci.js (the engine for any UCI GUI), match.js and sprt.js (engine matches; games.js is
what they share), bench.js and acpl.js (speed and sparring calibration), the
single-file build and the demo recorder
experiments/ a PyTorch move predictor and an Elo study against Stockfish, apart from the app
notes/ the full guide
796 checks. In Node: 96 regression, 84 app (PGN import, Lichess sync, mining,
calendar, storage, the Stockfish reader), 66 rules (the endgame studies pinned among them), 43 titled-player, 32 analysis,
30 sparring, 30 Stockfish 19 (the vendored engine itself, run in Node; the time rule; the reader's
deadline), 29 coach, 23 engine and 22 integration checks,
and perft on 21 positions (35 counts, plus 5 SAN and PGN checks), 15 of them edge cases (en
passant out of a pin, castling into check, underpromotion) with counts taken from Stockfish 19,
one from python-chess. In Chromium: 222 browser checks and 6 on the single-file build. In Python:
73 checks of the tools, the experiments and the coverage report itself (test/test_*.py). Every
suite exits non-zero on a failure, which is what CI reads. Every bug fixed has a check that
failed on the code before its fix. The browser checks run the real Stockfish 19, and time it: 100 reads at 50 ms to 1 s,
every one answered within 5 ms short of its time and never after it. Together
they run all 4,938 code lines in js/, all 727 of its functions, all 4,394 of its
statements and all 3,551 of its branches (test/coverage_report.py, 13 October 2026, again
on 27 October; the guide says how the last of them were reached), and all 940 statements and
302 branches of the repository's own Python outside the test drivers (coverage.py, .coveragerc).
CI measures both in a job of its own and fails below 100%.
From the outside (test/engine_gauntlet.py): the engine driven over UCI the way a
GUI drives it, with python-chess as a referee that shares no code with js/core.js.
| check | result | measured |
|---|---|---|
| legality: 1,000 positions (random games, EPD suites, random valid placements, 18 edge cases) plus 2 game-over positions | 1,002 of 1,002 legal and well-formed, every reply within 100 ms a move + 150 ms of slack (a later one fails); median 83 ms, slowest 127 ms. On time means within the slack, not within 100 ms: replies of 176 ms have been seen on a loaded machine | 9 Oct 2026, this engine |
| mate in 1: 100 positions, screened by Stockfish and proved by brute force | 100 of 100 at 1 s (fewer fails CI) | 9 Oct 2026, this engine |
| mate in 2: 100 positions, any forced line accepted | 100 of 100 at 1 s (CI fails below 95); 82 at 0.3 s | 9 Oct 2026, this engine |
100 games against a random mover, 50 against a greedy capturer (CI plays 20 and 10: random --games 20) | 150 wins, no draws, no freezes, no games run to the ply cap; median win in 32 plies against the random mover (31 on the previous engine), 36 against the greedy one | 9 Oct 2026, this engine |
| 20 games against Stockfish 19 at 0.1 s a move (house engine also 0.1 s) | 0.5 of 20 (one perpetual), as expected. Median first blunder (200+ cp by a depth-12 referee) at move 8 after the opening; really down material from move 14 | 28 Sep 2026, previous engine |
On Windows the harness switches off power throttling for the engines it starts: a windowless child otherwise runs at about half speed (66k against 127k nodes/s here), and mate in 2 fell to 95–97 of 100 because depth 3 no longer fit in the second.
| strength | measured | |
|---|---|---|
SPRT against the engine before it (tools/sprt.js, 60 ms a move, elo0 0, elo1 20) | +83.5 ± 45.7 Elo over 212 games (+120 =22 −70), LLR 3.00, H1 accepted | 9 Oct 2026, this engine |
Win at Chess, 300 tactics (test/tactics.js) | 93 at 0.5 s (87 on the previous engine) | 9 Oct 2026, this engine |
| Bratko-Kopec, 24 positions | 6 at 10 s (6 before) | 9 Oct 2026, this engine |
| BT2630, 30 hard positions | 3 at 10 s: a rating floor of 1820 (the same before) | 9 Oct 2026, this engine |
matches against Stockfish 19 (set to 1500, 1800, 2100) and Maia 1500, 1900 (tools/match.js, 30+0.3) | performance about 1730 over 66 games | 27 Sep 2026, previous engine |
| STS, 1,500 strategic positions | 41.9% of the points at 0.5 s | 27 Sep 2026, previous engine |
speed (tools/bench.js, depth 4) | 61–73k nodes/s with other work running (the previous engine 62k beside it; 60–110k by machine load before); signature 3,015,335 nodes. Perft 2.3M leaves/s (3.4M before, on a quieter machine) | 9 Oct 2026, this engine |
This engine is js/engine.js after the 9 October 2026 changes (the quiescence search
searches check evasions, the deadline reaches quiescence, the mate threshold); the previous
engine is js/engine.js as of e278488 (27 September 2026). The rows on the previous engine
need Stockfish or Lc0 to rerun, so they were not. Every timed figure depends on the machine
and its load: these were taken with other work running.
Stockfish 19 through the same suites and scorer: WAC 276 at 1 s, Bratko-Kopec 20, BT2630 24, STS 86.2%, so the answer keys and the scoring hold up.
Every endgame study's verdict was checked on 12 October 2026 against the Lichess tablebase
(the breakthrough, with eight pieces, against Stockfish); the guide lists them.
test/stockfish_check.py re-checks the app's claims against Stockfish 19: every
endgame study's verdict (read from the study's own side and result), the imported evaluations, the mined mistakes and the house
engine's own choices (93% within 50 cp of best, on the previous engine), and exits 1 if
an endgame claim is wrong. python tools/install_stockfish.py puts the official Stockfish 19
and the 3- and 4-piece Syzygy tablebases (each file checked against a pinned SHA-256) in
.tools/, where both checks find them without a path; with the tablebases all 15 study
verdicts hold (13 October 2026). tools/uci.js runs the engine in
any UCI GUI. Setup: .github/CONTRIBUTING.md.
MIT, except js/vendor/ (Stockfish 19 by the Stockfish developers, as Stockfish.js 19.0.1 by Nathan Rugg; GPL-3.0).