scid::core::Movetext is the root of a game's playable move tree. It owns the comment before the first mainline move and the mainline itself. From there, the model is recursive: a MoveSequence owns ordered Move values, each Move can own child Variation values, and each Variation owns another MoveSequence.
The aggregate view is the compact map of the movetext tree. PGN, SAN and NAG text sit outside the tree as notation mappings; cursors use the tree without owning it; Movetext owns the mainline; moves own both their payload and the variation branches that depart from them.
This diagram expands the movetext tree into the public types that carry moves, comments, annotations and variation branches. It is intentionally loose: it shows recursive ownership and the split between stored move intent and display metadata, while leaving detailed cursor mechanics to the traversal model.
MoveSpec is the durable move intent stored in the tree. It is not enough to execute or undo a move by itself; Position resolves it when callers need board state, legality checks or SAN generation. MoveMetadata and Nag are attached to a move as annotation data, while Variation::initialComment is the comment that appears before the first move of a variation. Cursors and MovetextLocation are intentionally left to the traversal model; here they matter only as users of the tree.