Все заметные изменения в проекте Vida документируются здесь.
Формат основан на Keep a Changelog, версионирование соответствует SemVer 2.0.0.
Типы изменений:
- Added — новая функциональность.
- Changed — изменения в существующей функциональности.
- Deprecated — функциональность, помеченная как устаревшая.
- Removed — удалённая функциональность.
- Fixed — исправления ошибок.
- Security — изменения, связанные с безопасностью.
- Снято поддерево
mods/(включаяmods/valentaи прочие демо); исторические описания — в тегах до этой ветки.
- Синхронизированы
README,CONTRIBUTING,docs/getting-started, roadmap / session-roadmap / installer с пустым опциональнымmods/, с командами CI (verifyPlatformProfiles,vidaDocTest,javadocAll) и без ссылок на несуществующие демо-артефакты. docs/index.md: полный каталог всех страницdocs/(getting started, архитектура, модули, guides, reference, миграции, безопасность); быстрые входы и сводка стабильности.docs/reference/index.md,docs/guides/index.md: расширенные оглавления с назначением каждой страницы.docs/faq.md,docs/troubleshooting.md,docs/glossary.md: навигация, Fuente в troubleshooting, термины.
- CimaJuego / CimaJuegoGlobal#cimaJuego() — публичный слой того же Object = Level и
dev.vida.mundo.Mundo, что MundoNivelVanilla+LatidosMundo в :loader (клиентский Minecraft#level); без import net.minecraft.* в API JAR. - Реализация
dev.vida.platform.CimaJuegoCarga, привязка в BootSequence сразу после PlatformBridge; VanillaBridge#resetForTests сбрасывает глобал. - Рефактор клиентского MethodHandle-кэша в
dev.vida.platform.MinecraftClientReflect(общий с cima/bridge). - docs/modules/cima.md, строка в docs/modules/index.md, release копирует vida-cima-*.jar.
LimitesVerticales— диапазон высот блока и фабрикиoverworldVanilla121/netherVanilla121/endVanilla121(ориентир Vanilla Java 1.21.x).RegionCoordenada— индекс файла региона (32×32 чанков);ChunkCoordenada#region()иCoordenada#region().Mundo:default-методыlimitesVerticales(),enRangoDeAltura(Coordenada);Dimension#limitesVerticalesPredeterminados();MundoEstatico— опциональные явные пределы высоты.Mundo#bloqueRegistradoEn,Mundo#bloqueTieneEtiqueta(EtiquetaBloqueизvida-bloque); клиентMundoClienteVanillaв:loader(NivelMundoReflect→ реестр блоков +TagKey).- Документация и пример для
vidaDocTest:docs/modules/mundo.md, раздел вdocs/migration/2.0.0.md.
-
Vifada 2:
@VifadaMulti,@VifadaLocal,@VifadaRedirect, диагностика конфликтов морфов — см.docs/modules/vifada.md. -
Fuente / data-driven: каталог
<datapackRoot>/loot_tables/**; схемаvida:dataDrivenвdocs/reference/manifest-schema.md(эталонный JAR c datapack — в отдельном репозитории/своей ветке). -
Hot reload (dev): DSL
hotReload,CatalogoManejador.reiniciarParaHotReloadDesarrollo(),docs/guides/hot-reload.md. -
Installer: офлайн-кэш embedded loader (
VIDA_INSTALL_CACHE/vida.install.cache),McArtifacts.downloadHttpResumableдля докачки HTTP. -
Telemetry opt-in:
dev.vida.telemetry.TelemetriaV1иdocs/security/telemetry-v1.md. -
Миграция и LTS:
docs/migration/2.0.0.md; линия 1.x — процедура LTS (см. тот же документ). -
CI:
verifyPlatformProfiles build vidaDocTest. -
LatidoRegistrador: послеsetAccessibleрантайм-вызов аннотированных методов идёт черезMethodHandle.unreflect+bindTo, с запасным путёмMethod.invoke, еслиunreflectнедоступен (границы модулей). -
Платформенный мост (
VanillaBridge,GuiGraphicsFillReflect,PlatformBridge.pintorOver): доступ кMinecraft/Window/Levelи кGuiGraphics.fill— через закэшированныеMethodHandle; при отсутствии подписчиков наLatidosMundo.Tick/LatidoRenderHudлишние вызовы не выполняются. -
VidaClassTransformer: детальные наносекунды вEscultorRegistroMetricasсчитаются только при-Dvida.loader.profileEscultorNanos=true; по умолчанию в агрегаты пишется0для длительности (остаются счётчики попаданий).
- Синхронизированы описания Latidos / платформенного моста / Escultor-метрик в
docs/иREADME.mdс фактическим кодом (без устаревших формулировок про «только reflection» и без приписывания шинеLambdaMetafactory).
Первая стабильная линия платформы: SemVer для основных модулей API, усиление CI и артефактов релиза.
:base,:bloque,:objeto,:susurro,:puertas— все публичные типы переведены с@ApiStatus.Preview("<mod>")на@ApiStatus.Stable.:gradle-plugin— публичные пакетыdev.vida.gradleиdev.vida.gradle.tasksпомечены@Stable;dev.vida.gradle.internal—@Internal.
- Синхронизация
docs/с кодом 1.0: модулиfuente/escultores, поле манифестаescultores, стабильность Tejido (dev.vida.red), классBrandingEscultorвdev.vida.escultores, проверкаvida:dataDrivenи корня datapack вvidaValidateManifest, расширенное описаниеSusurro.Politica.
vidaDocTest— задача./gradlew vidaDocTestкомпилирует fenced-примеры изdocs/с полнымpackage dev.vida....через модуль:vida-doc-test.docs/migration/1.0.0.md— миграционные заметки и обещание SemVer.docs/security/audit-1.0.md— отчёт security/readiness для 1.0.0.docs/reference/api-stability.md— таблицы критериев выхода из Preview для оставшихся модулей.
jdk-matrixв.github/workflows/ci.yml— полная сборка на JDK 21, 22, 23, 25 (Ubuntu); логируется выводjava -version.- CycloneDX SBOM: в
release.ymlгенерацияvida-<version>-sbom.cdx.jsonутилитой Syft из каталога артефактов перед загрузкой в GitHub Release.
Промежуточная итерация monorepo между 0.9.0 и 1.0.0; отдельный публичный срез артефактов платформы в этом теге не выделялся.
0.9.1 (2026-04-22)
- valenta: Valenta block in video settings; refresh docs (4332e09)
- Vida 0.9.0 — платформа модов + рендер-мод Valenta (428c8fb)
- ремаппинг обфусцированных имён для Vifada-морфов (9eaf41b)
- ci: убраны нереализованные native installers из release.yml (e023dea)
- авто-определение версии Minecraft, права gradlew, Dependency Graph (b8d21fc)
- авто-мерж PR, расширенный релиз, манифест 0.9.0 (d1bf7dc)
- авторелиз — release-please включает auto-merge на Release PR (4599748)
В теге v0.9.0 поставлялся мод mods/valenta; в текущей main поддерево mods/* снято (см. [Unreleased]).
Платформа: зафиксированы цели клиентского рендер-мода Sodium-класса (аналог Sodium + Sodium Extra в одном артефакте). Отдельный Gradle-модуль с исходниками в этом репозитории не подключается; детали плана — в docs/session-roadmap.md (Session 7).
- Дорожная карта по render core (компактный vertex-format, mega-VBO,
glMultiDrawElementsIndirect, SSBO), chunk meshing черезSusurro(Analisis → Build → Upload), culling (frustum, occlusion queries, PVS), sky/QoL, Vifada-морфы и отладочный HUD — без публикации JAR из данного дерева.
- Каталог версий: jqwik (property-based), JMH, LWJGL — для модулей, которым нужны эти зависимости.
- JMH остаётся в
libs.versions.tomlдля будущих бенчмарков клиентского рендера.
docs/session-roadmap.md— Session 7.docs/roadmap.md,docs/index.md,docs/modules/installer.md— согласованы с отсутствием отдельного мода в монорепо.
Платформа: закрыты три критических пробела в MC-мосту — синтетические провайдеры зависимостей, платформенные Vifada-морфы и автоматическая установка VanillaBridge. Теперь любой мод может объявить required.vida / required.minecraft / required.java и получить LatidoPulso / LatidoRenderHud без собственных морфов.
SyntheticProviders(dev.vida.loader.internal) — собираетProvider-ы дляvida,minecraft,javaи инжектит их вUniverseдо вызоваResolver.resolve().- Канонизация строки версии:
"21"→21.0.0,"1.21"→1.21.0, сохранениеprerelease/build-суффиксов; невалидный вход —Optional.empty(). - Источники версий:
BootOptions.vidaVersion()↓ встроенный ресурсMETA-INF/vida/loader-version.properties(стемпитсяprocessResourcesчерезexpandсproject.version) ↓ fallback0.0.0;BootOptions.minecraftVersion();System.getProperty("java.specification.version"). BootOptions.Builder#vidaVersion(String)и#minecraftVersion(String)— публичный API для запускалок и тестов; пустая строка возвращает поле к авто-детекту.VidaPremainпринимает эти версии через-Dvida.version=…/-Dvida.minecraftVersion=…и агент-аргументыvidaVersion=…,minecraftVersion=….- Реальный мод с тем же
id(vida/minecraft/java) шэдоуит синтетику — конфликта нет.
- Пакет
dev.vida.platform:PlatformBridge— интерфейс моста Vida↔vanilla с методамиonClientTick()иonHudRender(Object guiGraphics, float partialTick); утилитаpintorOver(Object)строитPintorHudчерез reflection.VanillaBridge— дефолтная реализация: монотонный счётчик client-тиков (AtomicLong), публикацияLatidoPulso/LatidoRenderHudнаLatidoGlobal-шину; размеры экрана читаются черезMinecraft.getInstance().getWindow()reflection'ом.MinecraftTickMorph—@VifadaMorph(target="net.minecraft.client.Minecraft"),@VifadaInject method="tick()V",requireTarget=false.GuiRenderMorph—@VifadaMorph(target="net.minecraft.client.gui.Gui"),@VifadaInject method="render(Lnet/minecraft/client/gui/GuiGraphics;F)V",requireTarget=false.
PlatformMorphs(dev.vida.loader.internal) — читает байты платформенных морфов из classpath и регистрирует их вMorphIndex.Builderнезависимо от наличия модов.BootSequenceавтоматически:- добавляет платформенные морфы в
MorphIndex(см.collectMorphs); - устанавливает
VanillaBridgeпосле публикацииLatidoGlobal, если мост ещё не установлен (тестовая подмена не перетирается).
- добавляет платформенные морфы в
- Новый sourceSet
mcStubsвloader/build.gradle.kts; папкаloader/mc-stubs/содержитnet.minecraft.client.gui.GuiGraphics— минимальную API-поверхность, которую используетGuiRenderMorph. Стабы явно исключаются из публикуемого jar и изagentJar(exclude "net/minecraft/**"). loader/src/main/resources/META-INF/vida/loader-version.properties— ресурс, стемпящийся Gradle'ом сproject.version, чтобыSyntheticProvidersзнал версию платформы в рантайме без явной передачи черезBootOptions.
SyntheticProvidersTest— канонизация версий, коллизии с реальными модами, источникиvida/minecraft/java,build()с разнымиexistingIds.BootSequenceIntegrationTest— модrequired.vidaуспешно резолвится против синтетики,required.minecraftпадает безminecraftVersionи проходит с ней,VanillaBridge.onClientTick()× N → ровно NLatidoPulso-событий, платформенные морфы попадают в индекс даже без модов.VidaBootTest— обновлены ожиданияtotalMorphs()с учётом двух платформенных морфов; добавлен сбросVanillaBridgeмежду тестами.
docs/modules/loader.md— новые разделы «Синтетические провайдеры платформы» и «Платформенные морфы»; обновлена таблицаBootOptions(vidaVersion,minecraftVersion); обновлён список шаговBootSequence(теперь 10 шагов, включая установку моста и вызов entrypoint'ов).docs/session-roadmap.md— Session 6 помечена как выполненная.
- Сигнатура
Gui.renderсовпадает с Minecraft 1.20.5+ (Mojang-mapped). Для других версий морф молча пропускается благодаряrequireTarget=false; пользовательский мод при желании может добавить свой морф с нужной сигнатурой и переопределить поведение —VanillaBridge.install(...)допускает подмену. LatidoRenderHudдоставляется любому подписчику через платформенныйGuiRenderMorph+VanillaBridgeбез обязательных морфов в пользовательских модах.
Первые публикуемые моды: Saciedad (шкала насыщения) и Senda (навигационные точки).
Расширен vida-render новым HUD-событием.
PintorHud— абстракция рисования прямоугольников на HUD; позволяет тестировать HUD-рендереры без OpenGL.LatidoRenderHud— событие одного кадра HUD (anchoPantalla,altoPantalla,deltaTick,PintorHud); испускается сFase.DESPUESдля наложения поверх ванильного HUD.
SaciedadMod— entrypoint; подписывается наLatidoPulso(@OyenteDeTick(tps=20)) иLatidoRenderHud.SaciedadConfig— типизированная конфигурация:color(hex ARGB),mostrarSiempre,posicion(arriba/abajo/encima).SaciedadHudRenderizador— два подписчика наLatidoRenderHudсFase.DESPUES: фон + цветная шкала; 0 аллокаций на кадр после прогрева.SaciedadCache— безаллокационный кэш значения насыщения (volatile float).FoodDataSaciedadMorph—@VifadaMorph(target = "net.minecraft.world.food.FoodData"), читаетFoodData#saturationчерез@VifadaShadow, обновляетSaciedadCacheпри каждомFoodData#tick.saciedad.ptr— Puertas access-widener:mutable field net/minecraft/world/food/FoodData saturation F.saciedad.toml— дефолтный файл конфигурации.vida.mod.json— манифест мода;vifadaперечисляетFoodDataSaciedadMorph.- Тесты:
SaciedadConfigTest(парсинг hex-цвета, Posicion, Ajustes),SaciedadHudRenderizadorTest(headless GL-mock, пропорции шкалы, позиции). - Производительность: < 0.1% CPU, 0 аллокаций на кадр.
PuntoRuta— record путевой точки (nombre,dimension,x,y,z); методыdistanciaHorizontal,distancia3d.SendaCatalogo— реестр точек поверхCatalogoManejador; активные точки вConcurrentHashMap(CRUD), официальныйCatalogoMutable(append-only, полный журнал).SendaLatidos— событияPuntoAgregado,PuntoEliminado,DimensionLimpiada.SendaConfig— конфигурация:maxPuntosPorDimension(1–1000, по умолчанию 50),dimensionInicial.SendaMod— entrypoint; связывает Catalogo + Ajustes + Latidos.senda.toml— дефолтный файл конфигурации.- Тесты:
SendaConfigTest(парсинг, валидация диапазонов, invalid dimension),SendaCatalogoTest(CRUD, события, лимиты,tamanioRegistrovscantidad).
render/build.gradle.kts— добавленаapi-зависимость на:base(нужнаLatidoRenderHud→Latido).settings.gradle.kts— добавлены:mods:saciedadи:mods:senda.
- Никаких
TODO/FIXMEв коде новых модулей; провереноrg -n 'TODO|FIXME|XXX' mods/. - Все публичные типы модов аннотированы
@ApiStatus.Preview("saciedad")/@ApiStatus.Preview("senda").
Рендеринг, сеть и data-driven prototype: два новых API-модуля, preview-расширения Vifada и чтение контента из vida.mod.json + datapack без Java-entrypoint.
ModeloBloqueиModeloEntidadдля декларативного описания моделей блоков/сущностей.TextureAtlasс явнымmissing-textureи resolver-контрактом.RenderPipelineс регистрацией моделей и shader hooks.ShaderHook+ContextoShaderдля этаповANTES_MUNDO/DESPUES_MUNDO/HUD.- Безопасный fallback по умолчанию: блок без модели рендерится как
cube + missing-texture, сущность —entity/simple + missing-texture.
- Маркеры направления:
PaqueteCliente,PaqueteServidor,DireccionPaquete. TramaPaquetewire-level frame (tipo,direccion,versionCodec,payload).CodecPaquete<T>— контракт сериализации пакета.CodificadorRegistros— авто-кодек для Javarecord(primitives +String+Identifier+enum).TejidoCanal— версиярованные codecs, queue-based отправка, fallback decode на ближайшую меньшую версию (floorEntry).TejidoError— типизированные ошибки (TipoNoRegistrado,VersionNoSoportada,BackPressure,PayloadInvalido).
- Новый модуль
:fuente, пакетdev.vida.fuente:FuentePrototipoParserFuenteContenidoModFuenteBloque,FuenteObjeto,FuenteRecetaShapedFuenteError
- Prototype-чтение
custom["vida:dataDriven"]изvida.mod.json. - Разбор datapack JSON (
bloques/*.json,objetos/*.json,recipes/*.json, толькоtype = "vida:shaped"). - Интеграция в bootstrap: parsed snapshot доступен как
VidaEnvironment.fuenteDataDriven(). LoaderError.DataDrivenFailureдля ошибок parser/IO в prototype-контуре.
- Новые аннотации API:
@VifadaMulti@VifadaLocal
- Обе помечены
@ApiStatus.Preview("vifada-next")как публичный контракт следующего этапа развития Vifada.
- Новые страницы:
docs/modules/render.md,docs/modules/red.md. - Обновлены:
docs/modules/index.md,docs/modules/vifada.md,docs/index.md,docs/architecture/overview.md,docs/reference/api-stability.md,docs/reference/manifest-schema.md,docs/roadmap.md,docs/session-roadmap.md.
settings.gradle.kts— добавленыinclude(":render")иinclude(":red").loader/internal/BootSequenceтеперь собирает data-driven snapshot для каждого разрешённого мода.VidaEnvironmentрасширен accessor'омfuenteDataDriven().
- Data-driven формат в 0.6.x — прототип (
preview), без гарантий стабильности до 1.0.0. - Runtime-обработка
@VifadaMulti/@VifadaLocalбудет добавляться итеративно; в 0.6.0 это compile-time API.
Мир и сущности: два новых публичных API-модуля, world-латидосы и shortcut для тиковых подписчиков.
Entidad— декларативный descriptor entity-type (Identifier,TipoEntidad,PropiedadesEntidad).TipoEntidad— типовые категории (CRIATURA,MONSTRUO,AMBIENTAL,ACUATICA,UTILIDAD,PROYECTIL,JEFE,MISCELANEA) с предикатамиesHostil()/esViva().PropiedadesEntidad— масса,Hitbox,GrupoIa, entity data-components; fluent-builder с валидацией.ComponenteEntidad,ClaveComponenteEntidad,MapaComponentesEntidad— типизированная система entity data-components (Salud,VelocidadMovimiento,NombreVisible,Brillo,InmuneFuego,TablaBotin).RegistroEntidades— типизированная регистрация сущностей поверхCatalogoManejador.
Mundo— минимальный runtime-контракт мира:id,dimension,biomaEn,estaCargado,tiempoDelDia.Coordenada— immutable world-position с helper'амиdesplazar,chunkX,chunkZ,distanciaCuadrada.Dimension— value-type измерения с built-inOVERWORLD,NETHER,END.Bioma— value-type биома (temperatura,humedad,precipitacion) с helper'амиesFrio()иtienePrecipitacion().LatidosMundo— world-событияMundoCargado,ChunkCargado,Tick,NocheAmanece.
@OyenteDeTick(tps=...)— shortcut дляLatidoPulsoс частотным throttling'ом по корневым тикам.- Поддерживает те же executor-параметры, что и
@EjecutorLatido:kind,etiqueta,prioridad,prioridadBus,fase. LatidoRegistradorтеперь понимает@OyenteDeTickи валидирует конфликты аннотаций (AnotacionesConflictivas) и диапазонtps(TpsInvalido).
docs/modules/entidad.md— обзор entity API.docs/modules/mundo.md— обзор world API иLatidosMundo.docs/guides/first-entity.md— минимальный walkthrough по первой сущности.- Обновлены
docs/index.md,docs/modules/index.md,docs/guides/index.md,docs/modules/base-ejecutor.md,docs/reference/api-stability.md,docs/architecture/overview.md,docs/roadmap.md.
settings.gradle.kts— добавленыinclude(":entidad")иinclude(":mundo").- Граф публичных preview-модулей расширен модулями
entidadиmundo.
- Все новые публичные типы помечены
@ApiStatus.Preview("entidad"|"mundo"|"base"). - Для
@OyenteDeTicksubtick-события намеренно не доставляются; если нужен каждыйLatidoPulso, используйте@EjecutorLatido.
DX и наблюдаемость: профайлер, авто-регистрация подписчиков, поддержка Modrinth App и CurseForge App в инсталляторе.
VigiaSesion— start/stop/snapshot; запись в.jfr+ in-memoryResumen.Resumen— агрегированный снимок: duration, samples, top-20 методов (MetodoMuestra), метрики Latido (LatidoMetrica), статистика Susurro.VigiaReporte— self-contained HTML-отчёт с flame-chart (CSS bars), top-N таблицей, Susurro-breakdown и XSS-escaping.VigiaComando— контракт команды/vida profile start|stop|dumpдля loader'а.- Интеграция с
Susurro.Estadisticas— при привязке пула черезsesion.conSusurro(s)в Resumen попадают activos/pendientes/completadas.
LatidoRegistrador.registrarEnObjeto(bus, instance, susurro, hp)— сканирует методы, помеченные@EjecutorLatido, создаёт правильныйEjecutor(SINCRONO / SUSURRO / HILO_PRINCIPAL), подписывает с корректнойPrioridad/Fase. Одна строка вместо ручныхsuscribir(...).- Валидация сигнатуры: ровно один параметр, присваиваемый типу события из
static final Latido<E>поля класса события (конвенцияTIPO) или класса-владельца. LatidoRegistradorError— sealed-иерархия ошибок:FirmaInvalida,LatidoNoEncontrado,LatidoAmbiguo,EjecutorFaltante,TipoIncompatible.@EjecutorLatidoрасширен: новые поляprioridadBus(PrioridadBus) иfase(FaseBus) для управления приоритетом/фазой подписки без ручного кода.
ModrinthHandler— полная поддержка Modrinth App (режимPATCH_EXISTING_INSTANCE).ModrinthDbReader— чтение профилей из SQLiteapp.db(JDBC); обновлениеjava_argsс-javaagent.- Зависимость:
org.xerial:sqlite-jdbcдобавлена в installer fat-jar.
CurseForgeHandler— полная поддержка CurseForge App (режимPATCH_EXISTING_INSTANCE).CurseForgeJsonPatcher— патчингjavaArgsOverrideвminecraftinstance.json: добавление, замена существующего-javaagent, сохранение прежних аргументов.CurseForgeInstanceScanner— сканированиеInstances/для--list-instances.
docs/modules/vigia.md— полная документация модуля Vigia.docs/modules/base-ejecutor.md— Ejecutor, @EjecutorLatido, LatidoRegistrador.- Обновлён
docs/modules/installer.md— добавлены секции Modrinth и CurseForge. - Обновлён
CHANGELOG.md— этот файл.
LauncherKind.MODRINTHиLauncherKind.CURSEFORGE—implemented=true.LauncherRegistry— зарегистрированыModrinthHandlerиCurseForgeHandler.installer/build.gradle.kts— добавлена зависимостьsqlite-jdbc.gradle/libs.versions.toml— добавлена версияsqlite-jdbc = "3.47.1.0".settings.gradle.kts—include(":vigia").
- Никаких placeholder'ов или
TODO/FIXMEв коде новых модулей. - Все новые публичные классы аннотированы
@ApiStatus.Preview.
Крупный релиз: четыре новых публичных API-модуля, потокобезопасная шина
событий, access-wideners и улучшения тулчейна. Совместимость с base 0.1.x
сохранена — ни одного API-метода не удалили и не переименовали.
Bloque+PropiedadesBloque(fluentConstructorс валидацией и дефолтами по материалу).MaterialBloque(solido / inflamable / liquido / traversable),SonidoBloqueс пресетами.FormaColisionкак объединениеCaja-AABB, методыunion,contiene,exterior,aabb.NivelHerramienta(wooden → netherite сrangoиsatisfechoPor),TipoHerramienta.BloqueEntidad+ContextoBloqueEntidadсserializar/deserializar.RegistroBloquesповерхCatalogoManejador—registrar,etiquetar,miembros,obtener.EtiquetaBloque— типизированные block-tag'и.
Objeto+PropiedadesObjeto(fluent builder,maxPila=1enforce для инструментов).Material(стандартные пресеты: дерево/камень/железо/алмаз/незерит/золото) иHerramienta.Raridadс RGB-цветами,TipoObjeto.- Система data-components 1.21.1: sealed
Componenteс записямиDatosModeloPersonalizados,Irrompible,Durabilidad,Comida,AtributosModificados, …; типизированныйClaveComponente; иммутабельнаяMapaComponentesсcon,obtener,fusionar. ObjetoDeBloqueдля сопоставленияBloque↔Objeto.RegistroObjetos,EtiquetaObjeto.
Susurro.Politica(workers, maxCola, maxPorEtiqueta)+ дефолтная политика (workers = max(2, cpu/2),maxCola = 1024).Prioridad(ALTA/NORMAL/BAJA) + приоритетная очередь; FIFO внутри приоритета.Etiquetaдля back-pressure по лейблу — лимит одновременных задач per-tag.Tarea<T>: обёрткаCompletableFutureсо своимEstado(PENDIENTE→INICIADA→COMPLETADA/FALLADA/CANCELADA);conPlazo(Duration)(трактуетTimeoutExceptionкак cancellation);enHiloPrincipal(HiloPrincipal, Consumer)для маршалинга результата.HiloPrincipal— FIFO-очередьRunnable-ов для исполнения на игровом тике черезpulso().Susurro.Estadisticas(activos, pendientes, completadas, rechazadas, workers).AutoCloseable— аккуратныйshutdownс 5-секунднымawaitTermination.
- Формат
.ptrс заголовкомvida-puertas <версия> namespace=<crudo|intermedio|exterior>; комментарии#. - Директивы
accesible|extensible|mutable class|method|field ...с полной JVM-descriptor-валидацией. PuertaParser.parsear(Path|String|Reader)→ParseResultс диагностикой (CabeceraInvalida,DirectivaTruncada,DirectivaInvalida,DescriptorMalformado,NamespaceDesconocido,VersionNoSoportada,MutableNoAplicable).PuertaArchivo— иммутабельное представление, индексацияparaClase(...),combinar(...)для нескольких файлов с проверкой совпаденияNamespace.AplicadorPuertas.aplicar(byte[], List<PuertaDirectiva>)— ASM-трансформер, меняет флаги доступа (ACC_PUBLIC/ACC_PROTECTED/ACC_PRIVATE/ACC_FINAL) на ClassNode/FieldNode/MethodNode; возвращаетInforme(aplicadas, perdidas).- Семантика:
accesibleповышает видимость,extensibleснимаетfinalу класса/метода,mutableснимаетfinalу поля (не применим к class/method).
Ejecutor— SAM-интерфейс стратегии исполнения для обработчиков событий.- Статическая константа
SINCRONO— исполнение inline в потокеemitir. - Фабрики:
hiloPrincipal(HiloPrincipal),susurro(Susurro, Prioridad, Etiqueta),serializado(String)(однопоточный FIFO).
- Статическая константа
- Новая перегрузка
LatidoBus.suscribir(Latido, Prioridad, Fase, Ejecutor, Oyente). Все предыдущиеsuscribir(...)-вызовы сохранены и трактуются какEjecutor.SINCRONO— обратная совместимость API 0.1.x не нарушена. DefaultLatidoBusиспользуетEjecutor.ejecutar(Runnable)вне critical-path; ошибки подписчиков ловятся и логируются, как и раньше.@EjecutorLatido(kind, etiqueta, prioridad)— аннотация-маркер метода для последующего авто-биндинга черезLatidoRegistrador(0.4.x).- Асинхронные подписчики на отменяемые события логируются с предупреждением (их решения об отмене игнорируются — гарантия согласованности потока эмиссии).
- Gradle-plugin (
dev.vida.mod):- Задача
vidaValidatePuertas— парсит и валидирует все.ptrиз DSLmod { puertas = [...] }. При ошибке собирает все проблемы в одно сообщение с указанием файла/строки. - Задача
vidaPackagePuertas— после валидации копирует.ptrвbuild/generated/vida/puertas/, сохраняя иерархию. Папка автоматически подключается как resource srcDir дляmainsourceSet. - Авто-подключение: если в манифесте есть хоть один
puertas-путь,processResourcesначинает зависеть отvidaPackagePuertas, аJar— отvidaValidatePuertas.
- Задача
- Installer: флаг
--validate-puertas <file|dir>(новоеAction.VALIDATE_PUERTAS); рекурсивный обход директорий, exit-code0при успехе,1при user-error,2при ошибках парсинга.
docs/roadmap.md— блок «Done (0.3.0)» и пересобранный план 0.4.x — 1.0.docs/session-roadmap.md— подробный план оставшихся сессий до 1.0 и трёх мод-проектов.CHANGELOG.md— этот файл.
base/build.gradle.kts— новаяapi-зависимость на:susurro(нужна дляEjecutor.susurro(...)/Ejecutor.hiloPrincipal(...)). Старый код модов продолжает компилироваться без изменений — классыSusurro/HiloPrincipalдоступны на classpath, но их использование не требуется, покаEjecutor.SINCRONOостаётся дефолтом.gradle-plugin/build.gradle.ktsиinstaller/build.gradle.ktsполучилиimplementation(project(":puertas")).
- Никаких placeholder'ов или
TODO/FIXMEв коде новых модулей нет; новый код прошёл локальную проверкуrg -n 'TODO|FIXME|XXX' bloque objeto susurro puertas→ пусто. - Все новые публичные классы аннотированы
@ApiStatus.Preview("<module>")— см. api-stability.md.
Все базовые модули (core, manifest, config, cartografia, discovery, resolver, vifada, loader, base, gradle-plugin, installer) и multi-launcher installer (Mojang / Prism / MultiMC / ATLauncher). Подробности — в docs/index.md и README.md.