Installazione da sorgente senza vision-engine-version.txt: il worker rifiuta i job (Prova del wizard DXF) #109

Closed
opened 2026-10-28 09:18:34 +00:00 by Adriano · 3 comments
Owner

COSA: TMF avviato da sorgente da un git archive (senza .git, senza git sul PC) rifiuta ogni job di visione: engine_version() non trova VISION_ENGINE_VERSION e git rev-parse fallisce (WinError 2).
FILE: packaging/windows/avvio.py:222 — legge /vision-engine-version.txt, che da sorgente scrive solo build.ps1 (pacchetto Nuitka); il git archive usato per il PC fiera il 25/10 non lo contiene.
FILE: src/vision/runner.py:92 — engine_version(): ordine env → git, nessun ripiego (voluto, R8).
CASO: PC fiera DESKTOP-RABEHJJ, sorgente b2e3867 (lavoro/daitarn-tmf-dxfcal) in C:\Tielogic\TieMeasureFlow-src; «Prova» del wizard ricetta da DXF in errore il 27/10.
PROVA: 28/10 scritto a mano C:\Tielogic\TieMeasureFlow-src\vision-engine-version.txt (ASCII, senza BOM, 40 byte) = 06b549a25d0bff7504a0e8bbbd233fd5fc05652a, riavvio → GET 127.0.0.1:8100/health → {"status":"ok","engine_version":"06b549a2…"}.
VERIFICATO: genicam.py del submodule sul PC ha sha256 (senza CR) f582060e… = 06b549a, diverso dal padre 7d57ff1.
CORREZIONE: lo script che prepara l'archivio per un PC (o sviluppo.ps1) scrive vision-engine-version.txt = git -C vendor/visionsuite rev-parse HEAD, in ASCII senza BOM (strip() non toglie il BOM).
TEST: archivio prodotto contiene il file con l'hash del submodule; avvio da sorgente senza .git → /health risponde con quell'hash.

COSA: TMF avviato da sorgente da un git archive (senza .git, senza git sul PC) rifiuta ogni job di visione: engine_version() non trova VISION_ENGINE_VERSION e git rev-parse fallisce (WinError 2). FILE: packaging/windows/avvio.py:222 — legge <radice>/vision-engine-version.txt, che da sorgente scrive solo build.ps1 (pacchetto Nuitka); il git archive usato per il PC fiera il 25/10 non lo contiene. FILE: src/vision/runner.py:92 — engine_version(): ordine env → git, nessun ripiego (voluto, R8). CASO: PC fiera DESKTOP-RABEHJJ, sorgente b2e3867 (lavoro/daitarn-tmf-dxfcal) in C:\Tielogic\TieMeasureFlow-src; «Prova» del wizard ricetta da DXF in errore il 27/10. PROVA: 28/10 scritto a mano C:\Tielogic\TieMeasureFlow-src\vision-engine-version.txt (ASCII, senza BOM, 40 byte) = 06b549a25d0bff7504a0e8bbbd233fd5fc05652a, riavvio → GET 127.0.0.1:8100/health → {"status":"ok","engine_version":"06b549a2…"}. VERIFICATO: genicam.py del submodule sul PC ha sha256 (senza CR) f582060e… = 06b549a, diverso dal padre 7d57ff1. CORREZIONE: lo script che prepara l'archivio per un PC (o sviluppo.ps1) scrive vision-engine-version.txt = git -C vendor/visionsuite rev-parse HEAD, in ASCII senza BOM (strip() non toglie il BOM). TEST: archivio prodotto contiene il file con l'hash del submodule; avvio da sorgente senza .git → /health risponde con quell'hash.
Adriano added the bug label 2026-10-28 09:18:34 +00:00
Author
Owner

ESITO: richiesta (passo 1, analisi Opus claude-opus-5-5)
RIF: gitea:Adriano/TieMeasureFlow#109
COSA: un'installazione da sorgente ha sempre vision-engine-version.txt con l'hash del submodule: lo scrive lo script che prepara l'archivio per un PC; sviluppo.ps1 lo aggiorna quando git c'è e si ferma con un errore chiaro quando mancano sia git sia il file.
BASE: origin/V3.0.0 8c361c1 (ramo di lavoro di TMF). Ramo lavoro/daitarn-tmf-109, worktree daitarn C:/Users/Adriano/lavoro/TieMeasureFlow-109 (repo D:/Sorgenti/lavoro/TieMeasureFlow).
FATTI (VERIFICATO leggendo 8c361c1):

  • packaging/windows/avvio.py:221-224: cartella_programma()/vision-engine-version.txt → VISION_ENGINE_VERSION (.strip(), che NON toglie un BOM); da sorgente cartella_programma() = radice del repo (avvio.py:94-98).
  • packaging/windows/build.ps1:209-212: il pacchetto Nuitka lo scrive con git -C vendor/visionsuite rev-parse HEAD, UTF8 senza BOM.
  • packaging/windows/sviluppo.ps1 (53 righe): non lo scrive mai.
  • Nel repo non c'è uno script che prepari l'archivio sorgente per un PC: quello del 25/10 era un git archive a mano, che non include il submodule né il file.

MODIFICHE

  1. NUOVO scripts/archivio_sorgente.py (solo stdlib + git). Header cosa fa / come si usa / da cosa dipende (#109).
    uv run python scripts/archivio_sorgente.py --out <file.zip> [--ref HEAD]
    • sha del submodule = quello registrato nel commit ref (git ls-tree <ref> vendor/visionsuite, modo 160000), NON la HEAD del checkout del submodule.
    • zip = git archive --format=zip <ref> del repo + git -C vendor/visionsuite archive --format=zip --prefix=vendor/visionsuite/ <sha> + vision-engine-version.txt = sha (40 caratteri ASCII, senza BOM e senza a capo) nella radice dello zip.
    • errore chiaro (uscita ≠ 0, niente zip a metà) se il submodule non è inizializzato o non ha quel commit.
    • funzione crea_archivio(repo: Path, out: Path, ref="HEAD") -> str (ritorna lo sha), usata dalla CLI e dai test.
  2. packaging/windows/sviluppo.ps1, prima di avviare avvio.py:
    • se git -C vendor/visionsuite rev-parse HEAD riesce → scrive/aggiorna <radice>\vision-engine-version.txt ([System.IO.File]::WriteAllText(..., (New-Object System.Text.UTF8Encoding $false)), come build.ps1:212);
    • altrimenti, se il file c'è → lo usa e stampa il valore;
    • altrimenti → throw con un messaggio che dice cosa manca e come rimediare (archivio fatto con scripts/archivio_sorgente.py, oppure il file scritto a mano in ASCII senza BOM).
      Commento #109 accanto. Header dello script aggiornato.
  3. .gitignore: /vision-engine-version.txt (altrimenti ogni checkout di sviluppo resta sporco dopo sviluppo.ps1).

TEST

  • NUOVO scripts/tests/test_archivio_sorgente.py, sintetico: repo temporaneo con un submodule finto in vendor/visionsuite (git -c protocol.file.allow=always submodule add <repo locale> vendor/visionsuite, commit), -c core.autocrlf=false:
    a. crea_archivio → lo zip contiene un file del repo, un file del submodule sotto vendor/visionsuite/ e vision-engine-version.txt = sha registrato, 40 byte, senza BOM, senza a capo.
    b. dopo un commit nuovo nel submodule NON registrato nel padre → lo sha nello zip resta quello registrato.
    c. submodule non inizializzato → errore, nessun zip lasciato.
  • packaging/windows/tests/test_avvio.py: invariati e verdi; se non c'è già, un caso: file presente nella radice sorgente → VISION_ENGINE_VERSION impostata.
  • Comandi: uv run --python 3.13 --extra dev pytest -q scripts/tests/test_archivio_sorgente.py packaging/windows/tests/test_avvio.py (se servono altri extra, dirlo nel rapporto), più la suite scripts/tests invariata.
  • Prova manuale (nel rapporto): uv run python scripts/archivio_sorgente.py --out <tmp>/tmf.zip nel worktree con il submodule inizializzato → hash nel file == git ls-tree HEAD vendor/visionsuite.

NON TOCCARE: src/**, vendor/visionsuite, build.ps1, avvio.py (salvo il test), TieMeasureFlow.iss.

ESITO: richiesta (passo 1, analisi Opus claude-opus-5-5) RIF: gitea:Adriano/TieMeasureFlow#109 COSA: un'installazione da sorgente ha sempre vision-engine-version.txt con l'hash del submodule: lo scrive lo script che prepara l'archivio per un PC; sviluppo.ps1 lo aggiorna quando git c'è e si ferma con un errore chiaro quando mancano sia git sia il file. BASE: origin/V3.0.0 8c361c1 (ramo di lavoro di TMF). Ramo lavoro/daitarn-tmf-109, worktree daitarn C:/Users/Adriano/lavoro/TieMeasureFlow-109 (repo D:/Sorgenti/lavoro/TieMeasureFlow). FATTI (VERIFICATO leggendo 8c361c1): - packaging/windows/avvio.py:221-224: `cartella_programma()/vision-engine-version.txt` → VISION_ENGINE_VERSION (`.strip()`, che NON toglie un BOM); da sorgente cartella_programma() = radice del repo (avvio.py:94-98). - packaging/windows/build.ps1:209-212: il pacchetto Nuitka lo scrive con `git -C vendor/visionsuite rev-parse HEAD`, UTF8 senza BOM. - packaging/windows/sviluppo.ps1 (53 righe): non lo scrive mai. - Nel repo non c'è uno script che prepari l'archivio sorgente per un PC: quello del 25/10 era un `git archive` a mano, che non include il submodule né il file. MODIFICHE 1. NUOVO scripts/archivio_sorgente.py (solo stdlib + git). Header cosa fa / come si usa / da cosa dipende (#109). `uv run python scripts/archivio_sorgente.py --out <file.zip> [--ref HEAD]` - sha del submodule = quello registrato nel commit `ref` (`git ls-tree <ref> vendor/visionsuite`, modo 160000), NON la HEAD del checkout del submodule. - zip = `git archive --format=zip <ref>` del repo + `git -C vendor/visionsuite archive --format=zip --prefix=vendor/visionsuite/ <sha>` + `vision-engine-version.txt` = sha (40 caratteri ASCII, senza BOM e senza a capo) nella radice dello zip. - errore chiaro (uscita ≠ 0, niente zip a metà) se il submodule non è inizializzato o non ha quel commit. - funzione `crea_archivio(repo: Path, out: Path, ref="HEAD") -> str` (ritorna lo sha), usata dalla CLI e dai test. 2. packaging/windows/sviluppo.ps1, prima di avviare avvio.py: - se `git -C vendor/visionsuite rev-parse HEAD` riesce → scrive/aggiorna `<radice>\vision-engine-version.txt` (`[System.IO.File]::WriteAllText(..., (New-Object System.Text.UTF8Encoding $false))`, come build.ps1:212); - altrimenti, se il file c'è → lo usa e stampa il valore; - altrimenti → `throw` con un messaggio che dice cosa manca e come rimediare (archivio fatto con scripts/archivio_sorgente.py, oppure il file scritto a mano in ASCII senza BOM). Commento #109 accanto. Header dello script aggiornato. 3. .gitignore: `/vision-engine-version.txt` (altrimenti ogni checkout di sviluppo resta sporco dopo sviluppo.ps1). TEST - NUOVO scripts/tests/test_archivio_sorgente.py, sintetico: repo temporaneo con un submodule finto in vendor/visionsuite (`git -c protocol.file.allow=always submodule add <repo locale> vendor/visionsuite`, commit), `-c core.autocrlf=false`: a. crea_archivio → lo zip contiene un file del repo, un file del submodule sotto vendor/visionsuite/ e vision-engine-version.txt = sha registrato, 40 byte, senza BOM, senza a capo. b. dopo un commit nuovo nel submodule NON registrato nel padre → lo sha nello zip resta quello registrato. c. submodule non inizializzato → errore, nessun zip lasciato. - packaging/windows/tests/test_avvio.py: invariati e verdi; se non c'è già, un caso: file presente nella radice sorgente → VISION_ENGINE_VERSION impostata. - Comandi: `uv run --python 3.13 --extra dev pytest -q scripts/tests/test_archivio_sorgente.py packaging/windows/tests/test_avvio.py` (se servono altri extra, dirlo nel rapporto), più la suite `scripts/tests` invariata. - Prova manuale (nel rapporto): `uv run python scripts/archivio_sorgente.py --out <tmp>/tmf.zip` nel worktree con il submodule inizializzato → hash nel file == `git ls-tree HEAD vendor/visionsuite`. NON TOCCARE: src/**, vendor/visionsuite, build.ps1, avvio.py (salvo il test), TieMeasureFlow.iss.
Adriano added the assegnata:daitarn label 2026-11-06 10:49:04 +00:00
Author
Owner

🔵 daitarn — preso in carico 2026-11-06T10:49:00Z
ramo: lavoro/daitarn · capacità: build-windows, gpu

🔵 daitarn — **preso in carico** 2026-11-06T10:49:00Z ramo: `lavoro/daitarn` · capacità: build-windows, gpu
Author
Owner

Soluzione

ESITO: fatto
RIF: gitea:Adriano/TieMeasureFlow#109; analisi nel commento del 06/11/2026
COSA: un'installazione da sorgente ha sempre vision-engine-version.txt. Lo scrive lo script che prepara l'archivio per un PC senza git; sviluppo.ps1 lo aggiorna quando git e il submodule ci sono e si ferma con un errore chiaro quando mancano sia lo sha sia il file.
FILE:

  • scripts/archivio_sorgente.py (nuovo): uv run python scripts/archivio_sorgente.py --out <file.zip> [--ref HEAD]. Zip = git archive del repo + submodule vendor/visionsuite (prefisso vendor/visionsuite/) + vision-engine-version.txt nella radice: lo sha REGISTRATO nel commit (ls-tree, modo 160000), 40 byte ASCII, senza BOM e senza a capo. Submodule non inizializzato o senza il commit → uscita 1, nessuno zip (scrittura su temporaneo e poi rename).
  • packaging/windows/sviluppo.ps1:51-68: con git e vendor\visionsuite.git presente scrive \vision-engine-version.txt (UTF8 senza BOM, come build.ps1:212); altrimenti usa il file se c'è; altrimenti throw con il rimedio. Il controllo su .git evita che git -C risalga al repo padre e scriva lo sha di TMF.
  • .gitignore: /vision-engine-version.txt.
  • scripts/tests/test_archivio_sorgente.py (nuovo, 4 test); packaging/windows/tests/test_avvio.py: +1 caso (file nella radice sorgente → VISION_ENGINE_VERSION).
    COMMIT: 6441a92, 999f470, 452862e, 5738920; V3.0.0 portato in avanti senza merge 8c361c1..5738920 il 06/11. ⚠️ 999f470 da solo ha \v nei percorsi di sviluppo.ps1 (tabulazione verticale), corretto in 452862e: non fare checkout di 999f470.
    PROVA:
  • VERIFICATO (Opus, daitarn): uv run --no-project --python 3.13 --with pytest pytest -q scripts/tests/test_archivio_sorgente.py → 4 passed su 5738920.
  • Agente Sonnet: test_avvio.py → 27 passed (UV_PROJECT_ENVIRONMENT=build/venv313 uv run --python 3.13 --frozen --extra server --extra client --extra vision-worker --group windows --with pytest pytest packaging/windows/tests/test_avvio.py -q); scripts/tests interi → exit 0, nessun F, riepilogo non letto.
  • Agente Sonnet, prova manuale: zip del worktree → vision-engine-version.txt = 06b549a25d0bff7504a0e8bbbd233fd5fc05652a == git ls-tree HEAD vendor/visionsuite, 1537 voci.
  • Agente Sonnet: blocco di sviluppo.ps1 estratto e provato in tre casi (submodule inizializzato → 40 byte senza BOM; senza .git con file → lo usa; senza .git senza file → throw). sviluppo.ps1 intero non avviato.
    NON FATTO: la suite scripts/tests rilanciata da Opus è stata fermata per memoria bassa su daitarn. Il diff non tocca codice esistente fuori da sviluppo.ps1.
    NOTA: senza submodule inizializzato il messaggio dice «git non disponibile: uso …» anche se git c'è. È cosmetico ed è stato lasciato così.
    USO per un PC senza git: dal clone con il submodule inizializzato uv run python scripts/archivio_sorgente.py --out tmf.zip, poi copiare lo zip ed estrarlo.
**Soluzione** ESITO: fatto RIF: gitea:Adriano/TieMeasureFlow#109; analisi nel commento del 06/11/2026 COSA: un'installazione da sorgente ha sempre vision-engine-version.txt. Lo scrive lo script che prepara l'archivio per un PC senza git; sviluppo.ps1 lo aggiorna quando git e il submodule ci sono e si ferma con un errore chiaro quando mancano sia lo sha sia il file. FILE: - scripts/archivio_sorgente.py (nuovo): `uv run python scripts/archivio_sorgente.py --out <file.zip> [--ref HEAD]`. Zip = `git archive` del repo + submodule vendor/visionsuite (prefisso vendor/visionsuite/) + vision-engine-version.txt nella radice: lo sha REGISTRATO nel commit (ls-tree, modo 160000), 40 byte ASCII, senza BOM e senza a capo. Submodule non inizializzato o senza il commit → uscita 1, nessuno zip (scrittura su temporaneo e poi rename). - packaging/windows/sviluppo.ps1:51-68: con git e vendor\visionsuite\.git presente scrive <radice>\vision-engine-version.txt (UTF8 senza BOM, come build.ps1:212); altrimenti usa il file se c'è; altrimenti throw con il rimedio. Il controllo su .git evita che `git -C` risalga al repo padre e scriva lo sha di TMF. - .gitignore: /vision-engine-version.txt. - scripts/tests/test_archivio_sorgente.py (nuovo, 4 test); packaging/windows/tests/test_avvio.py: +1 caso (file nella radice sorgente → VISION_ENGINE_VERSION). COMMIT: 6441a92, 999f470, 452862e, 5738920; V3.0.0 portato in avanti senza merge 8c361c1..5738920 il 06/11. ⚠️ 999f470 da solo ha `\v` nei percorsi di sviluppo.ps1 (tabulazione verticale), corretto in 452862e: non fare checkout di 999f470. PROVA: - VERIFICATO (Opus, daitarn): `uv run --no-project --python 3.13 --with pytest pytest -q scripts/tests/test_archivio_sorgente.py` → 4 passed su 5738920. - Agente Sonnet: test_avvio.py → 27 passed (`UV_PROJECT_ENVIRONMENT=build/venv313 uv run --python 3.13 --frozen --extra server --extra client --extra vision-worker --group windows --with pytest pytest packaging/windows/tests/test_avvio.py -q`); scripts/tests interi → exit 0, nessun F, riepilogo non letto. - Agente Sonnet, prova manuale: zip del worktree → vision-engine-version.txt = 06b549a25d0bff7504a0e8bbbd233fd5fc05652a == `git ls-tree HEAD vendor/visionsuite`, 1537 voci. - Agente Sonnet: blocco di sviluppo.ps1 estratto e provato in tre casi (submodule inizializzato → 40 byte senza BOM; senza .git con file → lo usa; senza .git senza file → throw). sviluppo.ps1 intero non avviato. NON FATTO: la suite scripts/tests rilanciata da Opus è stata fermata per memoria bassa su daitarn. Il diff non tocca codice esistente fuori da sviluppo.ps1. NOTA: senza submodule inizializzato il messaggio dice «git non disponibile: uso …» anche se git c'è. È cosmetico ed è stato lasciato così. USO per un PC senza git: dal clone con il submodule inizializzato `uv run python scripts/archivio_sorgente.py --out tmf.zip`, poi copiare lo zip ed estrarlo.
Adriano removed the assegnata:daitarn label 2026-11-06 11:10:05 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Adriano/TieMeasureFlow#109