fix(gateway): orfanaggio per connessione + esito del runner dentro il wake #9

Merged
claudia merged 1 commit from fix/gateway-orphan-per-connection into main 2026-09-10 20:56:28 +00:00
Owner

Perche

I task lunghi del runner non tornavano mai all orchestratrice. Due difetti indipendenti.

1. Orfanaggio per client_id invece che per connessione

Hub._by_orchestrator era indicizzato sul client_id scelto dal client, che non e univoco: due processi gw.py con lo stesso nome finivano nello stesso bucket. Quando uno si disconnetteva, orphan_orchestrator orfanava anche le sessioni con un task in volo dellaltro; scaduta la grace la sessione veniva chiusa e il chat.result del runner buttato.

Ora lindice e chiavato su Connection.conn_id (uuid per socket) e orphan_orchestrator colpisce solo le sessioni di quella connessione.

2. Il wake non portava lesito

build_wake_text scartava frame[text]: il risveglio conteneva solo ok/durata/costo, quindi lesito vero arrivava soltanto se il client era sopravvissuto allattesa. Ora il wake include il report del runner (troncato a GW_WAKE_TEXT_MAX_CHARS, default 4000) e il session_id per ritrovare .agent-runner/work/<sid>/ sulla VM.

Test

81 passed. Aggiunti casi di regressione per entrambi i difetti.

## Perche I task lunghi del runner non tornavano mai all orchestratrice. Due difetti indipendenti. ### 1. Orfanaggio per client_id invece che per connessione `Hub._by_orchestrator` era indicizzato sul `client_id` scelto dal client, che **non e univoco**: due processi `gw.py` con lo stesso nome finivano nello stesso bucket. Quando uno si disconnetteva, `orphan_orchestrator` orfanava anche le sessioni con un task in volo dellaltro; scaduta la grace la sessione veniva chiusa e il `chat.result` del runner buttato. Ora lindice e chiavato su `Connection.conn_id` (uuid per socket) e `orphan_orchestrator` colpisce solo le sessioni di quella connessione. ### 2. Il wake non portava lesito `build_wake_text` scartava `frame[text]`: il risveglio conteneva solo ok/durata/costo, quindi lesito vero arrivava soltanto se il client era sopravvissuto allattesa. Ora il wake include il report del runner (troncato a `GW_WAKE_TEXT_MAX_CHARS`, default 4000) e il `session_id` per ritrovare `.agent-runner/work/<sid>/` sulla VM. ## Test 81 passed. Aggiunti casi di regressione per entrambi i difetti.
Due difetti indipendenti facevano perdere il risultato dei task lunghi.

1. `Hub._by_orchestrator` era indicizzato sul `client_id` scelto dal client,
   che NON e' univoco: due processi `gw.py` omonimi finivano nello stesso
   bucket, quindi la disconnessione di uno orfanava anche le sessioni con un
   task in volo dell'altro. Passata la grace, la sessione veniva chiusa e il
   `chat.result` del runner buttato. Ora l'indice e' chiavato su
   `Connection.conn_id` (uuid per socket) e `orphan_orchestrator` colpisce solo
   le sessioni di quella connessione.

2. `build_wake_text` scartava `frame["text"]`: il risveglio portava solo
   ok/durata/costo, quindi l'esito vero arrivava solo se il client
   orchestratrice era sopravvissuto all'attesa. Ora il wake include il report
   del runner (troncato a GW_WAKE_TEXT_MAX_CHARS, default 4000) e il
   `session_id`, cosi' il ritorno del task non dipende piu' da nessun processo.

Test: 81 passed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
claudia deleted branch fix/gateway-orphan-per-connection 2026-09-10 20:56:28 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Soltea-org/soltea-agent-gateway!9
No description provided.