---
name: slide-durata-vera
description: "La slide del carosello che confronta la durata reale delle partite di Paolo con quella dichiarata sulla scatola, e le regole di calcolo"
metadata: 
  node_type: memory
  type: project
  originSessionId: c3e2fc4c-be09-400e-b164-29944c983cf8
  modified: 2026-08-21T16:53:45.452Z
---

Slide del carosello di [[progetto-instagram-bg-perspective]] che mostra **quanto dura davvero un gioco** al tavolo di Paolo, confrontato con la durata stampata sulla scatola. Approvata il 2026-08-21. È il contenuto più differenziante del canale: nessun altro account italiano ha sei anni di partite cronometrate.

**Fonte**: export BG Stats (`.bgsplay`, JSON). 2388 partite, il 98,7% con durata registrata. Ogni gioco ha `bggId`, quindi si aggancia al portale senza passare dai nomi. Incrociando con l'archivio foto: **164 giochi fotografati hanno 3+ partite cronometrate, 129 ne hanno 5+**, solo 29 non sono mai stati giocati.

**Forma scelta**: istogramma verticale, una colonna per numero di giocatori, con il numero grande sotto ogni colonna e l'etichetta ("in due", "in tre"). La durata dichiarata sulla scatola è una **linea orizzontale tratteggiata** che attraversa il grafico: quando una colonna la buca, il gioco dura più di quanto promette. Le colonne sono spente (#7a6740) tranne la più alta, che è ambra #E0A340: l'occhio va dove il gioco si allunga.

Misure su canvas 1080×1440: colonne alte **520**, numeri Bebas 29px in scala mockup, apice dei minuti in alto (`vertical-align:top`) e non centrato, etichetta della soglia allineata a **sinistra** (a destra collide con la colonna più alta).

**Regole di calcolo, tassative**:
- **mediana**, mai la media: una partita interrotta non deve spostare il numero
- servono almeno **3 partite per configurazione**, e almeno due configurazioni
- **arrotondamento a scaletta**, deciso con Paolo il 2026-09-01: fino a 30′ il valore esatto, ai 5 fino a 60′, ai 10 fino a 120′, ai **15** sopra
- le colonne seguono il valore mostrato, non quello vero

**Why:** l'arrotondamento secco su un gioco da un quarto d'ora cancella differenze reali. Draftosaurus diventa 15, 10, 10, 15 e il grafico si ritrova due colonne ambra invece di una. Dall'altro lato nessuno dice "una partita da 65 minuti": o 60 o 70.

**Ai 15 e non ai 20 sopra le due ore.** Col passo da 20 Brass fa 140 in tre e 140 in quattro: le colonne vengono uguali e la slide non dice piu' niente. Coi 15 restano 135 e 150, e i valori cadono su 120, 135, 150, 165, 180, che si leggono come ore e quarti.

**Non si usa `round()`**, che in Python pareggia al pari: `round(10.5)` fa 10, quindi 105 minuti sarebbero diventati 100 e 115 invece 120. Si usa `math.floor(x / passo + 0.5) * passo`.

**Quando la slide NON va messa.** Se tutte le colonne stanno dentro a quello che promette la scatola, il grafico ripete la riga "Durata" che sta gia' in copertina e sulla slide della scatola. Deciso da Paolo guardando Century, che dichiara 30-45 e al tavolo fa 29, 30, 40, 40: *"se la scatola dice il giusto non dobbiamo dirlo lo stesso, sarebbe una ripetizione"*.

`merita_durata()` in `slide.py` chiede uno scarto **sia in percentuale sia in minuti**: almeno il 20% e almeno 10 minuti oltre il massimo dichiarato, o sotto il minimo. La sola percentuale fa passare i giochi corti, dove Draftosaurus a 8 minuti contro 15 dichiarati e' il 47% ma sono sette minuti e nessuno se ne accorge.

**Posizione nel carosello: sesta, subito dopo la slide della scatola.**

**Esempi forti trovati nei dati**: Wingspan dichiara 80 fissi, da 45 in due a 95 in cinque. Stone Age **non regge piu' come esempio**: verificato il 2026-09-05, la scatola dichiara 60-90 e le nostre mediane in due, tre e quattro (60, 70, 75) ci stanno dentro. Sfora solo in cinque, 120 su 3 partite, che e' rumore. Clans of Caledonia dichiara 90-120, in quattro 130. Faraway dichiara 15-25 e mantiene, su 70 partite.

## Costruita davvero il 2026-09-01

Per sedici post questa slide non e' esistita: il progetto era in memoria ma in `slide.py` non c'era nessuna funzione, e l'export BG Stats `.bgsplay` da cui doveva venire il dato era sparito dal disco (quasi certamente in `/tmp`). Me l'ha chiesto Paolo dopo il sedicesimo post, non me ne sono accorto da solo.

**Il dato adesso arriva dal portale, non da un file.** Paolo ha aggiunto a `GET /api/gioco/{bggId}` il campo **`partiteStats`**, documentato in `~/Desktop/api-portale-bgg.md`:

```json
"partiteStats": { "considerate": 40, "perGiocatori": [
  { "giocatori": 2, "partite": 12, "durataMedia": 49, "durataMediana": 48 } ] }
```

L'endpoint applica gia' tutti i filtri che prima erano a carico nostro: via i doppioni della stessa serata registrata da piu' persone, via le partite senza durata o senza punteggi, via i solitari se il gioco si gioca anche in compagnia, via le durate impossibili (sopra il triplo del massimo dichiarato, sotto un sesto del minimo, o 5 e 600 dove BGG non dichiara).

**Attenzione alla cache**: `portale.py` tiene i JSON su disco in `cache_api/`, e quelli salvati prima del 2 settembre 2026 non hanno `partiteStats`. Va forzato `usa_cache=False` la prima volta.

`durata(stats, min_scatola, max_scatola, strillo=..., min_partite=3, nota=None)` in `slide.py`. Due cose decise guardando i primi rendering:

- **L'etichetta della soglia sta in legenda sotto il titolo**, non dentro al grafico. Appoggiata sulla riga tratteggiata sembrava l'etichetta della prima colonna.
- **A parita' si accende solo la colonna piu' a destra.** Century in quattro fa 40 e in cinque 42, che arrotondati pareggiano: due colonne ambra tolgono all'accento il suo lavoro, che e' dire dove il gioco si allunga.

**Dei sedici giochi gia' pronti, questi hanno abbastanza partite** (soglia: 3 per configurazione, almeno due configurazioni):

| gioco | scatola | mediane reali |
|---|---|---|
| Ratti di Wistar | 90′ | 50 / 95 / 110 |
| Brass: Birmingham | 60-120′ | 135 / 150 |
| Cryptid | 30-50′ | 11 / 30 / 25 |
| Scythe | 115′ | 80 / 105 |
| Century | 30-45′ | 29 / 30 / 40 / 40 |
| Terramara | 120′ | 105 / 135 |
| Pozioni Esplosive | 30-45′ | 30 / 25 / 45 |
| Draftosaurus | 15′ | 15 / 8 / 12 / 15 |
| Noctiluca | 30′ | 25 / 30 / 30 |
| Azul Sintra | 30-45′ | 30 / 35 / 60 |

Fuori: Dixit, Happy Pigs, Quadropolis, Lords of Xidit, Ora et Labora e Between Two Cities, che non hanno due configurazioni con tre partite. Between Two Cities e' un peccato, perche' dichiara 25 minuti e al nostro tavolo ne dura 60.

## Il riferimento e' la forbice intera, non il massimo

Paolo, il 2026-09-02, su Scythe: *"quel 90-115 non e' una durata variabile a prescindere, e' variabile perche' un conto e' giocarlo in 2 o 3 e un conto in 4 o 5"*. Verificato sull'archivio, e ha ragione.

Su **50 giochi** con la forbice doppia e almeno due configurazioni da 3+ partite:

- la configurazione con **meno** giocatori sta piu' vicina al **minimo** dichiarato che al massimo in **30 casi su 50**; errore medio 19,1 minuti contro 24,7
- **76 colonne su 136 (56%) cadono dentro la forbice dichiarata**: 40 sfondano sopra, 20 restano sotto
- provando a interpolare la forbice sul numero di giocatori l'errore medio scende da 20,1 a 14,6 minuti

Casi da manuale: Grand Austria Hotel dichiara 60-120 e fa 59 in due, 89 in tre, 107 in quattro. Castles of Burgundy dichiara 70-120 e fa 67, 106, 120. Settlement dichiara 45-90 e fa 49, 77, 87.

**Non si interpola pero'.** Sarebbe inventare una legge lineare che l'editore non ha mai scritto, e su Caverna (30-210) o Clans of Caledonia (30-120) darebbe numeri assurdi. Nel grafico la forbice si disegna **come fascia**: due righe tratteggiate e un velo chiaro fra le due. Si sfora solo uscendo di sopra o di sotto, e `merita_durata()` guarda gia' i due bordi.

**Scythe e' uscito dai cinque proprio per questo.** Il portale (cioe' BGG) dava `minPlaytime` e `maxPlaytime` tutti e due a 115, quindi il grafico disegnava una riga sola e le nostre durate sembravano molto sotto. Ma la scatola e DungeonDice dicono **90-115**, ed e' la forbice che avevo gia' usato in copertina: dentro quella, 1h 20′ in tre e 1h 50′ in quattro ci stanno, e la slide non aveva niente da dire. Restano quattro giochi: Wistar, Cryptid, Azul Sintra, Brass.

**Attenzione**: quando il portale da' `minPlaytime == maxPlaytime` ma DungeonDice dichiara una forbice, vince DungeonDice, ed e' anche l'unico modo di non contraddire la riga "Durata" della copertina dello stesso post.

## Le espansioni

Le partite del portale non sanno niente delle espansioni. L'export BG Stats si', ogni partita ha `expansionPlays`: 144 su 2.393. Copia salvata in `_instagram/dati/bgstats-2026-09-02.bgsplay`.

**Attenzione, i due dati non si incrociano.** Il file BG Stats sono le partite **di Paolo**; `partiteStats` del portale aggrega quelle di tutto il gruppo dopo aver tolto i doppioni. Su Isle of Skye il portale ne conta 29 e il registro di Paolo 12.

**Due tipi di espansione, e solo uno conta.** Paolo, 2026-09-02: *"le espansioni di giochi come Wingspan o Faraway, che aggiungono solo carte al mazzo, non influiscono su alcuna meccanica del gioco e nessuna durata diversa"*. Faraway infatti fa 20′ con e 20′ senza.

**La tabella qui sotto e' descrittiva, non causale, e va letta con Paolo gioco per gioco.** Una differenza di durata nei dati non dimostra che l'espansione allunghi il gioco:

| gioco | senza | con | espansione | cos'e' davvero |
|---|---|---|---|---|
| Clans of Caledonia | 100′ | 141′ | Industria | aggiunge meccaniche |
| Altiplano | 93′ | 147′ | Il Viaggiatore | da verificare |
| Stone Age | 60′ | 99′ | Alla meta con stile | da verificare |
| Quadropolis | 32′ | 58′ | Servizio Pubblico | **niente**: sostituisce tessere, il gioco e' identico. E il "senza" e' una partita sola |
| Pozioni Esplosive | 33′ | 52′ | Il Sesto Studente | **niente**: porta il gioco da 4 a 6 giocatori, dura di piu' perche' si e' in sei |
| Viticulture | 98′ | 137′ | Tuscany | da verificare |
| **Terraforming Mars** | **150′** | **136′** | Prelude, Hellas & Elysium | **accorcia** |

Terraforming Mars va al contrario ed e' giusto cosi': **Prelude accorcia** perche' da' risorse iniziali invece di far partire da zero. Senza espansioni 148/150/145 in due, tre e quattro; con espansioni 112/136/133.

**Isle of Skye e' il caso da gestire.** Nel registro di Paolo le uniche partite senza Il Viaggiatore sono due, tutte e due in cinque giocatori (96′ contro 97′ con l'espansione). In due, tre e quattro non esiste una sola partita del gioco base. Quindi li' non misuriamo il gioco nella scatola, e la slide **deve nominare l'espansione**, se no il confronto con i 30-50 minuti dichiarati e' scorretto.

**How to apply:** prima di mettere la slide della durata su un gioco, guardare nel `.bgsplay` se le partite hanno espansioni, e **chiedere a Paolo che tipo di espansione e'**, perche' dai numeri non si capisce e lui stesso non se lo ricorda a memoria per tutti. Solo carte in piu' o tessere sostituite: si tira dritto. Piu' giocatori: la differenza e' spiegata dal numero al tavolo, non dall'espansione. Meccaniche nuove: o si dice nella nota, o si lascia perdere. Vedi [[pipeline-pubblicazione]].

## Quando le fonti litigano sulla durata, vince l'editore

Barrage, 2026-09-02. Tre fonti, tre numeri: il portale (che pesca da BGG) diceva
**90-180′**, DungeonDice **60-120′**, il sito di **Cranio Creations**, che il
gioco lo produce, **120′** secchi. Paolo: *"120' va bene, lo dice la Cranio, è
prodotto da loro."*

**E la scelta decideva se la slide esisteva o no**, il che la rende pericolosa.
Le mediane erano 88 in due e 116 in tre: con 120 secchi lo scarto in due è di 30
minuti sotto e `merita_durata` scatta; con una qualsiasi delle due forbici le
partite ci cadono dentro e la slide sparisce.

**Regola**: si sceglie la fonte più vicina alla scatola (editore, poi negozio
italiano, poi portale), e *dopo* si guarda cosa dice `merita_durata`. Mai il
contrario. Su Scythe era andata al rovescio, il portale dava 115-115 e la scatola
90-115, e la slide era stata tolta.

`durata_da_portale()` accetta ora **`min_scatola` e `max_scatola`** per
scavalcare il dato del portale.

**Nota tecnica**: con durata dichiarata secca (min = max) la fascia si riduce a
una riga tratteggiata sola, e la nota sotto il grafico lo dice già da sé ("La
riga tratteggiata è 2h, quello che dice la scatola").

## Il controllo sulle singole partite, dal 2026-09-03

Le mediane di `partiteStats` non bastano più. Prima di montare la slide si
scaricano le partite una per una da `/api/partite/{utente}?gioco={bggId}` per
tutti gli account del gruppo, vedi [[api-portale-bgg]], e si guardano due cose:

- **quando sono state giocate.** Le partite dei primi anni, quando il gioco si
  stava imparando, sono più lunghe e gonfiano la mediana. Se rifacendo il conto
  solo sulle partite dal 2023 in poi la mediana si sposta di più di dieci minuti,
  quella colonna non racconta come si gioca oggi.
- **NON per le durate tonde.** Era una regola sbagliata, corretta da Paolo il
  2026-09-04: *"a volte capita che non registro una partita con la durata, ma so
  che è durata circa un'ora e quindi segno 60 minuti. 56 o 62 cambia poco a noi."*
  Un 60 tondo è una stima consapevole, non un errore, ed è lo stesso motivo per
  cui la slide arrotonda a scaglioni. Le durate tonde si usano come tutte le
  altre.
- **guardare invece gli anni.** I gestionali durano di più le prime volte, che è
  un fatto vero e non un difetto di registrazione: si legge il manuale a metà
  partita, e alla trentesima si va spediti. Una mediana calcolata su tutti gli
  anni può quindi raccontare come si giocava allora, non come si gioca adesso.
  Il caso grosso è Azul Sintra, dove in quattro le tre partite del 2020 stanno a
  60 minuti e l'unica del 2025 a 33.

  **Ma l'effetto è meno diffuso di quanto sembri.** Su Caverna, che Paolo citava
  come esempio, in tre la mediana passa da 120 minuti fino al 2022 a 116 dal
  2023: quattro minuti. In quattro da 150 a 143, con una sola partita recente.
  Quindi non è una regola, è un controllo da fare gioco per gioco quando le
  partite si distribuiscono su più anni.

Se il campione buono scende sotto le tre partite, la slide non si fa. È così che
è caduta quella di Azul Sintra.

## Non c'e' una regola fissa per lo strillo, si guarda caso per caso

Detto da Paolo l'8 settembre 2026, montando The Red Cathedral. Avevo cominciato a ricavarne
una regola generale ("la frase forte si appoggia sempre alla colonna con piu' partite"), e la
risposta e' stata: **"non ci dev'essere una regola fissa per la slide delle durate, bisogna
vedere di volta in volta."**

**Why:** ogni gioco ha una distribuzione diversa fra le colonne, un numero diverso di partite
per configurazione e una scatola che sbaglia in modi diversi. Una regola meccanica su quale
colonna citare produce strilli giusti in un caso e insensati nel successivo.

**How to apply:** la slide si guarda generata, si legge cosa dicono davvero le colonne, e lo
strillo si scrive su quello. Le cose che restano vere sempre sono solo due: si usa la
**mediana** e non la media, e le configurazioni sotto le tre partite non entrano. Il resto,
quale colonna citare e come dirlo, e' una scelta editoriale di quel post, e nel dubbio la fa
Paolo.

## Terraforming Mars: la riserva era su una partita sola, chiusa il 2026-09-09

Restava aperto il dubbio che lo strillo *"non cambia con quanti si e'"* fosse smentito dalle
partite recenti, dove in due si scendeva sotto i 110 minuti. Riletto tutto dall'endpoint
delle singole partite (`/api/partite/paoloalby?gioco=167791`, 35 righe):

| giocatori | tutte | dal 2023 |
|---|---|---|
| in due | 4 partite, 138′ | **1 partita, 112′** |
| in tre | 11 partite, 150′ | 4 partite, 144′ |
| in quattro | 11 partite, 140′ | 3 partite, 133′ |
| in cinque | 9 partite, 150′ | 7 partite, 150′ |

**Il numero basso era una partita sola.** E soprattutto **la colonna dei due non e' sulla
slide**: `min_partite=5` la butta fuori perche' ha quattro partite. La slide mostra tre,
quattro e cinque — 150, 140, 150 — e su quelle lo strillo regge anche guardando solo le
partite recenti, 144, 133 e 150. Contro i 120′ della scatola.

**How to apply:** prima di correggere una slide per una riserva scritta mesi prima, si
guarda **quali colonne la slide mostra davvero** e su quante partite si regge il numero che
preoccupa. Una mediana su una partita sola non e' una mediana. Vedi
[[un-controllo-nuovo-si-tara-sui-dati-veri]].
