app/game_analysis.h

the artifact a review renders (review-docs/PLAN.md §5).

Deliberately separate from game_analyzer.h, which produces one: the store, the uploader and the GUI all consume analyses, and none of them should have to drag in an engine to do it.

EVERY SCORE HERE IS WHITE-RELATIVE. The search works in side-to-move-relative scores; that convention is normalized away exactly once, at the engine seam (LinkedEngine::analyze), because an eval graph plotted from side-to-move scores is a sawtooth of lies rather than a line.

namespace kirin

Enums

enum class MoveQuality

Values:

enumerator Best
enumerator Good
enumerator Inaccuracy
enumerator Mistake
enumerator Blunder
struct GameAnalysis
#include <game_analysis.h>

Public Members

std::string engineVersion
long nodesPerMove = 0
int analysisVersion = 1
std::vector<PlyAnalysis> plies
int acplWhite = 0
int acplBlack = 0
bool complete = false
struct PlyAnalysis
#include <game_analysis.h>

Public Members

int ply = 0
std::string uci
char mover = 'w'
int evalCp = 0
std::optional<int> mateIn
std::string bestUci
std::string pvUci
int lossCp = 0
MoveQuality quality = MoveQuality::Good