Sintomo
La CI è rossa su main da inizio agosto, e la conseguenza non è cosmetica:
le immagini su GHCR non vengono più pubblicate.
docker-publish.yml è gated sulla CI:
on:
workflow_run:
workflows: ["CI"]
types: [completed]
branches: [main]
jobs:
publish:
if: ${{ github.event.workflow_run.conclusion == 'success' }}
Catena verificata il 2026-09-03:
| Passo |
Esito |
CI su main (a1b03eb) |
failure — step ruff check . |
docker-publish conseguente |
skipped |
ghcr.io/.../kg-api:latest (+ kg-ui, kg-mcp, kg-agents) |
ancora da eab6c0b, 11 giugno 2026 |
Effetto concreto: il lavoro llama.cpp/OpenAI della PR #5 è su main da un
mese ma non è in nessuna immagine pubblicata. Chi fa docker compose -f docker-compose.ghcr.yml up ottiene il comportamento pre-#5 — solo Ollama —
senza alcun segnale che stia usando codice vecchio. È esattamente il tipo di
guasto che sembra un bug di configurazione per giorni.
Causa
Non è codice nuovo: il linter non è pinnato.
knowledge-graph-api/requirements.txt:38
La CI risolve alla 0.16.1, che ha abilitato regole non attive quando la CI era
verde (giugno). Quelle regole illuminano codice preesistente.
Misurato con ruff==0.16.1 su worktree puliti:
| Ref |
Errori |
a1b03eb (main, post PR #5) |
21 |
eab6c0b (pre PR #5) |
21, distribuzione identica per regola |
Quindi la PR #5 è neutra sul lint: non ha rotto niente, ha solo avuto la
sfortuna di essere il primo push dopo che una nuova ruff era uscita.
Con ruff>=0.4.0 la CI è una funzione della data, non del codice: lo stesso
commit passa o fallisce a seconda di quando gira. È la proprietà che rende
inutile un gate.
I 21 rilievi
cd knowledge-graph-api && ruff check . — 5 auto-fixabili con --fix.
| Regola |
N |
Dove |
BLE001 blind except Exception |
12 |
api/main.py (63, 72, 82), api/routes/graph.py:96, api/routes/ingest.py (38, 120, 193), api/routes/query.py:30, pipeline/extractor.py:149, pipeline/ingest.py:108, storage/redis_vector.py (69, 265) |
I001 import non ordinati [*] |
3 |
api/routes/ingest.py:3, storage/neo4j_graph.py:3, tests/conftest.py:3 |
B008 chiamata a File() nei default |
2 |
api/routes/ingest.py (45, 75) |
DTZ001 datetime() senza tzinfo |
2 |
tests/test_ingest_json.py (48, 82) |
RUF022 __all__ non ordinato [*] |
1 |
models/__init__.py:7 |
ASYNC230 open() bloccante in funzione async |
1 |
tests/test_ingest_json.py:26 |
Nota sulle BLE001: buona parte sono except Exception deliberati in
handler HTTP e in percorsi che devono degradare invece di propagare (health
check, ingest, keyword search). Non vanno "corretti" trasformandoli in eccezioni
strette se la semantica voluta è «qualunque cosa vada storta, degrada e logga» —
in quel caso l'# noqa: BLE001 con una riga di motivazione è la risposta
onesta, non un except (A, B, C) che dimentica il quarto caso.
Fix proposto
- Pinnare il linter:
ruff==0.16.1 in requirements.txt (o ~=0.16.0).
Aggiornarlo diventa così un cambiamento deliberato e revisionabile, non un
evento meteorologico.
- Azzerare i 21 rilievi:
ruff check . --fix per i 5 automatici; per le
BLE001 decidere caso per caso fra eccezione stretta e # noqa motivato;
B008 con il singleton a livello di modulo; DTZ001/ASYNC230 nei test
sono correzioni banali.
- Verificare che gli altri tre componenti (
knowledge-graph-mcp,
-agents, -ui) non abbiano lo stesso pin aperto: la CI li lint-a tutti, e
basta uno per tenere rosso il gate.
Acceptance criteria
Relazioni
Sintomo
La CI è rossa su
mainda inizio agosto, e la conseguenza non è cosmetica:le immagini su GHCR non vengono più pubblicate.
docker-publish.ymlè gated sulla CI:Catena verificata il 2026-09-03:
main(a1b03eb)ruff check .docker-publishconseguenteghcr.io/.../kg-api:latest(+kg-ui,kg-mcp,kg-agents)eab6c0b, 11 giugno 2026Effetto concreto: il lavoro llama.cpp/OpenAI della PR #5 è su
mainda unmese ma non è in nessuna immagine pubblicata. Chi fa
docker compose -f docker-compose.ghcr.yml upottiene il comportamento pre-#5 — solo Ollama —senza alcun segnale che stia usando codice vecchio. È esattamente il tipo di
guasto che sembra un bug di configurazione per giorni.
Causa
Non è codice nuovo: il linter non è pinnato.
knowledge-graph-api/requirements.txt:38La CI risolve alla
0.16.1, che ha abilitato regole non attive quando la CI eraverde (giugno). Quelle regole illuminano codice preesistente.
Misurato con
ruff==0.16.1su worktree puliti:a1b03eb(main, post PR #5)eab6c0b(pre PR #5)Quindi la PR #5 è neutra sul lint: non ha rotto niente, ha solo avuto la
sfortuna di essere il primo push dopo che una nuova ruff era uscita.
Con
ruff>=0.4.0la CI è una funzione della data, non del codice: lo stessocommit passa o fallisce a seconda di quando gira. È la proprietà che rende
inutile un gate.
I 21 rilievi
cd knowledge-graph-api && ruff check .— 5 auto-fixabili con--fix.BLE001blindexcept Exceptionapi/main.py(63, 72, 82),api/routes/graph.py:96,api/routes/ingest.py(38, 120, 193),api/routes/query.py:30,pipeline/extractor.py:149,pipeline/ingest.py:108,storage/redis_vector.py(69, 265)I001import non ordinati[*]api/routes/ingest.py:3,storage/neo4j_graph.py:3,tests/conftest.py:3B008chiamata aFile()nei defaultapi/routes/ingest.py(45, 75)DTZ001datetime()senzatzinfotests/test_ingest_json.py(48, 82)RUF022__all__non ordinato[*]models/__init__.py:7ASYNC230open()bloccante in funzione asynctests/test_ingest_json.py:26Nota sulle
BLE001: buona parte sonoexcept Exceptiondeliberati inhandler HTTP e in percorsi che devono degradare invece di propagare (health
check, ingest, keyword search). Non vanno "corretti" trasformandoli in eccezioni
strette se la semantica voluta è «qualunque cosa vada storta, degrada e logga» —
in quel caso l'
# noqa: BLE001con una riga di motivazione è la rispostaonesta, non un
except (A, B, C)che dimentica il quarto caso.Fix proposto
ruff==0.16.1inrequirements.txt(o~=0.16.0).Aggiornarlo diventa così un cambiamento deliberato e revisionabile, non un
evento meteorologico.
ruff check . --fixper i 5 automatici; per leBLE001decidere caso per caso fra eccezione stretta e# noqamotivato;B008con il singleton a livello di modulo;DTZ001/ASYNC230nei testsono correzioni banali.
knowledge-graph-mcp,-agents,-ui) non abbiano lo stesso pin aperto: la CI li lint-a tutti, ebasta uno per tenere rosso il gate.
Acceptance criteria
ruffpinnato in tutti irequirements.txt/manifest che la CI installa.ruff check .verde inknowledge-graph-api(e negli altri componenti).main.docker-publishriparte e ripubblica le 4 immagini; verificato chekg-api:latestcontengapipeline/llm/llamacpp_provider.py.pytest tests/resta verde (baseline attuale: 32 passed).Relazioni
publish è skipped, nessun rename arriva in un'immagine.
limen, che puntaKG__BASE_URLallo stackdocker-compose.ghcr.ymle oggi riceverebbel'immagine di giugno.