Release notes
LeanCore Changelog
ActiveHytale • Latest version 1.7.0
Changelog version 1.7.0
Adicionado
- Dormancy de zona ciente de conteúdo: o LeanCore agora amostra a densidade de conteúdo construído por zona (baús, bancadas e outras block entities) e enviesa os timers de dormancy e a ordem de eviction para manter zonas ricas em conteúdo carregadas por mais tempo, mesmo ociosas. Ligado por padrão
- Governança do raio quente/de simulação: sob pressão de heap, o LeanCore pode reduzir o raio de ticking do servidor, separado do raio de view do cliente para não haver pop-in, cortando custo de simulação além dos cortes de view já existentes. Ligado por padrão, com a mesma janela de grace do governor de view
- Verdade de unload por chunk: a eviction de chunk pelo engine agora é contada de forma exata na thread da world, em vez de inferida pelo delta líquido de chunks carregados, deixando o sinal de aprendizado de “esse unload se manteve” muito mais limpo. Ligado por padrão
Alterado
- As leituras por world (zonas quentes, diff do conjunto de chunks, scan de conteúdo) são agrupadas em um único dispatch de world por tick, reduzindo o overhead de dispatch
- Mudanças do raio quente agora são logadas, então o governor de raio de ticking reporta seu alvo do mesmo jeito que o governor de view já faz
- Schema de persistência de aprendizado subiu para v9 (adiciona um content score por zona); snapshots antigos v7 e v8 são lidos e atualizados automaticamente
Corrigido
- Os stats de reuse de zona agora são imutáveis para leituras seguras entre threads, os contadores de false-cut são atômicos, e o tracker de conjunto de chunks por world não retém mais snapshots de worlds que sumiram
- O envelhecimento da dormancy não avança mais seu relógio quando um fan-out por world completa só parcialmente sob carga, então zonas ociosas continuam esfriando no tempo certo
- O shutdown do runtime é protegido contra execução dupla, então um restart não roda o caminho de save e teardown duas vezes
- Tarefas da thread da world que lançam exceção agora são logadas, em vez de engolidas em silêncio
- Zonas ricas em conteúdo agora persistem mesmo antes de atingir o limiar normal de visitas
Notas
- Novas chaves do
LeanCore.jsonsão adicionadas no primeiro boot: verdade de unload por chunk, modelo de conteúdo e governança de raio quente vêm ligadas por padrão. Coloque-as em false para manter o comportamento da 1.6.x - O
LeanCore.jsone olearning.state.gzexistentes são mantidos e atualizados no lugar; sem migração manual
Changelog version 1.6.1
Alterado
- Limpeza interna: remoção de código morto (tipo de snapshot sem uso, helpers de dormancy/profile sem uso, writers de persistência legados). Sem mudança de comportamento
Corrigido
- Segurança de thread: a amostragem de spread de heap, a pressão regional de entidades, o polling de unload do engine, a saturação de chunks, as posições de jogador da dormancy e o movimento solo agora reutilizam a posição amostrada na thread da world ou rodam dentro de um dispatch de world, em vez de ler transforms de jogador ou chunk stores fora da thread da world
- Timeouts de dispatch respeitados: uma tarefa de world que estourou o tempo não avança mais o estado de política nem superestima chunks descarregados; a ação apenas tenta de novo no próximo tick
- Ferramentas de admin funcionam com o HUD desligado:
/leancore heatmape/leancore zone pin|unpin|pinsnão dependem mais dehudFeatureEnabled, então admins podem usá-las com o HUD desativado (o padrão)
Notas
- Sem mudanças de config, comando ou API desde a 1.6.0; o
LeanCore.jsone olearning.state.gzexistentes são mantidos como estão - Atualização drop-in a partir da 1.6.0; ainda requer servidor Hytale >=0.5.6
Changelog version 1.6.0
Adicionado
- Modelo de movimento do jogador (
motionModelEnabled, ligado por padrão): velocidade e confiança por jogador com posição prevista em um horizonte curto - Retenção preditiva de zonas: o unload de chunks é inclinado para longe de onde o jogador está indo; zonas na view atual ou prevista nunca são candidatas a unload (cone protegido)
- Modelo de reuse-distance + sobrevivência (
zoneReuseModelEnabled, ligado por padrão): aprende quais zonas são revisitadas e ajusta os limiares de dormência por zona; persistido com prune/TTL - Diagnóstico sempre ligado (
diagnosticLogEnabled, ligado por padrão): resumos de início/fim e logs de decisão[diag]para cada perfil, então só o log do servidor já explica o que o mod fez e por quê - Boost cinematográfico de view (
motionViewRadiusBoostEnabled, opt-in / desligado por padrão): sobe a view distance suavemente para quem se move rápido - Schema de snapshot v8: adiciona features de movimento do jogador e stats de reuse de zona; lê snapshots v7
Alterado
- O ranking de unload de dormência mede a distância até o chunk mais próximo da zona (borda AABB), não o centro, para unload mais preciso
- A persistência de learning roda em uma thread dedicada de escritor único, separada do tick do runtime
LeanCore.jsonnovo traz defaults 1.6.0: modelo de movimento e modelo de reuse ligados; boost cinematográfico desligado
Corrigido
- Segurança multi-mundo: o fan-out por mundo só faz merge em caso de sucesso e respeita um orçamento por tick; afinidade de world thread corrigida para que um mundo nunca envelheça ou descarregue zonas de outro
- Persistência sem race: flush de escritor único com arquivos temp únicos; features de movimento e classificador de atividade thread-safe; caps simétricos de leitura/escrita no codec
- Suavidade do streaming de chunks: o boost cinematográfico fica desligado por padrão porque reescrever a view radius do cliente a cada tick gera churn de chunks e stutter no engine atual
Removido
- Superfície pública
LeanCoreAPI(agora interna apenas)
Notas
- Requer servidor Hytale >=0.5.6
- Os defaults solo/LITE continuam suaves: os modelos de movimento e reuse não mudam view radius ou taxa de chunks sozinhos; o boost cinematográfico é opt-in
- O stutter residual de carregamento de chunks em movimento rápido é do engine (hooks de pré-load) e fora do alcance do mod
Changelog version 1.5.0
Adicionado
- Governador de memória LITE em solo embutido (
liteMemoryGovernorEnabled, ligado por padrão): escala de view, demotion de zonas e sweeps de unload semgovernEnabled - View-radius adaptativa em LITE (
liteViewRadiusEnabled): COMFORT em 100% até pressão de chunks ou heap; cortes leves em WATCH; agressivo só em TIGHT/CRITICAL - Unload AFK em LITE (
liteUnloadEnabled): reclaim de zonas dormant/frozen distantes em idle; portão de probe ainda se aplica; não exigeunloadEnabledno solo - Learning LITE (
liteLearningEnabled, ligado por padrão): demand model + persistência gzip no solo; sem bandit ou holdout em LITE - Chaves lite:
liteViewPressureThreshold,liteViewComfortCapScale,liteViewWatchScale,liteViewTightScale,liteViewCriticalScale,liteMinClientViewRadius,liteViewRadiusLoginGraceSeconds,liteUnloadIdleSeconds,liteUnloadMaxChunksPerSweep - Sinais duplos de pressão em LITE: tier de heap JVM + saturação de chunks (
loaded / view budget) /leancore savings: bloco do governador lite (preset, tier, flags lite, contadores de zona/chunk)/leancore status: flags lite govern/view/learning/unload e linha do portão lite unload/leancore learn: rodapé LITE esclarece learning só de demanda no solo
Alterado
- Perfil solo LITE agora roda tick completo do governador lite na world thread (não só amostragem de dormancy)
LeanCore.jsonnovo traz defaults 1.5.0 (lite*Enabled=true; caminhos STANDARD/FULL continuam off até você ligar)- Intervalo de persistência STANDARD/FULL conservador; LITE faz flush no próprio caminho com
liteLearningEnabledligado
Corrigido
- Dispatch na world thread com escopo por mundo (
GovernorWorldContext); dispatch inline só no mundo certo - Tick do governador LITE roda inteiro dentro de
world.execute - Hardening do load de learning:
learning.state.gzinválido em quarentena; validação do codec na leitura - Sanitização do
LeanCore.json: JSON inválido em quarentena, save atômico, caps em chaves de view/unload
Notas
- Unload LITE ainda precisa de
/leancore probecomunloadProbeGateEnabledligado (padrão) - Sweeps LITE só rodam com tier de heap WATCH ou pior e zonas distant dormant; COMFORT + spread baixo com unload zero é normal
- STANDARD/FULL inalterado:
governEnabled,learningEnabled,unloadEnabledcomo antes - Use
embeddedStandardProfile: truesó para dogfood de STANDARD no solo
Changelog version 1.4.1
Adicionado
- Portão de probe para unload (
unloadProbeGateEnabled, ligado por padrão): unload de chunks por política fica bloqueado até/leancore probepassar; linha do portão em/leancore status;probePassedAtMssalvo emLeanCore.json - Métricas de sessão do gcHint em
/leancore savingsquandogcHintEnabledestá ligado (contagem de hints e idade do último hint)
Alterado
/leancore statusmostra diagnósticos solo LITE (tick adaptativo, flags govern/learning/unload, linha do portão de unload)/leancore probepersiste o timestamp de sucesso e confirma quando o portão de unload abre/leancore learnreporta status do flush de learning (flushErr, hora do último flush); erros de IO v7 no load/flush vão para o log do servidor
Corrigido
- Governor adia unload, view-radius e pressão regional quando a world primária está ausente (amostragem de heap e updates de learning continuam)
Notas
- Unload em STANDARD/FULL ainda exige
governEnabled+unloadEnabled+ probe com sucesso quando o portão está ligado - Use
unloadProbeGateEnabled: falsesó se quiser ignorar o portão de segurança de propósito - View-radius em solo embutido inalterado: exige
dedicatedServerMode: true
Changelog version 1.4.0
Adicionado
-
Snapshot de learning v7 (
learning.state.gz): formato binário gzip; migra olearning.statelegado no primeiro flush -
Poda de perfis:
learningMaxPersistedPlayers(padrão 512) elearningPlayerTtlDays(padrão 90) -
embeddedStandardProfile: solo embutido em STANDARD (15s) semdedicatedServerMode/ tick FULL de 5s -
Camada de dispatch na world thread:
WorldDispatch,GovernorWorldContext,RuntimeGuardpara semântica doTickingThreaddo Hytale -
gcHintEnabled: hint experimental de GC em idle LITE (desligado por padrão)
Alterado
-
Scheduler daemon
LeanCore-runtime; shutdown antecipado noShutdownEvent -
Ticks do governor:
world.executecoalescido (no máximo um tick pendente; scheduler não bloqueia mais até 5s) -
Policy apply + unload de chunks inline quando
world.isInThread() -
HUD removido no shutdown; HttpClient de webhook em executor daemon
Corrigido
-
java.exezumbi ao fechar o Hytale embutido com config estilo dedicado (world.executeaninhado + espera bloqueante deixava tarefas na fila da world;TickingThreadmantinha a JVM viva apósShutdown completed!) -
View-radius em solo embutido continua exigindo
dedicatedServerMode: true(regra intencional)
Notas
- Habilite
unloadEnabledsó após baseline em/leancore probe
Changelog version 1.3.0
Adicionado
/leancore savings: pico/baseline/delta de heap JVM da sessão, estado do governor e ações cumulativas de zona/chunk (medido vs estimado)DedicatedBootstrap: preset único no primeiro boot dedicado (governEnabled,viewRadiusGovernanceEnabled,learningEnabled;unloadEnabledpermanece off)- Grace de 10 minutos para view-radius após start do runtime dedicado
Alterado
ZoneDormancyMap: refresh incremental sem rebuild completo do mapa; prune de zonas antigasOnlineLinearDemandModel: weight decay (0.9995) por update para adaptar mudança de estilo de jogochunkUnloadEventTracking: contagem de unloads da engine via polling na world thread (sem listener ECS deChunkUnloadEvent)- Tick do governor STANDARD/FULL despachado na world thread
Corrigido
- Crash no preset FULL / dedicado (
Assert not in threadno unload de chunks da engine) por acesso aoChunkStorefora da world thread e registro inseguro de evento de unload - Probe de pressão regional (
S4) não lê maisChunkStorena thread do scheduler
Notas
/leancore savingsmostra só heap JVM — não é RAM da VPS/OSdedicatedBootstrapEnabled: falsedesliga o preset automático- O JAR do CurseForge deve incluir os commits de thread-safety em
mainapós53c801f
Changelog version 1.2.2
Adicionado
- Persistência da blacklist de políticas em
learning.stateschema v5 (banimentos por rollback sobrevivem ao restart comlearningEnabledligado) /leancore learnmostralearning=v5e contagem de blacklist ativa
Alterado
LeanCore.jsonlido/gravado em UTF-8- Blacklist do governor passa a ser gerida pelo
LearningStore(PolicyBlacklistTracker)
Corrigido
- FIGHTER preso após explorar — pulsos de EXPLORE ao andar, descoberta de zona registra EXPLORE, EMA de combate decai ao mudar de atividade
Notas
- Persistência da blacklist exige
learningEnabled: true - Upgrade de
learning.statev4 é automático; blacklist vazia até o próximo rollback de política
Changelog version 1.2.1
Primeiro release público 1.2.x (inclui Activity Sense da 1.2.0 mais correções da 1.2.1). Sem arquivo 1.2.0 separado no CurseForge.
Adicionado
-
Activity Sense (ML): classificador softmax multiclasse online treinado com eventos ECS ao vivo
-
Classificador de bloco/ferramenta: item, gather type e grupo do bloco rotulam quebras/colocações (MINE, CHOP, FARM, BUILD)
-
Novos estilos de jogo:
MINER,LUMBERJACK,FARMERjunto aos comportamentos existentes -
EMAs por atividade: mine, wood, farm, build, craft, combat em janelas rolantes
-
Listener de combate: FIGHTER só via eventos de dano, não quebras genéricas de bloco
-
Sinal de craft:
CraftRecipeEvent.Prealimenta atividade de craft -
Schema de features v2 (
demandDim=11) com EMAs específicos por atividade -
/leancore learn player: EMAs de atividade e statusactivityModel=SOFTMAX -
Cache de classificação break/place e cache de gather type por item
-
Janela de atividade recente para troca rápida MINER / LUMBERJACK / BUILDER
-
Dirty flush do
learning.statequando learning está ativo -
Testes unitários para classificador, posterior e troca de role
Alterado
-
Posterior de comportamento usa softmax ML como caminho principal; fallback EMA antes do warm-up
-
learning.stateschema v4: persiste classificador de atividade + EMAs por jogador (migra de v3) -
/leancore learnreportafeatureSchema=v2quando o demand model está ativo -
Meia-vida das EMAs de atividade em 20s com inibição cruzada ao trocar de role
-
Treino ML com throttle; perfil LITE sem chunk probe no tick de dormancy
-
Hatchet e blocos de madeira do Hytale antes das heurísticas de picareta
Corrigido
-
Minerar com picareta não é mais marcado como FIGHTER
-
Troca lenta de role ao mudar de mineração para corte de madeira (ex.: Hatchet)
-
Decay de EMA no LITE solo durante eventos de bloco
-
Stutter por classify + train ML a cada quebra no thread ECS
Notas
-
ML de atividade roda in-process na JVM do servidor (sem mod no cliente)
-
Heurística atua como teacher até o softmax aquecer (
updates >= 8) -
KPI principal: heap JVM do servidor, não FPS do cliente
-
Atualize de 1.1.1 direto para 1.2.1
Changelog version 1.2.0
Adicionado
-
Activity Sense (ML): classificador softmax multiclasse online treinado com eventos ECS ao vivo
-
Classificador de bloco/ferramenta: item, gather type e grupo do bloco rotulam quebras/colocações (MINE, CHOP, FARM, BUILD)
-
Novos estilos de jogo:
MINER,LUMBERJACK,FARMERjunto aos comportamentos existentes -
EMAs por atividade: mine, wood, farm, build, craft, combat em janelas rolantes
-
Listener de combate: FIGHTER só via eventos de dano, não quebras genéricas de bloco
-
Sinal de craft:
CraftRecipeEvent.Prealimenta atividade de craft -
Schema de features v2 (
demandDim=11) com EMAs específicos por atividade -
/leancore learn player: EMAs de atividade e statusactivityModel=SOFTMAX -
Testes unitários para classificador de bloco, modelo de atividade e posterior
Alterado
-
Posterior de comportamento usa softmax ML como caminho principal; fallback EMA antes do warm-up
-
learning.stateschema v4: persiste classificador de atividade + EMAs por jogador -
/leancore learnreportafeatureSchema=v2quando o demand model está ativo
Corrigido
- Minerar com picareta não é mais marcado como FIGHTER — quebras ponderadas por contexto de ferramenta/bloco
Notas
-
ML de atividade roda in-process na JVM do servidor (sem mod no cliente)
-
Heurística atua como teacher até o softmax aquecer (
updates >= 8) -
KPI principal continua sendo heap JVM do servidor, não FPS do cliente
Changelog version 1.1.0
Adicionado
-
Perfis de runtime escalonados no host embutido:
LITE(solo),STANDARD(amigos),FULL(dedicado) -
localHostModeAUTO (padrão): dormancy leve no solo; escala quando amigos entram -
Probe regional de entidades (S4): contagem por zona via
EntityChunkem/leancore probe -
Rastreamento
ChunkUnloadEvent(opcional): contadores policy vs engine em/leancore learn -
OnlineLinearDemandModel: demanda de retenção aprendida com features de atividade (schema v1) -
LeanCoreAPI: consultar tier, pin/unpin de zonas, snapshots de jogador para outros mods -
Cohort holdout (10%): bandit aprende só com treatment; holdout não recebe cortes de view-radius
-
Testes unitários de perfis de runtime, política de ativação, normalização e demand model
Alterado
-
Runtime usa
HytaleServer.SCHEDULED_EXECUTORcom atraso inicial de 30s em mundos locais -
Defaults mais seguros:
governEnabled=false,viewRadiusGovernanceEnabled=false, HUD/learning off -
Governança de view-radius desligada no solo embutido mesmo com governor ativo
-
Policy applier só aplica view-radius quando a policy muda de verdade (throttle)
-
/leancore statusmostra o profile ativo (LITE/STANDARD/FULL) -
/leancore learnmostrafeatureSchema=v1, status do demand model e atribuição de unload
Corrigido
-
Mundos locais não stutteram mais por tick pesado a cada 5s + HUD + learning
-
Rastreamento de unload de chunks off por padrão (evita assert de thread do engine)
Notas
-
KPI principal continua sendo heap JVM do servidor, não FPS ou GPU do cliente
-
Solo: mantenha
localHostMode: AUTO. Dedicado:dedicatedServerMode: truee depois ajuste o governor
Changelog version 1.0.0
Adicionado
- Primeiro release estável público (
1.0.0) - Governador de memória com tiers COMFORT → CRITICAL, rollback e aprendizado contextual
- Mapa de dormência espacial (HOT / WARM / DORMANT / FROZEN) e sweeps de unload de chunks
- Demanda de retenção por jogador a partir de features de atividade ao vivo
- Quantis de heap calibrados no servidor e persistência
learning.state(schema v3) - HUD admin (
/leancore hud on|off|status) — opt-in, grupos e permissões - Heatmap de zonas (
/leancore heatmap [limit]) - Overrides de zone pin (
/leancore zone pin|unpin|pins) - Webhook CRITICAL opcional (
criticalWebhookUrl, JSON genérico) - Asset pack de servidor para UI do HUD
Notas
- KPI principal é heap JVM do servidor, não FPS no cliente