Vai al contenuto

Skills

chimera-test-the-wiring-not-the-class

Una classe assemblata a mano in un test prova che la classe funziona, non che qualcosa la raggiunga — copri il percorso che la produzione prende davvero.

PatternProvenienza: cleanStato: activev0.1.0 · Apache-2.0

Conferita da chi ha letto la scheda, non rivendicata dal file su se stesso. Una scheda che l'agente distilla durante un'esecuzione che ha consumato contenuti non affidabili nasce contaminata e resta in attesa di revisione prima di essere mai recuperata.

Quando viene in mente

  • la feature funziona nei test ma non nell'app
  • componente dietro una factory o un registry
  • il flag è disattivato di default
  • suite verde, comportamento rotto

Il valore di solito sta in Evita e Verifica. Fai è la sezione che scrivono tutti.

Il corpo della scheda qui sopra è una traduzione. L'originale inglese è ciò che la CLI importa, ciò che l'agente legge in esecuzione e ciò che l'hash qui sotto attesta.

Trigger

Hai costruito un componente che la produzione raggiunge in modo indiretto: attraverso una factory, un registry, un plugin loader, un flag di configurazione, un router, un entrypoint della CLI, un container di dependency injection. I tuoi test lo costruiscono direttamente e ne chiamano i metodi.

Ognuno di quei test può passare mentre il componente è irraggiungibile nel sistema in esecuzione — perché nessuno di essi esercita la registrazione, il valore di default del flag, o il ramo dell'assemblatore che decide se includerlo del tutto.

Non si applica a una funzione pura che i chiamanti importano e invocano direttamente. Lì l'import è il cablaggio, e un unit test lo copre. Non si applica nemmeno quando stai deliberatamente testando un algoritmo in isolamento — quei test sono corretti e devono restare; questa card dice che da soli non bastano.

Fai

  1. Nomina l'entrypoint che un utente colpisce davvero: il sottocomando della CLI, la route HTTP, il ciclo di esecuzione dell'agente, il job schedulato. Scrivilo prima di scrivere il test.

  2. Scrivi almeno un test che parta da lì e non passi alcun argomento di costruzione per il tuo componente. Se il test deve nominare la tua classe perché la funzionalità accada, non sta testando il cablaggio.

  3. Costruisci l'oggetto nel modo in cui lo costruisce la produzione — chiama la factory reale o il caricatore di configurazione:

    # WRONG — proves the class, not the wiring: the component is handed to the thing under test,
    # so the test passes whether or not anything in production ever hands it over.
    assert "reminder" in render(feature=Feature(text="reminder"))
    
    # RIGHT — build it the way the entry point builds it, then look for the same observable
    assert "reminder" in build_the_real_way(config).render()
    

    Il caso di Chimera merita di essere citato perché la classe non è mai stata rotta. Le skill card avevano un retriever funzionante, uno store funzionante e un injector funzionante — e chimera/config.py:244 recita skill_cards: bool = Field(default=False, ...), quindi su un deployment standard non veniva mai iniettato nulla. Ogni unit test passava. La misurazione che alla fine l'ha scoperto contava le skill coniate contro le skill iniettate e ha trovato 39 contro zero.

  4. Verifica un osservabile che può comparire solo se il componente è stato raggiunto: del testo nel prompt renderizzato, una riga scritta, una riga di log, un exit code.

  5. Verifica il default. Se la funzionalità viene rilasciata dietro un flag, aggiungi un test separato che legga il valore di default senza alcun override e ne verifichi il valore. Una suite che gira sempre e solo con il flag forzato a on non può dirti cosa ricevono gli utenti.

Evita

Assemblare a mano i collaboratori che la produzione cabla da sé. La forma del fallimento è una classe handler con copertura unitaria completa che il router non registra mai, oppure una capability la cui chiave di configurazione è di default a off — la classe è corretta, i test sono corretti, e la funzionalità non fa nulla nel prodotto. Niente è rosso, quindi niente viene indagato, e la lacuna sopravvive finché un essere umano non prova la funzionalità a mano.

Evita anche di falsificare proprio la giunzione che stai cercando di coprire. Fare patch della factory, o stubbare il caricatore di configurazione perché restituisca un oggetto che contiene il tuo componente, cancella esattamente il codice che il test esisteva per esercitare:


monkeypatch.setattr(mod, "load_plugins", lambda: [MyPlugin()])

Falsifica invece al confine più esterno — il client di rete, l'orologio, la chiamata all'LLM — e lascia che tutto ciò che sta tra l'entrypoint e il tuo componente sia reale.

Verifica

Cancella il cablaggio ed esegui la suite. Commenta la riga di registrazione: il decoratore @register, la voce nel dict di dispatch, la chiamata include_router(...), il default nello schema di configurazione.

Poi la domanda binaria: un test è diventato rosso, ed era un test che non nomina mai la tua classe per nome?

Se la suite resta verde, la tua copertura è solo a livello di classe e il cablaggio non è testato. Se l'unico test rosso è quello che costruisce la classe direttamente, la risposta è la stessa. Ripristina poi la riga e conferma che sia verde — e fai git diff prima del commit, così la registrazione cancellata non finisce in rilascio.

Rischio

I test sull'entrypoint sono più lenti, più difficili da debuggare, e localizzano peggio: quando uno fallisce sai che la funzionalità è rotta ma non quale dei dieci componenti l'ha rotta. È un costo reale, e la risposta sbagliata a questa card è cancellare i tuoi unit test in favore di quelli end-to-end. Tienili entrambi — il test sul cablaggio ti dice che si è rotto, l'unit test ti dice cosa.

Passare per l'entrypoint reale può anche toccare cose che non vuoi toccare in CI: un'API a pagamento, un database vivo, un filesystem fuori dalla sandbox. Se l'unico modo per raggiungere l'entrypoint è spendere soldi o mutare la produzione, non forzarlo; copri invece direttamente la funzione di assemblaggio e accetta di essere a un passo dal percorso vero.

E questa card cattura la raggiungibilità, non la correttezza. Una funzionalità può essere cablata perfettamente all'entrypoint e produrre comunque la risposta sbagliata, quindi un test di cablaggio verde non è una licenza per saltare la verifica di cosa dica davvero l'output.

Come usarla

La scheda è un dato. Clona il repository e importala per percorso — ciò che arriva dalla rete è trattato come contaminato e trattenuto in attesa di approvazione, che è il comportamento desiderabile e il motivo per cui qui non c'è un installatore in una riga.

git clone https://github.com/brcampidelli/chimera-agent.git
chimera skills-import chimera-agent/skills/chimera-test-the-wiring-not-the-class/SKILL.md

Integrità

SHA-256 del file così com'è pubblicato. Chi lo importa può verificare che ciò che ha ricevuto sia ciò che questa pagina mostrava.

564f2b0aaff3bbb51ca9bfa013d89e3d47d92166f498803c688c3b859b378475

Leggi la scheda nel repository