catpit-dev
Sviluppare CATPIT senza romperlo: mappa dell'app, contratto dello store, test, procedura di rilascio. Per Archimede.
❔ da accertare
⚪ mai vettata — nessuno l'ha ancora guardata; non vuol dire che sia a posto
C:\Users\Ettore\.openclaw\skill-workshop\proposals\catpit-dev-20260802-1d12e7fec7\PROPOSAL.mdC:\Users\Ettore\.openclaw\skill-workshop\proposals\catpit-dev-20260802-1d12e7fec7name: "catpit-dev" description: "Sviluppare CATPIT senza romperlo: mappa dell'app, contratto dello store, test, procedura di rilascio. Per Archimede." status: proposal version: "v1" date: "2026-08-02T15:00:38.422Z"
catpit-dev — lavorare sull'app che tiene i dati di tutti
CATPIT non è un'app qualsiasi: dal 2026-07-01 è il master dei dati strutturati su progetti
e task. Se rompi lo store, rompi la fonte-verità del sistema, non una pagina.
Usa questa skill prima di toccare catpit/, e per ogni rilascio.
1. Dov'è cosa
catpit/ app Next.js (App Router)
app/ pagine: tasks, projects, richieste, crew, office, sessions, docs...
app/api/ route server-only: tasks, projects, subtasks, richieste,
sessions, skills, artefatti, crew, cron, usage, github
lib/ la logica vera (store, richieste, subtasks, csv, locks,
vault-schema, security, launch, wake...)
tests/ 24 file vitest
CATPIT_vault/ lo STORE: i dati veri, fuori dall'appPorta 3010 = CATPIT (next dev / next start). La 3000 è Metabase (Docker): non usarla
mai per verificare una rotta — risponderebbe qualcos'altro e crederesti di aver verificato.
2. Il contratto dello store (la parte da non violare)
I file del vault e le loro colonne, come le scrive lib/store.ts:
| File | Colonne / forma |
|---|---|
progetti.csv | id, sigla, cat_code, nome, tipo, stato, priorita, obiettivo, fonte, archiviato + pass-through codice, categoria, sottogruppo |
attivita.csv | id, progetto_id, sigla, titolo, stato, priorita, prossima_azione, note, archiviato |
task_details.json | per task: workspace, contesto, prompt_avvio, programmazione, sottotask[] |
richieste.json | domande agli umani e bisogni di Ettore (vedi lib/richieste.ts) |
Regole strutturali, tutte già implementate — non aggirarle, non reimplementarle a lato:
- Backup `.bak` a ogni scrittura.
writeTablecopia il file su<file>.bakprima di riscriverlo. Chi scrive fuori dalib/store.tssalta il backup. - Soft-delete, mai `DELETE` vero. La colonna
archiviatovale"1"o"". Archiviare un progetto archivia a cascata i suoi task. - Un solo mutex sulle mutazioni CSV (
withLock("store:vault-csv", …)): progetti e attività condividono la chiave perché una singola operazione può scrivere entrambi i file. - Gli id li genera lo store (
nextId:p##,a##). Non inventarli a mano. - EOL preservato: si rilegge il file per capire se usa CRLF o LF. Non normalizzare.
- Schema validato al parse (
lib/vault-schema.ts): file assente = vault vuoto legittimo; file presente con colonne mancanti =VaultSchemaErrorsubito, invece di garbage a valle.
Le API di scrittura
POST /api/tasks con {action, id?, data} — action: `create | update | detail | archive |
restore. Solo POST: un GET` risponde 405, per leggere si leggono i file.
Stesso schema per /api/projects e /api/subtasks.
Lo stato "Bloccato su Ettore" è gestito dall'API delle richieste, non dall'UI e non a mano:
lo mette sui task citati da una richiesta aperta e lo toglie alla risposta. Non scavalcarlo.
3. Verificare prima di committare
La test suite esiste ed è la rete di sicurezza principale:
cd "C:\Users\Ettore\Claude\Agente Residente openclaw\catpit"
npm test # vitest run — 24 file, 343 test (stato al 2026-08-02, tutti verdi in ~6s)Regole:
- Gira la suite prima e dopo ogni modifica: "prima" ti dice se eri già rotto, "dopo" se hai rotto tu. Una modifica che lascia la suite rossa non si committa.
- Se tocchi
lib/, il test corrispondente esiste quasi sempre (store.test.ts,richieste.test.ts— 33 KB,subtasks.test.ts,security.test.ts,vault-schema.test.ts). Aggiornalo insieme al codice, non "dopo". - I test che toccano il vault devono lavorare su file temporanei. Non far girare test contro
CATPIT_vault/vero. - I percorsi positivi delle rotte con dipendenza esterna (webhook, copie su disco) restano verificati a mano: è un rischio dichiarato in
CATPIT_HARDENING.md, non una svista.
4. Rilascio — la procedura che è già costata un incidente
cd "C:\Users\Ettore\Claude\Agente Residente openclaw\catpit"
npm test # 1. verde, altrimenti fermati qui
npm run build # 2. next build
# 3. RIAVVIA il processo sulla 3010 <-- il passo che si dimentica
# 4. smoke test delle rotte principali
# 5. commit su masterIl passo 3 non è opzionale. Dopo un next build, il processo next start già in esecuzione
serve asset vecchi: la pagina arriva come HTML senza stile e gli asset danno 500. Sembra un
bug di CSS, è un processo da riavviare. Rilancia detached via `cmd`, non conStart-Process npm (che si porta dietro la shell e muore con la sessione).
Smoke test minimo dopo il riavvio — non fidarti di una sola pagina:
foreach ($p in @("/", "/tasks", "/richieste", "/projects")) {
(Invoke-WebRequest "http://127.0.0.1:3010$p" -UseBasicParsing).StatusCode
}Il trunk del repo è `master`, non `main`. Un push su main non arriva dove pensi.
5. Checklist "cosa non rompere"
POST /api/richieste— ci scrivono tutti e tre gli agenti dai loop; cambiare i campi significa rompere richieste già in coda. Il contratto di scrittura sta inCATPIT_vault\COME_SI_SCRIVE_UNA_RICHIESTA.mded è retrocompatibile per scelta: i campi nuovi si aggiungono opzionali, non si rinominano quelli vecchi./hooks/wakee la rotta di lancio task (app/api/tasks/launch) — è il bottone "Avvia" che sveglia un agente. Va provato davvero, non solo compilato.- Lo stato "Bloccato su Ettore" gestito dall'API (§2).
- Il backup
.bak: se una tua modifica scrive nel vault senza passare dalib/store.ts, hai tolto la rete a tutti.
6. Coordinamento
CATPIT è condiviso: quando ci lavori, **la cartella catpit/ è tua e gli altri agenti stanno
fuori** finché non chiudi i task in carico. Simmetricamente: se un altro agente ha task aperti
su catpit/, non entrarci — i conflitti di merge su un'app Next.js costano più del lavoro.
Dichiaralo nella prossima_azione del task, che è dove gli altri guardano.
Conteggio esatto dall'endpoint Anthropic count_tokens (gratuito, solo rate-limited), envelope del messaggio già sottratto. I caratteri sono un dato locale, servono da riscontro.
Questa skill è in sola lettura: le proposte si applicano o si rifiutano dal workshop. Per lavorarci sopra si copia la cartella nello workspace di un agente e si modifica lì.
- proposal.json2.0 kB
- PROPOSAL.md6.3 kB
nessuna modifica fatta da qui: nessun backup
questo workspace non è un repo git
Scrittura consentita solo dentro le cartelle skills\ dei workspace del registro e solo sul file SKILL.md (deroga alla stanza Identità autorizzata da Ettore il 2026-08-10). Ogni salvataggio crea prima un backup datato; nessun file viene mai cancellato.