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_usage in prod). La metà "da fare" della Home esiste (feed workspace_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 = 76692d3 post-S1b).
  • ⚠️ Working tree condivisa con la sessione parallelagit branch --show-current SUBITO prima di ogni commit (memory feedback_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 .sql in database/migrations/2026-05-22a_*.sql. Verificare get_advisors security.
  • Helper api/_lib/planet-autonomy.tsgetPlanetAutonomy(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 un AgentTool (kind:'write'):
    • autonomy === 'auto'execute() + ritorna esito · il caller registra in actions_executed.
    • autonomy === 'propose' (default) → propose() (registra azione proposta → workspace_insights "da fare") · NON muta.
    • autonomy === 'off' → il tool non viene passato a runAgent (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 (planet booking, trigger event:booking/created) con actions_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 off lo disattiva. Le NUOVE write-tool (winback, fill-waitlist) nascono invece propose di 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-sites env-fail pre-esistente) → squash-merge.

✅ Definition of Done (22 Mag)

  1. workspace_planet_autonomy in prod (RLS owner-write).
  2. Framework gating write-tool in codice (auto/propose/off).
  3. booking-reminder-smart logga actions_executeddati reali "cosa ho fatto" in agent_runs.
  4. → S3 sbloccato: la Home può comporre done (da agent_runs.actions_executed) + todo (da workspace_insights).

Giorni successivi (preview · non domani)

  • 23 Mag · S3 GET /api/home/daily-brief (done/todo/pulse/planets) + Home UI minimal mobile + workspace_home_prefsla 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)

  1. 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.
  2. Pricing MVP+ da rivedere — canon/03-pricing.md: add-on Finanza · cap WhatsApp per-conversazione (pass-through) · Documenti & Firma.
  3. 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.