Files

383 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Wired Bug Audit
## 1. Scopo
Questo documento raccoglie i **potenziali bug**, le **aree fragili** e le **incoerenze architetturali** emerse durante lanalisi del sistema wired.
Non tutti i punti qui sotto sono bug già riprodotti al 100%, ma sono:
- problemi già visti in comportamento reale
- incongruenze tra runtime e UI
- zone del codice che possono generare regressioni o risultati non deterministici
Riferimenti principali:
- `Arcturus-Morningstar-Extended/Emulator/src/main/java/com/eu/habbo/habbohotel/wired/core/WiredManager.java`
- `Arcturus-Morningstar-Extended/Emulator/src/main/java/com/eu/habbo/habbohotel/wired/core/WiredEngine.java`
- `Arcturus-Morningstar-Extended/Emulator/src/main/java/com/eu/habbo/habbohotel/wired/WiredHandler.java`
- `Arcturus-Morningstar-Extended/Emulator/src/main/java/com/eu/habbo/habbohotel/wired/core/WiredMoveCarryHelper.java`
- `Arcturus-Morningstar-Extended/Emulator/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired`
---
## 2. Sintesi Priorità
| Priorità | Tema | Stato |
|---|---|---|
| Alta | `context` variabili esposto ma non implementato davvero | Incoerenza forte |
| Alta | Doppio runtime (`WiredManager` vs `WiredHandler`) | Rischio architetturale |
| Alta | Ordine effect non sempre garantito senza extra esplicito | Rischio comportamentale |
| Alta | Path movimento legacy può ancora far trapelare update intermedi | Già osservato in stanza |
| Media | Tick a `50ms` ma delay wired in step da `500ms` | Semantica non uniforme |
| Media | Polling realtime `:wired` a `50ms` | Rischio carico/runtime noise |
| Media | `click furni` ora immediato, queue/cancel svuotati | Possibile regressione |
| Media | Semantica timestamp variabili non uniforme tra target types | Possibile confusione logica |
---
## 3. Audit Dettagliato
## 3.1 `context` nelle variabili: esposto ma non veramente supportato
- **Gravità:** Alta
- **Confidenza:** Alta
- **Area:** effetti/condizioni/extras variabili
### Problema
Nel layout e in parte della serializzazione compare il target `context`, ma in più punti il runtime lo rifiuta esplicitamente oppure restituisce direttamente `false`.
Questo crea una situazione pericolosa:
- il designer pensa che la feature esista
- il box si salva o si configura parzialmente
- ma poi in esecuzione non produce il comportamento atteso
### Evidenze
- `WiredEffectGiveVariable.java:197`
- il save rifiuta `TARGET_CONTEXT`
- `WiredConditionVariableValueMatch.java:181`
- `case TARGET_CONTEXT -> false`
- `WiredConditionVariableAgeMatch.java:146`
- `case TARGET_CONTEXT -> false`
- `WiredExtraTextOutputVariable.java:83`
- il save rifiuta `TARGET_CONTEXT`
### Impatto pratico
- stack che sembrano validi in UI ma non funzionano a runtime
- falsi negativi nelle condition variabili
- placeholder testuali variabili non disponibili quando lutente si aspetta il target context
### Fix suggerito
Scegliere una direzione netta:
1. **o** implementare davvero `context` in tutti i flow variabili
2. **o** rimuoverlo completamente da UI, save e runtime finché non è pronto
La seconda opzione è la più sicura nel breve periodo.
---
## 3.2 Doppio runtime wired ancora presente
- **Gravità:** Alta
- **Confidenza:** Alta
- **Area:** architettura core
### Problema
`WiredManager` dichiara di essere il runtime esclusivo e tratta i vecchi flag come sola compatibilità, ma `WiredHandler` esiste ancora con entrypoint completi e logica propria.
### Evidenze
- `WiredManager.java:136`
- warning esplicito: `wired.engine.enabled / wired.engine.exclusive are now compatibility-only flags`
- `WiredManager.java:174`
- `isEnabled()` dipende solo dallinizializzazione del manager
- `WiredManager.java:182`
- `isExclusive()` ritorna sempre `true`
- `WiredHandler.java:63`
- entrypoint legacy completo `handle(...)`
- `WiredHandler.java:114`
- supporto separato per `handleCustomTrigger(...)`
### Impatto pratico
Se qualunque pezzo di codice, plugin o path legacy entra ancora in `WiredHandler`, si possono avere:
- ordine effect diverso
- scheduling delay diverso
- condition flow diverso
- diagnostica/monitor non coerente col nuovo engine
### Fix suggerito
- definire un solo entrypoint runtime ufficiale
- se `WiredHandler` deve restare, trasformarlo in adapter minimo che inoltra sempre al nuovo engine
- aggiungere log o metriche per rilevare qualsiasi ingresso nel path legacy
---
## 3.3 Ordine degli effect non sempre deterministico senza `wf_xtra_exec_in_order`
- **Gravità:** Alta
- **Confidenza:** Alta
- **Area:** esecuzione stack
### Problema
Nel path legacy, lordinamento stabile viene applicato chiaramente solo in presenza di `wf_xtra_exec_in_order` oppure in casi specifici (`unseen`).
Negli altri casi, lordine si appoggia alla collezione che arriva dal runtime.
### Evidenze
- `WiredHandler.java:224`
- rileva `hasExtraExecuteInOrder`
- `WiredHandler.java:230`
- ordina con `WiredExecutionOrderUtil.sort(effects)` solo in alcuni casi
- `WiredHandler.java:249`
- usa direttamente `effectList` in ordered mode
### Impatto pratico
Stack come:
- `move_rotate` + `match_to_sshot`
- `toggle` + `reset`
- `give_var` + `change_var_val`
possono produrre risultati diversi se si assume implicitamente un ordine che il runtime non promette davvero.
### Fix suggerito
- decidere se lordine stack deve essere sempre stabile di default
- in alternativa, mantenere la regola attuale ma documentarla in modo molto esplicito
- se si lascia la regola attuale, conviene segnalare in UI che lordine è garantito solo con `wf_xtra_exec_in_order`
---
## 3.4 Il path movimento legacy può ancora far vedere movimenti intermedi
- **Gravità:** Alta
- **Confidenza:** Alta
- **Area:** movement pipeline
### Problema
Il helper legacy di movimento usa ancora un fallback che, se il collector non è attivo, invia subito `FloorItemOnRollerComposer`.
Questo può far trapelare al client uno stato intermedio che in teoria avrebbe dovuto essere nascosto da batching o restore finale.
### Evidenze
- `WiredMoveCarryHelper.java:163`
- metodo `moveFurniLegacy(...)`
- `WiredMoveCarryHelper.java:179`
- usa il collector se disponibile
- `WiredMoveCarryHelper.java:196`
- fallback diretto a `FloorItemOnRollerComposer`
### Impatto pratico
È coerente con il tipo di bug già visto:
- oggetto che “si vede muovere”
- poi viene riportato nello stato corretto
- ma il client ha già ricevuto un update intermedio
### Fix suggerito
- evitare qualsiasi composer diretto nel path legacy quando la logica wired moderna è attiva
- centralizzare tutti i movement update in un unico collector finale
- aggiungere test specifici per:
- `move_rotate` + `match_to_sshot`
- stacked move effects nello stesso tick
---
## 3.5 Tick a `50ms`, ma delay wired ancora a step da `500ms`
- **Gravità:** Media
- **Confidenza:** Alta
- **Area:** semantica temporale
### Problema
Il sistema oggi ha due granularità temporali diverse:
- repeaters / tickables a `50ms`
- delay wired classico a `delay * 500ms`
### Evidenze
- `WiredTickService.java:48`
- `DEFAULT_TICK_INTERVAL_MS = 50`
- `WiredTickService.java:175`
- `scheduleAtFixedRate(...)`
- `WiredEngine.java:753`
- `long delayMs = delay * 500L`
- `WiredHandler.java:369`
- stesso schema `delay * 500L`
### Impatto pratico
Non è per forza un bug, ma può creare:
- aspettative sbagliate nel builder dei wired
- sensazione di desync tra repeater e delay
- stack “velocissimi” su tick ma “grossolani” sugli effect ritardati
### Fix suggerito
- o si accetta questa doppia semantica e la si documenta ovunque
- o si introduce una nuova famiglia di delay high-resolution separata dal delay classico
---
## 3.6 `:wired` realtime a `50ms` può diventare rumoroso/pesante
- **Gravità:** Media
- **Confidenza:** Alta
- **Area:** tooling monitor/inspection
### Problema
Le request di monitor e variabili ora sono rate-limitate a `50ms`.
### Evidenze
- `WiredMonitorRequestEvent.java:39`
- `return 50`
- `WiredUserVariablesRequestEvent.java:20`
- `return 50`
### Impatto pratico
Su una stanza attiva o con più client staff aperti:
- carico rete maggiore
- più rumore sul server
- rischio di mascherare problemi reali con spam di refresh
### Fix suggerito
- spostare dove possibile a push/event driven
- lasciare `50ms` solo per il minimo indispensabile
- differenziare:
- monitor heavy/debug
- inspection live
- variables snapshot
---
## 3.7 `click furni` ora è immediato: queue/cancel svuotati
- **Gravità:** Media
- **Confidenza:** Alta
- **Area:** eventi click furni
### Problema
La queue dei click furni è stata semplificata: ora il click parte subito, e il cancel path è vuoto.
### Evidenze
- `WiredManager.java:274`
- `queueUserClicksFurni(...)` chiama subito `triggerUserClicksFurni(...)`
- `WiredManager.java:282`
- `cancelPendingUserClicksFurni(...)` non fa nulla
### Impatto pratico
Se qualche comportamento vecchio dipendeva da:
- debounce
- cancel
- click differito
ora può cambiare senza che il mapping sia ovvio.
### Fix suggerito
- decidere se il comportamento immediato è quello definitivo
- se sì, documentarlo come breaking behavior
- se no, reintrodurre una queue reale con semantica esplicita
---
## 3.8 Semantica timestamp variabili non uniforme tra target type
- **Gravità:** Media
- **Confidenza:** Media
- **Area:** sistema variabili
### Problema
Le variabili utente e furni hanno senso come “assegnazione con creation/update time”, mentre le room/global variables hanno soprattutto senso sul solo `update time`.
Questo può diventare ambiguo quando si usano:
- `wf_cnd_var_age_match`
- sorting per creation/update
- UI manage/inspection
### Evidenze
- `WiredConditionVariableAgeMatch.java`
- il target room/global vive soprattutto come valore di update
- le scelte di prodotto già fatte in `:wired` vanno in questa direzione
### Impatto pratico
- il builder può pensare che “tempo di creazione” sulle global sia forte quanto sulle user/furni
- condition o sort possono essere semanticamente strani anche se “funzionano”
### Fix suggerito
- trattare esplicitamente `room/global` come `updated-only`
- disabilitare in UI le opzioni che non hanno senso forte
- o documentare in modo molto chiaro la differenza
---
## 4. Backlog Consigliato
Ordine suggerito di intervento:
1. **Chiudere il target `context`**
- o implementarlo davvero
- o toglierlo da UI/save/runtime
2. **Unificare il runtime**
- lasciare un solo entrypoint ufficiale
3. **Stabilire la regola sullordine effect**
- default stabile o ordine esplicito con extra
4. **Chiudere il leak dei movement update legacy**
- niente composer fuori collector quando wired moderno è attivo
5. **Ripensare il realtime di `:wired`**
- spostare il più possibile da polling a push
---
## 5. Nota Finale
Il sistema wired attuale è già molto più potente del modello classico, soprattutto per:
- variabili
- signal routing
- selectors avanzati
- monitor
- manage/inspection
Proprio per questo, le zone fragili oggi non sono tanto i box semplici, ma:
- la coesistenza di due runtime
- la semantica temporale
- i movement stack
- le feature variabili ancora “mezze esposte”
Questi sono i punti che più probabilmente spiegano i bug strani o intermittenti.