name: next-actions-2026-05-22 description: Piano preciso e sequenziato per la sessione codice del 22 Mag · S2 write-tool + autonomia (il sistema FA) · grounded sullo stato reale post-S1 last_update: 2026-05-21 notte (post S1 completo · PR #84/#85/#86/#87 in master) owner: gregorio ref: ops/foundation-agentica-architecture.md (§3 tool model + §6 sequenza) · execution/decisions-log.md v36
🎯 Prossime azioni · 22 Mag 2026 (e oltre)
Stato di partenza (verificato in master + prod, 21 Mag notte): S0 ✅ env Inngest · S1 ✅ COMPLETO (
runAgent+ 2 loop refactored +agent_runs/workspace_token_usagein prod). La metà "da fare" della Home esiste (feedworkspace_insights, PR #85). Manca la metà "cosa ho fatto" → richiede write-tool autonomi (S2).Giorni ai gate: 22 Mag → 19 a 10 Giu (5 paganti) · 24 a 15 Giu (MVP+).
La direzione (perché S2 adesso)
La demo che vende ai 5 paganti è la Home "il sistema ha lavorato per te". Oggi i pianeti propongono (insights). Per dire "ha lavorato" serve almeno una vera azione autonoma che il sistema esegue e mostra. Quindi:
S2 (domani) = framework write-tool + autonomia + prima azione auto loggata → sblocca S3 (Home "cosa ho fatto / da fare") che è la scena demo. Senza S2, S3 ha solo metà contenuto.
S2 è anche a basso rischio: il runtime runAgent distingue già kind: 'read' | 'write', e agent_runs.actions_executed esiste già (migration S1). Si tratta di aggiungere il gating e di loggare la prima azione.
Piano sequenziato · 22 Mag (1 giornata)
Pre-flight (10 min)
git fetch && git checkout -b feat/s2-autonomy origin/master(master =76692d3post-S1b).- ⚠️ Working tree condivisa con la sessione parallela →
git branch --show-currentSUBITO prima di ogni commit (memoryfeedback_shared_worktree_branch_check). - Confermare env Inngest ancora attive (S0).
Step 1 · Migration workspace_planet_autonomy (~30 min)
Tabella settaggi autonomia per workspace×pianeta (arch doc §3):
CREATE TABLE public.workspace_planet_autonomy (
workspace_id uuid NOT NULL REFERENCES public.workspaces(id) ON DELETE CASCADE,
planet text NOT NULL CHECK (planet IN ('web','booking','content','crm','sales','marketing','cross')),
autonomy text NOT NULL DEFAULT 'propose' CHECK (autonomy IN ('off','propose','auto')),
updated_at timestamptz NOT NULL DEFAULT now(),
PRIMARY KEY (workspace_id, planet)
);
ALTER TABLE public.workspace_planet_autonomy ENABLE ROW LEVEL SECURITY;
-- READ: membri del workspace · WRITE: solo OWNER (autonomia = impostazione del titolare)
- RLS: select per membro (
team_members), modify per owner (workspaces.owner_user_id = auth.uid()). - Applicare via MCP + salvare
.sqlindatabase/migrations/2026-05-22a_*.sql. Verificareget_advisorssecurity. - Helper
api/_lib/planet-autonomy.ts→getPlanetAutonomy(workspace_id, planet): 'off'|'propose'|'auto'(default'propose'se riga assente · service-role read).
Step 2 · Gating write-tool (~2h) — api/_lib/agent-autonomy.ts
Lo stesso agent, gli stessi tool; l'autonomia decide propose-vs-execute (arch doc §3):
makeWriteTool({ schema, autonomy, execute, propose })→ ritorna unAgentTool(kind:'write'):autonomy === 'auto'→execute()+ ritorna esito · il caller registra inactions_executed.autonomy === 'propose'(default) →propose()(registra azione proposta →workspace_insights"da fare") · NON muta.autonomy === 'off'→ il tool non viene passato arunAgent(filtrare a monte) = kill-switch.
- 3-approval-promote: per ora solo logga il tipo di azione proposta (così il conteggio è disponibile poi); la UI di promozione è S3+. NON auto-promuovere.
- Mantenere
runAgent"dumb": il gating vive nel caller/helper, non nel runtime.
Step 3 · booking-reminder-smart = prima azione auto loggata (~1h)
- Dopo l'invio reminder riuscito: registrare in
agent_runs(planetbooking, triggerevent:booking/created) conactions_executed: [{ type:'reminder_sent', booking_id, channels }]→ prima riga reale del feed "cosa ho fatto". - Rispettare il kill-switch: se
getPlanetAutonomy(ws,'booking') === 'off'→ skip invio. - Decisione di design (no regressione): il reminder resta auto-inviante com'è oggi (comportamento atteso già shippato); l'autonomia
offlo disattiva. Le NUOVE write-tool (winback, fill-waitlist) nascono inveceproposedi default. Niente cambi di comportamento sul reminder esistente.
Step 4 · Validazione + merge (~1h)
- esbuild bundle dei due entrypoint (
api/inngest.ts+ ogni endpoint toccato) —api/non è type-checkato in CI. - Push → PR → CI verde (Typecheck+build, Frontend gate, Vercel multiverbe-app · ignorare
multiverbe-sitesenv-fail pre-esistente) → squash-merge.
✅ Definition of Done (22 Mag)
workspace_planet_autonomyin prod (RLS owner-write).- Framework gating write-tool in codice (
auto/propose/off). booking-reminder-smartloggaactions_executed→ dati reali "cosa ho fatto" inagent_runs.- → S3 sbloccato: la Home può comporre done (da
agent_runs.actions_executed) + todo (daworkspace_insights).
Giorni successivi (preview · non domani)
- 23 Mag · S3
GET /api/home/daily-brief(done/todo/pulse/planets) + Home UI minimal mobile +workspace_home_prefs→ la scena demo. Estende/assorbe il feed v0. - 24-25 Mag · S4 Sales Boss-View UI (⚠️ verificare branch
feat/foundation-agentica) — parallelizzabile, file diversi. - W1 Giu · S5 + Content token quota gate + Free tier + Starter Light · Content foto-vs-video.
🔴 Track FOUNDER · in parallelo, da avviare SUBITO (lead-time → blocca il gate, non il codice)
- Verifiche esterne ASAP — Meta Business (WhatsApp Cloud API · 3gg → fallback BSP 360dialog) · Google GBP (clock 60gg!) + OAuth consent. Hanno tempi esterni: ogni giorno di ritardo è un giorno più vicino al gate senza la feature.
- Pricing MVP+ da rivedere —
canon/03-pricing.md: add-on Finanza · cap WhatsApp per-conversazione (pass-through) · Documenti & Firma. - Loris (cofondatore · v34) — content/spec Finanza+HR + cold outreach verso i 5 paganti.
Owner: Gregorio (decisioni) · esecuzione Claude Code (repo D:\Desktop\Multiverbe). Riferimento architetturale: ops/foundation-agentica-architecture.md.