Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
799e509
fix(bc-kfup,bc-kpnl,bc-htcr,bc-sbq): the withdrawal chain, hantei cor…
gitrgoliveira Sep 25, 2026
2b7ba93
docs(bc-sbq,bc-htcr): Send back to queue and hantei correction; reuse…
gitrgoliveira Sep 25, 2026
06afa1c
fix(bc-kfup,bc-kpnl): a chained fusenpai can be corrected and cleared…
gitrgoliveira Sep 25, 2026
438ed3e
feat(bc-kten): kachinuki encho only for taisho against taisho
gitrgoliveira Sep 25, 2026
f208891
fix(bc-kten,bc-kfup,bc-kpnl,bc-sbq): code review fixes
gitrgoliveira Sep 25, 2026
77f8c10
fix(bc-kfup): cap the clear's status hold; pin the bracket re-bar
gitrgoliveira Sep 25, 2026
66048b5
fix(bc-kclr): a mark taken back on a kachinuki bout stays taken back
gitrgoliveira Sep 26, 2026
fb4c7c9
refactor(bc-kclr): drop a guard for an index that is always in range
gitrgoliveira Sep 26, 2026
81c0166
fix(bc-kenu,bc-strt): undo a mistaken encho; save a point struck righ…
gitrgoliveira Sep 26, 2026
b15c84e
fix(bc-sbq): a match sent back to the queue keeps its score
gitrgoliveira Sep 26, 2026
5fb0f71
refactor: simplify the PR's changes (reuse, one owner per rule)
gitrgoliveira Sep 26, 2026
f254ea7
fix(bc-kfup,bc-strt,bc-kten,bc-sbq): code review fixes
gitrgoliveira Sep 26, 2026
c59e095
docs(bc-kfup): reopenTargetStatusTx says it judges the bars the resto…
gitrgoliveira Sep 26, 2026
e468779
docs(bc-kfup): say the operator reinstated, not a doctor
gitrgoliveira Sep 26, 2026
7da2f36
fix(bc-strt): the pools and bracket editors close only on a saved result
gitrgoliveira Sep 26, 2026
946cf3b
fix(bc-plcl): one rule for when a score editor's host closes it
gitrgoliveira Sep 26, 2026
838f263
feat: operator rulings 2026-09-26 and the skipped clean-up items
gitrgoliveira Sep 26, 2026
7af3170
fix: the court moves on past a competitor a withdrawal just barred
gitrgoliveira Sep 26, 2026
0bf012e
docs: put the taisho-only screenshot recipes back as they are on main
gitrgoliveira Sep 26, 2026
525c35c
fix: the Scores tab moves on past a competitor a withdrawal just barred
gitrgoliveira Sep 26, 2026
90da239
fix: a recorded decision closes its form in both score editors
gitrgoliveira Sep 26, 2026
2225748
fix: review fixes for the 2026-09-26 rulings and clean-up
gitrgoliveira Sep 26, 2026
bcee456
refactor: drop a guard for a feed that is always an array
gitrgoliveira Sep 26, 2026
a907a62
fix: a pushed row never goes back in time, and carries the withdrawal…
gitrgoliveira Sep 26, 2026
bf02a03
refactor: drop a guard for a detail that always carries its config
gitrgoliveira Sep 26, 2026
ed8dc74
fix: a rebuilt draw is never hidden, and the Scores tab keeps the new…
gitrgoliveira Sep 26, 2026
8e39fa5
refactor: drop a guard for a tournament update that always carries a …
gitrgoliveira Sep 26, 2026
0516c32
fix: keep a held match only when both copies are running
gitrgoliveira Sep 26, 2026
3d85df0
docs: reopenBracketMatch stamps the server's time; record the accepte…
gitrgoliveira Sep 26, 2026
62e1d2d
docs: state the accepted keep-newer residual exactly
gitrgoliveira Sep 26, 2026
42c9009
fix: the Scores page's automatic next match stays in the competition
gitrgoliveira Sep 26, 2026
79c6449
docs: record the rare re-bar the operator accepted
gitrgoliveira Sep 26, 2026
9d324c4
copy: say what the operator does, not what a doctor allows
gitrgoliveira Sep 26, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 8 additions & 5 deletions CLAUDE.md

Large diffs are not rendered by default.

10 changes: 7 additions & 3 deletions docs/user-guide/court-operators/recording-decisions.md
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,10 @@ A barred competitor's other scheduled matches cannot be started, so the app stee

On the court console queue, the Scores tab, and the score editor, the match instead carries a note explaining why (for example "Kyoto withdrew: record the default win.") and a button naming the opponent, for example **Record default win for Sato**. One tap records the match as a fusensho for the opponent, without touching the barred competitor's eligibility record. For an injury kiken, a **Reinstate** button naming the barred competitor sits alongside it, restoring eligibility so the match can be fought instead of defaulted. Once recorded, the match reads, for example, "Recorded: Default win (fusensho) for Sato. Kyoto had withdrawn.", with a **Clear default win** action if it was recorded by mistake: it reopens the match, back to the queue if the competitor is still barred (record the default win again, or reinstate them first; a match going back to the queue takes no court, so another match running on that court does not stop it), or back to in progress, ready to score, if they have since been reinstated.

Recording a kiken or fusenpai changes only that match. It does not do anything to the withdrawn competitor's other scheduled matches: each one shows its own notice and one-tap **Record default win for `<opponent>`** button, described above, when it comes up in the queue or you open it in the score editor. As with **Finish + Start Next**, the court console and the Scores tab then start the court's next match in the same competition, passing over the withdrawn competitor's own. The app never switches you to another competition or court by itself.

You can also open one of the competitor's other matches in the score editor and record **Fusenpai** for the barred competitor. The match records their default loss, and their eligibility record still names the match where they withdrew, so an injury kiken can still be reinstated. That match then offers **Clear default win**, which works as it does for a fusensho: while the competitor is still withdrawn, the match goes back to the queue. Recording a second **Kiken** for a competitor who already withdrew elsewhere is refused: a competitor withdraws only once.

If both competitors due to meet are already barred, neither can fight. In a pool or league match, record it as drawn with **Record as drawn (neither can fight)**: neither side receives a win or points. A knockout match has no equivalent, since the bracket needs a winner; correct the earlier withdrawal, or the draw, instead.

**Clear withdrawal and reopen** on the original withdrawal (refer to [Correcting a withdrawal recorded by mistake](#correcting-a-withdrawal-recorded-by-mistake)) lists the later matches that were given a default win because of it, each with its pairing, so you know what is affected. Those matches keep their default win; reopen any of them individually with **Clear default win** once the competitor is eligible again.
Expand All @@ -105,16 +109,16 @@ What the reopen keeps depends on the match:

A kachinuki team match that ended with a withdrawal or no-show shows the same **Clear withdrawal and reopen** in place of its **Reopen match** button, because the reopen also makes the withdrawn team eligible again. A kachinuki match that ended any other way keeps **Reopen match**.

Removing a withdrawal makes the withdrawn competitor or team eligible again, whichever kind of withdrawal it was, because a withdrawal entered by mistake never happened. This includes a voluntary kiken, which otherwise cannot be reversed.
Removing a withdrawal makes the withdrawn competitor or team eligible again, whichever kind of withdrawal it was, because a withdrawal entered by mistake never happened. This includes a voluntary kiken, which otherwise cannot be reversed. The one exception is a competitor who also has a **Fusenpai** recorded on another match: they did not appear there either, so they stay withdrawn, now because of that match, and the match you cleared goes back to the queue instead of in progress. The editor says so beside the button, before you tap it.

**Save correction** on its own never removes a withdrawal. It saves the points or bouts you enter and keeps the withdrawal, its winner and the competitor's eligibility as they were recorded. In an individual match the winner's default-win circles are shown but cannot be changed. Only the withdrawn competitor's points can be corrected, and they are limited to one point, because a competitor with two points has already won the bout.

A fix can change who goes through to later matches, so the app warns you first and you can cancel or go ahead:

- Recording the withdrawal for the other side warns you when either side has already started a later match.
- Clearing a withdrawal in a knockout match warns you when the next match has already been played. If you go ahead, that next match is reopened so it can be fought and scored again, and the editor names it once the reopen is done. A round after it that nobody has played yet stops showing its winner. If a withdrawal decided that next match, its withdrawn competitor is eligible again too.
- Clearing a withdrawal in a knockout match warns you when the next match has already been played. If you go ahead, that next match is reopened with its winner cleared and its points kept, so check them and take back any that no longer apply, and the editor names it once the reopen is done. A round after it that nobody has played yet stops showing its winner. If a withdrawal decided that next match, its withdrawn competitor is eligible again too.

In a knockout, a next match that is still in progress must be finished or sent back to the queue before a withdrawal can be cleared. If another match is running on this match's court, the app names it and offers to send it back to the queue, which clears any score entered for it.
In a knockout, a next match that is still in progress must be finished or sent back to the queue before a withdrawal can be cleared. If another match is running on this match's court, the app names it and offers to send it back to the queue, which keeps any score entered for it.

In a pool of a competition that ends in a knockout, clearing a withdrawal is not refused because of the knockout. Clearing it moves nobody in the bracket: the pool simply has an unfinished match again. When you finish that match, the app checks whether the result changes who qualifies from the pool. The same result is saved as usual. A result that moves someone who has already fought in the knockout is handled like any pool correction: you are shown who moves and which knockout matches are affected before anything is saved. Refer to [Correct a pool result after the knockout has started](scoring-a-match.md#correct-a-pool-result-after-the-knockout-has-started).

Expand Down
16 changes: 11 additions & 5 deletions docs/user-guide/court-operators/scoring-a-match.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,13 @@ To take back a strike, tap the scored mark itself in the centre of the board. Th

## Send a match back to the queue

If you start the wrong bout, use **Send back to queue** on the running match. The action clears any partial score, removes the match from the active view, and returns it to the Upcoming list so the correct match can start.
If you start the wrong bout, use **Send back to queue** on the running match. It is always offered, whatever has been scored. The match leaves the active view and returns to the Upcoming list so the correct match can start, and it keeps any score already entered: its points, fouls, overtime and, for a team match, its bouts. When you start it again, the score board opens where it left off. If a mark was entered by mistake, tap it on the board to take it back.

While a match waits in the queue, every screen shows it as not started, the court display and the public viewer included, even when it holds points. They appear again when the match is started.

Starting a different match from the Upcoming list works the same way: the match in progress goes back to the queue with its score, so if you switched by mistake, tap **Start match** on it to carry on.

In an engi match the flags are saved as you enter them once the match has started, so they are kept too.

!!! note
Send back to queue only works on a running, unfinished match. A completed, scored match is not affected. To fix a result that has already been recorded, use **Correct** on the match in the Completed list (refer to [Correct a completed result](#correct-a-completed-result)).
Expand All @@ -30,20 +36,20 @@ Once a match is scored it moves to the **Completed** list on the court console,

What Correct offers depends on the format:

- For most matches, the editor reopens with the recorded scores ready to edit. Adjust the ippons, fouls, or winner, then use **Save correction**. A short reason is required so the change stays traceable.
- For most matches, the editor reopens with the recorded scores ready to edit. Adjust the ippons, fouls, or winner, then use **Save correction**. A short reason is required so the change stays traceable. A judges' decision (hantei) given to the wrong competitor is corrected by tapping the other competitor's hantei button; the same reason is asked for first, and the new decision replaces the old one.
- For a kachinuki team encounter, the editor shows the recorded bouts with a **Reopen match** button. An encounter that ended with a withdrawal or a no-show shows **Clear withdrawal and reopen** instead; refer to [Correcting a withdrawal recorded by mistake](recording-decisions.md#correcting-a-withdrawal-recorded-by-mistake). Reopen is immediate: one tap returns the encounter to running with its bout log intact, so you can carry on or fix a bout. No reason is needed, and none is asked for when you end the match again, whether you finish on a scored bout or record a withdrawal or a no-show. Correcting a mistake never costs you more than a tap.

Reopening puts the encounter back into play, and a court can only run one match at a time. If another match is already running on that court, the editor names it and offers two ways forward. Leave it running, or clear its score, send it back to the queue, and reopen in a single step. Sending a match back to the queue clears any score already entered for it, so if that match is part way through, finish it first instead.
Reopening puts the encounter back into play, and a court can only run one match at a time. If another match is already running on that court, the editor names it and offers two ways forward. Leave it running, or send it back to the queue and reopen in a single step with **Queue it and reopen**. The match sent back keeps any score already entered for it and carries on from there when it is started again.

If the correction changes who won a knockout match, the later rounds update to follow the new winner. If the next match, or the bronze (3rd-place) match, has already been fought and scored, the app refuses the correction and names the match that is blocking it by its number and round, for example Match 3 (Final): the round is the heading of the bracket column you find it under. You can confirm anyway. Confirming applies the correction and reopens the named match where it is: its recorded result, including its bouts, is cleared, and the new pairing must be fought and scored again. The match was already played, so it stays where it is and nothing in the queue changes. A semifinal is the one case that names two matches at once, because it feeds both the final and the bronze match; confirming then reopens both. A round further on that nobody has played yet stops showing the winner of the reopened match. A round further on that has already been played is not changed yet: when you enter the result of the match you have just re-fought, the app asks you the same question again for that round, so you work forward one round at a time. A later slot that was only filled by a bye, and never fought, does not block a correction; it simply updates to follow the new winner. A match that is under way is not blocked or cleared either: it keeps what has been scored so far, now shown under the new competitor's name, and whoever is at the shiaijo finishes it as normal. When you are done, use **Back to court** to return to the live match.
If the correction changes who won a knockout match, the later rounds update to follow the new winner. If the next match, or the bronze (3rd-place) match, has already been fought and scored, the app refuses the correction and names the match that is blocking it by its number and round, for example Match 3 (Final): the round is the heading of the bracket column you find it under. You can confirm anyway. Confirming applies the correction and reopens the named match where it is, with the new competitor in it: its winner is cleared, and its points and bouts are kept, so check them and take back any that no longer apply before you finish it again. The match was already played, so it stays where it is and nothing in the queue changes. A semifinal is the one case that names two matches at once, because it feeds both the final and the bronze match; confirming then reopens both. A round further on that nobody has played yet stops showing the winner of the reopened match. A round further on that has already been played is not changed yet: when you finish the match you have just reopened, the app asks you the same question again for that round, so you work forward one round at a time. A later slot that was only filled by a bye, and never fought, does not block a correction; it simply updates to follow the new winner. A match that is under way is not blocked or cleared either: it keeps what has been scored so far, now shown under the new competitor's name, and whoever is at the shiaijo finishes it as normal. The same goes for a later match that was sent back to the queue with points already scored: it takes the new competitor's name and keeps its points, so check them when you start it and take back any that no longer apply. When you are done, use **Back to court** to return to the live match.

### Correct a pool result after the knockout has started

In a competition that has pools and then a knockout, a pool result decides who goes through to the knockout. You can still correct it after its qualifiers have been placed in the bracket, even after they have fought there.

- If the correction does not change who holds any qualifying place in that pool, it is saved as usual.
- If it changes a qualifier whose knockout match has not been played yet, it is saved and the new qualifier takes the old one's place in the bracket.
- If it changes a qualifier who has already fought a knockout match, the app shows you who moves and which knockout match was fought before anything is saved, for example: "Changing this result moves Pool A's 1st place from Aoki to Sato, who takes Aoki's place in the knockout. Match 9 (Quarterfinals) was already fought with Aoki: it will be reopened, its result cleared, and it must be fought again." A knockout match is always named with its round, so it cannot be mistaken for the pool match you are correcting, which has its own Match 1, Match 2 and so on. Cancel to leave everything as it was, or choose **Apply and reopen**. The correction is then saved, the new qualifier is placed in that match, and the match is reopened where it is, to be fought and scored again. If a withdrawal decided that match, the competitor it barred can compete again. A later round that nobody has played yet stops showing the old winner. A later round that has already been played is not changed now: when you enter the result of the re-fought match, the app asks you about that round in the same way.
- If it changes a qualifier who has already fought a knockout match, the app shows you who moves and which knockout match was fought before anything is saved, for example: "Changing this result moves Pool A's 1st place from Aoki to Sato, who takes Aoki's place in the knockout. Match 9 (Quarterfinals) was already fought with Aoki: it will be reopened with its winner cleared and its points kept, and it must be finished again." A knockout match is always named with its round, so it cannot be mistaken for the pool match you are correcting, which has its own Match 1, Match 2 and so on. Cancel to leave everything as it was, or choose **Apply and reopen**. The correction is then saved, the new qualifier is placed in that match, and the match is reopened where it is with its points kept: check them, take back any that no longer apply, and finish it again. If a withdrawal decided that match, the competitor it barred can compete again. A later round that nobody has played yet stops showing the old winner. A later round that has already been played is not changed now: when you finish the reopened match, the app asks you about that round in the same way.
- If a knockout match that the change reaches is being fought right now, the correction is refused: "Match 9 (Quarterfinals) is being fought now. Finish it or send it back to the queue, then save again."
- If the correction leaves a qualifying place tied, that place goes back to waiting in the bracket until the tie-break is fought, and the tie-break winner is placed there. A knockout match on that place that was already fought is reopened, and it is fought again once the tie-break decides who holds the place.

Expand Down
2 changes: 1 addition & 1 deletion docs/user-guide/organisers/team-tournaments.md
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ If your correction changes who won that bout, the bouts after it were fought on
When the last bout is tied, the editor offers every legitimate way forward and you choose, according to the [kachinuki mode](#kachinuki-modes) in force; the app never decides it from the stage:

- **Record bout** retires both fighters and brings the next pair up.
- **Encho** keeps the same pair fighting on that bout until one of them takes a point. Use it whenever your rules say this pairing must have a result, in any stage.
- **Encho** keeps the same pair fighting on that bout until one of them takes a point. It is offered on any tied bout: whether a pair fights on is your call, and the app records it. Use it whenever your rules say the pairing must have a result, in any stage. Tapped Encho by mistake, or twice? **Undo encho**, beside it, takes back one overtime period per tap while nothing has been scored in overtime; taking back the last one returns the bout to its tie.
- **End match** finishes the encounter on the tie. In pools and leagues this records a drawn encounter. In a knockout the bracket needs a winner, so End match is held back while the last bout is tied; continue with Record bout or Encho instead.

![The kachinuki score editor on a tied knockout bout, showing the notice that a knockout cannot end in a draw with an Encho button, and the End match button held back.](../../screenshots/kachinuki-knockout-tie-encho.png)
Expand Down
Binary file modified docs/videos/kachinuki-demo.webm
Binary file not shown.
4 changes: 2 additions & 2 deletions internal/domain/glossary.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ var Glossary = map[string]Term{
ID: "kiken",
Kanji: "棄権",
Short: "Withdrawal",
Tooltip: "The competitor withdraws. Two sub-types: Voluntary (FIK Art. 31), permanent disqualification from the competition; Injury (FIK Art. 30), can be reinstated if a doctor and shinpan permit it. The opponent wins 2–0 by default.",
Tooltip: "The competitor withdraws. Two sub-types: Voluntary (FIK Art. 31), permanent disqualification from the competition; Injury (FIK Art. 30), can be reinstated if they are fit to fight again. The opponent wins 2–0 by default.",
},
"kiken-voluntary": {
ID: "kiken-voluntary",
Expand All @@ -76,7 +76,7 @@ var Glossary = map[string]Term{
ID: "kiken-injury",
Kanji: "棄権",
Short: "Injury withdrawal",
Tooltip: "FIK Article 30, the competitor withdraws due to injury or illness. They forfeit this match (opponent wins 2–0) and are blocked from later matches, but can be reinstated if a doctor and shinpan-in approve.",
Tooltip: "FIK Article 30, the competitor withdraws due to injury or illness. They forfeit this match (opponent wins 2–0) and are blocked from later matches, but can be reinstated if they are fit to fight again.",
},
"fusenpai": {
ID: "fusenpai",
Expand Down
Loading
Loading