Skip to content

fix(bc-dsid, bc-otpl, bc-htsd, bc-dlck, bc-kosc, bc-crpn): operator review fixes from PR #442 - #462

Merged
gitrgoliveira merged 16 commits into
mainfrom
worktree-bridge-cse_012pcFHjqJcocNMkFKrjnixp
Oct 8, 2026
Merged

gitrgoliveira merged 16 commits into
mainfrom
worktree-bridge-cse_012pcFHjqJcocNMkFKrjnixp

Conversation

@gitrgoliveira

@gitrgoliveira gitrgoliveira commented Oct 7, 2026 •

Copy link
Copy Markdown
Owner

Summary

Six findings from the PR #442 operator review, fixed in one PR as the operator asked. Each fix follows the bead's plan, re-checked against current main, with the operator decisions of 2026-10-07.

  • bc-dsid: the withdrawal and no-show prompt no longer picks a side for you. Before, it started on Shiro and recorded on a bare Record, so a hasty tap withdrew the wrong competitor. Now no side is picked, and Record stays off until you pick one. The button then names the side ("Record: AKA withdrew", "Record: SHIRO did not show up"), and a line says what recording does: " cannot fight again in this competition. wins this match." The side options are pills at least 44px tall under a coarse pointer.
  • bc-otpl: tapping the word "Overtime" opens the encho counter. Before, it opened the glossary, because a glossary term (itself a control that stops the tap) sat inside the button. The pill and the "Encho started (overtime)" label are now plain text, with the "?" chip beside them. The rule (a term is never inside a button or label) is stated once above TermAS, and a render test with the real Term enforces it.
  • bc-htsd: in the individual editor, the hantei winner buttons only pick the side. They read SHIRO (White) wins: and AKA (Red) wins: , so an operator who does not know the words can tell them apart (the team editor's representative-bout buttons name the colour too). Finish (two taps) or Enter records it, the same pick-then-Finish flow as the team editor's representative-bout hantei (operator decision: option A). A single tap no longer commits the opposite verdict and advances the bracket. A verdict recorded on another device is adopted as the pick.
  • bc-dlck: the "A subsequent match ... Proceed anyway?" confirm is gone. That confirm asked before recording a withdrawal for the other side. Under the 2026-09-27 ruling a withdrawal correction changes only that match, and the matches it can reach in a knockout already have their own guards, so the confirm guarded nothing. It is removed along with its engine lock (ErrDecisionLocked, hasDownstreamMatchStarted), the force flag on the decision write, and the client's retry. Knockout behaviour is unchanged (operator decision: R1):
    • a running later match still refuses the correction (bc-rfsw);
    • a played later match is still named and confirmed before it is reopened.
  • bc-kosc: in a pools + knockout competition, each court's knockout is now timed after that court's last pool bout. Before, it was timed at the day's start, so Finish + Start Next ran a resolved quarter-final in the middle of the remaining pool bouts, and the schedule showed impossible times. Knockout-only competitions keep the day start, and no stored times are rewritten. A court that holds no pool bout waits for the latest pool end. A tie-break or representative bout added after the draw, or a pool bout moved onto another court, moves that court's knockout past it. A time set by hand moves nothing: it is the operator ordering the court, and the queue's up/down is two such edits.
  • bc-crpn: the court console never holds a running match and an open correction at the same time (ruling 2026-09-27).
    • Correct is refused while a bout is live on the court.
    • Start match is refused while a correction is open.
    • Each refusal shows a notice at the control you tapped and a toast naming the other match.
    • A landed Save correction ends the correction.
    • A match started from another screen leaves the correction open, and is listed in the "Another bout is running" alert (operator decision 2026-10-07).

Why

Each bead's DESIGN section holds the root cause and the plan. All six plans were re-verified against main 0d91b765 before any code was written. The corrections found were:

  • line references had drifted;
  • bc-htcr carries its pending action in correctionPrompt state, not a ref;
  • the queue already reports decision_locked on replay;
  • bc-rfsw's running-match refusal must stay;
  • the consequence wording the operator originally approved used a phrase banned on 2026-10-04 and was re-decided.

Files changed

File What
CLAUDE.md Drop the removed T103 lock and hasDownstreamMatchStarted; the hantei pick replaces submitHantei in the change-groups and result-slot notes; the leave rule names the hantei side pick
docs/screenshots/mobile-encho-overtime.png Recaptured: plain "Encho started (overtime)" label with the glossary chip beside it (bc-otpl)
docs/screenshots/mobile-pool-standings.png Recaptured: the fixture scores the Scores list in order, and knockout matches no longer interleave with pool bouts (bc-kosc), so each pool bout takes a different scripted result
docs/screenshots/mobile-score-editor.png Recaptured: plain "Overtime" pill with the glossary chip beside it (bc-otpl)
docs/user-guide/court-operators/recording-decisions.md Pick the side before Record (bc-dsid); how to record a hantei (bc-htsd); a withdrawal correction changes no other match, and the warning bullet is removed (bc-dlck)
docs/user-guide/court-operators/scoring-a-match.md Correct refused while a match runs, Start refused while a correction is open (the refusal names Save correction and Back to court), Save/Back to court, external start (bc-crpn); correcting a hantei is pick then Save correction (bc-htsd)
internal/engine/bc_idfx_test.go Drop the removed force argument (bc-dlck)
internal/engine/bracket.go buildBracketFromDraw takes the pool matches; the preview bracket times each court's knockout after its pool phase (bc-kosc); generatePoolPreviewBracket takes the pool matches instead of reading them back
internal/engine/competition.go The draw passes the matches generatePools saved to the preview bracket (bc-kosc)
internal/engine/daihyosen.go New savePoolMatchesAndKnockoutTimes: a representative bout added after the draw moves the knockout past it (bc-kosc); the helper moved to scheduler_slots.go
internal/engine/decision_no_cascade_test.go New: moving a withdrawal reopens nothing it closed; a chained fusenpai keeps its bar (bc-dlck)
internal/engine/decision_stamp_test.go Drop the removed force argument (bc-dlck)
internal/engine/default_win_bout_credit_test.go Drop the removed force argument (bc-dlck)
internal/engine/default_win_bout_padding_unreadable_test.go Drop the removed force argument (bc-dlck)
internal/engine/downstream_correction_guard_test.go Delete the T103-force tests; keep the bc-kcdg decouple test, renamed (bc-dlck)
internal/engine/downstream_running_refusal_test.go The t103Force loop collapses to one case; the refusal stays (bc-dlck)
internal/engine/eligibility.go Remove force from RecordDecision* and delete hasDownstreamMatchStarted (bc-dlck)
internal/engine/eligibility_test.go KikenUndo: the lock subtest is inverted to "applies, changes no other match"; delete the force and hasDownstreamMatchStarted tests (bc-dlck)
internal/engine/errors.go Delete ErrDecisionLocked (bc-dlck)
internal/engine/kachinuki_reopen_withdrawal_test.go Drop the removed force argument (bc-dlck)
internal/engine/kachinuki_test.go Drop force (bc-dlck); buildBracketFromDraw arity (bc-kosc)
internal/engine/knockout_test.go buildBracketFromDraw arity (bc-kosc)
internal/engine/legacy_template_v1_test.go buildBracketFromDraw arity (bc-kosc)
internal/engine/load_error_propagation_test.go Drop the hasDownstreamMatchStarted row (bc-dlck)
internal/engine/match_merge_phase3_test.go A different decision now applies instead of hitting the lock (bc-dlck)
internal/engine/match_merge_review_test.go Drop the removed force argument (bc-dlck)
internal/engine/match_merge_test.go Lock references reworded; drop force (bc-dlck)
internal/engine/mixed_schedule_test.go New: through the real draw, each court's knockout is timed after its pool bouts (one and two courts); knockout-only starts at the day start (bc-kosc); a tie-break added after the draw moves the knockout past it; TestPushKnockoutPastPools (bc-kosc); a court move moves the knockout; a hand-set time and the queue's up on a knockout match move nothing; an unreadable tournament keeps the court move; the push leaves an operator's later time inside lunch and an unparseable time alone
internal/engine/pool_requalify_test.go Drop force (bc-dlck); buildBracketFromDraw arity (bc-kosc)
internal/engine/pools.go generatePools returns the pool matches it saved (bc-kosc)
internal/engine/pools_extra_qualifiers_order_test.go generatePools returns its matches (bc-kosc)
internal/engine/quarantine.go The rebuild reads the pool matches and passes them to the preview bracket (bc-kosc)
internal/engine/reopen_bye_unwind_test.go Drop the removed force argument (bc-dlck)
internal/engine/reopen_fusensho_status_test.go Drop the removed force argument (bc-dlck)
internal/engine/reopen_scheduled_court_test.go Drop the removed force argument (bc-dlck)
internal/engine/reopen_withdrawal_test.go Drop the removed force argument (bc-dlck)
internal/engine/restore_touches_no_eligibility_test.go Drop the removed force argument (bc-dlck)
internal/engine/schedule.go Rewrite the phase-sequencing comment: the post-draw assigners now sequence pools then knockout per court (bc-kosc)
internal/engine/scheduler_slots.go New poolPhaseEndByCourt; assignBracketMatchSlots takes a per-court start (bc-kosc); a court with no pool bout waits for the latest pool end; new pushKnockoutPastPools (bc-kosc); moveKnockoutPastPools and savePoolMatchesAndKnockoutTimes live here; the push moves past lunch only a match it moves and skips a row whose time does not parse
internal/engine/scheduler_slots_test.go Pass nil to existing calls; new TestAssignBracketSlots_StartAfterPoolPhase and TestPoolPhaseEndByCourt (bc-kosc); a court with no pool bout waits for the latest pool end
internal/engine/scoring.go Comments only: no T103 lock (bc-dlck); UpdateMatchCourt moves the new court's knockout past a pool bout moved onto it; UpdateMatchTime moves nothing (bc-kosc); a tournament that cannot be read skips the knockout push (logged) rather than refusing the court move
internal/engine/scoring_test.go Drop the removed force argument (bc-dlck)
internal/engine/scoring_tx.go Remove the T103 gate and hadPriorLoser; refuseDecisionReachingRunningMatch stays (bc-dlck)
internal/engine/scoring_tx_internal_test.go Delete the hasDownstreamMatchStarted tests (bc-dlck)
internal/engine/scoring_tx_test.go New WithdrawalCorrectionChangesNoOtherMatch; lock subtest rewritten (bc-dlck); buildBracketFromDraw arity (bc-kosc)
internal/engine/tiebreaker.go A tie-break added after the draw moves the knockout past it (bc-kosc)
internal/engine/winnerid_invariant_test.go Drop the removed force argument (bc-dlck)
internal/engine/withdrawal_cleared_by_correction_test.go Drop the removed force argument (bc-dlck)
internal/engine/withdrawal_removed_restores_test.go Drop the removed force argument (bc-dlck)
internal/engine/withdrawal_ruling_kept_test.go Drop the removed force argument (bc-dlck)
internal/mobileapp/decision_no_confirm_test.go New: a re-recorded withdrawal returns 200 with no confirm; an old body carrying force:true still binds and applies (bc-dlck)
internal/mobileapp/deps.go Three ScoringEngine methods lose force (bc-dlck)
internal/mobileapp/deps_test.go Fake engine signatures follow (bc-dlck)
internal/mobileapp/downstream_running_handler_test.go Drop the decision_locked ordering (bc-dlck)
internal/mobileapp/handlers_decision.go Remove DecisionRequest.Force and the decision_locked 409 (bc-dlck)
internal/mobileapp/handlers_match.go A court move also announces a schedule change (bc-kosc)
internal/mobileapp/ineligible_sides_annotation_test.go Drop the removed force argument (bc-dlck)
internal/mobileapp/reopen_downstream_labels_test.go Drop the removed force argument (bc-dlck)
scripts/screenshots/recipes/editors.mjs Comment: the overtime label is no longer a glossary term (bc-otpl)
scripts/screenshots/recipes/public.mjs Hantei drive: arm, pick, Finish, tap again (bc-htsd); overtime comment (bc-otpl)
specs/openapi.yaml Drop the decision_locked ordering note (bc-dlck)
web-mobile/css/styles.css Decision prompt side pills with a keyboard focus ring (bc-dsid); a gap beside the overtime pill (bc-otpl)
web-mobile/js/__tests__/admin_scoring_modal.test.jsx No force emitted and no retry (bc-dlck); the submit flows move to a real-React render file and the default-side pin becomes a no-side refusal (bc-dsid)
web-mobile/js/__tests__/api_client_downstream_knockout.test.jsx The "unrelated 409" example uses a code the server still sends (bc-dlck)
web-mobile/js/__tests__/pool_ids.test.jsx scoreRowMatchName cases (bc-crpn)
web-mobile/js/__tests__/render/admin_scoring_modal.render.test.jsx Comment (bc-dlck)
web-mobile/js/__tests__/render/admin_shiaijo.render.test.jsx Correct and Start refusals, Save ends the correction, an external start keeps it, a Save answered after another correction opened leaves that one open (bc-crpn)
web-mobile/js/__tests__/render/correction_save_is_not_chained.render.test.jsx New: a correction's Save calls onSubmit, never onSubmitAndNext, in the individual and team editors (bc-crpn)
web-mobile/js/__tests__/render/decision_prompt_side.render.test.jsx New: no default side, Record disabled until picked, names the side, consequence line, submit flows (bc-dsid)
web-mobile/js/__tests__/render/hantei_single_tap.render.test.jsx New: a pick commits nothing; Finish tapped twice commits the pick; re-pick; adopt; autosave never carries the verdict; Enter (bc-htsd); leaving with a side picked asks first; an untied recorded hantei cannot be saved and keeps its Cancel; the buttons name colour and competitor; the row says why Finish is off
web-mobile/js/__tests__/render/individual_editor_hantei_correction.render.test.jsx Pick, Save correction, reason prompt (bc-htsd)
web-mobile/js/__tests__/render/individual_editor_live_hantei.render.test.jsx An adopted verdict commits that side on Finish (bc-htsd)
web-mobile/js/__tests__/render/kachinuki_reopen.render.test.jsx Record disabled until a side is picked, then found by its new name (bc-dsid)
web-mobile/js/__tests__/render/remove_withdrawal_correction.render.test.jsx Hantei through pick and Save correction (bc-htsd)
web-mobile/js/__tests__/render/term_not_inside_control.render.test.jsx New, real Term: tapping the word "Overtime" opens the counter; no term inside a button or label in EnchoControl or DecisionPrompt (bc-otpl)
web-mobile/js/__tests__/sync_queue.test.jsx Drop the decision_locked replay case (bc-dlck)
web-mobile/js/__tests__/write_result_court_console_refusals.test.jsx New: the two court-console refusal sentences (bc-crpn)
web-mobile/js/admin_scoring_individual.jsx Hantei pick plus Finish commit, submitHantei removed (bc-htsd); defaultSide (bc-dsid) and entityLabel (bc-dlck) props removed; leaving a running match with a hantei side picked asks first; Finish needs the tied scoreline the hantei row shows; the buttons name colour and competitor through sideWithColour; the row stays while armed and says why Finish is off
web-mobile/js/admin_scoring_shared.jsx DecisionPrompt rebuilt plus withdrawalConsequence (bc-dsid); EnchoControl plain text and the term rule (bc-otpl); T103 retry removed (bc-dlck); later-matches list named through scoreRowMatchName (bc-crpn); side labels through sideWithColour
web-mobile/js/admin_scoring_team.jsx defaultSide (bc-dsid) and entityLabel (bc-dlck) removed; daihyosen comment points at the term rule (bc-otpl); hantei buttons and summary band labels through sideWithColour (bc-htsd)
web-mobile/js/admin_shiaijo.jsx liveBout, isStartedSnapshot, Correct and Start gates, derived refusal notices, Save/onClose end the correction, the also-running alert during a correction (bc-crpn); ending a correction asks writeKeepsEditorOpen, and ends only the correction the write was for (endCorrectionOf)
web-mobile/js/api_client.jsx Comments only: no decision_locked force retry (bc-dlck)
web-mobile/js/pool_ids.jsx New scoreRowMatchName (bc-crpn); the missing-side word comes from sideWord
web-mobile/js/side_cell.jsx New sideWithColour: "SHIRO (White)" / "AKA (Red)" for a control that picks a side (bc-htsd)
web-mobile/js/write_result.jsx New startWhileCorrectingMessage (names Save correction and Back to court) and correctWhileRunningMessage; comment (bc-dlck)

Screenshots

Taken in Chromium at 1180x820 with a coarse pointer (CDP touch emulation, (pointer: coarse) asserted true).

bc-dsid: Kiken - Voluntary after picking Aka. Nothing was picked before this tap. The button names the side and the consequence line shows.
Kiken prompt with Aka picked

bc-htsd: hantei armed, Shiro (White) picked. Each button names its colour and competitor. Nothing has been recorded yet; Finish commits it. Before a side is picked, the row says "Pick the hantei winner, then finish."
Hantei armed with SHIRO (White) wins picked

bc-crpn: Correct tapped while League table · Match 2 runs. A notice appears under Correct, and the same text as a toast. (After the simplify pass, this sentence is built on the court-busy refusal, so it now ends "...back to the queue first. Then correct this match." The screenshot shows the earlier single sentence.)
Correct refused while a match runs

bc-crpn and bc-otpl: Start match tapped while a correction is open. The Up next card shows a notice. The overtime pill reads plain "Overtime" with "?" beside it.
Start refused while a correction is open

bc-dlck: the kiken re-recorded on the other side. No confirm dialog appeared. The running match is unchanged.
Kiken re-recorded on the other side, no confirm

bc-kosc: Shiaijo D schedule. The semifinals are at 10:00 and 10:05, after the last pool bout at 09:55.
Court D schedule with the knockout after the pools

bc-kosc: a tie-break added after the draw. Pool A ended in a three-way draw, recorded from the court console; its tie-break bouts were added at 09:30, 09:35 and 09:40. The knockout moved to 09:45, 09:50 and 09:55.
Bracket with the semifinals after the tie-break

bc-htsd: leaving with a hantei side picked. On a running final, Decide by hantei, AKA wins, then Close asks before dropping the pick. Cancel kept the editor open with AKA still picked.
Discard prompt after picking a hantei side

bc-kosc: a pool bout moved onto another court. Pool B's last bout, hand-set to 09:40 on Shiaijo A (which moved nothing), was moved to Shiaijo B with the court picker. Shiaijo B's knockout moved to 09:45, 09:50 and 09:55; Shiaijo A's kept its times.
Bracket after the court move

Test plan

  • make go/test passes (lint + security scan + tests). Exit 0, run on the commit before the screenshot and CLAUDE.md-only commits. Unit JS: 333 files / 6489 tests. Coverage: engine 90.9%, mobileapp 90.1%. Run again on 1972b66f: exit 0, engine 90.9%, mobileapp 90.1%; render suite 1657 tests and make js/check-imports OK on 5232a323 (no JS since). Each new test fails with only its fix reverted.
  • New/updated unit tests cover the change. The full render suite passes: 139 files / 1654 tests. make js/check-imports passes. Each new test was shown to fail with only its fix reverted, except these:
    • the bc-htsd adopt and Enter tests, which also hold on the old code;
    • the tests of new exports.
  • Manual browser verification at 1180x820 with a coarse pointer, all six checks passing. The fixtures were created through the API; every assertion was driven and read in the UI.
    • bc-dsid: individual kiken, fusenpai and team withdrawal prompts. Nothing was preselected, Record was disabled, the options measured 44px, and the recorded side was the one picked.
    • bc-otpl: a tap on the word "Overtime" opened the counter; the "?" chip opened the glossary; a tap on the label toggled the box.
    • bc-htsd: a tied knockout semifinal. A pick recorded nothing, re-picking moved the highlight, Finish then a second tap recorded it, and the Completed row read "M Ht vs M". The public viewer was not opened; middle_closed_set pins the centre. The winner buttons read "SHIRO (White) wins: Kb4" / "AKA (Red) wins: Kb3", and the row says to pick a winner until one is picked; checked at 1180×820 and in iPad portrait (820×1180), where long names wrap inside the row with no sideways scroll.
    • bc-crpn: both refusals, the notice clearing after Send back to queue, and an external start from a second tab keeping the correction. "Back to court, then Start works" is covered by render test (d), not repeated in the browser.
    • bc-dlck: a kiken re-recorded on the other side with no dialog.
    • bc-kosc: knockout after pools on one court; knockout-only starts at the start time.
    • Code-review fixes (cb1a8345, 5232a323): a tie-break added from the court console moved the knockout past it (bracket tab); a hantei side picked on a running match asks before Close, and Cancel keeps the pick. 0 console warnings or errors. 1972b66f: a pool bout moved to Shiaijo B with the court picker moved B's knockout to 09:45 onwards, A's unchanged; a hand-set time moved nothing; 0 console warnings or errors.
  • Screenshots added above.
  • Docs updated under docs/ (make docs/build passes; check_links.py and check_prose.py OK).
  • Docs screenshots recaptured (make docs/media SINCE=main): 3 changed, reviewed and copied in. mobile-pool-standings was checked against a capture from a main-equivalent tree, where it is unchanged; the difference comes from bc-kosc's ordering, as described in the Files table. Videos were not re-copied because none of these changes appear in them.
  • No new console errors or warnings (0 in the browser run).

For PR #442 (the e2e harness), when it rebases onto this

  • Pass a side to every recordDecision fixture call: Record is disabled with no side picked (bc-dsid).
  • Remove the J2/J4 decision-locked dialog steps and assert instead that the correction applies with no dialog (bc-dlck).
  • Drive hantei as arm, pick, Finish, wait out the bounce window, tap again (bc-htsd).
  • Rewrite the bc-crpn fixme to the refusal ruling. Labels have the shape "League table · Match 2 · Pa4 vs Pa1", and the court-busy panel steps move to the Scores tab.
  • Turn on the bc-otpl and bc-kosc fixmes.

Closes bc-dsid
Closes bc-otpl
Closes bc-htsd
Closes bc-dlck
Closes bc-kosc
Closes bc-crpn

🤖 Generated with Claude Code

gitrgoliveira and others added 9 commits October 7, 2026 18:38
…ection

Recording a withdrawal on the other side after a later match had started
showed a generic "Proceed anyway?" confirm that named neither the match
nor what confirming did. Under the 2026-09-27 ruling a withdrawal
correction changes only that match, and the matches it can reach in a
knockout already carry their own refusal or confirm, so the confirm
guarded nothing. It is removed with its engine lock (ErrDecisionLocked,
hasDownstreamMatchStarted), the force flag on the decision write, and
the client's retry. Knockout behaviour is unchanged (operator decision
2026-10-07): a running later match is still refused, a played one is
still named and confirmed before it is reopened.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…th no default side

bc-otpl: tapping the word "Overtime" on the overtime pill opened the
glossary instead of the encho counter, because a glossary term (itself a
control that stops the tap) sat inside the button. The pill and the
"Encho started" label now hold plain text with the glossary chip beside
them, and the rule (a term is never inside a button or label) is stated
once above TermAS.

bc-dsid: the withdrawal and no-show prompt preselected Shiro and
recorded on a bare Record, so a hasty tap withdrew the wrong competitor.
No side is preselected now; Record stays off until a side is picked and
then names it ("Record: AKA withdrew"), and a line says what recording
does: "<name> cannot fight again in this competition. <other> wins this
match." (operator decision 2026-10-07). The side options are 44px pills
under a coarse pointer.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
In a pools + knockout competition every knockout match took the day's
start time, so Finish + Start Next ran a resolved knockout match in the
middle of the remaining pool bouts and the printed schedule showed
impossible times. The preview bracket now reads the stored pool times
(poolPhaseEndByCourt) and starts each court's knockout after that
court's last pool bout, as the estimator already does. A knockout-only
competition keeps the day start. No stored times are rewritten.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
On the court console, Correct opened a correction whatever was running,
and Start match started a match whatever correction was open, so the
running match vanished from the page and a later Start could send it
back to the queue without a word. Per the 2026-09-27 ruling, Correct is
now refused while a bout is live on the court and Start is refused while
a correction is open; each refusal shows a notice at the tapped control
and a toast naming the other match. A landed Save correction ends the
correction. A match started on the court from another screen leaves the
correction open and is listed in the "Another bout is running" alert
(operator decision 2026-10-07).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Once hantei was armed in the individual score editor, SHIRO wins and AKA
wins sat 6px apart and each committed the verdict on one tap, advancing
the bracket and starting the next match, so a neighbour tap recorded the
opposite winner. Per the operator decision of 2026-10-07 the buttons now
only pick a side, as the team editor's representative-bout hantei
already does, and Finish (two taps) or Enter commits the picked side. A
verdict recorded on another device is adopted as the pick.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The clear-withdrawal later-matches list composed the same label and
pairing inline that the court console's refusal notices now take from
scoreRowMatchName; it reads that owner too. Output unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
mobile-score-editor and mobile-encho-overtime show the overtime pill and
the "Encho started" label as plain text with the glossary chip beside
them (bc-otpl). mobile-pool-standings changes because its fixture scores
the Scores list in order: knockout matches no longer interleave with the
remaining pool bouts (bc-kosc), so each pool bout takes a different
scripted result.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Copilot AI balanced review requested due to automatic review settings October 7, 2026 18:27

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

- DecisionPrompt reads the side word from sideWord and sits in the
  existing .radio-group row; the new pill-row rule is gone (bc-dsid).
- The court-console refusal notice is derived from the match that
  blocked the tap, so the clearing effect and the two hand-built toast
  strings go; the Correct refusal builds on courtBusyMessage (bc-crpn).
- The decision submit drops the opts parameter only the removed force
  retry used, and a stale doc comment names one confirmation (bc-dlck).
- The bracket slot assigner computes the opening time once and takes the
  pool-phase map directly (bc-kosc).
- Three tests that only checked their own copy of a ternary are removed;
  the hantei Finish test now taps through the bounce guard (bc-htsd).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Copilot AI balanced review requested due to automatic review settings October 7, 2026 19:18

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

- bc-kosc: a knockout court that holds no pool bout starts after the
  latest pool end on any court, not at the day start; the doc says the
  pool end is read once, when the preview is built.
- bc-htsd: leaving a running match with a hantei side picked asks
  before dropping it; a recorded hantei on an untied scoreline cannot
  be finished (the server refuses it).
- bc-crpn: the court console asks writeKeepsEditorOpen before ending a
  correction.
- scoreRowMatchName takes the missing-side word from sideWord.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Copilot AI balanced review requested due to automatic review settings October 7, 2026 19:45

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

A tie-break or representative bout added once a pool is finished is
appended after its court's last pool bout, which is where that court's
knockout was timed, so the two ran at the same time.

pushKnockoutPastPools moves a court's scheduled knockout matches after
the new pool end, keeping their order and gaps and skipping lunch, in
the same transaction as the injection. A court whose knockout already
starts after its pools, or where a knockout match has started, is left
as it is.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Copilot AI balanced review requested due to automatic review settings October 7, 2026 21:17

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Copilot AI balanced review requested due to automatic review settings October 7, 2026 21:25

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

A pool bout moved onto another court keeps its time, and on that court
it can now run into the knockout. UpdateMatchCourt moves that court's
knockout past it in the same transaction, and the handler announces a
schedule change so every screen picks up the new times.

A time set by hand still moves nothing: it is the operator ordering
the court, and the queue's up/down is two such edits. Pushing there
would undo moving a knockout match ahead of a remaining pool bout.

The draw passes the pool matches generatePools saved straight to the
preview bracket instead of reading them back; the quarantine rebuild
reads them from disk itself.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Copilot AI balanced review requested due to automatic review settings October 7, 2026 21:37

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

- The hantei winner buttons (individual editor and team representative
  bout) read "SHIRO (White) wins" / "AKA (Red) wins", with the competitor
  in the individual editor, so an operator who does not know the words can
  tell them apart. side_cell.jsx's sideWithColour owns the label; the
  decision side picker and the team summary band read it too.
- A Save correction answered after another correction was opened no
  longer closes that one (endCorrectionOf, functional update).
- A court move is saved even when tournament.md cannot be read; the
  knockout push is skipped and logged instead of aborting the move.
- pushKnockoutPastPools moves past lunch only a match it moves, and leaves
  a knockout row whose time does not parse alone.
- An armed hantei says why Finish is off, and a recorded hantei on an
  untied scoreline (legacy) keeps its Cancel reachable.
- The Start refusal during a correction names the console's buttons.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Copilot AI balanced review requested due to automatic review settings October 7, 2026 22:18

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

…eam labels

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Copilot AI balanced review requested due to automatic review settings October 7, 2026 22:28

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@gitrgoliveira
gitrgoliveira merged commit eb9a8ad into main Oct 8, 2026
13 checks passed
@gitrgoliveira
gitrgoliveira deleted the worktree-bridge-cse_012pcFHjqJcocNMkFKrjnixp branch October 8, 2026 07:00
gitrgoliveira added a commit that referenced this pull request Oct 8, 2026
…-crpn are plain tests

Main merged #462 (bc-dsid, bc-otpl, bc-htsd, bc-dlck, bc-kosc, bc-crpn).
The journeys now walk what an operator meets on that build.

- bc-crpn: Correct is refused at the court console while a bout is live.
  J1, J2, J4 and J5 record the refusal (the row notice and the toast), then
  take the route the notice names: send the live bout back to the queue,
  correct, start it again. J5's court-busy panel is reached from the Scores
  tab, where a reopen can still meet a busy court, with its V1 and V4
  variants kept. The bc-crpn test asserts the new refusal: Start match while
  a correction is open names the correction and starts nothing.
- bc-dsid: the withdrawal and no-show prompt picks no side and Record is off
  until one is picked. The hasty variants record that, then the operator
  picks; fixtures/individual.mjs recordDecision now takes the side.
- bc-htsd: the individual hantei buttons pick the side and Finish records it.
- bc-dlck: the re-recorded kiken asserts no "Proceed anyway?" confirm shows.
- bc-otpl and bc-kosc pass as written and are plain tests.
- J5's M1 points won read 7-3 and then 6-3: bout 5's double tap scores one M
  since bc-dtip (#450). The old 8-3 and 7-3 counted the bounce's second M.
- A banned phrase about the outcome of a withdrawal is gone from three audit
  labels, a J3 step title and the bc-kfup test title.

One fixme left, on an open bead: bc-dhrp, which still fails at its own
assertion. make e2e: 32 passed, 1 skipped, EXIT 0 (kachinuki re-run after
the points fix: 11 passed). make go/test: EXIT 0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants