RVV

Regler 2026-2027

RVV Hockey — U7 + JU8 + U8 + U9 + JU10 + U10 + U11 + JU12 + U12 · hva styrte planen?
169 turneringer
2153 kamper
140 lag

Regler

Regler

Hva styrte planen, ble kravene oppfylt, hva krever manuell handling, og hvilke kvalitetsavveininger eller eksplisitte beslutninger ble akseptert?

  • ⚠ Harde krav: 12/13 oppfylt
  • ⚠ Uløste forpliktelser: 4 → Må planlegges manuelt
  • ⚠ Sterke driftsmål-avvik: 1
  • ⚠ Myke kvalitetsvarsler: 5

Hard krav

Må være sant for at planen skal være gyldig.

RegelTypeOmfangEier / håndhevelseKonfigurert verdi / målStatus
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 krav
Every team participating in a tournament belongs to that tournament's age group.
Hard kravlag × turneringDeterministisk verifikatorEksakt matchOppfylt
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 krav
A team may not be scheduled in two different tournaments on the same date.
Hard kravlag × datoDeterministisk verifikatorMaks 1 turnering per lag per datoOppfylt
Turneringsdatoer må ligge innenfor planleggingsvinduet
Alle turneringer skal ha en dato innenfor sesongens start-/sluttdato.
Regel-ID: date_within_window · Hardt krav
Every tournament date lies inside the configured planning/season window.
Hard kravturneringDeterministisk verifikator2026-10-10 – 2027-03-28Oppfylt
Helligdagsdatoer må ikke brukes
Turneringer skal ikke legges i ferie-/helligdagshelger eller helgen rett foran en helligdag.
Regel-ID: holiday_date_admissible · Hardt krav
Tournaments must not be scheduled on canonically excluded holiday dates for the planning window.
Hard kravdatoDeterministisk verifikator10 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 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.
Hard kravarena/tidDeterministisk verifikator0 kollisjonerIngen 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 krav
Tournaments must not be scheduled on an operator-banned global date.
Hard kravdatoDeterministisk verifikatorIngen konfigurertOppfylt
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 krav
A club explicitly excluded as host for a scope must not host there.
Hard kravklubbDeterministisk verifikatorIngen konfigurertOppfylt
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 krav
A canonical locked date must still have a scheduled tournament.
Hard kravdatoDeterministisk verifikatorIngen konfigurertOppfylt
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 krav
A pinned tournament id must remain present in the candidate.
Hard kravturneringDeterministisk verifikatorIngen konfigurertOppfylt
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/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.
Hard kravklubbDeterministisk plasseringsflytKun «known» godkjennes automatiskIngen — 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 krav
Every RVV participant of a tournament must exist in the registered roster (guests are explicit, separate places).
Hard kravlagDeterministisk verifikatorKun registrerte lagHå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 krav
A tournament must not exceed its configured participant capacity.
Hard kravturneringDeterministisk verifikator≤ konfigurert kapasitetHå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 kravsesongDeterministisk verifikator1. januarHåndheves ved planlegging

Sterke driftsmål

Skal oppfylles når det er rimelig gjennomførbart; begrenset avvik tillates med synlig unngåelighetsstatus.

RegelTypeOmfangEier / håndhevelseKonfigurert verdi / målStatus
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å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.
Vis avvik per lag
LagOmrådeRetningFaktiskMålUnngåelighet
Frisk Asker 1after_christmasover43bounded_search_exhausted
Frisk Asker 1after_christmasunder56bounded_search_exhausted
Frisk Asker 1after_christmasunder34bounded_search_exhausted
Frisk Asker 1after_christmasunder45bounded_search_exhausted
Frisk Asker 2after_christmasunder23bounded_search_exhausted
Frisk Asker 2after_christmasover54bounded_search_exhausted
Frisk Asker 2after_christmasunder45bounded_search_exhausted
Frisk Asker 2after_christmasunder34bounded_search_exhausted
Frisk Asker 3after_christmasover54bounded_search_exhausted
Frisk Asker 3after_christmasover65bounded_search_exhausted
Frisk Asker 3after_christmasunder56bounded_search_exhausted
Frisk Asker 4after_christmasunder34bounded_search_exhausted
Frisk Asker 5after_christmasunder34bounded_search_exhausted
Frisk Asker 5after_christmasunder13bounded_search_exhausted
Frisk Asker 6after_christmasunder34bounded_search_exhausted
Frisk Asker Orangeafter_christmasunder45bounded_search_exhausted
Holmen Hockey Blåafter_christmasover43bounded_search_exhausted
Holmen Hockey Hvitafter_christmasover43bounded_search_exhausted
Holmen Hockey Hvitafter_christmasunder46bounded_search_exhausted
Holmen Hockey Rødafter_christmasover75bounded_search_exhausted
Holmen Hockey Rødafter_christmasover54bounded_search_exhausted
Holmen Hockey Sortafter_christmasover54bounded_search_exhausted
Holmen Hockey Sortafter_christmasunder34bounded_search_exhausted
Jar Blåafter_christmasunder46bounded_search_exhausted
Jar Blåafter_christmasunder34bounded_search_exhausted
Jar Grønnafter_christmasover54bounded_search_exhausted
Jar Grønnafter_christmasover65bounded_search_exhausted
Jar Gulafter_christmasover65bounded_search_exhausted
Jar Hvitafter_christmasover43bounded_search_exhausted
Jar Hvitafter_christmasunder45bounded_search_exhausted

Viser 30 av 164 rader.

Sterkt driftsmållagDeterministisk verifikatorFaktisk ≈ 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)

Påkrevde forpliktelser

Kan stå uløst, men krever manuell oppfølging.

RegelTypeOmfangEier / håndhevelseKonfigurert verdi / målStatus
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å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.
Vis vertskapsfordeling
AldersgruppeKlubbFaktiskForventetAvvik
U10Frisk Asker107.682.32
U9Jutul53.02.0
JU12Frisk Asker64.571.43
JU12Jutul12.291.29
JU12Tønsberg01.141.14
U10Ringerike45.121.12
U11Tønsberg65.01.0
U9Jar23.01.0
U9Ringerike01.01.0
U12Kongsberg22.880.88
U7Jar11.880.88
JU12Kongsberg21.140.86
JU8Frisk Asker21.20.8
U8Jutul22.780.78
U10Jar77.680.68
U11Skien11.670.67
U7Sandefjord Penguins10.380.62
U7Tønsberg10.380.62
JU10Jar43.430.57
U12Jar1111.530.53

Viser 20 av 62 rader (størst avvik først).

Påkrevd forpliktelseklubbDeterministisk måling1warn — 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 · 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.
Påkrevd forpliktelseklubb × aldersgruppeDeterministisk plasseringsflyt≥1 hjemmeturneringOppfylt
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/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.
Påkrevd forpliktelseturnering × arenaDeterministisk plasseringsflytIngen kollisjon10 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å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.
Påkrevd forpliktelselagDeterministisk plasseringsflytFaktisk ≥ mål128 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 · 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.
Påkrevd forpliktelseturneringDeterministisk plasseringsflyt0 uløste plasseringer9 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)

Myke kvalitetsmål

Optimeres, men avgjør ikke om planen er gyldig.

RegelTypeOmfangEier / håndhevelseKonfigurert verdi / målStatus
Kamper per lag
Største spredning i én aldersgruppe er 10 kamper (mellom laget med flest og laget med færrest kamper).
Myk preferanselagDeterministisk måling2warn — 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ål
A team's tournaments should cover the season rather than cluster in one stretch.
Myk preferanselagDeterministisk måling8.0warn — 17.0 uker
Reisebelastning
Lengst reisende lag har 1090 km total reise gjennom sesongen.
Regel-ID: travel_distance · Mykt mål
Estimated team travel between home and away arenas should be kept reasonable.
Vis reise per lag
LagAnslått reise (km)
Tønsberg Hvit (Tønsberg, U12)925
Skien (Skien, JU12)901
Skien (Skien, JU10)706
Sandefjord (Sandefjord Penguins, U11)696
Ringerike Svart667
Tønsberg Grå (Tønsberg, U12)647
Skien (Skien, U9)629
Tønsberg Rød (Tønsberg, U11)620
Ringerike 2 (Ringerike, U12)565
Tønsberg Rød (Tønsberg, U12)561
Tønsberg Grå (Tønsberg, U11)554
Sandefjord (Sandefjord Penguins, U9)552
Ringerike 1 (Ringerike, U12)541
Sandefjord (Sandefjord Penguins, U8)527
Kongsberg (Kongsberg, U11)518
Jar Lilla509
Tønsberg Hvit (Tønsberg, U11)502
Kongsberg (Kongsberg, U12)496
Jar Gul (Jar, U11)491
Ringerike 1 (Ringerike, U9)477
Tønsberg (Tønsberg, U10)471
Jutul Rød (Jutul, U12)462
Skien (Skien, JU8)461
Skien (Skien, U8)452
Frisk Asker 2 (Frisk Asker, U12)450
Ringerike 2 (Ringerike, JU12)444
Tønsberg (Tønsberg, U8)441
Kongsberg (Kongsberg, U10)433
Frisk Asker Svart (Frisk Asker, JU12)430
Ringerike Gul425

Viser 30 av 140 lag.

Myk preferanselagDeterministisk måling4000pass — 1090km
Motstandervariasjon
Snittet av unik motstanderdekning er 0.943.
Regel-ID: 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.
Myk preferanselagDeterministisk måling0.75pass — 0.943
Nye matchups
Andel nye kampoppsett er 0.453.
Regel-ID: 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.
Myk preferansealdersgruppeDeterministisk måling0.25pass — 0.453
Månedsbalanse
Månedsbalansen er 0.729.
Myk preferansesesongDeterministisk måling0.75warn — 0.729
Klubblast per uke
maks 4 turneringer fra samme klubb i samme kalenderuke
Regel-ID: 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.
Myk preferanseklubb/ukeDeterministisk måling3warn — 4
Sammenhengende vertskapshelger
Jar har 4 sammenhengende helger som vertskap.
Regel-ID: 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.
Myk preferanseklubbDeterministisk måling2warn — 4
Feriehelgelast
Tønsberg har 0 turnering(er) i ferie-/helligdagshelger.
Myk preferanseklubbDeterministisk måling2pass — 0

Beslutninger / unntak for denne kjøringen

Kontekstuelle avgjørelser, ikke generelle regler.

RegelTypeOmfangEier / håndhevelseKonfigurert verdi / målStatus
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å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.
Beslutning/unntakaldersgruppeinput_workbookJU10: 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 julKonfigurert
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.
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.
Beslutning/unntakklubb × aldersgruppeDeterministisk plasseringsflytFaktisk andel ≈ registrert andel116 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/unntakdelt klubbregistreringLLM/kontrollerKongsbergLøst av harness

Regelkatalog (referanse)

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-IDKlasseBetydningKanonisk eierPresedens
team_age_group_exactHardt kravEvery team participating in a tournament belongs to that tournament's age group.tournament_scheduler.planning.contract—
team_unique_in_tournamentHardt kravA team may appear at most once in a single tournament.tournament_scheduler.planning.contract—
team_unique_per_dateHardt kravA team may not be scheduled in two different tournaments on the same date.tournament_scheduler.planning.contract—
tournament_roster_shapeHardt kravA 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_identityHardt kravEvery 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_maxHardt kravAt most three teams from one club may participate in one tournament.tournament_scheduler.planning.contract—
tournament_ice_booking_durationHardt kravA 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_overlapHardt 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.tournament_scheduler.booking.arena_conflicts—
tournament_capacityHardt kravA tournament must not exceed its configured participant capacity.tournament_scheduler.planning.contract—
tournament_min_sizeHardt kravA tournament with enough registered teams in its age group must have at least three participants.tournament_scheduler.planning.verification—
parallel_capacityHardt kravA tournament must not schedule more concurrent games than the configured parallel capacity.tournament_scheduler.planning.verification—
registered_teams_onlyHardt kravEvery RVV participant of a tournament must exist in the registered roster (guests are explicit, separate places).tournament_scheduler.planning.contract—
valid_tournament_dateHardt kravA tournament must carry a parseable date; a missing/invalid date is structural corruption.tournament_scheduler.planning.contract—
date_within_windowHardt kravEvery tournament date lies inside the configured planning/season window.tournament_scheduler.planning.contract—
holiday_date_admissibleHardt kravTournaments must not be scheduled on canonically excluded holiday dates for the planning window.tournament_scheduler.planning.date_policy—
banned_dates_not_usedHardt kravTournaments must not be scheduled on an operator-banned global date.tournament_scheduler.season.banned_dates—
excluded_host_club_not_usedHardt kravA club explicitly excluded as host for a scope must not host there.tournament_scheduler.planning.contract—
host_representationHardt kravA 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.representationfør hosting_age_group_coverage, hosting_proportional_balance
locked_date_preservedHardt kravA canonical locked date must still have a scheduled tournament.tournament_scheduler.season.baseline_overlay—
pinned_tournament_preservedHardt kravA pinned tournament id must remain present in the candidate.tournament_scheduler.season.baseline_overlay—
canonical_locked_tournament_preservedHardt kravAn approved/placement-locked canonical tournament must not be dropped by replanning.tournament_scheduler.season.baseline_overlay—
canonical_placement_preservedHardt kravA placement-locked canonical tournament keeps its protected placement fields.tournament_scheduler.season.baseline_overlay—
canonical_participants_preservedHardt kravA participant-locked canonical tournament keeps its protected participant list.tournament_scheduler.season.baseline_overlay—
accepted_change_protectionHardt kravThe 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_maxHardt kravAn 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_membershipHardt kravEvery exported game is between two declared participants of its tournament.tournament_scheduler.planning.verification—
valid_game_recordHardt kravEvery exported game record is a well-formed object with distinct participants.tournament_scheduler.planning.verification—
game_round_integrityHardt kravEvery exported game has a valid positive round number.tournament_scheduler.planning.verification—
game_integrity_ambiguous_participantsHardt kravA tournament's participant labels must be present and unique before game integrity can be judged.tournament_scheduler.planning.verification—
round_robin_pairingHardt kravA round-robin tournament plays every required pairing exactly once.tournament_scheduler.planning.verification—
team_unique_per_roundHardt kravA team plays at most one game per round.tournament_scheduler.planning.verification—
tournament_round_countHardt kravA limited-rounds tournament produces exactly the effective configured round count.tournament_scheduler.planning.verification—
intra_club_game_minimumHardt kravSame-club matchups are limited to the minimum required by the limited-rounds format.tournament_scheduler.planning.verification—
request_team_unavailableHardt kravA durable operator request constraint: the team must not play inside its declared unavailable date range.tournament_scheduler.season.request_constraints—
request_minimum_gapHardt kravA durable operator request constraint: the team must keep at least the requested days between tournaments.tournament_scheduler.season.request_constraints—
request_opponent_avoidanceHardt kravA durable operator request constraint: two teams must not meet inside the declared date range.tournament_scheduler.season.request_constraints—
hosting_age_group_coverageDriftsforpliktelseFor 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_floorfør hosting_proportional_balance · avhenger av host_representation
hosting_responsibilityDriftsforpliktelseOnce 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.responsibilityavhenger av hosting_age_group_coverage
tournament_placement_obligationDriftsforpliktelseA 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_integrityDriftsforpliktelseA 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_balanceMykt 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.tournament_scheduler.hosting.coverage.hosting_balance_matrixavhenger av hosting_age_group_coverage
participation_targetMykt 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.tournament_scheduler.participation.targets—
intra_club_participation_distributionMykt 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.tournament_scheduler.participation.targets—
home_representationMykt målWhen 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_repetitionMykt 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.tournament_scheduler.scoring.quality_objectives—
opponent_club_diversityMykt målEach 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_diversityMykt målTournaments should mix teams across clubs rather than concentrating same-club matchups.tournament_scheduler.scoring.quality_objectives—
temporal_spacingMykt 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.tournament_scheduler.participation.team_schedule_quality—
rotatable_participant_poolMykt målOnly 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_coverageMykt målA team's tournaments should cover the season rather than cluster in one stretch.tournament_scheduler.participation.temporal_coverage—
travel_distanceMykt målEstimated team travel between home and away arenas should be kept reasonable.tournament_scheduler.clubs.distances—
shared_host_choiceOperatørbeslutningA 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_decisionavhenger av hosting_age_group_coverage, hosting_responsibility
operator_waiverOperatørbeslutningAn 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_deviationOperatørbeslutningAn 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_inOperatørbeslutningAn 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_reservationOperatørbeslutningThe operator reserves guest places as intent; the selection among legal alternatives is recorded as a decision.tournament_scheduler.shape.guest_slots—
season_quality_baselineOperatørbeslutningAn 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_dateOperatørbeslutningThe 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_exceptionOperatørbeslutningThe 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_overrideOperatørbeslutningThe 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_trustFakta/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.tournament_scheduler.pipeline.source_health—
club_venue_profileFakta/bevisDurable 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_classificationFakta/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.tournament_scheduler.booking.calendar_availability / tournament_scheduler.booking.calendar_bookings—
club_pool_classificationFakta/bevisFor 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_evidenceFakta/bevisA 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_lifecycleFakta/bevisOperator 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_completenessFakta/bevisVerification reports which checks were skipped because their required input was unavailable. An incomplete verification is never a pass.tournament_scheduler.planning.contract—