Autotest: compile-check riparato su Mac2026-07-21
Primo run_check.sh lanciato da Claude Code sul Mac: non partiva (binario Godot Linux della sandbox) e, una volta partito, si piantava per sempre.
- [fix]
tools/autotest/common.sh: su macOS il binario Godot si prende da /Applications/Godot.app/Contents/MacOS/Godot; su Linux/sandbox resta la ricerca in tools/godot/. Niente più cannot execute binary file né GODOT= da passare a mano. - [fix]
scripts/tools/check_scripts.gd: lo script salta sé stesso nel giro dei .gd — ricaricarsi con CACHE_MODE_IGNORE mentre gira rompe la VM GDScript (Internal script error! Opcode: 31) e lasciava il processo headless appeso a vuoto (visto su Godot 4.6.2 macOS). - [fix]
scripts/tools/check_scripts.gd: reload() che torna ERR_ALREADY_IN_USE non è più un fallimento — è il caso normale degli autoload, già istanziati come singleton: 17 falsi «COMPILE FAIL» in meno. Il codice d'errore ora compare nel messaggio.
Prontezza ticket: via l'etichetta claude-ready, fa fede lo Sprint2026-07-21
Regola nuova di Ivan: un ticket è da fare se sta nello Sprint attivo in stato «Da fare» — ce li mette lui, KO compresi. Niente più etichetta di prontezza.
- [docs]
WORKFLOW/README.md + 01_TICKET.md + 02_SPRINT.md: selezione = trascinare nello Sprint (KO compresi); perimetro sprint = JQL sprint IN openSprints() AND status = "Da fare"; frase «Fai lo sprint» al posto di «fai i claude-ready»; «In revisione» = in attesa di Ivan, intoccabili; un Da-fare già lavorato È un KO da rifare secondo l'ultimo commento di Ivan. - [docs]
ORCHESTRAZIONE.md (sezione Jira) aggiornata con la stessa regola; SU-9 «📌 LEGGIMI» riscritto su Jira (etichette attive solo mp/device, flusso in 5 passi con rientro KO, claude-ready dichiarata ritirata). - [feat] Slash command aggiornati:
/sprint lavora tutti i «Da fare» dello sprint attivo, /ko filtra i soli KO, /triage non decide più la prontezza. - [docs]
WORKFLOW_CHEAT_SHEET.pdf rigenerato (righe Selezione / Sviluppo / Test device / Rilavorazione).
Workflow v2: tutto su Claude, riparto Cowork/CLI + setup Claude Code2026-07-21
Deciso da Ivan (abbonamento Claude Max): Codex esce dal ciclo; sviluppo e release si lanciano da Claude Code (CLI) sul Mac, Cowork resta il ponte per task sidebar, memoria di progetto e asset PixelLab. Il triage schedulato delle 9:00 è sospeso: si fa a comando quando si inseriscono ticket (spesso i task vengono già lavorati in giornata).
- [docs]
WORKFLOW/ riscritta col riparto Cowork/CLI. README: sezione «Due postazioni, un solo Claude» + colonna Dove nel cheat sheet; 01_TICKET.md: triage a comando («Fai il triage Jira» / /triage), schedulato sospeso; 02_SPRINT.md: sprint da CLI di default, git push origin dev aggiunto alla chiusura sprint; 03_COLLAUDO.md: sezione «Su Mac (CLI)» con GODOT= (i vincoli sandbox valgono solo su Cowork); 04_RELEASE.md: da CLI il giro git lo esegue Claude un passo alla volta con conferma di Ivan, da Cowork resta «prepara e basta». - [docs] Nuovo
WORKFLOW/05_SETUP_CLI.md (una tantum): installazione Claude Code, login col piano Max, verifica roster con /agents, Jira via claude mcp add --transport http atlassian https://mcp.atlassian.com/v1/mcp/authv2 + /mcp (OAuth), export GODOT= per l'harness su Mac, permessi consigliati (conferme attive su push/merge/tag), prova generale in 3 passi. - [feat] Slash command in
.claude/commands/: /sprint, /release, /triage, /ko — ognuno punta al file WORKFLOW/ della fase e ne applica le regole. - [docs]
CLAUDE.md: regola release riformulata (merge su main/tag/push MAI di propria iniziativa, solo in fase release da CLI con ok esplicito) + nota che le istruzioni valgono identiche su Cowork e CLI. - [docs]
WORKFLOW_CHEAT_SHEET.pdf rigenerato (v2): colonna Dove, triage a comando, giro git «lo esegue Claude da CLI», riquadro setup CLI in 5 punti.
Distribuzione build: dmg → iCloud e zip Windows → Google Drive in automatico2026-07-21
Ivan copiava il dmg a mano nella cartella iCloud condivisa coi tester macOS; per i tester Windows serviva un canale equivalente. Scelto Google Drive (cartella condivisa con le email designate, download dal browser, niente client richiesto); beta chiusa su Steam scartata per ora perché anche il Playtest richiede un'app registrata con i 100$ di Steam Direct.
- [feat]
tools/release/make_dmg.sh: publish automatico su iCloud. Dopo hdiutil verify, il dmg viene sovrascritto nella cartella condivisa (env SU_DIST_MAC, oppure DIST_MAC_DEFAULT nello script) con copia nascosta .tmp + rename atomico: iCloud non parte mai a sincronizzare un file a metà e gli invitati vedono il dmg nuovo in un colpo solo. Cartella assente o non configurata → avviso, la build non fallisce. - [feat] Nuovo
tools/release/make_winzip.sh — gemello Windows: zippa la cartella export (exe+pck+dll dentro una cartella col nome del gioco, junk macOS escluso, verifica unzip -t) e la pubblica nella sottocartella «StreetUniversityWIN» di My Drive, auto-rilevando Google Drive for Desktop in ~/Library/CloudStorage/GoogleDrive-* (override SU_DIST_WIN). Stesso giro atomico .tmp+rename; senza Drive installato avvisa e lascia lo zip in locale. - [docs]
WORKFLOW/04_RELEASE.md: export anche Windows (stesso include_filter SU-57 su TUTTI i preset, cartella export dedicata), nuovo passo 5 per lo zip, publish automatici documentati, promemoria SmartScreen per i tester.
Design progressione: superpoteri, power-up 1-10 e sblocchi globali (SU-68)2026-07-21
Brainstorming richiesto dal ticket SU-68: come si ottengono i superpoteri, cosa si sblocca in una run e cosa per sempre. Solo design, nessun codice toccato.
- [docs] Nuovo
PROGRESSION_DESIGN.md (root). Due binari: IN RUN — XP dalle attività → ventaglio 3 carte (cadenza target 15-20 pescate/run, XP che sale col tier), 10 power-up a livelli 1-9 + 6 carte occasione (tutti i 16 perk del brief R2 riciclati), al liv. 10 il SUPERPOTERE: abilità attiva con barra di ricarica sul pattern del busking, battezzata con la cerimonia al riparo (paracadute "carta dorata" sotto i 5 minuti finali). FUORI RUN — regola "le imprese sbloccano, le lattine comprano": ragnatela di sblocchi stile VS (pool iniziale parziale, condizioni comiche sui contatori esistenti), Quaderno/codex, personaggi dalle skin P1 (v1 solo estetica), Baracca R3 estesa con VETO DEL BARBONE e DOPPIA IDENTITÀ (2° slot super). In coda: numeri di partenza (curva XP 4/1.12), impatto sui brief R2/R3 con slicing R2a/R2b/R3 e le 10 decisioni finali per Ivan con default raccomandati.
Guida operativa del ciclo: cartella WORKFLOW/ + cheat sheet PDF2026-07-20
Ivan ha chiesto una mappa chiara di tutti i passaggi (ticket → sviluppo → release) con le frasi e i comandi di ogni fase, per non perdere più pezzi nelle cuciture tra le fasi.
- [docs] Nuova cartella
WORKFLOW/ — README.md (mappa del ciclo + cheat sheet delle frasi da dire a Claude) + 01_TICKET.md, 02_SPRINT.md, 03_COLLAUDO.md, 04_RELEASE.md. Principio: checklist sottili che PUNTANO alle fonti (ORCHESTRAZIONE.md, script, SU-9) senza duplicarle; a inizio fase Claude legge solo il file di quella fase. - [docs] Processo release aggiornato: da ora, su «prepara la release», Claude scrive anche la sezione in-game di
release_notes_it.txt e il bump di config/version (a Ivan restano revisione + blocco git). Codificata anche la chiusura sprint: commit per lotto, CHANGELOG/TESTLOG, REPORT_LOTTI.md azzerato, lista «da provare su device». - [docs]
WORKFLOW_CHEAT_SHEET.pdf (root): riassunto stampabile in 1 pagina — ciclo, frasi, blocco git, regole d'oro. - [fix]
ORCHESTRAZIONE.md: il ticket-guida delle convenzioni Jira è SU-9 («📌 LEGGIMI», label guida), non SU-6 (che è l'epic P1); aggiunto il puntatore a WORKFLOW/. CLAUDE.md e AGENTS.md: nuova regola «fase richiesta → leggi prima il file WORKFLOW/ di quella fase».
Note di rilascio in-game: sezione v0.22 + guardia nel prepara-release2026-07-20
Ivan ha notato che il gioco è a v0.22 ma la schermata NOTE DI RILASCIO (SU-57) era ferma a v0.21: il tag v0.22 è partito senza aggiornare il file letto in gioco.
- [docs]
assets/release_notes_it.txt: aggiunta la sezione v0.22 in linguaggio da giocatore (12 punti dal delta v0.21→v0.22: restyle cartone U1, icone stat, notte visibile, giornata da 10', banconote che volano all'arresto, sprite calzino, rebinding tastiera, pausa touch, fantasmino spettatore MP, stato "Attendere...", voce NOTE DI RILASCIO, pensionamento arena). Le novità post-tag (v0.22-dev: cerchio-luce notte, sprite ghost, matchmaking, portachiavi macOS) restano per la sezione della prossima release. - [docs] Regola fissata da Ivan: le note in-game sono CUMULATIVE. Le sezioni delle versioni vecchie restano sempre nel txt, sotto la più recente — non si rimuovono mai (eventuale potatura solo su decisione futura esplicita). Avviso 1b e piano comandi del prepara-release lo esplicitano («aggiungila IN CIMA, senza toccare le sezioni vecchie»).
- [feat]
tools/release/prepare_release.sh: guardia sulle note in-game (passo 1b). Calcola il core del tag proposto (es. v0.23) e, se release_notes_it.txt non ha quella sezione, stampa un avviso ⚠ in console e in testa a RELEASE_NOTES_DRAFT.md; il piano comandi ora ricorda anche sezione in-game + bump di config/version in project.godot. Così la prossima release non parte più silenziosamente con le note in-game vecchie. Verifica: bash -n ok, guard testata (v0.22 presente → nessun avviso; v0.23 assente → avviso; v0.2 non fa falso match su v0.22).
Online: niente più richiesta portachiavi all'avvio su macOS (SU-53)2026-07-20
Il prompt «Godot vuole utilizzare i dati riservati in "com.epicgames.sdk.connect.access_token"» compariva a ogni avvio perché il warm-up online (SU-27) faceva subito il login EOS Device ID, e su macOS il token vive nel portachiavi.
- [fix] Warm-up online disattivato su macOS.
NetworkManager.warm_up_online(): early-return se OS.get_name()=="macOS" — il login EOS parte on-demand (ospita/unisciti/partita rapida fanno già setup() da soli), quindi il prompt del portachiavi può comparire solo entrando in multiplayer, mai all'avvio. Altre piattaforme invariate. Costo: primo «PARTITA RAPIDA» su Mac senza lista pre-fetchata (qualche secondo in più). - [docs]
EOS_SETUP.md § «macOS: richiesta portachiavi all'avvio»: perché appare, perché NON è auto-concedibile (modello di sicurezza del portachiavi, nessun entitlement lo evita), e come farla sparire del tutto — password + «Sempre» una volta per l'editor; per le build esportate Codesign Identity stabile nel preset macOS (con identity vuota la firma ad-hoc rende ogni export un'app "nuova" e il permesso riparte da zero). - [test] Compile-check
NetworkManager.gd in sandbox; su Mac da verificare: avvio → nessun prompt; primo host/unisciti → prompt una tantum → «Sempre» → mai più.
Fantasmino spettatore: sprite dedicato in gioco (SU-31)2026-07-20
Lo spritesheet generato (arch_player_ghost_v1.png) ora è importato e collegato: il fantasma usa la sua grafica invece del barbone normale tinto.
- [feat] Sprite ghost importato e cablato.
player_ghost_sheet.png (160×160, 5×5) + player_ghost_frames.tres generati con la pipeline esistente (import_people_sprites.py, ora riconosce arch_player_ghost*). In Player.gd: caricato _frames_ghost; in _apply_ghost_visuals() (fantasma locale + puppet degli altri) swap a player_ghost_frames con modulate translucido bianco (i colori spettrali li dà lo sprite); fallback al barbone normale + GHOST_TINT se l'asset manca. Le animazioni combaciano con le altre (walk/idle per 5 direzioni) → il ciclo di galleggiamento gira come «walk». - [test] Headless:
--import del nuovo sheet OK; SP OK (il player carica _frames_ghost senza errori); MP host+client — il client collassato passa a spectating=true e host+puppet applicano lo sprite ghost senza alcun errore di sprite_frames/has_animation/load. Resa visiva da vedere a occhio su device.
Sprint 1 Jira: fix KO SU-16 / SU-54 / SU-552026-07-20
Ripresi dai commenti KO di Ivan, non affrontati nel primo giro (li avevo mancati non leggendo i commenti dei ticket).
- [feat] Notte: cerchio di luce «giorno» attorno al barbone (SU-16). Sostituito l'alone additivo morbido (bocciato) con un cerchio a stacco netto e circonferenza pixelata: dentro il raggio la tinta notturna sparisce e resta un filo di caldo giallognolo (sembra giorno), fuori resta notte. Due shader in
World.gd — su WorldTint (z=10) e vignette (z=11) — «bucano» lo stesso cerchio, centrato sul player (camera 1:1). Raggio regolabile in autonomia: @export var night_light_radius (px) + night_light_pixel (grana del bordo). Rimosso il vecchio _night_glow. - [fix] Online: via ogni «(EOS)» dai testi a schermo (SU-55).
MainMenu.gd, NetworkManager.gd (7 messaggi di stato) ed EOSBridge.status_text()/errori: «ONLINE ATTIVO (EOS)» → «ONLINE ATTIVO», «EOS NON DISPONIBILE» → «ONLINE NON DISPONIBILE», ecc. Nessun riferimento al motore online a video (in futuro potrebbe non essere EOS). Solo stringhe, logica invariata. - [fix] Matchmaking: una partita iniziata esce dalla ricerca (SU-54).
NetworkManager.start_game(): all'avvio l'host rende la lobby EOS non-pubblica (EOSBridge.set_lobby_public(false)), così search_public() restituisce solo lobby ancora in attesa; se non ce ne sono, _quick_match_eos ne apre una nuova (modello di Ivan: si crea una lobby a cui gli altri si uniscono finché non parte, e così via). Il gate _srv_register resta come rete di sicurezza. Percorso EOS: non validabile in sandbox (solo ENet). - [test] Headless: SP OK (npcs 49, orphans 0, nessun errore script/shader), MP ENet host+client
state=IN_GAME/players=2/npcs 49 (la modifica a start_game non tocca il percorso ENet). Resa notturna e testi UI da validare a occhio su device; SU-54 da confermare live su EOS/3 device.
Sprint 1 Jira: collaudo ticket In corso + fix export note di rilascio (SU-57)2026-07-20
Verifica dei 5 ticket "In corso" (SU-16/31/54/55/57) già implementati nel commit v0.22; un difetto d'export trovato e corretto.
- [fix] Note di rilascio ora incluse nell'export (SU-57).
export_presets.cfg (preset iOS + macOS): include_filter da "eos_credentials.cfg" a "eos_credentials.cfg,assets/release_notes_it.txt". Senza, Godot non impacchetta il .txt sciolto (export_filter="all_resources" copre solo le risorse importate) e la schermata «Note di rilascio» mostrava il placeholder nei build reali, pur funzionando in editor/sandbox. NB: export_presets.cfg è gitignored (path device-specifici, come eos_credentials.cfg): il fix è applicato in locale sulla macchina di Ivan, non entra in git → da riapplicare su un checkout pulito, oppure in futuro rendere le note una risorsa esportabile (.tres) per non dipendere dall'include_filter. - [test] Collaudo headless su v0.22. SP OK (
npcs=49, orphans=0, stat/orologio avanzano). MP: SU-31 fantasmino confermato — il client collassato passa a spectating=true con gameover_panel=false e l'host prosegue (l'anomalia del 2026-07-19 era pre-fix, risolta dal guard players.size()>1 in _net_last_alive_is_me()). SU-54 verificato a livello codice (_srv_register nega «PARTITA GIÀ INIZIATA» fuori da IN_LOBBY, discovery LAN spento, client scarta host pieni) — conferma live EOS/3-device in sospeso. SU-16 (resa notturna) e SU-55 (testo «Attendere...») da validare a occhio su device. Dettagli in TESTLOG.md.