gammonview 2.0.1__tar.gz → 2.0.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (290) hide show
  1. {gammonview-2.0.1 → gammonview-2.0.2}/CHANGELOG.md +12 -1
  2. {gammonview-2.0.1 → gammonview-2.0.2}/PKG-INFO +1 -1
  3. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat/ogxm2_writer.py +6 -1
  4. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/package.json +1 -1
  5. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/src/ogxm2_writer.js +5 -1
  6. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/test-ogxm2-writer.js +13 -0
  7. {gammonview-2.0.1 → gammonview-2.0.2}/.gitattributes +0 -0
  8. {gammonview-2.0.1 → gammonview-2.0.2}/.github/workflows/ci.yml +0 -0
  9. {gammonview-2.0.1 → gammonview-2.0.2}/.github/workflows/engine.yml +0 -0
  10. {gammonview-2.0.1 → gammonview-2.0.2}/.github/workflows/publish.yml +0 -0
  11. {gammonview-2.0.1 → gammonview-2.0.2}/.gitignore +0 -0
  12. {gammonview-2.0.1 → gammonview-2.0.2}/.python-version +0 -0
  13. {gammonview-2.0.1 → gammonview-2.0.2}/CLAUDE.md +0 -0
  14. {gammonview-2.0.1 → gammonview-2.0.2}/CONTRIBUTING.md +0 -0
  15. {gammonview-2.0.1 → gammonview-2.0.2}/LICENSE +0 -0
  16. {gammonview-2.0.1 → gammonview-2.0.2}/README.md +0 -0
  17. {gammonview-2.0.1 → gammonview-2.0.2}/THIRD-PARTY-NOTICES.md +0 -0
  18. {gammonview-2.0.1 → gammonview-2.0.2}/assets/logo.png +0 -0
  19. {gammonview-2.0.1 → gammonview-2.0.2}/docs/CLI.md +0 -0
  20. {gammonview-2.0.1 → gammonview-2.0.2}/docs/METHODOLOGY.md +0 -0
  21. {gammonview-2.0.1 → gammonview-2.0.2}/docs/OGXM_COMPUTED_FIELDS.md +0 -0
  22. {gammonview-2.0.1 → gammonview-2.0.2}/docs/OGXM_JSON_SPEC_GAMMONVIEW.md +0 -0
  23. {gammonview-2.0.1 → gammonview-2.0.2}/docs/OGXM_V2_PROFILE.md +0 -0
  24. {gammonview-2.0.1 → gammonview-2.0.2}/docs/PRESET_ACCURACY.md +0 -0
  25. {gammonview-2.0.1 → gammonview-2.0.2}/docs/upstream-bgsage.md +0 -0
  26. {gammonview-2.0.1 → gammonview-2.0.2}/docs/v1/OGXM_FORMAT_SPEC_GAMMONVIEW.md +0 -0
  27. {gammonview-2.0.1 → gammonview-2.0.2}/experiments/2026-09-16-checker-mid-tier.md +0 -0
  28. {gammonview-2.0.1 → gammonview-2.0.2}/experiments/2026-09-17-checker-mid-tier-followup.md +0 -0
  29. {gammonview-2.0.1 → gammonview-2.0.2}/experiments/2026-09-19-cross-machine-costs.md +0 -0
  30. {gammonview-2.0.1 → gammonview-2.0.2}/experiments/2026-09-20-corpus-rerun.md +0 -0
  31. {gammonview-2.0.1 → gammonview-2.0.2}/experiments/bench.py +0 -0
  32. {gammonview-2.0.1 → gammonview-2.0.2}/gvanalysis/__init__.py +0 -0
  33. {gammonview-2.0.1 → gammonview-2.0.2}/gvanalysis/batch.py +0 -0
  34. {gammonview-2.0.1 → gammonview-2.0.2}/gvanalysis/checker_eval.py +0 -0
  35. {gammonview-2.0.1 → gammonview-2.0.2}/gvanalysis/compare_gva.py +0 -0
  36. {gammonview-2.0.1 → gammonview-2.0.2}/gvanalysis/game_eval.py +0 -0
  37. {gammonview-2.0.1 → gammonview-2.0.2}/gvanalysis/loader.py +0 -0
  38. {gammonview-2.0.1 → gammonview-2.0.2}/gvanalysis/luck.py +0 -0
  39. {gammonview-2.0.1 → gammonview-2.0.2}/gvanalysis/match.py +0 -0
  40. {gammonview-2.0.1 → gammonview-2.0.2}/gvanalysis/ogxm_reconstructor.py +0 -0
  41. {gammonview-2.0.1 → gammonview-2.0.2}/gvanalysis/parentwatch.py +0 -0
  42. {gammonview-2.0.1 → gammonview-2.0.2}/gvanalysis/position.py +0 -0
  43. {gammonview-2.0.1 → gammonview-2.0.2}/gvanalysis/presets.py +0 -0
  44. {gammonview-2.0.1 → gammonview-2.0.2}/gvanalysis/progress.py +0 -0
  45. {gammonview-2.0.1 → gammonview-2.0.2}/gvanalysis/reconstruct_mat.py +0 -0
  46. {gammonview-2.0.1 → gammonview-2.0.2}/gvanalysis/share.py +0 -0
  47. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat/__init__.py +0 -0
  48. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat/basefill.py +0 -0
  49. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat/bgf.py +0 -0
  50. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat/binary.py +0 -0
  51. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat/export.py +0 -0
  52. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat/game_reconstructor.py +0 -0
  53. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat/legality.py +0 -0
  54. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat/mat.py +0 -0
  55. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat/mat_parser.py +0 -0
  56. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat/merge.py +0 -0
  57. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat/met.py +0 -0
  58. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat/notation.py +0 -0
  59. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat/ogid.py +0 -0
  60. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat/ogxm2.py +0 -0
  61. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat/ogxm2_passthrough.py +0 -0
  62. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat/place.py +0 -0
  63. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat/reader.py +0 -0
  64. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat/share.py +0 -0
  65. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat/stats.py +0 -0
  66. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat/xg.py +0 -0
  67. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/.gitignore +0 -0
  68. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/LICENSE +0 -0
  69. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/README.md +0 -0
  70. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/THIRD-PARTY-NOTICES.md +0 -0
  71. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/cli/README.md +0 -0
  72. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/cli/bgf2gva.js +0 -0
  73. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/cli/mat2gva.js +0 -0
  74. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/cli/xg2gva.js +0 -0
  75. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/package-lock.json +0 -0
  76. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/src/basefill.js +0 -0
  77. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/src/bgf2gva.js +0 -0
  78. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/src/binary.js +0 -0
  79. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/src/constants.js +0 -0
  80. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/src/export.js +0 -0
  81. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/src/index.js +0 -0
  82. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/src/legality.js +0 -0
  83. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/src/mat2gva.js +0 -0
  84. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/src/merge.js +0 -0
  85. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/src/met.js +0 -0
  86. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/src/notation.js +0 -0
  87. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/src/og2gva.js +0 -0
  88. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/src/ogid.js +0 -0
  89. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/src/ogxm2.js +0 -0
  90. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/src/ogxm2_passthrough.js +0 -0
  91. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/src/place.js +0 -0
  92. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/src/reader.js +0 -0
  93. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/src/sha256.js +0 -0
  94. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/src/share.js +0 -0
  95. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/src/stats.js +0 -0
  96. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/src/xg2gva.js +0 -0
  97. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/fixtures/mat/3WNK_g1Z-PLsh_HyvQ5j4a.json +0 -0
  98. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/fixtures/mat/5nqfGw9bWG3deTaU.json +0 -0
  99. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/fixtures/mat/B4_SrGcsKAQmoTyHlgJCbM.json +0 -0
  100. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/fixtures/mat/C07OQCKyw4Pe-CnjFiAMYO.json +0 -0
  101. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/fixtures/mat/MYdvw1qGuyaRUH__.json +0 -0
  102. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/fixtures/mat/Sz-2PgKnvb6aFls69-qFXg.json +0 -0
  103. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/fixtures/mat/UL-CV6F9jMM-E1Pu.json +0 -0
  104. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/fixtures/mat/XCu3RJ0UvDg_Tldl.json +0 -0
  105. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/fixtures/mat/baR-U643iUDpvzTC.json +0 -0
  106. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/fixtures/mat/eXBNG5wZHS5Alu3P.json +0 -0
  107. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/fixtures/mat/hQ8sVn2LbTdF4wRm.json +0 -0
  108. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/fixtures/mat/rK7pXm4TqLb9NzWd.json +0 -0
  109. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/fixtures/mat/uwvEbd63UvdX7SDin5o_Iw.json +0 -0
  110. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/fixtures/ogxm2/annos-docs.json +0 -0
  111. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/fixtures/ogxm2/annos-edits-sha256.json +0 -0
  112. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/fixtures/ogxm2/annos-sha256.json +0 -0
  113. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/fixtures/ogxm2/annos.expected.json +0 -0
  114. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/fixtures/ogxm2/annos.ogxm +0 -0
  115. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/fixtures/ogxm2/bgf-writer-sha256.json +0 -0
  116. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/fixtures/ogxm2/blocks-docs.json +0 -0
  117. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/fixtures/ogxm2/blocks-sha256.json +0 -0
  118. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/fixtures/ogxm2/blocks.expected.json +0 -0
  119. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/fixtures/ogxm2/blocks.ogxm +0 -0
  120. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/fixtures/ogxm2/cube-on-two.expected.json +0 -0
  121. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/fixtures/ogxm2/cube-on-two.ogxm +0 -0
  122. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/fixtures/ogxm2/fields-docs.json +0 -0
  123. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/fixtures/ogxm2/fields-sha256.json +0 -0
  124. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/fixtures/ogxm2/fields.expected.json +0 -0
  125. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/fixtures/ogxm2/fields.ogxm +0 -0
  126. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/fixtures/ogxm2/foreign.ogxm +0 -0
  127. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/fixtures/ogxm2/gen.py +0 -0
  128. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/fixtures/ogxm2/match.expected.json +0 -0
  129. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/fixtures/ogxm2/match.ogxm +0 -0
  130. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/fixtures/ogxm2/passthrough-sha256.json +0 -0
  131. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/fixtures/ogxm2/resign.expected.json +0 -0
  132. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/fixtures/ogxm2/resign.ogxm +0 -0
  133. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/fixtures/ogxm2/set-up.expected.json +0 -0
  134. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/fixtures/ogxm2/set-up.ogxm +0 -0
  135. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/fixtures/ogxm2/two-blocks.expected.json +0 -0
  136. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/fixtures/ogxm2/two-blocks.ogxm +0 -0
  137. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/fixtures/ogxm2/v1-chunks.gvab +0 -0
  138. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/fixtures/ogxm2/writer-sha256.json +0 -0
  139. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/test-alternative-move-steps.js +0 -0
  140. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/test-basefill.js +0 -0
  141. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/test-bgf-alternatives.js +0 -0
  142. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/test-bgf-embedded-cube.js +0 -0
  143. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/test-bgf-move-steps.js +0 -0
  144. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/test-chunk-passthrough.js +0 -0
  145. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/test-equity-loss.js +0 -0
  146. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/test-illegal-move.js +0 -0
  147. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/test-illegal-play-steps.js +0 -0
  148. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/test-legality.js +0 -0
  149. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/test-mat.js +0 -0
  150. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/test-merge.js +0 -0
  151. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/test-met.js +0 -0
  152. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/test-og.js +0 -0
  153. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/test-ogid.js +0 -0
  154. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/test-ogxm2-annos.js +0 -0
  155. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/test-ogxm2-blocks.js +0 -0
  156. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/test-ogxm2-fields.js +0 -0
  157. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/test-ogxm2-limits.js +0 -0
  158. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/test-ogxm2-passthrough.js +0 -0
  159. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/test-ogxm2.js +0 -0
  160. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/test-place.js +0 -0
  161. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/test-robustness.js +0 -0
  162. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/test-roundtrip.js +0 -0
  163. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/test-share.js +0 -0
  164. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/test-stats.js +0 -0
  165. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/test-xg-cube.js +0 -0
  166. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/test-xg-eval-levels.js +0 -0
  167. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/test-xg-move-steps.js +0 -0
  168. {gammonview-2.0.1 → gammonview-2.0.2}/gvformat-js/test/test-xg-zero-win-eval.js +0 -0
  169. {gammonview-2.0.1 → gammonview-2.0.2}/pyproject.toml +0 -0
  170. {gammonview-2.0.1 → gammonview-2.0.2}/samples/README.md +0 -0
  171. {gammonview-2.0.1 → gammonview-2.0.2}/samples/bgf/3WNK_g1Z-PLsh_HyvQ5j4a.bgf +0 -0
  172. {gammonview-2.0.1 → gammonview-2.0.2}/samples/bgf/5nqfGw9bWG3deTaU.bgf +0 -0
  173. {gammonview-2.0.1 → gammonview-2.0.2}/samples/bgf/B4_SrGcsKAQmoTyHlgJCbM.bgf +0 -0
  174. {gammonview-2.0.1 → gammonview-2.0.2}/samples/bgf/C07OQCKyw4Pe-CnjFiAMYO.bgf +0 -0
  175. {gammonview-2.0.1 → gammonview-2.0.2}/samples/bgf/MYdvw1qGuyaRUH__.bgf +0 -0
  176. {gammonview-2.0.1 → gammonview-2.0.2}/samples/bgf/Sz-2PgKnvb6aFls69-qFXg.bgf +0 -0
  177. {gammonview-2.0.1 → gammonview-2.0.2}/samples/bgf/UL-CV6F9jMM-E1Pu.bgf +0 -0
  178. {gammonview-2.0.1 → gammonview-2.0.2}/samples/bgf/XCu3RJ0UvDg_Tldl.bgf +0 -0
  179. {gammonview-2.0.1 → gammonview-2.0.2}/samples/bgf/baR-U643iUDpvzTC.bgf +0 -0
  180. {gammonview-2.0.1 → gammonview-2.0.2}/samples/bgf/eXBNG5wZHS5Alu3P.bgf +0 -0
  181. {gammonview-2.0.1 → gammonview-2.0.2}/samples/bgf/uwvEbd63UvdX7SDin5o_Iw.bgf +0 -0
  182. {gammonview-2.0.1 → gammonview-2.0.2}/samples/gv/3WNK_g1Z-PLsh_HyvQ5j4a.gvab +0 -0
  183. {gammonview-2.0.1 → gammonview-2.0.2}/samples/gv/5nqfGw9bWG3deTaU.gvab +0 -0
  184. {gammonview-2.0.1 → gammonview-2.0.2}/samples/gv/B4_SrGcsKAQmoTyHlgJCbM.gva +0 -0
  185. {gammonview-2.0.1 → gammonview-2.0.2}/samples/gv/B4_SrGcsKAQmoTyHlgJCbM.gvab +0 -0
  186. {gammonview-2.0.1 → gammonview-2.0.2}/samples/gv/C07OQCKyw4Pe-CnjFiAMYO.gvab +0 -0
  187. {gammonview-2.0.1 → gammonview-2.0.2}/samples/gv/MYdvw1qGuyaRUH__.gvab +0 -0
  188. {gammonview-2.0.1 → gammonview-2.0.2}/samples/gv/Sz-2PgKnvb6aFls69-qFXg.gvab +0 -0
  189. {gammonview-2.0.1 → gammonview-2.0.2}/samples/gv/UL-CV6F9jMM-E1Pu.gvab +0 -0
  190. {gammonview-2.0.1 → gammonview-2.0.2}/samples/gv/XCu3RJ0UvDg_Tldl.gvab +0 -0
  191. {gammonview-2.0.1 → gammonview-2.0.2}/samples/gv/baR-U643iUDpvzTC.gvab +0 -0
  192. {gammonview-2.0.1 → gammonview-2.0.2}/samples/gv/eXBNG5wZHS5Alu3P.gvab +0 -0
  193. {gammonview-2.0.1 → gammonview-2.0.2}/samples/gv/uwvEbd63UvdX7SDin5o_Iw.gvab +0 -0
  194. {gammonview-2.0.1 → gammonview-2.0.2}/samples/mat/3WNK_g1Z-PLsh_HyvQ5j4a.mat +0 -0
  195. {gammonview-2.0.1 → gammonview-2.0.2}/samples/mat/5nqfGw9bWG3deTaU.mat +0 -0
  196. {gammonview-2.0.1 → gammonview-2.0.2}/samples/mat/B4_SrGcsKAQmoTyHlgJCbM.mat +0 -0
  197. {gammonview-2.0.1 → gammonview-2.0.2}/samples/mat/C07OQCKyw4Pe-CnjFiAMYO.mat +0 -0
  198. {gammonview-2.0.1 → gammonview-2.0.2}/samples/mat/MYdvw1qGuyaRUH__.mat +0 -0
  199. {gammonview-2.0.1 → gammonview-2.0.2}/samples/mat/Sz-2PgKnvb6aFls69-qFXg.mat +0 -0
  200. {gammonview-2.0.1 → gammonview-2.0.2}/samples/mat/UL-CV6F9jMM-E1Pu.mat +0 -0
  201. {gammonview-2.0.1 → gammonview-2.0.2}/samples/mat/XCu3RJ0UvDg_Tldl.mat +0 -0
  202. {gammonview-2.0.1 → gammonview-2.0.2}/samples/mat/baR-U643iUDpvzTC.mat +0 -0
  203. {gammonview-2.0.1 → gammonview-2.0.2}/samples/mat/eXBNG5wZHS5Alu3P.mat +0 -0
  204. {gammonview-2.0.1 → gammonview-2.0.2}/samples/mat/hQ8sVn2LbTdF4wRm.mat +0 -0
  205. {gammonview-2.0.1 → gammonview-2.0.2}/samples/mat/rK7pXm4TqLb9NzWd.mat +0 -0
  206. {gammonview-2.0.1 → gammonview-2.0.2}/samples/mat/uwvEbd63UvdX7SDin5o_Iw.mat +0 -0
  207. {gammonview-2.0.1 → gammonview-2.0.2}/samples/xg/3WNK_g1Z-PLsh_HyvQ5j4a.xg +0 -0
  208. {gammonview-2.0.1 → gammonview-2.0.2}/samples/xg/5nqfGw9bWG3deTaU.xg +0 -0
  209. {gammonview-2.0.1 → gammonview-2.0.2}/samples/xg/B4_SrGcsKAQmoTyHlgJCbM.xg +0 -0
  210. {gammonview-2.0.1 → gammonview-2.0.2}/samples/xg/C07OQCKyw4Pe-CnjFiAMYO.xg +0 -0
  211. {gammonview-2.0.1 → gammonview-2.0.2}/samples/xg/MYdvw1qGuyaRUH__.xg +0 -0
  212. {gammonview-2.0.1 → gammonview-2.0.2}/samples/xg/Sz-2PgKnvb6aFls69-qFXg.xg +0 -0
  213. {gammonview-2.0.1 → gammonview-2.0.2}/samples/xg/UL-CV6F9jMM-E1Pu.xg +0 -0
  214. {gammonview-2.0.1 → gammonview-2.0.2}/samples/xg/XCu3RJ0UvDg_Tldl.xg +0 -0
  215. {gammonview-2.0.1 → gammonview-2.0.2}/samples/xg/baR-U643iUDpvzTC.xg +0 -0
  216. {gammonview-2.0.1 → gammonview-2.0.2}/samples/xg/eXBNG5wZHS5Alu3P.xg +0 -0
  217. {gammonview-2.0.1 → gammonview-2.0.2}/samples/xg/hQ8sVn2LbTdF4wRm.xg +0 -0
  218. {gammonview-2.0.1 → gammonview-2.0.2}/samples/xg/rK7pXm4TqLb9NzWd.xg +0 -0
  219. {gammonview-2.0.1 → gammonview-2.0.2}/samples/xg/uwvEbd63UvdX7SDin5o_Iw.xg +0 -0
  220. {gammonview-2.0.1 → gammonview-2.0.2}/tests/audit_corpus.py +0 -0
  221. {gammonview-2.0.1 → gammonview-2.0.2}/tests/fixtures.py +0 -0
  222. {gammonview-2.0.1 → gammonview-2.0.2}/tests/gen_js_v2_fixtures.py +0 -0
  223. {gammonview-2.0.1 → gammonview-2.0.2}/tests/gen_ogxm2_annos_fixtures.py +0 -0
  224. {gammonview-2.0.1 → gammonview-2.0.2}/tests/gen_ogxm2_blocks_fixtures.py +0 -0
  225. {gammonview-2.0.1 → gammonview-2.0.2}/tests/gen_ogxm2_fields_fixtures.py +0 -0
  226. {gammonview-2.0.1 → gammonview-2.0.2}/tests/gen_ogxm2_passthrough_fixtures.py +0 -0
  227. {gammonview-2.0.1 → gammonview-2.0.2}/tests/golden/3WNK_g1Z-PLsh_HyvQ5j4a.fast.gva +0 -0
  228. {gammonview-2.0.1 → gammonview-2.0.2}/tests/golden/3WNK_g1Z-PLsh_HyvQ5j4a.fast.gvab +0 -0
  229. {gammonview-2.0.1 → gammonview-2.0.2}/tests/golden/5nqfGw9bWG3deTaU.fast.gva +0 -0
  230. {gammonview-2.0.1 → gammonview-2.0.2}/tests/golden/5nqfGw9bWG3deTaU.fast.gvab +0 -0
  231. {gammonview-2.0.1 → gammonview-2.0.2}/tests/golden/B4_SrGcsKAQmoTyHlgJCbM.fast.gva +0 -0
  232. {gammonview-2.0.1 → gammonview-2.0.2}/tests/golden/B4_SrGcsKAQmoTyHlgJCbM.fast.gvab +0 -0
  233. {gammonview-2.0.1 → gammonview-2.0.2}/tests/golden/MYdvw1qGuyaRUH__.fast.gva +0 -0
  234. {gammonview-2.0.1 → gammonview-2.0.2}/tests/golden/MYdvw1qGuyaRUH__.fast.gvab +0 -0
  235. {gammonview-2.0.1 → gammonview-2.0.2}/tests/golden/PROVENANCE.json +0 -0
  236. {gammonview-2.0.1 → gammonview-2.0.2}/tests/golden/baR-U643iUDpvzTC.fast.gva +0 -0
  237. {gammonview-2.0.1 → gammonview-2.0.2}/tests/golden/baR-U643iUDpvzTC.fast.gvab +0 -0
  238. {gammonview-2.0.1 → gammonview-2.0.2}/tests/ogxm2_annos_cases.py +0 -0
  239. {gammonview-2.0.1 → gammonview-2.0.2}/tests/ogxm2_blocks_cases.py +0 -0
  240. {gammonview-2.0.1 → gammonview-2.0.2}/tests/ogxm2_fields_cases.py +0 -0
  241. {gammonview-2.0.1 → gammonview-2.0.2}/tests/ogxm2_oracle.py +0 -0
  242. {gammonview-2.0.1 → gammonview-2.0.2}/tests/passthrough_cases.py +0 -0
  243. {gammonview-2.0.1 → gammonview-2.0.2}/tests/regen_golden.py +0 -0
  244. {gammonview-2.0.1 → gammonview-2.0.2}/tests/run_all.py +0 -0
  245. {gammonview-2.0.1 → gammonview-2.0.2}/tests/test_alternative_move_steps.py +0 -0
  246. {gammonview-2.0.1 → gammonview-2.0.2}/tests/test_analysis_orientation.py +0 -0
  247. {gammonview-2.0.1 → gammonview-2.0.2}/tests/test_analyze_position.py +0 -0
  248. {gammonview-2.0.1 → gammonview-2.0.2}/tests/test_basefill.py +0 -0
  249. {gammonview-2.0.1 → gammonview-2.0.2}/tests/test_bgf_alternatives.py +0 -0
  250. {gammonview-2.0.1 → gammonview-2.0.2}/tests/test_bgf_cube_response.py +0 -0
  251. {gammonview-2.0.1 → gammonview-2.0.2}/tests/test_bgf_move_steps.py +0 -0
  252. {gammonview-2.0.1 → gammonview-2.0.2}/tests/test_chunk_passthrough.py +0 -0
  253. {gammonview-2.0.1 → gammonview-2.0.2}/tests/test_count_illegal.py +0 -0
  254. {gammonview-2.0.1 → gammonview-2.0.2}/tests/test_cube_tiers.py +0 -0
  255. {gammonview-2.0.1 → gammonview-2.0.2}/tests/test_docs_presets.py +0 -0
  256. {gammonview-2.0.1 → gammonview-2.0.2}/tests/test_equity_loss.py +0 -0
  257. {gammonview-2.0.1 → gammonview-2.0.2}/tests/test_gvab_writer.py +0 -0
  258. {gammonview-2.0.1 → gammonview-2.0.2}/tests/test_illegal_move.py +0 -0
  259. {gammonview-2.0.1 → gammonview-2.0.2}/tests/test_illegal_play_steps.py +0 -0
  260. {gammonview-2.0.1 → gammonview-2.0.2}/tests/test_legality.py +0 -0
  261. {gammonview-2.0.1 → gammonview-2.0.2}/tests/test_loader_formats.py +0 -0
  262. {gammonview-2.0.1 → gammonview-2.0.2}/tests/test_luck_fill.py +0 -0
  263. {gammonview-2.0.1 → gammonview-2.0.2}/tests/test_met.py +0 -0
  264. {gammonview-2.0.1 → gammonview-2.0.2}/tests/test_ogxm2.py +0 -0
  265. {gammonview-2.0.1 → gammonview-2.0.2}/tests/test_ogxm2_annos.py +0 -0
  266. {gammonview-2.0.1 → gammonview-2.0.2}/tests/test_ogxm2_blocks.py +0 -0
  267. {gammonview-2.0.1 → gammonview-2.0.2}/tests/test_ogxm2_blocks_analysis.py +0 -0
  268. {gammonview-2.0.1 → gammonview-2.0.2}/tests/test_ogxm2_fields.py +0 -0
  269. {gammonview-2.0.1 → gammonview-2.0.2}/tests/test_ogxm2_fields_analysis.py +0 -0
  270. {gammonview-2.0.1 → gammonview-2.0.2}/tests/test_ogxm2_limits.py +0 -0
  271. {gammonview-2.0.1 → gammonview-2.0.2}/tests/test_ogxm2_passthrough.py +0 -0
  272. {gammonview-2.0.1 → gammonview-2.0.2}/tests/test_ogxm2_reference.py +0 -0
  273. {gammonview-2.0.1 → gammonview-2.0.2}/tests/test_ogxm2_writer.py +0 -0
  274. {gammonview-2.0.1 → gammonview-2.0.2}/tests/test_ogxm_conformance.py +0 -0
  275. {gammonview-2.0.1 → gammonview-2.0.2}/tests/test_ogxm_export.py +0 -0
  276. {gammonview-2.0.1 → gammonview-2.0.2}/tests/test_ogxm_pipeline.py +0 -0
  277. {gammonview-2.0.1 → gammonview-2.0.2}/tests/test_ogxm_stats.py +0 -0
  278. {gammonview-2.0.1 → gammonview-2.0.2}/tests/test_parent_watch.py +0 -0
  279. {gammonview-2.0.1 → gammonview-2.0.2}/tests/test_position_id.py +0 -0
  280. {gammonview-2.0.1 → gammonview-2.0.2}/tests/test_read_gvab.py +0 -0
  281. {gammonview-2.0.1 → gammonview-2.0.2}/tests/test_reconstruct_mat.py +0 -0
  282. {gammonview-2.0.1 → gammonview-2.0.2}/tests/test_resign_actor.py +0 -0
  283. {gammonview-2.0.1 → gammonview-2.0.2}/tests/test_restated_play_analysis.py +0 -0
  284. {gammonview-2.0.1 → gammonview-2.0.2}/tests/test_screened_checker.py +0 -0
  285. {gammonview-2.0.1 → gammonview-2.0.2}/tests/test_share_link.py +0 -0
  286. {gammonview-2.0.1 → gammonview-2.0.2}/tests/test_xg_cube.py +0 -0
  287. {gammonview-2.0.1 → gammonview-2.0.2}/tests/test_xg_eval_levels.py +0 -0
  288. {gammonview-2.0.1 → gammonview-2.0.2}/tests/test_xg_move_steps.py +0 -0
  289. {gammonview-2.0.1 → gammonview-2.0.2}/tests/test_xg_zero_win_eval.py +0 -0
  290. {gammonview-2.0.1 → gammonview-2.0.2}/uv.lock +0 -0
@@ -13,7 +13,18 @@ when the repository was opened; they are kept because they record why things
13
13
  are the way they are — particularly the breaking changes and the measurements
14
14
  behind several design decisions. Dates are the tag dates.
15
15
 
16
- ## 2.0.1 — Unreleased
16
+ ## 2.0.2 — 2026-10-12
17
+
18
+ **A set-up start is written once** *(fix)*
19
+
20
+ 2.0.1's fix for v1 set-up starts went too far. A game whose first ply sets up
21
+ the board *with* dice keeps that ply as a ply, and the writers then also took
22
+ the game's `initial_board` as a second start, so a rewritten file read back
23
+ with an extra set-up ply in front and every later ply one place out. Both
24
+ writers now take `initial_board` as the start only when the game has no
25
+ leading set-up ply of either kind, which is the v1 case 2.0.1 was for.
26
+
27
+ ## 2.0.1 — 2026-10-10
17
28
 
18
29
  **Plies are counted the way v2 counts them** *(fix)*
19
30
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: gammonview
3
- Version: 2.0.1
3
+ Version: 2.0.2
4
4
  Summary: Backgammon match analysis — the pure-Python OGXM/GVA codec (`gvformat`) plus bgsage-powered match and position analysis (`gvanalysis`).
5
5
  Project-URL: Homepage, https://github.com/ngvlamis/gammonview-analysis
6
6
  Project-URL: Repository, https://github.com/ngvlamis/gammonview-analysis
@@ -466,10 +466,15 @@ def _bare_initial_board(g: dict, opening_abs: list, start: int):
466
466
  board in the GAME header), so a v1 file rewritten as v2 would otherwise
467
467
  lose its start -- and its plies, replayed from the opening, would be
468
468
  flagged illegal. A leading set-up ply, where there is one, wins: a v2 read
469
- states the board both ways."""
469
+ states the board both ways. So does one *with* dice, which `_game_start`
470
+ keeps as a ply: the document already states its start, and taking
471
+ ``initial_board`` too would write that start twice."""
470
472
  ib = g.get("initial_board")
471
473
  if start or not isinstance(ib, list) or len(ib) != 26:
472
474
  return None
475
+ plies = g.get("plies") or []
476
+ if plies and plies[0].get("action_id") == R.ACTION_SET_POSITION:
477
+ return None
473
478
  board_abs = [int(v) for v in ib]
474
479
  return None if board_abs == opening_abs else board_abs
475
480
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gammonview/gvformat",
3
- "version": "2.0.1",
3
+ "version": "2.0.2",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./src/index.js",
@@ -592,10 +592,14 @@ function _gameStart(g, openingAbs) {
592
592
  * board in the GAME header), so a v1 file rewritten as v2 would otherwise lose
593
593
  * its start -- and its plies, replayed from the opening, would be flagged
594
594
  * illegal. A leading set-up ply, where there is one, wins: a v2 read states
595
- * the board both ways. */
595
+ * the board both ways. So does one *with* dice, which `_gameStart` keeps as a
596
+ * ply: the document already states its start, and taking `initial_board` too
597
+ * would write that start twice. */
596
598
  function _bareInitialBoard(g, openingAbs, start) {
597
599
  const ib = g.initial_board;
598
600
  if (start || !Array.isArray(ib) || ib.length !== 26) return null;
601
+ const plies = g.plies || [];
602
+ if (plies.length && plies[0].action_id === ACTION_SET_POSITION) return null;
599
603
  const boardAbs = ib.map(_int);
600
604
  return boardAbs.every((v, i) => v === openingAbs[i]) ? null : boardAbs;
601
605
  }
@@ -110,5 +110,18 @@ for (const name of bgfs) {
110
110
  "a bare initial_board (a v1 read's set-up start) is written as the game's start");
111
111
  }
112
112
 
113
+ // ...but not when the game already opens on a set-up ply that carries dice.
114
+ // That ply is kept as a ply, so it states the start, and taking
115
+ // `initial_board` as a second start shifted every ply after it by one.
116
+ {
117
+ const setup = readGvab(toU8(readFileSync(join(here, 'fixtures', 'ogxm2', 'set-up.ogxm'))));
118
+ const rolled = structuredClone(setup);
119
+ Object.assign(rolled.games[1].plies[0], { d1: 3, d2: 1 });
120
+ const back = readGvab(write_gvab(rolled));
121
+ assert(back.games[1].plies.length === rolled.games[1].plies.length
122
+ && back.games[1].plies[0].d1 === 3,
123
+ 'a set-up ply with dice beside initial_board is written once, not twice');
124
+ }
125
+
113
126
  console.log(`\n${passed} passed, ${failed} failed`);
114
127
  process.exit(failed ? 1 : 0);
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes