Regler
Hva styrte planen, ble kravene oppfylt, hva krever manuell handling, og hvilke kvalitetsavveininger eller eksplisitte beslutninger ble akseptert?
Må være sant for at planen skal være gyldig.
| Regel | Type | Omfang | Eier / håndhevelse | Konfigurert verdi / mål | Status |
|---|---|---|---|---|---|
| Lagets aldersgruppe må være identisk med turneringens Aldersgruppen er en eksakt kategori-streng (f.eks. «U10» eller «JU10»), aldri bare det numeriske alderstallet. U- og JU-kategorier blandes derfor aldri i samme turnering, selv om de deler samme tall — «U10» og «JU10» er alltid to forskjellige turneringer. Regel-ID: team_age_group_exact · Hardt kravEvery team participating in a tournament belongs to that tournament's age group. | Hard krav | lag × turnering | Deterministisk verifikator | Eksakt match | Oppfylt |
| Et lag kan ikke delta i flere turneringer samme dato Et lag kan ikke stå oppført i mer enn én turnering på samme dato. Regel-ID: team_unique_per_date · Hardt kravA team may not be scheduled in two different tournaments on the same date. | Hard krav | lag × dato | Deterministisk verifikator | Maks 1 turnering per lag per dato | Oppfylt |
| Turneringsdatoer må ligge innenfor planleggingsvinduet Alle turneringer skal ha en dato innenfor sesongens start-/sluttdato. Regel-ID: date_within_window · Hardt kravEvery tournament date lies inside the configured planning/season window. | Hard krav | turnering | Deterministisk verifikator | 2026-10-10 – 2027-03-28 | Oppfylt |
| Helligdagsdatoer må ikke brukes Turneringer skal ikke legges i ferie-/helligdagshelger eller helgen rett foran en helligdag. Regel-ID: holiday_date_admissible · Hardt kravTournaments must not be scheduled on canonically excluded holiday dates for the planning window. | Hard krav | dato | Deterministisk verifikator | 10 sperret(e) helgedato(er) | 5 avvik: rvv-0009 (2026-12-19), rvv-0026 (2026-12-19), rvv-0031 (2026-12-19), rvv-0092 (2026-12-19), rvv-0109 (2026-12-20) |
| Arena-/tidskollisjoner skal ikke forekomme To turneringer skal aldri kreve samme arena i overlappende tidsrom. Sjekket på nytt mot den endelig valgte kandidaten hver eksport, ikke gjenbrukt fra en tidligere kandidat. Regel-ID: arena_interval_non_overlap · Hardt kravTwo tournaments must never require the same arena in overlapping datetime intervals. A failure to evaluate the interval data is itself a blocking verification result, not a silent pass. | Hard krav | arena/tid | Deterministisk verifikator | 0 kollisjoner | Ingen kollisjoner |
| Sperrede datoer må ikke brukes Datoer operatøren har sperret for planlegging skal aldri få en turnering. Regel-ID: banned_dates_not_used · Hardt kravTournaments must not be scheduled on an operator-banned global date. | Hard krav | dato | Deterministisk verifikator | Ingen konfigurert | Oppfylt |
| Ekskluderte vertsklubber må ikke brukes Klubber operatøren har ekskludert fra vertskap skal aldri stå som vert. Regel-ID: excluded_host_club_not_used · Hardt kravA club explicitly excluded as host for a scope must not host there. | Hard krav | klubb | Deterministisk verifikator | Ingen konfigurert | Oppfylt |
| Låste datoer må ha en planlagt turnering Datoer operatøren har låst inn skal alltid ha minst én turnering planlagt. Regel-ID: locked_date_preserved · Hardt kravA canonical locked date must still have a scheduled tournament. | Hard krav | dato | Deterministisk verifikator | Ingen konfigurert | Oppfylt |
| Fastnaglede turneringer må være med i planen Turnering-ID-er operatøren har fastnaglet skal alltid finnes i den endelige planen. Regel-ID: pinned_tournament_preserved · Hardt kravA pinned tournament id must remain present in the candidate. | Hard krav | turnering | Deterministisk verifikator | Ingen konfigurert | Oppfylt |
| Istid kan kun godkjennes automatisk mot en bekreftet («known») kalender En klubbs kalenderstatus er «known» (nok bevis for automatisk plassering), «unknown» (blokkert/hoppet over/feilet skraping), «untrusted» (skrapingen lyktes, men klubbens registeroppføring sier dataene ikke er den reelle, fullstendige kalenderen) eller «source_review_required» (skrapingen lyktes, men kildens dekning eller hendelsesform er mistenkelig eller ufullstendig). En klubb med «untrusted», «unknown» eller «source_review_required» status beholder sin fulle andel av vertskapsansvaret, og kilden kan ikke brukes til å bevise ledig/ikke-booket istid før et fullstendig, autentisert kalendersøk er pålitelig. Autentiske observerte hendelser fra en delvis kilde kan likevel fremmes som positive bookingkandidater som krever eksplisitt tilknytning til en turnering. Regel-ID: calendar_source_trust · Fakta/bevisA per-club calendar is only trustworthy when the configured source produced usable evidence this run. A 'known' status does not prove every candidate time is free; an untrusted calendar yields manual placement, never a silent pass. | Hard krav | klubb | Deterministisk plasseringsflyt | Kun «known» godkjennes automatisk | Ingen — alle vertskap har bekreftet kalender |
| Kun registrerte lag kan delta Ethvert lag i en turnering må finnes i den registrerte laglisten for sesongen (`verify_candidate`s `unregistered_team`-sjekk). Håndheves ved planlegging, ikke uavhengig av eksportert plan siden den registrerte rosteren ikke er en del av denne eksporten. Regel-ID: registered_teams_only · Hardt kravEvery RVV participant of a tournament must exist in the registered roster (guests are explicit, separate places). | Hard krav | lag | Deterministisk verifikator | Kun registrerte lag | Håndheves ved planlegging (verify_candidate) |
| Turneringsstørrelse må respektere konfigurert kapasitet Antall lag i en turnering skal ikke overstige kapasiteten konfigurert antall parallelle kamper for aldersgruppen tillater (`verify_candidate`s `tournament_over_capacity`-sjekk). Regel-ID: tournament_capacity · Hardt kravA tournament must not exceed its configured participant capacity. | Hard krav | turnering | Deterministisk verifikator | ≤ konfigurert kapasitet | Håndheves ved planlegging (verify_candidate) |
| Ingen stille flytting over nyttårsskillet Sesongen deles i to uavhengige planleggingshalvdeler (før/etter 1. januar). En turnering kan flyttes til en ny dato innenfor sin egen halvdel, men flytting over nyttårsskillet krever et eksplisitt `allow_cross_half_moves`-unntak og skjer aldri som en bieffekt av optimaliseringssøket. | Hard krav | sesong | Deterministisk verifikator | 1. januar | Håndheves ved planlegging |
Skal oppfylles når det er rimelig gjennomførbart; begrenset avvik tillates med synlig unngåelighetsstatus.
| Regel | Type | Omfang | Eier / håndhevelse | Konfigurert verdi / mål | Status | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Deltakelsesmål (sterkt mål, ikke absolutt tak) Deltakelsesmålet er et sterkt driftsmål, ikke en hard lovlighetsgrense. Planleggeren skal treffe målet når det er rimelig gjennomførbart, men et begrenset avvik over eller under målet er tillatt når hardere kapasitets-/planleggingshensyn gjør målet uoppnåelig. Hvert avvik bærer en unngåelighetsstatus (avoidable / proven_infeasible / bounded_search_exhausted / operator_accepted) slik at et unngåelig avvik ikke kan velges bort for en lavere prioritert kvalitetsgevinst. Regel-ID: participation_target · Mykt målThe configured per-team/per-half tournament participation target is a desired optimization goal with evidenced relaxation, not an unconditional obligation or hard bound. Attainment is optimized within real season capacity; a capacity-constrained miss is not itself a planning failure. Vis avvik per lag
Viser 30 av 164 rader. | Sterkt driftsmål | lag | Deterministisk verifikator | Faktisk ≈ mål (sterkt mål) | 164 avvik: Frisk Asker 1 (4/3, after_christmas, bounded_search_exhausted), Frisk Asker 1 (5/6, after_christmas, bounded_search_exhausted), Frisk Asker 1 (3/4, after_christmas, bounded_search_exhausted), Frisk Asker 1 (4/5, after_christmas, bounded_search_exhausted), Frisk Asker 2 (2/3, after_christmas, bounded_search_exhausted), Frisk Asker 2 (5/4, after_christmas, bounded_search_exhausted), Frisk Asker 2 (4/5, after_christmas, bounded_search_exhausted), Frisk Asker 2 (3/4, after_christmas, bounded_search_exhausted), Frisk Asker 3 (5/4, after_christmas, bounded_search_exhausted), Frisk Asker 3 (6/5, after_christmas, bounded_search_exhausted), Frisk Asker 3 (5/6, after_christmas, bounded_search_exhausted), Frisk Asker 4 (3/4, after_christmas, bounded_search_exhausted), Frisk Asker 5 (3/4, after_christmas, bounded_search_exhausted), Frisk Asker 5 (1/3, after_christmas, bounded_search_exhausted), Frisk Asker 6 (3/4, after_christmas, bounded_search_exhausted), Frisk Asker Orange (4/5, after_christmas, bounded_search_exhausted), Holmen Hockey Blå (4/3, after_christmas, bounded_search_exhausted), Holmen Hockey Hvit (4/3, after_christmas, bounded_search_exhausted), Holmen Hockey Hvit (4/6, after_christmas, bounded_search_exhausted), Holmen Hockey Rød (7/5, after_christmas, bounded_search_exhausted), Holmen Hockey Rød (5/4, after_christmas, bounded_search_exhausted), Holmen Hockey Sort (5/4, after_christmas, bounded_search_exhausted), Holmen Hockey Sort (3/4, after_christmas, bounded_search_exhausted), Jar Blå (4/6, after_christmas, bounded_search_exhausted), Jar Blå (3/4, after_christmas, bounded_search_exhausted), Jar Grønn (5/4, after_christmas, bounded_search_exhausted), Jar Grønn (6/5, after_christmas, bounded_search_exhausted), Jar Gul (6/5, after_christmas, bounded_search_exhausted), Jar Hvit (4/3, after_christmas, bounded_search_exhausted), Jar Hvit (4/5, after_christmas, bounded_search_exhausted), Jar Hvit (4/6, after_christmas, bounded_search_exhausted), Jar Lilla (7/5, after_christmas, bounded_search_exhausted), Jar Oransje (4/5, after_christmas, bounded_search_exhausted), Jar Rød (3/5, after_christmas, bounded_search_exhausted), Jar Rød (7/6, after_christmas, bounded_search_exhausted), Jar Rød (3/4, after_christmas, bounded_search_exhausted), Jar Svart (4/3, after_christmas, bounded_search_exhausted), Jar Svart (5/6, after_christmas, bounded_search_exhausted), Jar Svart (3/4, after_christmas, bounded_search_exhausted), Jutul Grønn (3/5, after_christmas, bounded_search_exhausted), Jutul Grønn (3/4, after_christmas, bounded_search_exhausted), Jutul Grønn (5/6, after_christmas, bounded_search_exhausted), Jutul Gul (2/3, after_christmas, bounded_search_exhausted), Jutul Hvit (1/3, after_christmas, bounded_search_exhausted), Jutul Hvit (3/4, after_christmas, bounded_search_exhausted), Jutul Rød (4/3, after_christmas, bounded_search_exhausted), Jutul Rød (5/6, after_christmas, bounded_search_exhausted), Kongsberg (4/5, after_christmas, bounded_search_exhausted), Ringerike 1 (4/3, after_christmas, bounded_search_exhausted), Ringerike 1 (4/6, after_christmas, bounded_search_exhausted), Ringerike 2 (4/3, after_christmas, bounded_search_exhausted), Ringerike 2 (4/5, after_christmas, bounded_search_exhausted), Ringerike 3 (5/4, after_christmas, bounded_search_exhausted), Ringerike 4 (3/4, after_christmas, bounded_search_exhausted), Ringerike Gul (7/5, after_christmas, bounded_search_exhausted), Ringerike Svart (4/5, after_christmas, bounded_search_exhausted), Skien (5/4, after_christmas, bounded_search_exhausted), Skien (4/5, after_christmas, bounded_search_exhausted), Skien (4/5, after_christmas, bounded_search_exhausted), Tønsberg (4/3, after_christmas, bounded_search_exhausted), Tønsberg (3/4, after_christmas, bounded_search_exhausted), Tønsberg Grå (6/5, after_christmas, bounded_search_exhausted), Tønsberg Grå (5/6, after_christmas, bounded_search_exhausted), Tønsberg Hvit (7/6, after_christmas, bounded_search_exhausted), Tønsberg Hvit (4/5, after_christmas, bounded_search_exhausted), Tønsberg Rød (7/5, after_christmas, bounded_search_exhausted), Tønsberg Rød (4/6, after_christmas, bounded_search_exhausted), Frisk Asker (2/3, before_christmas, proven_infeasible), Frisk Asker 1 (7/6, before_christmas, bounded_search_exhausted), Frisk Asker 1 (3/4, before_christmas, bounded_search_exhausted), Frisk Asker 1 (2/3, before_christmas, bounded_search_exhausted), Frisk Asker 2 (2/4, before_christmas, bounded_search_exhausted), Frisk Asker 2 (3/4, before_christmas, bounded_search_exhausted), Frisk Asker 2 (4/5, before_christmas, bounded_search_exhausted), Frisk Asker 2 (1/3, before_christmas, bounded_search_exhausted), Frisk Asker 3 (2/4, before_christmas, bounded_search_exhausted), Frisk Asker 3 (3/6, before_christmas, bounded_search_exhausted), Frisk Asker 3 (2/5, before_christmas, bounded_search_exhausted), Frisk Asker 4 (4/5, before_christmas, bounded_search_exhausted), Frisk Asker 4 (2/4, before_christmas, bounded_search_exhausted), Frisk Asker 4 (4/3, before_christmas, bounded_search_exhausted), Frisk Asker 5 (2/4, before_christmas, bounded_search_exhausted), Frisk Asker 6 (2/4, before_christmas, bounded_search_exhausted), Frisk Asker Orange (4/5, before_christmas, bounded_search_exhausted), Frisk Asker Orange (3/4, before_christmas, proven_infeasible), Frisk Asker Svart (3/5, before_christmas, bounded_search_exhausted), Frisk Asker Svart (2/4, before_christmas, proven_infeasible), Holmen Hockey Blå (3/4, before_christmas, bounded_search_exhausted), Holmen Hockey Blå (2/3, before_christmas, bounded_search_exhausted), Holmen Hockey Hvit (4/6, before_christmas, bounded_search_exhausted), Holmen Hockey Hvit (3/4, before_christmas, bounded_search_exhausted), Holmen Hockey Hvit (3/4, before_christmas, bounded_search_exhausted), Holmen Hockey Hvit (3/5, before_christmas, bounded_search_exhausted), Holmen Hockey Rød (3/4, before_christmas, bounded_search_exhausted), Holmen Hockey Rød (1/4, before_christmas, bounded_search_exhausted), Holmen Hockey Rød (3/5, before_christmas, bounded_search_exhausted), Holmen Hockey Sort (3/4, before_christmas, bounded_search_exhausted), Holmen Hockey Sort (3/4, before_christmas, bounded_search_exhausted), Holmen Hockey Sort (2/3, before_christmas, bounded_search_exhausted), Jar (2/3, before_christmas, proven_infeasible), Jar Blå (5/6, before_christmas, bounded_search_exhausted), Jar Blå (3/4, before_christmas, bounded_search_exhausted), Jar Blå (2/4, before_christmas, proven_infeasible), Jar Grønn (2/4, before_christmas, bounded_search_exhausted), Jar Grønn (2/5, before_christmas, bounded_search_exhausted), Jar Gul (4/5, before_christmas, bounded_search_exhausted), Jar Gul (3/4, before_christmas, bounded_search_exhausted), Jar Hvit (3/4, before_christmas, bounded_search_exhausted), Jar Hvit (6/5, before_christmas, bounded_search_exhausted), Jar Hvit (2/3, before_christmas, bounded_search_exhausted), Jar Hvit (2/4, before_christmas, proven_infeasible), Jar Lilla (2/5, before_christmas, bounded_search_exhausted), Jar Rød (3/6, before_christmas, bounded_search_exhausted), Jar Rød (3/4, before_christmas, proven_infeasible), Jar Rød (3/4, before_christmas, bounded_search_exhausted), Jar Rød (2/4, before_christmas, bounded_search_exhausted), Jar Svart (3/5, before_christmas, bounded_search_exhausted), Jar Svart (2/4, before_christmas, bounded_search_exhausted), Jar Svart (2/3, before_christmas, bounded_search_exhausted), Jar Svart (4/6, before_christmas, bounded_search_exhausted), Jutul Grønn (3/4, before_christmas, bounded_search_exhausted), Jutul Grønn (5/6, before_christmas, bounded_search_exhausted), Jutul Grønn (3/5, before_christmas, bounded_search_exhausted), Jutul Grønn (2/4, before_christmas, bounded_search_exhausted), Jutul Gul (2/3, before_christmas, bounded_search_exhausted), Jutul Hvit (4/3, before_christmas, bounded_search_exhausted), Jutul Hvit (3/4, before_christmas, bounded_search_exhausted), Jutul Kittens (2/3, before_christmas, proven_infeasible), Jutul Rød (3/4, before_christmas, bounded_search_exhausted), Jutul Rød (3/4, before_christmas, bounded_search_exhausted), Jutul Rød (1/3, before_christmas, bounded_search_exhausted), Jutul Rød (3/5, before_christmas, bounded_search_exhausted), Jutul/Jar Kittens (4/5, before_christmas, bounded_search_exhausted), Kongsberg (4/6, before_christmas, bounded_search_exhausted), Kongsberg (3/4, before_christmas, bounded_search_exhausted), Kongsberg (3/4, before_christmas, bounded_search_exhausted), Kongsberg (2/3, before_christmas, bounded_search_exhausted), Ringerike 1 (3/4, before_christmas, bounded_search_exhausted), Ringerike 1 (5/6, before_christmas, bounded_search_exhausted), Ringerike 1 (3/5, before_christmas, bounded_search_exhausted), Ringerike 1 (3/4, before_christmas, proven_infeasible), Ringerike 1 (2/3, before_christmas, bounded_search_exhausted), Ringerike 2 (5/6, before_christmas, bounded_search_exhausted), Ringerike 2 (3/4, before_christmas, bounded_search_exhausted), Ringerike 2 (2/3, before_christmas, bounded_search_exhausted), Ringerike 3 (2/4, before_christmas, bounded_search_exhausted), Ringerike 4 (2/4, before_christmas, bounded_search_exhausted), Ringerike Gul (2/5, before_christmas, bounded_search_exhausted), Ringerike Svart (6/5, before_christmas, bounded_search_exhausted), Sandefjord (4/5, before_christmas, bounded_search_exhausted), Sandefjord (3/4, before_christmas, bounded_search_exhausted), Skien (3/4, before_christmas, bounded_search_exhausted), Skien (2/3, before_christmas, proven_infeasible), Skien (2/4, before_christmas, proven_infeasible), Skien (2/3, before_christmas, bounded_search_exhausted), Skien (3/5, before_christmas, bounded_search_exhausted), Tønsberg (2/4, before_christmas, bounded_search_exhausted), Tønsberg (2/3, before_christmas, bounded_search_exhausted), Tønsberg (3/4, before_christmas, bounded_search_exhausted), Tønsberg Grå (5/6, before_christmas, bounded_search_exhausted), Tønsberg Grå (4/5, before_christmas, bounded_search_exhausted), Tønsberg Hvit (5/6, before_christmas, bounded_search_exhausted), Tønsberg Rød (5/6, before_christmas, bounded_search_exhausted), Tønsberg Rød (2/5, before_christmas, bounded_search_exhausted) |
Kan stå uløst, men krever manuell oppfølging.
| Regel | Type | Omfang | Eier / håndhevelse | Konfigurert verdi / mål | Status | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Hjemmebanebelastning Aldersgruppevis fordeling av hjemmeturneringer: U10 Frisk Asker: 10 vs ~7.7; U9 Jutul: 5 vs ~3.0; JU12 Frisk Asker: 6 vs ~4.6; JU12 Jutul: 1 vs ~2.3. Størst avvik: U10: Frisk Asker har 10 hjemmeturnering(er), forventet ~7.7 basert på 6.0 lag i aldersgruppen. Avviket skyldes trolig arenakapasitet, ikke planleggingslogikken: planleggeren forsøkte å tildele vertskap dit, men fant ingen ledig arenatid (se vertsbytte-registeret). Regel-ID: hosting_proportional_balance · Mykt målAfter the age-group coverage floor is satisfied (or a structural shortfall is explicitly surfaced), remaining hosting responsibility is distributed roughly in proportion to eligible team counts. This objective is secondary to coverage: a larger club may legitimately under-host relative to its proportional target so a smaller club gets its first responsibility. Vis vertskapsfordeling
Viser 20 av 62 rader (størst avvik først). | Påkrevd forpliktelse | klubb | Deterministisk måling | 1 | warn — 2.3200000000000003 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Klubb × aldersgruppe skal ha minst én hjemmeturnering Hver klubb med minst ett registrert lag i en aldersgruppe skal ha minst én hjemmeturnering i akkurat den aldersgruppen. Uløste krav holdes uløst i stedet for å stille en annen klubb som vert, og legges i «Må planlegges manuelt». Regel-ID: hosting_age_group_coverage · DriftsforpliktelseFor every (club, age_group) with at least one eligible team, the club receives at least one hosting responsibility in that age group during the season whenever the number of tournaments makes it mathematically possible. A durable, age-group withdrawal removes the retiring team from that eligible pool, so it no longer creates a hosting obligation no operation could satisfy. This is club x age-group coverage, not aggregate club hosting. A structural shortfall (fewer tournaments than clubs needing coverage) is surfaced explicitly, never hidden as a soft imbalance. | Påkrevd forpliktelse | klubb × aldersgruppe | Deterministisk plasseringsflyt | ≥1 hjemmeturnering | Oppfylt | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Vertskapets istid må ikke kollidere med en ekstern hallbooking Når vertskapet har en reell kollisjon med en kjent ekstern kalenderbooking som verken planleggeren eller optimeringen klarte å unngå, avvises ikke hele planen — konflikten legges i «Må planlegges manuelt» i stedet. Regel-ID: calendar_interval_classification · Fakta/bevisA host's calendar interval is classified fixed_busy (hard external conflict), movable_busy (host-controlled, requires host confirmation), club_controlled_available (profile-authorized internal allocation, not scraper-proven free), or unclassified. The classification is policy evidence, not a scheduling rule in itself. A promoted season may also carry an explicit event-to-tournament booking association overlay that makes one fixed event non-conflicting only for the associated tournament while that event still covers the tournament's current canonical occupied interval. | Påkrevd forpliktelse | turnering × arena | Deterministisk plasseringsflyt | Ingen kollisjon | 10 uløst: rvv-0024 (Sandefjord Penguins), rvv-0037 (Sandefjord Penguins), rvv-0095 (Frisk Asker), rvv-0102 (Sandefjord Penguins), rvv-0121 (Frisk Asker), rvv-0155 (Frisk Asker), rvv-0157 (Frisk Asker), rvv-0179 (Frisk Asker), rvv-0048 (Frisk Asker), rvv-0128 (Frisk Asker) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Lag under sitt mål for antall turneringsdeltakelser Når et lags faktiske antall turneringer er lavere enn måltallet (oftest fordi det ikke fantes nok ledige turneringsplasser), avvises ikke hele planen — dette er en ikke-blokkerende mangel, ikke istidsarbeid, og rapporteres her i stedet for i «Må planlegges manuelt». Et lag som er planlagt *over* et eksplisitt mål er derimot et hardt verifikatoravvik — se «Deltakelsesmål må ikke overskrides» blant hardkravene. For klubber med flere lag i samme aldersgruppe vurderes klubbens samlede spillerpool; en jevn fordeling mellom lagnavnene er sekundært så lenge klubben har fått sine deltakelsesplasser. Regel-ID: participation_target · Mykt målThe configured per-team/per-half tournament participation target is a desired optimization goal with evidenced relaxation, not an unconditional obligation or hard bound. Attainment is optimized within real season capacity; a capacity-constrained miss is not itself a planning failure. | Påkrevd forpliktelse | lag | Deterministisk plasseringsflyt | Faktisk ≥ mål | 128 avvik: Frisk Asker (2/3), Frisk Asker 1 (Frisk Asker, U11) (4/5), Frisk Asker 1 (Frisk Asker, U12) (5/6), Frisk Asker 1 (Frisk Asker, U8) (2/3), Frisk Asker 1 (Frisk Asker, U9) (3/4), Frisk Asker 1 (Frisk Asker, U9) (3/4), Frisk Asker 2 (Frisk Asker, U10) (2/4), Frisk Asker 2 (Frisk Asker, U11) (4/5), Frisk Asker 2 (Frisk Asker, U11) (4/5), Frisk Asker 2 (Frisk Asker, U8) (1/3), Frisk Asker 2 (Frisk Asker, U8) (2/3), Frisk Asker 2 (Frisk Asker, U9) (3/4), Frisk Asker 2 (Frisk Asker, U9) (3/4), Frisk Asker 3 (Frisk Asker, U10) (2/4), Frisk Asker 3 (Frisk Asker, U11) (2/5), Frisk Asker 3 (Frisk Asker, U12) (3/6), Frisk Asker 3 (Frisk Asker, U12) (5/6), Frisk Asker 4 (Frisk Asker, U10) (2/4), Frisk Asker 4 (Frisk Asker, U11) (4/5), Frisk Asker 4 (Frisk Asker, U9) (3/4), Frisk Asker 5 (Frisk Asker, U10) (2/4), Frisk Asker 5 (Frisk Asker, U8) (1/3), Frisk Asker 6 (2/4), Frisk Asker Orange (Frisk Asker, JU10) (3/4), Frisk Asker Orange (Frisk Asker, JU12) (4/5), Frisk Asker Orange (Frisk Asker, JU12) (4/5), Frisk Asker Svart (Frisk Asker, JU10) (2/4), Frisk Asker Svart (Frisk Asker, JU12) (3/5), Holmen Hockey Blå (Holmen, U10) (3/4), Holmen Hockey Blå (Holmen, U8) (2/3), Holmen Hockey Hvit (Holmen, U10) (3/4), Holmen Hockey Hvit (Holmen, U11) (3/5), Holmen Hockey Hvit (Holmen, U12) (4/6), Holmen Hockey Hvit (Holmen, U12) (4/6), Holmen Hockey Hvit (Holmen, U9) (3/4), Holmen Hockey Rød (Holmen, U10) (1/4), Holmen Hockey Rød (Holmen, U11) (3/5), Holmen Hockey Rød (Holmen, U9) (3/4), Holmen Hockey Sort (Holmen, U10) (3/4), Holmen Hockey Sort (Holmen, U8) (2/3), Holmen Hockey Sort (Holmen, U9) (3/4), Holmen Hockey Sort (Holmen, U9) (3/4), Jar (2/3), Jar Blå (Jar, JU10) (2/4), Jar Blå (Jar, U12) (5/6), Jar Blå (Jar, U12) (4/6), Jar Blå (Jar, U9) (3/4), Jar Blå (Jar, U9) (3/4), Jar Grønn (Jar, U10) (2/4), Jar Grønn (Jar, U11) (2/5), Jar Gul (Jar, U10) (3/4), Jar Gul (Jar, U11) (4/5), Jar Hvit (Jar, JU10) (2/4), Jar Hvit (Jar, U10) (3/4), Jar Hvit (Jar, U12) (4/6), Jar Hvit (Jar, U8) (2/3), Jar Lilla (2/5), Jar Rød (Jar, JU10) (3/4), Jar Rød (Jar, JU10) (3/4), Jar Rød (Jar, U10) (3/4), Jar Rød (Jar, U12) (3/6), Jar Rød (Jar, U9) (2/4), Jar Svart (Jar, U10) (2/4), Jar Svart (Jar, U11) (3/5), Jar Svart (Jar, U12) (4/6), Jar Svart (Jar, U12) (5/6), Jar Svart (Jar, U8) (2/3), Jutul Grønn (Jutul, U10) (3/4), Jutul Grønn (Jutul, U11) (3/5), Jutul Grønn (Jutul, U11) (3/5), Jutul Grønn (Jutul, U12) (5/6), Jutul Grønn (Jutul, U12) (5/6), Jutul Grønn (Jutul, U9) (2/4), Jutul Grønn (Jutul, U9) (3/4), Jutul Gul (2/3), Jutul Gul (2/3), Jutul Hvit (Jutul, U8) (1/3), Jutul Hvit (Jutul, U9) (3/4), Jutul Hvit (Jutul, U9) (3/4), Jutul Kittens (2/3), Jutul Rød (Jutul, U10) (3/4), Jutul Rød (Jutul, U11) (3/5), Jutul Rød (Jutul, U12) (5/6), Jutul Rød (Jutul, U8) (1/3), Jutul Rød (Jutul, U9) (3/4), Jutul/Jar Kittens (4/5), Kongsberg (Kongsberg, U10) (3/4), Kongsberg (Kongsberg, U11) (4/5), Kongsberg (Kongsberg, U12) (4/6), Kongsberg (Kongsberg, U8) (2/3), Kongsberg (Kongsberg, U9) (3/4), Kongsberg/Tønsberg (0/5), Kongsberg/Tønsberg (0/5), Ringerike 1 (Ringerike, JU10) (3/4), Ringerike 1 (Ringerike, JU12) (3/5), Ringerike 1 (Ringerike, JU8) (0/3), Ringerike 1 (Ringerike, JU8) (0/3), Ringerike 1 (Ringerike, U10) (3/4), Ringerike 1 (Ringerike, U12) (5/6), Ringerike 1 (Ringerike, U12) (4/6), Ringerike 1 (Ringerike, U8) (2/3), Ringerike 2 (Ringerike, JU12) (4/5), Ringerike 2 (Ringerike, U10) (3/4), Ringerike 2 (Ringerike, U12) (5/6), Ringerike 2 (Ringerike, U8) (2/3), Ringerike 3 (2/4), Ringerike 4 (2/4), Ringerike Gul (2/5), Sandefjord (Sandefjord Penguins, U11) (4/5), Sandefjord (Sandefjord Penguins, U9) (3/4), Skien (Skien, JU10) (2/4), Skien (Skien, JU12) (4/5), Skien (Skien, JU8) (2/3), Skien (Skien, U11) (3/5), Skien (Skien, U11) (4/5), Skien (Skien, U8) (2/3), Skien (Skien, U9) (3/4), Tønsberg (Tønsberg, U10) (2/4), Tønsberg (Tønsberg, U8) (2/3), Tønsberg (Tønsberg, U9) (3/4), Tønsberg (Tønsberg, U9) (3/4), Tønsberg Grå (Tønsberg, U11) (4/5), Tønsberg Grå (Tønsberg, U12) (5/6), Tønsberg Grå (Tønsberg, U12) (5/6), Tønsberg Hvit (Tønsberg, U12) (5/6), Tønsberg Rød (Tønsberg, U11) (2/5), Tønsberg Rød (Tønsberg, U12) (5/6), Tønsberg Rød (Tønsberg, U12) (4/6). 9 lag har en intern fordelingsulikhet i en aldersgruppe der klubben samlet har fått sine deltakelsesplasser (ikke en manglende deltakelse). | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Vertskap skal velges blant deltakerne, ikke omvendt Vertskap/arena velges kun blant klubbene som faktisk deltar i turneringen. Når ingen av deltakernes klubber har en lovlig ledig arena-/tidsluke, blir turneringen ikke automatisk plassert hos en urelatert klubb, deltakerlisten endres ikke for å passe en urelatert arena, og det opprettes ingen falsk turnering på ønsket dato/arena -- den legges i «Må planlegges manuelt» i stedet. Det ansvarlige vertskapet forblir synlig som en uløst plassering. Regel-ID: tournament_placement_obligation · DriftsforpliktelseA scheduled tournament's host is chosen among its participants; when no legal and trustworthy slot exists for the responsible host, the obligation stays unresolved for manual placement instead of being given to an unrelated club. | Påkrevd forpliktelse | turnering | Deterministisk plasseringsflyt | 0 uløste plasseringer | 9 uløst: U12 (2026-10-17), U11 (2026-11-07), U9 (2026-11-28), U11 (2026-12-06), U11 (2027-02-20), U12 (2027-03-14), U12 (2026-12-27), U10 (2026-12-27), U10 (2026-12-26) |
Optimeres, men avgjør ikke om planen er gyldig.
| Regel | Type | Omfang | Eier / håndhevelse | Konfigurert verdi / mål | Status | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Kamper per lag Største spredning i én aldersgruppe er 10 kamper (mellom laget med flest og laget med færrest kamper). | Myk preferanse | lag | Deterministisk måling | 2 | warn — 10 kamper | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Sesongdekning per lag Jar Svart (Jar, U7) har det største oppholdet i sesongdekningen: 17.0 uker (opphold før første turnering). 21 lag totalt overstiger terskelen på 8.0 uker. Regel-ID: temporal_coverage · Mykt målA team's tournaments should cover the season rather than cluster in one stretch. | Myk preferanse | lag | Deterministisk måling | 8.0 | warn — 17.0 uker | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Reisebelastning Lengst reisende lag har 1090 km total reise gjennom sesongen. Regel-ID: travel_distance · Mykt målEstimated team travel between home and away arenas should be kept reasonable. Vis reise per lag
Viser 30 av 140 lag. | Myk preferanse | lag | Deterministisk måling | 4000 | pass — 1090km | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Motstandervariasjon Snittet av unik motstanderdekning er 0.943. Regel-ID: opponent_repetition · Mykt målTeams should meet diverse opponents; repeated pairings beyond the configured expectation are minimized. The primary opponent identity is the opposing club within an age group, not the exact squad label, so a swap between sibling squads is not a new opponent. Exact squad-pair counts remain available as diagnostics. | Myk preferanse | lag | Deterministisk måling | 0.75 | pass — 0.943 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Nye matchups Andel nye kampoppsett er 0.453. Regel-ID: opponent_repetition · Mykt målTeams should meet diverse opponents; repeated pairings beyond the configured expectation are minimized. The primary opponent identity is the opposing club within an age group, not the exact squad label, so a swap between sibling squads is not a new opponent. Exact squad-pair counts remain available as diagnostics. | Myk preferanse | aldersgruppe | Deterministisk måling | 0.25 | pass — 0.453 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Månedsbalanse Månedsbalansen er 0.729. | Myk preferanse | sesong | Deterministisk måling | 0.75 | warn — 0.729 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Klubblast per uke maks 4 turneringer fra samme klubb i samme kalenderuke Regel-ID: temporal_spacing · Mykt målA fixed team's tournaments, or the distributable load of an explicitly rotatable sibling pool, should be spaced sensibly; very short turnaround gaps are minimized. | Myk preferanse | klubb/uke | Deterministisk måling | 3 | warn — 4 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Sammenhengende vertskapshelger Jar har 4 sammenhengende helger som vertskap. Regel-ID: temporal_spacing · Mykt målA fixed team's tournaments, or the distributable load of an explicitly rotatable sibling pool, should be spaced sensibly; very short turnaround gaps are minimized. | Myk preferanse | klubb | Deterministisk måling | 2 | warn — 4 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Feriehelgelast Tønsberg har 0 turnering(er) i ferie-/helligdagshelger. | Myk preferanse | klubb | Deterministisk måling | 2 | pass — 0 |
Kontekstuelle avgjørelser, ikke generelle regler.
| Regel | Type | Omfang | Eier / håndhevelse | Konfigurert verdi / mål | Status |
|---|---|---|---|---|---|
| Deltakelsesmål per aldersgruppe (før/etter jul) Hver aktiv aldersgruppe har et konfigurert mål for antall turneringsdeltakelser per lag, uavhengig før og etter nyttår. Dette er det autoritative målet — ikke en vekt for å fordele et sesongtotalt turneringsantall — og brukes direkte av planleggeren, CP-SAT-optimaliseringen og verifikatoren. Regel-ID: participation_target · Mykt målThe configured per-team/per-half tournament participation target is a desired optimization goal with evidenced relaxation, not an unconditional obligation or hard bound. Attainment is optimized within real season capacity; a capacity-constrained miss is not itself a planning failure. | Beslutning/unntak | aldersgruppe | input_workbook | JU10: 4 før jul / 4 etter jul; JU12: 5 før jul / 5 etter jul; JU8: 3 før jul / 3 etter jul; U10: 4 før jul / 4 etter jul; U11: 5 før jul / 5 etter jul; U12: 6 før jul / 6 etter jul; U7: 0 før jul / 3 etter jul; U8: 3 før jul / 3 etter jul; U9: 4 før jul / 4 etter jul | Konfigurert |
| Forholdsmessig deltakelsesfordeling per klubb Deltakelse fordeles forholdsmessig etter hvor mange lag klubben har registrert i aldersgruppen. Innen klubben roteres deltakelsen så jevnt som mulig. Det nominelle deltakelsesmålet per lag brukes til å dimensjonere og balansere sesongen, men mindre individuelle avvik er akseptable når klubbens samlede andel er rettferdig og kapasiteten ellers er begrenset. Regel-ID: intra_club_participation_distribution · Mykt målWithin a multi-team club and age group, participation is rotated evenly across the club's sibling team labels. An aggregate-complete but label-uneven pool is a distribution imbalance, not a missing participation opportunity. | Beslutning/unntak | klubb × aldersgruppe | Deterministisk plasseringsflyt | Faktisk andel ≈ registrert andel | 116 klubb/aldersgruppe-rader |
| Delt vertskap: Kongsberg/Tønsberg (JU12) Kongsberg carries much lower total hosting burden (8 vs 19) despite already hosting this JU12 registration once; overall fairness across all age groups outweighs the single-registration count. | Beslutning/unntak | delt klubbregistrering | LLM/kontroller | Kongsberg | Løst av harness |
Generert fra den kanoniske regelkatalogen (tournament_scheduler/rules/catalog.py). Radene over viser kjøringens resultat; denne tabellen er den ene autoritative semantikken (klasse, betydning, eier, presedens) som kjøringen og agenten refererer til.
| Regel-ID | Klasse | Betydning | Kanonisk eier | Presedens |
|---|---|---|---|---|
team_age_group_exact | Hardt krav | Every team participating in a tournament belongs to that tournament's age group. | tournament_scheduler.planning.contract | — |
team_unique_in_tournament | Hardt krav | A team may appear at most once in a single tournament. | tournament_scheduler.planning.contract | — |
team_unique_per_date | Hardt krav | A team may not be scheduled in two different tournaments on the same date. | tournament_scheduler.planning.contract | — |
tournament_roster_shape | Hardt krav | A tournament has an admissible, avoidable-by-free participant shape: even teams and no pause/bye rounds (or the exact age-group team count where configured). An input-constrained scarce shape is surfaced separately, never as a soft preference. An active season/age-group participation withdrawal also makes the team ineligible for the whole age group until it is explicitly released. | tournament_scheduler.shape.effective_shape | — |
tournament_durable_identity | Hardt krav | Every active tournament carries exactly one non-empty durable id, active ids are unique, and every lineage, manual pin or operator-waiver reference names a known tournament id. Ids are opaque lifecycle identifiers and are never derived from mutable placement fields. Structural: never operator-waivable. | tournament_scheduler.shape.identity | — |
club_hard_max | Hardt krav | At most three teams from one club may participate in one tournament. | tournament_scheduler.planning.contract | — |
tournament_ice_booking_duration | Hardt krav | A tournament's configured ice_time_minutes is the complete hall occupancy window. It must be at least the actual rounds times round length plus the per-round changeover buffer. A proposed placement must also meet any governing per-series-round booking floor; a source-confirmed accepted booking interval below that floor or below the planned round structure is recorded exactly at the reconciliation boundary and surfaced as a durable feasibility finding (the plan must adapt, not the recorded booking), not a new-placement planning violation. The accepted interval stays factual even when its format is operationally unusable; that concern remains a separate durable finding/action. | tournament_scheduler.shape.occupancy | — |
arena_interval_non_overlap | Hardt krav | Two tournaments must never require the same arena in overlapping datetime intervals. A failure to evaluate the interval data is itself a blocking verification result, not a silent pass. | tournament_scheduler.booking.arena_conflicts | — |
tournament_capacity | Hardt krav | A tournament must not exceed its configured participant capacity. | tournament_scheduler.planning.contract | — |
tournament_min_size | Hardt krav | A tournament with enough registered teams in its age group must have at least three participants. | tournament_scheduler.planning.verification | — |
parallel_capacity | Hardt krav | A tournament must not schedule more concurrent games than the configured parallel capacity. | tournament_scheduler.planning.verification | — |
registered_teams_only | Hardt krav | Every RVV participant of a tournament must exist in the registered roster (guests are explicit, separate places). | tournament_scheduler.planning.contract | — |
valid_tournament_date | Hardt krav | A tournament must carry a parseable date; a missing/invalid date is structural corruption. | tournament_scheduler.planning.contract | — |
date_within_window | Hardt krav | Every tournament date lies inside the configured planning/season window. | tournament_scheduler.planning.contract | — |
holiday_date_admissible | Hardt krav | Tournaments must not be scheduled on canonically excluded holiday dates for the planning window. | tournament_scheduler.planning.date_policy | — |
banned_dates_not_used | Hardt krav | Tournaments must not be scheduled on an operator-banned global date. | tournament_scheduler.season.banned_dates | — |
excluded_host_club_not_used | Hardt krav | A club explicitly excluded as host for a scope must not host there. | tournament_scheduler.planning.contract | — |
host_representation | Hardt krav | A tournament's host club must be represented by its own participating team (shared/joint registrations count for either constituent). This is the hard representation invariant; proportional hosting balance is a separate soft objective. | tournament_scheduler.hosting.representation | før hosting_age_group_coverage, hosting_proportional_balance |
locked_date_preserved | Hardt krav | A canonical locked date must still have a scheduled tournament. | tournament_scheduler.season.baseline_overlay | — |
pinned_tournament_preserved | Hardt krav | A pinned tournament id must remain present in the candidate. | tournament_scheduler.season.baseline_overlay | — |
canonical_locked_tournament_preserved | Hardt krav | An approved/placement-locked canonical tournament must not be dropped by replanning. | tournament_scheduler.season.baseline_overlay | — |
canonical_placement_preserved | Hardt krav | A placement-locked canonical tournament keeps its protected placement fields. | tournament_scheduler.season.baseline_overlay | — |
canonical_participants_preserved | Hardt krav | A participant-locked canonical tournament keeps its protected participant list. | tournament_scheduler.season.baseline_overlay | — |
accepted_change_protection | Hardt krav | The protected intent of an accepted maintenance change (a team's must/must-not participation, or an accepted placement field) survives later canonical mutations until an operator explicitly releases or supersedes it. A protection guards the exact result of one accepted change; it is neither the semantic request nor a baseline approval lock. | tournament_scheduler.season.change_protections | — |
participation_hard_max | Hardt krav | An explicitly configured participation hard maximum is a legality boundary and is operator-waivable. It is separate from the ordinary participation target, which is a soft objective and never a hard cap. | tournament_scheduler.participation.targets | — |
game_team_membership | Hardt krav | Every exported game is between two declared participants of its tournament. | tournament_scheduler.planning.verification | — |
valid_game_record | Hardt krav | Every exported game record is a well-formed object with distinct participants. | tournament_scheduler.planning.verification | — |
game_round_integrity | Hardt krav | Every exported game has a valid positive round number. | tournament_scheduler.planning.verification | — |
game_integrity_ambiguous_participants | Hardt krav | A tournament's participant labels must be present and unique before game integrity can be judged. | tournament_scheduler.planning.verification | — |
round_robin_pairing | Hardt krav | A round-robin tournament plays every required pairing exactly once. | tournament_scheduler.planning.verification | — |
team_unique_per_round | Hardt krav | A team plays at most one game per round. | tournament_scheduler.planning.verification | — |
tournament_round_count | Hardt krav | A limited-rounds tournament produces exactly the effective configured round count. | tournament_scheduler.planning.verification | — |
intra_club_game_minimum | Hardt krav | Same-club matchups are limited to the minimum required by the limited-rounds format. | tournament_scheduler.planning.verification | — |
request_team_unavailable | Hardt krav | A durable operator request constraint: the team must not play inside its declared unavailable date range. | tournament_scheduler.season.request_constraints | — |
request_minimum_gap | Hardt krav | A durable operator request constraint: the team must keep at least the requested days between tournaments. | tournament_scheduler.season.request_constraints | — |
request_opponent_avoidance | Hardt krav | A durable operator request constraint: two teams must not meet inside the declared date range. | tournament_scheduler.season.request_constraints | — |
hosting_age_group_coverage | Driftsforpliktelse | For every (club, age_group) with at least one eligible team, the club receives at least one hosting responsibility in that age group during the season whenever the number of tournaments makes it mathematically possible. A durable, age-group withdrawal removes the retiring team from that eligible pool, so it no longer creates a hosting obligation no operation could satisfy. This is club x age-group coverage, not aggregate club hosting. A structural shortfall (fewer tournaments than clubs needing coverage) is surfaced explicitly, never hidden as a soft imbalance. | tournament_scheduler.hosting.coverage.hosting_targets_with_coverage_floor | før hosting_proportional_balance · avhenger av host_representation |
hosting_responsibility | Driftsforpliktelse | Once a hosting responsibility is assigned, calendar convenience must not silently transfer it to another club. If the responsible host has no verified automatic slot, the responsibility is preserved and the tournament becomes MANUAL PLACEMENT REQUIRED rather than moving the burden. This is a cross-path invariant over placement/repair/search. | tournament_scheduler.hosting.responsibility | avhenger av hosting_age_group_coverage |
tournament_placement_obligation | Driftsforpliktelse | A scheduled tournament's host is chosen among its participants; when no legal and trustworthy slot exists for the responsible host, the obligation stays unresolved for manual placement instead of being given to an unrelated club. | tournament_scheduler.placement.normalization | — |
guest_reservation_integrity | Driftsforpliktelse | A reserved guest place is a deliberate capacity reservation that counts toward capacity/ice-time shape but never toward RVV participation, hosting, fairness or travel; participant optimization/repair cannot consume it. | tournament_scheduler.shape.guest_slots | — |
hosting_proportional_balance | Mykt mål | After the age-group coverage floor is satisfied (or a structural shortfall is explicitly surfaced), remaining hosting responsibility is distributed roughly in proportion to eligible team counts. This objective is secondary to coverage: a larger club may legitimately under-host relative to its proportional target so a smaller club gets its first responsibility. | tournament_scheduler.hosting.coverage.hosting_balance_matrix | avhenger av hosting_age_group_coverage |
participation_target | Mykt mål | The configured per-team/per-half tournament participation target is a desired optimization goal with evidenced relaxation, not an unconditional obligation or hard bound. Attainment is optimized within real season capacity; a capacity-constrained miss is not itself a planning failure. | tournament_scheduler.participation.targets | — |
intra_club_participation_distribution | Mykt mål | Within a multi-team club and age group, participation is rotated evenly across the club's sibling team labels. An aggregate-complete but label-uneven pool is a distribution imbalance, not a missing participation opportunity. | tournament_scheduler.participation.targets | — |
home_representation | Mykt mål | When a multi-team club hosts a tournament, the club's sibling teams take turns representing it. A spread of 0-1 is balanced; hosting coverage/balance is unchanged by which sibling shows up. | tournament_scheduler.participation.home_representation | — |
opponent_repetition | Mykt mål | Teams should meet diverse opponents; repeated pairings beyond the configured expectation are minimized. The primary opponent identity is the opposing club within an age group, not the exact squad label, so a swap between sibling squads is not a new opponent. Exact squad-pair counts remain available as diagnostics. | tournament_scheduler.scoring.quality_objectives | — |
opponent_club_diversity | Mykt mål | Each individual squad should meet a variety of opposing clubs within its age group. Exposure to one club is normalized by that club's squad supply, so a large multi-squad club is not penalized merely for supplying more opponents, while genuinely concentrated exposure remains visible. | tournament_scheduler.participation.opponent_diversity | — |
inter_club_diversity | Mykt mål | Tournaments should mix teams across clubs rather than concentrating same-club matchups. | tournament_scheduler.scoring.quality_objectives | — |
temporal_spacing | Mykt mål | A fixed team's tournaments, or the distributable load of an explicitly rotatable sibling pool, should be spaced sensibly; very short turnaround gaps are minimized. | tournament_scheduler.participation.team_schedule_quality | — |
rotatable_participant_pool | Mykt mål | Only explicitly declared club + age-group sibling pools may distribute participant opportunities across labels; unavoidable congestion, deprivation, and extreme label imbalance remain regressions. | tournament_scheduler.participation.participant_pool_consequences | — |
temporal_coverage | Mykt mål | A team's tournaments should cover the season rather than cluster in one stretch. | tournament_scheduler.participation.temporal_coverage | — |
travel_distance | Mykt mål | Estimated team travel between home and away arenas should be kept reasonable. | tournament_scheduler.clubs.distances | — |
shared_host_choice | Operatørbeslutning | A joint registration such as Kongsberg/Tønsberg can genuinely require a contextual choice of which constituent physically carries the shared hosting responsibility. This is the limited case where agent/operator judgment over deterministic registration facts is legitimate. | tournament_scheduler.hosting.shared_decision | avhenger av hosting_age_group_coverage, hosting_responsibility |
operator_waiver | Operatørbeslutning | An authorized operator may explicitly waive a classified hard planning rule for a precise scope. The planner/agent may suggest but never create or broaden a waiver; waived violations stay visible and downgrade publication readiness. | tournament_scheduler.season.waivers | — |
operator_accepted_participation_deviation | Operatørbeslutning | An operator may deliberately live with a bounded participation deviation. The acceptance never changes the target or the schedule, is bound to the deviation scope/magnitude and becomes stale when the target changes or the deviation worsens. | tournament_scheduler.participation.targets | — |
manual_placement_opt_in | Operatørbeslutning | An automatic canonical mutation may not newly introduce a manual/unt trusted-calendar placement or host-confirmation dependency. A deliberate provisional placement requires the exact explicit opt-in and is audited. | tournament_scheduler.season.acceptability | — |
guest_slot_reservation | Operatørbeslutning | The operator reserves guest places as intent; the selection among legal alternatives is recorded as a decision. | tournament_scheduler.shape.guest_slots | — |
season_quality_baseline | Operatørbeslutning | An operator may accept the current set and severity of non-hard findings as the season's regression reference. The baseline records stable finding ids and measurements (never aggregate counts alone), so later maintenance classifies fresh findings as known/improved/resolved/regressed/new. It never suppresses hard verification failures and never changes the schedule. | tournament_scheduler.season.accepted_baseline | — |
operator_banned_date | Operatørbeslutning | The operator may ban a global date as unusable for every tournament; the ban is durable policy, not a one-off. | tournament_scheduler.season.banned_dates | — |
operator_holiday_date_exception | Operatørbeslutning | The operator may allow one date that is excluded only by the derived holiday/date policy; the exception does not override explicit banned dates. | tournament_scheduler.season.holiday_exceptions | — |
operator_ice_time_override | Operatørbeslutning | The operator may bind a host-confirmed per-tournament occupied duration that differs from the age-group default. Direct manual overrides are explicit, revision-bound and may not go below the actual-round format minimum or governing booking floor. An accepted authoritative calendar association may also bind the source event's exact interval first and surface any format/governing feasibility concern separately. | tournament_scheduler.season.ice_time_overrides | — |
calendar_source_trust | Fakta/bevis | A per-club calendar is only trustworthy when the configured source produced usable evidence this run. A 'known' status does not prove every candidate time is free; an untrusted calendar yields manual placement, never a silent pass. | tournament_scheduler.pipeline.source_health | — |
club_venue_profile | Fakta/bevis | Durable club-specific venue resource footprints and internal-allocation availability are validated, evidence-backed repository profiles shared by planning, conflict checking and booking reconciliation; a club without a profile keeps generic behavior. | tournament_scheduler.clubs.profiles | — |
calendar_interval_classification | Fakta/bevis | A host's calendar interval is classified fixed_busy (hard external conflict), movable_busy (host-controlled, requires host confirmation), club_controlled_available (profile-authorized internal allocation, not scraper-proven free), or unclassified. The classification is policy evidence, not a scheduling rule in itself. A promoted season may also carry an explicit event-to-tournament booking association overlay that makes one fixed event non-conflicting only for the associated tournament while that event still covers the tournament's current canonical occupied interval. | tournament_scheduler.booking.calendar_availability / tournament_scheduler.booking.calendar_bookings | — |
club_pool_classification | Fakta/bevis | For each club x age group x scope, the registered teams' aggregate target/actual is classified as complete / intra_club_distribution / minor|material_club_pool_shortfall / single_team_deviation / over_target. The classification is the single source of truth for whether a residual is a genuine player-pool shortage. | tournament_scheduler.participation.targets | — |
search_coverage_evidence | Fakta/bevis | A bounded repair/search result records what was actually tried: option_available, search_incomplete, bounded_search_exhausted, proven_infeasible or inapplicable, bound to a search capability/version. Zero options means only that this search found none, never proof of global infeasibility. | tournament_scheduler.repair.capability | — |
approval_lifecycle | Fakta/bevis | Operator approvals/locks live in decisions.json separately from schedule facts. A changed placement fingerprint becomes a stale approval whose lock is dropped; a participant-locked approval also stales when its roster/game structure changes. An approval whose tournament is gone becomes orphaned. Both require re-review. | tournament_scheduler.season.baseline_overlay | — |
verification_completeness | Fakta/bevis | Verification reports which checks were skipped because their required input was unavailable. An incomplete verification is never a pass. | tournament_scheduler.planning.contract | — |