Repository navigation
v2.1.1
Bracket Creator 2.1.1
A patch release that makes the tournament app safer on a live floor: no recorded result is dropped any more. A match write is merged group by group in the order the changes were made, and anything that does not apply is kept in a per-match history. It also fixes a packaging defect in 2.1.0 and a round of operator bugs found by reviewing the app as a tired, clumsy operator would use it.
Upgrade from 2.1.0 if you installed a release archive or package. The 2.1.0 archives and Linux packages embed no Preact, so the tournament app's UI renders blank (all four of its vendor scripts answer 404). The release now fetches them, and the package smoke test starts the app and fetches its UI assets, so a missing one fails the release (#453). Docker images and local builds fetch those scripts as part of make go/build, so they were not affected.
There are no draw or scoring-rule changes, so a draw generated under 2.1 stays valid. Reload any admin console or viewer tab left open across the upgrade, so it picks up the new front-end.
Upgrading from 2.1.0
- The server refuses to start on a data folder it cannot write, and names every folder that fails (the data folder,
competitions/,.wal/, each competition and itshistory/,branding/,sponsors/). Fix the permissions and start again (#453) - Every match now has a
history/file undercompetitions/<id>/history/, andpool-matches.csvandbracket.jsoncarry per-group timestamps. 2.1.1 adds files and fields that 2.1.0 does not know about, so do not roll a data folder back to 2.1.0 once 2.1.1 has written to it (#453) - A team match cannot be finished while a numbered bout has no result. Record a score, a Tie or a Fusensho for every bout first: "Bout 3 has no result." Kachinuki is not affected (#444)
- Excel exports always put White (Shiro) on the left and Red (Aka) on the right. The mirror option is removed; old files that still carry it load unchanged (#451)
/createrefuses a team size outside 0 to 100 (#451)
HTTP API and integrations
- Score writes carry
changed, the match groups the write changes; leaving it out means every group the payload carries. A write that is held answers200 {"applied": false, "reason": "superseded", "heldGroups": [...]}, and{stale: true}no longer exists (#453) POSTandDELETE .../matches/:mid/daihyosenaccept an optional{"modifiedAt": N}and can answersupersededorclock_skew, like/score(#451)- Both public lineup reads (
GET .../teams/:tid/lineups/:roundandGET .../teams/:tid/match-lineups/:matchId) answer200withsaved: falsefor a lineup that was never saved, instead of 404 (#451) GET /api/competitions/:id/matches/:mid/historylists a match's recorded writes, including the ones that did not apply (#453)- The SSE stream accepts
?lastEventId=when theLast-Event-IDheader is absent, and the server keeps the last 200 events for replay (#451) - New refusals:
409 result_finalized,409 hantei_organiser_only,409 member_already_named,409 team_member_limitand400 duplicate_daihyosenon the public self-run writes;409 downstream_knockout_runningwhen a knockout correction would change a side of a match being fought (#451, #453)
Highlights since v2.1.0
Nothing is dropped, and every write is ordered
- A match write applies only the groups it changes (points, result, overtime, engi flags, representative players, each bout row), each ordered by when the change was made, never by when it arrived. What does not apply is kept in the match's history, shown in every score editor under History (#453)
- Points scored after a withdrawal of that match mean the withdrawal was a mistake: it is cleared and kept in the history. A late point on a finished match applies and the winner is worked out again. A match closed by a kiken, fusenpai or fusensho keeps that result against a court still scoring it, and the notice names the decision (#453)
- A change that would leave a finished knockout match without a winner, or an engi match without a valid flag count, is held, and the operator is told to correct the result with a winner. A pool or league match becomes a draw. For engi, the newest valid count decides whichever write arrives first (#453)
- A device never stamps a write earlier than the match it saw, so a correction made just after a write from a device whose clock runs ahead is applied (#453)
- The offline queue keeps every write, each sent on its own, and nothing is dropped for its age. A write that keeps failing holds back no other (#453)
- The top bar reads "Offline: N result(s) not sent", the sync pill reads "Reconnecting…", and a toast confirms "1 finished result sent." The held count opens a list of everything held on the device, with Discard for a write the server keeps refusing (#453)
- A court console that comes back online or returns from the background refetches its queue (#453)
Withdrawals and decisions
- Remove kiken, fusenpai or fusensho takes a decision recorded by mistake off a match that was fought to a result, in one save: the operator enters the real result and Save correction sends it. The match stays finished, never needs the court, and the barred competitor can fight again. Clear and reopen stays beside it for a match with fighting left (#453)
- Save correction on a match decided by a kiken or fusenpai keeps the recorded decision, its winner and the withdrawn side's eligibility. Clear and reopen is one tap with no reason, and the consequence is stated beside the button (#444)
- A fusenpai against a competitor another match already barred is recorded as their loss on that match, without a second eligibility record. A second kiken is still refused (#447)
- A withdrawn competitor's remaining matches are skipped by Up next, Finish + Start Next, the TV next line, the lobby and on-deck alerts, and offer Record fusensho for (and Reinstate for an injury kiken). Recording a withdrawal changes only that match (#444, #447)
- A team match decided by a kiken, fusenpai or fusensho credits every bout without a result to the other team, one individual victory and two points per bout, and the bouts already fought keep their results (#444)
- Every label, notice and message names the recorded decision ("Record fusensho for Carol", "Remove kiken") (#453)
- A hantei can be corrected from the editor: it asks for the reason first and sends it with the new verdict (#447)
Corrections in mixed and knockout competitions
- A pool correction, reopen or chusen that changes who qualified now warns with the affected knockout matches and offers Apply and reopen. Before, it was a hard 409 (#444)
- A knockout correction is refused with the fix while a later match is being fought (#444, #453)
- A chusen recorded in the wrong order can be changed from the Pools tab (#444)
- A match sent back to the queue keeps its score and shows as not started until it starts again (#447)
- Refusals name the competitor, the match as the operator sees it ("Pool A · Match 1") and what to do (#444)
Scoring on the shiaijo
- A bounced second tap no longer passes the two-tap Finish or End match guard, records a second ippon or awards a second foul. The engi Save result works the same way (#450)
- A per-bout fusensho keeps the other side's points, and undoing it removes only the circles (#450)
- The sync pill reads "Syncing…" from the first tap, and an edit still inside the autosave delay survives closing the editor, Prev and Next, another match being picked or a reload (#450)
- Closing a running match no longer asks "Discard unsaved scoring changes?", since every edit there is autosaved (#444)
- A kachinuki bout in overtime gets Undo encho, a point taken back stays taken back, and an encounter carries no match-level (E): the mark lives on the bout row (#447, #453)
- A point struck right after Start is saved at once (#447)
- The Pools-tab editor stays open while you score (#447)
- The fighter list commits on click and swallows a bounced second tap (#453)
- A pool bout has one number on every surface, its place in the playing order (#453)
- Representative bout: adding or removing it no longer loses the new row, or brings back a removed one, through a pending autosave (#451)
Self-run and public pages
- Self-run participants can add, score and remove the representative bout while the match is running, and name a bout's fighter and a team member. A judges' decision (hantei) stays the organiser's (#451)
- Pages catch up after a network outage: the missed events are replayed and a refresh that failed while offline is retried (#451)
- Refusals read as sentences, and none tells anyone to reload (#451)
Brackets, team members and the Excel export
- The Bracket page uses the whole window, draws straight one-sided lines and shows no BYE cards (#444)
- The Kachinuki Detail sheet is drawn like a team match block, and every kachinuki block has 2 x team size - 1 bout rows in every workbook, the app's blank template included (#451)
- One page rule keeps every Elimination Matches block, the 3rd-place block included, on a single page (#451)
- Export fixes: pool blocks survive a server restart, a team pool keeps its 4th ranking row, the knockout-only template's entrants name their competitors, and an undecided side prints "M n" (#451)
- Replacing the roster keeps the id, team members and lineups of every team that stays (#444)
Documentation
- The docs are captured at v2.1.1 (#457), and the guides are aligned with the FIK rules and the operator rulings (#446)
Dependencies and tooling
- Go: pdfcpu 0.16.0 (#454)
- Docs: pymdown-extensions 12.1, markdown 3.11 (#448, #455)
- CI: CodeQL action 4.38.2 (#449, #456); web-mobile: undici 7.30.0 (#452)
- Contributor tooling: Serena TypeScript project for web-mobile, and the test-gate cadence notes (#443, #445)
Install: docker run -p 8080:8080 -v "$PWD/tournament-data:/tournament-data" ghcr.io/gitrgoliveira/bracket-creator-mobile:latest, or see the install guide for Homebrew, Linux packages, and binaries.
Full Changelog: v2.1.0...v2.1.1