Match Management
At a glance
Match management captures every detail of a played match: status, score by mène, optional throw-level analytics, timers, photo proof, and dispute resolution. Score entry is open to officials, scorers, and team delegates with confirmation by both teams or the umpire, and incident reports flow into the jury workflow.
How it works
Each match in the draw is a state machine: scheduled → in progress → completed, with side states for suspended and forfeit. Score entry happens through one of three roles — official scorekeeper, designated scorer, or a team delegate — chosen per competition. Real-time score tracking pushes updates to the live feed (SSE) the moment a mène ends.
The mène is the basic unit: which team scored, how many points, and optional cochonnet position. A configurable per-tenant/level match timer enforces total match time (Spain: 60 min, CEP: 75 min) and per-throw time (Spain: 30 seconds), each with distinct enforcement UI — the total clock counts down in the header while the throw timer flashes near the active player. When both teams reach the points-to-win, the result is confirmed by both captains or by the umpire on the spot.
If a team disputes the result, the score dispute resolution workflow flips the match into a held state, surfaces the conflicting entries side by side, and routes the matter to the appointed jury (see F05). Court change management lets the umpire move a match mid-play (broken court, weather) while preserving the score history. Match comments and incident reports record protests, fouls, behavioural issues, and weather interruptions.
Photo and video attachments support both routine documentation and disputed measurements — a referee can upload a phone shot of contested boules and tag it to the mène. Optional throw-level tracking lifts analytics another notch: every throw is classified as a point (portée/raspaille/donnée) or a tir (carreau/palet/raté), recorded as successful or missed, with distance from the cochonnet captured for the precision stats. The match timeline view replays the mène-by-mène progression, while forfeit and withdrawal handling propagate the result through standings, ranking points, and bracket advancement.
Key capabilities
- Match state machine: scheduled, in progress, completed, suspended, forfeit
- Score entry by official, scorer, or team delegate with confirmation by both sides
- Configurable match timer and per-throw timer with distinct enforcement UI
- Mène-level tracking (team, points, cochonnet position) plus optional throw-level analytics
- Throw classification: point (portée/raspaille/donnée), tir (carreau/palet/raté), success/miss/distance
- Dispute workflow, court change, incident reports, photo/video attachments per mène
- Match timeline replay and forfeit propagation into standings and rankings
In practice
On court 12 a doublette match enters the seventh mène at 11–10. The scorekeeper taps the host team's score widget on her tablet and adds 2 points; live viewers refresh in under a second. The throw timer flashes amber at 25 seconds when a shooter delays his tir.
At match point the visiting captain disputes the cochonnet measurement; the umpire snaps a photo, attaches it to the mène, and pushes the match into dispute. The jury reviews the photo and the throw record on a separate device, confirms the host team's 13–10 win, and the result locks. Bracket advancement updates within ten seconds.
Features in this subsystem
28| ID | Status | Features |
|---|---|---|
| F04.05.01 | Shipped | Match score entry (by official, scorer, or team delegate) — PL-F0405a ✅ PL-F0405a |
| F04.05.02 | Shipped | Real-time score tracking — PL-F0405a ✅ PL-F0405a |
| F04.05.03 | Shipped | Match status tracking (scheduled, in progress, completed, suspended, forfeit) — PL-F0405a ✅ PL-F0405a |
| F04.05.04 | Shipped | Match timer — configurable: total match time limit (Spain: 60 min, CEP: 75 min) AND per-throw time limit (Spain: 30 seconds). Both optional and configurable per tenant/competition level. Distinct enforcement UI for each. — PL-F0405a ✅ PL-F0405a |
| F04.05.05 | Shipped | Match result confirmation (both teams or umpire) — PL-F0405a ✅ PL-F0405a |
| F04.05.06 | Shipped | Score dispute resolution workflow — PL-F0405a ✅ PL-F0405a |
| F04.05.07 | Shipped | Forfeit and withdrawal handling — PL-F0405b ✅ PL-F0405b |
| F04.05.08 | Shipped | Court change management — PL-F0405b ✅ PL-F0405b |
| F04.05.09 | Shipped | Match comments and incident reporting — PL-F0405b ✅ PL-F0405b |
| F04.05.10 | Shipped | Photo/video attachment to match records — PL-F0405b ✅ PL-F0405b |
| F04.05.11 | Shipped | Mène (end/round) tracking — score progression per mène within a match — PL-F0405b ✅ PL-F0405b |
| F04.05.12 | Shipped | Mène-level detail: which team scored, how many points, cochonnet position — PL-F0405b ✅ PL-F0405b |
| F04.05.13 | Shipped | Individual throw tracking (optional, for detailed analytics) — PL-F0405c ✅ PL-F0405c |
| F04.05.14 | Shipped | Throw type classification: point (portée/raspaille/donnée), tir (carreau/palet/raté) — PL-F0405c ✅ PL-F0405c |
| F04.05.15 | Shipped | Throw outcome recording: successful/missed, distance from cochonnet — PL-F0405c ✅ PL-F0405c |
| F04.05.16 | Shipped | Photo proof upload per mène (disputed measurements) — PL-F0405c ✅ PL-F0405c |
| F04.05.17 | Shipped | Match timeline view (mène-by-mène score progression) — PL-F0405c ✅ PL-F0405c |
| F04.05.18 | Shipped | Court Ops Console — live-board för marshal/jury president med color-coded threshold-flaggor och SSE-stream per event — PL-T223 ✅ PL-T223 |
| F04.05.19 | Shipped | Threshold alerts — warn/overrun/escalate (75/100/125 % default), tenant/event-config, audit-trail i CourtOpsAlert med ack-flow — PL-T223 ✅ PL-T223 |
| F04.05.20 | Shipped | Marshal broadcast — audience ∈ {all_marshals, all_teams, court_neighbors, next_up}, multi-lang body, F09.02-fan-out — PL-T223 ✅ PL-T223 |
| F04.05.21 | Shipped | Live rond-timer — server-auktoritativ nedräknings-FSM (not_started→running→paused⇄running→expired) styrd av arrangör/court-ops (start/paus/förläng/avsluta), timer-event på live-kanalen + nedräkning i app & publik scoreboard, expiry-tick med "spela klart sista rundan"-banner (v1 = in-app/SSE, ingen native push) — D-COMP-TIMER 1e481c39.m-1 ✅ D-COMP-TIMER (backend t-1) |
| F04.05.22 | Shipped | Arrangörens "Tidtagning"-flik (admin/app/tavlingar/[id]?tab=tidtagning) — stor server-driven klocka + status ("Kör · startades … · Rond N · alla banor") + knapparna ▶ Starta / ⏸ Paus / +5 min / Avsluta rond, som anropar t-1:s capability-gejtade endpoints via den genererade klienten (If-Match/version). Expired-signal med ikon + text (NF-7). — D-COMP-TIMER 1e481c39.m-1 t-2 ✅ D-COMP-TIMER (frontend t-2) |
| F04.05.23 | Shipped | Spelar-app-nedräkning (app/app/live/[comp]) — "Tid kvar MM:SS · Rond N" driven av den pollade live-snapshotten, klientlokal tick med server_time-skew-korrektion (NF-1); expiry-banner "Tiden är ute — spela klart sista rundan." reses klientlokalt när nedräkningen når 0 för en running-timer med last_end_on_expiry (eller vid server-flippad expired) — den pollande appen inväntar inte serverns expiry-tick (in-app/SSE, ingen native push); vid poll-tapp behålls senast kända nedräkning ("återansluter…", NF-8). — D-COMP-TIMER 1e481c39.m-1 t-2 ✅ D-COMP-TIMER (frontend t-2) |
| F04.05.24 | Shipped | Publik scoreboard-nedräkning (web/app/d/[displayId], D-SCORE) — "Tid kvar · Rond N" ur den pollade /public/scoreboard/{id}-snapshotten, samma server-instant-nedräkning; utomhusläsbar display-variant. — D-COMP-TIMER 1e481c39.m-1 t-2 ✅ D-COMP-TIMER (frontend t-2) |
| F04.05.25 | Shipped | Court Marshal-tavla — bana-centrerad tävlingsdags-trafikledning (GET/POST /v1/operator/court-marshal/{id}/{board\ queue|call-up|clear|delays|delays/{did}/report|stream}). Ban-status-tavla som projicerar varje allokerad bana (härledd ur venue-courts/num_courts, aldrig hårdkodad) med tillstånd free|in_progress|done|delayed, KPI-rad, prioriterad klass-filtrerbar match-kö, upprop (tilldela ledig bana via schemaläggnings-substratet + registrera announcement m. kanaler/språk, race-säker + idempotent), clear-court, flagga-försening + rapportera-TD, SSE-ström. Skild från D-VENUE banstatus (FR-13). Backend i t-1; admin-tavla wire:ad i t-2 (admin ▸ tavlingsdags ▸ #marshal: KPI-rad, ban-status-kort, klass-filtrerbar kö, upprops- + delay-paneler, live-poll, a11y AA). — D-COMP-OPS 8a5db0fb.m-2 | ✅ D-COMP-OPS (backend t-1 · frontend t-2) |
| F04.05.26 | Shipped | Table Official-desk — tävlingsdags incheckningsdisk (GET/POST /v1/operator/table-official/{id}/{desk\ check-in|bulk-check-in|day-of|no-show|escalate|stream}). Ett operativt lager ovanpå anmälnings- (registration), licens- (license) och betalnings- (payments) substraten som binder ihop tävlingsdagens flöde "välkomna → verifiera → checka in → ta betalt": disk-projektion (KPI-rad + incheckningslista med sök/filter/CSV, härledd ur riktiga anmälningar joinade mot licens-status valid|expired|blocked|unknown + betalnings-status paid|pending|none), licens-verifiering (läst ur D-MEMBER, aldrig fabricerat), incheckning + on-site-betalning (pay_on_site skapar en RIKTIG payments-rad markerad betald och länkar via registration.payment_ref, idempotent + race-säker), bulk-incheckning (hoppar över blocked/expired/redan), eskalera-spärr → head umpire, day-of walk-in-registrering (full klass → dokumenterat utfall, aldrig tyst överbokning), no-show/scratch (+ typad event/SSE-signal mot lottningen + TD), SSE-ström. Check-in-/no-show-tillstånd strikt additivt på registration (migration 00108). Skild från D-VENUE court-booking-checkin (FR-14). Backend i t-1; admin-disk wire:ad i t-2 (admin ▸ tavlingsdags ▸ #desk). — D-COMP-OPS 8a5db0fb.m-3 | ✅ D-COMP-OPS (backend t-1 · frontend t-2) |
| F04.05.27 | Shipped | Rules Reference — courtside sökbar regel-uppslagning (GET /v1/rules/{search\ categories|articles/{id}|bundle|bundle/version|recent-changes|bookmarks}, POST/DELETE /v1/rules/bookmarks[/{id}]). Ett läs-lager över ett läs-optimerat regel-innehålls-substrat (migration 00109, seedat av seed-rules): nyckelordssök (artikelnummer/titel/brödtext/situation, trigram-index, p95 < 300 ms), chip-kategorier, artikeldetalj med tolkningar (FAQ|precedent|guidance) + genuina kors-referenser, flerspråkig uppslag med markerad språk-fallback (en/sv/fr/es/it), versionerad+checksummad offline-bundle (deterministisk version, olika tillämpligt innehåll → olika version), senaste-ändringar och actor-privata bokmärken (idempotent star/unstar). Bas-FIPJP delat (tenant_id IS NULL), nationell/regional variant tenant-scopad (aldrig läckt, 404 x-tenant), endast Approved exponeras. Pull-baserad (ingen SSE). Ny bred läs-capability rules:read (domarkår L1–L5/jury/spelare + tävlingsroller). Kanonisk regelkälla/authoring ägs av D-GOV (admin/regelverk, ostartad); denna task läser + seedar minimalt substrat. Skild från D-OFF/D-EDU utbildning (innehåll, ej kurs). — D-COMP-OPS 8a5db0fb.m-4 t-1 | ✅ D-COMP-OPS (backend t-1) |
| F04.05.28 | Shipped | Rules Reference — admin courtside-yta (tavlingsdags ▸ #regler). Wire:ar F04.05.27:s riktiga endpoints till admin-vyn admin/app/tavlingar/[id]/tavlingsdags/page.tsx (RulesReference.tsx + lib/rules-reference.tsx hooks + lib/rules-reference-presenter.ts ren logik): sökpanel (fritextsök med debounce → /search, språkväljare en/sv/fr/es/it → ?lang, Offline-badge som speglar verklig manifest-version ur /bundle/version — aldrig hårdkodat datum), kategori-chips (/categories + "Alla"-reset → ?category), träfflista med härledd träffräknare + artikelnr/kategori/titel/utdrag, artikeldetalj (full regel + tolkningar/kors-refs ur /articles/{id}, markerad språk-fallback), samt sido-korten Snabb uppslagning · Flerspråkig · Bokmärken (GET/POST/DELETE /bookmarks) & senaste ändringar (/recent-changes). Ingen hårdkodad/placeholder-data (AC-14); tom/laddande/fel/403-lägen verkliga; pull-baserad (ingen SSE, FR-12). ALL åtkomst via delat transport-lager (rulesReferenceOps.*) — ingen rå fetch( (fetch-ratchet). A11y WCAG 2.2 AA (färg aldrig enda bäraren av kategori-/tolknings-/status-info, träffytor ≥44px, aria-live träffräknare). Terminologi "runda"/"Boulodrome"/å/ä/ö. #marshal (m-2), #desk (m-3) och referee-call-spegeln (m-1) orörda (NFR-7). E2e: tools/gate/rules-reference-e2e.mjs (verify.sh L4, RUN_UI). — D-COMP-OPS 8a5db0fb.m-4 t-2 ✅ D-COMP-OPS (frontend t-2) |
Related subsystems
Stakeholders who need this subsystem
Surfaces in 1 stakeholder analyses