Release/v3.1.0 - #332
Conversation
Otherwise incomplete dtest output could produce a numeric TOTAL while the per-file cell is NA. Co-authored-by: Cursor <cursoragent@cursor.com>
hands=0 from dtest is real; falling back to listN.txt incorrectly pulled those rows into TOTAL. Co-authored-by: Cursor <cursoragent@cursor.com>
Introduce --config=ubsan (with macOS Xcode runtime rpath) and wire it into Linux/macOS CI alongside ASan/TSan. Repair out-of-bounds accesses in lookup table init, empty-deal solve_board setup, and get_top_number on empty suits. Co-authored-by: Cursor <cursoragent@cursor.com>
Web enhancements
Drop the temporary MVP label now that the page is a real DDS Web surface, and align files, Bazel targets, WASM exports, and docs with dds_web. Co-authored-by: Cursor <cursoragent@cursor.com>
Keep unittest and gtest names aligned with dds_web so failure output matches the new terminology. Co-authored-by: Cursor <cursoragent@cursor.com>
Show par alongside the DD table (optional --vul), using a one-line summary when there is a single par contract and falling back to verbose output otherwise. Co-authored-by: Cursor <cursoragent@cursor.com>
Raise the PBN read limit so large exports are not truncated, report missing paths clearly, and separate multi-deal output with blank lines. Co-authored-by: Cursor <cursoragent@cursor.com>
Keep sacrifices and equals makes compact (e.g. EW 3Dx,EW 3Cx -1 -100; EW 2S = 110) instead of the verbose four-line breakdown. Co-authored-by: Cursor <cursoragent@cursor.com>
Move parse/vuln/path/par formatting into a cc_library with gtests under examples/tests/. Co-authored-by: Cursor <cursoragent@cursor.com>
Deduplicate exact deal strings in first-seen order so multi-table exports are not re-solved. Co-authored-by: Cursor <cursoragent@cursor.com>
DDS Par strings encode overtricks as concatenated levels (e.g. 45S); normalize them to level + overtricks like the binary formatter, and keep a single blank line after the hand diagram. Co-authored-by: Cursor <cursoragent@cursor.com>
Allow stdin input exactly at PBN_FILE_MAX like file reads and C++, and use snprintf for deal titles. Co-authored-by: Cursor <cursoragent@cursor.com>
Keep only Board/Dealer/Vulnerable/Deal tags so the example has no player names, RealBridge IDs, or session identifiers. Co-authored-by: Cursor <cursoragent@cursor.com>
Align CLI help with accepted 0|1|2|3 values, and use a generic stdin failure message when input is empty or oversize. Co-authored-by: Cursor <cursoragent@cursor.com>
Only report a stdin read failure when the stream is at EOF or bad; oversized input is already explained by read_pbn_stream. Co-authored-by: Cursor <cursoragent@cursor.com>
Show the side once (e.g. EW 4Hx, 5Cx) instead of repeating seats on each alternate contract. Co-authored-by: Cursor <cursoragent@cursor.com>
Useful for sampling large multi-board PBN files without running every distinct deal. Co-authored-by: Cursor <cursoragent@cursor.com>
Report when multiple deal arguments are given, treat empty PBN as a missing Deal tag, and avoid a redundant Cannot-read message after an oversize rejection. Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
|
@tameware , @ThorvaldAagaard , @tzimnoch @mortensp Please review |
|
I have reviewed the document https://github.com/dds-bridge/dds/blob/release/v3.1.0/docs/release_notes/draft_v3_1_0.md with help from Claude:
I agree with Claude and must acknowledge Claude is better at review than me :-) |
|
Thanks for the link to the doc, Thor! On Sun, Aug 16, 2026 at 12:12 PM, Thorvald Aagaard <notifications@github.com> wrote: ThorvaldAagaard The version isn't bumped — release blocker, not a notes bug. library/src/api/dll.h:31 on the release branch still says #define DDS_VERSION 30000, and MODULE.bazel says version = "3.0.1". GetDDSInfo derives major/minor/patch from that macro, so a 3.1.0 build would report itself as 3.0.0. Worth noting this has already slipped once: at the v3.0.0 tag the macro still read 20900. "Worker exceptions … are propagated" is wrong. parallel_boards.cpp:181 catches (...) and stores RETURN_UNKNOWN_FAULT; there is no exception_ptr anywhere in library/, and the commit is literally titled "Make worker exceptions always map the run to RETURN_UNKNOWN_FAULT." Nothing is propagated — which is correct design for a C ABI. Suggest: "Worker exceptions in parallel board solving are reported as RETURN_UNKNOWN_FAULT rather than terminating the process." The sanitizer sentence over-claims. "CI now runs Linux, macOS, Windows, and WASM, under ASan, TSan, UBSan, and MSan" reads as a 4×4 matrix. Actually: Linux runs all four; macOS runs ASan/TSan/UBSan and only over //library/tests/system/...; Windows and WASM run no sanitizers at all. Suggest splitting into two clauses. Compatibility section is too absolute. Both behavioural changes deserve a line: SolveAllBoards*/CalcAllTables* now spawn threads by default where 3.0 was sequential (that's why the *Seq variants exist), and the #156 fix changes AnalysePlay results. Both are improvements, but an embedder who assumed a single-threaded library or who pinned expected trick counts will notice. Minor — initialise vs Initialize. Python exposes initialise_static_memory, C exposes InitializeStaticMemory. Both are real, but the notes put them two sections apart and readers will file a bug report about it. One parenthetical fixes it. Contributors — one missing. Every author in main..release maps to a listed handle except Yin Sun (sunyin51@gmail.com, 1 commit). "Search efficiency is back at 2.9 parity" traces only to a commit message. You now have //benchmarks:dds_replay and warm_tt_benchmark — a real number there would make the strongest claim in the document the best-supported one. I agree with Claude and must acknowledge Claude is better at review than me :-) — |
|
Maybe mention the initial web frontend deployment at https://dds-bridge.github.io/dds/ |
|
Benchmark that includes DDSS: I suspect dtest3.0 timing suffered mainly from the dtest client not reusing solver contexts. |
|
Why do the Python bindings use the British spelling of Initialise? I known the language is named for Monty Python, but that doesn't seem sufficient reason. Wouldn't consistency be a virtue? |
|
+1 for aligning the spelling Python has no British tradition. The Monty Python etymology never propagated to the stdlib — CPython is initialize, normalize, serialize, color throughout. There's no local convention to appeal to. |
Maybe because my system will default to British spelling? |
|
I think we are ready for round two of feedback, @ThorvaldAagaard , @tameware , @mortensp , @tzimnoch |
|
initialise is still there, in code and comments. Shall I submit a PR that updates it? We should report results from benchmark.py and from Thor's scripts (I haven't tried them yet) with every release. |
|
1. 2. 3. Formatting nits in the two new paragraphs. 4. The Python spelling — your call, but the new parenthetical overstates it. |
|
@ThorvaldAagaard and @tameware , round has been addressed. |
|
Submitted PR #336 for initialize and initialization. I can do the same for analyse -> analyze and behaviour -> behavior. It will touch more files -- analyse strongly outnumbers analyze: It's close for behaviour -> behavior: |
|
The v2.9 API, carried over to 3.0, used the British analyse. If we change it, we need to include deprecated variants using the British spelling. Maybe leave that for now. Safe to change, per Cursor: @zzcgumn, please let me know if you'd like a PR for this. |
|
Claude have some small issues:
Formatting, still open from last round: the continuation line at draft_v3_1_0.md:95 is still at column 0 while every other wrapped bullet in the document indents two spaces; trailing spaces remain on lines 94, 139, 140; and the blank line at 61 splits the Performance section into two Markdown lists, so "New performance tooling" renders with looser spacing than the bullets above it. |
|
@tameware , let's leave the 2.9 legacy API untouched and mark it as legacy from v3.2.0 |
Fair point that we avoid a future breaking change. I am not allowed to change the base branch, or I could at least not figure out how to do it. @tameware , can you change the pull request to be against release branch please? |
You caught me just before turning in! Will do now. Shall I do the same for the initiali(sz)e PR? |
Ha! I was confused, but did what @zzcgumn asked anyway. I was thinking you'd asked for the Windows CI split, that would allow the CI to pass. Shall I submit it in a PR against this branch next? |
Release v3.1.0.