JSON-Rohbericht maschinenlesbar
{
"data": {
"repo": {
"topics": [],
"is_fork": false,
"size_kb": 6237,
"has_wiki": true,
"homepage": null,
"languages": {
"HTML": 46413,
"Shell": 15741,
"Python": 649392
},
"pushed_at": "2026-07-30T20:30:27Z",
"created_at": "2026-07-07T21:16:16Z",
"owner_type": "User",
"updated_at": "2026-07-30T20:29:34Z",
"description": "MCP that delegates mechanical text tasks to a local OpenAI-compatible LLM endpoint to conserve Claude subscription quota.",
"is_archived": false,
"is_disabled": false,
"license_spdx": "MIT",
"default_branch": "main",
"license_spdx_raw": "MIT",
"primary_language": "Python",
"significant_languages": [
"Python"
]
},
"owner": {
"blog": "https://resume.io/r/2Vo3ymadF",
"name": "Yohan González Almaguer",
"type": "User",
"login": "ZahiriNatZuke",
"company": "Kernel Shift SAS",
"location": "Montevideo, Uruguay ",
"followers": 22,
"avatar_url": "https://avatars.githubusercontent.com/u/41224027?v=4",
"created_at": "2018-07-14T04:30:52Z",
"is_verified": null,
"public_repos": 33,
"account_age_days": 2938
},
"license": {
"state": "standard",
"spdx_id": "MIT",
"raw_spdx": "MIT",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v0.17.0",
"kind": "minor",
"published_at": "2026-07-30T20:30:27Z"
},
{
"tag": "v0.16.0",
"kind": "minor",
"published_at": "2026-07-30T16:18:14Z"
},
{
"tag": "v0.15.0",
"kind": "minor",
"published_at": "2026-07-30T15:32:24Z"
},
{
"tag": "v0.14.0",
"kind": "minor",
"published_at": "2026-07-30T15:09:21Z"
},
{
"tag": "v0.13.1",
"kind": "patch",
"published_at": "2026-07-29T18:04:48Z"
},
{
"tag": "v0.13.0",
"kind": "minor",
"published_at": "2026-07-29T17:08:49Z"
},
{
"tag": "v0.12.4",
"kind": "patch",
"published_at": "2026-07-29T15:42:03Z"
},
{
"tag": "v0.12.3",
"kind": "patch",
"published_at": "2026-07-29T13:46:14Z"
},
{
"tag": "v0.12.2",
"kind": "patch",
"published_at": "2026-07-28T23:05:19Z"
},
{
"tag": "v0.12.1",
"kind": "patch",
"published_at": "2026-07-28T02:15:32Z"
},
{
"tag": "v0.12.0",
"kind": "minor",
"published_at": "2026-07-28T01:22:12Z"
},
{
"tag": "v0.11.0",
"kind": "minor",
"published_at": "2026-07-28T00:11:29Z"
},
{
"tag": "v0.10.0",
"kind": "minor",
"published_at": "2026-07-24T02:33:25Z"
},
{
"tag": "v0.9.0",
"kind": "minor",
"published_at": "2026-07-23T19:21:18Z"
},
{
"tag": "v0.8.1",
"kind": "patch",
"published_at": "2026-07-12T04:29:50Z"
},
{
"tag": "v0.8.0",
"kind": "minor",
"published_at": "2026-07-11T20:49:08Z"
},
{
"tag": "v0.7.0",
"kind": "minor",
"published_at": "2026-07-10T13:40:34Z"
},
{
"tag": "v0.6.0",
"kind": "minor",
"published_at": "2026-07-10T12:48:36Z"
},
{
"tag": "v0.5.0",
"kind": "minor",
"published_at": "2026-07-10T02:05:40Z"
},
{
"tag": "v0.4.0",
"kind": "minor",
"published_at": "2026-07-10T02:05:37Z"
},
{
"tag": "v0.3.0",
"kind": "minor",
"published_at": "2026-07-10T00:15:54Z"
},
{
"tag": "v0.2.1",
"kind": "patch",
"published_at": "2026-07-09T18:52:40Z"
},
{
"tag": "v0.2.0",
"kind": "minor",
"published_at": "2026-07-09T18:36:50Z"
},
{
"tag": "v0.1.1",
"kind": "patch",
"published_at": "2026-07-08T23:24:47Z"
},
{
"tag": "v0.1.0",
"kind": "minor",
"published_at": "2026-07-08T23:06:30Z"
}
],
"recent_commits": [
{
"oid": "c8b4b62217a393dce01b1bc957e8bbfecc57defe",
"body": "Cierra la seccion Unreleased, que acumulaba cuatro bloques: el subcomando\n`local-delegate update`, la marca unica con sus metadatos sociales, los iconos\nPNG con manifest y datos estructurados, y la retirada del instalador de hooks de\nmacOS junto con la salida de scripts/ del sdist.\n\nRegenera la captura del README, que enseñaba la v0.15.0 y el icono anterior a la\nmarca unica.",
"is_bot": false,
"headline": "chore(release): 0.17.0 (#71)",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-30T20:29:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "89882cebc42768550cba278ca8939f6ad4f513d7",
"body": "…n script del taller (#70)\n\nLa receta de macOS mandaba a ejecutar ./scripts/update_to_latest.sh, y esa\nmaquina nunca tuvo ese fichero: el paquete publicado no empaqueta scripts/. Era\nel bug que el PR #66 vino a resolver, pero la wiki se quedo apuntando al camino\nviejo.\n\nAhora documenta `local-delega\n[…]\n se publica.\n\nDe paso, quita el numero de version clavado en la seccion de Claude Code: decia\n0.14.0 y el texto solo necesita decir \"la actual\".\n\nIncluye el cierre de la traza SDD del cambio anterior.",
"is_bot": false,
"headline": "docs(wiki): la Mac se actualiza con `local-delegate update`, no con u…",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-30T20:24:20Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "372e4ad4597c6cba1235d8da2e3a7d749b675819",
"body": "… de macOS (#69)\n\nEl sdist publicaba el repositorio entero (124 entradas) y con el viajaba\nscripts/install_claude_code_hooks_macos.sh: bajaba cuatro .py de\nraw.githubusercontent.com con curl, los registraba en ~/.claude/settings.json y\nlos ejecutaba acto seguido, sin verificar hash ni firma. Socket \n[…]\n,\ny la condicion mira el DIRECTORIO y no el fichero: si el directorio esta pero el\nscript no, eso es un borrado accidental y la suite tiene que romperse. Probado\nen los dos sentidos, no solo razonado.",
"is_bot": false,
"headline": "fix(build): sacar scripts/ del sdist y retirar el instalador de hooks…",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-30T20:16:59Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "78737cdecc9b89f1c830ebc8e2359301ec240913",
"body": "…(#68)\n\nUn checker publico de OpenGraph le puso 72/100 a la landing con siete\navisos. Seis son reales; el septimo no, y aqui se descarta con la\ncomprobacion hecha.\n\nLo que se arregla:\n\n- `apple-touch-icon.png` (180x180) y `favicon-32x32.png`. No son otro\n dibujo: `site/icon.src.html` carga el MISMO\n[…]\nreves: se inyecto cada\ndefecto (el `sizes` que no cuadra, la ruta absoluta, la descripcion\nlarga, otra cuenta de X, la version a mano, un icono ausente del\nmanifest) y cada uno fue cazado por su test.",
"is_bot": false,
"headline": "feat(site): iconos PNG, manifest y datos estructurados en la landing …",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-30T20:04:47Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "fcf462b383b5b1ef9e428e7b3fe31098405d721d",
"body": "…ng (#67)\n\n* feat(site): una sola marca y metadatos sociales completos en la landing\n\nLa landing y el dashboard tenian dos iconos distintos: un glifo amarillo en la\npagina y un chip esmeralda en el panel. Y el amarillo es, literalmente, el color\nque el propio CSS de la landing declara como \"de senal\n[…]\n: que la regla del resalte no mencione\n--local y que el span cubra solo la nube en los dos idiomas. Verificado\nal reves: con el CSS viejo falla el primer assert, con el titular viejo\nfalla el segundo.",
"is_bot": false,
"headline": "feat(site): una sola marca y metadatos sociales completos en la landi…",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-30T19:03:12Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "090bbecca1b913a0df7b1ed7960a087bd513af91",
"body": "…arriba (#66)\n\n* feat(cli): `local-delegate update` revisa, completa y deja el daemon arriba\n\nActualizar deja de ser un script de bash que solo cambia un numero. El\nsubcomando consume `checks.run_all` --el mismo diagnostico que ve `doctor`, sin\nuna segunda definicion de \"estar a punto\"-- y aporta en\n[…]\nna el default a la instancia--, asi que la\nllamada parece llevar un argumento de mas. CodeQL lo reporta como error y\nbloquea el merge. Funcionaba, pero la ambiguedad es real: mejor no dejarla\nescrita.",
"is_bot": false,
"headline": "feat(cli): `local-delegate update` revisa, completa y deja el daemon …",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-30T18:58:40Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "19a84eeac238f8b3a3c954b39be277f59fbe1677",
"body": "…#65)\n\n* feat(site): la landing vive en el repo y se publica en GitHub Pages\n\nUna pagina que explica que hace el proyecto y por que, en espanol e ingles,\ndesplegada sola en cada push a `main` que la toque.\n\nSe publica `site/` y no `docs/`, a proposito: `docs/` guarda la wiki, las\nrecipes y `plans/`,\n[…]\nde leyendo la pagina, no antes. Pasa a decir lo que hace, y en cada\nidioma:\n\n es local-delegate - delega lo mecanico a un modelo local\n en local-delegate - delegate the mechanical to a local model",
"is_bot": false,
"headline": "feat(site): la landing vive en el repo y se publica en GitHub Pages (…",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-30T16:49:10Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c29fc0c309bbbb7ab8ce33eae7e956e8623ddbf9",
"body": "Sale minor y no patch porque, ademas del arreglo, hay un cambio de\ncomportamiento: un argumento desconocido pasa a fallar con codigo 2 en vez de\narrancar el servidor MCP en silencio, y escribir `local-delegate` a secas en una\nterminal ahora avisa por stderr.\n\nContenido: el fix del despacho del CLI (\n[…]\nno\nimprimia nada y se colgaba, porque `--help` no estaba en la lista literal de\nsubcomandos que decidia el despacho y caia al servidor MCP stdio.\n\nIncluye tambien el cierre de la traza SDD del change.",
"is_bot": false,
"headline": "chore(release): 0.16.0 (#64)",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-30T16:17:41Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a2770ef5b64b2771eb6127874cb2def03beaf6af",
"body": "…P (#63)\n\n`local-delegate --help` no imprimia nada y se quedaba colgado hasta un Ctrl+C,\nque escupia sesenta lineas de traceback de anyio. No es que la ayuda saliera\nmal: nunca se llamaba a argparse.\n\nEl despacho del binario comparaba el primer argumento contra una lista literal\nde siete subcomandos\n[…]\nlp` ya no dice que el CLI sea solo para\nlos groups de llama-swap, que era lo primero que leia quien por fin conseguia\nque el comando respondiera.\n\nTraza SDD en `.sdd/changes/cli-help-arranca-el-mcp/`.",
"is_bot": false,
"headline": "fix(cli): `--help` imprime la ayuda en vez de arrancar el servidor MC…",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-30T15:58:25Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "620a585c0e1f3aecffa8117c9f47af7909eb63af",
"body": null,
"is_bot": false,
"headline": "chore(release): 0.15.0 (#62)",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-30T15:32:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5a23720ecac28be16372360a1db2878060f8e3c5",
"body": "… version vieja (#61)\n\n* feat(doctor): comprueba que el CLI exista y que el daemon no sirva la version vieja\n\nDos huecos que hacian quedar mal al producto por callar lo obvio.\n\nEl primero: toda la documentacion manda correr `local-delegate <algo>`, pero la\ninstalacion que ella misma recomienda -- `u\n[…]\ntapado por un NameError. El import sube al modulo y el except pasa a ser\nException, que es lo que de verdad se quiere aqui: no saber la version es un\ndato accesorio y nunca debe tumbar el diagnostico.",
"is_bot": false,
"headline": "feat(doctor): comprueba que el CLI exista y que el daemon no sirva la…",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-30T15:28:17Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c07ff5638c4dfc0458cff4db0f91c766fc3d1477",
"body": "Los reemplazos del PR #59 se hicieron con un script de Python y write_text, que\nen Windows escribe CRLF: tres ficheros que estaban en LF se reescribieron\nenteros y el diff enseno 418 lineas cambiadas donde solo cambiaron cinco.\n\nEs el mismo fallo contra el que el propio repo se protege en\ninstall._detect_newline, que existe justamente porque paso antes con el\nCLAUDE.md del usuario. \"git diff -w\" confirma que el contenido no cambia.",
"is_bot": false,
"headline": "docs: devuelve los tres ficheros de la wiki a LF (#60)",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-30T15:16:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3880092aa387593fc11a81fa1673a4f1e0497d36",
"body": "…ron el dia (#59)\n\nLos pins de ejemplo y la tabla de versiones probadas suben a 0.14.0. En\nTroubleshooting entran dos sintomas que pasaron de verdad: el hook que bloquea\ncada prompt en Windows en versiones anteriores a la 0.14.0 (con la ruta sin\nbarras, que es como se reconoce), y el backend que parece caido cuando en\nrealidad responde 401 por falta de credencial.",
"is_bot": false,
"headline": "docs: la wiki apunta a la 0.14.0 y documenta los dos fallos que costa…",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-30T15:13:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "aaab8837cb75cb0ad5f5f34e94bd51f7edf8cd1c",
"body": null,
"is_bot": false,
"headline": "chore(release): 0.14.0 (#58)",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-30T15:07:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "363e22b90aff1c0129d10a9dc14962251b3df4a5",
"body": "…la come (#57)\n\n* fix(install): la ruta del hook va citada y con barras, o el shell se la come\n\n`local-delegate install` dejaba el cliente inutilizable en Windows. El comando\nse registraba como `python C:\\Users\\...\\hook.py` sin comillas, y Claude Code lo\nentrega a un shell: cada `\\` se interpreta co\n[…]\ni que as_posix() no convertia nada y el\ntest fallaba en ubuntu y macos mientras pasaba en windows. PureWindowsPath tiene\nla misma semantica en las tres plataformas, que es justo lo que hay que probar.",
"is_bot": false,
"headline": "fix(install): la ruta del hook va citada y con barras, o el shell se …",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-30T14:58:33Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "baf8f5b5797e11afc3662f80465e1c79bd9cbeb9",
"body": null,
"is_bot": false,
"headline": "chore: cierra la traza SDD del registro de comprobaciones (#56)",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-30T14:27:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "90bfb81c313b71b7c5f689d06caa3b02d35d7ffd",
"body": "…e decia lo contrario (#55)\n\nEl check de hooks registrados afirmaba que las entradas con `args` «Claude Code\nno las ejecuta» y que estaban «muertas». Es falso: `args` es el exec form del\nschema y se ejecuta sin shell. Verificado dos veces por ejecucion -- el\n2026-07-29 viendo disparar `suggest_lint_\n[…]\ne que la afirmacion anterior era falsa para que nadie la reescriba.\n\nEl estado sigue siendo `warn`: no es lo que instala la version actual. Lo que\ncambia es que ya no acusa de muerto a algo que corre.",
"is_bot": false,
"headline": "fix(checks): los hooks del formato heredado SI se ejecutan; el detall…",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-30T14:22:50Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8b900b4cc63784a0ec66b0035c92f74f08d8ee0a",
"body": "…tema entero (#54)\n\n* feat(doctor): un registro unico de comprobaciones y un doctor que ve el sistema entero\n\nHasta ahora cada subcomando sabia un pedazo: `doctor` solo miraba el backend,\n`install` escribia sin verificar y nadie miraba el daemon. Nace `checks.py` con\nlas once comprobaciones del anda\n[…]\n en el fix_hint reventaba la consola cp1252 de\nWindows justo cuando algo estaba mal.\n\nTraza SDD en .sdd/changes/checks-andamiaje/.\n\n* docs: el README menciona que doctor comprueba tambien el andamiaje",
"is_bot": false,
"headline": "feat(doctor): registro unico de comprobaciones y doctor que ve el sis…",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-30T14:16:11Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6a1dabcae4a8b6a3782e4a7770d482ee234146cd",
"body": "…de el (#53)\n\nEl punto del backlog «update_to_latest.sh no reinicia nada» destapo algo mas\ngrande: doctor solo mira el backend, install escribe sin verificar y nadie mira\nel daemon. Cada subcomando sabe un pedazo y ninguno tiene la foto completa.\n\nSe parte en tres changes: A registro unico de compro\n[…]\ntaba: lo que corre el usuario va al CLI\ny lo que corre el repo se queda en scripts/. El wheel publicado no contiene\nscripts/, asi que update_to_latest.sh nunca llego a la maquina que debia\nactualizar.",
"is_bot": false,
"headline": "docs: planifica el registro de comprobaciones y aparca update detras …",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-30T13:54:14Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "72a8025084489d441dac7c72e62c56e7d6015a2e",
"body": "Los cinco gates aprobados y el change en `closed`, tras verificar CI, CodeQL y\nVendor audit verdes en main.",
"is_bot": false,
"headline": "chore: cierra la traza SDD del arreglo de configuracion de Codex (#52)",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-30T13:12:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d0983b5491c40cc230e252c2f99f5cbc3fdd5a7f",
"body": "Cierra los dos hallazgos que dejo la prueba de Codex: el choque de la entrada\n`github` que abortaba la carga de todos los MCP dentro del repo, y `rtk` sin\nresolver en el sandbox.\n\nLa causa de lo segundo no era la anotada en el backlog: el PATH estaba bien y el\nbinario se ejecuta por ruta absoluta, p\n[…]\nsandbox no\npuede enumerar el raiz del perfil, y sin enumerar no hay resolucion por PATH.\n\nSolo viaja la traza: los dos ficheros tocados son configuracion local fuera de\ngit (.gitignore cubre .codex/).",
"is_bot": false,
"headline": "docs: traza SDD del arreglo de configuracion de Codex (#51)",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-30T13:06:33Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "16f8846da8181cbee1b828b59f7b873f521bc4c5",
"body": "Cierra el pendiente de la fase 3 de la migracion al SDK mcp 2.x. Codex ve el\ndaemon como streamable_http en el 9393, llamo a local_classify de verdad y el\ndaemon registro el evento (ok: true, tokens_in: 67, v: 0.13.1) — verificado por\nlos dos extremos, no solo por lo que dice el cliente.\n\nDos confirmaciones que no se buscaban: Codex lee el structuredContent que anadio\nla fase 2, y la contabilidad del PR #48 procesa bien una llamada que no viene de\nClaude Code.\n\nSin cambios de codigo.",
"is_bot": false,
"headline": "docs: traza SDD de la prueba de Codex contra el daemon migrado (#50)",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-30T12:44:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0489246c78dd87456820e9c145449b8f291d0588",
"body": null,
"is_bot": false,
"headline": "chore: cierra la traza SDD de la contabilidad del chunking (#49)",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-29T19:44:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5beef6808a286c31e852acc14d6f20b8b94deadc",
"body": "* feat: el dashboard mide el coste, no solo el ahorro\n\nN llamadas al backend se registraban como un evento con `chunks: N`, y el panel\nsumaba solo `chars_in ÷ 4`: una delegación resuelta en una llamada y otra que\nquemó la GPU dieciséis veces daban exactamente el mismo número. El dato para\ndistinguir\n[…]\n, el de\nparidad falla con `assert 126195 == 2758`, el número fantasma del defecto original.\n\nTraza SDD en `.sdd/changes/contabilidad-chunking/`.\n\n* docs: completa el brief y el handoff de la traza SDD",
"is_bot": false,
"headline": "feat: el dashboard mide el coste, no solo el ahorro (#48)",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-29T19:38:58Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "dcc614cd680ec88608a57458162d060d78c32f1a",
"body": "Cierra la sección `Unreleased`: el arreglo de `local_extract` con `path`\n—que en la 0.13.0 devuelve un error en vez de los datos, justo en el\nmodo que ahorra contexto—, el panel «En curso» enseñando la última\ndelegación terminada, y la revisión completa del README y la wiki.\n\nPatch: no cambia ninguna API, arregla una que estaba rota.\n\nSe regenera la captura del README, que enseña tanto el badge de versión\ncomo el panel que se tocó.",
"is_bot": false,
"headline": "chore: prepara la 0.13.1 con el fix de local_extract y el panel (#47)",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-29T18:03:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "90be1c64589bba2679559c35504e088ea4043f10",
"body": "El panel solo mostraba lo que se estaba ejecutando **en ese instante**, y\nuna tarea mecánica dura 2-4 segundos: se delegaba, terminaba, y quien\nmiraba el dashboard un momento después no veía nada. Parecía que no\nhabía pasado nada — reportado en vivo tras una delegación de 4,1 s que\nel usuario no lle\n[…]\nado grabando el DOM durante una delegación real de 3,4 s: se ve\nen curso, y al terminar queda la marca con el contador subiendo.\n\nEl refresco al volver a la pestaña ya existía; el problema no era ese.",
"is_bot": false,
"headline": "feat: el panel «En curso» enseña la última delegación terminada (#46)",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-29T17:59:13Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7cf64d72370503cb6f469596ed15bd0c41a9cc4d",
"body": "La línea de ahorro («leído server-side: N chars…») se anexaba al texto\ndel resultado, y como esta tool **parsea** su salida, ese sufijo\nconvertía un JSON perfecto en uno imparseable: la respuesta acababa\nsiendo `_local_delegate.error`.\n\nAfectaba justo al modo que ahorra contexto —el que vale la pena\n[…]\nTroubleshooting, los tres fallos que este proyecto\nsí ha tenido.\n\nVerificado además que ninguna variable de entorno documentada falta en\nel código ni al revés, y que no queda ningún link interno roto.",
"is_bot": false,
"headline": "fix: local_extract con path devolvía un error en vez de los datos (#45)",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-29T17:47:59Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ce77b1fabeb53d451a2f39779eeb470cb8aabc52",
"body": "Los cinco gates aprobados. El `handoff.md` recoge el estado final —las\ndos fases mergeadas y publicadas en la 0.13.0, verificadas con\ninstalación limpia desde PyPI— y deja anotadas las dos cosas que de\nverdad importan de este cierre.\n\nLa primera: por qué se publicó sin esperar a `mcp` 2.0.1. Era pru\n[…]\nlatformdirs` y `httpx2` sin acotar; publicarla tal cual habría\nrevertido en silencio la política de la 0.12.3, porque `install-smoke`\nresuelve dentro del rango declarado y le habría parecido correcto.",
"is_bot": false,
"headline": "docs: cierra la traza SDD de la migración al SDK mcp 2.x (#44)",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-29T17:20:49Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2fc6e5ac930126ed7c0dce7d75b99c8bd5fae002",
"body": "Cierra la sección `Unreleased`, que llevaba las dos fases de la\nmigración: el cambio de `mcp.server.fastmcp` a `mcp.server.mcpserver`\ncon `httpx2` como única librería HTTP, y la adopción de `annotations`,\n`structured_output` y la presentación del server.\n\nEs minor y no patch porque **cambia un contr\n[…]\ne regenera la captura del dashboard del README, que enseña el badge de\nversión: ahora luce v0.13.0 y el Chart.js 4.5.1 de la 0.12.4. Sigue\nhecha con datos de ejemplo deterministas, sin actividad real.",
"is_bot": false,
"headline": "chore: prepara la 0.13.0 con la migración al SDK mcp 2.x (#43)",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-29T17:07:30Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "366d691e4ce1b1dea7057599b748d4f87b0e6e52",
"body": "… (fase 2) (#35)\n\n`local_extract` devuelve un objeto validado en vez de una cadena con JSON dentro. Quien llamaba tenía que hacer un json.loads —y antes limpiar el aviso de truncamiento, que iba como texto DELANTE del JSON y lo hacía imparseable—. Ahora las claves son exactamente las pedidas y lo qu\n[…]\nervidor se presenta con title, description y website_url.\n\nRebasada sobre main tras la fase 1, con 262 tests en verde y los 12 checks del CI —esta vez con CodeQL, que entre ramas de trabajo no corría.",
"is_bot": false,
"headline": "feat: adopta annotations, structured_output y presentación del server…",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-29T17:03:20Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6eb509e619dba3209f40cf41bf8a552aba00e283",
"body": "El import pasa de `mcp.server.fastmcp.FastMCP` a `mcp.server.mcpserver.MCPServer`, y el daemon fija la ruta del MCP con `streamable_http_app(streamable_http_path=…)` porque el major sacó los campos de transporte de `Settings`. Las 11 tools conservan nombre, firma y salida: la equivalencia es el crit\n[…]\nmport de arranque y su versionado tiene major real, así que cumple las dos condiciones del criterio.\n\nSe documentaron además los dos `except ... pass` que CodeQL marcó al cambiar el tipo de excepción.",
"is_bot": false,
"headline": "feat: migra al SDK mcp 2.x con httpx2 como única librería HTTP (#34)",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-29T16:59:11Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "be89ea81a608ffac20c1811dfaceff5ca8039176",
"body": "…4.5.1 (#42)\n\nCierra la sección `Unreleased`, que llevaba tres cosas que hasta ahora\nsolo existían en `main`: el vigilante del vendorizado, el\n`.gitattributes` que lo hace funcionar en Windows, y Chart.js 4.5.1.\n\nEs patch y no minor a propósito: el contenido es CI, un asset del\ndashboard y documenta\n[…]\na la consola cp1252 de\nWindows con `UnicodeEncodeError`. Falla imprimiendo y no escribiendo, así\nque nunca dejó un bump a medias, pero tumbaba el comando que existe para\nque el bump no se haga a mano.",
"is_bot": false,
"headline": "chore: prepara la 0.12.4 con el vigilante del vendorizado y Chart.js …",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-29T15:40:11Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d40d505d1ceb5b6e4017ff6dbfb12ebd71d4472a",
"body": "El primer encargo del vigilante, y su estreno de punta a punta: el aviso lo dio el CI en su primera corrida y esto lo atiende.\n\nLa copia se baja del tarball oficial de npm, no de un CDN —un CDN puede transformar lo que sirve, como probó el banner de 274 bytes de jsDelivr con la 4.4.1— y jsDelivr que\n[…]\nntado se estrenaba, y se corrige con lo aprendido: bajar del tarball, extraer también la licencia, y la caché de 24h del endpoint, que hace que el navegador siga enseñando el JS viejo tras actualizar.",
"is_bot": false,
"headline": "feat: sube el Chart.js vendorizado a 4.5.1 (#41)",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-29T15:27:56Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f7897a6287c01274a971766305dff72b3f2119a2",
"body": "Los cinco gates aprobados. El `handoff.md` recoge el estado final —PR #39\nmergeado, CI de `main` verde en sus tres workflows, y el cambio en\n`Unreleased`— y deja anotado lo único que queda vivo: subir Chart.js a\n4.5.1, que es el primer encargo del vigilante.\n\nQueda también el tropiezo que conviene n\n[…]\ne sobre `main`\nmetió la entrada del CHANGELOG dentro de `[0.12.3]`, ya publicada, porque\nel commit de esa versión había renombrado `Unreleased` justo donde\naterrizaba el diff. Git no ve conflicto ahí.",
"is_bot": false,
"headline": "docs: cierra la traza SDD del vigilante del vendorizado (#40)",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-29T14:42:36Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "dbe5dfa816bf3c86cc682b90d3c763b502b2db10",
"body": "…(#39)\n\n`resources/vendor/` son 205 KB de JavaScript de terceros que ninguna herramienta miraba: Dependabot solo ve manifiestos, CodeQL analiza el Python y Socket cubre dependencias declaradas. No había ni un hash registrado, así que un cambio en ese fichero no dejaba rastro y un CVE publicado mañan\n[…]\nlos LF del blob en CRLF y el hash no cuadraba sin que nadie lo tocara.\n\nChart.js NO se actualiza aquí (sigue en 4.4.1, con 4.5.1 publicada): el vigilante se estrena con una versión de estado conocido.",
"is_bot": false,
"headline": "feat: vigila el vendorizado de Chart.js (integridad, CVEs y versión) …",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-29T14:31:07Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d7fbd9193d0ec6fd360cb0cb6865177436c795f3",
"body": null,
"is_bot": false,
"headline": "chore: prepara la 0.12.3 con los techos de major (#38)",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-29T13:45:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "91a6499477fc39fb6d96b7693644ca5d7a92e3a9",
"body": null,
"is_bot": false,
"headline": "docs: cierra la traza SDD de la politica de techos de major (#37)",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-29T12:51:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "39cc69e6e0d99b6599d6af1000dae9c4a01901c5",
"body": "…ente (#36)\n\n* chore(deps): acota platformdirs y filelock por debajo del major siguiente\n\n* docs: registra el CI del PR en la traza SDD",
"is_bot": false,
"headline": "chore(deps): acota platformdirs y filelock por debajo del major sigui…",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-29T12:42:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cf3692f0ddce4009b906a3d175709bac917fb71c",
"body": "El tag a mano dejaba fuera dos pasos que habia que recordar cada vez: adjuntar\nel wheel y el sdist, y crear la GitHub Release, que publish.yml NO crea. En la\n0.12.2 se olvidaron los dos y hubo que corregirlos despues.\n\nEl script construye, crea la Release con las notas de la seccion del CHANGELOG,\na\n[…]\nes archivos, si\nmain no coincide con origin/main, o si el tag o la release ya existen: PyPI es\ninmutable y publicar mal no se deshace.\n\nIncluye el state.json final de la traza SDD del fix del SDK mcp.",
"is_bot": false,
"headline": "chore: anade scripts/release.py para publicar con un comando (#33)",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-29T00:32:16Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f2d380edfbabbf832a93dc9b7f0b4d2f84207963",
"body": "Verificacion, revision del resultado y handoff del cambio que entro en #31.\nIncluye la prueba negativa reproducible contra la 0.12.1 publicada y las notas\ndel veredicto: la migracion a la API 2.x, la politica de techos para el resto\nde dependencias y el defecto de serverInfo quedan diferidos con su motivo.",
"is_bot": false,
"headline": "docs: cierra la traza SDD del fix del SDK mcp (#32)",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-28T22:45:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "04672c29e0775cacfa5247c237666931cc6d20a1",
"body": "El SDK `mcp` publicó 2.0.0, que elimina `mcp.server.fastmcp`. Como la\ndependencia se declaraba sin techo, `uvx` resolvía al major nuevo y el proceso\nmoría en el import antes de poder hablar MCP: el cliente solo veía\n`MCP error -32000: Connection closed`. Afectaba a toda instalación nueva de la\n0.12.\n[…]\n y un check que no puede fallar no vigila nada.\n\nVerificado: la 0.12.1 publicada reproduce el fallo y el check lo caza con\ncódigo 1; con el techo, el wheel resuelve mcp 1.29.0 y el handshake responde.",
"is_bot": false,
"headline": "fix: acota el SDK mcp por debajo del major 2 (#31)",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-28T22:42:23Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d22d9dd12cfe7fe7f9a29a60b60ea60241aa2abb",
"body": "El script servía solo para este repo: los REQUIRED_CHECKS estaban hardcodeados y la regla\ncode_scanning se añadía siempre, lo que en un repo sin CodeQL bloquearía los PR. Ahora:\n\n- `--checks \"a|b|c\"` y `--check` repetible. El separador es `|` y no la coma a propósito: los\n nombres de job llevan com\n[…]\n, los 10 de angular-template-project (con\nVercel), los 2 de nest-template-project sin code_scanning, el caso de una errata en un nombre,\ny que aplicarlo dos veces deja el ruleset igual sin duplicarlo.",
"is_bot": false,
"headline": "ci: parametriza los checks requeridos de setup_repo_security.sh (#30)",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-28T11:58:34Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7dee3867997c0cf9dd1db7bfab4b0bc601ad51c8",
"body": "…deQL (#29)\n\nDos mejoras que salieron de comparar con el ruleset que ya tenía angular-template-project, al\nalinear los tres repos bajo la misma política:\n\n- `~DEFAULT_BRANCH` en vez de `refs/heads/main`: la regla sigue a la rama por defecto en vez de\n quedarse protegiendo un nombre que quizá ya no exista.\n- regla `code_scanning`: que el job de CodeQL termine en verde no basta, porque puede acabar\n bien y haber encontrado una alerta. Esta regla mira las alertas, no el resultado del job.",
"is_bot": false,
"headline": "ci: el ruleset sigue a la rama por defecto y exige el resultado de Co…",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-28T10:55:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "df38fbd5f66d8a8abb33ee4d14a973f21f40f5a9",
"body": "Patch: cierra [Unreleased] con el arreglo de la tipografía de los estados vacíos del\ndashboard. `scripts/update_to_latest.sh` viaja en la misma sección pero no afecta al paquete\npublicado — `scripts/` no entra en el wheel —, así que sigue siendo un patch.",
"is_bot": false,
"headline": "chore: prepara la 0.12.1 (#28)",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-28T02:14:00Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0acefd7ca69e4fdec9cb36c02de9e3653d82d2dc",
"body": "`.empty` no declaraba font-family, así que heredaba la sans del body mientras todo su entorno\n—nombres de modelo, badges, chips, tabla, pie— va en monoespaciada. Cantaba sobre todo en\n\"sin datos (requiere llama-swap ≥ v236)\", y el mismo panel llegaba a enseñar DOS estados\nvacíos con tipografías dist\n[…]\nque espera renderBackendStats (histogramas con\n p50/p95 y totales), así que aunque hubiera llegado tampoco habría pintado.\n\nCon las dos cosas arregladas la captura enseña por fin ese panel con datos.",
"is_bot": false,
"headline": "fix: los estados vacíos del dashboard usan la tipografía del panel (#27)",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-28T02:08:18Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5bec0c5132dff8e998ae703a530b60b0e8b9e647",
"body": "El map-reduce era la razón de ser de la 0.12.0 y no estaba escrito en ninguna parte: ni en la\nwiki ni en el README. Se explica dónde toca —junto al chunking, porque lo importante es\nentender por qué son cosas distintas: uno transforma y concatena, el otro reduce y no puede\nconcatenar— y se dice expl\n[…]\nlocal_extract sigue truncando A PROPÓSITO: fusionar el JSON de\nvarios trozos no tiene una respuesta única y adivinarla sería peor que avisar.\n\nLa captura del README se regenera con el panel en 0.12.0.",
"is_bot": false,
"headline": "docs: documenta el map-reduce y actualiza la captura a la 0.12.0 (#26)",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-28T01:57:26Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b126c54c55565f747d3d56b27f097deeca90aa5e",
"body": "La Mac fija la versión en la entrada MCP, así que cada release obligaba a editar el pin a\nmano en dos archivos y acordarse de cuál tocaba. Ahora se abre el portátil, se corre el\nscript y ya.\n\nConsulta PyPI por el índice simple y no por el endpoint JSON del paquete: ese se sirve con\ncaché y puede seg\n[…]\no contra un HOME simulado con la configuración real de la Mac: pin actualizado en los\ndos archivos, key y entrada ajena intactas, segunda corrida sin cambios, y los casos de \"sin\npin\" y \"sin entrada\".",
"is_bot": false,
"headline": "feat: script para poner un cliente en la última versión publicada (#25)",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-28T01:27:46Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "cc54148e26224d916622e16ca0f06c96b7363e5b",
"body": "Cierra la sección [Unreleased] con todo lo que entró después de publicar la 0.11.0: el\nmap-reduce de las tools de reducción, el CI en matriz de tres sistemas, el arreglo del\nterminador de línea del instalador (que en Windows reescribía entero el CLAUDE.md del\nusuario), LOCAL_DELEGATE_BACKEND_ORIGIN \n[…]\n captura del README.\n\nEs el primer bump que entra por PR: main quedó protegida en esta misma tanda. El bump lo\nhizo `scripts/bump_version.py`, que además avisó de que faltaba la sección del CHANGELOG.",
"is_bot": false,
"headline": "chore: prepara la 0.12.0 (#24)",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-28T01:19:33Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8e01abbc9527a3db41aaf2e44d0fccf6adf62afe",
"body": "Estas tools truncaban la entrada a max_chars_for(modelo) y avisaban. Dicho de otro modo:\nresumían el principio del documento y descartaban el resto. En un log de CI eso significa\nperderse los errores del final, que suelen ser los que importan — y el aviso no lo arregla,\nsolo lo hace explícito.\n\nEl c\n[…]\nen \"En curso\" con el progreso.\n\nVerificado contra el backend falso con 145.584 caracteres: entraron completos (raw_len ==\nchars_in, sin truncated_in) en 16 pasadas. Antes se habrían cortado en 48.000.",
"is_bot": false,
"headline": "feat: map-reduce en local_summarize y local_lint_summary (#23)",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-28T01:02:27Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8238c202daa0916a30b022af42f6b7acefb91d42",
"body": "Ponía has_wiki=false, pero la wiki nativa sí se usa: Publishing.md documenta sincronizarla\ndesde docs/wiki/ después de cada tag, y acaba de publicarse con las páginas nuevas\nIntegration-install y Repo-hardening. Aplicar el script tal cual las habría dejado\ninalcanzables — el contenido seguiría en el repo, pero los enlaces de la wiki darían 404.",
"is_bot": false,
"headline": "fix: el script de seguridad ya no apaga la wiki del repositorio (#22)",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-28T00:52:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "14382ccd0153566a8c097599318431eff004c318",
"body": "El script exigía un check llamado \"test\", pero desde que los tests corren en matriz ese\nnombre ya no lo publica nadie: ahora son \"test (ubuntu-latest)\", \"(windows-latest)\",\n\"(macos-latest)\" y el job \"lint\" aparte. Aplicar la regla tal cual habría dejado todos los\nPR esperando indefinidamente un check que nunca llega — es decir, el repo bloqueado.",
"is_bot": false,
"headline": "ci: ajusta los checks requeridos al CI en matriz (#21)",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-28T00:50:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "769ea26ba404efa02c49789527ec79fa03479f55",
"body": "La imagen del README seguía siendo la del panel 0.8.1 y no enseñaba nada de lo que trajo esta\nversión: el donut \"Dónde corrió el cómputo\", la columna del mismo nombre en la actividad, el\nindicador de cuatro estados ni el progreso por trozos de una traducción en curso.\n\nSe añade scripts/dev/capture_d\n[…]\n a\nAmerica/Havana porque si no el pie anuncia la de quien generó la captura y la imagen deja de\nser reproducible. El rango se pone en 30 días para que el selector no diga \"Hoy\" sobre un\ngráfico de 12.",
"is_bot": false,
"headline": "docs: regenera la captura del dashboard con el panel de la 0.11.0 (#20)",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-28T00:47:40Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a3030db3892ad41ddef853dfdfb30d4904a85d78",
"body": "…e toca (#19)\n\nEncontrado al probar `install` por primera vez en Windows real: un CLAUDE.md de 25 bytes en\nLF salía de 28 en CRLF después de install+uninstall. `write_text` escribe con el terminador\nde la PLATAFORMA, así que añadir el bloque de la regla de delegación reescribía el archivo\nentero — d\n[…]\ncado que uninstall dejaba los archivos \"byte a byte\",\npero eso solo se había probado en Linux, donde el bug no se manifiesta. Los dos tests nuevos\ncubren LF y CRLF y ahora corren en los tres sistemas.",
"is_bot": false,
"headline": "fix: el instalador conserva el terminador de línea de los archivos qu…",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-28T00:38:34Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7d7cf9b495ebfc6178447f6cdc6c0ece40a4cddd",
"body": "* ci: corre los tests en Linux, Windows y macOS\n\nEl paquete es multiplataforma de verdad: rutas, locks entre procesos y las llamadas a Win32\npor ctypes se comportan distinto en cada sistema. La 0.11.0 arregló una fuga de handles\n—`_pid_alive` llamaba a OpenProcess sin restype, ctypes truncaba el HAN\n[…]\niento del instalador contra un HOME simulado. Se\nmontaron para la 0.11.0 y murieron con aquella sesión; el backend falso queda verificado\nend-to-end (7842 chars -> 3 trozos -> un evento con chunks:3).",
"is_bot": false,
"headline": "ci: corre los tests en Linux, Windows y macOS (#17)",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-28T00:31:48Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c6309d24d7f36ad11613c2b30136daae06a1e9f4",
"body": "…iseño (#16)\n\n0.16 promueve a estables reglas que sacaban 79 avisos sobre código que hoy está limpio.\nSe separan en dos grupos en vez de aplicarlas o silenciarlas en bloque.\n\nMejora real, aplicada: datetime.UTC, re.MULTILINE en vez de re.M, removeprefix/removesuffix,\ntyping.Self en los __enter__, y \n[…]\na a mano para dar un mensaje accionable.\n\nEl formateador excluye los .md: 0.16 formatea los bloques Python embebidos en Markdown y\nreescribía un documento de plan de la v0.2 que es registro histórico.",
"is_bot": false,
"headline": "chore(deps): sube ruff a 0.16.0 y fija las reglas que chocan con el d…",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-28T00:23:52Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a4bbdbf07493ccd3ecd5eab8e17d7c8cf76c67cb",
"body": "…or un túnel (#15)\n\nbackend_origin() clasifica por el host de BASE_URL: loopback = local. Con `ssh -L 9292:...`\no un port-forward de Tailscale el backend remoto se ve en 127.0.0.1, así que el dashboard\nreportaba CÓMPUTO LOCAL para inferencia que salió de la máquina — y es justo la topología\nMac->PC \n[…]\nLEGATE_BACKEND_ORIGIN. El default\n`auto` mantiene la heurística de siempre y un valor inválido cae a `auto` en lugar de\nreventar el arranque: es un dato de presentación, no vale romper por una errata.",
"is_bot": false,
"headline": "fix: permite declarar el origen del cómputo cuando el backend llega p…",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-28T00:23:08Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "cace6072ce9fa758f212c2e2da896543493a79ce",
"body": "* docs: mueve el rollout remoto de 0.10.0 a 0.11.0\n\nLos pines se dejaron en 0.10.0 a propósito mientras la Mac estaba en rollout controlado.\nPublicada la 0.11.0 y verificada en PyPI y en el registro, la recipe y la wiki apuntan a la\nversión vigente; los enlaces a blob/v0.11.0 resuelven porque el tag\n[…]\ne: saca del PR un script local que no pertenece a este cambio\n\ninstall_claude_code_hooks_macos.sh estaba sin trackear en el working tree y entró por un\n`git add -A`. Queda fuera del repo, como estaba.",
"is_bot": false,
"headline": "docs: mueve el rollout remoto de 0.10.0 a 0.11.0 (#14)",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-28T00:16:13Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4683816f8999998e767113d5367d35da4945502c",
"body": "Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3 to 4.\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/v3...v4)\n\n-\n[…]\nirect:production\n update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(actions): bump github/codeql-action from 3 to 4 (#13)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-07-27T22:17:55Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "87dd23a2f93b48f19973e466bf3e63ca3dc87c80",
"body": "* ci: publica en el registro MCP desde el tag y prepara la 0.11.0\n\nHasta ahora el tag publicaba en PyPI y el registro oficial de MCP se hacía a mano\ncon `mcp-publisher login github` (device code en el navegador). Se puede\nautomatizar: el registro acepta `login github-oidc`, que valida el namespace\ni\n[…]\nsion y mcp-registry son nuevos de esta rama y se quedaron en @v4. El\nauto-merge no da conflicto en este caso, así que hay que mirarlo a mano.\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci: publica en el registro MCP desde el tag y prepara la 0.11.0 (#11)",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-27T22:17:16Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "1f1bc694e7ed80685610f372d83ec1451970d7e1",
"body": "Bumps [fastapi](https://github.com/fastapi/fastapi) from 0.139.0 to 0.140.7.\n- [Release notes](https://github.com/fastapi/fastapi/releases)\n- [Commits](https://github.com/fastapi/fastapi/compare/0.139.0...0.140.7)\n\n---\nupdated-dependencies:\n- dependency-name: fastapi\n dependency-version: 0.140.7\n \n[…]\nirect:production\n update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(deps): bump fastapi from 0.139.0 to 0.140.7 (#12)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-07-27T22:15:14Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3f18daa2a1d8d5f03874f232271f37b4ecb8660c",
"body": "Bumps [platformdirs](https://github.com/tox-dev/platformdirs) from 4.10.0 to 4.11.0.\n- [Release notes](https://github.com/tox-dev/platformdirs/releases)\n- [Changelog](https://github.com/tox-dev/platformdirs/blob/main/docs/changelog.rst)\n- [Commits](https://github.com/tox-dev/platformdirs/compare/4.1\n[…]\nirect:production\n update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(deps): bump platformdirs from 4.10.0 to 4.11.0 (#10)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-07-27T22:13:11Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c35554d0ffd46108533985158186ec10a746d64e",
"body": "Bumps [uvicorn](https://github.com/Kludex/uvicorn) from 0.50.2 to 0.51.0.\n- [Release notes](https://github.com/Kludex/uvicorn/releases)\n- [Changelog](https://github.com/Kludex/uvicorn/blob/main/docs/release-notes.md)\n- [Commits](https://github.com/Kludex/uvicorn/compare/0.50.2...0.51.0)\n\n---\nupdated\n[…]\nirect:production\n update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(deps): bump uvicorn from 0.50.2 to 0.51.0 (#9)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-07-27T22:13:00Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "88fc97f18c1727156a8cadbcab46e2ae38fc5eda",
"body": "Bumps [filelock](https://github.com/tox-dev/py-filelock) from 3.29.6 to 3.32.0.\n- [Release notes](https://github.com/tox-dev/py-filelock/releases)\n- [Changelog](https://github.com/tox-dev/filelock/blob/main/docs/changelog.rst)\n- [Commits](https://github.com/tox-dev/py-filelock/compare/3.29.6...3.32.\n[…]\nirect:production\n update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(deps): bump filelock from 3.29.6 to 3.32.0 (#8)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-07-27T22:12:23Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "1c03b8ae77668affeaf31bc9bee7f7fded51f777",
"body": "Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 6 to 7.\n- [Release notes](https://github.com/astral-sh/setup-uv/releases)\n- [Commits](https://github.com/astral-sh/setup-uv/compare/v6...v7)\n\n---\nupdated-dependencies:\n- dependency-name: astral-sh/setup-uv\n dependency-version: '\n[…]\nirect:production\n update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(actions): bump astral-sh/setup-uv from 6 to 7 (#6)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-07-27T22:11:00Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c1750a0746bd846bb4cfdefb9dbea3259394a154",
"body": "Bumps [actions/setup-node](https://github.com/actions/setup-node) from 4 to 7.\n- [Release notes](https://github.com/actions/setup-node/releases)\n- [Commits](https://github.com/actions/setup-node/compare/v4...v7)\n\n---\nupdated-dependencies:\n- dependency-name: actions/setup-node\n dependency-version: '\n[…]\nirect:production\n update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(actions): bump actions/setup-node from 4 to 7 (#5)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-07-27T22:10:56Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "12d5c70e715b50e2a8e3f16c3bafedd2733410ef",
"body": "Bumps [gitleaks/gitleaks-action](https://github.com/gitleaks/gitleaks-action) from 2 to 3.\n- [Release notes](https://github.com/gitleaks/gitleaks-action/releases)\n- [Commits](https://github.com/gitleaks/gitleaks-action/compare/v2...v3)\n\n---\nupdated-dependencies:\n- dependency-name: gitleaks/gitleaks-\n[…]\nirect:production\n update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(actions): bump gitleaks/gitleaks-action from 2 to 3 (#4)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-07-27T22:10:53Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "529bdce413bab6af106396d6dd5d16e61e5400d8",
"body": "Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 7.\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/actions/checkout/compare/v4...v7)\n\n---\nupdated-dependenc\n[…]\nirect:production\n update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(actions): bump actions/checkout from 4 to 7 (#3)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-07-27T22:10:50Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "28dd5c333caa8e2a5d3c845061b643b40e26fc04",
"body": "…o, chunking, instalador y endurecimiento del repo (#2)\n\nZona horaria del equipo en rangos, gráficos y tabla (el log sigue en UTC).\n\nIndicador de actividad con tres estados (EN CURSO / EN VIVO / EN REPOSO)\nindependiente del rango y del auto-refresco; inflight.json a prueba de escrituras\nconcurrentes\n[…]\nel paquete (panel offline, sin terceros) y hooks heredados\nmigrados. Endurecimiento del repo: CodeQL, Dependabot, SECURITY.md, CODEOWNERS,\npermisos mínimos en workflows y script de protección de main.",
"is_bot": false,
"headline": "feat: zona horaria local, estado de actividad real, origen del cómput…",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-27T21:24:53Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "88347a22f23da9a393f847d04208b097da54d844",
"body": null,
"is_bot": false,
"headline": "chore: ignore local Codex configuration",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-24T13:32:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "230e0f6ee27566727d6f78deb7e9ffc22eb769e4",
"body": null,
"is_bot": false,
"headline": "Document exact macOS remote setup",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-24T02:47:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6acda37e29bdba836cd54ee8aabef5cb4a1f215b",
"body": null,
"is_bot": false,
"headline": "Document v0.10.0 publication",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-24T02:41:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3b8a11c9e0590d06c4bedb79507ad7da90b80fd0",
"body": null,
"is_bot": false,
"headline": "release: v0.10.0",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-24T02:30:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "af823bc5901c89f34df5f96277613b9966a6defa",
"body": null,
"is_bot": false,
"headline": "Close measured Claude hook pilot",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-24T02:21:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "713615bb0be37d5e9918ba3780774f95f7028e98",
"body": null,
"is_bot": false,
"headline": "Add reproducible Claude hook pilot",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-24T01:47:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4d8a516e43cb451cd411b108ba362f3d687cd4ff",
"body": null,
"is_bot": false,
"headline": "Add session switch for Claude hook pilot",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-24T01:46:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2dc7d93cdd5077fa5893ab91057b033299de039a",
"body": null,
"is_bot": false,
"headline": "Document authenticated Mac remote canary",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-24T01:42:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6d60980beedb4a4c67ec07207ff3b54c19c1ca4d",
"body": null,
"is_bot": false,
"headline": "Record successful Mac remote canary",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-24T01:30:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a79721f8c64c5be4fda1be025b80f1b7eab67ef0",
"body": null,
"is_bot": false,
"headline": "Allow unauthenticated remote connectivity canary",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-24T01:24:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "440d7469bbf59730ba0b46205b948cf939957d56",
"body": null,
"is_bot": false,
"headline": "Add remote MCP canary and delegation research",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-24T01:23:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0906f077543ae556afae3cb762d6993416a32090",
"body": null,
"is_bot": false,
"headline": "release: preparar v0.9.0",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-23T19:18:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a34a43724bb6eb102d48d8e5cb8550c0efe676ec",
"body": null,
"is_bot": false,
"headline": "fix: soportar daemon invisible con pythonw",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-23T19:14:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8d19728edd5548c54938147f7950e7b0d6cc9bfc",
"body": null,
"is_bot": false,
"headline": "feat: limitar concurrencia global del daemon",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-23T18:49:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "623692191354588528733e6e11d72625e80e7462",
"body": null,
"is_bot": false,
"headline": "feat: permitir recarga vigilada de llama-swap",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-23T18:47:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d0f2858f9779487815289d8e6d217b1e859ae5e1",
"body": null,
"is_bot": false,
"headline": "docs: explicar daemon compartido y rollback stdio",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-23T18:43:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9b66df32250d6b1de429e9763861877ddb0e79b3",
"body": null,
"is_bot": false,
"headline": "fix: rechazar modelos fuera del presupuesto de groups",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-23T18:41:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7cede9d2c67c1803999f9f4b7db6e1e15aae6d15",
"body": null,
"is_bot": false,
"headline": "feat: añadir daemon MCP HTTP singleton",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-23T18:38:40Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "48b074fa0f82358e71e80b5e36091810972345b4",
"body": "Añade 'uv lock --check' en ci.yml (antes de sync) y en publish.yml (antes\nde build) para que el pipeline falle si el lock queda desfasado respecto a\npyproject.toml, como pasó al bumpear a 0.8.1.",
"is_bot": false,
"headline": "ci: verificar uv.lock sincronizado en CI y en el flujo de publicación",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-12T14:49:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c47c54cae6e7646d66a58437ae6b94bd25cbd737",
"body": null,
"is_bot": false,
"headline": "chore: regenerar uv.lock a 0.8.1 (quedó en 0.7.0 tras el release)",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-12T14:46:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0e27e31ae1b56df74f64a683570ebdc442a63f99",
"body": "Refleja los features nuevos de 0.7.0-0.8.1: estado loaded/unloaded por\nmodelo (#901) con un modelo montado y otro en plena delegacion en curso,\npanel de rendimiento del backend (#898), sistema con VRAM por proceso y\ndelegaciones en curso. Datos de ejemplo generados para ilustrar volumen.",
"is_bot": false,
"headline": "docs: actualizar captura del dashboard al panel 0.8.1 (datos de ejemplo)",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-12T14:42:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6bc579223c7fcd79b1c08842087f63c597f20e88",
"body": "… 0.8.1)",
"is_bot": false,
"headline": "style: aplicar ruff format a tests/test_metrics.py (arregla ci.yml de…",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-12T04:28:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bd50cf8a3dbe114873cac5a4b49fb274cd4f05ff",
"body": "…olumna de estado — 0.8.1\n\n- El badge loaded/unloaded (#901) solo se refrescaba vía /api/status (cada 60s); ahora\n /api/backend incluye models:[{id,status}] y el poll rápido de 2s lo mantiene fresco, así un\n modelo recién cargado se marca \"montado\" casi al instante (antes tardaba hasta 1 min).\n- P\n[…]\nineaba entre filas porque\n .mstate y .mstatus tenían ambos margin-left:auto; ahora ancho fijo → alineadas en todas las\n filas (verificado midiendo el DOM: estado left=494, badge left=572 idénticos).",
"is_bot": false,
"headline": "fix(web): estado montado/loaded fresco (poll 2s) y alineación de la c…",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-12T04:26:00Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "826c76adca9751469ae08e17a8a6123e09447431",
"body": "…cas del backend (#898) — 0.8.0\n\n- doctor: nuevo subcomando que detecta las versiones instaladas de llama-server/llama-swap\n y las compara con las probadas (RECOMMENDED_VERSIONS en doctor.py); --online consulta GitHub.\n- #901: status loaded/unloaded por modelo desde /v1/models en local_status y /ap\n[…]\ns métricas en SQLite.\n- doc: nueva wiki Backend-versions.md (versiones probadas b9925/v238 + workspace de referencia).\n\nVerificado en RTX 5060 (Blackwell/sm_120): llama-server b9925 + llama-swap v238.",
"is_bot": false,
"headline": "feat(web): doctor CLI, status loaded/unloaded (#901) y panel de métri…",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-11T15:32:32Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4d644aeab0ccbcfb92e67b9e1d0d03889f1ffdbc",
"body": "…modelo/tool activo — 0.7.0\n\n- El panel \"En curso\" del dashboard nunca mostraba delegaciones si el navegador consultaba\n un proceso MCP distinto del que las ejecutaba (varias sesiones de Claude Code, o la web\n arrancada manualmente). inflight_snapshot() ahora lee/escribe LOG_DIR/inflight.json bajo\n[…]\nel placeholder \"Sin delegaciones en curso\" heredaba Inter en vez de\n JetBrains Mono como el resto del panel.\n- Se marca visualmente el modelo/tool en uso en \"Backend local\" y \"Tools MCP disponibles\".",
"is_bot": false,
"headline": "fix(web): inflight multi-proceso vía archivo compartido + marcado de …",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-10T13:39:44Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "caa2b4a0c99762a9c458f85150497ebdda9c8554",
"body": "…ackend/sistema — 0.6.0\n\n- GET /api/status: versión del MCP, modelos reales del backend (/v1/models),\n catálogo de roles y tools MCP (la web ya no deriva los modelos del log de eventos)\n- GET /api/system + web/sysinfo.py: RAM/VRAM con uso/total/% y consumo por proceso\n (llama-swap, llama-server, M\n[…]\nt objectBoundingBox sobre líneas rectas no pinta)\n- Eliminadas las filas de chips de filtro Tools/Modelos (redundantes)\n- README: imagen por URL absoluta (visible también en PyPI) y captura regenerada",
"is_bot": false,
"headline": "feat(web): rediseño del dashboard — /api/status, /api/system, panel b…",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-10T12:46:49Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "9075de2eddfeaac5bee6ad5b0a2032ed8e9607e2",
"body": "…nfig.py, tests)\n\nEl push anterior rompió el CI (ruff format --check) porque solo corrí 'ruff check .'\nlocalmente y nunca 'ruff format --check .', que es un job separado en ci.yml. Sin cambios\nde comportamiento, solo formato.",
"is_bot": false,
"headline": "style: aplicar ruff format a los archivos de F7 (cli.py, llamaswap_co…",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-10T02:07:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "94e5af0f2fc9e17d2a5112825644be0891077704",
"body": "…swap — 0.5.0\n\nDurante el ritual de aplicación de F7 (F7.8) verificamos en vivo que llama-server mapea el\nGGUF también en RAM de sistema (mmap) aunque el cómputo sea 100% GPU: un modelo de 8.37 GiB\nen disco usó ~7.46 GB de RAM residente real mientras corría enteramente en la GPU (-ngl 99).\nEl guardr\n[…]\n VRAM real (~11.69 GiB) por debajo del estimado (12.71 GiB), y TTL\nauto-unload confirmado en vivo (qwen25-coder-14b se descargó solo a los 300s sin uso).\n\n113 tests en verde, ruff limpio, uv build OK.",
"is_bot": false,
"headline": "feat(f7.9): guardrail de RAM de sistema en check-llamaswap/init-llama…",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-10T01:52:59Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "71a750459fd6ad7a588a6ea9976529f3eaeea4f3",
"body": "…errado\n\nRecipe docs/recipes/llama-swap-groups.md con la semántica de 'groups' verificada contra el\ncódigo real de llama-swap, presupuesto de VRAM con ejemplo real del catálogo de referencia,\nlos dos comandos y el ritual de aplicación. Sección nueva en README (extra [llamaswap] + los\n2 CLIs) y entrada 0.4.0 en CHANGELOG. Checklist F7 cerrado en el plan maestro (F7.1-F7.7); F7.8\n(ritual de aplicación personal) queda aparte, pendiente de OK explícito paso a paso.",
"is_bot": false,
"headline": "docs(f7): release 0.4.0 — recipe de groups, CHANGELOG, README, plan c…",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-10T01:22:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "767afaabc8ef3a9057019c0cebae9d7e104ff3e3",
"body": "… VRAM\n\nAñade el módulo llamaswap_config.py (extra opcional [llamaswap], pyyaml) con un estimador\nde VRAM por modelo GGUF: cuando hay metadatos de arquitectura en el propio GGUF (capas,\ncabezas KV, dimensión de cabeza) y un --ctx-size explícito en el cmd, calcula pesos + KV\ncache real; si falta cual\n[…]\nficación en docs/plans/plan-f7-groups.md (semántica real de 'groups' en\nllama-swap v235/c59816b confirmada contra el repo oficial, incluida la discrepancia con el\nplan maestro sobre dónde vive 'ttl').",
"is_bot": false,
"headline": "feat(f7): CLIs opt-in check-llamaswap/init-llamaswap con guardrail de…",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-10T01:19:46Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6ddbfdcb6a71a6f52b47a881a48cbbfe21b1c847",
"body": "CI corre 'ruff format --check' ademas de 'ruff check'; evita otro CI rojo\ncomo el de F1-F5.",
"is_bot": false,
"headline": "style: aplicar ruff format a test_vision.py",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-10T00:13:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dd090e0ddfb27c295f0d2798dc0291e48375030d",
"body": "Bump de version, CHANGELOG [Unreleased] -> [0.3.0], checkbox F6 marcado\nen plan-v0.2-mejoras.md. uv build en verde (dist/*-0.3.0). No se publica\na PyPI ni se hace push: pendiente de confirmacion del usuario.",
"is_bot": false,
"headline": "chore(release): 0.3.0 - F6 vision cerrada",
"author_name": "Yohan González Almaguer",
"author_login": "ZahiriNatZuke",
"committed_at": "2026-07-09T23:32:48Z",
"body_truncated": false,
"is_coding_agent": false
}
],
"releases_count": 25,
"commits_last_year": 97,
"latest_release_at": "2026-07-30T20:30:27Z",
"latest_release_tag": "v0.17.0",
"releases_from_tags": false,
"days_since_last_push": 0,
"active_weeks_last_year": 3,
"days_since_latest_release": 0,
"mean_days_between_releases": 0.3
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": true,
"health_percentage": 100,
"has_issue_template": false,
"has_code_of_conduct": true,
"has_pull_request_template": true
},
"ecosystem": {
"packages": [
{
"name": "local-delegate-mcp",
"exists": true,
"license": "MIT",
"keywords": [
"claude",
"llama-swap",
"llm",
"local",
"mcp",
"ollama",
"openai-compatible",
"quota",
"Development Status :: 4 - Beta",
"Intended Audience :: Developers",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Topic :: Software Development :: Libraries",
"Topic :: Utilities"
],
"ecosystem": "pypi",
"matches_repo": true,
"registry_url": "https://pypi.org/project/local-delegate-mcp/",
"is_deprecated": false,
"latest_version": "0.17.0",
"repository_url": "https://github.com/ZahiriNatZuke/local-delegate",
"versions_count": 25,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": 2354,
"first_published_at": "2026-07-07T21:21:41.739289Z",
"latest_published_at": "2026-07-30T20:30:57.586083Z",
"latest_version_yanked": null,
"days_since_latest_publish": 0
}
]
},
"popularity": {
"forks": 1,
"stars": 4,
"watchers": 0,
"fork_history": {
"days": [
{
"date": "2026-07-18",
"count": 1
}
],
"complete": true,
"collected": 1,
"total_forks": 1
},
"star_history": null,
"open_issues_and_prs": 0
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [
"examples",
"recipes"
],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": true,
"bootstrap_files": [],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [],
"largest_source_bytes": 94751,
"source_files_sampled": 52,
"oversized_source_files": 2,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"dependencies": {
"manifests": [
"pyproject.toml"
],
"advisories": {
"error": null,
"scope": "repository_graph",
"source": "osv",
"findings": [],
"collected": true,
"malicious": [],
"truncated": false,
"by_severity": {},
"advisory_count": 0,
"affected_count": 0,
"assessed_count": 49,
"malicious_count": 0,
"assessed_package": null,
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [
"pypi"
],
"dependencies": [
{
"name": "mcp",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=2,<3"
},
{
"name": "httpx2",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=2.5,<3"
},
{
"name": "platformdirs",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=4,<5"
},
{
"name": "fastapi",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=0.115"
},
{
"name": "uvicorn",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=0.30"
},
{
"name": "filelock",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=3,<4"
}
],
"all_dependencies": {
"error": null,
"source": "github-sbom",
"packages": [
{
"name": "fastapi",
"direct": true,
"version": "0.140.7",
"ecosystem": "pypi"
},
{
"name": "filelock",
"direct": true,
"version": "3.32.0",
"ecosystem": "pypi"
},
{
"name": "httpx2",
"direct": true,
"version": "2.9.1",
"ecosystem": "pypi"
},
{
"name": "mcp",
"direct": true,
"version": "2.0.0",
"ecosystem": "pypi"
},
{
"name": "platformdirs",
"direct": true,
"version": "4.11.0",
"ecosystem": "pypi"
},
{
"name": "uvicorn",
"direct": true,
"version": "0.51.0",
"ecosystem": "pypi"
},
{
"name": "annotated-doc",
"direct": false,
"version": "0.0.4",
"ecosystem": "pypi"
},
{
"name": "annotated-types",
"direct": false,
"version": "0.7.0",
"ecosystem": "pypi"
},
{
"name": "anyio",
"direct": false,
"version": "4.14.1",
"ecosystem": "pypi"
},
{
"name": "attrs",
"direct": false,
"version": "26.1.0",
"ecosystem": "pypi"
},
{
"name": "cffi",
"direct": false,
"version": "2.1.0",
"ecosystem": "pypi"
},
{
"name": "cfgv",
"direct": false,
"version": "3.5.0",
"ecosystem": "pypi"
},
{
"name": "click",
"direct": false,
"version": "8.4.2",
"ecosystem": "pypi"
},
{
"name": "colorama",
"direct": false,
"version": "0.4.6",
"ecosystem": "pypi"
},
{
"name": "cryptography",
"direct": false,
"version": "49.0.0",
"ecosystem": "pypi"
},
{
"name": "distlib",
"direct": false,
"version": "0.4.3",
"ecosystem": "pypi"
},
{
"name": "h11",
"direct": false,
"version": "0.16.0",
"ecosystem": "pypi"
},
{
"name": "httpcore2",
"direct": false,
"version": "2.9.1",
"ecosystem": "pypi"
},
{
"name": "identify",
"direct": false,
"version": "2.6.19",
"ecosystem": "pypi"
},
{
"name": "idna",
"direct": false,
"version": "3.18",
"ecosystem": "pypi"
},
{
"name": "iniconfig",
"direct": false,
"version": "2.3.0",
"ecosystem": "pypi"
},
{
"name": "jsonschema",
"direct": false,
"version": "4.26.0",
"ecosystem": "pypi"
},
{
"name": "jsonschema-specifications",
"direct": false,
"version": "2025.9.1",
"ecosystem": "pypi"
},
{
"name": "local-delegate-mcp",
"direct": false,
"version": "0.17.0",
"ecosystem": "pypi"
},
{
"name": "mcp-types",
"direct": false,
"version": "2.0.0",
"ecosystem": "pypi"
},
{
"name": "nodeenv",
"direct": false,
"version": "1.10.0",
"ecosystem": "pypi"
},
{
"name": "opentelemetry-api",
"direct": false,
"version": "1.44.0",
"ecosystem": "pypi"
},
{
"name": "packaging",
"direct": false,
"version": "26.2",
"ecosystem": "pypi"
},
{
"name": "pluggy",
"direct": false,
"version": "1.6.0",
"ecosystem": "pypi"
},
{
"name": "pre-commit",
"direct": false,
"version": "4.6.1",
"ecosystem": "pypi"
},
{
"name": "pycparser",
"direct": false,
"version": "3.0",
"ecosystem": "pypi"
},
{
"name": "pydantic",
"direct": false,
"version": "2.13.4",
"ecosystem": "pypi"
},
{
"name": "pydantic-core",
"direct": false,
"version": "2.46.4",
"ecosystem": "pypi"
},
{
"name": "pygments",
"direct": false,
"version": "2.20.0",
"ecosystem": "pypi"
},
{
"name": "pyjwt",
"direct": false,
"version": "2.13.0",
"ecosystem": "pypi"
},
{
"name": "pytest",
"direct": false,
"version": "9.1.1",
"ecosystem": "pypi"
},
{
"name": "python-discovery",
"direct": false,
"version": "1.4.3",
"ecosystem": "pypi"
},
{
"name": "python-multipart",
"direct": false,
"version": "0.0.32",
"ecosystem": "pypi"
},
{
"name": "pywin32",
"direct": false,
"version": "312",
"ecosystem": "pypi"
},
{
"name": "pyyaml",
"direct": false,
"version": "6.0.3",
"ecosystem": "pypi"
},
{
"name": "referencing",
"direct": false,
"version": "0.37.0",
"ecosystem": "pypi"
},
{
"name": "rpds-py",
"direct": false,
"version": "2026.6.3",
"ecosystem": "pypi"
},
{
"name": "ruff",
"direct": false,
"version": "0.16.0",
"ecosystem": "pypi"
},
{
"name": "sse-starlette",
"direct": false,
"version": "3.4.5",
"ecosystem": "pypi"
},
{
"name": "starlette",
"direct": false,
"version": "1.3.1",
"ecosystem": "pypi"
},
{
"name": "truststore",
"direct": false,
"version": "0.10.4",
"ecosystem": "pypi"
},
{
"name": "typing-extensions",
"direct": false,
"version": "4.16.0",
"ecosystem": "pypi"
},
{
"name": "typing-inspection",
"direct": false,
"version": "0.4.2",
"ecosystem": "pypi"
},
{
"name": "virtualenv",
"direct": false,
"version": "21.6.0",
"ecosystem": "pypi"
}
],
"collected": true,
"truncated": false,
"total_count": 49,
"direct_count": 6,
"indirect_count": 43
}
},
"maintainership": {
"issues": {
"open_prs": 0,
"merged_prs": 68,
"open_issues": 0,
"closed_ratio": null,
"closed_issues": 0,
"closed_unmerged_prs": 3
},
"bus_factor": 1,
"bot_contributors": 1,
"top_contributors": [
{
"type": "User",
"login": "ZahiriNatZuke",
"commits": 110,
"avatar_url": "https://avatars.githubusercontent.com/u/41224027?v=4"
}
],
"contributors_sampled": 1,
"top_contributor_share": 1
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"ci.yml",
"codeql.yml",
"pages.yml",
"publish.yml",
"vendor-audit.yml"
],
"has_docs_dir": true,
"linter_configs": [],
"has_editorconfig": false,
"has_linter_config": true,
"has_precommit_config": true
},
"security_signals": {
"lockfiles": [
"uv.lock"
],
"scorecard": {
"checks": [
{
"name": "Binary-Artifacts",
"score": 10,
"reason": "no binaries found in the repo",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": 4,
"reason": "branch protection is not maximal on development and all release branches",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": 10,
"reason": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 0,
"reason": "no effort to earn an OpenSSF best practices badge detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 0,
"reason": "Found 0/30 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 3,
"reason": "project has 1 contributing companies or organizations -- score normalized to 3",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": 10,
"reason": "no dangerous workflow patterns detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 10,
"reason": "update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 0,
"reason": "project is not fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 10,
"reason": "license file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 0,
"reason": "project was created within the last 90 days. Please review its contents carefully",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": null,
"reason": "packaging workflow not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
},
{
"name": "Pinned-Dependencies",
"score": 0,
"reason": "dependency not pinned by hash detected -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 10,
"reason": "SAST tool is run on all commits",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 10,
"reason": "security policy file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": 0,
"reason": "Project has not signed or included provenance with any releases.",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": 10,
"reason": "GitHub workflow tokens follow principle of least privilege",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 10,
"reason": "0 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "c8b4b62217a393dce01b1bc957e8bbfecc57defe",
"ran_at": "2026-07-30T20:31:47Z",
"aggregate_score": 5.9,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": true,
"has_security_policy": true,
"has_dependabot_config": true
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-07-30T20:31:11Z",
"oldest_open_prs": [],
"last_merged_pr_at": "2026-07-30T20:29:29Z",
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": []
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/ZahiriNatZuke/local-delegate",
"host": "github.com",
"name": "local-delegate",
"owner": "ZahiriNatZuke"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 65,
"inputs": {
"security": 67,
"vitality": 70,
"community": 49,
"governance": 55,
"engineering": 86
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "good",
"name": "Vitality",
"value": 70,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "moderate",
"name": "Development activity",
"note": null,
"notes": [],
"value": 56,
"inputs": {
"commits_last_year": 97,
"human_commit_share": 0.91,
"days_since_last_push": 0,
"active_weeks_last_year": 3
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 0 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 0
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "3/52 weeks with commits",
"points": 2.1,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 3
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "97 commits in the last year",
"points": 17.9,
"status": "partial",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 97
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "project was created within the last 90 days. Please review its contents carefully",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "excellent",
"name": "Release discipline",
"note": null,
"notes": [],
"value": 90,
"inputs": {
"releases_count": 25,
"latest_release_tag": "v0.17.0",
"releases_from_tags": false,
"days_since_latest_release": 0,
"mean_days_between_releases": 0.3
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "25 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 25
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 0 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 0
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~0.3 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 0.3
}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "Project has not signed or included provenance with any releases.",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "abandonment",
"band": "excellent",
"name": "Abandonment",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"cap": null,
"state": "unverified",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": "repository_too_young",
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": null,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "maintenance record not established from the collected data",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_unverified",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "at_risk",
"name": "Community & Adoption",
"value": 49,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 8,
"inputs": {
"forks": 1,
"stars": 4,
"watchers": 0,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "4 stars",
"points": 7.7,
"status": "partial",
"details": [
{
"code": "stars",
"params": {
"count": 4
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "1 forks",
"points": 0,
"status": "missed",
"details": [
{
"code": "forks",
"params": {
"count": 1
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "0 watchers",
"points": 0,
"status": "missed",
"details": [
{
"code": "watchers",
"params": {
"count": 0
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "excellent",
"name": "Community health",
"note": null,
"notes": [],
"value": 92,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": true,
"has_issue_template": false,
"has_code_of_conduct": true,
"has_pull_request_template": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "recognized license (MIT)",
"points": 22.5,
"status": "met",
"details": [
{
"code": "license_standard",
"params": {}
},
{
"code": "license_spdx",
"params": {
"spdx": "MIT"
}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 18,
"status": "met",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 13.5,
"status": "met",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.2
},
{
"key": "pr_template",
"name": "PR template",
"detail": null,
"points": 6.3,
"status": "met",
"details": [],
"max_points": 6.3
}
]
},
{
"key": "ecosystem_adoption",
"band": "moderate",
"name": "Ecosystem adoption (downloads)",
"note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"registry_dependents"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 56,
"inputs": {
"packages": [
"local-delegate-mcp"
],
"dependents": null,
"ecosystems": "pypi",
"total_downloads": null,
"monthly_downloads": 2354
},
"components": [
{
"key": "monthly_downloads",
"name": "Monthly downloads",
"detail": "2,354 downloads/month across pypi",
"points": 45,
"status": "partial",
"details": [
{
"code": "downloads_monthly",
"params": {
"count": 2354,
"ecosystems": "pypi"
}
}
],
"max_points": 80
},
{
"key": "registry_dependents",
"name": "Registry dependents",
"detail": "not reported by this ecosystem",
"points": 0,
"status": "excluded",
"details": [
{
"code": "not_reported_by_this_ecosystem",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "moderate",
"name": "Sustainability & Governance",
"value": 55,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 13,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 1,
"top_contributor_share": 1
},
"components": [
{
"key": "bus_factor",
"name": "Bus factor",
"detail": "1 contributor(s) cover half of all commits",
"points": 9,
"status": "partial",
"details": [
{
"code": "bus_factor",
"params": {
"count": 1
}
}
],
"max_points": 54
},
{
"key": "commit_distribution",
"name": "Commit distribution",
"detail": "top contributor authored 100% of commits",
"points": 0,
"status": "missed",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 100
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "1 contributors",
"points": 1.4,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 1
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 3,
"status": "partial",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "moderate",
"name": "Issue & PR responsiveness",
"note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"issue_resolution"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 69,
"inputs": {
"merged_prs": 68,
"open_issues": 0,
"closed_issues": 0,
"issue_closed_ratio": null,
"closed_unmerged_prs": 3
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "no issues or no data",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_issues_or_data",
"params": {}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "68/71 decided PRs merged",
"points": 36.6,
"status": "partial",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 68,
"decided": 71
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "moderate",
"name": "Ownership & stewardship",
"note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"verified_domain"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 54,
"inputs": {
"followers": 22,
"owner_type": "User",
"is_verified": null,
"owner_login": "ZahiriNatZuke",
"public_repos": 33,
"account_age_days": 2938
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "personal (user) account",
"points": 10,
"status": "partial",
"details": [
{
"code": "owner_personal",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": "not applicable to user accounts",
"points": 0,
"status": "excluded",
"details": [
{
"code": "not_applicable_to_user_accounts",
"params": {}
}
],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "22 followers of ZahiriNatZuke",
"points": 9.8,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 22,
"login": "ZahiriNatZuke"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "33 public repos, account ~8 yr old",
"points": 23.2,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 33
}
},
{
"code": "account_age_years",
"params": {
"years": 8
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"local-delegate-mcp"
],
"ecosystems": "pypi",
"any_deprecated": false,
"min_days_since_publish": 0
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "1 package(s) on pypi",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 1,
"ecosystems": "pypi"
}
}
],
"max_points": 25
},
{
"key": "publish_recency",
"name": "Publish recency",
"detail": "latest publish 0 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 0
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "25 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 25
}
}
],
"max_points": 20
},
{
"key": "not_deprecated",
"name": "Not deprecated",
"detail": "active, not deprecated or yanked",
"points": 20,
"status": "met",
"details": [
{
"code": "package_not_deprecated",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
},
{
"key": "engineering",
"band": "excellent",
"name": "Engineering Quality",
"value": 86,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "excellent",
"name": "Engineering practices",
"note": null,
"notes": [],
"value": 94,
"inputs": {
"has_ci": true,
"has_tests": true,
"has_editorconfig": false,
"has_linter_config": true,
"has_precommit_config": true
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": "5 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 5
}
}
],
"max_points": 24
},
{
"key": "tests_present",
"name": "Tests present",
"detail": null,
"points": 24,
"status": "met",
"details": [],
"max_points": 24
},
{
"key": "linter_config",
"name": "Linter config",
"detail": null,
"points": 16,
"status": "met",
"details": [],
"max_points": 16
},
{
"key": "pre_commit_hooks",
"name": "Pre-commit hooks",
"detail": null,
"points": 9.6,
"status": "met",
"details": [],
"max_points": 9.6
},
{
"key": "editorconfig",
"name": ".editorconfig",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.4
},
{
"key": "openssf_scorecard_ci_tests",
"name": "OpenSSF Scorecard: CI-Tests",
"detail": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
"points": 20,
"status": "met",
"details": [],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "good",
"name": "Documentation",
"note": null,
"notes": [],
"value": 75,
"inputs": {
"topics": [],
"has_wiki": true,
"homepage": null,
"has_readme": true,
"has_docs_dir": true,
"has_description": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 30,
"status": "met",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 25,
"status": "met",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "repository_description",
"name": "Repository description",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "moderate",
"name": "Security",
"value": 67,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "moderate",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): Packaging. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"packaging"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 59,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 17,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 1,
"scorecard_aggregate": 5.9
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "no binaries found in the repo",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "branch protection is not maximal on development and all release branches",
"points": 3,
"status": "partial",
"details": [],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 0.8,
"status": "partial",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no dangerous workflow patterns detected",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "update tool detected",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is not fuzzed",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file detected",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "project was created within the last 90 days. Please review its contents carefully",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow not detected",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 5
},
{
"key": "pinned_dependencies",
"name": "Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "SAST tool is run on all commits",
"points": 5,
"status": "met",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file detected",
"points": 5,
"status": "met",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "Project has not signed or included provenance with any releases.",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "GitHub workflow tokens follow principle of least privilege",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "0 existing vulnerabilities detected",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
}
]
},
{
"key": "dependency_advisories",
"band": "excellent",
"name": "Dependency advisories",
"note": "Excluded from scoring (no data or not applicable): Indirect dependencies free of known advisories, No advisories left outstanding. Remaining weights renormalized. Matched 49 resolved dependencies against OSV. This repository publishes no package the index resolves, so the repository dependency graph was assessed instead. That graph mixes development and test pins with shipped dependencies, so only the declared runtime dependencies are scored; transitive findings are reported as context and excluded from the score. Reachability is not analyzed.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"indirect_dependencies_free_of_known_advisories",
"no_advisories_left_outstanding"
]
}
},
{
"code": "weights_renormalized",
"params": {}
},
{
"code": "advisories_scope_repository",
"params": {
"assessed": 49
}
},
{
"code": "advisories_repo_graph_caveat",
"params": {}
},
{
"code": "advisories_reachability",
"params": {}
}
],
"value": 100,
"inputs": {
"source": "osv",
"advisories": 0,
"affected_packages": 0,
"assessed_packages": 49,
"unassessed_packages": 0,
"affected_by_severity": "none",
"direct_affected_packages": 0
},
"components": [
{
"key": "direct_dependencies_free_of_known_advisories",
"name": "Direct dependencies free of known advisories",
"detail": "no direct dependency carries a known advisory",
"points": 35,
"status": "met",
"details": [
{
"code": "no_direct_advisories",
"params": {}
}
],
"max_points": 35
},
{
"key": "indirect_dependencies_free_of_known_advisories",
"name": "Indirect dependencies free of known advisories",
"detail": "transitive set not separable from development and test dependencies in this scope",
"points": 0,
"status": "excluded",
"details": [
{
"code": "advisories_scope_not_separable",
"params": {}
}
],
"max_points": 25
},
{
"key": "no_advisories_left_outstanding",
"name": "No advisories left outstanding",
"detail": "no advisory carries a publication date",
"points": 0,
"status": "excluded",
"details": [
{
"code": "advisories_no_publication_date",
"params": {}
}
],
"max_points": 40
}
]
},
{
"key": "malicious_dependencies",
"band": "excellent",
"name": "Malicious dependencies",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"source": "osv",
"meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
"packages": [],
"red_flag": false,
"assessed_packages": 49,
"malicious_packages": 0,
"direct_malicious_packages": 0,
"withdrawn_malicious_packages": 0,
"installable_malicious_packages": 0
},
"components": [
{
"key": "no_dependency_reported_as_a_malicious_package",
"name": "No dependency reported as a malicious package",
"detail": "no dependency is reported as a malicious package",
"points": 100,
"status": "met",
"details": [
{
"code": "no_malicious_dependencies",
"params": {}
}
],
"max_points": 100
}
]
},
{
"key": "high_risk_jurisdiction_exposure",
"band": "excellent",
"name": "High-Risk Jurisdiction Exposure",
"note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
"notes": [
{
"code": "jurisdiction_evidence_limits",
"params": {}
}
],
"value": 100,
"inputs": {
"meaning": "self-published location evidence; not nationality or citizenship",
"red_flag": false,
"exposures": [],
"policy_countries": [
"Russia",
"Iran",
"North Korea"
],
"review_only_matches": 0,
"assessed_self_published_locations": 2
},
"components": [
{
"key": "policy_exposure_multiplier",
"name": "Policy exposure multiplier",
"detail": "no confirmed policy-scope location match",
"points": 100,
"status": "met",
"details": [
{
"code": "jurisdiction_no_match",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
},
{
"key": "ai_readiness",
"band": "moderate",
"name": "AI Readiness",
"value": 50,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "at_risk",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 0.901,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "no CLAUDE.md / AGENTS.md / editor rules",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_instructions",
"params": {}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "82 of 91 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 82,
"sampled": 91
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "moderate",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 53,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [
"uv.lock"
],
"has_dockerfile": false,
"typed_language": false,
"bootstrap_files": [],
"has_devcontainer": false,
"has_linter_config": true,
"typecheck_configs": [],
"agent_commit_share": 0.01,
"toolchain_manifests": [],
"dependency_bot_commit_share": 0.09
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 18
},
{
"key": "automated_tests",
"name": "Automated tests",
"detail": null,
"points": 22,
"status": "met",
"details": [],
"max_points": 22
},
{
"key": "lint_format_config",
"name": "Lint / format config",
"detail": null,
"points": 11,
"status": "met",
"details": [],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": "lockfile",
"points": 10,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "lockfile"
}
}
],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "1 of the last 100 commits agent-authored or agent-credited",
"points": 2,
"status": "partial",
"details": [
{
"code": "agent_authored_commits",
"params": {
"count": 1,
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "9 of the last 100 commits are automated dependency updates",
"points": 8,
"status": "met",
"details": [
{
"code": "dependency_bot_commits",
"params": {
"count": 9,
"sampled": 100
}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "moderate",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 53,
"inputs": {
"primary_language": "Python",
"largest_source_bytes": 94751,
"source_files_sampled": 52,
"oversized_source_files": 2
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "Python without a type-check config",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_typecheck_config_language",
"params": {
"language": "Python"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "2/52 source files over 60KB",
"points": 52.9,
"status": "partial",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 52,
"oversized": 2
}
}
],
"max_points": 55
}
]
},
{
"key": "ai_interfaces",
"band": "moderate",
"name": "Machine-readable interfaces",
"note": null,
"notes": [],
"value": 60,
"inputs": {
"example_dirs": [
"examples",
"recipes"
],
"has_mcp_signal": true,
"api_schema_files": []
},
"components": [
{
"key": "api_schema_openapi_graphql_proto",
"name": "API schema (OpenAPI/GraphQL/proto)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 40
},
{
"key": "mcp_server",
"name": "MCP server",
"detail": null,
"points": 20,
"status": "met",
"details": [],
"max_points": 20
},
{
"key": "runnable_examples",
"name": "Runnable examples",
"detail": "examples, recipes",
"points": 40,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "examples, recipes"
}
}
],
"max_points": 40
}
]
}
],
"description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
}
],
"metrics_version": "1.13.0"
},
"warnings": [
"Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
"deps.dev does not index pypi:local-delegate-mcp@0.17.0; advisories assessed against the repository dependency graph instead"
],
"report_type": "repository",
"generated_at": "2026-07-30T20:32:05.676454Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/z/ZahiriNatZuke/local-delegate.svg",
"full_name": "ZahiriNatZuke/local-delegate",
"license_state": "standard",
"license_spdx": "MIT"
}