Disciplinary Cases per Nation
At a glance
Disciplinary Cases per Nation models each federation's distinct judicial structure, configurable investigation steps, sanction catalogue, and appeal chain, while providing a unified case-management dashboard, anonymised public protocols with PII stripped, and CAS appeal handling for international cases. It allows France, Sweden, Germany, and every other federation to operate their native judicial frameworks on a single platform without forking the underlying engine.
How it works
Each federation configures its commission structure in TenantConfig. France runs a three-level commission de discipline (departement, regionale, nationale); Sweden uses Disciplinnamnd plus the RF Bestraffningsdomstol; Germany uses Sportgericht at Landes- und Bundesebene. The investigation process is configured as a sequence of steps with deadlines and responsible roles, so each tenant defines who investigates within how many days and what the escalation triggers are.
A per-nation sanktionskatalog stores the federation's sanction codes, types, durations, fines, and bans. Catalogue entries are filterable by category, sanction type, and minimum competition level, ensuring that a regional commission can only issue regional-level sanctions and that the available options match federation regulation. When a commission decides a case, the platform forces selection from the configured catalogue, eliminating ad hoc sanctions that can be challenged on appeal.
Appeals escalate along the configured chain (regional then national, or directly national depending on jurisdiction). For international cases where domestic appeals have been exhausted, the CAS appeal workflow takes over: the case state flow is filed, registered, under_review, hearing_scheduled, decided or withdrawn, with each transition stamped and document-trailed. The dashboard aggregates statistics across cases by status and category, sanction distribution, open-case aging buckets, appeal statistics, and average resolution days, giving each federation a real-time view of judicial throughput.
The anonymised public protocol exposes decided and closed cases via a public endpoint with all PII stripped: no player or club IDs, no reporter, investigator, attendees, or evidence URLs. Evidence counts replace evidence URLs so the public can see how substantive a case was without identifying parties. Federations publish protocols at their own cadence to satisfy transparency obligations while honouring privacy law.
Key capabilities
- Per-nation commission structures (FR three-level, SE RF model, DE Sportgericht)
- Configurable investigation steps, deadlines, and responsible roles
- Per-nation sanktionskatalog filterable by category, type, and minimum level
- CAS appeal workflow with documented state transitions
- Anonymised public protocol endpoint with PII stripped and evidence counts only
- Discipline case management dashboard aggregating status, sanctions, aging, and appeals
- Average resolution day tracking for federation reporting
In practice
A French national commission opens a cheating case escalated from the regional level. The investigator follows the configured five-step process; deadlines are tracked automatically, and the dashboard shows the case sitting in the under-investigation aging bucket. The commission decides on a twelve-month suspension drawn from the national sanktionskatalog.
The accused appeals; the case escalates to the federation's highest tier, then is filed with CAS as the international competition implication brings it under CAS jurisdiction. Three months later the public protocol publishes the closed case with all PII stripped, listing only the rule article, sanction code, evidence count, and final outcome.
Features in this subsystem
8| ID | Status | Features |
|---|---|---|
| F05.07.01 | Shipped | France — Commission de discipline (3 levels: département → régionale → nationale) ✅ PL-F0507a |
| F05.07.02 | Shipped | Sweden — Disciplinnämnd och Bestraffningsdomstol (RF) ✅ PL-F0507a |
| F05.07.03 | Shipped | Germany — Sportgericht på Landes- und Bundesebene ✅ PL-F0507a |
| F05.07.04 | Shipped | Standard investigation process — configurable steps, deadlines, responsible roles ✅ PL-F0507a |
| F05.07.05 | Shipped | Per-nation sanktionskatalog — each federation defines predefined sanctions (codes, types, durations, fines, bans) in TenantConfig. Catalog entries filterable by category, sanction_type, min_level. ✅ PL-F0507b |
| F05.07.06 | Shipped | CAS-överklagan (Court of Arbitration for Sport) — CAS appeal for international disciplinary cases. Requires exhausted domestic appeal. Rebuilt as a REGISTRATION, not a state machine (7635e69d.m-5 A-7): POST /v1/discipline/appeals/{id}/escalate-cas stamps the arbitration court's OWN case reference + cas_filed_at and writes an audit row — and changes NOTHING in the sanction, the case or the cross-tenant registry. The gate is mechanical: the instance must be decided AND the domestic chain exhausted (no higher instance left, no open instance), else 409 cas_chain_not_exhausted. Avvikelse mot statusflödet ovan: the five-step FSM (registered → under_review → …) has no home in the authoritative vision and is not built — the house cannot observe what an external court does, and a fabricated process would be worse than none. ✅ PL-F0507b · ✅ 7635e69d.m-5 (t-1) |
| F05.07.07 | Shipped | Anonymiserat publikt protokoll — public-facing endpoint with PII stripped (no player/club IDs, reporter, investigator, attendees, evidence URLs). Only decided/closed cases. Evidence count instead of URLs. Rebuilt as the three unauthenticated routes GET /v1/public/discipline/protocols/{year}[/{alias}[/print]]?tenant=<KOD>: the federation is chosen by its CODE (mandatory — an omitted or unknown code is 404, never an empty list), the year-list row's key set is FROZEN in the acceptance suite (the freeze IS the leak guard for a rule that is negative), /print answers an IDENTICAL payload (A-9 — the print variant is the web surface's styling concern), and an unpublished document answers 410 with a one-line note on all three URLs. Legacy's free-text search (?q=, ?offence= as substring match against the markdown) is deliberately struck: a searchable protocol body is an oracle one can ask about names. ✅ PL-F0507b · ✅ 7635e69d.m-6 (t-1) |
| F05.07.08 | Shipped | Discipline case management dashboard — aggregated statistics: cases by status/category, sanction distribution, open case aging buckets, appeal stats, average resolution days. Rebuilt as GET /v1/discipline/dashboard (discipline:manage in ANY scope, counted with aggregate queries and filtered EXACTLY like the case queue, so an org-scoped case worker sees her own subtree's numbers) plus the operator's cross-tenant GET /v1/sys/discipline/overview behind GuardSysConsole — read-only, aggregate-only, with a FROZEN row projection (A-12: no case data, no parties, no free text, and no way into a case from there; sys has no decision rights in a tenant's disciplinary cases). Empty ground truth yields honest zeros and null, never a fabricated statistic. ✅ PL-F0507b · ✅ 7635e69d.m-6 (t-1) |
Stakeholders who need this subsystem
Surfaces in 1 stakeholder analyses