v0.1.1
Pre-release[0.1.1] — 2026-07-07
Ciclo perfectivo que corrige los 12 hallazgos Menores y el residuo WARNING-01
identificados durante la revisión final del release 0.1.0, más el ciclo
correctivo de la auditoría de production-readiness: cierra la única grieta
funcional (el release gate del pin de revisiones en la carga del engine) y siete
Menores (gate de daemon serve, identidad del health check, sandbox acotado del
daemon, exactitud documental y procedencia del lockfile). Todos los cambios
de contrato son aditivos: los códigos de salida existentes no cambian y
schema_version permanece en "1".
Añadido
--jsonen los cuatro comandos de escritura (R-03):voice add
({name, reference, speech}),voice remove({name, removed}),setup
({model, already_cached, downloaded, cache_dir}, con variante para
--remove-path) ycleanup({removed, dry_run}). El contrato programático
queda simétrico: ningún comando obliga a parsear texto.cleanup --json
exige--yeso--dry-run(exit 4 sin ellos) y envía sus listados
informativos a stderr.- Referencia de esquemas
--jsonenUSAGE.md(R-04): las claves de los
nueve payloads (tipo y significado) declaradas por escrito como parte del
contrato, sin necesidad de ingeniería inversa. - Revisión fijada del modelo por release (R-15):
setupdescarga ambos
repos de HuggingFace conrevision=(commit hash auditado, constantes
MODEL_REVISIONS/BASE_MODEL_REVISIONenmodel_cache.py) y la detección
de caché valida el snapshot de esa revisión en ambos repos (ciclo posterior
cerró el residuoWARNING-01del repo base); el bump del pin es un paso del
runbook de release (docs/RELEASING.md) y su alcance está descrito en
SECURITY.md. - Plantillas de Issue/PR en
.github/(R-12): formularios de bug (versión,
SO, comando reproducible, salida) y de propuesta,blank_issues_enabled: falsecon la vía de seguridad señalizada, y checklist de PR alineado a
CONTRIBUTING.md.
Cambiado
-
Documentación del bloqueo SmartScreen/Gatekeeper ampliada:
README.md,
USAGE.md,SECURITY.mdydocs/BUILD.mdexplican por qué el sistema
bloquea el primer arranque (binario sin firma + sin reputación por ser cada
release un archivo nuevo), que no indica malware, cómo proceder paso a paso
(incluido el bloqueo del navegador y la cuarentena de antivirus de terceros,
siempre tras verificar el SHA-256) y la ruta prevista de firma de código vía
SignPath Foundation (gratuita para proyectos open source). -
daemon stophonesto durante la ventana de arranque (R-05): detecta el
daemon en arranque por cmdline (sin PID file), avisa «arrancando; aún no
acepta conexiones» y termina con exit 5 en vez de reportar un éxito falso;
no mata el proceso. Documentado endocs/DAEMON-MODE.md. -
CI con imágenes fijadas por digest y pip pineado (R-14): las tres
referenciascimg/python:3.13usan@sha256:<digest>(manifest list
multi-arch) y los sietepip install --upgrade pippasaron a versión exacta.
Excepciones documentadas:brew upgrade pyenv(necesario para el parche
3.13.14; no altera el artefacto) ycreate-dmg(Homebrew no pinea).
Implicaciones y procedimiento de bump endocs/BUILD.md§Reproducibilidad. -
Exactitud documental (R-11, R-13): stack de reproducción real
(winsound/sounddevice/afplay) endocs/DESIGN.mdydocs/ARCHITECTURE.md
(antes describían pycaw-WASAPI/pyalsaaudio/AVFoundation); árboles de
estructura convoices.py,paths.pyymodel_cache.py; CI descrito como
Linux/Windows/macOS enCONTRIBUTING.md; conteo de tests actualizado a
268 endocs/GOAL.md; inventario de licencias consistente (dependencias
copyleft-compatibles mencionadas enUSAGE.md/CLAUDE.md; los runtimes
NVIDIA no van en ningún artefacto distribuido —README.mdy
THIRD-PARTY-LICENSES.md). -
El engine honra las revisiones fijadas en la carga y en las descargas de
respaldo (release gate de la auditoría de production-readiness): la
resolución de snapshot en tiempo de carga (language pack y snapshot base del
Voice Encoder) y las dos redes de seguridad de descarga (snapshot_download
del modelo,hf_hub_downloaddeve.safetensors) pasanrevision=
(MODEL_REVISIONS/BASE_MODEL_REVISION). Cierra la asimetría por la que la
detección honraba el pin pero la carga caía al fallbackrefs/main→mtime: tras
un bump futuro de revisión ya no puede producirse síntesis silenciosa con el
modelo viejo. Simétrico consetupy la detección de caché. -
daemon serveexige el modelo en caché antes de arrancar (auditoría de
production-readiness): mismo gate quedaemon start; sin modelo provisionado
falla rápido remitiendo asetup(exit 2) sin cargar el engine ni disparar la
descarga de su red de seguridad. Ningún subcomando descarga de forma implícita. -
Sandbox de audio del daemon acotado a un subdirectorio namespaced
(auditoría de production-readiness):/synthesizeacepta audio bajo los
directorios de voces (fábrica/usuario) y<tempdir>/tts-sidecar/, pero ya no
bajo el tempdir compartido general (%TEMP%//tmp), reduciendo la superficie
de temp compartido preservando el staging IPC.docs/DAEMON-MODE.mdy
USAGE.mddescriben la superficie real. -
Exactitud documental de estados, conteos y
doctor(auditoría de
production-readiness):daemon statusdocumenta los valores reales
("healthy"/"initializing", ya no"ready") en prosa y en la tabla del
esquema JSON deUSAGE.md; el ejemplo dedoctorincluye el chequeo de RAM y
el total de chequeos coherente (5); conteo de tests a 268. -
requirements-lock.txtregenerado con el comando canónico (auditoría de
production-readiness): sin el--constrainta un archivo externo al repo; su
header ya no referencia ningún override y la procedencia vuelve a ser
reproducible desdeCLAUDE.md/docs/BUILD.md. La resolución de versiones es
idéntica a la anterior; instala con--require-hashes.
Corregido
voice listante un directorio de voces ilegible (R-01): el mensaje
apunta al directorio de voces de usuario implicado en vez de remitir a
tts-sidecar setup(que no resuelve un problema de filesystem); conserva
exit 3.speak --daemon --no-daemon(R-02): los flags contradictorios producen
un error claro en stderr y exit 4 antes de cualquier trabajo, en vez de que
--daemongane en silencio.- Validación de integridad de los tres checkpoints (R-07):
is_model_cached
valida el header safetensors también des3gen_v3.safetensorsy
ve.safetensors(antes solo del T3): una descarga truncada de cualquiera se
reporta como «no cacheado» ydoctorremite asetup, en vez de reventar
con un error críptico en el primerspeak. - Fixture
mock_daemon_clientalineada con el cliente real (R-10): la
firma desynthesizecoincide conDaemonIPCClient.synthesize
(on_progressen vez de los inexistentesmodel/compute_backend). - La detección de vida del daemon valida la identidad del servicio
(auditoría de production-readiness):DaemonIPCClient.is_runningya no acepta
cualquier200en/health, sino que valida el cuerpo contraHealthResponse;
si otro servicio local ocupara el puerto 8765 y respondiera200, ya no se
confunde con un falso «daemon ya corriendo» (que derivaba en síntesis fallidas
con exit 5 difícil de atribuir).DaemonManagerdelega en el mismo chequeo. - Detección del Voice Encoder honra la revisión fijada del repo base
(WARNING-01, residuo de R-06):is_ve_cachedresuelve el snapshot del
repoResembleAI/chatterboxexclusivamente contraBASE_MODEL_REVISION(un
VE de otra revisión ya no cuenta como caché válida), simétrico con la
descarga desetupy con la rama del language pack. Cobertura nueva: caso
positivo bajoBASE_MODEL_REVISIONy caso negativo (revisión distinta) en
tests/test_engine_cache.py. Párrafo deUSAGE.mdsobre actualización
anclado al mecanismo real (revisión fijada por release + deduplicación por
blob de la caché de HF). - Decisión de validación E2E documentada (criterios 1-3, 9 de
docs/GOAL.md): la validación end-to-end de los instaladores por SO es
externa al pipeline por diseño (consume demasiada cuota de runner al cargar
el modelo y los ~2 GB de pesos en cada build). El pipeline mantiene el smoke
test automatizado del binario congelado. Fuera del pipeline: Windows la
realiza el propietario sobre su equipo local; Linux y macOS dependen de
feedback de usuarios reales. La decisión completa está endocs/GOAL.md
§"Decisión de validación E2E" ydocs/BUILD.md§"Verificación post-build".