{"type":"queue-operation","operation":"enqueue","timestamp":"2026-08-06T10:08:02.190Z","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01"}
{"type":"queue-operation","operation":"dequeue","timestamp":"2026-08-06T10:08:02.193Z","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01"}
{"parentUuid":null,"isSidechain":false,"promptId":"a4346a79-e7f3-463a-b508-aa3cea540199","type":"user","message":{"role":"user","content":[{"type":"text","text":"The user opened the file /home/mauro/.claude/projects/-mnt-ssd-data-Dropbox-adrian/memory/MEMORY.md in the IDE. This may or may not be related to the current task."},{"type":"text","text":"Ho incominciato nuova sessione della mattina visto che abbiamo lavorato in sessione precedente alla modalità \"voice\" via webappp"}]},"uuid":"be75291b-0caa-4467-b95a-49d995581af5","timestamp":"2026-08-06T10:08:02.237Z","permissionMode":"acceptEdits","origin":{"kind":"human"},"promptSource":"sdk","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"be75291b-0caa-4467-b95a-49d995581af5","isSidechain":false,"attachment":{"type":"deferred_tools_delta","addedNames":["CronCreate","CronDelete","CronList","DesignSync","EnterPlanMode","EnterWorktree","ExitPlanMode","ExitWorktree","Monitor","NotebookEdit","PushNotification","RemoteTrigger","SendMessage","TaskOutput","TaskStop","TodoWrite","WebFetch","WebSearch","mcp__claude_ai_Gmail__apply_sensitive_message_label","mcp__claude_ai_Gmail__apply_sensitive_thread_label","mcp__claude_ai_Gmail__create_draft","mcp__claude_ai_Gmail__create_label","mcp__claude_ai_Gmail__delete_label","mcp__claude_ai_Gmail__get_message","mcp__claude_ai_Gmail__get_thread","mcp__claude_ai_Gmail__label_message","mcp__claude_ai_Gmail__label_thread","mcp__claude_ai_Gmail__list_drafts","mcp__claude_ai_Gmail__list_labels","mcp__claude_ai_Gmail__search_threads","mcp__claude_ai_Gmail__unlabel_message","mcp__claude_ai_Gmail__unlabel_thread","mcp__claude_ai_Gmail__update_draft","mcp__claude_ai_Gmail__update_label","mcp__claude_ai_Google_Drive__copy_file","mcp__claude_ai_Google_Drive__create_file","mcp__claude_ai_Google_Drive__download_file_content","mcp__claude_ai_Google_Drive__get_file_metadata","mcp__claude_ai_Google_Drive__get_file_permissions","mcp__claude_ai_Google_Drive__list_recent_files","mcp__claude_ai_Google_Drive__read_file_content","mcp__claude_ai_Google_Drive__search_files"],"addedLines":["CronCreate","CronDelete","CronList","DesignSync","EnterPlanMode","EnterWorktree","ExitPlanMode","ExitWorktree","Monitor","NotebookEdit","PushNotification","RemoteTrigger","SendMessage","TaskOutput","TaskStop","TodoWrite","WebFetch","WebSearch","mcp__claude_ai_Gmail__apply_sensitive_message_label","mcp__claude_ai_Gmail__apply_sensitive_thread_label","mcp__claude_ai_Gmail__create_draft","mcp__claude_ai_Gmail__create_label","mcp__claude_ai_Gmail__delete_label","mcp__claude_ai_Gmail__get_message","mcp__claude_ai_Gmail__get_thread","mcp__claude_ai_Gmail__label_message","mcp__claude_ai_Gmail__label_thread","mcp__claude_ai_Gmail__list_drafts","mcp__claude_ai_Gmail__list_labels","mcp__claude_ai_Gmail__search_threads","mcp__claude_ai_Gmail__unlabel_message","mcp__claude_ai_Gmail__unlabel_thread","mcp__claude_ai_Gmail__update_draft","mcp__claude_ai_Gmail__update_label","mcp__claude_ai_Google_Drive__copy_file","mcp__claude_ai_Google_Drive__create_file","mcp__claude_ai_Google_Drive__download_file_content","mcp__claude_ai_Google_Drive__get_file_metadata","mcp__claude_ai_Google_Drive__get_file_permissions","mcp__claude_ai_Google_Drive__list_recent_files","mcp__claude_ai_Google_Drive__read_file_content","mcp__claude_ai_Google_Drive__search_files"],"removedNames":[],"readdedNames":[],"pendingMcpServers":[],"needsAuthMcpServers":["claude.ai Box","claude.ai Canva","claude.ai Google Calendar","claude.ai Microsoft 365","claude.ai Notion","claude.ai Supabase"]},"type":"attachment","uuid":"f479753f-442d-4c65-9df5-3fb0304d4e1c","timestamp":"2026-08-06T10:08:02.236Z","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"f479753f-442d-4c65-9df5-3fb0304d4e1c","isSidechain":false,"attachment":{"type":"agent_listing_delta","addedTypes":["claude","claude-code-guide","data-expert","Explore","flussi-expert","general-purpose","Plan","statusline-setup"],"addedLines":["- claude: Catch-all for any task that doesn't fit a more specific agent. FleetView's default when no agent name is typed. (Tools: *)","- claude-code-guide: Use this agent when the user asks questions (\"Can Claude...\", \"Does Claude...\", \"How do I...\") about: (1) Claude Code (the CLI tool) - features, hooks, slash commands, MCP servers, settings, IDE integrations, keyboard shortcuts; (2) Claude Agent SDK - building custom agents; (3) Claude API (formerly Anthropic API) - Messages API for directly passing messages to Claude, Tool Runner (`client.beta.messages.tool_runner`) for running an agentic loop over your own tools, manual tool-use loops, Managed Agents for server-hosted agents with a managed sandbox, prompt caching, and general Anthropic SDK usage; (4) Claude Tag (Claude in Slack) - what it is, setting it up for a Slack workspace, `/install-slack-app`. **IMPORTANT:** Before spawning a new agent, check if there is already a running or recently completed claude-code-guide agent that you can continue via SendMessage. (Tools: Bash, Read, WebFetch, WebSearch)","- data-expert: Esperto di estrazione dati e business logic del dominio ICR — diritti, anagrafica prodotti, edizioni, linker, mediatrack (letti oggi via MyICR_Suite, ma il dominio è agnostico rispetto a quale applicativo li consulta). Usare SOLO per interrogare i mirror SQLite in sola lettura e ragionare sulla logica di business sottostante — mai per modificare codice o dati. Va invocato esplicitamente da Mauro/Adrian, non spontaneamente. (Tools: Read, Grep, Glob, Bash, Edit, Write)","- Explore: Fast read-only search agent for locating code. Use it to find files by pattern (eg. \"src/components/**/*.tsx\"), grep for symbols or keywords (eg. \"API endpoints\"), or answer \"where is X defined / which files reference Y.\" Do NOT use it for code review, design-doc auditing, cross-file consistency checks, or open-ended analysis — it reads excerpts rather than whole files and will miss content past its read window. When calling, specify search breadth: \"quick\" for a single targeted lookup, \"medium\" for moderate exploration, or \"very thorough\" to search across multiple locations and naming conventions. (Tools: All tools except Agent, Artifact, ExitPlanMode, Edit, Write, NotebookEdit)","- flussi-expert: Esperto di logistica dei flussi dati del dominio ICR — da dove arrivano i dati (OnAir), quali pipeline li trasformano, dove nascono anomalie/forzature nei dataset (letti oggi via MyICR_Suite/PowerBricks, ma il dominio è agnostico rispetto a quale applicativo li consulta). Complementare a data-expert (che prende i dati as-is): questo agente indaga la provenienza e il percorso, non la semantica di business. Usare per diagnosticare anomalie riscontrate nei dati, mai per intervenire in scrittura sul codice pipeline (deciso separatamente caso per caso). Va invocato esplicitamente da Mauro/Adrian, non spontaneamente. (Tools: Read, Grep, Glob, Bash, Edit, Write)","- general-purpose: General-purpose agent for researching complex questions, searching for code, and executing multi-step tasks. When you are searching for a keyword or file and are not confident that you will find the right match in the first few tries use this agent to perform the search for you. (Tools: *)","- Plan: Software architect agent for designing implementation plans. Use this when you need to plan the implementation strategy for a task. Returns step-by-step plans, identifies critical files, and considers architectural trade-offs. (Tools: All tools except Agent, Artifact, ExitPlanMode, Edit, Write, NotebookEdit)","- statusline-setup: Use this agent to configure the user's Claude Code status line setting. (Tools: Read, Edit)"],"removedTypes":[],"isInitial":true,"showConcurrencyNote":false},"type":"attachment","uuid":"ce16b482-8a0f-4c48-a010-b6e01a3190ea","timestamp":"2026-08-06T10:08:02.236Z","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"ce16b482-8a0f-4c48-a010-b6e01a3190ea","isSidechain":false,"attachment":{"type":"skill_listing","content":"- chiusura-sessione: Checklist di fine sessione per aggiornare memoria e archivio in modo coerente prima di chiudere — cosa va in memory/MEMORY.md, cosa in archivio/ come storico, cosa in CLAUDE.md, cosa va committato. Usare quando Mauro segnala che sta per chiudere/staccare, o quando si nota che sono passate molte ore/molti argomenti dall'ultimo aggiornamento di memoria.\n- manutenzione-archivio: Scansione meccanica di archivio/ per trovare link rotti, file orfani e hub incompleti — riporta i risultati a Mauro, non corregge nulla in autonomia. Usare su richiesta esplicita di Mauro (\"controlla l'archivio\", \"scansione generale\"), o quando ci si accorge di disordine strutturale mentre si lavora su un'altra cosa.\n- processa-inbox: Processa i documenti caricati da Mauro in inbox-documenti/ (scansioni, PDF firmati, email .eml, ecc.) e li archivia correttamente in archivio/_documenti/ con nota sidecar. Usare quando Mauro segnala che ha caricato qualcosa in inbox, quando si nota che inbox-documenti/ non è vuota, o quando un messaggio inizia con `@inbox`.\n- processa-promemoria: Intercetta i promemoria che Mauro scrive su Apple Reminders (arrivano su Microsoft To Do tramite l'account agganciato) e li smista al volo in conversazione — thread in memory/MEMORY.md, nota in archivio/, o scarto se già gestiti. Consulta anche il calendario (stesso account) per contesto su scadenze/impegni. Modello: check-in periodico, non per-item — usare quando Mauro segnala di aver aggiunto promemoria, chiede di controllare Reminders/calendario, a inizio sessione se è passato tempo dall'ultimo giro, o quando un messaggio inizia con `@gate` (bypassa Reminders, il testo va processato con lo stesso triage).\n- loop: Sei Adrian. Mettiti in ascolto sul cockpit Adrian↔Elon↔Mauro.\n- dataviz: Use this skill whenever you are about to create ANY chart, graph, plot, dashboard, or data visualization, in ANY output medium — an HTML or React artifact, inline SVG, plotting code in any library (matplotlib, plotly, d3, Recharts, …), an image/PNG you will render and upload, or a chart shared into Slack. Read it BEFORE writing the first line of chart code, choosing chart colors, building a stat tile / meter / KPI row, or laying out a dashboard. Produces visualizations that read as one system — elegant, accessible, consistent in light and dark — using a brand-neutral placeholder palette you swap for your own. Teaches a design-system-agnostic method: a form heuristic, a color formula with a runnable validator, mark specs, and interaction rules. A validated default palette is documented in `references/palette.md` — swap that file's values for your brand's. Triggers on: \"chart\", \"graph\", \"plot\", \"data viz\", \"visualization\", \"dashboard\", \"analytics\", \"visualize data\", \"categorical colors\", \"sequential / diverging palette\", \"stat tile\", \"sparkline\", \"heatmap\", \"legend\", \"axis\", \"tooltip\", \"chart colors\", \"color by series\".\n- artifact-design: Design guidance and fundamentals for Artifacts.\n- artifact-diagramming: Diagramming know-how for Artifacts — when a picture earns its place, how to draw one that shows the real mechanism, and the inline-SVG mechanics that keep it legible in both themes.\n- artifact-capabilities: Runtime capabilities a published Artifact page can be granted — behavior static HTML cannot provide on its own, such as the page reading live or connected data, keeping state shared across viewers, or updating and republishing itself. Serves this user's live capability roster and the typed call definitions. Load it whenever the user asks for an artifact needing any such runtime behavior.\n- update-config: Use this skill to configure the Claude Code harness via settings.json. Automated behaviors (\"from now on when X\", \"each time X\", \"whenever X\", \"before/after X\") require hooks configured in settings.json - the harness executes these, not Claude, so memory/preferences cannot fulfill them. Also use for: permissions (\"allow X\", \"add permission\", \"move permission to\"), env vars (\"set X=Y\"), hook troubleshooting, or any changes to settings.json/settings.local.json files. Examples: \"allow npm commands\", \"add bq permission to global settings\", \"move permission to user settings\", \"set DEBUG=true\", \"when claude stops show X\". For simple settings like theme/model, suggest the /config command.\n- keybindings-help: Use when the user wants to customize keyboard shortcuts, rebind keys, add chord bindings, or modify ~/.claude/keybindings.json. Examples: \"rebind ctrl+s\", \"add a chord shortcut\", \"change the submit key\", \"customize keybindings\".\n- simplify: Review the changed code for reuse, simplification, efficiency, and altitude cleanups, then apply the fixes. Quality only — it does not hunt for bugs; use /code-review for that.\n- fewer-permission-prompts: Scan your transcripts for common read-only Bash and MCP tool calls, then add a prioritized allowlist to project .claude/settings.json to reduce permission prompts.\n- schedule: Create, update, list, or run scheduled cloud agents (routines) that execute on a cron schedule. - When the user wants to schedule a recurring cloud agent, set up automated tasks, create a cron job for Claude Code, or manage their scheduled agents/routines. Also use when the user wants a one-time scheduled run (\"run this once at 3pm\", \"remind me to check X tomorrow\").\n- claude-api: Reference for the Claude API / Anthropic SDK — model ids, pricing, params, streaming, tool use, MCP, agents, caching, token counting, model migration.\nTRIGGER — read BEFORE opening the target file; don't skip because it \"looks like a one-liner\" — whenever: the prompt names Claude/Anthropic in any form (Claude, Anthropic, Fable, Opus, Sonnet, Haiku, `anthropic`, `@anthropic-ai`, `claude-*`, `us.anthropic.*`, `[1m]`); the user asks about an LLM (pricing/model choice/limits/caching) — never answer from memory; OR the task is LLM-shaped with provider unstated (agent/MCP/tool-definition/multi-agent/RAG/LLM-judge/computer-use; generate/summarize/extract/classify/rewrite/converse over NL; debugging refusals/cutoffs/streaming/tool-calls/tokens).\nSKIP only when another provider is being worked on (overrides all triggers): OpenAI/GPT/Gemini/Llama/Mistral/Cohere/Ollama named in the query; OR `grep -rE 'openai|langchain_openai|google.generativeai|genai|mistralai|cohere|ollama'` over the project hits (run this grep FIRST if no provider named — don't Read the file).\n- run: Launch and drive this project's app to see a change working. Use when asked to run, start, or screenshot the app, or to confirm a change works in the real app (not just tests). First looks for a project skill that already covers launching the app; otherwise falls back to built-in patterns per project type (CLI, server, TUI, Electron, browser-driven, library).\n- init: Initialize a new CLAUDE.md file with codebase documentation\n- review: Review a GitHub pull request; for your working diff use /code-review\n- security-review: Complete a security review of the pending changes on the current branch","skillCount":19,"isInitial":true,"names":["chiusura-sessione","manutenzione-archivio","processa-inbox","processa-promemoria","loop","dataviz","artifact-design","artifact-diagramming","artifact-capabilities","update-config","keybindings-help","simplify","fewer-permission-prompts","schedule","claude-api","run","init","review","security-review"]},"type":"attachment","uuid":"9cf4625c-5f17-4a3d-aee0-34ffba689f42","timestamp":"2026-08-06T10:08:02.236Z","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"type":"file-history-snapshot","messageId":"be75291b-0caa-4467-b95a-49d995581af5","snapshot":{"messageId":"be75291b-0caa-4467-b95a-49d995581af5","trackedFileBackups":{},"timestamp":"2026-08-06T10:08:02.243Z"},"isSnapshotUpdate":false}
{"type":"ai-title","aiTitle":"Continue voice mode session work","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01"}
{"type":"ai-title","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","aiTitle":"Continuare sessione modalità voice webapp"}
{"parentUuid":"9cf4625c-5f17-4a3d-aee0-34ffba689f42","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmJx9v8xByNSiLD5VbZr","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"EvwDCokBCBAYAipAoNBdbckBbs0Yjt6bqE+C7BGOUdPbM3XNbFt/neE+X1Nkd2eWjzPIid5bH6AdKNB9gFx7AeKE+AMvdeja5+U2BzIPY2xhdWRlLXNvbm5ldC01OABCCHRoaW5raW5nWiQzZDFjY2UyZS0wNjY0LTQwZDYtODQxNC1iN2U1MjhhY2UyYjESDENEXFKIlsbXuFn+pRoM9wGheafLfHhuLa6mIjBa4rg8uO0zK2xwPfrLxjgBGVvuk2CgLe3V52W5VRzqnGLzLcjz5C3QNLJ8cMvE4Y0qnwIMGpaFLb3kATzqL+AuPcoltXdfN4h7kqHDkNbJ2FoM7RZAEWWfMWoIfcM8FO8eMjbwwOdFRPBDz3LfEIF2d10RF+MdXxDdaCxgVCrQvx6LAqqDlLxB6iWAU4CFtGJON6ADIl2aeWabEqcHU7q7AwrERLiD+5uN+CH6A92WW/2YMeyYUpSWnVayiNsaQVF/5a6u91Jz38jQ6QpCsfOomk9w+lNDcMxHSsTGIoO3bQnOhd4PZtbD37+pYTbyx1qOJmiIdcjW/TObbzSNN895WvAROcTyC3yeM2O9zXV1VN2S5XuJxbBR2JBgy3Mi0grGJTw4ueV2/vzkroORoW4E8FegsbnFLipJ/2dulslQ7brTLDR9en1+ytY3rR+z7LaT1xgB"}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":25021,"cache_read_input_tokens":21306,"output_tokens":190,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":25021,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":190,"cache_read_input_tokens":21306,"cache_creation_input_tokens":25021,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":25021},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmJx8CT2pa6EL4mydWvZ","type":"assistant","uuid":"74a8cd1f-e12c-4ca9-96cb-c80284edc99c","timestamp":"2026-08-06T10:08:05.169Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"74a8cd1f-e12c-4ca9-96cb-c80284edc99c","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmJx9v8xByNSiLD5VbZr","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01MDTf3YpZDQTCrFdLvMZTvR","name":"Bash","input":{"command":"hostname; uname -a","description":"Check hostname and OS to identify instance"},"caller":{"type":"direct"}}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":25021,"cache_read_input_tokens":21306,"output_tokens":190,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":25021,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":190,"cache_read_input_tokens":21306,"cache_creation_input_tokens":25021,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":25021},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmJx8CT2pa6EL4mydWvZ","type":"assistant","uuid":"e74bdce6-02f3-4a61-bda6-f14edd43ec67","timestamp":"2026-08-06T10:08:05.833Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"e74bdce6-02f3-4a61-bda6-f14edd43ec67","isSidechain":false,"promptId":"a4346a79-e7f3-463a-b508-aa3cea540199","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01MDTf3YpZDQTCrFdLvMZTvR","type":"tool_result","content":"NucBoxG3\nLinux NucBoxG3 6.8.0-134-generic #134-Ubuntu SMP PREEMPT_DYNAMIC Fri Jun 26 18:43:11 UTC 2026 x86_64 x86_64 x86_64 GNU/Linux","is_error":false}]},"uuid":"eda478e3-fff7-4fa0-ad6b-6a8d461c8af1","timestamp":"2026-08-06T10:08:06.003Z","toolUseResult":{"stdout":"NucBoxG3\nLinux NucBoxG3 6.8.0-134-generic #134-Ubuntu SMP PREEMPT_DYNAMIC Fri Jun 26 18:43:11 UTC 2026 x86_64 x86_64 x86_64 GNU/Linux","stderr":"","interrupted":false,"isImage":false,"noOutputExpected":false},"sourceToolAssistantUUID":"e74bdce6-02f3-4a61-bda6-f14edd43ec67","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"eda478e3-fff7-4fa0-ad6b-6a8d461c8af1","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmJxRWkZfUGzybAGHTPP","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"Ep0ECokBCBAYAipA4pIYjtPEzuHqNccv2WCTt1Kw1ejwmsCLR7+gt+xvKr7vYRqu3xtaeff4LBZICqNqMWrFFEI81WG8uwn6cFAxojIPY2xhdWRlLXNvbm5ldC01OABCCHRoaW5raW5nWiQzZDFjY2UyZS0wNjY0LTQwZDYtODQxNC1iN2U1MjhhY2UyYjESDIpJgfLtNeBD8uS88BoMuNXxOxrNkNmnqEnhIjD+60txwEqciclRYd3Jh+FfOQFqnbOvXpFC5Hhv4MdmotmEg0YmCqr25QnsYTMBxeQqwAJSfTEq0J0p3B+lJ3XQ+PgI2l4adRGePtL79ONYWBqI1B1PvCdYKDw9PZbWpoOkmjFQ96WPEFChG4e0MYTMTAZQ6rHrVAuGPYbWB5lruvRyNQvccRISLN5+GTqgkZikgel6aOwVgHl/fNpGA5UkWO6XKbS/PLBi+hM37tObMGWuJABxbdeUetyog2KJdtEWwkmJl7cmQG708M7eCNhjW+3zI0J6XSFnkr9Ht9imKi4S2WKCOdZkvbiu+KU42b/S6+LLnz7ib/Eon8S3S38NisZb3cPdSOdfJoBVxmzHc01bbDjbMOCwhSXgdHElfIeCbx0av+BNfmPKmXiihuCIQ8Ipl7maLikK4GUNbeLuICetcq1wFOTw3yb9FDkk+uvNPw5lH8Z6IbBR3C5RTxgwsxKHrbDj1BHIwEaDHYPOt+igFBgB"}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":295,"cache_read_input_tokens":46327,"output_tokens":351,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":295,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":351,"cache_read_input_tokens":46327,"cache_creation_input_tokens":295,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":295},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmJxQGaz4hs6G9q4Fc3g","type":"assistant","uuid":"77c72fea-4cd0-465e-83e9-07a0ba80766d","timestamp":"2026-08-06T10:08:09.285Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"77c72fea-4cd0-465e-83e9-07a0ba80766d","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmJxRWkZfUGzybAGHTPP","type":"message","role":"assistant","content":[{"type":"text","text":"Siamo sulla Nave. Avvio la procedura standard: apro l'indice dell'archivio e avvio il Monitor per voice-chat (passo 4, automatico solo su Nave)."}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":295,"cache_read_input_tokens":46327,"output_tokens":351,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":295,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":351,"cache_read_input_tokens":46327,"cache_creation_input_tokens":295,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":295},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmJxQGaz4hs6G9q4Fc3g","type":"assistant","uuid":"083e0fda-aa96-4b02-a3e4-9788a4c9f824","timestamp":"2026-08-06T10:08:09.830Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"083e0fda-aa96-4b02-a3e4-9788a4c9f824","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmJxRWkZfUGzybAGHTPP","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_015wtQnrVTmWnaaSxzWdvGFF","name":"Read","input":{"file_path":"/mnt/ssd/data/Dropbox/adrian/archivio/_i_archivio.md"},"caller":{"type":"direct"}}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":295,"cache_read_input_tokens":46327,"output_tokens":351,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":295,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":351,"cache_read_input_tokens":46327,"cache_creation_input_tokens":295,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":295},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmJxQGaz4hs6G9q4Fc3g","type":"assistant","uuid":"d46c6159-6bab-40ce-bc9a-73e68907f588","timestamp":"2026-08-06T10:08:10.380Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"d46c6159-6bab-40ce-bc9a-73e68907f588","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmJxRWkZfUGzybAGHTPP","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01UBbowtc7B63Wgg2Eb8qdAs","name":"ToolSearch","input":{"query":"select:Monitor","max_results":1},"caller":{"type":"direct"}}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":295,"cache_read_input_tokens":46327,"output_tokens":351,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":295,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":351,"cache_read_input_tokens":46327,"cache_creation_input_tokens":295,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":295},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmJxQGaz4hs6G9q4Fc3g","type":"assistant","uuid":"a1eee78a-3ff3-4f71-98f8-3d84d558f7ed","timestamp":"2026-08-06T10:08:10.785Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"a1eee78a-3ff3-4f71-98f8-3d84d558f7ed","isSidechain":false,"promptId":"a4346a79-e7f3-463a-b508-aa3cea540199","type":"user","message":{"role":"user","content":[{"type":"tool_result","tool_use_id":"toolu_01UBbowtc7B63Wgg2Eb8qdAs","content":[{"type":"tool_reference","tool_name":"Monitor"}]}]},"uuid":"54bf7867-2624-4415-8c40-c14b7b3cfed6","timestamp":"2026-08-06T10:08:10.802Z","toolUseResult":{"matches":["Monitor"],"query":"select:Monitor","total_deferred_tools":42},"sourceToolAssistantUUID":"a1eee78a-3ff3-4f71-98f8-3d84d558f7ed","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"d46c6159-6bab-40ce-bc9a-73e68907f588","isSidechain":false,"promptId":"a4346a79-e7f3-463a-b508-aa3cea540199","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_015wtQnrVTmWnaaSxzWdvGFF","type":"tool_result","content":"1\t---\n2\ttipo: entità\n3\t---\n4\t\n5\t# Archivio\n6\t\n7\tSecond brain di Mauro/Adrian — file `.md`, consultabile via Obsidian o direttamente. Leggere questo file prima di consultare o scrivere qualunque cosa qui dentro. Valido per qualunque AI (Adrian, sottoagenti, AI web via mirror) — non solo per uso interattivo in Obsidian.\n8\t\n9\t**Cosa NON c'è qui**: l'infrastruttura tecnica del sistema (macchine, servizi, cron, systemd, come sono collegate le cose) vive in `CLAUDE.md` (root del repo), non qui. Questo archivio è memoria di fatto (persone, progetti, conoscenza di dominio, log) — non documentazione dell'ecosistema tecnico. `memory/MEMORY.md` la presuppone: se qualcosa lì non torna, il contesto è in `CLAUDE.md`.\n10\t\n11\t**Cosa PUÒ esserci**: anche contenuto storico/archiviato, non solo stato corrente — è memoria di fatto, non un cruscotto sempre-presente. Lo stato operativo corrente (letto sempre, a ogni sessione) vive invece in `memory/MEMORY.md`, non qui — questo archivio resta puramente on-demand, nessuna eccezione.\n12\t\n13\t**Una volta migrata un'informazione qui, questo è la fonte di verità** — non si lasciano copie duplicate nella posizione precedente. Se la sintesi fatta in fase di migrazione rischia di perdere sfumature, il raw recuperabile va conservato in un \"bidone raw\" dedicato (dentro o fuori l'archivio, da valutare caso per caso) — mai lasciare la stessa informazione vera in due posti contemporaneamente.\n14\t\n15\t**Due eccezioni dichiarate, mai consultabili da AI esterne**: [[_i_raw|_raw]] (materiale grezzo non sintetizzato) e [[_i_secrets|_secrets]] (credenziali vere, topologia di rete). Prima di qualunque mirror/export dell'archivio verso l'esterno, verificare esplicitamente che entrambe siano escluse — non darlo per scontato. [[_i_documenti|_documenti]] (originali PDF/scansioni con dati personali reali) **era** una terza eccezione, ma dal 05/08/2026 è inclusa deliberatamente nel mirror Google Drive \"SecondBrain\" verso Claude.ai — decisione esplicita di Mauro, vedi [[_i_documenti|_documenti]] e `archivio/Adrian/progetti/project_secondbrain_gdrive.md`. Non dare per scontato che valga per canali futuri diversi da questo.\n16\t\n17\t## Cartelle\n18\t- [[_i_Adrian|Adrian]] — l'agente stesso, con le sue basi di conoscenza\n19\t- [[_i_Mauro|Mauro]] — la sua memoria finita (famiglia, finanze, casa, lavoro, diario — solo fatti stabili)\n20\t- [[_i_raw|_raw]] — eccezione dichiarata: materiale grezzo non ancora sintetizzato, mai fonte di verità diretta\n21\t- [[_i_secrets|_secrets]] — ⚠️ credenziali vere e topologia di rete — **mai in un mirror/export verso AI esterne, verificare sempre prima di ogni operazione del genere**\n22\t- [[_i_documenti|_documenti]] — originali di documenti reali (PDF/scansioni) con dati personali — incluso nel mirror \"SecondBrain\" (05/08/2026, decisione esplicita di Mauro), a differenza di `_raw`/`_secrets`\n23\t\n24\t## Formato\n25\tTutto file `.md`. Documenti non-`.md` (PDF, scansioni) vivono in [[_i_documenti|_documenti]] nel formato originale, flat (perché è uno store — vedi eccezione in \"Hub per cartella\"). Ogni documento ha una **nota sidecar** altrove nell'archivio (es. dentro `Mauro/palmanova-213a/`), che fa da ponte: embed/link al file originale + metadati (frontmatter) + collegamenti ai concetti citati. La nota sidecar è la fonte navigabile; il file in `_documenti/` resta l'originale intoccabile.\n26\t\n27\t## Hub per cartella\n28\tOgni cartella con più di un file ha un **hub**: un file col prefisso `_i_` + nome della cartella (es. `Adrian/_i_Adrian.md`, `Mauro/diario/_i_diario.md` — non `_index.md` generico: il nome del file è anche l'etichetta del nodo nel grafo Obsidian, \"index\" ripetuto ovunque renderebbe i nodi indistinguibili tra loro; deciso 03/08/2026, prima erano omonimi alla cartella senza prefisso — ambiguo nel file explorer), con una breve descrizione di cosa contiene la cartella e link verso i file principali. Leggere l'hub prima di leggere il resto della cartella.\n29\t\n30\tNon esiste una convenzione unica su chi linka chi (l'hub verso i membri, o i membri verso l'hub) — dipende da come cresce la cartella:\n31\t- **Collezione piccola e fissa** (es. le basi di conoscenza di Adrian): l'hub linka in uscita verso ogni membro.\n32\t- **Collezione che cresce nel tempo** (es. il diario, un file al giorno): i membri linkano verso l'hub, o più semplicemente l'hub tiene un elenco che si aggiorna da solo (vedi `_i_diario.md`, sezione \"Giorni\").\n33\t\n34\t**Eccezione — store, non collezione** (`_documenti/`, deciso 05/08/2026): la convenzione hub vale per collezioni consultabili (si naviga per hub, poi per membro). `_documenti/` è invece un contenitore opaco, accesso solo per puntatore dalle sidecar — il suo `_i_documenti.md` è una nota di policy (avvisi, convenzioni), non elenca i contenuti.\n35\t\n36\t### Quando splittare un file in hub + membri (deciso 31/07/2026)\n37\t\n38\tNon è una questione di lunghezza — un file lungo ma narrativamente unico (una storia coerente, nessuna parte linkata da sola) resta unico. Splittare quando **entrambe** sono vere:\n39\t1. **Altri appunti vogliono linkare un pezzo specifico**, non genericamente \"una sezione di X\" — se un file già scrive \"vedi `[[Y]]`\" dove Y è un nome dentro un file più grande, Y merita un file suo.\n40\t2. **Ogni parte ha un'identità e un ciclo di vita reali**, indipendenti dal resto — un progetto che può diventare \"completed\" o essere smantellato per conto suo, una persona, un episodio datato. Non un paragrafo che serve solo al flusso del discorso.\n41\t\n42\tCome per la struttura in generale: **non splittare in anticipo** per una crescita ipotetica — solo quando l'attrito si sente davvero (un link che non si riesce a fare pulito). Esempio concreto: `Mauro/lavoro.md` (142 righe, 6 sezioni nette, già linkate individualmente da altri punti) → `Mauro/lavoro/` + 6 file; la sua sotto-sezione progetti → un file per applicativo, nome identico alla cartella reale sotto `PYTHON/` (fisico e logico allineati).\n43\t\n44\t## Tag\n45\tClassificazione a grana fine dentro un file (es. `#lavoro`, `#casa`) — diversa dall'appartenenza a una cartella. Un tag risponde a \"che tipo di contenuto è questo pezzo\", l'hub risponde a \"a quale collezione appartiene questo file\".\n46\t\n47\t## Per chi consulta i file direttamente (non via Obsidian)\n48\tUn'AI che legge i file grezzi non ha bisogno del grafo — cerca testo, legge frontmatter. La convenzione hub-per-cartella vale comunque: prima di rispondere su una cartella, controllare se esiste un file `_i_` + nome della cartella (non più il nome della cartella da solo — convenzione abbandonata il 03/08/2026, vedi sopra). Eccezione: `_documenti/` è uno store, non una collezione — il suo `_i_documenti.md` è policy, non punto di navigazione (vedi \"Hub per cartella\" sopra).\n49\t\n50\t**Indice piatto rimosso (04/08/2026)**: c'era stata (30/07) una sezione \"Indice completo\" con una riga per ogni nota dell'archivio, tenuta per dare una scansione economica senza dover navigare per hub. Ripensata: né Mauro né Adrian la consultavano davvero in pratica (navigazione reale sempre per hub o via grep/ricerca testo), e nel grafo Obsidian rendeva questo file il nodo più affollato (44 connessioni dirette), rumore visivo senza beneficio corrispondente. Navigazione ora solo per hub-per-cartella (sopra) o ricerca diretta nei file.\n51\t"}]},"uuid":"ccabc033-7678-4a7a-be36-41fe279eac54","timestamp":"2026-08-06T10:08:11.093Z","toolUseResult":{"type":"text","file":{"filePath":"/mnt/ssd/data/Dropbox/adrian/archivio/_i_archivio.md","content":"---\ntipo: entità\n---\n\n# Archivio\n\nSecond brain di Mauro/Adrian — file `.md`, consultabile via Obsidian o direttamente. Leggere questo file prima di consultare o scrivere qualunque cosa qui dentro. Valido per qualunque AI (Adrian, sottoagenti, AI web via mirror) — non solo per uso interattivo in Obsidian.\n\n**Cosa NON c'è qui**: l'infrastruttura tecnica del sistema (macchine, servizi, cron, systemd, come sono collegate le cose) vive in `CLAUDE.md` (root del repo), non qui. Questo archivio è memoria di fatto (persone, progetti, conoscenza di dominio, log) — non documentazione dell'ecosistema tecnico. `memory/MEMORY.md` la presuppone: se qualcosa lì non torna, il contesto è in `CLAUDE.md`.\n\n**Cosa PUÒ esserci**: anche contenuto storico/archiviato, non solo stato corrente — è memoria di fatto, non un cruscotto sempre-presente. Lo stato operativo corrente (letto sempre, a ogni sessione) vive invece in `memory/MEMORY.md`, non qui — questo archivio resta puramente on-demand, nessuna eccezione.\n\n**Una volta migrata un'informazione qui, questo è la fonte di verità** — non si lasciano copie duplicate nella posizione precedente. Se la sintesi fatta in fase di migrazione rischia di perdere sfumature, il raw recuperabile va conservato in un \"bidone raw\" dedicato (dentro o fuori l'archivio, da valutare caso per caso) — mai lasciare la stessa informazione vera in due posti contemporaneamente.\n\n**Due eccezioni dichiarate, mai consultabili da AI esterne**: [[_i_raw|_raw]] (materiale grezzo non sintetizzato) e [[_i_secrets|_secrets]] (credenziali vere, topologia di rete). Prima di qualunque mirror/export dell'archivio verso l'esterno, verificare esplicitamente che entrambe siano escluse — non darlo per scontato. [[_i_documenti|_documenti]] (originali PDF/scansioni con dati personali reali) **era** una terza eccezione, ma dal 05/08/2026 è inclusa deliberatamente nel mirror Google Drive \"SecondBrain\" verso Claude.ai — decisione esplicita di Mauro, vedi [[_i_documenti|_documenti]] e `archivio/Adrian/progetti/project_secondbrain_gdrive.md`. Non dare per scontato che valga per canali futuri diversi da questo.\n\n## Cartelle\n- [[_i_Adrian|Adrian]] — l'agente stesso, con le sue basi di conoscenza\n- [[_i_Mauro|Mauro]] — la sua memoria finita (famiglia, finanze, casa, lavoro, diario — solo fatti stabili)\n- [[_i_raw|_raw]] — eccezione dichiarata: materiale grezzo non ancora sintetizzato, mai fonte di verità diretta\n- [[_i_secrets|_secrets]] — ⚠️ credenziali vere e topologia di rete — **mai in un mirror/export verso AI esterne, verificare sempre prima di ogni operazione del genere**\n- [[_i_documenti|_documenti]] — originali di documenti reali (PDF/scansioni) con dati personali — incluso nel mirror \"SecondBrain\" (05/08/2026, decisione esplicita di Mauro), a differenza di `_raw`/`_secrets`\n\n## Formato\nTutto file `.md`. Documenti non-`.md` (PDF, scansioni) vivono in [[_i_documenti|_documenti]] nel formato originale, flat (perché è uno store — vedi eccezione in \"Hub per cartella\"). Ogni documento ha una **nota sidecar** altrove nell'archivio (es. dentro `Mauro/palmanova-213a/`), che fa da ponte: embed/link al file originale + metadati (frontmatter) + collegamenti ai concetti citati. La nota sidecar è la fonte navigabile; il file in `_documenti/` resta l'originale intoccabile.\n\n## Hub per cartella\nOgni cartella con più di un file ha un **hub**: un file col prefisso `_i_` + nome della cartella (es. `Adrian/_i_Adrian.md`, `Mauro/diario/_i_diario.md` — non `_index.md` generico: il nome del file è anche l'etichetta del nodo nel grafo Obsidian, \"index\" ripetuto ovunque renderebbe i nodi indistinguibili tra loro; deciso 03/08/2026, prima erano omonimi alla cartella senza prefisso — ambiguo nel file explorer), con una breve descrizione di cosa contiene la cartella e link verso i file principali. Leggere l'hub prima di leggere il resto della cartella.\n\nNon esiste una convenzione unica su chi linka chi (l'hub verso i membri, o i membri verso l'hub) — dipende da come cresce la cartella:\n- **Collezione piccola e fissa** (es. le basi di conoscenza di Adrian): l'hub linka in uscita verso ogni membro.\n- **Collezione che cresce nel tempo** (es. il diario, un file al giorno): i membri linkano verso l'hub, o più semplicemente l'hub tiene un elenco che si aggiorna da solo (vedi `_i_diario.md`, sezione \"Giorni\").\n\n**Eccezione — store, non collezione** (`_documenti/`, deciso 05/08/2026): la convenzione hub vale per collezioni consultabili (si naviga per hub, poi per membro). `_documenti/` è invece un contenitore opaco, accesso solo per puntatore dalle sidecar — il suo `_i_documenti.md` è una nota di policy (avvisi, convenzioni), non elenca i contenuti.\n\n### Quando splittare un file in hub + membri (deciso 31/07/2026)\n\nNon è una questione di lunghezza — un file lungo ma narrativamente unico (una storia coerente, nessuna parte linkata da sola) resta unico. Splittare quando **entrambe** sono vere:\n1. **Altri appunti vogliono linkare un pezzo specifico**, non genericamente \"una sezione di X\" — se un file già scrive \"vedi `[[Y]]`\" dove Y è un nome dentro un file più grande, Y merita un file suo.\n2. **Ogni parte ha un'identità e un ciclo di vita reali**, indipendenti dal resto — un progetto che può diventare \"completed\" o essere smantellato per conto suo, una persona, un episodio datato. Non un paragrafo che serve solo al flusso del discorso.\n\nCome per la struttura in generale: **non splittare in anticipo** per una crescita ipotetica — solo quando l'attrito si sente davvero (un link che non si riesce a fare pulito). Esempio concreto: `Mauro/lavoro.md` (142 righe, 6 sezioni nette, già linkate individualmente da altri punti) → `Mauro/lavoro/` + 6 file; la sua sotto-sezione progetti → un file per applicativo, nome identico alla cartella reale sotto `PYTHON/` (fisico e logico allineati).\n\n## Tag\nClassificazione a grana fine dentro un file (es. `#lavoro`, `#casa`) — diversa dall'appartenenza a una cartella. Un tag risponde a \"che tipo di contenuto è questo pezzo\", l'hub risponde a \"a quale collezione appartiene questo file\".\n\n## Per chi consulta i file direttamente (non via Obsidian)\nUn'AI che legge i file grezzi non ha bisogno del grafo — cerca testo, legge frontmatter. La convenzione hub-per-cartella vale comunque: prima di rispondere su una cartella, controllare se esiste un file `_i_` + nome della cartella (non più il nome della cartella da solo — convenzione abbandonata il 03/08/2026, vedi sopra). Eccezione: `_documenti/` è uno store, non una collezione — il suo `_i_documenti.md` è policy, non punto di navigazione (vedi \"Hub per cartella\" sopra).\n\n**Indice piatto rimosso (04/08/2026)**: c'era stata (30/07) una sezione \"Indice completo\" con una riga per ogni nota dell'archivio, tenuta per dare una scansione economica senza dover navigare per hub. Ripensata: né Mauro né Adrian la consultavano davvero in pratica (navigazione reale sempre per hub o via grep/ricerca testo), e nel grafo Obsidian rendeva questo file il nodo più affollato (44 connessioni dirette), rumore visivo senza beneficio corrispondente. Navigazione ora solo per hub-per-cartella (sopra) o ricerca diretta nei file.\n","numLines":51,"startLine":1,"totalLines":51}},"sourceToolAssistantUUID":"d46c6159-6bab-40ce-bc9a-73e68907f588","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"type":"last-prompt","lastPrompt":"Ho incominciato nuova sessione della mattina visto che abbiamo lavorato in sessione precedente alla modalità \"voice\" via webappp","leafUuid":"ccabc033-7678-4a7a-be36-41fe279eac54","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01"}
{"type":"ai-title","aiTitle":"Continuare sessione modalità voice webapp","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01"}
{"parentUuid":"ccabc033-7678-4a7a-be36-41fe279eac54","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmJxpLSSQj1KuZKeRCTH","type":"message","role":"assistant","content":[{"type":"text","text":"Avvio ora il Monitor persistente sull'inbox di voice-chat, come da procedura di avvio sessione sulla Nave."}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":31922,"cache_read_input_tokens":22214,"output_tokens":242,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":31922,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":242,"cache_read_input_tokens":22214,"cache_creation_input_tokens":31922,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":31922},"type":"message"}],"speed":"standard"},"diagnostics":{"cache_miss_reason":{"type":"tools_changed","cache_missed_input_tokens":42378}}},"requestId":"req_011CdmJxnFg23fA7C59dbaEH","type":"assistant","uuid":"e52f2b4c-d924-4564-bb93-00cb742e7ada","timestamp":"2026-08-06T10:08:15.426Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"e52f2b4c-d924-4564-bb93-00cb742e7ada","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmJxpLSSQj1KuZKeRCTH","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_019a6Pze1kwHUzZy6izpeGKc","name":"Monitor","input":{"command":"tail -F /mnt/ssd/data/Dropbox/adrian/sandbox/voice-chat/runtime/inbox.jsonl","description":"voice-chat inbox — nuovi messaggi vocali da Mauro via webapp","persistent":true,"timeout_ms":3600000},"caller":{"type":"direct"}}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":31922,"cache_read_input_tokens":22214,"output_tokens":242,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":31922,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":242,"cache_read_input_tokens":22214,"cache_creation_input_tokens":31922,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":31922},"type":"message"}],"speed":"standard"},"diagnostics":{"cache_miss_reason":{"type":"tools_changed","cache_missed_input_tokens":42378}}},"requestId":"req_011CdmJxnFg23fA7C59dbaEH","type":"assistant","uuid":"2a1dad9f-7197-4683-b11e-9fcdde35c3ec","timestamp":"2026-08-06T10:08:15.629Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"2a1dad9f-7197-4683-b11e-9fcdde35c3ec","isSidechain":false,"promptId":"a4346a79-e7f3-463a-b508-aa3cea540199","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_019a6Pze1kwHUzZy6izpeGKc","type":"tool_result","content":"Monitor started (task b61p24qos, persistent — runs until TaskStop or session end). You will be notified on each event. Keep working — do not poll or sleep. Events may arrive while you are waiting for the user — an event is not their reply."}]},"uuid":"8a4f1cbb-7db9-456a-a4da-9955883c442e","timestamp":"2026-08-06T10:08:15.659Z","toolUseResult":{"taskId":"b61p24qos","timeoutMs":0,"persistent":true},"sourceToolAssistantUUID":"2a1dad9f-7197-4683-b11e-9fcdde35c3ec","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"type":"queue-operation","operation":"enqueue","timestamp":"2026-08-06T10:08:15.888Z","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","content":"\nb61p24qos\nMonitor event: \"voice-chat inbox — nuovi messaggi vocali da Mauro via webapp\"\n{\"id\": \"6a977c9ae12e4e3388efb46872a5b282\", \"transcript\": \"nel browser Chrome sto testando aggiornamenti in tempo reale di quello che sto facendo.\", \"ts\": 1786008749.0366597}\n{\"id\": \"4c48ab30221f49afafeb312bb665291a\", \"transcript\": \"S\\u00ec, funziona perfettamente, \\u00e8 molto utile perch\\u00e9 ti d\\u00e0 un bel feedback.\", \"ts\": 1786008774.9482353}\n{\"id\": \"8414ab42391e47cb93cae6c9a3b4d1e0\", \"transcript\": \"Mi senti?\", \"ts\": 1786009701.657821}\nIf this event is something the user would act on now, send a PushNotification. Routine or benign output doesn't need one.\n"}
{"parentUuid":"8a4f1cbb-7db9-456a-a4da-9955883c442e","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmJyAMCxLHkbi7DaxnCY","type":"message","role":"assistant","content":[{"type":"text","text":"Buongiorno. Sono operativo: Monitor voice-chat avviato sulla Nave, memoria letta.\n\nNessuna urgenza segnalata dallo stato — i thread aperti principali restano quelli di ieri (10/10 riscaldamento, investimento 28k, Palmanova, Campomarino, appuntamenti sanitari di famiglia). Se vuoi riprendere uno di questi o hai qualcos'altro in mente per stamattina, dimmi pure — sono pronto sia da qui che via voce dal telefono."}],"stop_reason":"end_turn","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":324,"cache_read_input_tokens":54136,"output_tokens":186,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":324,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":186,"cache_read_input_tokens":54136,"cache_creation_input_tokens":324,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":324},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmJy8BzAAZepLgiC9xdU","type":"assistant","uuid":"699785e8-0f89-42db-beeb-c0afd35bcc27","timestamp":"2026-08-06T10:08:20.349Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"type":"queue-operation","operation":"dequeue","timestamp":"2026-08-06T10:08:22.197Z","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01"}
{"parentUuid":"699785e8-0f89-42db-beeb-c0afd35bcc27","isSidechain":false,"promptId":"b862b41b-f203-4f72-93f8-54c2bd94f0a1","type":"user","message":{"role":"user","content":"\nb61p24qos\nMonitor event: \"voice-chat inbox — nuovi messaggi vocali da Mauro via webapp\"\n{\"id\": \"6a977c9ae12e4e3388efb46872a5b282\", \"transcript\": \"nel browser Chrome sto testando aggiornamenti in tempo reale di quello che sto facendo.\", \"ts\": 1786008749.0366597}\n{\"id\": \"4c48ab30221f49afafeb312bb665291a\", \"transcript\": \"S\\u00ec, funziona perfettamente, \\u00e8 molto utile perch\\u00e9 ti d\\u00e0 un bel feedback.\", \"ts\": 1786008774.9482353}\n{\"id\": \"8414ab42391e47cb93cae6c9a3b4d1e0\", \"transcript\": \"Mi senti?\", \"ts\": 1786009701.657821}\nIf this event is something the user would act on now, send a PushNotification. Routine or benign output doesn't need one.\n"},"uuid":"909d40b2-3284-457d-8644-a170c265d37c","timestamp":"2026-08-06T10:08:22.208Z","permissionMode":"acceptEdits","origin":{"kind":"task-notification"},"promptSource":"sdk","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"909d40b2-3284-457d-8644-a170c265d37c","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmJycV5VmwhnRfEs1rDZ","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"EvcFCokBCBAYAipAkfiCTs3/4TtOjjCaPVScTwUkUlpZMpqyQH9CoE8cFE1XG5AlLWb3lvA8rticjbZ1FOzfzImtWBwAxNqe6fTCOjIPY2xhdWRlLXNvbm5ldC01OABCCHRoaW5raW5nWiQzZDFjY2UyZS0wNjY0LTQwZDYtODQxNC1iN2U1MjhhY2UyYjESDHuscidgJ23k+75zohoMrqk8LqvkRYSuoIS2IjBmhYPxy/safPYXC2mHTrtqYARFgchxe919/aTQnNFlXE1OeEeiLRi599BMa0G13doqmgSM5o6M3QGlT494hg/RYjU78l+/JOPS3Ji61M9/KbT3JmpTenDFS2/Hy2lzR0dxIaW3AHixg4uc3ZlwTUDc004zSnpBK/CKc1G9223AzSlMntV3bwJOUwuDCMn27IGoAx/6nQi1EVRtnHu9Zsg8aRLULQsNh3SLckQ8pyJHDYylxZdqDlb/MQ+24PEkAseMmJMA2NT0PFcASEg8++knqOrChzbVY4+73dMgNAZ2GqnGR2f7NcgrvkEkXL4fcZ+vXnrizjR4he1VGu3o67fVBDSaqgAXswBS3Vrb/AJ50sbtO/ZiQjLTj3NPHTnkEbpCdu2ju+Kc2bLQbDozgsFI8EAjAj0lNHSE4BemDSEJsCNCmF5GsGre47zyQSuS+rrJoNeYLBfgZKWEj+rOYRVosCcV5KSnuQKsWO4y4/e1Bf4n87AWrdMtNHvw1VbOqHh3wSGA525tB6GpAtPdfzZhPcKhjf+Da1Kzw+xThP3fXS8xWeMea6WRLz6y/R+I6+05roOEOd+Kjnbt/u0ee9eR7PUBgapHvTeuM1fgNPFJjLs8HR3017mSYoydsybX/qFrpOmhBEj8cfJa056QtCw+yFiHfDzHl5Ij8YCzFDtqCQ2nJm10Bi7m/4PuzomEqpBVjjpAIGjoHVd5AQthm+ERsUIUSzi8iv/MN1YVRzNa6kNxHOV9gXYCrLzR0EFxSDxFR6t6fJKQ5QJLDdjFGAE="}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":696,"cache_read_input_tokens":54460,"output_tokens":285,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":696,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":285,"cache_read_input_tokens":54460,"cache_creation_input_tokens":696,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":696},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmJybRq4VSGt7xZagvKb","type":"assistant","uuid":"74b0b10d-d4f8-4eb1-af87-d24ae1eb8469","timestamp":"2026-08-06T10:08:25.525Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"74b0b10d-d4f8-4eb1-af87-d24ae1eb8469","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmJycV5VmwhnRfEs1rDZ","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01Tb84kwv9RWg1bhpn83F13J","name":"Read","input":{"file_path":"/mnt/ssd/data/Dropbox/adrian/sandbox/voice-chat/CLAUDE.md"},"caller":{"type":"direct"}}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":696,"cache_read_input_tokens":54460,"output_tokens":285,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":696,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":285,"cache_read_input_tokens":54460,"cache_creation_input_tokens":696,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":696},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmJybRq4VSGt7xZagvKb","type":"assistant","uuid":"207edea5-ce9e-44e0-95f3-da5f4afad31d","timestamp":"2026-08-06T10:08:26.341Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"207edea5-ce9e-44e0-95f3-da5f4afad31d","isSidechain":false,"promptId":"b862b41b-f203-4f72-93f8-54c2bd94f0a1","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01Tb84kwv9RWg1bhpn83F13J","type":"tool_result","content":"1\t---\n2\ttype: modulo\n3\tparent: \"Dropbox/adrian (sandbox)\"\n4\t---\n5\t\n6\t# CLAUDE.md — voice-chat (sandbox prototipo)\n7\t**Versione:** v2\n8\t**Ultimo aggiornamento:** 2026-08-06\n9\t\n10\tEredita la Costituzione principale (`Dropbox/adrian/CLAUDE.md`). Solo contesto locale qui sotto.\n11\t\n12\t## Cos'è\n13\t\n14\tProgetto divertimento/sperimentazione (deciso con Mauro 06/08/2026): interfaccia web di\n15\tdialogo vocale push-to-talk con Adrian — non uno strumento di lavoro, non propedeutico a\n16\tun impegno concreto, obiettivo esplicito è \"il meglio possibile con la tecnologia di oggi\",\n17\tcon licenza di scalare/abbandonare quando arrivano opportunità migliori (es. audio nativo\n18\tAnthropic, se mai arriverà).\n19\t\n20\t**Perché non conversazione continua stile Alexa**: sarebbe l'obiettivo vero, ma richiede uno\n21\tstreaming audio bidirezionale in tempo reale con gestione nativa di turni/interruzioni —\n22\toggi lo offrono OpenAI (Realtime API) e Google (Gemini Live API) come modelli end-to-end,\n23\tnon come STT/TTS agganciabili a un cervello a scelta. Usarli vorrebbe dire far rispondere\n24\tGemini/GPT invece di Claude — scartato esplicitamente da Mauro (\"devi essere TU a\n25\trispondere\"). Push-to-talk è il compromesso: tre chiamate HTTP separate (STT → Claude →\n26\tTTS) invece di un loop streaming, più lento ma con Claude come cervello.\n27\t\n28\t## Architettura\n29\t\n30\tFlask puro (niente pywebview: qui serve un'interfaccia web vera, accessibile anche da\n31\tiPhone sulla stessa rete — non una finestra desktop). Un solo endpoint fa tutto il lavoro:\n32\t\n33\t`POST /api/converse` (multipart, campo `audio`) →\n34\t0. **Normalizzazione (06/08/2026)**: l'audio ricevuto (qualunque formato scelto dal browser\n35\t — `audio/mp4` su iOS, `audio/webm;codecs=opus` su Chrome desktop) viene sempre\n36\t transcodificato in WAV 16kHz mono via `ffmpeg` (`transcode_to_wav()`, dipendenza di\n37\t sistema installata sulla Nave) prima di procedere. Gotcha reale trovato da Mauro:\n38\t `audio/webm` non è mai stato nell'elenco ufficiale supportato da Gemini\n39\t (WAV/MP3/AIFF/AAC/OGG/FLAC) — su Chrome desktop produceva trascrizioni pesantemente\n40\t stravolte, non un bug di libreria come si sospettava all'inizio ma un formato di\n41\t contenitore non garantito. La normalizzazione elimina la dipendenza dal codec scelto dal\n42\t browser una volta per tutte.\n43\t1. **STT**: audio (ora sempre WAV) inviato a Gemini (`gemini-flash-latest`, multimodale\n44\t nativo) con prompt di trascrizione — non un servizio Whisper dedicato, riuso della\n45\t `GOOGLE_API_KEY` già presente in `.env` root (validata su mediatrack).\n46\t2. **Adrian** (non un clone — v2, 06/08/2026, vedi sezione dedicata sotto): la trascrizione\n47\t viene passata alla sessione Claude Code in ascolto, non a una chiamata API isolata.\n48\t3. **TTS**: risposta inviata a Gemini (`gemini-2.5-flash-preview-tts`, voce `Puck`) —\n49\t richiede un prompt esplicito tipo \"Leggi ad alta voce esattamente questo testo: …\",\n50\t altrimenti il modello a volte prova a *rispondere* al testo invece di vocalizzarlo (visto\n51\t in test, 400 \"Model tried to generate text\"). Il PCM raw restituito\n52\t (`audio/L16;rate=24000`) viene incapsulato in un WAV in memoria (modulo stdlib `wave`)\n53\t prima di tornare al frontend — i browser non riproducono PCM raw senza contenitore.\n54\t\n55\t## v2 (06/08/2026) — aggancio alla sessione reale invece di un clone\n56\t\n57\t`[CONFERMATO]` — la v1 chiamava Claude via OpenRouter con un system prompt scritto da me\n58\t(\"sei Adrian, rispondi breve...\") — un Claude generico travestito, senza memoria/contesto,\n59\te senza nemmeno lo storico dei turni precedenti nella stessa sessione vocale. Mauro ha\n60\tnotato la cosa e ha chiesto esplicitamente se si potesse davvero parlare con *questa*\n61\tsessione (quella con cui lavora in Claude Code) invece che con un clone — la stessa\n62\tdomanda che, ripensandoci, era dietro al vecchio meccanismo del cockpit con Elon\n63\t(Monitor su un log, non una vera API tra agenti).\n64\t\n65\t**Come funziona ora**: scambio file-based tra il backend Flask e questa sessione.\n66\t- `runtime/inbox.jsonl` (gitignored, ephemero) — il backend appende una riga\n67\t `{\"id\": , \"transcript\": ..., \"ts\": ...}` per ogni domanda trascritta.\n68\t- La sessione Claude Code presidia `runtime/inbox.jsonl` con un **Monitor persistente**\n69\t (`tail -F`, notifica ad ogni riga nuova — stesso principio del vecchio `form_watch.log`,\n70\t ma senza systemd/webapp/SQLite: qui basta il tool Monitor nativo di Claude Code).\n71\t- Alla notifica, la sessione legge la trascrizione, risponde **come se stesse scrivendo\n72\t in questa stessa conversazione** (stesso contesto, stessa memoria), e appende la\n73\t risposta a `runtime/outbox.jsonl` con lo stesso `id`.\n74\t- Il backend (`ask_adrian()` in `backend/server.py`) fa polling su `outbox.jsonl` ogni\n75\t 0.4s finché non trova una riga con l'`id` giusto, fino a un timeout di 90s — oltre il\n76\t quale restituisce un errore esplicito (504) invece di restare bloccato in silenzio.\n77\t\n78\t**Compromesso reale, non nascosto**: non sono due canali paralleli — è la stessa sessione,\n79\tun turno alla volta. Se Mauro scrive in chat mentre sta anche usando voice-chat, le due\n80\tcose si intrecciano nello stesso filo di conversazione invece di procedere indipendenti.\n81\tNon un limite tecnico rigido (il Monitor non blocca la sessione, le notifiche arrivano\n82\tcome i completamenti di task in background), ma operativamente i due canali finiscono\n83\tper comportarsi come un canale solo, perché c'è un solo \"me\" che li gestisce in sequenza.\n84\t\n85\t**Effetto collaterale positivo**: il \"chi risponde\" non è più un'incognita — prima si\n86\tponeva la domanda se dare più contesto (CLAUDE.md/MEMORY.md) al Claude via OpenRouter;\n87\tora la domanda non si pone più, perché chi risponde ha già tutto il contesto per\n88\tdefinizione, essendo la sessione stessa.\n89\t\n90\t**Dipendenza nuova**: voice-chat funziona **solo quando una sessione Claude Code ha il\n91\tMonitor attivo** su `runtime/inbox.jsonl` — non è più un servizio autonomo come la v1\n92\t(che rispondeva sempre, con OpenRouter sempre disponibile). Se nessuna sessione ascolta,\n93\til backend va in timeout dopo 90s con un errore leggibile lato frontend.\n94\t\n95\tFrontend: pagina unica (`frontend/index.html` + `app.js`), pulsante push-to-talk con\n96\tPointer Events (unifica mouse/touch, incluso iOS Safari), `MediaRecorder` per la\n97\tcattura audio. Safari su iPhone non supporta `audio/webm` in `MediaRecorder` — il frontend\n98\tprova in ordine `audio/mp4`, `audio/aac`, `audio/webm;codecs=opus`, `audio/webm` via\n99\t`MediaRecorder.isTypeSupported`; qualunque formato scelto viene comunque normalizzato in\n100\tWAV server-side (vedi punto 0 sopra), quindi la scelta del browser non è più critica per la\n101\tqualità della trascrizione come lo era prima del fix del 06/08/2026.\n102\t\n103\t**Deviazione dal solito stack sandbox**: `PowerBricks.md`/`PowerBricks/CLAUDE.md` usano\n104\tFlask+pywebview (finestra desktop) perché quel prototipo non ha bisogno di essere\n105\traggiunto da fuori. Qui la web-accessibilità (anche da iPhone) è un requisito esplicito,\n106\tquindi niente pywebview — `app.run(host=\"0.0.0.0\", ...)`, aperto in un browser normale.\n107\t\n108\t## Stato attuale (06/08/2026)\n109\t\n110\tPipeline STT→Claude→TTS validata end-to-end via `test_client()` (round-trip testo→audio\n111\tGemini→trascrizione Gemini→risposta Claude→audio Gemini, tutti reali, nessun mock).\n112\t**Non ancora testato da un umano**: il microfono/push-to-talk nel browser vero — la Nave è\n113\theadless, serve un dispositivo con schermo (iPhone o PC ufficio) per il primo giro reale.\n114\t\n115\t**Ambito volutamente limitato al dialogo puro** (deciso 06/08/2026): questo prototipo non\n116\ttocca PowerBricks/query sui dati — è un passo a sé, propedeutico a un'eventuale versione\n117\tvocale di PowerBricks ma non ancora collegato. System prompt minimale (identità + istruzioni\n118\tdi stile), non l'intero `CLAUDE.md`/`memory/MEMORY.md` — da valutare se/quando ha senso\n119\tdarle più contesto.\n120\t\n121\t**Solo in rete locale per ora**: nessuna esposizione esterna, nessuna autenticazione. Se e\n122\tquando si vorrà raggiungerlo da fuori casa, serve affrontare insieme reverse\n123\tproxy/tunnel + un minimo di auth (endpoint pubblico che tiene dietro le chiavi\n124\tAnthropic/OpenRouter/Google — va protetto prima di esporlo).\n125\t\n126\t## Come avviarlo\n127\t\n128\t`[AGGIORNATO 06/08/2026]` — due pezzi separati, entrambi necessari perché voice-chat\n129\trisponda davvero:\n130\t\n131\t1. **Server Flask**: servizio systemd `voice-chat.service` (unit file\n132\t `/etc/systemd/system/voice-chat.service`, non nel repo), sempre attivo, si riavvia da\n133\t solo se crasha (`Restart=on-failure`), sopravvive al reboot (`enabled`). Gira con\n134\t `VOICE_CHAT_DEBUG=0` (niente reloader Werkzeug, inadatto a un servizio persistente — il\n135\t flag esiste apposta in `server.py` per poter comunque lanciarlo a mano con reload attivo\n136\t durante lo sviluppo: `VOICE_CHAT_DEBUG=1 .venv/bin/python backend/server.py`).\n137\t `systemctl status/restart/stop voice-chat` per gestirlo. Il vecchio launcher manuale\n138\t (`start_voice_chat.sh` + `voice-chat.desktop` su Scrivania) è stato rimosso, ridondante.\n139\t2. **Monitor su questa sessione**: il Flask sempre acceso non basta — `ask_adrian()` va\n140\t comunque in timeout se nessuna sessione Claude Code presidia `runtime/inbox.jsonl` (vedi\n141\t sezione v2 sotto). Per questo l'avvio del Monitor è stato reso un passo automatico\n142\t nell'avvio sessione **solo su Nave** (`CLAUDE.md` principale, sezione AVVIO SESSIONE,\n143\t punto 4) — non richiede più un'invocazione esplicita.\n144\t\n145\tApre su `http://0.0.0.0:5060` — raggiungibile da altri dispositivi sulla stessa rete\n146\tall'IP della Nave (es. `http://192.168.1.51:5060`).\n147\t\n148\t## Esposizione esterna (06/08/2026) — attiva\n149\t\n150\t`https://voice.privcloud.dev` — stesso Caddy/tunnel WireGuard degli altri servizi\n151\t(`archivio/_secrets/config.md`), basic auth semplice (credenziali in\n152\t`archivio/_secrets/credentials.md`, sezione VOICE-CHAT). Il server risponde sempre (systemd),\n153\tma \"Adrian risponde davvero\" solo se una sessione Nave ha il Monitor attivo (automatico da\n154\toggi, vedi sopra) — altrimenti timeout 90s con errore esplicito.\n155\t\n156\tDue modifiche fatte per abilitarlo, entrambe fuori da questa cartella:\n157\t1. **Caddyfile su Avamposto** (`/opt/caddy/Caddyfile`) — aggiunto blocco\n158\t `voice.privcloud.dev { basic_auth {...} reverse_proxy 10.0.0.2:5060 }`.\n159\t2. **Firewall Nave** (`ufw`) — aggiunta regola `allow from 10.0.0.1 to any port 5060 proto\n160\t tcp` (stesso pattern già in uso per `webdav` su 8083). Senza questa il traffico dal VPS\n161\t verso la Nave via tunnel viene silenziosamente droppato — jellyfin/navidrome invece\n162\t passano senza regola esplicita perché sono containerizzati e Docker manipola le proprie\n163\t catene iptables a monte di ufw (bypass ben noto Docker+ufw); un processo Python nudo\n164\t come questo Flask no, va autorizzato esplicitamente.\n165\t\n166\t**Bug infrastrutturale reale scoperto durante questo lavoro (06/08/2026), non legato solo a\n167\tvoice-chat**: il container Caddy su Avamposto non ricaricava la configurazione dal **15\n168\tluglio** — `caddy reload` rispondeva sempre \"config is unchanged\" perché il bind mount\n169\tDocker su file singolo (`./Caddyfile:/etc/caddy/Caddyfile` in `docker-compose.yml`) era\n170\trimasto agganciato a un inode vecchio: qualcosa (probabile lo smantellamento di vault-mcp,\n171\t29/07) aveva riscritto `/opt/caddy/Caddyfile` sull'host con un rename atomico invece di una\n172\tmodifica in-place, e i bind mount su singolo file restano ancorati all'inode originale\n173\tfinché il container non viene ricreato. Risultato pratico: `vault.privcloud.dev` era ancora\n174\tvivo e raggiungibile nel Caddy in esecuzione nonostante fosse stato rimosso dal file da\n175\tgiorni. **Fix**: `docker restart caddy` (ricrea il mount, rilegge il file vero). Da\n176\ttenere presente per il futuro: qualunque modifica al Caddyfile fatta con un editor/tool che\n177\triscrive il file per intero (anziché appendere in-place) rischia di silenziosamente non\n178\tavere effetto finché non si riavvia il container — vale la pena verificare sempre con\n179\t`docker exec caddy cat /etc/caddy/Caddyfile` che il contenuto visto dal container coincida\n180\tcon quello su disco, non fidarsi solo dell'esito di `caddy reload`.\n181\t\n182\t## Tempi di risposta — analisi e idee future (06/08/2026)\n183\t\n184\t`[NOTA, non implementato]` — dopo il primo giro di test riusciti, Mauro ha chiesto di capire\n185\tdove va il tempo. Scomposizione onesta: registrazione (istantanea) → upload → STT Gemini\n186\t(1-2s) → **risposta di Adrian, il tratto più lungo** (un giro completo notifica\n187\tMonitor→lettura→ragionamento→scrittura outbox via tool, stessa velocità con cui risponde\n188\tin chat testuale — non un endpoint ottimizzabile, è la natura del meccanismo v2 scelto\n189\tapposta per avere una vera sessione e non un clone veloce) → TTS Gemini (1-3s) → download e\n190\tplayback. Se il test avviene da fuori casa c'è anche un giro in più (telefono → VPS\n191\tGermania → tunnel WireGuard → Nave → API Google → ritorno) che sparirebbe da wifi di casa.\n192\t\n193\t**Margini di manovra piccoli e concreti, non ancora fatti**: intervallo di polling\n194\t`ask_adrian()` (oggi 0.4s, si può scendere), prompt-wrapping nella chiamata TTS.\n195\t\n196\t**Idea per il futuro (non implementata, spunto di Mauro da ChatGPT Voice)**: durante il\n197\ttratto lungo (Adrian che ragiona), far sentire un suono/segnale di \"sto pensando\" invece del\n198\tsilenzio — non accorcia il tempo reale ma cambia la percezione dell'attesa. Non prioritario,\n199\t\"per ora va benissimo così\" (Mauro, 06/08/2026) — da riprendere se/quando si vorrà affinare\n200\toltre il prototipo attuale.\n201\t\n202\t## Idea per il futuro — selettore di modalità/subagente (06/08/2026, non implementata)\n203\t\n204\tSpunto di Mauro: un selettore nella webapp che tagga ogni messaggio con una \"modalità\"\n205\t(es. \"PowerBricks\" vs \"assistente generico\") — non sessioni isolate (Mauro ha corretto da\n206\tsolo il termine \"sandbox\" che aveva usato all'inizio, fuorviante), ma un segnale esplicito\n207\tche aiuta Adrian a sapere quando invocare un subagente specializzato (`data-expert`,\n208\t`flussi-expert`) invece di rispondere a braccio, risparmiando il lavoro di indovinare\n209\tl'intento dal solo contenuto della domanda. Tecnicamente semplice quando si vorrà farlo: un\n210\tcampo `mode` in più nel payload di `runtime/inbox.jsonl`, letto e rispettato da chi risponde.\n211\tDeciso di tenerlo solo come idea per ora, non implementato.\n212\t"}]},"uuid":"69f1a779-cd43-4436-be43-8971343d74ce","timestamp":"2026-08-06T10:08:26.406Z","toolUseResult":{"type":"text","file":{"filePath":"/mnt/ssd/data/Dropbox/adrian/sandbox/voice-chat/CLAUDE.md","content":"---\ntype: modulo\nparent: \"Dropbox/adrian (sandbox)\"\n---\n\n# CLAUDE.md — voice-chat (sandbox prototipo)\n**Versione:** v2\n**Ultimo aggiornamento:** 2026-08-06\n\nEredita la Costituzione principale (`Dropbox/adrian/CLAUDE.md`). Solo contesto locale qui sotto.\n\n## Cos'è\n\nProgetto divertimento/sperimentazione (deciso con Mauro 06/08/2026): interfaccia web di\ndialogo vocale push-to-talk con Adrian — non uno strumento di lavoro, non propedeutico a\nun impegno concreto, obiettivo esplicito è \"il meglio possibile con la tecnologia di oggi\",\ncon licenza di scalare/abbandonare quando arrivano opportunità migliori (es. audio nativo\nAnthropic, se mai arriverà).\n\n**Perché non conversazione continua stile Alexa**: sarebbe l'obiettivo vero, ma richiede uno\nstreaming audio bidirezionale in tempo reale con gestione nativa di turni/interruzioni —\noggi lo offrono OpenAI (Realtime API) e Google (Gemini Live API) come modelli end-to-end,\nnon come STT/TTS agganciabili a un cervello a scelta. Usarli vorrebbe dire far rispondere\nGemini/GPT invece di Claude — scartato esplicitamente da Mauro (\"devi essere TU a\nrispondere\"). Push-to-talk è il compromesso: tre chiamate HTTP separate (STT → Claude →\nTTS) invece di un loop streaming, più lento ma con Claude come cervello.\n\n## Architettura\n\nFlask puro (niente pywebview: qui serve un'interfaccia web vera, accessibile anche da\niPhone sulla stessa rete — non una finestra desktop). Un solo endpoint fa tutto il lavoro:\n\n`POST /api/converse` (multipart, campo `audio`) →\n0. **Normalizzazione (06/08/2026)**: l'audio ricevuto (qualunque formato scelto dal browser\n — `audio/mp4` su iOS, `audio/webm;codecs=opus` su Chrome desktop) viene sempre\n transcodificato in WAV 16kHz mono via `ffmpeg` (`transcode_to_wav()`, dipendenza di\n sistema installata sulla Nave) prima di procedere. Gotcha reale trovato da Mauro:\n `audio/webm` non è mai stato nell'elenco ufficiale supportato da Gemini\n (WAV/MP3/AIFF/AAC/OGG/FLAC) — su Chrome desktop produceva trascrizioni pesantemente\n stravolte, non un bug di libreria come si sospettava all'inizio ma un formato di\n contenitore non garantito. La normalizzazione elimina la dipendenza dal codec scelto dal\n browser una volta per tutte.\n1. **STT**: audio (ora sempre WAV) inviato a Gemini (`gemini-flash-latest`, multimodale\n nativo) con prompt di trascrizione — non un servizio Whisper dedicato, riuso della\n `GOOGLE_API_KEY` già presente in `.env` root (validata su mediatrack).\n2. **Adrian** (non un clone — v2, 06/08/2026, vedi sezione dedicata sotto): la trascrizione\n viene passata alla sessione Claude Code in ascolto, non a una chiamata API isolata.\n3. **TTS**: risposta inviata a Gemini (`gemini-2.5-flash-preview-tts`, voce `Puck`) —\n richiede un prompt esplicito tipo \"Leggi ad alta voce esattamente questo testo: …\",\n altrimenti il modello a volte prova a *rispondere* al testo invece di vocalizzarlo (visto\n in test, 400 \"Model tried to generate text\"). Il PCM raw restituito\n (`audio/L16;rate=24000`) viene incapsulato in un WAV in memoria (modulo stdlib `wave`)\n prima di tornare al frontend — i browser non riproducono PCM raw senza contenitore.\n\n## v2 (06/08/2026) — aggancio alla sessione reale invece di un clone\n\n`[CONFERMATO]` — la v1 chiamava Claude via OpenRouter con un system prompt scritto da me\n(\"sei Adrian, rispondi breve...\") — un Claude generico travestito, senza memoria/contesto,\ne senza nemmeno lo storico dei turni precedenti nella stessa sessione vocale. Mauro ha\nnotato la cosa e ha chiesto esplicitamente se si potesse davvero parlare con *questa*\nsessione (quella con cui lavora in Claude Code) invece che con un clone — la stessa\ndomanda che, ripensandoci, era dietro al vecchio meccanismo del cockpit con Elon\n(Monitor su un log, non una vera API tra agenti).\n\n**Come funziona ora**: scambio file-based tra il backend Flask e questa sessione.\n- `runtime/inbox.jsonl` (gitignored, ephemero) — il backend appende una riga\n `{\"id\": , \"transcript\": ..., \"ts\": ...}` per ogni domanda trascritta.\n- La sessione Claude Code presidia `runtime/inbox.jsonl` con un **Monitor persistente**\n (`tail -F`, notifica ad ogni riga nuova — stesso principio del vecchio `form_watch.log`,\n ma senza systemd/webapp/SQLite: qui basta il tool Monitor nativo di Claude Code).\n- Alla notifica, la sessione legge la trascrizione, risponde **come se stesse scrivendo\n in questa stessa conversazione** (stesso contesto, stessa memoria), e appende la\n risposta a `runtime/outbox.jsonl` con lo stesso `id`.\n- Il backend (`ask_adrian()` in `backend/server.py`) fa polling su `outbox.jsonl` ogni\n 0.4s finché non trova una riga con l'`id` giusto, fino a un timeout di 90s — oltre il\n quale restituisce un errore esplicito (504) invece di restare bloccato in silenzio.\n\n**Compromesso reale, non nascosto**: non sono due canali paralleli — è la stessa sessione,\nun turno alla volta. Se Mauro scrive in chat mentre sta anche usando voice-chat, le due\ncose si intrecciano nello stesso filo di conversazione invece di procedere indipendenti.\nNon un limite tecnico rigido (il Monitor non blocca la sessione, le notifiche arrivano\ncome i completamenti di task in background), ma operativamente i due canali finiscono\nper comportarsi come un canale solo, perché c'è un solo \"me\" che li gestisce in sequenza.\n\n**Effetto collaterale positivo**: il \"chi risponde\" non è più un'incognita — prima si\nponeva la domanda se dare più contesto (CLAUDE.md/MEMORY.md) al Claude via OpenRouter;\nora la domanda non si pone più, perché chi risponde ha già tutto il contesto per\ndefinizione, essendo la sessione stessa.\n\n**Dipendenza nuova**: voice-chat funziona **solo quando una sessione Claude Code ha il\nMonitor attivo** su `runtime/inbox.jsonl` — non è più un servizio autonomo come la v1\n(che rispondeva sempre, con OpenRouter sempre disponibile). Se nessuna sessione ascolta,\nil backend va in timeout dopo 90s con un errore leggibile lato frontend.\n\nFrontend: pagina unica (`frontend/index.html` + `app.js`), pulsante push-to-talk con\nPointer Events (unifica mouse/touch, incluso iOS Safari), `MediaRecorder` per la\ncattura audio. Safari su iPhone non supporta `audio/webm` in `MediaRecorder` — il frontend\nprova in ordine `audio/mp4`, `audio/aac`, `audio/webm;codecs=opus`, `audio/webm` via\n`MediaRecorder.isTypeSupported`; qualunque formato scelto viene comunque normalizzato in\nWAV server-side (vedi punto 0 sopra), quindi la scelta del browser non è più critica per la\nqualità della trascrizione come lo era prima del fix del 06/08/2026.\n\n**Deviazione dal solito stack sandbox**: `PowerBricks.md`/`PowerBricks/CLAUDE.md` usano\nFlask+pywebview (finestra desktop) perché quel prototipo non ha bisogno di essere\nraggiunto da fuori. Qui la web-accessibilità (anche da iPhone) è un requisito esplicito,\nquindi niente pywebview — `app.run(host=\"0.0.0.0\", ...)`, aperto in un browser normale.\n\n## Stato attuale (06/08/2026)\n\nPipeline STT→Claude→TTS validata end-to-end via `test_client()` (round-trip testo→audio\nGemini→trascrizione Gemini→risposta Claude→audio Gemini, tutti reali, nessun mock).\n**Non ancora testato da un umano**: il microfono/push-to-talk nel browser vero — la Nave è\nheadless, serve un dispositivo con schermo (iPhone o PC ufficio) per il primo giro reale.\n\n**Ambito volutamente limitato al dialogo puro** (deciso 06/08/2026): questo prototipo non\ntocca PowerBricks/query sui dati — è un passo a sé, propedeutico a un'eventuale versione\nvocale di PowerBricks ma non ancora collegato. System prompt minimale (identità + istruzioni\ndi stile), non l'intero `CLAUDE.md`/`memory/MEMORY.md` — da valutare se/quando ha senso\ndarle più contesto.\n\n**Solo in rete locale per ora**: nessuna esposizione esterna, nessuna autenticazione. Se e\nquando si vorrà raggiungerlo da fuori casa, serve affrontare insieme reverse\nproxy/tunnel + un minimo di auth (endpoint pubblico che tiene dietro le chiavi\nAnthropic/OpenRouter/Google — va protetto prima di esporlo).\n\n## Come avviarlo\n\n`[AGGIORNATO 06/08/2026]` — due pezzi separati, entrambi necessari perché voice-chat\nrisponda davvero:\n\n1. **Server Flask**: servizio systemd `voice-chat.service` (unit file\n `/etc/systemd/system/voice-chat.service`, non nel repo), sempre attivo, si riavvia da\n solo se crasha (`Restart=on-failure`), sopravvive al reboot (`enabled`). Gira con\n `VOICE_CHAT_DEBUG=0` (niente reloader Werkzeug, inadatto a un servizio persistente — il\n flag esiste apposta in `server.py` per poter comunque lanciarlo a mano con reload attivo\n durante lo sviluppo: `VOICE_CHAT_DEBUG=1 .venv/bin/python backend/server.py`).\n `systemctl status/restart/stop voice-chat` per gestirlo. Il vecchio launcher manuale\n (`start_voice_chat.sh` + `voice-chat.desktop` su Scrivania) è stato rimosso, ridondante.\n2. **Monitor su questa sessione**: il Flask sempre acceso non basta — `ask_adrian()` va\n comunque in timeout se nessuna sessione Claude Code presidia `runtime/inbox.jsonl` (vedi\n sezione v2 sotto). Per questo l'avvio del Monitor è stato reso un passo automatico\n nell'avvio sessione **solo su Nave** (`CLAUDE.md` principale, sezione AVVIO SESSIONE,\n punto 4) — non richiede più un'invocazione esplicita.\n\nApre su `http://0.0.0.0:5060` — raggiungibile da altri dispositivi sulla stessa rete\nall'IP della Nave (es. `http://192.168.1.51:5060`).\n\n## Esposizione esterna (06/08/2026) — attiva\n\n`https://voice.privcloud.dev` — stesso Caddy/tunnel WireGuard degli altri servizi\n(`archivio/_secrets/config.md`), basic auth semplice (credenziali in\n`archivio/_secrets/credentials.md`, sezione VOICE-CHAT). Il server risponde sempre (systemd),\nma \"Adrian risponde davvero\" solo se una sessione Nave ha il Monitor attivo (automatico da\noggi, vedi sopra) — altrimenti timeout 90s con errore esplicito.\n\nDue modifiche fatte per abilitarlo, entrambe fuori da questa cartella:\n1. **Caddyfile su Avamposto** (`/opt/caddy/Caddyfile`) — aggiunto blocco\n `voice.privcloud.dev { basic_auth {...} reverse_proxy 10.0.0.2:5060 }`.\n2. **Firewall Nave** (`ufw`) — aggiunta regola `allow from 10.0.0.1 to any port 5060 proto\n tcp` (stesso pattern già in uso per `webdav` su 8083). Senza questa il traffico dal VPS\n verso la Nave via tunnel viene silenziosamente droppato — jellyfin/navidrome invece\n passano senza regola esplicita perché sono containerizzati e Docker manipola le proprie\n catene iptables a monte di ufw (bypass ben noto Docker+ufw); un processo Python nudo\n come questo Flask no, va autorizzato esplicitamente.\n\n**Bug infrastrutturale reale scoperto durante questo lavoro (06/08/2026), non legato solo a\nvoice-chat**: il container Caddy su Avamposto non ricaricava la configurazione dal **15\nluglio** — `caddy reload` rispondeva sempre \"config is unchanged\" perché il bind mount\nDocker su file singolo (`./Caddyfile:/etc/caddy/Caddyfile` in `docker-compose.yml`) era\nrimasto agganciato a un inode vecchio: qualcosa (probabile lo smantellamento di vault-mcp,\n29/07) aveva riscritto `/opt/caddy/Caddyfile` sull'host con un rename atomico invece di una\nmodifica in-place, e i bind mount su singolo file restano ancorati all'inode originale\nfinché il container non viene ricreato. Risultato pratico: `vault.privcloud.dev` era ancora\nvivo e raggiungibile nel Caddy in esecuzione nonostante fosse stato rimosso dal file da\ngiorni. **Fix**: `docker restart caddy` (ricrea il mount, rilegge il file vero). Da\ntenere presente per il futuro: qualunque modifica al Caddyfile fatta con un editor/tool che\nriscrive il file per intero (anziché appendere in-place) rischia di silenziosamente non\navere effetto finché non si riavvia il container — vale la pena verificare sempre con\n`docker exec caddy cat /etc/caddy/Caddyfile` che il contenuto visto dal container coincida\ncon quello su disco, non fidarsi solo dell'esito di `caddy reload`.\n\n## Tempi di risposta — analisi e idee future (06/08/2026)\n\n`[NOTA, non implementato]` — dopo il primo giro di test riusciti, Mauro ha chiesto di capire\ndove va il tempo. Scomposizione onesta: registrazione (istantanea) → upload → STT Gemini\n(1-2s) → **risposta di Adrian, il tratto più lungo** (un giro completo notifica\nMonitor→lettura→ragionamento→scrittura outbox via tool, stessa velocità con cui risponde\nin chat testuale — non un endpoint ottimizzabile, è la natura del meccanismo v2 scelto\napposta per avere una vera sessione e non un clone veloce) → TTS Gemini (1-3s) → download e\nplayback. Se il test avviene da fuori casa c'è anche un giro in più (telefono → VPS\nGermania → tunnel WireGuard → Nave → API Google → ritorno) che sparirebbe da wifi di casa.\n\n**Margini di manovra piccoli e concreti, non ancora fatti**: intervallo di polling\n`ask_adrian()` (oggi 0.4s, si può scendere), prompt-wrapping nella chiamata TTS.\n\n**Idea per il futuro (non implementata, spunto di Mauro da ChatGPT Voice)**: durante il\ntratto lungo (Adrian che ragiona), far sentire un suono/segnale di \"sto pensando\" invece del\nsilenzio — non accorcia il tempo reale ma cambia la percezione dell'attesa. Non prioritario,\n\"per ora va benissimo così\" (Mauro, 06/08/2026) — da riprendere se/quando si vorrà affinare\noltre il prototipo attuale.\n\n## Idea per il futuro — selettore di modalità/subagente (06/08/2026, non implementata)\n\nSpunto di Mauro: un selettore nella webapp che tagga ogni messaggio con una \"modalità\"\n(es. \"PowerBricks\" vs \"assistente generico\") — non sessioni isolate (Mauro ha corretto da\nsolo il termine \"sandbox\" che aveva usato all'inizio, fuorviante), ma un segnale esplicito\nche aiuta Adrian a sapere quando invocare un subagente specializzato (`data-expert`,\n`flussi-expert`) invece di rispondere a braccio, risparmiando il lavoro di indovinare\nl'intento dal solo contenuto della domanda. Tecnicamente semplice quando si vorrà farlo: un\ncampo `mode` in più nel payload di `runtime/inbox.jsonl`, letto e rispettato da chi risponde.\nDeciso di tenerlo solo come idea per ora, non implementato.\n","numLines":212,"startLine":1,"totalLines":212}},"sourceToolAssistantUUID":"207edea5-ce9e-44e0-95f3-da5f4afad31d","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"type":"last-prompt","lastPrompt":"Ho incominciato nuova sessione della mattina visto che abbiamo lavorato in sessione precedente alla modalità \"voice\" via webappp","leafUuid":"69f1a779-cd43-4436-be43-8971343d74ce","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01"}
{"type":"ai-title","aiTitle":"Continuare sessione modalità voice webapp","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01"}
{"parentUuid":"69f1a779-cd43-4436-be43-8971343d74ce","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmJyvJPuqNAR5pDDq6fD","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"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"}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":7016,"cache_read_input_tokens":55156,"output_tokens":627,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":7016,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":627,"cache_read_input_tokens":55156,"cache_creation_input_tokens":7016,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":7016},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmJyuTJ7BySpipHxGPMJ","type":"assistant","uuid":"94c443dc-d1bf-49c3-907b-f212ff6eba08","timestamp":"2026-08-06T10:08:34.255Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"94c443dc-d1bf-49c3-907b-f212ff6eba08","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmJyvJPuqNAR5pDDq6fD","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01MmFUThW6raoK4XectHeSPN","name":"Bash","input":{"command":"tail -5 /mnt/ssd/data/Dropbox/adrian/sandbox/voice-chat/runtime/outbox.jsonl 2>/dev/null; echo \"---\"; date +%s","description":"Check outbox format and current time vs message timestamp"},"caller":{"type":"direct"}}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":7016,"cache_read_input_tokens":55156,"output_tokens":627,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":7016,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":627,"cache_read_input_tokens":55156,"cache_creation_input_tokens":7016,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":7016},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmJyuTJ7BySpipHxGPMJ","type":"assistant","uuid":"ce5bee59-dcdc-4c40-897f-dd87ecc068c8","timestamp":"2026-08-06T10:08:34.896Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"ce5bee59-dcdc-4c40-897f-dd87ecc068c8","isSidechain":false,"promptId":"b862b41b-f203-4f72-93f8-54c2bd94f0a1","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01MmFUThW6raoK4XectHeSPN","type":"tool_result","content":"{\"id\": \"6a977c9ae12e4e3388efb46872a5b282\", \"reply\": \"Perfetto, dimmi se vedi le fasi cambiare sullo schermo mentre parlo.\"}\n{\"id\": \"4c48ab30221f49afafeb312bb665291a\", \"reply\": \"Ottimo, sono contento che funzioni bene. Direi che per oggi il prototipo e a un ottimo punto.\"}\n{\"id\": \"8414ab42391e47cb93cae6c9a3b4d1e0\", \"reply\": \"S\\u00ec, ti sento!\", \"ts_reply\": 1786009708.297263}\n---\n1786010914","is_error":false}]},"uuid":"18232768-15c9-4fc9-aafe-319eaa2a26a5","timestamp":"2026-08-06T10:08:34.976Z","toolUseResult":{"stdout":"{\"id\": \"6a977c9ae12e4e3388efb46872a5b282\", \"reply\": \"Perfetto, dimmi se vedi le fasi cambiare sullo schermo mentre parlo.\"}\n{\"id\": \"4c48ab30221f49afafeb312bb665291a\", \"reply\": \"Ottimo, sono contento che funzioni bene. Direi che per oggi il prototipo e a un ottimo punto.\"}\n{\"id\": \"8414ab42391e47cb93cae6c9a3b4d1e0\", \"reply\": \"S\\u00ec, ti sento!\", \"ts_reply\": 1786009708.297263}\n---\n1786010914","stderr":"","interrupted":false,"isImage":false,"noOutputExpected":false},"sourceToolAssistantUUID":"ce5bee59-dcdc-4c40-897f-dd87ecc068c8","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"18232768-15c9-4fc9-aafe-319eaa2a26a5","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmJzZhReNtrhuA57PVzv","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"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"}],"stop_reason":"end_turn","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":845,"cache_read_input_tokens":62172,"output_tokens":769,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":845,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":769,"cache_read_input_tokens":62172,"cache_creation_input_tokens":845,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":845},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmJzYMKE3aNe2V2n8NRE","type":"assistant","uuid":"99acd9ea-fd38-4523-90ef-105a7d626e6b","timestamp":"2026-08-06T10:08:44.007Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"99acd9ea-fd38-4523-90ef-105a7d626e6b","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmJzZhReNtrhuA57PVzv","type":"message","role":"assistant","content":[{"type":"text","text":"Notifica del Monitor già gestita: erano i tre messaggi di test vocale di Mauro (ha verificato che il flusso funziona e mi sentiva bene) — le risposte in `outbox.jsonl` risultano già scritte con timestamp di ~20 minuti fa, quindi il giro è concluso. Nessuna azione richiesta ora."}],"stop_reason":"end_turn","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":845,"cache_read_input_tokens":62172,"output_tokens":769,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":845,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":769,"cache_read_input_tokens":62172,"cache_creation_input_tokens":845,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":845},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmJzYMKE3aNe2V2n8NRE","type":"assistant","uuid":"1fc1519c-eae2-4134-a4f7-7c1e90e8e514","timestamp":"2026-08-06T10:08:45.504Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"type":"queue-operation","operation":"enqueue","timestamp":"2026-08-06T10:10:26.101Z","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","content":"voice.privcloud.dev è giù?"}
{"type":"queue-operation","operation":"dequeue","timestamp":"2026-08-06T10:10:26.149Z","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01"}
{"parentUuid":"1fc1519c-eae2-4134-a4f7-7c1e90e8e514","isSidechain":false,"promptId":"9ad82438-ea10-4f4a-93da-f28dcbfe91aa","type":"user","message":{"role":"user","content":"voice.privcloud.dev è giù?"},"uuid":"4d3f029e-ed7e-4dbd-8f70-66794fbd00ce","timestamp":"2026-08-06T10:10:26.157Z","permissionMode":"acceptEdits","origin":{"kind":"human"},"promptSource":"sdk","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"4d3f029e-ed7e-4dbd-8f70-66794fbd00ce","isSidechain":false,"attachment":{"type":"todo_reminder","content":[],"itemCount":0},"type":"attachment","uuid":"dc5b52c3-5b65-4e7d-9aac-132c1232895d","timestamp":"2026-08-06T10:10:26.157Z","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"type":"file-history-snapshot","messageId":"4d3f029e-ed7e-4dbd-8f70-66794fbd00ce","snapshot":{"messageId":"4d3f029e-ed7e-4dbd-8f70-66794fbd00ce","trackedFileBackups":{},"timestamp":"2026-08-06T10:10:26.161Z"},"isSnapshotUpdate":false}
{"parentUuid":"dc5b52c3-5b65-4e7d-9aac-132c1232895d","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmK8nYp9d3PmGcnKvzqu","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"EtYCCokBCBAYAipAqqCtL7+BMW4im/ySLm+O/wuXYqmcrCAj23iIJoAbCbomyYabdOTCg2mgryspmp8qza4uxNrqme0CO2ebjS0zOjIPY2xhdWRlLXNvbm5ldC01OABCCHRoaW5raW5nWiQzZDFjY2UyZS0wNjY0LTQwZDYtODQxNC1iN2U1MjhhY2UyYjESDLzcjHVQ+swbYwlEuxoMdmPqLs24y+dBUP9XIjDtI/y2wyhZJemh27Q3c4TG2qGOtI/LNYLADRXSDf0D3j0MohxXPXKZMOromSmVmGEqemEK9uoN3JU98o0Egum+tNQ64WYPzyQfdjN0yKFLCS9Qk0vPupR9o0JaZx1WEzehYJ/9Fkp+EG6vpp3EC4HzwKaP2xYgtRtbhk8MhRXtJpOdBLxsGsPOPNyX3XYikQ6wKzp7NurgUNndoNnmjUytUjF77zFASMM53ZQaGAE="}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":923,"cache_read_input_tokens":63017,"output_tokens":316,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":923,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":316,"cache_read_input_tokens":63017,"cache_creation_input_tokens":923,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":923},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmK8jew8PTg6ZqiESoPA","type":"assistant","uuid":"7c89e32c-647a-4c55-90b8-cf417fff4458","timestamp":"2026-08-06T10:10:28.220Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"7c89e32c-647a-4c55-90b8-cf417fff4458","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmK8nYp9d3PmGcnKvzqu","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01V93wv68Z1dMvCSwvYw9MWW","name":"Bash","input":{"command":"curl -sk -o /dev/null -w \"HTTP status: %{http_code}\\nTime: %{time_total}s\\n\" --max-time 10 https://voice.privcloud.dev/ -u mauro:adrian 2>&1","description":"Check if voice.privcloud.dev responds"},"caller":{"type":"direct"}}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":923,"cache_read_input_tokens":63017,"output_tokens":316,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":923,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":316,"cache_read_input_tokens":63017,"cache_creation_input_tokens":923,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":923},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmK8jew8PTg6ZqiESoPA","type":"assistant","uuid":"4c179d86-e9e1-4331-a5bc-c77d5fc739b8","timestamp":"2026-08-06T10:10:29.312Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"4c179d86-e9e1-4331-a5bc-c77d5fc739b8","isSidechain":false,"promptId":"9ad82438-ea10-4f4a-93da-f28dcbfe91aa","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01V93wv68Z1dMvCSwvYw9MWW","type":"tool_result","content":"HTTP status: 200\nTime: 0.152675s","is_error":false}]},"uuid":"11475022-c757-45c1-ae34-8e397b55e541","timestamp":"2026-08-06T10:10:29.548Z","toolUseResult":{"stdout":"HTTP status: 200\nTime: 0.152675s","stderr":"","interrupted":false,"isImage":false,"noOutputExpected":false},"sourceToolAssistantUUID":"4c179d86-e9e1-4331-a5bc-c77d5fc739b8","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"11475022-c757-45c1-ae34-8e397b55e541","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmK8nYp9d3PmGcnKvzqu","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_011jeSWqJrV1cUXyPaso9tmB","name":"Bash","input":{"command":"systemctl is-active voice-chat.service; systemctl status voice-chat.service --no-pager -l | head -20","description":"Check voice-chat systemd service status locally"},"caller":{"type":"direct"}}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":923,"cache_read_input_tokens":63017,"output_tokens":316,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":923,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":316,"cache_read_input_tokens":63017,"cache_creation_input_tokens":923,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":923},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmK8jew8PTg6ZqiESoPA","type":"assistant","uuid":"2fb03ddc-6fa1-4c03-9f96-800b835766dc","timestamp":"2026-08-06T10:10:30.499Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"2fb03ddc-6fa1-4c03-9f96-800b835766dc","isSidechain":false,"promptId":"9ad82438-ea10-4f4a-93da-f28dcbfe91aa","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_011jeSWqJrV1cUXyPaso9tmB","type":"tool_result","content":"active\n● voice-chat.service - Adrian voice-chat (prototipo sandbox)\n Loaded: loaded (/etc/systemd/system/voice-chat.service; enabled; preset: enabled)\n Active: active (running) since Thu 2026-08-06 11:43:26 CEST; 27min ago\n Main PID: 750179 (python3)\n Tasks: 1 (limit: 18778)\n Memory: 27.3M (peak: 34.0M)\n CPU: 889ms\n CGroup: /system.slice/voice-chat.service\n └─750179 /mnt/ssd/data/Dropbox/adrian/sandbox/voice-chat/.venv/bin/python3 backend/server.py\n\nago 06 11:48:29 NucBoxG3 python3[750179]: 10.0.0.1 - - [06/Aug/2026 11:48:29] \"GET /api/status HTTP/1.1\" 200 -\nago 06 11:48:29 NucBoxG3 python3[750179]: 10.0.0.1 - - [06/Aug/2026 11:48:29] \"GET /api/status HTTP/1.1\" 200 -\nago 06 11:48:30 NucBoxG3 python3[750179]: 10.0.0.1 - - [06/Aug/2026 11:48:30] \"GET /api/status HTTP/1.1\" 200 -\nago 06 11:48:30 NucBoxG3 python3[750179]: 10.0.0.1 - - [06/Aug/2026 11:48:30] \"POST /api/converse HTTP/1.1\" 200 -\nago 06 11:48:30 NucBoxG3 python3[750179]: 10.0.0.1 - - [06/Aug/2026 11:48:30] \"GET /favicon.ico HTTP/1.1\" 404 -\nago 06 11:59:08 NucBoxG3 python3[750179]: 10.0.0.1 - - [06/Aug/2026 11:59:08] \"GET / HTTP/1.1\" 200 -\nago 06 11:59:08 NucBoxG3 python3[750179]: 10.0.0.1 - - [06/Aug/2026 11:59:08] \"GET /app.js HTTP/1.1\" 200 -\nago 06 12:09:10 NucBoxG3 python3[750179]: 10.0.0.1 - - [06/Aug/2026 12:09:10] \"GET / HTTP/1.1\" 200 -\nago 06 12:09:10 NucBoxG3 python3[750179]: 10.0.0.1 - - [06/Aug/2026 12:09:10] \"GET /app.js HTTP/1.1\" 200 -\nago 06 12:10:29 NucBoxG3 python3[750179]: 10.0.0.1 - - [06/Aug/2026 12:10:29] \"GET / HTTP/1.1\" 200 -","is_error":false}]},"uuid":"eedbf9e1-de18-4039-b430-77c646056bc6","timestamp":"2026-08-06T10:10:30.610Z","toolUseResult":{"stdout":"active\n● voice-chat.service - Adrian voice-chat (prototipo sandbox)\n Loaded: loaded (/etc/systemd/system/voice-chat.service; enabled; preset: enabled)\n Active: active (running) since Thu 2026-08-06 11:43:26 CEST; 27min ago\n Main PID: 750179 (python3)\n Tasks: 1 (limit: 18778)\n Memory: 27.3M (peak: 34.0M)\n CPU: 889ms\n CGroup: /system.slice/voice-chat.service\n └─750179 /mnt/ssd/data/Dropbox/adrian/sandbox/voice-chat/.venv/bin/python3 backend/server.py\n\nago 06 11:48:29 NucBoxG3 python3[750179]: 10.0.0.1 - - [06/Aug/2026 11:48:29] \"GET /api/status HTTP/1.1\" 200 -\nago 06 11:48:29 NucBoxG3 python3[750179]: 10.0.0.1 - - [06/Aug/2026 11:48:29] \"GET /api/status HTTP/1.1\" 200 -\nago 06 11:48:30 NucBoxG3 python3[750179]: 10.0.0.1 - - [06/Aug/2026 11:48:30] \"GET /api/status HTTP/1.1\" 200 -\nago 06 11:48:30 NucBoxG3 python3[750179]: 10.0.0.1 - - [06/Aug/2026 11:48:30] \"POST /api/converse HTTP/1.1\" 200 -\nago 06 11:48:30 NucBoxG3 python3[750179]: 10.0.0.1 - - [06/Aug/2026 11:48:30] \"GET /favicon.ico HTTP/1.1\" 404 -\nago 06 11:59:08 NucBoxG3 python3[750179]: 10.0.0.1 - - [06/Aug/2026 11:59:08] \"GET / HTTP/1.1\" 200 -\nago 06 11:59:08 NucBoxG3 python3[750179]: 10.0.0.1 - - [06/Aug/2026 11:59:08] \"GET /app.js HTTP/1.1\" 200 -\nago 06 12:09:10 NucBoxG3 python3[750179]: 10.0.0.1 - - [06/Aug/2026 12:09:10] \"GET / HTTP/1.1\" 200 -\nago 06 12:09:10 NucBoxG3 python3[750179]: 10.0.0.1 - - [06/Aug/2026 12:09:10] \"GET /app.js HTTP/1.1\" 200 -\nago 06 12:10:29 NucBoxG3 python3[750179]: 10.0.0.1 - - [06/Aug/2026 12:10:29] \"GET / HTTP/1.1\" 200 -","stderr":"","interrupted":false,"isImage":false,"noOutputExpected":false},"sourceToolAssistantUUID":"2fb03ddc-6fa1-4c03-9f96-800b835766dc","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"eedbf9e1-de18-4039-b430-77c646056bc6","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmK968yohNjyCFUCntHD","type":"message","role":"assistant","content":[{"type":"text","text":"No, è su: `https://voice.privcloud.dev` risponde HTTP 200 in ~150ms, e il servizio `voice-chat.service` sulla Nave è attivo (up da 27 minuti), con richieste che arrivano regolarmente fino a pochi minuti fa. Se ti dava problemi lato browser potrebbe essere qualcos'altro (cache, sessione, rete) — dimmi cosa vedevi."}],"stop_reason":"end_turn","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":1369,"cache_read_input_tokens":63940,"output_tokens":149,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":1369,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":149,"cache_read_input_tokens":63940,"cache_creation_input_tokens":1369,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":1369},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmK94bDTdSJA4RCvrRuc","type":"assistant","uuid":"fef305d5-2d29-4a0b-8995-cf8e6ae112b9","timestamp":"2026-08-06T10:10:34.186Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"type":"queue-operation","operation":"enqueue","timestamp":"2026-08-06T10:11:31.708Z","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","content":"\nb61p24qos\nMonitor event: \"voice-chat inbox — nuovi messaggi vocali da Mauro via webapp\"\n{\"id\": \"d03e7fcb8cc4494d8cb4e0c1678586cf\", \"transcript\": \"Mi senti?\", \"ts\": 1786011091.4910376}\nIf this event is something the user would act on now, send a PushNotification. Routine or benign output doesn't need one.\n"}
{"type":"queue-operation","operation":"dequeue","timestamp":"2026-08-06T10:11:31.773Z","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01"}
{"parentUuid":"fef305d5-2d29-4a0b-8995-cf8e6ae112b9","isSidechain":false,"promptId":"17c0a14b-77a8-4494-851b-478092e286c3","type":"user","message":{"role":"user","content":"\nb61p24qos\nMonitor event: \"voice-chat inbox — nuovi messaggi vocali da Mauro via webapp\"\n{\"id\": \"d03e7fcb8cc4494d8cb4e0c1678586cf\", \"transcript\": \"Mi senti?\", \"ts\": 1786011091.4910376}\nIf this event is something the user would act on now, send a PushNotification. Routine or benign output doesn't need one.\n"},"uuid":"b74bcf92-f9db-4fc1-98cc-0b310a0f8266","timestamp":"2026-08-06T10:11:31.781Z","permissionMode":"acceptEdits","origin":{"kind":"task-notification"},"promptSource":"sdk","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"b74bcf92-f9db-4fc1-98cc-0b310a0f8266","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmKDcMXuRr6uzHzK6MQs","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"EoIDCokBCBAYAipA58hZHyhXoY1FrpyoNPXNi9PobsW+2kMH+sP7u526kUNsNQ6QDifmgqi3I8wdrX0IIh3L96eVSkew0ACkKoQe2jIPY2xhdWRlLXNvbm5ldC01OABCCHRoaW5raW5nWiQzZDFjY2UyZS0wNjY0LTQwZDYtODQxNC1iN2U1MjhhY2UyYjESDD3iayaT/xs2qJUF3hoMHmpUyRyoPXlwhD9RIjDLTu764do9cGjI3M9hCvI/TBqIjZq+bY7/3fn8QiwcmtDLmQtat5oTKPY0SXDubeAqpQETSGX4ZPtDApHUGkuwpXHQLGCQZfdXPbgZYp3J48jvJFStnsSLfE7SawEZU7WBy7BtIKGk+m3nVbwm2Z5nlAEdX8AuKMzJXumJ0mH87KeF+RRk09MJahSXtW0CFXhZaY1iEl8UxlZYaYKRMZd/1Nzh28CHVt9n4tAZag/V0qSzxGrtr+moQ1+0uJgOAAK8WSpZ/78V7PeDdoiWxmB0i90J2Jf+PlMYAQ=="}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":480,"cache_read_input_tokens":65309,"output_tokens":350,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":480,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":350,"cache_read_input_tokens":65309,"cache_creation_input_tokens":480,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":480},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmKDa9aG3AuyP9ACsQkL","type":"assistant","uuid":"1671da0f-9c69-4d1c-9c9f-c45df9a8bc04","timestamp":"2026-08-06T10:11:34.669Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian/sandbox/voice-chat","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"1671da0f-9c69-4d1c-9c9f-c45df9a8bc04","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmKDcMXuRr6uzHzK6MQs","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01KGSUxf1a5VteHnoE8qkkvA","name":"Bash","input":{"command":"cd /mnt/ssd/data/Dropbox/adrian/sandbox/voice-chat && python3 -c \"\nimport json, time\nrow = {'id': 'd03e7fcb8cc4494d8cb4e0c1678586cf', 'reply': 'Sì, ti sento. E confermo anche che voice.privcloud.dev è su, l\\'ho appena controllato.', 'ts_reply': time.time()}\nwith open('runtime/outbox.jsonl', 'a') as f:\n f.write(json.dumps(row, ensure_ascii=False) + '\\n')\n\"\n","description":"Reply to voice-chat \"Mi senti?\" via outbox.jsonl"},"caller":{"type":"direct"}}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":480,"cache_read_input_tokens":65309,"output_tokens":350,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":480,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":350,"cache_read_input_tokens":65309,"cache_creation_input_tokens":480,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":480},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmKDa9aG3AuyP9ACsQkL","type":"assistant","uuid":"f0d498ae-ea3e-42d1-bdd5-a73ec2aafe12","timestamp":"2026-08-06T10:11:36.649Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian/sandbox/voice-chat","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"f0d498ae-ea3e-42d1-bdd5-a73ec2aafe12","isSidechain":false,"promptId":"17c0a14b-77a8-4494-851b-478092e286c3","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01KGSUxf1a5VteHnoE8qkkvA","type":"tool_result","content":"(Bash completed with no output)","is_error":false}]},"uuid":"f199cf9c-eb18-4c33-9421-83ced1d0e032","timestamp":"2026-08-06T10:11:36.745Z","toolUseResult":{"stdout":"","stderr":"","interrupted":false,"isImage":false,"noOutputExpected":false},"sourceToolAssistantUUID":"f0d498ae-ea3e-42d1-bdd5-a73ec2aafe12","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian/sandbox/voice-chat","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"f199cf9c-eb18-4c33-9421-83ced1d0e032","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmKDyT3Cqt4jJvA3hRog","type":"message","role":"assistant","content":[{"type":"text","text":"Risposto a Mauro via voice-chat (\"Sì, ti sento\" + conferma che voice.privcloud.dev è su)."}],"stop_reason":"end_turn","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":365,"cache_read_input_tokens":65789,"output_tokens":46,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":365,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":46,"cache_read_input_tokens":65789,"cache_creation_input_tokens":365,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":365},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmKDxA9kLStnk4mMK7iS","type":"assistant","uuid":"6c34835d-ee18-473f-81a4-0e75f7626719","timestamp":"2026-08-06T10:11:38.531Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian/sandbox/voice-chat","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"type":"queue-operation","operation":"enqueue","timestamp":"2026-08-06T10:11:57.503Z","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","content":"ok a posto!"}
{"type":"queue-operation","operation":"dequeue","timestamp":"2026-08-06T10:11:57.569Z","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01"}
{"parentUuid":"6c34835d-ee18-473f-81a4-0e75f7626719","isSidechain":false,"promptId":"c2d68ca7-7556-4132-a4bb-9eb84a7f19ac","type":"user","message":{"role":"user","content":"ok a posto!"},"uuid":"f750080e-3685-4bfd-8723-c5b01ddda36b","timestamp":"2026-08-06T10:11:57.575Z","permissionMode":"acceptEdits","origin":{"kind":"human"},"promptSource":"sdk","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"type":"file-history-snapshot","messageId":"f750080e-3685-4bfd-8723-c5b01ddda36b","snapshot":{"messageId":"f750080e-3685-4bfd-8723-c5b01ddda36b","trackedFileBackups":{},"timestamp":"2026-08-06T10:11:57.580Z"},"isSnapshotUpdate":false}
{"type":"last-prompt","lastPrompt":"ok a posto!","leafUuid":"f750080e-3685-4bfd-8723-c5b01ddda36b","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01"}
{"type":"ai-title","aiTitle":"Continuare sessione modalità voice webapp","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01"}
{"parentUuid":"f750080e-3685-4bfd-8723-c5b01ddda36b","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmKFZqXbkt4fXL7wKMYc","type":"message","role":"assistant","content":[{"type":"text","text":"Bene, tutto confermato — voice-chat funziona sia in locale che dall'esterno. Se hai altro, sono qui."}],"stop_reason":"end_turn","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":54,"cache_read_input_tokens":66154,"output_tokens":46,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":54,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":46,"cache_read_input_tokens":66154,"cache_creation_input_tokens":54,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":54},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmKFUX41wug5g16Gr7wr","type":"assistant","uuid":"5ef6ea08-f08d-488d-a22b-fb85a74b0ca6","timestamp":"2026-08-06T10:12:00.903Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"type":"queue-operation","operation":"enqueue","timestamp":"2026-08-06T10:12:42.177Z","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","content":"Vorrei tornare a lavorare un pò a Powerbricks (directory sandbox)"}
{"type":"queue-operation","operation":"dequeue","timestamp":"2026-08-06T10:12:42.234Z","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01"}
{"parentUuid":"5ef6ea08-f08d-488d-a22b-fb85a74b0ca6","isSidechain":false,"promptId":"e0ae35de-1d97-4180-a9ef-0448334c674f","type":"user","message":{"role":"user","content":"Vorrei tornare a lavorare un pò a Powerbricks (directory sandbox)"},"uuid":"cf9bffc6-0684-4a43-858d-687207404c54","timestamp":"2026-08-06T10:12:42.244Z","permissionMode":"acceptEdits","origin":{"kind":"human"},"promptSource":"sdk","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"type":"file-history-snapshot","messageId":"cf9bffc6-0684-4a43-858d-687207404c54","snapshot":{"messageId":"cf9bffc6-0684-4a43-858d-687207404c54","trackedFileBackups":{},"timestamp":"2026-08-06T10:12:42.250Z"},"isSnapshotUpdate":false}
{"parentUuid":"cf9bffc6-0684-4a43-858d-687207404c54","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmKJoCHRMVHQiawhmRsy","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"EssCCokBCBAYAipAuS6USJ9he+bExCQwBmtRIUu4xynRVJ0hHUsBo4KlK5J+Ip5yBcaEgFN4l7NZy7l9TX/6SRWsEVSCYDJVcB7LIzIPY2xhdWRlLXNvbm5ldC01OABCCHRoaW5raW5nWiQzZDFjY2UyZS0wNjY0LTQwZDYtODQxNC1iN2U1MjhhY2UyYjESDLx/sfVL8qE+rA/EixoMhPGxWXkbhnyDWE9eIjBARQC+SPErmdpvASo42Q2VihnH5y9wH8UVoJ3MKINR+DZYJ3cFCbagiLNuzCn4jZwqb3U/xG+6QOyl1WaJwnHFChuZ4A2dRKHF55Hlavb0UyuXYmQ213D7v68zyk5Yg6YFDcg8fZNW4ryeI2D10KqspIV352KtJ/UJdOvYe14mVGD93DAIeF6GcoXukStBa0uYlfrSEb+aS2eI7RYr9+FylxgB"}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":79,"cache_read_input_tokens":66208,"output_tokens":288,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":79,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":288,"cache_read_input_tokens":66208,"cache_creation_input_tokens":79,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":79},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmKJmPPqi5XZrEa73qZU","type":"assistant","uuid":"da4e869b-1cfc-498a-ae16-ed70690f2e14","timestamp":"2026-08-06T10:12:44.425Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"da4e869b-1cfc-498a-ae16-ed70690f2e14","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmKJoCHRMVHQiawhmRsy","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01NneS6XCFgH4Fe3iriShKVc","name":"Read","input":{"file_path":"/mnt/ssd/data/Dropbox/adrian/archivio/Mauro/lavoro/lavoro-python-ecosistema/PowerBricks.md"},"caller":{"type":"direct"}}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":79,"cache_read_input_tokens":66208,"output_tokens":288,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":79,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":288,"cache_read_input_tokens":66208,"cache_creation_input_tokens":79,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":79},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmKJmPPqi5XZrEa73qZU","type":"assistant","uuid":"a1612d58-09ca-4fd6-880b-34cb5555e317","timestamp":"2026-08-06T10:12:44.952Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"a1612d58-09ca-4fd6-880b-34cb5555e317","isSidechain":false,"promptId":"e0ae35de-1d97-4180-a9ef-0448334c674f","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01NneS6XCFgH4Fe3iriShKVc","type":"tool_result","content":"1\t---\n2\tname: pyeco-powerbricks\n3\tdescription: \"PowerBricks — visual query builder per colleghi ICR non tecnici, seme di progetto dormiente (zero codice scritto, cartella originale eliminata da PYTHON/ il 04/08/2026)\"\n4\tmetadata:\n5\t type: project\n6\t---\n7\t\n8\tSeme di progetto (da metà luglio 2026, non ancora in costruzione attiva) — query builder visuale (Blockly, stile Scratch) che traduce blocchi in SQL su DuckDB/Parquet, per colleghi non tecnici. **Oggi non esiste alcuna traccia in `PYTHON/`** — viveva come modulo dentro `PYTHON/MyICR_Suite/app/modules/powerbricks/` (specifica + dizionario dati, zero file `.py`), eliminato il 04/08/2026 (vedi sotto). Tutto il materiale storico vive solo qui, in `PowerBricks-raw/`.\n9\t\n10\t**Migrazione 04/08/2026 — completata**: la cartella originale in `PYTHON/` (e lo skill `/nlquery` associato) sono stati eliminati (commit `9937a81` nel repo `MyICR_Suite`). Copia grezza completa salvata in `PowerBricks-raw/` (stessa cartella di questo file) — ancora da scremare, nessuna sintesi/selezione fatta, contiene anche materiale scartabile (query di test .sql/.csv/.xlsx). Trattarla come bidone raw, non come fonte curata.\n11\t\n12\t- **Specifica tecnica ufficiale**: `PowerBricks-raw/PowerBricks_Specifiche.md` (26/06/2026) + `PowerBricks-raw/CLAUDE.md` (stato implementativo) — architettura, 4 domini (anagrafica/emesso/diritti/boxoffice), motore di join, vincoli, sequenza di sviluppo.\n13\t- **Dizionario dati**: `PowerBricks-raw/NL_semantic_layer/NL_QUERY_SCHEMA.md` + `NL_QUERY_PATTERNS.md` — condiviso col ramo sperimentale NL query (vedi [[data-expert]], sezione \"Due binari\"). **Era in uso attivo dallo skill `/nlquery`** (copiato anche lui in `PowerBricks-raw/nlquery-skill.md`, path interno già rotto — puntava a `datawarehouse/`, cartella mai esistita) — con l'eliminazione dell'originale in `PYTHON/`, lo skill smette di funzionare finché qualcuno non lo ricrea puntando qui o altrove.\n14\t- **Posizionamento strategico** (chi sa cosa, rischio AllRights, ruoli): [[lavoro-progetti-strumenti]], paragrafo PowerBricks.\n15\t- **Business logic dati as-is**: [[data-expert]] — non l'architettura app, quella è sopra.\n16\t\n17\t## Discrepanza nota, non ancora risolta\n18\t\n19\t`agenda.md` (file sciolto in `PYTHON/`, recuperato e poi eliminato il 04/08/2026) conteneva un'idea di dominio di partenza **dinamico** (\"il sistema suggerisce quello con più filtri attivi, l'utente può sovrascrivere tra anagrafica/emesso/diritti/boxoffice\") — diversa dal perno **fisso** su Anagrafica della specifica ufficiale (`PowerBricks_Specifiche.md` §4). Verificato con Mauro (04/08/2026): non una decisione deliberata di rivedere la specifica, \"probabilmente riflessioni in tempi diversi\" mai confrontate col documento ufficiale. **Trattare il perno fisso su Anagrafica come corrente** finché Mauro non decide esplicitamente di rivederlo.\n20\t\n21\tAltro dettaglio da `agenda.md`, non nella specifica ufficiale, di stato incerto (idea viva o superata? non verificato):\n22\t- **Output base**: una lista di `rifer` passata a Linker, che renderizza autonomamente le informazioni associate.\n23\t\n24\t## Doppia modalità blocchi + pseudo-linguaggio — confermata idea viva (04/08/2026)\n25\t\n26\t`[CONFERMATO]` — GUI a blocchi per l'utente base + pseudo-linguaggio testuale generato in parallelo, sincronizzato, per l'utente avanzato (modificare l'uno aggiorna l'altro) — parentesi tonde per l'ordine di esecuzione (es. `(emesso AND diritti) OR anagrafica`). Era già in `agenda.md` (30/07 circa) ma segnata \"stato incerto\" — Mauro ci è arrivato di nuovo in modo indipendente il 04/08/2026 ragionando sul problema dei blocchi che diventano ingombranti con query complesse: non è un'idea abbandonata, è il suo pensiero corrente.\n27\t\n28\t**Perché risolve un problema reale**: i blocchi visuali (Blockly) funzionano bene per composizioni semplici ma scalano male con 3+ domini incatenati e filtri incrociati (l'albero diventa grande e annidato quanto una query SQL, solo più lento da comporre col mouse). Pattern collaudato altrove, non speculativo — Power Query in Excel fa esattamente questo (passi visuali ↔ editor avanzato in linguaggio M): chi resta sul caso semplice non tocca mai il testo, chi ha una domanda complessa scrive direttamente. Vantaggio aggiuntivo per il pubblico ICR: uno pseudo-linguaggio con parentesi è più vicino all'alfabetizzazione da formula Excel (che molti colleghi già hanno) che alla programmazione vera — punto intermedio tra \"troppo tecnico\" e \"troppo limitato\".\n29\t\n30\t**Vocabolario di partenza già esistente**: `NL_QUERY_PATTERNS.md` (ramo NL, `PowerBricks-raw/`) ha già le regole interpretative che i colleghi userebbero naturalmente (es. \"film italiano\" → `tipologia='FILM'` + `paesi_produzione1/2/3='I'`) — non riusabile come processo (i due binari restano separati), ma riusabile come lessico per progettare la palette di blocchi/le parole chiave dello pseudo-linguaggio, senza reinventare da zero cosa intendono i colleghi per \"prime time\" o \"film italiano\".\n31\t\n32\t## Strategia di partenza — prototipo minimo, due passi (04/08/2026)\n33\t\n34\t`[CONFERMATO]` — prima di affrontare i 4 domini, salire per gradi:\n35\t\n36\t1. **Solo Anagrafica, zero join** — valida il meccanismo base dell'interfaccia (trascinamento campi, composizione filtri, risultati) senza nessuna complessità sopra.\n37\t2. **+ Emesso**, primo dominio vero aggiunto — non boxoffice (scartato: tabella marginale nel lavoro reale ICR, dati cinema tangenziali al cuore diritti/palinsesto; un prototipo che funziona su una tabella che nessuno usa non dimostra granché). Emesso porta con sé un problema reale da affrontare subito, non rimandabile: relazione **1:molti** con Anagrafica (un prodotto/edizione può avere decine/centinaia di righe, una per trasmissione, anche a distanza di anni) — quindi tre forme diverse della stessa domanda (\"quando è andato in onda\"): prima emissione, ultima emissione, tutte le emissioni. Richiede una scelta di aggregazione (min/max/nessuna) che l'interfaccia deve esporre esplicitamente — non un dettaglio rimandabile, perché la stessa scelta si ripresenterà identica con Diritti (un prodotto può avere più contratti nel tempo). Vale la pena progettarla bene una volta qui.\n38\t\n39\tDiritti resta per un terzo giro, quando l'interfaccia avrà già dimostrato di reggere sia il caso base sia la scelta di aggregazione. Risponde parzialmente alla domanda \"che perimetro ha la v1\" sotto — non definitiva, ma un punto di partenza concreto.\n40\t\n41\t**Decisione di design (05/08/2026) — colore dei blocchi per dominio**: quando si aggiungeranno Emesso/Diritti/Boxoffice, ogni dominio avrà la propria famiglia di colori per i blocchi (non tutti rossi come oggi solo-Anagrafica) — aiuta a distinguere a colpo d'occhio la provenienza di un blocco quando più domini convivranno nello stesso canvas. Non ancora implementato (oggi esiste solo Anagrafica): da definire in dettaglio quando si costruisce il passo 2.\n42\t\n43\t## Prototipo passo 1 — in corso (05/08/2026)\n44\t\n45\t`[CONFERMATO]` — sandbox creata in `Dropbox/adrian/sandbox/powerbricks/` (repo principale `adrian`, non sotto `PYTHON/` — scrivibile anche da Nave, sync via Dropbox+git). Commit `6cad2b5`.\n46\t\n47\t**Stack effettivo, allineato a MediaTrack** (non quello ipotizzato nelle prime bozze di questa conversazione, poi corrette): Flask + `pywebview` (finestra desktop nativa, non browser) + DuckDB in-memory + Blockly nel frontend. Stesso pattern di `PYTHON/MyICR_Suite/app/modules/mediatrack/run.py`, dichiarato modello di riferimento in `MyICR_Suite/CLAUDE.md`.\n48\t\n49\t**Dati**: legge davvero `PYTHON/MyICR_Suite/local_db/parquet/prodotti.parquet` (226.431 righe, sola lettura, path relativo `../../PYTHON/...` — stesso su Nave e Ufficio) — non un mock. Campi esposti nel passo 1: `prodotto`, `titolo_italiano`, `titolo_originale`, `anno_produzione`, `tipologia`, `genere1`, `paesi_produzione1`, `veg`, `durata`.\n50\t\n51\t**Verificato da Nave**: backend Flask/DuckDB testato end-to-end via `test_client()` (filtri equals/contains/gt/gte su dati reali, validazione campo non valido → 400) — funziona. **Non ancora verificato**: il meccanismo a blocchi Blockly nel browser/finestra pywebview — Nave è headless, serve un display reale (PC ufficio, o sessione con GUI) per aprire `python run.py` e trascinare i blocchi davvero.\n52\t\n53\t**Aggiornamento 05/08/2026 — validato**: Mauro ha lanciato `run.bat` su PC ufficio, la finestra pywebview si apre correttamente (commit `b325739` per il bat di lancio). Meccanismo base considerato confermato.\n54\t\n55\t**Decisione 05/08/2026 — fase di test prima di Emesso**: Mauro ha voluto approfondire limiti e potenzialità della sola Anagrafica prima di passare al passo 2 (espressività filtri, tenuta con molti campi/filtri, usabilità dei blocchi con query complesse — \"un po' tutto\"). Ampliato di conseguenza il prototipo (commit `7c5b582`): blocco `pb_gruppo` AND/OR annidabile (prima solo AND flat), operatori estesi (`not_equals`, `contains`, `between`, `is_null`/`is_not_null`), tutti i 25 campi di `prodotti.parquet` filtrabili (prima 9). Verificato su dati reali via `test_client()` da Nave prima del test umano.\n56\t\n57\t**Esito test umano su Ufficio (05/08/2026)**: Mauro ha provato di persona i nuovi blocchi (gruppi annidati inclusi) — giudizio: **\"va MOLTO bene, mi sembra sia la strada giusta\"**. Non una semplice conferma funzionale come il primo giro (`run.bat` che apre la finestra): qui il meccanismo a blocchi è stato messo sotto sforzo con query più elaborate e ha retto bene, secondo l'uso reale che ne farebbe un collega.\n58\t\n59\t**Tre tentativi sull'output selezionabile, tutti scartati (05/08/2026)**: checkbox HTML → doppio elenco stile Access con frecce → blocco Blockly nativo (`field_checkbox`) + categorie toolbox. Giudizio di Mauro: \"stai complicando inutilmente\" — rollback a `git checkout 7c5b582 --` (output tornato a SELECT fissa) per fermarsi e riflettere prima di continuare a iterare da soli.\n60\t\n61\t**Riflessione che ha rimesso in discussione Blockly stesso**: la fatica nel far entrare la selezione output nel linguaggio a blocchi ha fatto notare a Mauro (Access power-user da una vita) che il modello mentale giusto per i colleghi non è il suo — e che Blockly porta con sé la metafora \"blocchi di programmazione per bambini\" (eredità Scratch/App Inventor/Code.org), non quella di un filtro per un pubblico alfabetizzato su Excel. Confronto MS Access / Power BI: entrambi risolvono la selezione campi con **un pannello dedicato e persistente**, separato dal canvas di composizione della logica (Access: trascina campi in una griglia QBE; Power BI: checkbox in un pannello Campi fisso) — non un widget minore infilato dentro il flusso.\n62\t\n63\t**Tentativo intermedio (05/08/2026) — WHERE su jQuery QueryBuilder, poi scartato**: libreria MIT dedicata a righe campo/operatore/valore + gruppi AND/OR annidabili (via CDN, jQuery+Bootstrap 5, nessun build step) — risolveva bene il disagio \"blocchi da bambini\". Ma **feedback di Mauro**: con QueryBuilder l'effetto \"PowerBricks\" (l'identità visiva a mattoncini che dà il nome al prodotto) si perdeva completamente — un compromesso peggiore del problema che si voleva risolvere. Commit `ea40579`.\n64\t\n65\t**Secondo tentativo (05/08/2026) — Blockly con renderer Zelos, poi anche questo accantonato**: tornato Blockly per la WHERE con renderer Zelos (Scratch/MakeCode, blocchi più chunky) per mitigare il disagio \"programmazione per bambini\" senza perdere l'identità a mattoncini. Commit `b94c84e`. Valutati anche i limiti reali di Blockly in questo giro: nessun vincolo di licenza/manutenzione (Apache 2.0, Google), unico limite non aggirabile l'accessibilità (drag&drop mouse-centrico, tastiera sperimentale, no screen reader) — non bloccante per un tool interno.\n66\t\n67\t**Reset esplicito (05/08/2026)**: dopo tutto questo andirivieni (output selezionabile in tre forme, poi QueryBuilder, poi Zelos), Mauro ha chiesto di **ripartire esattamente dalla versione \"molto convinto\"** invece di continuare a iterare sulle varianti successive. Ripristinato `git checkout 7c5b582 --`: stato identico al commit validato con entusiasmo — gruppi AND/OR annidati, tutti i 25 campi filtrabili, Blockly renderer default, output a SELECT fissa (nessuna selezione campi). Commit `488c56d`. **Tutto il lavoro su output/QueryBuilder/Zelos è accantonato**, non in backlog da riprendere automaticamente — se si riaffronta il tema, si riparte con occhi diversi, non dagli ultimi tentativi fatti oggi.\n68\t\n69\t**Soluzione trovata (05/08/2026) — modale a doppio click, VALIDATA**: ripartendo dal punto \"molto convinto\", nuova idea per l'output: doppio click sul blocco \"Query Anagrafica\" apre un modale HTML col doppio elenco disponibili/selezionati (frecce sposta/riordina) — il canvas Blockly resta pulito, solo filtri, identità \"a mattoncini\" intatta; la selezione si salva su `block.data` (serializzato automaticamente da Blockly, nessuna persistenza custom). Meccanica: estensione Blockly `pb_query_output_modal` con listener DOM `dblclick` su `block.getSvgRoot()`. Commit `9611e5d`. **Mauro ha testato su Ufficio e confermato: \"il meccanismo mi piace\"** — validato, non solo funzionante.\n70\t\n71\t**Stato complessivo passo 1**: sia il meccanismo filtri (blocchi + gruppi AND/OR) sia la selezione output (modale a doppio click) sono ora validati con convinzione da Mauro. Nessuna azione pendente sul frontend.\n72\t\n73\t**Prossimo passo concreto**: passo 2 — aggiungere Emesso, affrontare la scelta di aggregazione prima/ultima/tutte (relazione 1:molti con Anagrafica, vedi sezione sopra) — oppure ulteriori test sull'Anagrafica se Mauro preferisce continuare a esplorare prima di allargare il perimetro.\n74\t\n75\t## Passo 2 — Emesso, prima implementazione (05/08/2026)\n76\t\n77\t`[CONFERMATO]` — implementato come previsto: blocco `pb_emesso` (join su `prodotto`+`edizione`, LEFT JOIN sempre) con dropdown aggregazione prima/ultima/tutte. Per prima/ultima uso una window function che restituisce la riga intera dell'emissione (non solo la data) — scelta più utile del semplice MIN/MAX. \"Tutte\" cambia la cardinalità del risultato (una riga per emissione). Nessun filtro sui campi Emesso in questo giro, solo aggregazione + output selezionabile (stesso modale a doppio click del passo 1, generalizzato per riusarlo su entrambi i blocchi).\n78\t\n79\tVerificato su dati reali da Nave: query sotto il secondo anche con la window function su 8,8M righe di `emesso.parquet`. Dettaglio tecnico completo in `sandbox/powerbricks/CLAUDE.md`, sezione \"Passo 2 — Emesso\".\n80\t\n81\t**Colore dominio**: seguendo la decisione di design già registrata sopra, `pb_emesso` è ambra/oro (`#F9A825`) — un solo blocco per ora, distinto dal rosso di Anagrafica; una famiglia completa (medio/chiaro) si definirà quando arriveranno altri blocchi Emesso-specifici (es. filtri).\n82\t\n83\t**Validato su Ufficio (05/08/2026)**: Mauro ha provato il blocco Emesso di persona — \"Molto bene\". Tag `powerbricks-checkpoint-emesso-05082026` sul commit validato.\n84\t\n85\t**Richiesta successiva (05/08/2026) — Emesso reso flessibile quanto Anagrafica**: subito dopo la validazione, Mauro ha chiesto che Emesso avesse WHERE oltre a SELECT (fin lì solo aggregazione + campi in output). Aggiunti `pb_filtro_emesso`/`pb_gruppo_emesso` (stessa logica di `pb_filtro`/`pb_gruppo`), agganciati in un nuovo slot filtri dentro `pb_emesso`. Backend generalizzato per tabella (`_build_filtro`/`_build_where` parametrici su `fields_dict`/`table_alias` invece di hardcoded su Anagrafica). I filtri Emesso si applicano dentro la subquery, prima di scegliere prima/ultima emissione. Dettaglio tecnico completo in `sandbox/powerbricks/CLAUDE.md`. Verificato su dati reali da Nave.\n86\t\n87\t**Sganciamento `pb_query`/`pb_emesso` (05/08/2026)**: Mauro ha corretto l'impostazione — non voleva `pb_emesso` nidificato dentro `pb_query` (slot \"Emesso opzionale\"), ma **due blocchi container indipendenti sulla lavagna**, \"Query Anagrafica\" e \"Query Emesso\", che viaggiano separati. La join resta implicita (fissa su `prodotto`+`edizione`, nessuna scelta esplicita) — Mauro ha segnalato che in futuro potrebbe arrivare un blocco \"ponte\" per definire il tipo di join, ma non è una priorità ora. Backend invariato (join implicita già uguale), solo il frontend cambia: `getEmessoConfig(workspace)` cerca `pb_emesso` ovunque sulla lavagna invece di leggerlo da uno slot annidato.\n88\t\n89\t**Spunto valutato e accantonato — gruppo AND/OR agnostico**: Mauro ha chiesto se il blocco \"gruppo\" potesse essere unico per tutti i domini (colore neutro) invece di duplicato (`pb_gruppo`/`pb_gruppo_emesso`). Risposta: tecnicamente possibile, ma la duplicazione oggi non è decorativa — è ciò che garantisce via `check` Blockly che un gruppo Anagrafica non finisca nello slot Emesso (o viceversa), impedendolo all'incastro invece di scoprirlo come errore a runtime. Un blocco generico romperebbe questa garanzia, a meno di un check dinamico (più codice). **Deciso: restare semplice**, due blocchi distinti, non implementato.\n90\t\n91\t**Rinomina + aggregazione rimandata (05/08/2026)**: Mauro ha chiarito che i blocchi si chiamano meglio \"Tabella Anagrafica\"/\"Tabella Emesso\" (dichiarano una tabella, non una query completa) e che l'aggregazione (prima/ultima/tutte) va tenuta separata dal blocco tabella — sarà un blocco a sé in uno step successivo, non integrata in \"Tabella Emesso\". Rinominati i blocchi, rimosso il dropdown aggregazione dal frontend; il backend resta pronto (default \"tutte\" quando l'aggregazione non è specificata, la logica prima/ultima via window function è invariata in attesa del futuro blocco).\n92\t\n93\t**Gotcha reale trovato da Mauro testando (05/08/2026) — LEFT JOIN nascondeva il filtro Emesso**: con LEFT JOIN sempre attiva, un filtro su Emesso (es. rete=I1) non restringeva i prodotti Anagrafica — chi non corrispondeva usciva comunque, solo con le colonne Emesso a NULL. Fix: INNER JOIN quando ci sono filtri Emesso (un filtro deve restringere), LEFT quando non ce ne sono (Emesso arricchisce senza restringere). Verificato su dati reali (tipologia=FILM): senza filtri 471.494 righe (52.215 NULL, LEFT corretto); con rete=I1, 30.690 righe zero NULL (INNER corretto).\n94\t\n95\t**Blocco ponte esplicito `pb_join` (05/08/2026)**: la regola automatica sopra non copriva un caso legittimo — \"mostrami tutti i prodotti, e se disponibile mostrami solo l'emissione su rete X\" (LEFT + filtro solo per la visualizzazione). Aggiunto un blocco indipendente e facoltativo \"Join Anagrafica ↔ Emesso\" con tendina Automatico/LEFT forzato/INNER forzato, colore neutro grigio (è un ponte tra domini, non appartiene a una tabella). Se assente, vale la regola automatica di prima. Verificato tutti e tre i casi su dati reali, conteggi coerenti tra loro.\n96\t\n97\t**Stato attuale**: due domini (Anagrafica, Emesso) entrambi con WHERE+SELECT completi, blocchi \"Tabella\" container indipendenti, join di default automatica (INNER-se-filtri-altrimenti-LEFT) con possibilità di forzarla esplicitamente via `pb_join`, nessuna aggregazione nel frontend (rimandata). **Non ancora testato visivamente su Ufficio** il blocco ponte.\n98\t\n99\t## Domande aperte non ancora affrontate\n100\t\n101\t(da `PowerBricks_dossier.md`, dossier Elon 13/07/2026, recuperato e poi eliminato il 04/08/2026 — nessuna risposta trovata né nell'archivio né nella specifica ufficiale)\n102\t- Perimetro della v1: quali dei 4 domini entrano subito, quali no.\n103\t- Dove si ferma la logica diritti nella prima versione — è il pezzo più costoso, farla tutta subito rischia di non finire mai.\n104\t- Se e quando PowerBricks toccherà il territorio AllRights — decisione strategica, non tecnica.\n105\t- Cosa rende \"fatto bene\" questo progetto, dato che non è stato commissionato da nessuno e quindi nessuno darà il criterio di completamento dall'esterno.\n106\t\n107\t## Scorporo da MyICR_Suite — superato dagli eventi\n108\t\n109\tSpunto emerso il 04/08/2026: dato che la specifica dichiarava PowerBricks come consumer esterno del layer semantico (\"lo usa come dipendenza, non lo ingloba\"), scorporarlo in una cartella propria sotto `PYTHON/` (coerente con \"un repo per progetto\") aveva senso concettuale. Nel frattempo, stesso giorno, Mauro ha deciso di eliminare la cartella del tutto invece di scorporarla — quindi la domanda non si pone più nei termini originali: non c'è più nulla da scorporare da MyICR_Suite. Se e quando l'implementazione ripartirà, ripartirà da zero, e a quel punto la scelta \"modulo dentro MyICR_Suite vs progetto a sé sotto `PYTHON/`\" si potrà fare direttamente in partenza, senza vincoli ereditati.\n110\t\n111\tVedi [[_i_lavoro-python-ecosistema|lavoro-python-ecosistema]] per il quadro d'insieme.\n112\t"}]},"uuid":"fbc52a64-1ae5-48f5-a4be-4bf4a3b2f08e","timestamp":"2026-08-06T10:12:44.983Z","toolUseResult":{"type":"text","file":{"filePath":"/mnt/ssd/data/Dropbox/adrian/archivio/Mauro/lavoro/lavoro-python-ecosistema/PowerBricks.md","content":"---\nname: pyeco-powerbricks\ndescription: \"PowerBricks — visual query builder per colleghi ICR non tecnici, seme di progetto dormiente (zero codice scritto, cartella originale eliminata da PYTHON/ il 04/08/2026)\"\nmetadata:\n type: project\n---\n\nSeme di progetto (da metà luglio 2026, non ancora in costruzione attiva) — query builder visuale (Blockly, stile Scratch) che traduce blocchi in SQL su DuckDB/Parquet, per colleghi non tecnici. **Oggi non esiste alcuna traccia in `PYTHON/`** — viveva come modulo dentro `PYTHON/MyICR_Suite/app/modules/powerbricks/` (specifica + dizionario dati, zero file `.py`), eliminato il 04/08/2026 (vedi sotto). Tutto il materiale storico vive solo qui, in `PowerBricks-raw/`.\n\n**Migrazione 04/08/2026 — completata**: la cartella originale in `PYTHON/` (e lo skill `/nlquery` associato) sono stati eliminati (commit `9937a81` nel repo `MyICR_Suite`). Copia grezza completa salvata in `PowerBricks-raw/` (stessa cartella di questo file) — ancora da scremare, nessuna sintesi/selezione fatta, contiene anche materiale scartabile (query di test .sql/.csv/.xlsx). Trattarla come bidone raw, non come fonte curata.\n\n- **Specifica tecnica ufficiale**: `PowerBricks-raw/PowerBricks_Specifiche.md` (26/06/2026) + `PowerBricks-raw/CLAUDE.md` (stato implementativo) — architettura, 4 domini (anagrafica/emesso/diritti/boxoffice), motore di join, vincoli, sequenza di sviluppo.\n- **Dizionario dati**: `PowerBricks-raw/NL_semantic_layer/NL_QUERY_SCHEMA.md` + `NL_QUERY_PATTERNS.md` — condiviso col ramo sperimentale NL query (vedi [[data-expert]], sezione \"Due binari\"). **Era in uso attivo dallo skill `/nlquery`** (copiato anche lui in `PowerBricks-raw/nlquery-skill.md`, path interno già rotto — puntava a `datawarehouse/`, cartella mai esistita) — con l'eliminazione dell'originale in `PYTHON/`, lo skill smette di funzionare finché qualcuno non lo ricrea puntando qui o altrove.\n- **Posizionamento strategico** (chi sa cosa, rischio AllRights, ruoli): [[lavoro-progetti-strumenti]], paragrafo PowerBricks.\n- **Business logic dati as-is**: [[data-expert]] — non l'architettura app, quella è sopra.\n\n## Discrepanza nota, non ancora risolta\n\n`agenda.md` (file sciolto in `PYTHON/`, recuperato e poi eliminato il 04/08/2026) conteneva un'idea di dominio di partenza **dinamico** (\"il sistema suggerisce quello con più filtri attivi, l'utente può sovrascrivere tra anagrafica/emesso/diritti/boxoffice\") — diversa dal perno **fisso** su Anagrafica della specifica ufficiale (`PowerBricks_Specifiche.md` §4). Verificato con Mauro (04/08/2026): non una decisione deliberata di rivedere la specifica, \"probabilmente riflessioni in tempi diversi\" mai confrontate col documento ufficiale. **Trattare il perno fisso su Anagrafica come corrente** finché Mauro non decide esplicitamente di rivederlo.\n\nAltro dettaglio da `agenda.md`, non nella specifica ufficiale, di stato incerto (idea viva o superata? non verificato):\n- **Output base**: una lista di `rifer` passata a Linker, che renderizza autonomamente le informazioni associate.\n\n## Doppia modalità blocchi + pseudo-linguaggio — confermata idea viva (04/08/2026)\n\n`[CONFERMATO]` — GUI a blocchi per l'utente base + pseudo-linguaggio testuale generato in parallelo, sincronizzato, per l'utente avanzato (modificare l'uno aggiorna l'altro) — parentesi tonde per l'ordine di esecuzione (es. `(emesso AND diritti) OR anagrafica`). Era già in `agenda.md` (30/07 circa) ma segnata \"stato incerto\" — Mauro ci è arrivato di nuovo in modo indipendente il 04/08/2026 ragionando sul problema dei blocchi che diventano ingombranti con query complesse: non è un'idea abbandonata, è il suo pensiero corrente.\n\n**Perché risolve un problema reale**: i blocchi visuali (Blockly) funzionano bene per composizioni semplici ma scalano male con 3+ domini incatenati e filtri incrociati (l'albero diventa grande e annidato quanto una query SQL, solo più lento da comporre col mouse). Pattern collaudato altrove, non speculativo — Power Query in Excel fa esattamente questo (passi visuali ↔ editor avanzato in linguaggio M): chi resta sul caso semplice non tocca mai il testo, chi ha una domanda complessa scrive direttamente. Vantaggio aggiuntivo per il pubblico ICR: uno pseudo-linguaggio con parentesi è più vicino all'alfabetizzazione da formula Excel (che molti colleghi già hanno) che alla programmazione vera — punto intermedio tra \"troppo tecnico\" e \"troppo limitato\".\n\n**Vocabolario di partenza già esistente**: `NL_QUERY_PATTERNS.md` (ramo NL, `PowerBricks-raw/`) ha già le regole interpretative che i colleghi userebbero naturalmente (es. \"film italiano\" → `tipologia='FILM'` + `paesi_produzione1/2/3='I'`) — non riusabile come processo (i due binari restano separati), ma riusabile come lessico per progettare la palette di blocchi/le parole chiave dello pseudo-linguaggio, senza reinventare da zero cosa intendono i colleghi per \"prime time\" o \"film italiano\".\n\n## Strategia di partenza — prototipo minimo, due passi (04/08/2026)\n\n`[CONFERMATO]` — prima di affrontare i 4 domini, salire per gradi:\n\n1. **Solo Anagrafica, zero join** — valida il meccanismo base dell'interfaccia (trascinamento campi, composizione filtri, risultati) senza nessuna complessità sopra.\n2. **+ Emesso**, primo dominio vero aggiunto — non boxoffice (scartato: tabella marginale nel lavoro reale ICR, dati cinema tangenziali al cuore diritti/palinsesto; un prototipo che funziona su una tabella che nessuno usa non dimostra granché). Emesso porta con sé un problema reale da affrontare subito, non rimandabile: relazione **1:molti** con Anagrafica (un prodotto/edizione può avere decine/centinaia di righe, una per trasmissione, anche a distanza di anni) — quindi tre forme diverse della stessa domanda (\"quando è andato in onda\"): prima emissione, ultima emissione, tutte le emissioni. Richiede una scelta di aggregazione (min/max/nessuna) che l'interfaccia deve esporre esplicitamente — non un dettaglio rimandabile, perché la stessa scelta si ripresenterà identica con Diritti (un prodotto può avere più contratti nel tempo). Vale la pena progettarla bene una volta qui.\n\nDiritti resta per un terzo giro, quando l'interfaccia avrà già dimostrato di reggere sia il caso base sia la scelta di aggregazione. Risponde parzialmente alla domanda \"che perimetro ha la v1\" sotto — non definitiva, ma un punto di partenza concreto.\n\n**Decisione di design (05/08/2026) — colore dei blocchi per dominio**: quando si aggiungeranno Emesso/Diritti/Boxoffice, ogni dominio avrà la propria famiglia di colori per i blocchi (non tutti rossi come oggi solo-Anagrafica) — aiuta a distinguere a colpo d'occhio la provenienza di un blocco quando più domini convivranno nello stesso canvas. Non ancora implementato (oggi esiste solo Anagrafica): da definire in dettaglio quando si costruisce il passo 2.\n\n## Prototipo passo 1 — in corso (05/08/2026)\n\n`[CONFERMATO]` — sandbox creata in `Dropbox/adrian/sandbox/powerbricks/` (repo principale `adrian`, non sotto `PYTHON/` — scrivibile anche da Nave, sync via Dropbox+git). Commit `6cad2b5`.\n\n**Stack effettivo, allineato a MediaTrack** (non quello ipotizzato nelle prime bozze di questa conversazione, poi corrette): Flask + `pywebview` (finestra desktop nativa, non browser) + DuckDB in-memory + Blockly nel frontend. Stesso pattern di `PYTHON/MyICR_Suite/app/modules/mediatrack/run.py`, dichiarato modello di riferimento in `MyICR_Suite/CLAUDE.md`.\n\n**Dati**: legge davvero `PYTHON/MyICR_Suite/local_db/parquet/prodotti.parquet` (226.431 righe, sola lettura, path relativo `../../PYTHON/...` — stesso su Nave e Ufficio) — non un mock. Campi esposti nel passo 1: `prodotto`, `titolo_italiano`, `titolo_originale`, `anno_produzione`, `tipologia`, `genere1`, `paesi_produzione1`, `veg`, `durata`.\n\n**Verificato da Nave**: backend Flask/DuckDB testato end-to-end via `test_client()` (filtri equals/contains/gt/gte su dati reali, validazione campo non valido → 400) — funziona. **Non ancora verificato**: il meccanismo a blocchi Blockly nel browser/finestra pywebview — Nave è headless, serve un display reale (PC ufficio, o sessione con GUI) per aprire `python run.py` e trascinare i blocchi davvero.\n\n**Aggiornamento 05/08/2026 — validato**: Mauro ha lanciato `run.bat` su PC ufficio, la finestra pywebview si apre correttamente (commit `b325739` per il bat di lancio). Meccanismo base considerato confermato.\n\n**Decisione 05/08/2026 — fase di test prima di Emesso**: Mauro ha voluto approfondire limiti e potenzialità della sola Anagrafica prima di passare al passo 2 (espressività filtri, tenuta con molti campi/filtri, usabilità dei blocchi con query complesse — \"un po' tutto\"). Ampliato di conseguenza il prototipo (commit `7c5b582`): blocco `pb_gruppo` AND/OR annidabile (prima solo AND flat), operatori estesi (`not_equals`, `contains`, `between`, `is_null`/`is_not_null`), tutti i 25 campi di `prodotti.parquet` filtrabili (prima 9). Verificato su dati reali via `test_client()` da Nave prima del test umano.\n\n**Esito test umano su Ufficio (05/08/2026)**: Mauro ha provato di persona i nuovi blocchi (gruppi annidati inclusi) — giudizio: **\"va MOLTO bene, mi sembra sia la strada giusta\"**. Non una semplice conferma funzionale come il primo giro (`run.bat` che apre la finestra): qui il meccanismo a blocchi è stato messo sotto sforzo con query più elaborate e ha retto bene, secondo l'uso reale che ne farebbe un collega.\n\n**Tre tentativi sull'output selezionabile, tutti scartati (05/08/2026)**: checkbox HTML → doppio elenco stile Access con frecce → blocco Blockly nativo (`field_checkbox`) + categorie toolbox. Giudizio di Mauro: \"stai complicando inutilmente\" — rollback a `git checkout 7c5b582 --` (output tornato a SELECT fissa) per fermarsi e riflettere prima di continuare a iterare da soli.\n\n**Riflessione che ha rimesso in discussione Blockly stesso**: la fatica nel far entrare la selezione output nel linguaggio a blocchi ha fatto notare a Mauro (Access power-user da una vita) che il modello mentale giusto per i colleghi non è il suo — e che Blockly porta con sé la metafora \"blocchi di programmazione per bambini\" (eredità Scratch/App Inventor/Code.org), non quella di un filtro per un pubblico alfabetizzato su Excel. Confronto MS Access / Power BI: entrambi risolvono la selezione campi con **un pannello dedicato e persistente**, separato dal canvas di composizione della logica (Access: trascina campi in una griglia QBE; Power BI: checkbox in un pannello Campi fisso) — non un widget minore infilato dentro il flusso.\n\n**Tentativo intermedio (05/08/2026) — WHERE su jQuery QueryBuilder, poi scartato**: libreria MIT dedicata a righe campo/operatore/valore + gruppi AND/OR annidabili (via CDN, jQuery+Bootstrap 5, nessun build step) — risolveva bene il disagio \"blocchi da bambini\". Ma **feedback di Mauro**: con QueryBuilder l'effetto \"PowerBricks\" (l'identità visiva a mattoncini che dà il nome al prodotto) si perdeva completamente — un compromesso peggiore del problema che si voleva risolvere. Commit `ea40579`.\n\n**Secondo tentativo (05/08/2026) — Blockly con renderer Zelos, poi anche questo accantonato**: tornato Blockly per la WHERE con renderer Zelos (Scratch/MakeCode, blocchi più chunky) per mitigare il disagio \"programmazione per bambini\" senza perdere l'identità a mattoncini. Commit `b94c84e`. Valutati anche i limiti reali di Blockly in questo giro: nessun vincolo di licenza/manutenzione (Apache 2.0, Google), unico limite non aggirabile l'accessibilità (drag&drop mouse-centrico, tastiera sperimentale, no screen reader) — non bloccante per un tool interno.\n\n**Reset esplicito (05/08/2026)**: dopo tutto questo andirivieni (output selezionabile in tre forme, poi QueryBuilder, poi Zelos), Mauro ha chiesto di **ripartire esattamente dalla versione \"molto convinto\"** invece di continuare a iterare sulle varianti successive. Ripristinato `git checkout 7c5b582 --`: stato identico al commit validato con entusiasmo — gruppi AND/OR annidati, tutti i 25 campi filtrabili, Blockly renderer default, output a SELECT fissa (nessuna selezione campi). Commit `488c56d`. **Tutto il lavoro su output/QueryBuilder/Zelos è accantonato**, non in backlog da riprendere automaticamente — se si riaffronta il tema, si riparte con occhi diversi, non dagli ultimi tentativi fatti oggi.\n\n**Soluzione trovata (05/08/2026) — modale a doppio click, VALIDATA**: ripartendo dal punto \"molto convinto\", nuova idea per l'output: doppio click sul blocco \"Query Anagrafica\" apre un modale HTML col doppio elenco disponibili/selezionati (frecce sposta/riordina) — il canvas Blockly resta pulito, solo filtri, identità \"a mattoncini\" intatta; la selezione si salva su `block.data` (serializzato automaticamente da Blockly, nessuna persistenza custom). Meccanica: estensione Blockly `pb_query_output_modal` con listener DOM `dblclick` su `block.getSvgRoot()`. Commit `9611e5d`. **Mauro ha testato su Ufficio e confermato: \"il meccanismo mi piace\"** — validato, non solo funzionante.\n\n**Stato complessivo passo 1**: sia il meccanismo filtri (blocchi + gruppi AND/OR) sia la selezione output (modale a doppio click) sono ora validati con convinzione da Mauro. Nessuna azione pendente sul frontend.\n\n**Prossimo passo concreto**: passo 2 — aggiungere Emesso, affrontare la scelta di aggregazione prima/ultima/tutte (relazione 1:molti con Anagrafica, vedi sezione sopra) — oppure ulteriori test sull'Anagrafica se Mauro preferisce continuare a esplorare prima di allargare il perimetro.\n\n## Passo 2 — Emesso, prima implementazione (05/08/2026)\n\n`[CONFERMATO]` — implementato come previsto: blocco `pb_emesso` (join su `prodotto`+`edizione`, LEFT JOIN sempre) con dropdown aggregazione prima/ultima/tutte. Per prima/ultima uso una window function che restituisce la riga intera dell'emissione (non solo la data) — scelta più utile del semplice MIN/MAX. \"Tutte\" cambia la cardinalità del risultato (una riga per emissione). Nessun filtro sui campi Emesso in questo giro, solo aggregazione + output selezionabile (stesso modale a doppio click del passo 1, generalizzato per riusarlo su entrambi i blocchi).\n\nVerificato su dati reali da Nave: query sotto il secondo anche con la window function su 8,8M righe di `emesso.parquet`. Dettaglio tecnico completo in `sandbox/powerbricks/CLAUDE.md`, sezione \"Passo 2 — Emesso\".\n\n**Colore dominio**: seguendo la decisione di design già registrata sopra, `pb_emesso` è ambra/oro (`#F9A825`) — un solo blocco per ora, distinto dal rosso di Anagrafica; una famiglia completa (medio/chiaro) si definirà quando arriveranno altri blocchi Emesso-specifici (es. filtri).\n\n**Validato su Ufficio (05/08/2026)**: Mauro ha provato il blocco Emesso di persona — \"Molto bene\". Tag `powerbricks-checkpoint-emesso-05082026` sul commit validato.\n\n**Richiesta successiva (05/08/2026) — Emesso reso flessibile quanto Anagrafica**: subito dopo la validazione, Mauro ha chiesto che Emesso avesse WHERE oltre a SELECT (fin lì solo aggregazione + campi in output). Aggiunti `pb_filtro_emesso`/`pb_gruppo_emesso` (stessa logica di `pb_filtro`/`pb_gruppo`), agganciati in un nuovo slot filtri dentro `pb_emesso`. Backend generalizzato per tabella (`_build_filtro`/`_build_where` parametrici su `fields_dict`/`table_alias` invece di hardcoded su Anagrafica). I filtri Emesso si applicano dentro la subquery, prima di scegliere prima/ultima emissione. Dettaglio tecnico completo in `sandbox/powerbricks/CLAUDE.md`. Verificato su dati reali da Nave.\n\n**Sganciamento `pb_query`/`pb_emesso` (05/08/2026)**: Mauro ha corretto l'impostazione — non voleva `pb_emesso` nidificato dentro `pb_query` (slot \"Emesso opzionale\"), ma **due blocchi container indipendenti sulla lavagna**, \"Query Anagrafica\" e \"Query Emesso\", che viaggiano separati. La join resta implicita (fissa su `prodotto`+`edizione`, nessuna scelta esplicita) — Mauro ha segnalato che in futuro potrebbe arrivare un blocco \"ponte\" per definire il tipo di join, ma non è una priorità ora. Backend invariato (join implicita già uguale), solo il frontend cambia: `getEmessoConfig(workspace)` cerca `pb_emesso` ovunque sulla lavagna invece di leggerlo da uno slot annidato.\n\n**Spunto valutato e accantonato — gruppo AND/OR agnostico**: Mauro ha chiesto se il blocco \"gruppo\" potesse essere unico per tutti i domini (colore neutro) invece di duplicato (`pb_gruppo`/`pb_gruppo_emesso`). Risposta: tecnicamente possibile, ma la duplicazione oggi non è decorativa — è ciò che garantisce via `check` Blockly che un gruppo Anagrafica non finisca nello slot Emesso (o viceversa), impedendolo all'incastro invece di scoprirlo come errore a runtime. Un blocco generico romperebbe questa garanzia, a meno di un check dinamico (più codice). **Deciso: restare semplice**, due blocchi distinti, non implementato.\n\n**Rinomina + aggregazione rimandata (05/08/2026)**: Mauro ha chiarito che i blocchi si chiamano meglio \"Tabella Anagrafica\"/\"Tabella Emesso\" (dichiarano una tabella, non una query completa) e che l'aggregazione (prima/ultima/tutte) va tenuta separata dal blocco tabella — sarà un blocco a sé in uno step successivo, non integrata in \"Tabella Emesso\". Rinominati i blocchi, rimosso il dropdown aggregazione dal frontend; il backend resta pronto (default \"tutte\" quando l'aggregazione non è specificata, la logica prima/ultima via window function è invariata in attesa del futuro blocco).\n\n**Gotcha reale trovato da Mauro testando (05/08/2026) — LEFT JOIN nascondeva il filtro Emesso**: con LEFT JOIN sempre attiva, un filtro su Emesso (es. rete=I1) non restringeva i prodotti Anagrafica — chi non corrispondeva usciva comunque, solo con le colonne Emesso a NULL. Fix: INNER JOIN quando ci sono filtri Emesso (un filtro deve restringere), LEFT quando non ce ne sono (Emesso arricchisce senza restringere). Verificato su dati reali (tipologia=FILM): senza filtri 471.494 righe (52.215 NULL, LEFT corretto); con rete=I1, 30.690 righe zero NULL (INNER corretto).\n\n**Blocco ponte esplicito `pb_join` (05/08/2026)**: la regola automatica sopra non copriva un caso legittimo — \"mostrami tutti i prodotti, e se disponibile mostrami solo l'emissione su rete X\" (LEFT + filtro solo per la visualizzazione). Aggiunto un blocco indipendente e facoltativo \"Join Anagrafica ↔ Emesso\" con tendina Automatico/LEFT forzato/INNER forzato, colore neutro grigio (è un ponte tra domini, non appartiene a una tabella). Se assente, vale la regola automatica di prima. Verificato tutti e tre i casi su dati reali, conteggi coerenti tra loro.\n\n**Stato attuale**: due domini (Anagrafica, Emesso) entrambi con WHERE+SELECT completi, blocchi \"Tabella\" container indipendenti, join di default automatica (INNER-se-filtri-altrimenti-LEFT) con possibilità di forzarla esplicitamente via `pb_join`, nessuna aggregazione nel frontend (rimandata). **Non ancora testato visivamente su Ufficio** il blocco ponte.\n\n## Domande aperte non ancora affrontate\n\n(da `PowerBricks_dossier.md`, dossier Elon 13/07/2026, recuperato e poi eliminato il 04/08/2026 — nessuna risposta trovata né nell'archivio né nella specifica ufficiale)\n- Perimetro della v1: quali dei 4 domini entrano subito, quali no.\n- Dove si ferma la logica diritti nella prima versione — è il pezzo più costoso, farla tutta subito rischia di non finire mai.\n- Se e quando PowerBricks toccherà il territorio AllRights — decisione strategica, non tecnica.\n- Cosa rende \"fatto bene\" questo progetto, dato che non è stato commissionato da nessuno e quindi nessuno darà il criterio di completamento dall'esterno.\n\n## Scorporo da MyICR_Suite — superato dagli eventi\n\nSpunto emerso il 04/08/2026: dato che la specifica dichiarava PowerBricks come consumer esterno del layer semantico (\"lo usa come dipendenza, non lo ingloba\"), scorporarlo in una cartella propria sotto `PYTHON/` (coerente con \"un repo per progetto\") aveva senso concettuale. Nel frattempo, stesso giorno, Mauro ha deciso di eliminare la cartella del tutto invece di scorporarla — quindi la domanda non si pone più nei termini originali: non c'è più nulla da scorporare da MyICR_Suite. Se e quando l'implementazione ripartirà, ripartirà da zero, e a quel punto la scelta \"modulo dentro MyICR_Suite vs progetto a sé sotto `PYTHON/`\" si potrà fare direttamente in partenza, senza vincoli ereditati.\n\nVedi [[_i_lavoro-python-ecosistema|lavoro-python-ecosistema]] per il quadro d'insieme.\n","numLines":112,"startLine":1,"totalLines":112}},"sourceToolAssistantUUID":"a1612d58-09ca-4fd6-880b-34cb5555e317","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"fbc52a64-1ae5-48f5-a4be-4bf4a3b2f08e","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmKJoCHRMVHQiawhmRsy","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01HmaksiH687V6DaDJ1scqbA","name":"Bash","input":{"command":"cd /mnt/ssd/data/Dropbox/adrian/sandbox/powerbricks && git log --oneline -15 && echo \"---STATUS---\" && git status && echo \"---LS---\" && ls -la","description":"Check PowerBricks sandbox git history and current state"},"caller":{"type":"direct"}}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":79,"cache_read_input_tokens":66208,"output_tokens":288,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":79,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":288,"cache_read_input_tokens":66208,"cache_creation_input_tokens":79,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":79},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmKJmPPqi5XZrEa73qZU","type":"assistant","uuid":"b1eb1402-1df6-462c-97bb-4cc305943760","timestamp":"2026-08-06T10:12:46.272Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"b1eb1402-1df6-462c-97bb-4cc305943760","isSidechain":false,"promptId":"e0ae35de-1d97-4180-a9ef-0448334c674f","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01HmaksiH687V6DaDJ1scqbA","type":"tool_result","content":"7131d86 docs: registra pattern Guacamole/x11vnc bloccato, fix confermato\n47453bc docs: completa aggiornamento documentazione voice-chat (systemd+monitor)\n0e448dd docs: aggiorna documentazione voice-chat per architettura systemd+auto-monitor\n85c3a98 feat: avvio automatico Monitor voice-chat all'inizio sessione (solo Nave)\n44ec075 feat: modalità non-debug per server.py, propedeutica al servizio systemd\n5aff27b feat: status testuale con le fasi reali invece di \"sta pensando\" statico\nf9e3891 docs: aggiorna CLAUDE.md voice-chat con il fix di normalizzazione audio\n549494a fix: transcodifica sempre l'audio in WAV prima di mandarlo a Gemini STT\n5eefce1 docs: annota idea futura selettore modalità/subagente per voice-chat\n1008725 docs: annota analisi tempi di risposta e idea \"suono di pensiero\" futura\n72c8a91 fix: richiede uno stream microfono fresco ad ogni registrazione\n8c80403 fix: pulsante di fallback separato invece di sovrascrivere il push-to-talk\n43f2304 fix: timeout di sicurezza su fetch e riproduzione audio in sendAudio\n9f3e420 docs: documenta v2 voice-chat (aggancio sessione reale) e thread aperti\nbd6faee feat: voice-chat aggancia davvero questa sessione invece di un clone\n---STATUS---\nSul branch master\nnon c'è nulla di cui eseguire il commit, l'albero di lavoro è pulito\n---LS---\ntotale 56\ndrwxrwxr-x 5 mauro mauro 4096 ago 5 11:13 .\ndrwxrwxr-x 4 mauro mauro 4096 ago 6 08:59 ..\ndrwxrwxr-x 3 mauro mauro 4096 ago 5 11:22 backend\n-rw-rw-r-- 1 mauro mauro 17675 ago 5 11:13 CLAUDE.md\ndrwxrwxr-x 2 mauro mauro 4096 ago 5 11:12 frontend\n-rw-rw-r-- 1 mauro mauro 56 ago 5 09:34 requirements.txt\n-rw-rw-r-- 1 mauro mauro 1608 ago 5 09:52 results_grid.py\n-rw-rw-r-- 1 mauro mauro 225 ago 5 09:39 run.bat\n-rw-rw-r-- 1 mauro mauro 1039 ago 5 07:20 run.py\ndrwxrwxr-x 6 mauro mauro 4096 ago 5 07:48 .venv","is_error":false}]},"uuid":"7fbe78cc-1d40-49ea-be7c-602fdba7dbf7","timestamp":"2026-08-06T10:12:46.341Z","toolUseResult":{"stdout":"7131d86 docs: registra pattern Guacamole/x11vnc bloccato, fix confermato\n47453bc docs: completa aggiornamento documentazione voice-chat (systemd+monitor)\n0e448dd docs: aggiorna documentazione voice-chat per architettura systemd+auto-monitor\n85c3a98 feat: avvio automatico Monitor voice-chat all'inizio sessione (solo Nave)\n44ec075 feat: modalità non-debug per server.py, propedeutica al servizio systemd\n5aff27b feat: status testuale con le fasi reali invece di \"sta pensando\" statico\nf9e3891 docs: aggiorna CLAUDE.md voice-chat con il fix di normalizzazione audio\n549494a fix: transcodifica sempre l'audio in WAV prima di mandarlo a Gemini STT\n5eefce1 docs: annota idea futura selettore modalità/subagente per voice-chat\n1008725 docs: annota analisi tempi di risposta e idea \"suono di pensiero\" futura\n72c8a91 fix: richiede uno stream microfono fresco ad ogni registrazione\n8c80403 fix: pulsante di fallback separato invece di sovrascrivere il push-to-talk\n43f2304 fix: timeout di sicurezza su fetch e riproduzione audio in sendAudio\n9f3e420 docs: documenta v2 voice-chat (aggancio sessione reale) e thread aperti\nbd6faee feat: voice-chat aggancia davvero questa sessione invece di un clone\n---STATUS---\nSul branch master\nnon c'è nulla di cui eseguire il commit, l'albero di lavoro è pulito\n---LS---\ntotale 56\ndrwxrwxr-x 5 mauro mauro 4096 ago 5 11:13 .\ndrwxrwxr-x 4 mauro mauro 4096 ago 6 08:59 ..\ndrwxrwxr-x 3 mauro mauro 4096 ago 5 11:22 backend\n-rw-rw-r-- 1 mauro mauro 17675 ago 5 11:13 CLAUDE.md\ndrwxrwxr-x 2 mauro mauro 4096 ago 5 11:12 frontend\n-rw-rw-r-- 1 mauro mauro 56 ago 5 09:34 requirements.txt\n-rw-rw-r-- 1 mauro mauro 1608 ago 5 09:52 results_grid.py\n-rw-rw-r-- 1 mauro mauro 225 ago 5 09:39 run.bat\n-rw-rw-r-- 1 mauro mauro 1039 ago 5 07:20 run.py\ndrwxrwxr-x 6 mauro mauro 4096 ago 5 07:48 .venv","stderr":"","interrupted":false,"isImage":false,"noOutputExpected":false},"sourceToolAssistantUUID":"b1eb1402-1df6-462c-97bb-4cc305943760","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian/sandbox/powerbricks","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"type":"last-prompt","lastPrompt":"Vorrei tornare a lavorare un pò a Powerbricks (directory sandbox)","leafUuid":"7fbe78cc-1d40-49ea-be7c-602fdba7dbf7","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01"}
{"type":"ai-title","aiTitle":"Continuare sessione modalità voice webapp","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01"}
{"parentUuid":"7fbe78cc-1d40-49ea-be7c-602fdba7dbf7","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmKK5fjVUZ2AX5hginjG","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"ErAKCokBCBAYAipAufPHsFvhZPuy1tkB5Uomy7x/HBGnKMd7wtq7G/Zkox0JCh0l6WXlY+GdXD/TQJjubcSxj5LQs2Z1kUgpkX+tNTIPY2xhdWRlLXNvbm5ldC01OABCCHRoaW5raW5nWiQzZDFjY2UyZS0wNjY0LTQwZDYtODQxNC1iN2U1MjhhY2UyYjESDCMVP82vWUjQA+nXUhoM1Lt6Q/Kli6h1EO2eIjBdyt5yJYQB4tfpL8rC8hzm+fVJIvSO7pPUqLTsx0bNIoHMZ6pDugUimsRZYhPxIrwq0wh8QGIEO0R27XIB8QCFsAy8NTJ384EO7VqLVVUsYqET4lCk6rDlk+66PWG/5gqgR6iuVPEnBtCJ4HUVnxZd4qJNvpIm1Xc02YD+Eb+cM0Jb/oTWiHq/U2vARoYRHa/hDuKa7WvbQYY6WjdOrTgfpJdmkaMIRTMcL+JShYnXAb71Qkgf/xgxUi4Cdt6xALPjuZk7BzI3fjXOI7JdfzADcuKY3KWkzV8NbkLwmG2CziDSFY6147/8Z34ia9iMLAW84QJ3PcekkclK/Jytsi6ywLfwKLrl5O9XkEGzomeYpC9tDHhOc22ZUpqlSY469UnyPo3jvVH2DWzTGWmvy8CCpCUmNZipWEJdMQe7y3kULh5/RbYFq4gDYDz4THcR+0++cr51QOe111TPVP/6w6gQx+KgsT5eIbwkNJjMnTEvYnhIY53WAjpfsx/t+UTblkWrA/eahboyNlF/ZKT/Uydd0MjLwHPdWyDTOkFluZodBsnlGpThfVZscXzOyQekU63khT24NPYkp1SC24nDATiBk4bVLBxst+2g8zlUvRawa83NMgx9E5TAzYj0TIzhWCXycVDXh7zMHeYyONDXLFSnvEdNxQH8KDsUKGlJ5l14MszE2tVEXxUP90dxyDWbv8cY7d0VV/KuznfF/mWm/1a4/cW1b0Hw/C8AHOJ53dG4WuWcpc/0qNlz2xByWBWJ8wXje5JiyF0OA9u9as/m3plkJDPn8qU6viQGl0tuh31sdxasG3NB6MtduTDT6+IxxPPXmt3gwp5KP7/Zn9KNtmxNt85CjBEFl/hebaGEAvoUaaPiZJ/09A9JNyQ24UiPZMQODFf6X+tszLKijXaPdwxyuQrChv5WI0ffpJuK9VxilZ8WUwIeet6tlbtMiK/hH1yjq9eD5pTlHrzMkqnvsh7hkRrzx5bqY/Xw9nFJI8seQHuvaJgTqDWlNqJCLs2iC3Hnyfxkhsr65PNPzVCKy12H1OSACXfuVLNJ78JdgxAUJVGTU2cm7g1U9k+qmjdDD1wMZk8E9Rtf6qkNVO+k32lM5NVcLqDzGeNU76JFp9LtfXvNQymjo7GfFwxzPGlgV2TegUA+68L0v4XzBILxC/HkCmRi3O9GP+w2Z6mPrWS+3g8fgm0o55QdByqIdtI0/opVqA/Laolde4R8ZTjPWQyj1WPAc/F2B7x3hzGQbNOUK6OZ8ssKpCBDwiivBmV4VmDYspzigvwch+UxpBX+3YpS0+wXAfxyEjJWYGt1PWeY2g6JhVzN3+8CPZw8X/z9tzEwZlI7oAJ6CZOhDAx0qhBW1O/bcqRRTtfaMo0uBY5XfkJVET+5pnFc9wiK5+T11fQKoP14zIleyNL5cbkXCN6keTzVHN8SpCwyNohkhq4uq78lmWan3AE1E11VrhfbKYzAPLxGroXWOhKAWlEIm1nsq3R/VT1bUqYbLa4qUtwfGHjifnFCsFq6DT/40ObGvhVdFsDzC+sYAQ=="}],"stop_reason":"end_turn","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":10591,"cache_read_input_tokens":66287,"output_tokens":708,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":10591,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":708,"cache_read_input_tokens":66287,"cache_creation_input_tokens":10591,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":10591},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmKK4tbzRP3z7rwVTnpZ","type":"assistant","uuid":"ddb5b6d3-3251-4861-8e7a-7a078a7a4ab9","timestamp":"2026-08-06T10:12:53.462Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian/sandbox/powerbricks","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"ddb5b6d3-3251-4861-8e7a-7a078a7a4ab9","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmKK5fjVUZ2AX5hginjG","type":"message","role":"assistant","content":[{"type":"text","text":"Ripreso il contesto di PowerBricks. Stato attuale: due domini completi e validati (Tabella Anagrafica, Tabella Emesso — entrambi con WHERE via blocchi Blockly + SELECT via modale a doppio click), join automatica INNER/LEFT con blocco ponte `pb_join` opzionale per forzarla. L'ultima cosa fatta (05/08) è il blocco ponte, **non ancora testato visivamente** su Ufficio (solo verificato via `test_client()` da Nave).\n\nWorking tree pulito, nessuna modifica pendente. Le opzioni naturali per oggi sono:\n- testare visivamente il blocco ponte `pb_join` su Ufficio (ultimo pezzo non ancora provato a schermo)\n- partire con **Diritti**, il terzo dominio\n- continuare a stressare Anagrafica/Emesso con query più elaborate\n\nDa dove vuoi ripartire?"}],"stop_reason":"end_turn","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":10591,"cache_read_input_tokens":66287,"output_tokens":708,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":10591,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":708,"cache_read_input_tokens":66287,"cache_creation_input_tokens":10591,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":10591},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmKK4tbzRP3z7rwVTnpZ","type":"assistant","uuid":"0cb98cc3-4dba-4dfc-b94a-dc490a391980","timestamp":"2026-08-06T10:12:57.136Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian/sandbox/powerbricks","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"type":"queue-operation","operation":"enqueue","timestamp":"2026-08-06T10:15:31.972Z","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01"}
{"type":"queue-operation","operation":"dequeue","timestamp":"2026-08-06T10:15:32.067Z","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01"}
{"parentUuid":"0cb98cc3-4dba-4dfc-b94a-dc490a391980","isSidechain":false,"promptId":"4cc44845-99ac-4ed7-b546-c5f9aa1f1e86","type":"user","message":{"role":"user","content":[{"type":"image","source":{"type":"base64","media_type":"image/png","data":"iVBORw0KGgoAAAANSUhEUgAABPIAAAMbCAYAAADHErvxAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAJf9SURBVHhe7N15eJT1vf//1z2TZZKQsASCJCCBsCXsUlkUcWkLRZD2IC51OZTjt9rV01pE+7OWQ63XsZTac2xrq/16qN+q1WrpKaIIWqWIClh3SABZAlmQsCeErJP5/THbPZ/MJJNkEjLk+biuuZr5fO77nnvuoedcfV3v9+dj9erVyyMfjyfwZ4hf/epXuvbaazVt2jSVlJSY0/rDH/4gSfra176mL3/5y3r44Yd1xRVXBI7dsWOHXn/9dd1555365z//qT59+uixxx7Ts88+q61bt2rhwoUaN26cfvKTnygnJ0eSVFZWpqKiIi1ZskR33323rr32Wv34xz/WE088oR07duizzz7TkiVLNHnyZD388MP67LPPNHPmTL344osaNmyYbrvtNm3btk0vvvii8vPzdeWVV+rRRx9VSkqKvvCFL+i5557TlClT9N577+mGG27QP//5T73yyivKyMjQJZdcon/5l39Rdna2Bg4cqLVr12rBggV6+OGHdeWVV6qkpEQLFizQb3/7Wy1cuFDl5eWaPXu2nnjiicDnjxs3TpK0d+9ePfvssxGvu3r1as2ePTvwvX/605/qK1/5SuD+X3vtNdXU1Oiaa67Rli1b1KdPH82dO1eTJ0/Wb3/7Wx04cEBf/epXA8/om9/8ptauXRt4hpJ0+PBh/cu//Euz387/Hf7rv/5LP//5z5t9R0l67rnnNHbs2MD9LFiwQGvXro36Xo4cOaI1a9Zo48aNWrJkiX76059qyZIlgfd2L774olJSUgLj69ev11//+lfdf//9evPNN1VbW6utW7fq/vvvDzmvPQYPHqy//vWv2rFjhz73uc/pvvvuCzy3WMjNzVViYqI53CF//OMfdeutt5rDUUtPT1dVVZU5HFa/fv30y1/+MvBMFixYoO9///s6ceKEeSgAAACATjR58mT179/fHA5x7NgxffDBB+bwOTVr1izt3r1bR44cMackSQMHDtTo0aO1efNmc6pdvve972nUqFFyOp1KTExUYmKinE5n4JWQkCCHwxF4WZYVeB05ckQXXHBBYNzOfO8XadwummPOB5999pkuuOACc7jH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"}},{"text":"non mi convince tanto il pannello laterale. Se abbiamo tante tante tabelle non avremo spazio per tutti i blocchi che è possibile utilizzare. Serve probabilmente a monte un livello che identifica la tabella su cui vuoi lavorare","type":"text"}]},"uuid":"54a19c56-c58d-4bf6-9ca4-d4e4c43fa4c4","timestamp":"2026-08-06T10:15:32.099Z","permissionMode":"acceptEdits","origin":{"kind":"human"},"promptSource":"sdk","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"type":"file-history-snapshot","messageId":"54a19c56-c58d-4bf6-9ca4-d4e4c43fa4c4","snapshot":{"messageId":"54a19c56-c58d-4bf6-9ca4-d4e4c43fa4c4","trackedFileBackups":{},"timestamp":"2026-08-06T10:15:32.104Z"},"isSnapshotUpdate":false}
{"type":"last-prompt","lastPrompt":"non mi convince tanto il pannello laterale. Se abbiamo tante tante tabelle non avremo spazio per tutti i blocchi che è possibile utilizzare. Serve probabilmente a monte un livello che identifica la t…","leafUuid":"54a19c56-c58d-4bf6-9ca4-d4e4c43fa4c4","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01"}
{"type":"ai-title","aiTitle":"Continuare sessione modalità voice webapp","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01"}
{"parentUuid":"54a19c56-c58d-4bf6-9ca4-d4e4c43fa4c4","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmKXLUJpVBobvyThWqKa","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"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"}],"stop_reason":"end_turn","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":2139,"cache_read_input_tokens":76878,"output_tokens":1100,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":2139,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":1100,"cache_read_input_tokens":76878,"cache_creation_input_tokens":2139,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":2139},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmKXHirs2idps9gsrvmS","type":"assistant","uuid":"562ef099-1b57-4f2b-9741-51446c794e81","timestamp":"2026-08-06T10:15:43.746Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"562ef099-1b57-4f2b-9741-51446c794e81","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmKXLUJpVBobvyThWqKa","type":"message","role":"assistant","content":[{"type":"text","text":"Il problema è reale, ma la soluzione nativa di Blockly per questo è probabilmente più adatta di un livello di selezione a monte: **categorie a comparti collassabili** nel toolbox (come \"Logica\", \"Matematica\", \"Testo\" nei layout Blockly standard) — ogni dominio diventa un'intestazione cliccabile che si espande solo quando serve, invece di mostrare tutti i blocchi di tutti i domini sempre in vista. Il vantaggio è che resta coerente con l'uso attuale (Anagrafica ed Emesso convivono sulla stessa lavagna, non sono alternative esclusive) — un \"seleziona prima la tabella\" a monte rischia di introdurre un gate che poi va tolto/aggirato proprio quando servono due domini insieme, come nello screenshot che hai appena fatto.\n\nTi convince come direzione, o preferisci comunque un passo di selezione esplicito prima di arrivare al canvas?"}],"stop_reason":"end_turn","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":2139,"cache_read_input_tokens":76878,"output_tokens":1100,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":2139,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":1100,"cache_read_input_tokens":76878,"cache_creation_input_tokens":2139,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":2139},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmKXHirs2idps9gsrvmS","type":"assistant","uuid":"fc952684-cc8e-452f-b934-d91aed101579","timestamp":"2026-08-06T10:15:48.247Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"type":"queue-operation","operation":"enqueue","timestamp":"2026-08-06T10:17:16.737Z","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","content":"cioè avrei delle sezioni collassabili? Una per ogni tabella?"}
{"type":"queue-operation","operation":"dequeue","timestamp":"2026-08-06T10:17:16.783Z","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01"}
{"parentUuid":"fc952684-cc8e-452f-b934-d91aed101579","isSidechain":false,"promptId":"e6ecb870-a58e-4b75-a82c-99c6653452af","type":"user","message":{"role":"user","content":"cioè avrei delle sezioni collassabili? Una per ogni tabella?"},"uuid":"3576eb0c-f054-4113-9d30-1a1b4cd1736e","timestamp":"2026-08-06T10:17:16.801Z","permissionMode":"acceptEdits","origin":{"kind":"human"},"promptSource":"sdk","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"3576eb0c-f054-4113-9d30-1a1b4cd1736e","isSidechain":false,"attachment":{"type":"todo_reminder","content":[],"itemCount":0},"type":"attachment","uuid":"c607077f-9d35-4104-9f5f-ae10b2dc0307","timestamp":"2026-08-06T10:17:16.801Z","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"type":"file-history-snapshot","messageId":"3576eb0c-f054-4113-9d30-1a1b4cd1736e","snapshot":{"messageId":"3576eb0c-f054-4113-9d30-1a1b4cd1736e","trackedFileBackups":{},"timestamp":"2026-08-06T10:17:16.809Z"},"isSnapshotUpdate":false}
{"parentUuid":"c607077f-9d35-4104-9f5f-ae10b2dc0307","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmKf3GRg6aoTFWb7cyf6","type":"message","role":"assistant","content":[{"type":"text","text":"Esatto. Ogni dominio (Anagrafica, Emesso, e in futuro Diritti/Boxoffice) diventa un'intestazione colorata nel pannello laterale — coerente col colore che il blocco già ha oggi (rosso Anagrafica, ambra Emesso). Cliccandola si espande e mostra solo i suoi blocchi (Tabella, gruppo, campo); le altre restano chiuse, occupando solo una riga ciascuna. Di default puoi tenerle tutte chiuse, o quella che stai usando aperta — è lo stesso pattern del toolbox Blockly che già usi (solo che oggi non ci sono categorie, è tutto in un elenco piatto unico).\n\nCon 2 domini il vantaggio si vede poco, ma con 4 fa la differenza: invece di scorrere ~12+ blocchi misti, vedi 4 intestazioni e apri solo quella che ti serve in quel momento."}],"stop_reason":"end_turn","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":1268,"cache_read_input_tokens":79017,"output_tokens":326,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":1268,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":326,"cache_read_input_tokens":79017,"cache_creation_input_tokens":1268,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":1268},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmKf1N5SKckEpHiQZkfD","type":"assistant","uuid":"5cd2de74-3b9d-44e4-92cc-4ab1c5a5d5b7","timestamp":"2026-08-06T10:17:22.761Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"type":"queue-operation","operation":"enqueue","timestamp":"2026-08-06T10:18:54.311Z","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","content":"e invece avere due pannelli? Uno per le tabelle e cliccandoci apri un secondo pannello con i blocchi utilizzabili? Potremmo inoltre inserirci funzioni specifiche per la tabella (es. selezione campi)"}
{"type":"queue-operation","operation":"dequeue","timestamp":"2026-08-06T10:18:54.313Z","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01"}
{"parentUuid":"5cd2de74-3b9d-44e4-92cc-4ab1c5a5d5b7","isSidechain":false,"promptId":"ab7e2559-9044-446d-b8fe-87a93fe8c78e","type":"user","message":{"role":"user","content":"e invece avere due pannelli? Uno per le tabelle e cliccandoci apri un secondo pannello con i blocchi utilizzabili? Potremmo inoltre inserirci funzioni specifiche per la tabella (es. selezione campi)"},"uuid":"6f44a0ea-9b39-42c0-aa72-b1217f59167b","timestamp":"2026-08-06T10:18:54.318Z","permissionMode":"acceptEdits","origin":{"kind":"human"},"promptSource":"sdk","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"type":"file-history-snapshot","messageId":"6f44a0ea-9b39-42c0-aa72-b1217f59167b","snapshot":{"messageId":"6f44a0ea-9b39-42c0-aa72-b1217f59167b","trackedFileBackups":{},"timestamp":"2026-08-06T10:18:54.324Z"},"isSnapshotUpdate":false}
{"parentUuid":"6f44a0ea-9b39-42c0-aa72-b1217f59167b","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmKnEXnpAVr6BoQURt1A","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"Et0RCokBCBAYAipApQpwsP0p0aOaIKCmck+YEYc+88I1ov1PSrTz6fXXUrEGBOcVK+fpedKWWmQQUHZKdmUK85EJT9DnYhRgA15asTIPY2xhdWRlLXNvbm5ldC01OABCCHRoaW5raW5nWiQzZDFjY2UyZS0wNjY0LTQwZDYtODQxNC1iN2U1MjhhY2UyYjESDPV6nmIm9TIgELdIXhoMqzGDIPxLeYvl644UIjCFmMfaGVqtn+uEVSDpDM02Z9PtNF/DWCJ3iBInTrwti6R18BIeo8PpRqMDMnhJvT8qgBCKjOJG56rMk4KDIDBaVAoNBE4L1vtbgp0c+EhuZHqi9X0fO37Q+LPHGQFAJ9Z93NEiA6aIM50UC9dddECXjtG4qt/dF6kfdsg+TJ75LZ13x4V0IN5BPZLOOQ9jmnZb649ZHr14WFRln7ufryf8bcaeoHJZywvFDBxjz9GDFB2GOw0AH7jklXXp4qFkVGTyDDhALvQnBNvvAvGEevTLbFPrZ8S/GfhezFMKdJ/TYOzPUIznpBdRVgRKW8fcrItgSncL1051gkr8vT1GvTXIL1aJr1zYop4tWqIZ6scavn4iMInBBgAxgDXi52Bnmnur8vZkSHzN9nIP7dETaPzMSLDa+t8H0XjAZdWEgwhCJLYs7JwZD7bhw18x+I6lPVP4YY3wI9RbkczXZJfBSgf8B3puaGMjCqv44zwKp3o1s3VeTO30KnlbyhQuhDrbLbMu1Abu3xJm5rfV5zXqn3G9dk3UFU8lQKS87RmmjyvGfROsSAdCEBo5keOCNP5BX6r4PyZiNFIqJMHZCZ6PejoyDRyslZnZUIOV97Pk3q0ouBQzs+oeUYcEOxufpO4Qz22RSCXi/XSENuCdUgs8OiegOMTtQaJ4a8kiAsiLY+J/8ut49qrVSrL135s94cw0JxF8aut2DeUvP4n5GErct1zZHHNDp6Jy1X0E802NAwZjGYiZNOTwAV9hFaWHUihRjuYhPAFVNRHl+be/FyRgvtqj01ReuIsQdxjJ0/n8API38eTzvvok5yjsjIUDD+JtddozFRHqTyRQ/Ns7jpdoRSzMfiKDeY+bjSJIRyjyChaCadGwPXK5RSRLrOrm89iRuutU/SzP2UEYTi9eGhiin5Y8Ff+odm8tqtSL8pmKYhKAGJ/Is4jCvQbqVPiORJ4KZWWUZIBx4kgQ/TaL58tqEVBh5paoeZ4BLoOw0AGEguC6su3sJyhNYVLVPA/uBvCbBx7JU/2UKrkJWKf0QMn1ad5nO8m/8edk62waKMaO+arHAUJ/cClVIJq3+2PYGuP6uQCNmWi4OY/eBsg48kjOd18V6XSLlvzhrrHOsAwvdlcWzmMrZ061GC/W+wdB4nj05pvS1xCoD83/liywPBO5t44YNHkEUU4NyHsrWmFJUeVan0FWyd+3AJHotcHjITT5uDKm80L//9luFNzMF3pFku3PF1jHpqYDRxS+oOHH8ieudWzkYpHvG5KtzgT34+rs0DIYdIjjBvspJTPUPoh5tB39K8CjCUAob8cbJ6EQDXDaCTae6CbVGddAQuQKx9mqDnw0wgweev83H8vBGfBDW+RrZsBwIkKMBxCJvaXI0cu3Mfl20Z9bLm3lyzrT+3RA3vGn1w+CpUwuU3olUwtIjz88mR6YSvkHrfckcG64mVDHYRN9doz6dNp714AnJCHFrhYKrCTHjggmvasPUw198DY9zx5lp+CYNbN2rvVAkBJYkOaFOf0yZsB2TAm8X0InMFcGDwa7L8UtCC8ZqnQSoZRSHEZGjLkyblV9VjvKNnlLKwZf/v8e5DpJdaj7NT+Ff093LPUWJpcMo8E9RAlS3yvSY/FhOEC0FJjt0611qn7Ticr8LBIqIEbRYtHbUiVaBA1Miqoo4lNqdfU9ji5sMAYob77C2G91GOnxeBTbqZYIVnW8sE7T3mB3yzjewbqhv8bV9o1UJjHqIYl/kjlS31VcwVuH2p/VGafcTilWn4snVofgWRgk9kSBzXr3Hs508R8PFlv0+7byEVhwSNSGYKQmIBaZBrLnZHgkydEbcGEje9GEi7F1DTc5U3LP3HTDAlusQsmdBEnZsA/JisUYM3hHS0K8osZ9c1T0eBt32t+HxFrRf89iwnqV0rNtF9huIo2SJl2YrGpXRGyQbtM9G9odA0FGLLEFSIh2LlLspxri5yqspJcW0obIEbCjh4zdK7BaccxgdMzsrG7S3YcZqi/IWWzuD0dbWnKttefrcRC3U60nV717EZagj/MNsAg8lME3rb7ZGhQsWEJ0mPpPRYPBoJh/shEgmG+bMKJqsxMOQPhAal/ToR+KUwygm6hp1XJuxWIBkCmPn4B+fKpZNnei+mXQe3NF9Iri/6OZQSakQuNdGzVyny2Kq0YwZrI9xZEbt9kNlGnz9Yo2fLQMdCxozqwb7ODF09JNiXka5rF/cBwcZHeG029WoD20BgN4d0oo7T3sRlgAMyx2JvhnAalQeCNp473mSIVKXDY1LK8sawVP1P623f4GL3YYYsMqqovM2gHtmIKb3lAA4WoMLYyq819Y2ZVrXFQjY2WFRjpsycXsuLnPcMPekSoRpBQPJTzb7JDf8XfXoI2RH/6uR7efs38eUlXrAqRrPtyROgSQSqINPMU06E+YSi3AL0tJ89JmgYVKBXbvI0y+hbC5b/j4b98Ap6LomiWAswdd8eWe3E5eqkikzF0nEhNjrTlXc/NDOZOx/diXZG9NTm40SiOOOOQt/yp/EKWEuTlJb2sFjCotmJDZOJW0NI2mF/x+q4qxvXtBkUYdD71T4Onfvlzl5lcVYza/uPQlFgShHQ5QjyeNLYmx89ZN9wZGyCYaW2Dcw5BwhV0OVAEbaTDHcpJWuKHi9+0Bv5dz3ZaOVrf+43mRLMI6SfyHl69d4blO2RCZperLbttOPtTQReF4COa72GHB0BAs7My2JwXoCojOi+Yo+SoAvesjKO1W78zjhUobngQkogCAushGp517FJVNmx60RPVpkZH/8HXRfwiYtW5ZKxgB"}],"stop_reason":"end_turn","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":412,"cache_read_input_tokens":80285,"output_tokens":1068,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":412,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":1068,"cache_read_input_tokens":80285,"cache_creation_input_tokens":412,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":412},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmKnCE8LApXxzT6urRDZ","type":"assistant","uuid":"a5557029-05b6-4a86-bd21-a44be43bf627","timestamp":"2026-08-06T10:19:04.450Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"a5557029-05b6-4a86-bd21-a44be43bf627","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmKnEXnpAVr6BoQURt1A","type":"message","role":"assistant","content":[{"type":"text","text":"Buona idea, e in realtà chiude un cerchio: nell'archivio di PowerBricks c'è già annotato (05/08) che Access/Power BI risolvono la selezione campi con \"un pannello dedicato e persistente, separato dal canvas\" — la modale a doppio click per l'output era un compromesso proprio perché mancava quel pannello. Un secondo pannello contestuale alla tabella selezionata risolverebbe **due problemi con la stessa struttura**: l'affollamento del toolbox e il posto naturale dove mettere selezione campi/aggregazione senza infilarle nei blocchi.\n\nIl costo è che non è più il toolbox nativo di Blockly (le categorie collassabili sono gratis, built-in) — qui costruiamo un pannello custom che sincronizza cosa mostra col blocco tabella selezionato sul canvas, quindi più codice e più stato da gestire (es. cosa succede se clicco su \"Emesso\" nel pannello 1 ma non ho ancora trascinato \"Tabella Emesso\" sul canvas?).\n\nTi torna comunque la direzione, o vuoi che ragioniamo insieme su quel caso limite prima di buttare giù la struttura?"}],"stop_reason":"end_turn","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":412,"cache_read_input_tokens":80285,"output_tokens":1068,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":412,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":1068,"cache_read_input_tokens":80285,"cache_creation_input_tokens":412,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":412},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmKnCE8LApXxzT6urRDZ","type":"assistant","uuid":"15d65f55-6afc-4dbf-a7a8-38018f082d60","timestamp":"2026-08-06T10:19:09.826Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"type":"queue-operation","operation":"enqueue","timestamp":"2026-08-06T10:20:54.631Z","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","content":"Sarebbero due pannelli affiancati. Il primo sarebbe più stretto perchè conterrebbe solo i blocchi delle tabelle. Domanda: ma la dimensione dei blocchi è standard?"}
{"type":"queue-operation","operation":"dequeue","timestamp":"2026-08-06T10:20:54.725Z","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01"}
{"parentUuid":"15d65f55-6afc-4dbf-a7a8-38018f082d60","isSidechain":false,"promptId":"05931528-2d43-42d7-aeb4-b274aac1a075","type":"user","message":{"role":"user","content":"Sarebbero due pannelli affiancati. Il primo sarebbe più stretto perchè conterrebbe solo i blocchi delle tabelle. Domanda: ma la dimensione dei blocchi è standard?"},"uuid":"f0ff8e9e-5344-49bb-b562-a402e33e77cc","timestamp":"2026-08-06T10:20:54.737Z","permissionMode":"acceptEdits","origin":{"kind":"human"},"promptSource":"sdk","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"type":"file-history-snapshot","messageId":"f0ff8e9e-5344-49bb-b562-a402e33e77cc","snapshot":{"messageId":"f0ff8e9e-5344-49bb-b562-a402e33e77cc","trackedFileBackups":{},"timestamp":"2026-08-06T10:20:54.742Z"},"isSnapshotUpdate":false}
{"parentUuid":"f0ff8e9e-5344-49bb-b562-a402e33e77cc","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmKw7yPok8pqdissUgHS","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"EqEDCokBCBAYAipAgWd85nQVAU4UK5rUgzpl2MR6LmbT2lDgWtk1ezK2Ust83aPYo2pze0E/xyIEXCZ3N/4uZC6lPnbzxfDPjIdKUDIPY2xhdWRlLXNvbm5ldC01OABCCHRoaW5raW5nWiQzZDFjY2UyZS0wNjY0LTQwZDYtODQxNC1iN2U1MjhhY2UyYjESDPqNimk3OpI1RyE0PxoMyWrgfW1hQA9e9h5JIjA36oy1207tQ2rr2BhwORLzEJV/QD6vD1/ek2LaC07PhtDU8Sf0Un4rL7nxjeR/XQ4qxAEYzqWZsKJQOyotWeI7OIxYvKbMY7q7YS8v5m/tmKP3Q/DXw1qNBgYpISgUeA1i7GPJtloxHoMtYe4UFNrKs42XSy1QXSGWnPJSUBCVp0tgRnWs6OwPwRjpgCX2YWegHWk+TVRSepZCRDZgIeDC5m7r6Hc6RR6iITTyixDo16BuciJanxxeqwYpQQuxfiNwgugrpjwpSJ5OVxYX3tpfBcX2+yCIwaIrVeN5+tDxmp/Tw7o6cd75t9KoXdnCLXE0xH43OFGaGAE="}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":1145,"cache_read_input_tokens":80697,"output_tokens":242,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":1145,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":242,"cache_read_input_tokens":80697,"cache_creation_input_tokens":1145,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":1145},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmKw552LCQjso3Mf58ix","type":"assistant","uuid":"fce6b317-ba2d-408b-abb0-b7642cad3df0","timestamp":"2026-08-06T10:20:57.716Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"fce6b317-ba2d-408b-abb0-b7642cad3df0","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmKw7yPok8pqdissUgHS","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01CYqt26FryGaKo1GTkUEjzM","name":"Bash","input":{"command":"cd /mnt/ssd/data/Dropbox/adrian/sandbox/powerbricks/frontend && ls -la && grep -rn \"Blockly.Blocks\\|colour\\|init:\\|appendDummyInput\\|inputsInline\" *.js 2>/dev/null | head -60","description":"Inspect frontend Blockly block definitions for sizing hints"},"caller":{"type":"direct"}}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":1145,"cache_read_input_tokens":80697,"output_tokens":242,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":1145,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":242,"cache_read_input_tokens":80697,"cache_creation_input_tokens":1145,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":1145},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmKw552LCQjso3Mf58ix","type":"assistant","uuid":"1df24128-7d3d-4f3c-91ff-1f5abd199917","timestamp":"2026-08-06T10:20:59.548Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"1df24128-7d3d-4f3c-91ff-1f5abd199917","isSidechain":false,"promptId":"05931528-2d43-42d7-aeb4-b274aac1a075","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01CYqt26FryGaKo1GTkUEjzM","type":"tool_result","content":"totale 32\ndrwxrwxr-x 2 mauro mauro 4096 ago 5 11:12 .\ndrwxrwxr-x 5 mauro mauro 4096 ago 5 11:13 ..\n-rw-rw-r-- 1 mauro mauro 12544 ago 5 11:12 app.js\n-rw-rw-r-- 1 mauro mauro 5841 ago 5 11:12 index.html\napp.js:140: colour: \"#C62828\",\napp.js:150: colour: \"#F9A825\",\napp.js:164: colour: \"#EF9A9A\",\napp.js:183: colour: \"#E57373\",\napp.js:196: colour: \"#FFE082\",\napp.js:215: colour: \"#FFCA28\",\napp.js:232: colour: \"#757575\",","is_error":false}]},"uuid":"2e72bc95-0c74-435a-8aac-6994c3bc26bf","timestamp":"2026-08-06T10:20:59.632Z","toolUseResult":{"stdout":"totale 32\ndrwxrwxr-x 2 mauro mauro 4096 ago 5 11:12 .\ndrwxrwxr-x 5 mauro mauro 4096 ago 5 11:13 ..\n-rw-rw-r-- 1 mauro mauro 12544 ago 5 11:12 app.js\n-rw-rw-r-- 1 mauro mauro 5841 ago 5 11:12 index.html\napp.js:140: colour: \"#C62828\",\napp.js:150: colour: \"#F9A825\",\napp.js:164: colour: \"#EF9A9A\",\napp.js:183: colour: \"#E57373\",\napp.js:196: colour: \"#FFE082\",\napp.js:215: colour: \"#FFCA28\",\napp.js:232: colour: \"#757575\",","stderr":"","interrupted":false,"isImage":false,"noOutputExpected":false},"sourceToolAssistantUUID":"1df24128-7d3d-4f3c-91ff-1f5abd199917","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian/sandbox/powerbricks/frontend","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"2e72bc95-0c74-435a-8aac-6994c3bc26bf","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmKwTe5bPj9k3bNtLg4V","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"Eu8HCokBCBAYAipABpFhvaUhOa+yG0iK5bhZCfhpXG9wP6U+QMM+4V0EzI4Rlf/ixvvh9rNMFgR54tGICGHWwkgk8ekq30QQnJh0XTIPY2xhdWRlLXNvbm5ldC01OABCCHRoaW5raW5nWiQzZDFjY2UyZS0wNjY0LTQwZDYtODQxNC1iN2U1MjhhY2UyYjESDD44jzx9WpF5f7P8FhoMZs42nMVYtd3TDkj1IjCixi7RgHK+zICOSUtQb1lXTAac0LKdjNcuZmq71L6gS0JDsL0YQlbRv/BTzWzqKIcqkgaGymn2kOjvnn3EKhWO+IsxuGOWiCONsWo4eRkvGziZRx72sAVrABFKCQqIBZxTPesZz74Dv01rztxrun+0kj7vr27Ubzminf9fPfcF9zaD0tIZNw1bygOCRcU00fYhG088Rc/26zwXYwAHtSlwimvGl1avmc5YFuQDYh+hAFvcsGc6ehvX8rqSrLLdeM34TLoI+E9J79U0k3lFkoJNiQ6QTFfUcOXfmfdjFfOft0JbtkpzW9IkqNNQhVJSuInZ+AZowJQNlHEARo1XFSmKkbmJ301GZ3yGyNAnkTuofYGWaSf6PBtMoulwagWMaNmNo7TBCRWxGazTG3CeL6OujfJ3RZ4fTN5C+VQGDVvs/Nh4ldOJ2KguvvbMUT7bk4CtAGuTjG6A2VRE35kT459kpSV5LMwYG+dQZAnJR2Geyvo6fqb6aUlpU8eYb3MQtIT2wiQ0iTwuTaSS25nONNxBcLMyP46vnPZSX6GHXuCR3EBV3SeZMFmgBzag7zKCp6IT4YizW2N8ohahIQFuBNM44dH46qbfWYhE/A4bAFjrEy5TByL4qJ9higcln2OaDl4Y9/uyhJq3OH1TiRqXVyJOoT/LCj2Wl+sv0T4/1ubHjDr5axog1SdZ4ca7+lquBE9XBPZlejfRvKVy4PWuUJGfImFJy8iTVVFwXmKxQ0qksIe4M7cygZvHx8Guloj7ptMQlHt7KwzDxHjJLb+4j8LWGx48wfuCgGwZmV15P3swCr1X9tia3ToCb14g1j+OilIEUtwiPzn00Sum3lZH1uutGFUbbxRz4ebokUNyV7ZPH0AmbBO5vUGyLKyC8G5x85vs91yQSUlNV8Td2tzi+R4AVZhwAmyI/kIKWunoJCJUSTslcdrJuSIqVWR6UXnUtNWB523RpCEs1IRJ41aumHfIPuvPclRGfcaSZCBGLKOP/XB579K39h+2985oTy9OyEpTQ/+0eDF8T/xhEetdv/Kg9sKU6Wdv5BD0ddznrjyLRVV0YzloRwS54vIWHTSvKAhHJUdCUHyc5riO62DPLh3/dDjYPZsYAQ=="}],"stop_reason":"end_turn","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":516,"cache_read_input_tokens":81842,"output_tokens":586,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":516,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":586,"cache_read_input_tokens":81842,"cache_creation_input_tokens":516,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":516},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmKwRwdqZSSGo37MUaP5","type":"assistant","uuid":"f774b24a-57cc-4a72-aa0a-837ba0f7f2a9","timestamp":"2026-08-06T10:21:04.563Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian/sandbox/powerbricks/frontend","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"f774b24a-57cc-4a72-aa0a-837ba0f7f2a9","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmKwTe5bPj9k3bNtLg4V","type":"message","role":"assistant","content":[{"type":"text","text":"No, in Blockly la dimensione dei blocchi non è fissa — si auto-dimensiona in base al contenuto (lunghezza del testo dell'etichetta, presenza di dropdown/campi input). Guardando lo screenshot, \"Tabella Anagrafica\" è già più largo di \"Tabella Emesso\" solo perché il testo è più lungo.\n\nPer il tuo pannello stretto questo è rilevante: se le etichette dei blocchi-tabella restano corte (es. solo \"Anagrafica\", \"Emesso\", \"Diritti\" invece di \"Tabella Anagrafica\"), il pannello può restare stretto senza tagliare nulla. Se invece un domino futuro avesse un nome lungo, quel blocco spingerebbe la larghezza minima del pannello verso l'alto — va tenuto a mente nel dimensionamento, ma è un vincolo gestibile scegliendo etichette brevi."}],"stop_reason":"end_turn","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":516,"cache_read_input_tokens":81842,"output_tokens":586,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":516,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":586,"cache_read_input_tokens":81842,"cache_creation_input_tokens":516,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":516},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmKwRwdqZSSGo37MUaP5","type":"assistant","uuid":"e27ad4ce-1638-4672-aa75-8862d119176e","timestamp":"2026-08-06T10:21:07.711Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian/sandbox/powerbricks/frontend","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"type":"queue-operation","operation":"enqueue","timestamp":"2026-08-06T10:23:31.841Z","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01"}
{"type":"queue-operation","operation":"dequeue","timestamp":"2026-08-06T10:23:31.907Z","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01"}
{"parentUuid":"e27ad4ce-1638-4672-aa75-8862d119176e","isSidechain":false,"promptId":"8e6f9b2a-6439-4a3b-8f2a-ddca63ce9d26","type":"user","message":{"role":"user","content":[{"type":"image","source":{"type":"base64","media_type":"image/png","data":"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"}},{"text":"Ma questa soluzione? E'nativa di Blockly con due pannelli?","type":"text"}]},"uuid":"21503915-cda2-4500-87ed-8b152f96af91","timestamp":"2026-08-06T10:23:31.929Z","permissionMode":"acceptEdits","origin":{"kind":"human"},"promptSource":"sdk","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"type":"file-history-snapshot","messageId":"21503915-cda2-4500-87ed-8b152f96af91","snapshot":{"messageId":"21503915-cda2-4500-87ed-8b152f96af91","trackedFileBackups":{},"timestamp":"2026-08-06T10:23:31.935Z"},"isSnapshotUpdate":false}
{"type":"last-prompt","lastPrompt":"Ma questa soluzione? E'nativa di Blockly con due pannelli?","leafUuid":"21503915-cda2-4500-87ed-8b152f96af91","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01"}
{"type":"ai-title","aiTitle":"Continuare sessione modalità voice webapp","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01"}
{"parentUuid":"21503915-cda2-4500-87ed-8b152f96af91","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmL8hSbiQQfWRWfxtQBh","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"EscHCokBCBAYAipAFKCsM/gDMSCkb1OufJ1BcMLGDBkvV+BV5OSa/RXgRwGrEGQqICZZ+fa81YM2DeWtUyVbT732+f/op3f8uRNaXjIPY2xhdWRlLXNvbm5ldC01OABCCHRoaW5raW5nWiQzZDFjY2UyZS0wNjY0LTQwZDYtODQxNC1iN2U1MjhhY2UyYjESDAoPrD5wfAXGIbu7eBoMQz4IClK8CP8ymkBEIjB9XNAKmDZyVLUXTlzmA/ZngiPErU66TPPhkumu3cmW0f8IFDQQtdL9wYmMDAZdLMAq6gUKmZ8XHsF4tOBdIhC63PMSsdU8ek98LgEJLcmIrLk6Ju87xJI9S209T4Qn+jzt9BPcVDW8qqAwaYDMM8CCpp31BG4fahbiSbWKrWvCz98x4YxM82Oxw0j2ZxkUOxeMxWPfEx3PFWh2UqbNklVFzjMsJ1jws122JGP1CxHjndPBY5h7vOPfS7opBMkl/emQhLeCbHsiwi/D6G68nsLb16Nc++vb4hifw87nI8jrtqy39wKJe2OgJJWQ+647Z3B51sQLehygD9N0lCPQq1aMotMG5suLlmHvmaeu+1WKJA+aH6Y6aVhlN+XIYcP9/1vyv38EjELxS+BSv8j7FsoVIJxpi8UuPc9wzt/UKo/O2ejkDmwHqVMsRuM3+iQuFc19d03iy1ydYd0MLEgCdEzCkb5w03Xzr2agV/fTdeURbqjIY8nHnmchdwcUdd8sIcli3As8PwZsv3HVvpxTdAx4Mpz2Q8dN1z4y/Rtez+peCsU4TFcqQ+7cGsUBwn0Mm1r2VzNyI25wVt/Mk56l2VZvt1Ota1u0lUKXwT9T8Lt/n9zfSHApCHIQFAQbfB1/+Dlsu8Q9xBKeV/GfljXMT9fDTOag4GqXorD8ArJOciEh6L6em8ekN84S56/g61v2yAVIu+VVgeVx1oEKDsLceK5lTvdOgY4hDWz8rKdZ+1lVIghPzaNi77P+t1HYE7lh07MDXi+JA/2gspbRrt0q10uIcwH39q/pIIbGoku6tf+lJHQJNaYX3pXCPsFsPB7FexMcgnnkCcXGZ3QC9zaiqcaT1yA0T8gGQH/dVwEiJOY6lal6EH8ShHMF+bXLfdatafSg/KkzPOsS+r/q/IzUrecTyxSs6w9UrBzfUxpmRNWfbLKnUeW3S1SwGr5FrZrz3eEQ4jCVXxE5ZiL7lH8VtbiJhbF5WtM/pmgcKic3+r73pt358V2llN016YjLsyTnMCGRnyLIRhh9DnvB8gHi/+OvBlKsbRJ/WkTmRn9brhgB"}],"stop_reason":"end_turn","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":1140,"cache_read_input_tokens":82358,"output_tokens":807,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":1140,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":807,"cache_read_input_tokens":82358,"cache_creation_input_tokens":1140,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":1140},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmL8fQZhyuhg22Gyvbfb","type":"assistant","uuid":"f6878672-249e-44e6-b907-e6eefe503280","timestamp":"2026-08-06T10:23:36.119Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"f6878672-249e-44e6-b907-e6eefe503280","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmL8hSbiQQfWRWfxtQBh","type":"message","role":"assistant","content":[{"type":"text","text":"Sì, esattamente questo è nativo — è il \"category toolbox\" standard di Blockly, lo stesso che vedi nei playground ufficiali. Funziona già in due pannelli:\n\n- **Pannello stretto a sinistra**: elenco categorie (\"Logic\", \"Loops\", \"Math\"...), ognuna con una barra colorata — non blocchi, solo etichette. Larghezza fissa e stretta indipendentemente da quanti blocchi contiene una categoria.\n- **Flyout a comparsa**: cliccando una categoria si apre il secondo pannello (il riquadro blu nello screenshot) coi soli blocchi di quella categoria. Si chiude quando clicchi altrove o trascini un blocco sul canvas.\n\nMappato su PowerBricks: ogni dominio (Anagrafica, Emesso, Diritti, Boxoffice) diventa una categoria con il suo colore già esistente (rosso, ambra...) invece di \"Logic\"/\"Math\". Cliccando \"Emesso\" si apre il flyout con \"Tabella Emesso\", \"gruppo Emesso\", \"campo Emesso\" — esattamente il comportamento a due pannelli che stavi disegnando, ma gratis, senza codice custom per sincronizzare stato tra due pannelli.\n\nQuello che resta fuori da questo meccanismo nativo è la parte \"funzioni specifiche per la tabella\" (selezione campi, aggregazione) di cui parlavi prima — il flyout mostra solo blocchi trascinabili, non un pannello di controlli persistente. Per quello serve comunque qualcosa di custom in aggiunta, non alternativo."}],"stop_reason":"end_turn","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":1140,"cache_read_input_tokens":82358,"output_tokens":807,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":1140,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":807,"cache_read_input_tokens":82358,"cache_creation_input_tokens":1140,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":1140},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmL8fQZhyuhg22Gyvbfb","type":"assistant","uuid":"59bbfaba-c1fa-4541-a1ac-49cde543829c","timestamp":"2026-08-06T10:23:42.873Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"type":"queue-operation","operation":"enqueue","timestamp":"2026-08-06T10:24:55.375Z","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","content":"Aspetta però perchè questo va già nella nostra direzione: Nel flyout a comparsa possiamo aggiungere bottoni?"}
{"type":"queue-operation","operation":"dequeue","timestamp":"2026-08-06T10:24:55.454Z","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01"}
{"parentUuid":"59bbfaba-c1fa-4541-a1ac-49cde543829c","isSidechain":false,"promptId":"4d69ef34-25f0-4d40-a710-f172d3c40d1d","type":"user","message":{"role":"user","content":"Aspetta però perchè questo va già nella nostra direzione: Nel flyout a comparsa possiamo aggiungere bottoni?"},"uuid":"c4aba460-8504-4f47-b294-8c56822ba7a5","timestamp":"2026-08-06T10:24:55.467Z","permissionMode":"acceptEdits","origin":{"kind":"human"},"promptSource":"sdk","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"type":"file-history-snapshot","messageId":"c4aba460-8504-4f47-b294-8c56822ba7a5","snapshot":{"messageId":"c4aba460-8504-4f47-b294-8c56822ba7a5","trackedFileBackups":{},"timestamp":"2026-08-06T10:24:55.474Z"},"isSnapshotUpdate":false}
{"parentUuid":"c4aba460-8504-4f47-b294-8c56822ba7a5","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmLEsp6qLT8PBgCPpT9E","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"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"}],"stop_reason":"end_turn","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":857,"cache_read_input_tokens":83498,"output_tokens":995,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":857,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":995,"cache_read_input_tokens":83498,"cache_creation_input_tokens":857,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":857},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmLEpsVre5SJiEc3zyPw","type":"assistant","uuid":"14cfbd6c-e93a-46c0-81d8-2b6042adec23","timestamp":"2026-08-06T10:25:03.566Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"14cfbd6c-e93a-46c0-81d8-2b6042adec23","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmLEsp6qLT8PBgCPpT9E","type":"message","role":"assistant","content":[{"type":"text","text":"Sì — è una funzionalità nativa poco nota ma documentata: nel toolbox JSON puoi aggiungere elementi `{\"kind\": \"button\", \"text\": \"...\", \"callbackKey\": \"...\"}` accanto ai blocchi dentro una categoria, e in JS registri il comportamento con `workspace.registerButtonCallback(\"...\", callback)`. Blockly Games la usa da anni per pulsanti tipo \"Crea variabile\".\n\nApplicato a PowerBricks: nel flyout \"Emesso\" potresti avere i blocchi trascinabili (Tabella, gruppo, campo) **più** un bottone tipo \"Seleziona campi output\" che apre la stessa logica che oggi hai nella modale a doppio click — solo che invece di doppio-click sul blocco sul canvas, è un bottone ben visibile nel pannello del dominio. Stessa modale/pannello dietro le quinte, punto di accesso diverso e più scopribile.\n\nQuindi la direzione \"due pannelli con funzioni specifiche per tabella\" è raggiungibile quasi interamente con l'API nativa (categorie colorate + flyout + bottoni custom), senza costruire un sistema di pannelli sincronizzati a mano. Vuoi che prototipiamo questo — categorie per dominio con bottone selezione campi nel flyout?"}],"stop_reason":"end_turn","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":857,"cache_read_input_tokens":83498,"output_tokens":995,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":857,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":995,"cache_read_input_tokens":83498,"cache_creation_input_tokens":857,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":857},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmLEpsVre5SJiEc3zyPw","type":"assistant","uuid":"93365227-389d-455c-949d-50833c1e1ddb","timestamp":"2026-08-06T10:25:09.503Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"type":"queue-operation","operation":"enqueue","timestamp":"2026-08-06T10:25:41.042Z","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","content":"si"}
{"type":"queue-operation","operation":"dequeue","timestamp":"2026-08-06T10:25:41.048Z","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01"}
{"parentUuid":"93365227-389d-455c-949d-50833c1e1ddb","isSidechain":false,"promptId":"8e00cf3e-39fd-47ba-9744-19245c87b11c","type":"user","message":{"role":"user","content":"si"},"uuid":"2c9d9ed7-d540-45de-8a73-2bc62ff05df8","timestamp":"2026-08-06T10:25:41.065Z","permissionMode":"acceptEdits","origin":{"kind":"human"},"promptSource":"sdk","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"type":"file-history-snapshot","messageId":"2c9d9ed7-d540-45de-8a73-2bc62ff05df8","snapshot":{"messageId":"2c9d9ed7-d540-45de-8a73-2bc62ff05df8","trackedFileBackups":{},"timestamp":"2026-08-06T10:25:41.070Z"},"isSnapshotUpdate":false}
{"parentUuid":"2c9d9ed7-d540-45de-8a73-2bc62ff05df8","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmLJGBbPN7JWmiUx8j6w","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"ErQECokBCBAYAipAIzNwuqwO+DVj6drDuvSjDWpFyW/Ta8uRoE6/E8FYlAPJHA+r2amu0xzKkB5Zx3s2ZBE2KdxNCBLU5XWVPhdJ+zIPY2xhdWRlLXNvbm5ldC01OABCCHRoaW5raW5nWiQzZDFjY2UyZS0wNjY0LTQwZDYtODQxNC1iN2U1MjhhY2UyYjESDGWa6WtNItR6QNPNfhoMND23mIGC9Rsl+dMfIjBJpZhPfLExv5Uz67WoRWiTDXdHrnRcF02oeJEvAgbjnqnliKNNx6XCw5CNGOQROpEq1wJ6sWuF+dF2tcS0XV1wBuOxCZQUSYF5i2XYdSw3Myx2esYTQrkIqbFOHZ+lD7QA+X1P1kVUTXEEJFKnB+zJb14AdXMmjgOEXik6yGQtmvo1BbiAenu31Kae0tve1oFgiGGpmoJQhEH+tQAXzDAEise1rOQh1ZqUwRQ96CB9sUDjKi+3wTpxfv4ujldPkbc31Oz9188bS/vtS9SLAcialrrNXASOYIOc8k2RyHQVyQHGTE3lx5oOOaAleB7C3p6PRyqIPh+WISwldDNLwh+/txpohgxGQcSik3hDZIvrjovgS6/iP9XaXocV16fkFEhdu/TZW26q/O9jWSLlF8lAdjBeyQ/oDWwedQT0l9F4CbWIve4ZYCcYwGkBWm8k9fNAM8F+eER9I6YMnfCerqTqJ23nlW0b/4vgXzXEg6so095qoVFvy7w4yBUmtxgdWY/TeZcDrkek4kpYGAE="}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":999,"cache_read_input_tokens":84355,"output_tokens":188,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":999,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":188,"cache_read_input_tokens":84355,"cache_creation_input_tokens":999,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":999},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmLJBxqthHXZGgQMgZT5","type":"assistant","uuid":"75917a67-5601-4d27-95f7-e54ec119c3fb","timestamp":"2026-08-06T10:25:46.269Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"75917a67-5601-4d27-95f7-e54ec119c3fb","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmLJGBbPN7JWmiUx8j6w","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01AG36qqbN6Q9fmZnP1SqUvD","name":"Read","input":{"file_path":"/mnt/ssd/data/Dropbox/adrian/sandbox/powerbricks/frontend/app.js"},"caller":{"type":"direct"}}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":999,"cache_read_input_tokens":84355,"output_tokens":188,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":999,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":188,"cache_read_input_tokens":84355,"cache_creation_input_tokens":999,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":999},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmLJBxqthHXZGgQMgZT5","type":"assistant","uuid":"e6b55af7-6337-4ca5-89cc-8f96f054f977","timestamp":"2026-08-06T10:25:46.677Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"e6b55af7-6337-4ca5-89cc-8f96f054f977","isSidechain":false,"promptId":"8e00cf3e-39fd-47ba-9744-19245c87b11c","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01AG36qqbN6Q9fmZnP1SqUvD","type":"tool_result","content":"1\tconst OPS = [\n2\t [\"è uguale a\", \"equals\"],\n3\t [\"è diverso da\", \"not_equals\"],\n4\t [\"contiene\", \"contains\"],\n5\t [\"maggiore di\", \"gt\"],\n6\t [\"minore di\", \"lt\"],\n7\t [\"maggiore o uguale a\", \"gte\"],\n8\t [\"minore o uguale a\", \"lte\"],\n9\t [\"è tra (es. 2010,2020)\", \"between\"],\n10\t [\"è vuoto\", \"is_null\"],\n11\t [\"non è vuoto\", \"is_not_null\"],\n12\t];\n13\t\n14\tlet ALL_FIELD_NAMES = [];\n15\tlet ALL_EMESSO_FIELD_NAMES = [];\n16\tlet MODAL_TARGET_BLOCK = null; // il blocco su cui e' stato aperto il modale (pb_query o pb_emesso)\n17\tlet MODAL_ALL_NAMES = []; // elenco campi disponibili per il modale corrente\n18\t\n19\t// Doppio click sul blocco pb_query/pb_emesso -> apre il modale di selezione\n20\t// campi. Registrata come extension Blockly, cosi' l'evento nativo (non\n21\t// gestito da Blockly) si aggancia all'elemento SVG del blocco senza toccare\n22\t// il core. Stessa modale per entrambi i blocchi, solo l'elenco campi cambia.\n23\tBlockly.Extensions.register(\"pb_query_output_modal\", function () {\n24\t const block = this;\n25\t block.getSvgRoot().addEventListener(\"dblclick\", (e) => {\n26\t e.stopPropagation();\n27\t openCampiModal(block, ALL_FIELD_NAMES);\n28\t });\n29\t});\n30\t\n31\tBlockly.Extensions.register(\"pb_emesso_output_modal\", function () {\n32\t const block = this;\n33\t block.getSvgRoot().addEventListener(\"dblclick\", (e) => {\n34\t e.stopPropagation();\n35\t openCampiModal(block, ALL_EMESSO_FIELD_NAMES);\n36\t });\n37\t});\n38\t\n39\tfunction getBlockOutputFields(block, allNames) {\n40\t if (!block.data) return allNames.slice();\n41\t try {\n42\t const parsed = JSON.parse(block.data);\n43\t if (Array.isArray(parsed) && parsed.length > 0) return parsed;\n44\t } catch (e) {\n45\t // dati corrotti/vecchio formato: fallback a tutti i campi\n46\t }\n47\t return allNames.slice();\n48\t}\n49\t\n50\tfunction setBlockOutputFields(block, fields) {\n51\t block.data = JSON.stringify(fields);\n52\t}\n53\t\n54\tfunction option(name) {\n55\t const opt = document.createElement(\"option\");\n56\t opt.value = name;\n57\t opt.textContent = name;\n58\t return opt;\n59\t}\n60\t\n61\tfunction openCampiModal(block, allNames) {\n62\t MODAL_TARGET_BLOCK = block;\n63\t MODAL_ALL_NAMES = allNames;\n64\t const selezionati = document.getElementById(\"campiSelezionati\");\n65\t const disponibili = document.getElementById(\"campiDisponibili\");\n66\t selezionati.innerHTML = \"\";\n67\t disponibili.innerHTML = \"\";\n68\t\n69\t const scelti = getBlockOutputFields(block, allNames);\n70\t scelti.forEach((name) => selezionati.appendChild(option(name)));\n71\t allNames.filter((name) => !scelti.includes(name)).forEach((name) =>\n72\t disponibili.appendChild(option(name))\n73\t );\n74\t\n75\t document.getElementById(\"campiOverlay\").style.display = \"flex\";\n76\t}\n77\t\n78\tfunction closeCampiModal() {\n79\t document.getElementById(\"campiOverlay\").style.display = \"none\";\n80\t MODAL_TARGET_BLOCK = null;\n81\t}\n82\t\n83\tfunction spostaOrdine(select, direzione) {\n84\t const scelti = Array.from(select.selectedOptions);\n85\t if (direzione < 0) {\n86\t scelti.forEach((opt) => {\n87\t const prev = opt.previousElementSibling;\n88\t if (prev) select.insertBefore(opt, prev);\n89\t });\n90\t } else {\n91\t scelti.slice().reverse().forEach((opt) => {\n92\t const next = opt.nextElementSibling;\n93\t if (next) select.insertBefore(next, opt);\n94\t });\n95\t }\n96\t}\n97\t\n98\tfunction setupCampiModal() {\n99\t const disponibili = document.getElementById(\"campiDisponibili\");\n100\t const selezionati = document.getElementById(\"campiSelezionati\");\n101\t\n102\t document.getElementById(\"aggiungi\").addEventListener(\"click\", () => {\n103\t Array.from(disponibili.selectedOptions).forEach((opt) => selezionati.appendChild(opt));\n104\t });\n105\t document.getElementById(\"rimuovi\").addEventListener(\"click\", () => {\n106\t Array.from(selezionati.selectedOptions).forEach((opt) => disponibili.appendChild(opt));\n107\t });\n108\t document.getElementById(\"sposta-su\").addEventListener(\"click\", () => spostaOrdine(selezionati, -1));\n109\t document.getElementById(\"sposta-giu\").addEventListener(\"click\", () => spostaOrdine(selezionati, 1));\n110\t\n111\t document.getElementById(\"campiAnnulla\").addEventListener(\"click\", closeCampiModal);\n112\t document.getElementById(\"campiApplica\").addEventListener(\"click\", () => {\n113\t if (MODAL_TARGET_BLOCK) {\n114\t const fields = Array.from(selezionati.options).map((o) => o.value);\n115\t setBlockOutputFields(MODAL_TARGET_BLOCK, fields);\n116\t }\n117\t closeCampiModal();\n118\t });\n119\t}\n120\t\n121\tasync function main() {\n122\t const res = await fetch(\"/api/fields\");\n123\t const fields = await res.json();\n124\t const fieldOptions = fields.map((f) => [f.name, f.name]);\n125\t ALL_FIELD_NAMES = fields.map((f) => f.name);\n126\t\n127\t const resEmesso = await fetch(\"/api/fields_emesso\");\n128\t const emessoFields = await resEmesso.json();\n129\t ALL_EMESSO_FIELD_NAMES = emessoFields.map((f) => f.name);\n130\t const emessoFieldOptions = emessoFields.map((f) => [f.name, f.name]);\n131\t\n132\t Blockly.defineBlocksWithJsonArray([\n133\t {\n134\t type: \"pb_query\",\n135\t message0: \"Tabella Anagrafica %1 %2\",\n136\t args0: [\n137\t { type: \"input_dummy\" },\n138\t { type: \"input_statement\", name: \"FILTRI\", check: \"anagrafica_filtro\" },\n139\t ],\n140\t colour: \"#C62828\",\n141\t tooltip: \"Contenitore dei filtri da applicare all'Anagrafica — doppio click per scegliere i campi in output\",\n142\t extensions: [\"pb_query_output_modal\"],\n143\t },\n144\t {\n145\t type: \"pb_emesso\",\n146\t message0: \"Tabella Emesso %1\",\n147\t args0: [\n148\t { type: \"input_statement\", name: \"FILTRI\", check: \"emesso_filtro\" },\n149\t ],\n150\t colour: \"#F9A825\",\n151\t tooltip: \"Blocco indipendente da 'Tabella Anagrafica' — se presente sulla lavagna si unisce implicitamente su prodotto+edizione (join fissa, per ora nessun blocco 'ponte' per sceglierne il tipo, e nessuna aggregazione prima/ultima — restituisce una riga per emissione; l'aggregazione sarà un concetto a sé in uno step successivo). Doppio click per scegliere i campi in output\",\n152\t extensions: [\"pb_emesso_output_modal\"],\n153\t },\n154\t {\n155\t type: \"pb_filtro\",\n156\t message0: \"campo %1 %2 %3\",\n157\t args0: [\n158\t { type: \"field_dropdown\", name: \"FIELD\", options: fieldOptions },\n159\t { type: \"field_dropdown\", name: \"OP\", options: OPS },\n160\t { type: \"field_input\", name: \"VALUE\", text: \"\" },\n161\t ],\n162\t previousStatement: \"anagrafica_filtro\",\n163\t nextStatement: \"anagrafica_filtro\",\n164\t colour: \"#EF9A9A\",\n165\t tooltip: \"Un singolo filtro su Anagrafica: campo, operatore, valore (ignorato per 'vuoto'/'non è vuoto')\",\n166\t },\n167\t {\n168\t type: \"pb_gruppo\",\n169\t message0: \"gruppo %1 %2\",\n170\t args0: [\n171\t {\n172\t type: \"field_dropdown\",\n173\t name: \"OP\",\n174\t options: [\n175\t [\"E — tutte vere (AND)\", \"AND\"],\n176\t [\"O — almeno una vera (OR)\", \"OR\"],\n177\t ],\n178\t },\n179\t { type: \"input_statement\", name: \"CHILDREN\", check: \"anagrafica_filtro\" },\n180\t ],\n181\t previousStatement: \"anagrafica_filtro\",\n182\t nextStatement: \"anagrafica_filtro\",\n183\t colour: \"#E57373\",\n184\t tooltip: \"Raggruppa più filtri/gruppi Anagrafica in AND o in OR\",\n185\t },\n186\t {\n187\t type: \"pb_filtro_emesso\",\n188\t message0: \"campo Emesso %1 %2 %3\",\n189\t args0: [\n190\t { type: \"field_dropdown\", name: \"FIELD\", options: emessoFieldOptions },\n191\t { type: \"field_dropdown\", name: \"OP\", options: OPS },\n192\t { type: \"field_input\", name: \"VALUE\", text: \"\" },\n193\t ],\n194\t previousStatement: \"emesso_filtro\",\n195\t nextStatement: \"emesso_filtro\",\n196\t colour: \"#FFE082\",\n197\t tooltip: \"Un singolo filtro su Emesso: campo, operatore, valore (ignorato per 'vuoto'/'non è vuoto')\",\n198\t },\n199\t {\n200\t type: \"pb_gruppo_emesso\",\n201\t message0: \"gruppo Emesso %1 %2\",\n202\t args0: [\n203\t {\n204\t type: \"field_dropdown\",\n205\t name: \"OP\",\n206\t options: [\n207\t [\"E — tutte vere (AND)\", \"AND\"],\n208\t [\"O — almeno una vera (OR)\", \"OR\"],\n209\t ],\n210\t },\n211\t { type: \"input_statement\", name: \"CHILDREN\", check: \"emesso_filtro\" },\n212\t ],\n213\t previousStatement: \"emesso_filtro\",\n214\t nextStatement: \"emesso_filtro\",\n215\t colour: \"#FFCA28\",\n216\t tooltip: \"Raggruppa più filtri/gruppi Emesso in AND o in OR\",\n217\t },\n218\t {\n219\t type: \"pb_join\",\n220\t message0: \"Join Anagrafica ↔ Emesso %1\",\n221\t args0: [\n222\t {\n223\t type: \"field_dropdown\",\n224\t name: \"TYPE\",\n225\t options: [\n226\t [\"Automatico (consigliato)\", \"auto\"],\n227\t [\"Tieni tutti gli Anagrafica (LEFT)\", \"left\"],\n228\t [\"Solo corrispondenze (INNER)\", \"inner\"],\n229\t ],\n230\t },\n231\t ],\n232\t colour: \"#757575\",\n233\t tooltip: \"Blocco 'ponte' facoltativo: forza il tipo di join tra Anagrafica ed Emesso. Se assente (o su 'Automatico'), la scelta è automatica: INNER se ci sono filtri su Emesso, LEFT altrimenti.\",\n234\t },\n235\t ]);\n236\t\n237\t // Tema Blockly allineato alla palette MediaTrack (style.css) — sfondi\n238\t // toolbox/flyout/workspace, non solo i colori dei blocchi sopra.\n239\t const mediatrackTheme = Blockly.Theme.defineTheme(\"mediatrack\", {\n240\t base: Blockly.Themes.Classic,\n241\t componentStyles: {\n242\t workspaceBackgroundColour: \"#ffffff\",\n243\t toolboxBackgroundColour: \"#f5f5f5\",\n244\t toolboxForegroundColour: \"#333333\",\n245\t flyoutBackgroundColour: \"#f5f5f5\",\n246\t flyoutForegroundColour: \"#333333\",\n247\t flyoutOpacity: 1,\n248\t scrollbarColour: \"#bbbbbb\",\n249\t insertionMarkerColour: \"#C62828\",\n250\t insertionMarkerOpacity: 0.3,\n251\t },\n252\t });\n253\t\n254\t const workspace = Blockly.inject(\"blocklyDiv\", {\n255\t toolbox: document.getElementById(\"toolbox\"),\n256\t theme: mediatrackTheme,\n257\t });\n258\t\n259\t // Blocco di partenza già presente, cosi' il workspace non e' vuoto al primo avvio\n260\t const start = workspace.newBlock(\"pb_query\");\n261\t start.initSvg();\n262\t start.render();\n263\t start.moveBy(40, 40);\n264\t\n265\t setupCampiModal();\n266\t\n267\t document.getElementById(\"run\").addEventListener(\"click\", () => run(workspace));\n268\t}\n269\t\n270\tfunction blockToNode(block) {\n271\t if (block.type === \"pb_filtro\" || block.type === \"pb_filtro_emesso\") {\n272\t return {\n273\t kind: \"filtro\",\n274\t field: block.getFieldValue(\"FIELD\"),\n275\t op: block.getFieldValue(\"OP\"),\n276\t value: block.getFieldValue(\"VALUE\"),\n277\t };\n278\t }\n279\t if (block.type === \"pb_gruppo\" || block.type === \"pb_gruppo_emesso\") {\n280\t return {\n281\t kind: \"gruppo\",\n282\t op: block.getFieldValue(\"OP\"),\n283\t children: collectChain(block.getInputTargetBlock(\"CHILDREN\")),\n284\t };\n285\t }\n286\t return null;\n287\t}\n288\t\n289\tfunction collectChain(startBlock) {\n290\t const nodes = [];\n291\t let block = startBlock;\n292\t while (block) {\n293\t const node = blockToNode(block);\n294\t if (node) nodes.push(node);\n295\t block = block.getNextBlock();\n296\t }\n297\t return nodes;\n298\t}\n299\t\n300\tfunction collectFilters(queryBlock) {\n301\t return collectChain(queryBlock.getInputTargetBlock(\"FILTRI\"));\n302\t}\n303\t\n304\tfunction getJoinType(workspace) {\n305\t // Blocco \"ponte\" pb_join, facoltativo e indipendente — se assente, il\n306\t // backend sceglie da solo (default \"auto\").\n307\t const joinBlocks = workspace.getBlocksByType(\"pb_join\", false);\n308\t if (joinBlocks.length === 0) return \"auto\";\n309\t return joinBlocks[0].getFieldValue(\"TYPE\");\n310\t}\n311\t\n312\tfunction getEmessoConfig(workspace) {\n313\t // Blocco \"Tabella Emesso\" indipendente sulla lavagna, non piu' annidato\n314\t // dentro \"Tabella Anagrafica\" — se presente si unisce implicitamente su\n315\t // prodotto+edizione, a meno che un blocco \"ponte\" pb_join non forzi\n316\t // esplicitamente il tipo di join. Nessuna aggregazione qui: concetto\n317\t // rimandato a un blocco a se' futuro, il backend di default restituisce\n318\t // una riga per emissione (\"tutte\").\n319\t const emessoBlocks = workspace.getBlocksByType(\"pb_emesso\", false);\n320\t if (emessoBlocks.length === 0) return null;\n321\t const emessoBlock = emessoBlocks[0];\n322\t return {\n323\t fields: getBlockOutputFields(emessoBlock, ALL_EMESSO_FIELD_NAMES),\n324\t filters: collectChain(emessoBlock.getInputTargetBlock(\"FILTRI\")),\n325\t join_type: getJoinType(workspace),\n326\t };\n327\t}\n328\t\n329\tfunction getQueryPayload(workspace) {\n330\t const queryBlocks = workspace.getBlocksByType(\"pb_query\", false);\n331\t if (queryBlocks.length === 0) return null;\n332\t const queryBlock = queryBlocks[0];\n333\t return {\n334\t filters: collectFilters(queryBlock),\n335\t fields: getBlockOutputFields(queryBlock, ALL_FIELD_NAMES),\n336\t emesso: getEmessoConfig(workspace),\n337\t };\n338\t}\n339\t\n340\tasync function run(workspace) {\n341\t const status = document.getElementById(\"status\");\n342\t\n343\t const payload = getQueryPayload(workspace);\n344\t if (!payload) {\n345\t status.textContent = \"Serve un blocco 'Query Anagrafica'\";\n346\t return;\n347\t }\n348\t\n349\t status.textContent = \"Apertura griglia...\";\n350\t try {\n351\t const res = await fetch(\"/api/open_grid\", {\n352\t method: \"POST\",\n353\t headers: { \"Content-Type\": \"application/json\" },\n354\t body: JSON.stringify({ ...payload, limit: 5000 }),\n355\t });\n356\t const data = await res.json();\n357\t if (!res.ok) {\n358\t status.textContent = \"Errore: \" + data.error;\n359\t return;\n360\t }\n361\t status.textContent = `Griglia aperta (${data.rows} righe)`;\n362\t } catch (e) {\n363\t status.textContent = \"Errore: \" + e;\n364\t }\n365\t}\n366\t\n367\tmain();\n368\t"}]},"uuid":"aedd425a-f139-4903-b0dc-262df03179ce","timestamp":"2026-08-06T10:25:46.743Z","toolUseResult":{"type":"text","file":{"filePath":"/mnt/ssd/data/Dropbox/adrian/sandbox/powerbricks/frontend/app.js","content":"const OPS = [\n [\"è uguale a\", \"equals\"],\n [\"è diverso da\", \"not_equals\"],\n [\"contiene\", \"contains\"],\n [\"maggiore di\", \"gt\"],\n [\"minore di\", \"lt\"],\n [\"maggiore o uguale a\", \"gte\"],\n [\"minore o uguale a\", \"lte\"],\n [\"è tra (es. 2010,2020)\", \"between\"],\n [\"è vuoto\", \"is_null\"],\n [\"non è vuoto\", \"is_not_null\"],\n];\n\nlet ALL_FIELD_NAMES = [];\nlet ALL_EMESSO_FIELD_NAMES = [];\nlet MODAL_TARGET_BLOCK = null; // il blocco su cui e' stato aperto il modale (pb_query o pb_emesso)\nlet MODAL_ALL_NAMES = []; // elenco campi disponibili per il modale corrente\n\n// Doppio click sul blocco pb_query/pb_emesso -> apre il modale di selezione\n// campi. Registrata come extension Blockly, cosi' l'evento nativo (non\n// gestito da Blockly) si aggancia all'elemento SVG del blocco senza toccare\n// il core. Stessa modale per entrambi i blocchi, solo l'elenco campi cambia.\nBlockly.Extensions.register(\"pb_query_output_modal\", function () {\n const block = this;\n block.getSvgRoot().addEventListener(\"dblclick\", (e) => {\n e.stopPropagation();\n openCampiModal(block, ALL_FIELD_NAMES);\n });\n});\n\nBlockly.Extensions.register(\"pb_emesso_output_modal\", function () {\n const block = this;\n block.getSvgRoot().addEventListener(\"dblclick\", (e) => {\n e.stopPropagation();\n openCampiModal(block, ALL_EMESSO_FIELD_NAMES);\n });\n});\n\nfunction getBlockOutputFields(block, allNames) {\n if (!block.data) return allNames.slice();\n try {\n const parsed = JSON.parse(block.data);\n if (Array.isArray(parsed) && parsed.length > 0) return parsed;\n } catch (e) {\n // dati corrotti/vecchio formato: fallback a tutti i campi\n }\n return allNames.slice();\n}\n\nfunction setBlockOutputFields(block, fields) {\n block.data = JSON.stringify(fields);\n}\n\nfunction option(name) {\n const opt = document.createElement(\"option\");\n opt.value = name;\n opt.textContent = name;\n return opt;\n}\n\nfunction openCampiModal(block, allNames) {\n MODAL_TARGET_BLOCK = block;\n MODAL_ALL_NAMES = allNames;\n const selezionati = document.getElementById(\"campiSelezionati\");\n const disponibili = document.getElementById(\"campiDisponibili\");\n selezionati.innerHTML = \"\";\n disponibili.innerHTML = \"\";\n\n const scelti = getBlockOutputFields(block, allNames);\n scelti.forEach((name) => selezionati.appendChild(option(name)));\n allNames.filter((name) => !scelti.includes(name)).forEach((name) =>\n disponibili.appendChild(option(name))\n );\n\n document.getElementById(\"campiOverlay\").style.display = \"flex\";\n}\n\nfunction closeCampiModal() {\n document.getElementById(\"campiOverlay\").style.display = \"none\";\n MODAL_TARGET_BLOCK = null;\n}\n\nfunction spostaOrdine(select, direzione) {\n const scelti = Array.from(select.selectedOptions);\n if (direzione < 0) {\n scelti.forEach((opt) => {\n const prev = opt.previousElementSibling;\n if (prev) select.insertBefore(opt, prev);\n });\n } else {\n scelti.slice().reverse().forEach((opt) => {\n const next = opt.nextElementSibling;\n if (next) select.insertBefore(next, opt);\n });\n }\n}\n\nfunction setupCampiModal() {\n const disponibili = document.getElementById(\"campiDisponibili\");\n const selezionati = document.getElementById(\"campiSelezionati\");\n\n document.getElementById(\"aggiungi\").addEventListener(\"click\", () => {\n Array.from(disponibili.selectedOptions).forEach((opt) => selezionati.appendChild(opt));\n });\n document.getElementById(\"rimuovi\").addEventListener(\"click\", () => {\n Array.from(selezionati.selectedOptions).forEach((opt) => disponibili.appendChild(opt));\n });\n document.getElementById(\"sposta-su\").addEventListener(\"click\", () => spostaOrdine(selezionati, -1));\n document.getElementById(\"sposta-giu\").addEventListener(\"click\", () => spostaOrdine(selezionati, 1));\n\n document.getElementById(\"campiAnnulla\").addEventListener(\"click\", closeCampiModal);\n document.getElementById(\"campiApplica\").addEventListener(\"click\", () => {\n if (MODAL_TARGET_BLOCK) {\n const fields = Array.from(selezionati.options).map((o) => o.value);\n setBlockOutputFields(MODAL_TARGET_BLOCK, fields);\n }\n closeCampiModal();\n });\n}\n\nasync function main() {\n const res = await fetch(\"/api/fields\");\n const fields = await res.json();\n const fieldOptions = fields.map((f) => [f.name, f.name]);\n ALL_FIELD_NAMES = fields.map((f) => f.name);\n\n const resEmesso = await fetch(\"/api/fields_emesso\");\n const emessoFields = await resEmesso.json();\n ALL_EMESSO_FIELD_NAMES = emessoFields.map((f) => f.name);\n const emessoFieldOptions = emessoFields.map((f) => [f.name, f.name]);\n\n Blockly.defineBlocksWithJsonArray([\n {\n type: \"pb_query\",\n message0: \"Tabella Anagrafica %1 %2\",\n args0: [\n { type: \"input_dummy\" },\n { type: \"input_statement\", name: \"FILTRI\", check: \"anagrafica_filtro\" },\n ],\n colour: \"#C62828\",\n tooltip: \"Contenitore dei filtri da applicare all'Anagrafica — doppio click per scegliere i campi in output\",\n extensions: [\"pb_query_output_modal\"],\n },\n {\n type: \"pb_emesso\",\n message0: \"Tabella Emesso %1\",\n args0: [\n { type: \"input_statement\", name: \"FILTRI\", check: \"emesso_filtro\" },\n ],\n colour: \"#F9A825\",\n tooltip: \"Blocco indipendente da 'Tabella Anagrafica' — se presente sulla lavagna si unisce implicitamente su prodotto+edizione (join fissa, per ora nessun blocco 'ponte' per sceglierne il tipo, e nessuna aggregazione prima/ultima — restituisce una riga per emissione; l'aggregazione sarà un concetto a sé in uno step successivo). Doppio click per scegliere i campi in output\",\n extensions: [\"pb_emesso_output_modal\"],\n },\n {\n type: \"pb_filtro\",\n message0: \"campo %1 %2 %3\",\n args0: [\n { type: \"field_dropdown\", name: \"FIELD\", options: fieldOptions },\n { type: \"field_dropdown\", name: \"OP\", options: OPS },\n { type: \"field_input\", name: \"VALUE\", text: \"\" },\n ],\n previousStatement: \"anagrafica_filtro\",\n nextStatement: \"anagrafica_filtro\",\n colour: \"#EF9A9A\",\n tooltip: \"Un singolo filtro su Anagrafica: campo, operatore, valore (ignorato per 'vuoto'/'non è vuoto')\",\n },\n {\n type: \"pb_gruppo\",\n message0: \"gruppo %1 %2\",\n args0: [\n {\n type: \"field_dropdown\",\n name: \"OP\",\n options: [\n [\"E — tutte vere (AND)\", \"AND\"],\n [\"O — almeno una vera (OR)\", \"OR\"],\n ],\n },\n { type: \"input_statement\", name: \"CHILDREN\", check: \"anagrafica_filtro\" },\n ],\n previousStatement: \"anagrafica_filtro\",\n nextStatement: \"anagrafica_filtro\",\n colour: \"#E57373\",\n tooltip: \"Raggruppa più filtri/gruppi Anagrafica in AND o in OR\",\n },\n {\n type: \"pb_filtro_emesso\",\n message0: \"campo Emesso %1 %2 %3\",\n args0: [\n { type: \"field_dropdown\", name: \"FIELD\", options: emessoFieldOptions },\n { type: \"field_dropdown\", name: \"OP\", options: OPS },\n { type: \"field_input\", name: \"VALUE\", text: \"\" },\n ],\n previousStatement: \"emesso_filtro\",\n nextStatement: \"emesso_filtro\",\n colour: \"#FFE082\",\n tooltip: \"Un singolo filtro su Emesso: campo, operatore, valore (ignorato per 'vuoto'/'non è vuoto')\",\n },\n {\n type: \"pb_gruppo_emesso\",\n message0: \"gruppo Emesso %1 %2\",\n args0: [\n {\n type: \"field_dropdown\",\n name: \"OP\",\n options: [\n [\"E — tutte vere (AND)\", \"AND\"],\n [\"O — almeno una vera (OR)\", \"OR\"],\n ],\n },\n { type: \"input_statement\", name: \"CHILDREN\", check: \"emesso_filtro\" },\n ],\n previousStatement: \"emesso_filtro\",\n nextStatement: \"emesso_filtro\",\n colour: \"#FFCA28\",\n tooltip: \"Raggruppa più filtri/gruppi Emesso in AND o in OR\",\n },\n {\n type: \"pb_join\",\n message0: \"Join Anagrafica ↔ Emesso %1\",\n args0: [\n {\n type: \"field_dropdown\",\n name: \"TYPE\",\n options: [\n [\"Automatico (consigliato)\", \"auto\"],\n [\"Tieni tutti gli Anagrafica (LEFT)\", \"left\"],\n [\"Solo corrispondenze (INNER)\", \"inner\"],\n ],\n },\n ],\n colour: \"#757575\",\n tooltip: \"Blocco 'ponte' facoltativo: forza il tipo di join tra Anagrafica ed Emesso. Se assente (o su 'Automatico'), la scelta è automatica: INNER se ci sono filtri su Emesso, LEFT altrimenti.\",\n },\n ]);\n\n // Tema Blockly allineato alla palette MediaTrack (style.css) — sfondi\n // toolbox/flyout/workspace, non solo i colori dei blocchi sopra.\n const mediatrackTheme = Blockly.Theme.defineTheme(\"mediatrack\", {\n base: Blockly.Themes.Classic,\n componentStyles: {\n workspaceBackgroundColour: \"#ffffff\",\n toolboxBackgroundColour: \"#f5f5f5\",\n toolboxForegroundColour: \"#333333\",\n flyoutBackgroundColour: \"#f5f5f5\",\n flyoutForegroundColour: \"#333333\",\n flyoutOpacity: 1,\n scrollbarColour: \"#bbbbbb\",\n insertionMarkerColour: \"#C62828\",\n insertionMarkerOpacity: 0.3,\n },\n });\n\n const workspace = Blockly.inject(\"blocklyDiv\", {\n toolbox: document.getElementById(\"toolbox\"),\n theme: mediatrackTheme,\n });\n\n // Blocco di partenza già presente, cosi' il workspace non e' vuoto al primo avvio\n const start = workspace.newBlock(\"pb_query\");\n start.initSvg();\n start.render();\n start.moveBy(40, 40);\n\n setupCampiModal();\n\n document.getElementById(\"run\").addEventListener(\"click\", () => run(workspace));\n}\n\nfunction blockToNode(block) {\n if (block.type === \"pb_filtro\" || block.type === \"pb_filtro_emesso\") {\n return {\n kind: \"filtro\",\n field: block.getFieldValue(\"FIELD\"),\n op: block.getFieldValue(\"OP\"),\n value: block.getFieldValue(\"VALUE\"),\n };\n }\n if (block.type === \"pb_gruppo\" || block.type === \"pb_gruppo_emesso\") {\n return {\n kind: \"gruppo\",\n op: block.getFieldValue(\"OP\"),\n children: collectChain(block.getInputTargetBlock(\"CHILDREN\")),\n };\n }\n return null;\n}\n\nfunction collectChain(startBlock) {\n const nodes = [];\n let block = startBlock;\n while (block) {\n const node = blockToNode(block);\n if (node) nodes.push(node);\n block = block.getNextBlock();\n }\n return nodes;\n}\n\nfunction collectFilters(queryBlock) {\n return collectChain(queryBlock.getInputTargetBlock(\"FILTRI\"));\n}\n\nfunction getJoinType(workspace) {\n // Blocco \"ponte\" pb_join, facoltativo e indipendente — se assente, il\n // backend sceglie da solo (default \"auto\").\n const joinBlocks = workspace.getBlocksByType(\"pb_join\", false);\n if (joinBlocks.length === 0) return \"auto\";\n return joinBlocks[0].getFieldValue(\"TYPE\");\n}\n\nfunction getEmessoConfig(workspace) {\n // Blocco \"Tabella Emesso\" indipendente sulla lavagna, non piu' annidato\n // dentro \"Tabella Anagrafica\" — se presente si unisce implicitamente su\n // prodotto+edizione, a meno che un blocco \"ponte\" pb_join non forzi\n // esplicitamente il tipo di join. Nessuna aggregazione qui: concetto\n // rimandato a un blocco a se' futuro, il backend di default restituisce\n // una riga per emissione (\"tutte\").\n const emessoBlocks = workspace.getBlocksByType(\"pb_emesso\", false);\n if (emessoBlocks.length === 0) return null;\n const emessoBlock = emessoBlocks[0];\n return {\n fields: getBlockOutputFields(emessoBlock, ALL_EMESSO_FIELD_NAMES),\n filters: collectChain(emessoBlock.getInputTargetBlock(\"FILTRI\")),\n join_type: getJoinType(workspace),\n };\n}\n\nfunction getQueryPayload(workspace) {\n const queryBlocks = workspace.getBlocksByType(\"pb_query\", false);\n if (queryBlocks.length === 0) return null;\n const queryBlock = queryBlocks[0];\n return {\n filters: collectFilters(queryBlock),\n fields: getBlockOutputFields(queryBlock, ALL_FIELD_NAMES),\n emesso: getEmessoConfig(workspace),\n };\n}\n\nasync function run(workspace) {\n const status = document.getElementById(\"status\");\n\n const payload = getQueryPayload(workspace);\n if (!payload) {\n status.textContent = \"Serve un blocco 'Query Anagrafica'\";\n return;\n }\n\n status.textContent = \"Apertura griglia...\";\n try {\n const res = await fetch(\"/api/open_grid\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ ...payload, limit: 5000 }),\n });\n const data = await res.json();\n if (!res.ok) {\n status.textContent = \"Errore: \" + data.error;\n return;\n }\n status.textContent = `Griglia aperta (${data.rows} righe)`;\n } catch (e) {\n status.textContent = \"Errore: \" + e;\n }\n}\n\nmain();\n","numLines":368,"startLine":1,"totalLines":368}},"sourceToolAssistantUUID":"e6b55af7-6337-4ca5-89cc-8f96f054f977","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"aedd425a-f139-4903-b0dc-262df03179ce","isSidechain":false,"attachment":{"type":"nested_memory","path":"/mnt/ssd/data/Dropbox/adrian/sandbox/powerbricks/CLAUDE.md","content":{"path":"/mnt/ssd/data/Dropbox/adrian/sandbox/powerbricks/CLAUDE.md","type":"Project","content":"# CLAUDE.md — PowerBricks (sandbox prototipo)\n**Versione:** v6\n**Ultimo aggiornamento:** 2026-08-05\n\nEredita la Costituzione principale (`Dropbox/adrian/CLAUDE.md`). Solo contesto locale qui sotto.\n\n## Cos'è\n\nPrototipo del query builder visuale PowerBricks — passo 1 (solo Anagrafica) validato con\nconvinzione, ora in **passo 2** con l'aggiunta di Emesso (join + aggregazione), strategia\ncompleta in `archivio/Mauro/lavoro/lavoro-python-ecosistema/PowerBricks.md`.\n\n**Direzione strategica emersa 05/08/2026**: PowerBricks è di fatto un generatore di SQL\nparametrico — l'output naturale non è solo una tabella HTML ma può alimentare **una griglia\nin stile Linker** (MyICR_Suite), oggi in sola lettura. Vedi sezione \"Griglia risultati PyQt6\"\nsotto per l'implementazione.\n\nVive fuori da `PYTHON/` deliberatamente: `PYTHON/` è scrivibile solo dall'istanza Ufficio,\nquesta sandbox invece va scritta anche da Nave. Sincronizzata via Dropbox+git come il resto\ndi `adrian/`.\n\n## Stack\n\nStesso pattern di `PYTHON/MyICR_Suite/app/modules/mediatrack/` (modello di riferimento\ndichiarato in MyICR_Suite/CLAUDE.md): **Flask + pywebview**, non browser puro — l'app si apre\ncome finestra desktop nativa, Flask gira in thread interno su `127.0.0.1`.\n\n- **Flask** — unico backend, serve sia le pagine che l'API `/api/*`\n- **pywebview** — finestra nativa che incapsula il frontend Flask\n- **DuckDB** — query in-memory direttamente sul parquet Anagrafica, nessuna copia dati\n- **Blockly** (via CDN nel frontend, vendorizzare se serve lavorare offline) — blocchi `pb_query` (contenitore Anagrafica), `pb_gruppo`/`pb_filtro` (filtri Anagrafica), `pb_emesso` (contenitore Emesso, indipendente), `pb_gruppo_emesso`/`pb_filtro_emesso` (filtri Emesso), `pb_join` (ponte facoltativo, forza il tipo di join — vedi sezione dedicata sotto)\n\nOperatori supportati: `equals`, `not_equals`, `contains` (solo stringhe), `gt`/`lt`/`gte`/`lte` (solo numerici), `between` (numerici, valore `\"v1,v2\"`), `is_null`, `is_not_null`. Validazione lato backend per tipo di campo (`_build_filtro` in `backend/server.py`).\n\n**Selezione campi in output — modale su doppio click (05/08/2026)**: dopo tre tentativi scartati per tenere la selezione sempre visibile (checkbox, doppio elenco fisso, blocco Blockly nativo), la soluzione finale tiene il canvas Blockly pulito (solo filtri) e sposta la scelta dei campi in un **modale HTML** che si apre con doppio click sul blocco `pb_query` (\"Tabella Anagrafica\") — un vero pannello dedicato che compare solo quando serve, coerente con come Access/Power BI trattano la selezione campi (vedi `PowerBricks.md`). Meccanica: estensione Blockly `pb_query_output_modal` (`Blockly.Extensions.register`, in `app.js`) aggancia un listener DOM `dblclick` su `block.getSvgRoot()`; il modale riusa il doppio elenco \"disponibili ↔ selezionati\" con frecce sposta/riordina; la selezione si salva su `block.data` (stringa JSON, serializzata automaticamente da Blockly col resto del workspace — nessuna persistenza custom necessaria).\n\n## Passo 2 — Emesso (05/08/2026)\n\n**Dati**: `emesso.parquet` (stesso `_PARQUET_DIR` di `prodotti.parquet`), 8,8M righe — molto\npiù grande di Anagrafica (226k), conferma la relazione **1:molti** anticipata nella strategia\n(`PowerBricks.md`): un prodotto/edizione può avere decine/centinaia di righe, una per\ntrasmissione. Chiave di join: `prodotto`+`edizione`, stessa di Anagrafica. Campi esposti in\noutput (`EMESSO_FIELDS` in `backend/server.py`): `rete`, `data_emissione`, `ora_inizio`,\n`ora_fine`, `durata_netta`, `prima_visione`, `episodio`, `audience`, `share`, `durata_lorda`,\n`tipologia`, `fascia` — esclusi `prodotto`/`edizione` (chiavi di join, ridondanti in output) e\n`ncparpgm` (codice interno, non utile).\n\n**Emesso ora flessibile quanto Anagrafica (WHERE + SELECT), 05/08/2026**: dopo il primo giro\nsolo-aggregazione, richiesta esplicita di Mauro di rendere Emesso pari ad Anagrafica —\nfiltrabile con blocchi propri, non solo selezionabile in output. Aggiunti `pb_filtro_emesso`\ne `pb_gruppo_emesso` (stessa logica di `pb_filtro`/`pb_gruppo`, stesso set operatori `OPS`,\ncampi presi da `ALL_EMESSO_FIELD_NAMES` invece di `ALL_FIELD_NAMES`), agganciati in un nuovo\nslot `FILTRI` dentro `pb_emesso` stesso.\n\n**Isolamento tra domini via `check` Blockly**: gli statement input e i blocchi dichiarano un\ntipo di connessione (`anagrafica_filtro` per `pb_query`/`pb_filtro`/`pb_gruppo`,\n`emesso_filtro` per `pb_emesso`/`pb_filtro_emesso`/`pb_gruppo_emesso`) — Blockly impedisce a\nlivello di incastro di mescolare un filtro Anagrafica dentro lo slot filtri di Emesso o\nviceversa, non serve validarlo lato codice.\n\n**`pb_query`/`pb_emesso` sganciati, blocchi indipendenti sulla lavagna (05/08/2026)**: prima\n`pb_emesso` si agganciava in uno slot `EMESSO` dentro `pb_query` (nidificato). Corretto su\nrichiesta di Mauro: sono due blocchi container separati, entrambi senza\n`previousStatement`/`nextStatement` (come `pb_query` già era) — viaggiano indipendenti sul\nworkspace, non uno dentro l'altro. Se `pb_emesso` è presente da qualche parte sulla lavagna,\nsi unisce **implicitamente** su `prodotto`+`edizione` (join fissa, nessuna scelta esplicita) —\nMauro ha segnalato esplicitamente che in futuro potrebbe arrivare un blocco \"ponte\" per\nscegliere il tipo di join, ma non ora. Lato codice: `getEmessoConfig(workspace)` cerca il\nblocco `pb_emesso` con `workspace.getBlocksByType(\"pb_emesso\", false)` invece di leggerlo da\nuno slot annidato di `pb_query` — il backend (join implicita su chiave fissa) non cambia,\nsolo la sorgente della configurazione lato frontend.\n\n**Backend generico per tabella**: `_build_filtro`/`_build_node`/`_build_where` ora prendono\n`fields_dict` e `table_alias` come parametri invece di essere hardcoded su `FIELDS`/`\"a\"` —\nusati con `(FIELDS, \"a\")` per Anagrafica e `(EMESSO_FIELDS, None)` per Emesso (nessun alias\nnecessario dentro la subquery Emesso, un'unica tabella in scope lì). Aggiunto anche il tipo\n`\"float\"` (per `share`) trattato come bucket numerico (`OPS_INT`) con cast `float()` invece di\n`int()`.\n\n**I filtri Emesso si applicano DENTRO la subquery**, prima di scegliere prima/ultima — \"prima\nemissione su rete X\" deve restringere alle emissioni su X e poi prendere la più vecchia tra\nquelle, non il contrario. Attenzione all'**ordine dei parametri SQL**: il JOIN (con gli\neventuali placeholder dei filtri Emesso) compare nel testo SQL prima della WHERE Anagrafica —\n`_execute_query` passa `join_params + anagrafica_params` in quest'ordine a `con.execute()`.\n\nVerificato su dati reali da Nave: filtro Emesso semplice, gruppo OR, campo `float` con\n`between` — tutti sotto il secondo, nessuna regressione sulle query solo-Anagrafica.\n\n**Blocco `pb_emesso`** (\"Tabella Emesso\"): contenitore indipendente sulla lavagna (vedi\nsopra), opzionale — se assente, query solo su Anagrafica come nel passo 1.\n\n**Aggregazione rimandata a uno step successivo (05/08/2026)**: inizialmente il blocco aveva\nun dropdown `AGG` (prima/ultima/tutte le emissioni) integrato. Corretto su richiesta di\nMauro: \"Tabella Emesso\" deve restare un blocco che dichiara solo la tabella (nome coerente:\nnon più \"Query Emesso — aggregazione...\" ma \"Tabella Emesso\" secco) — l'aggregazione è un\nconcetto separato, un blocco a sé quando verrà implementato. **Oggi nessuna aggregazione nel\nfrontend**: il backend riceve `emesso` senza il campo `aggregation` e usa il default\n`\"tutte\"` (una riga per emissione) — la logica prima/ultima via window function resta nel\nbackend (`_build_emesso_join`, invariata), pronta per quando un futuro blocco aggregazione la\nrichiamerà esplicitamente passando `\"aggregation\": \"prima\"|\"ultima\"`.\n\n**LEFT JOIN di default, INNER se ci sono filtri Emesso (05/08/2026)**: gotcha reale trovato da\nMauro testando il prototipo — con LEFT JOIN sempre attiva, un filtro su Emesso (es.\n`rete=I1`) non restringeva affatto i prodotti Anagrafica: i prodotti senza corrispondenza\nuscivano comunque, solo con le colonne Emesso a `NULL`, perché LEFT JOIN mantiene le righe di\nsinistra a prescindere dal match a destra. Un filtro sulla tabella joinata deve poter\nsignificare \"solo chi corrisponde\", non \"arricchisci se puoi\". Fix in `_build_emesso_join`:\n`join_type = \"INNER JOIN\" if emesso_clauses else \"LEFT JOIN\"` — con filtri Emesso presenti,\nINNER (solo prodotti con un'emissione che soddisfa il criterio); senza filtri, resta LEFT\n(Emesso arricchisce l'output senza restringere le righe Anagrafica, un prodotto senza\nemissioni resta comunque visibile con colonne Emesso a `NULL`).\n\n**Verificato su dati reali** (filtro `tipologia=FILM`): senza filtri Emesso, 471.494 righe\n(52.215 con `emesso_rete` `NULL` — prodotti senza emissioni, LEFT corretto); con filtro\n`rete=I1`, 30.690 righe, zero `NULL`, tutte effettivamente `I1` (INNER corretto).\n\n**Compromesso risolto con un blocco \"ponte\" esplicito (05/08/2026)**: il caso \"mostrami tutti\ni prodotti, e se disponibile mostrami solo l'emissione su rete X\" (LEFT JOIN + filtro solo\nper la visualizzazione, non per restringere) non era esprimibile con la sola regola\nautomatica. Aggiunto `pb_join` — blocco indipendente, facoltativo, con una tendina\n(`TYPE`): **Automatico** (la regola sopra: INNER se ci sono filtri Emesso, LEFT altrimenti),\n**LEFT forzato** (\"Tieni tutti gli Anagrafica\"), **INNER forzato** (\"Solo corrispondenze\") —\nsovrascrive la scelta automatica a prescindere dalla presenza di filtri. Colore neutro grigio\n(`#757575`), coerente con la sua natura \"ponte\" tra domini, non appartiene a nessuna tabella\nspecifica.\n\nLato frontend: `getJoinType(workspace)` cerca `pb_join` con `getBlocksByType`, default\n`\"auto\"` se assente — stesso pattern di `getEmessoConfig`. Lato backend:\n`_parse_query_body` valida `join_type` (`auto`/`left`/`inner`, 400 se altro), \n`_build_emesso_join` lo usa per bypassare la regola automatica quando non è `\"auto\"`.\n\nVerificato su dati reali tutti e tre i casi (`auto`+filtro → INNER 30.690 righe 0 NULL;\n`left` forzato+filtro → LEFT 106.654 righe 75.964 NULL; `inner` forzato senza filtri →\n419.279 righe 0 NULL) — i conteggi tornano esatti tra loro (es. `left`-`auto` = quanti\nprodotti hanno emissioni ma non su quella rete).\n\nOutput Emesso selezionabile con lo stesso modale a doppio click di `pb_query` (generalizzato:\n`openCampiModal(block, allNames)` ora prende l'elenco campi come parametro, non più\nhardcoded su `ALL_FIELD_NAMES` — due estensioni Blockly separate, `pb_query_output_modal` e\n`pb_emesso_output_modal`, stessa UI). Le colonne Emesso in output sono prefissate\n`emesso_` (es. `emesso_rete`) per evitare collisioni con nomi di colonna già presenti\nin Anagrafica (es. `tipologia` esiste in entrambe le tabelle).\n\n**Gotcha backend risolto**: con la JOIN attiva, un nome di campo come `tipologia` esiste in\nentrambe le tabelle — DuckDB solleva un errore di colonna ambigua se non prefissato. Tutti i\nfiltri Anagrafica (`_build_filtro`) ora usano il prefisso `a.\"campo\"` esplicito (prima erano\nsenza prefisso, andava bene perché la tabella era una sola).\n\nVerificato da Nave su dati reali: query con filtro Anagrafica + `prima`/`ultima`/`tutte` —\ntutte sotto il secondo (window function su 8,8M righe non è un problema di performance con\nDuckDB). Validazione errori confermata (aggregazione non valida → 400, campo Emesso non\nvalido → 400). **Non ancora testato visivamente** su un display reale (Ufficio).\n\n## Griglia risultati PyQt6 (05/08/2026)\n\n**Perché un processo separato**: `pywebview` (finestra Blockly) e PyQt6 sono due toolkit GUI\ndiversi, ognuno col proprio loop eventi — non possono coesistere nello stesso processo senza\nconflitti. Soluzione: `results_grid.py` (root della sandbox, sibling di `backend/`/`frontend/`)\nè uno script PyQt6 standalone, lanciato come **sottoprocesso** (`subprocess.Popen`) dal\nbackend Flask.\n\n**Flusso (semplificato 05/08/2026)**: il pulsante è uno solo, **\"Esegui query\"** → POST\n`/api/open_grid` direttamente (niente tabella HTML intermedia, niente pulsante separato\n\"Apri in griglia\" — rimossi su richiesta esplicita: il risultato vive solo nella griglia\nPyQt6, non nella finestra del query builder) → il backend esegue la query, scrive\n`{columns, rows}` in un file JSON temporaneo (`tempfile.NamedTemporaryFile`), lancia\n`subprocess.Popen([sys.executable, results_grid.py, tmp_path])` e risponde subito (non\naspetta la chiusura della finestra). `results_grid.py` legge il JSON, lo cancella\n(`unlink()`), poi apre una `QTableWidget` read-only (`NoEditTriggers`) — editing eventuale\nsolo in futuro, oggi è deliberatamente sola lettura come Linker.\n\n`/api/query` resta nel backend (limite 1000, usato dai test rapidi da terminale/`test_client`)\nma non è più chiamato dal frontend — solo `/api/open_grid` (limite 5000) è nel percorso reale.\n\n**Refactor backend**: `_parse_query_body()`/`_execute_query()` estratte da `/api/query` e\ncondivise con `/api/open_grid` — stessa validazione, stesso motore DuckDB, limite massimo\ndiverso per endpoint.\n\nDipendenza `PyQt6==6.7.0` (pin standard di casa) in `requirements.txt`. Verificato da Nave con\n`QT_QPA_PLATFORM=offscreen` (headless, nessun display) — costruzione finestra/tabella\ncorretta, file temporaneo pulito correttamente prima di entrare nel loop eventi Qt. **Non\nancora verificato visivamente** (serve un display reale, Ufficio).\n\n**`results_grid.py` resta volutamente semplice, nessuno stile custom**: un primo tentativo\naveva applicato la palette MediaTrack (QSS + `app.setStyle(\"Fusion\")`, necessario perché lo\nstile nativo Windows ignora parzialmente i QSS su `QHeaderView`) proprio a questo foglio — poi\ncorretto: la richiesta era vestire il **query builder**, non il foglio risultati, che va\nlasciato semplice. Non applicare styling qui senza indicazione esplicita.\n\n## Grafica query builder — colore per dominio, stile MediaTrack (05/08/2026)\n\n`frontend/index.html`/`app.js`: struttura/gradienti/font presi da\n`PYTHON/MyICR_Suite/app/modules/mediatrack/frontend/style.css` (sfondo `#f5f5f5`, font Segoe\nUI, toolbar con gradiente `#f8f8f8→#e8e8e8`) — questa parte non cambia.\n\n**Anagrafica → rosso pastello (deciso definitivamente, 05/08/2026)**: dopo un giro intermedio\nsul verde acqua (motivato dall'idea \"un colore per dominio, rosso riservato al futuro\"), Mauro\nha richiesto di tornare al rosso per Anagrafica — il colore per dominio resta un principio\nvalido per quando arriveranno Emesso/Diritti/Boxoffice, ma Anagrafica stessa è rossa, non il\nverde acqua del giro intermedio. Famiglia: primario `#C62828`, medio `#E57373`, chiaro\n`#EF9A9A` (stessa già in uso per i pulsanti \"danger\" di `MonitorOsservatorioPy`). Applicato a\npulsante primario \"Esegui query\" e \"Applica\" nel modale (gradiente `#E57373→#C62828`), testo\ndi stato e titoli modale (`#C62828`), blocchi Blockly (`pb_query` `#C62828`, `pb_gruppo`\n`#E57373`, `pb_filtro` `#EF9A9A`), marcatore di inserimento nel workspace (`#C62828`).\n\n**Splash screen**, stesso famiglia rossa del resto (coerenza, non più \"colore a parte\" come\nnel giro intermedio col verde acqua): **sfumato verso il bianco** in stile \"degradazione\nsoft\" di MediaTrack (non colore pieno a colore pieno): gradiente `#E57373→#ffffff`. Testo\nbianco con ombra leggera (`text-shadow`) per restare leggibile lungo tutto il gradiente — un\ntentativo di testo rosso scuro è stato scartato, poco leggibile contro lo sfondo rosso.\nTimer di dissolvenza: 4600ms (allungato da 1600ms su richiesta). Stesso pattern/meccanismo di\n`PYTHON/MonitorOsservatorioPy` (overlay `position: fixed` a schermo intero, dissolvenza CSS +\nrimozione dal DOM). Le lettere di \"Bricks\" restano a colori vivaci alternati (rosso, giallo,\nblu, verde, arancio — stile mattoncini LEGO): ogni lettera in uno `` proprio, colorato\nvia `:nth-child` in CSS — solo decorazione dello splash, non tocca il resto della UI.\n\n**Sfondi toolbox/flyout/workspace Blockly**: impostati via un `Blockly.Theme` dedicato\n(`mediatrackTheme`, base `Blockly.Themes.Classic` con `componentStyles` sovrascritti): flyout\ne toolbox `#f5f5f5` (stesso grigio di MediaTrack, invariato), workspace bianco. Passato a\n`Blockly.inject()` come\nopzione `theme`.\n\n## Dati\n\nLegge `prodotti.parquet` da `../../PYTHON/MyICR_Suite/local_db/parquet/prodotti.parquet`\n(path relativo, stessa struttura su Nave e Ufficio) — **sola lettura**, 226431 righe, 25\ncolonne (schema completo via `DESCRIBE` in backend/server.py). Nessuna scrittura su questo\nfile: è il mirror sincronizzato via Dropbox, non toccarlo.\n\nTutte le 25 colonne sono esposte come campi filtrabili (ampliato da un sottoinsieme di 9,\n05/08/2026 — servivano tutte per la fase di test su limiti/potenzialità).\n\n**Output selezionabile** (doppio click sul blocco `pb_query`, vedi Stack sopra) — default:\ntutte le 25 colonne finché non si apre il modale e si sceglie diversamente.\n\n## Entry point\n\n```\npython run.py\n```\n\nAvvia Flask in thread demone + finestra pywebview puntata a `http://127.0.0.1:5050`\n(porta diversa da MediaTrack/5000 per poter girare in parallelo).\n\n## Stato\n\nPasso 1 validato con convinzione (05/08/2026, \"va MOLTO bene\"), selezione output via modale a\ndoppio click validata anche quella (\"il meccanismo mi piace\"). Aggiunta griglia risultati\nPyQt6 come processo separato (vedi sopra) — **da testare visivamente su PC ufficio**, non\nancora verificato con un display reale (verificato solo backend/contratto da Nave, headless).\nPoi si passa al passo 2 (+Emesso, scelta aggregazione prima/ultima/tutte) — vedi\n`PowerBricks.md` per la strategia completa.\n","contentDiffersFromDisk":true,"rawContent":"---\ntype: modulo\nparent: \"Dropbox/adrian (sandbox)\"\n---\n\n# CLAUDE.md — PowerBricks (sandbox prototipo)\n**Versione:** v6\n**Ultimo aggiornamento:** 2026-08-05\n\nEredita la Costituzione principale (`Dropbox/adrian/CLAUDE.md`). Solo contesto locale qui sotto.\n\n## Cos'è\n\nPrototipo del query builder visuale PowerBricks — passo 1 (solo Anagrafica) validato con\nconvinzione, ora in **passo 2** con l'aggiunta di Emesso (join + aggregazione), strategia\ncompleta in `archivio/Mauro/lavoro/lavoro-python-ecosistema/PowerBricks.md`.\n\n**Direzione strategica emersa 05/08/2026**: PowerBricks è di fatto un generatore di SQL\nparametrico — l'output naturale non è solo una tabella HTML ma può alimentare **una griglia\nin stile Linker** (MyICR_Suite), oggi in sola lettura. Vedi sezione \"Griglia risultati PyQt6\"\nsotto per l'implementazione.\n\nVive fuori da `PYTHON/` deliberatamente: `PYTHON/` è scrivibile solo dall'istanza Ufficio,\nquesta sandbox invece va scritta anche da Nave. Sincronizzata via Dropbox+git come il resto\ndi `adrian/`.\n\n## Stack\n\nStesso pattern di `PYTHON/MyICR_Suite/app/modules/mediatrack/` (modello di riferimento\ndichiarato in MyICR_Suite/CLAUDE.md): **Flask + pywebview**, non browser puro — l'app si apre\ncome finestra desktop nativa, Flask gira in thread interno su `127.0.0.1`.\n\n- **Flask** — unico backend, serve sia le pagine che l'API `/api/*`\n- **pywebview** — finestra nativa che incapsula il frontend Flask\n- **DuckDB** — query in-memory direttamente sul parquet Anagrafica, nessuna copia dati\n- **Blockly** (via CDN nel frontend, vendorizzare se serve lavorare offline) — blocchi `pb_query` (contenitore Anagrafica), `pb_gruppo`/`pb_filtro` (filtri Anagrafica), `pb_emesso` (contenitore Emesso, indipendente), `pb_gruppo_emesso`/`pb_filtro_emesso` (filtri Emesso), `pb_join` (ponte facoltativo, forza il tipo di join — vedi sezione dedicata sotto)\n\nOperatori supportati: `equals`, `not_equals`, `contains` (solo stringhe), `gt`/`lt`/`gte`/`lte` (solo numerici), `between` (numerici, valore `\"v1,v2\"`), `is_null`, `is_not_null`. Validazione lato backend per tipo di campo (`_build_filtro` in `backend/server.py`).\n\n**Selezione campi in output — modale su doppio click (05/08/2026)**: dopo tre tentativi scartati per tenere la selezione sempre visibile (checkbox, doppio elenco fisso, blocco Blockly nativo), la soluzione finale tiene il canvas Blockly pulito (solo filtri) e sposta la scelta dei campi in un **modale HTML** che si apre con doppio click sul blocco `pb_query` (\"Tabella Anagrafica\") — un vero pannello dedicato che compare solo quando serve, coerente con come Access/Power BI trattano la selezione campi (vedi `PowerBricks.md`). Meccanica: estensione Blockly `pb_query_output_modal` (`Blockly.Extensions.register`, in `app.js`) aggancia un listener DOM `dblclick` su `block.getSvgRoot()`; il modale riusa il doppio elenco \"disponibili ↔ selezionati\" con frecce sposta/riordina; la selezione si salva su `block.data` (stringa JSON, serializzata automaticamente da Blockly col resto del workspace — nessuna persistenza custom necessaria).\n\n## Passo 2 — Emesso (05/08/2026)\n\n**Dati**: `emesso.parquet` (stesso `_PARQUET_DIR` di `prodotti.parquet`), 8,8M righe — molto\npiù grande di Anagrafica (226k), conferma la relazione **1:molti** anticipata nella strategia\n(`PowerBricks.md`): un prodotto/edizione può avere decine/centinaia di righe, una per\ntrasmissione. Chiave di join: `prodotto`+`edizione`, stessa di Anagrafica. Campi esposti in\noutput (`EMESSO_FIELDS` in `backend/server.py`): `rete`, `data_emissione`, `ora_inizio`,\n`ora_fine`, `durata_netta`, `prima_visione`, `episodio`, `audience`, `share`, `durata_lorda`,\n`tipologia`, `fascia` — esclusi `prodotto`/`edizione` (chiavi di join, ridondanti in output) e\n`ncparpgm` (codice interno, non utile).\n\n**Emesso ora flessibile quanto Anagrafica (WHERE + SELECT), 05/08/2026**: dopo il primo giro\nsolo-aggregazione, richiesta esplicita di Mauro di rendere Emesso pari ad Anagrafica —\nfiltrabile con blocchi propri, non solo selezionabile in output. Aggiunti `pb_filtro_emesso`\ne `pb_gruppo_emesso` (stessa logica di `pb_filtro`/`pb_gruppo`, stesso set operatori `OPS`,\ncampi presi da `ALL_EMESSO_FIELD_NAMES` invece di `ALL_FIELD_NAMES`), agganciati in un nuovo\nslot `FILTRI` dentro `pb_emesso` stesso.\n\n**Isolamento tra domini via `check` Blockly**: gli statement input e i blocchi dichiarano un\ntipo di connessione (`anagrafica_filtro` per `pb_query`/`pb_filtro`/`pb_gruppo`,\n`emesso_filtro` per `pb_emesso`/`pb_filtro_emesso`/`pb_gruppo_emesso`) — Blockly impedisce a\nlivello di incastro di mescolare un filtro Anagrafica dentro lo slot filtri di Emesso o\nviceversa, non serve validarlo lato codice.\n\n**`pb_query`/`pb_emesso` sganciati, blocchi indipendenti sulla lavagna (05/08/2026)**: prima\n`pb_emesso` si agganciava in uno slot `EMESSO` dentro `pb_query` (nidificato). Corretto su\nrichiesta di Mauro: sono due blocchi container separati, entrambi senza\n`previousStatement`/`nextStatement` (come `pb_query` già era) — viaggiano indipendenti sul\nworkspace, non uno dentro l'altro. Se `pb_emesso` è presente da qualche parte sulla lavagna,\nsi unisce **implicitamente** su `prodotto`+`edizione` (join fissa, nessuna scelta esplicita) —\nMauro ha segnalato esplicitamente che in futuro potrebbe arrivare un blocco \"ponte\" per\nscegliere il tipo di join, ma non ora. Lato codice: `getEmessoConfig(workspace)` cerca il\nblocco `pb_emesso` con `workspace.getBlocksByType(\"pb_emesso\", false)` invece di leggerlo da\nuno slot annidato di `pb_query` — il backend (join implicita su chiave fissa) non cambia,\nsolo la sorgente della configurazione lato frontend.\n\n**Backend generico per tabella**: `_build_filtro`/`_build_node`/`_build_where` ora prendono\n`fields_dict` e `table_alias` come parametri invece di essere hardcoded su `FIELDS`/`\"a\"` —\nusati con `(FIELDS, \"a\")` per Anagrafica e `(EMESSO_FIELDS, None)` per Emesso (nessun alias\nnecessario dentro la subquery Emesso, un'unica tabella in scope lì). Aggiunto anche il tipo\n`\"float\"` (per `share`) trattato come bucket numerico (`OPS_INT`) con cast `float()` invece di\n`int()`.\n\n**I filtri Emesso si applicano DENTRO la subquery**, prima di scegliere prima/ultima — \"prima\nemissione su rete X\" deve restringere alle emissioni su X e poi prendere la più vecchia tra\nquelle, non il contrario. Attenzione all'**ordine dei parametri SQL**: il JOIN (con gli\neventuali placeholder dei filtri Emesso) compare nel testo SQL prima della WHERE Anagrafica —\n`_execute_query` passa `join_params + anagrafica_params` in quest'ordine a `con.execute()`.\n\nVerificato su dati reali da Nave: filtro Emesso semplice, gruppo OR, campo `float` con\n`between` — tutti sotto il secondo, nessuna regressione sulle query solo-Anagrafica.\n\n**Blocco `pb_emesso`** (\"Tabella Emesso\"): contenitore indipendente sulla lavagna (vedi\nsopra), opzionale — se assente, query solo su Anagrafica come nel passo 1.\n\n**Aggregazione rimandata a uno step successivo (05/08/2026)**: inizialmente il blocco aveva\nun dropdown `AGG` (prima/ultima/tutte le emissioni) integrato. Corretto su richiesta di\nMauro: \"Tabella Emesso\" deve restare un blocco che dichiara solo la tabella (nome coerente:\nnon più \"Query Emesso — aggregazione...\" ma \"Tabella Emesso\" secco) — l'aggregazione è un\nconcetto separato, un blocco a sé quando verrà implementato. **Oggi nessuna aggregazione nel\nfrontend**: il backend riceve `emesso` senza il campo `aggregation` e usa il default\n`\"tutte\"` (una riga per emissione) — la logica prima/ultima via window function resta nel\nbackend (`_build_emesso_join`, invariata), pronta per quando un futuro blocco aggregazione la\nrichiamerà esplicitamente passando `\"aggregation\": \"prima\"|\"ultima\"`.\n\n**LEFT JOIN di default, INNER se ci sono filtri Emesso (05/08/2026)**: gotcha reale trovato da\nMauro testando il prototipo — con LEFT JOIN sempre attiva, un filtro su Emesso (es.\n`rete=I1`) non restringeva affatto i prodotti Anagrafica: i prodotti senza corrispondenza\nuscivano comunque, solo con le colonne Emesso a `NULL`, perché LEFT JOIN mantiene le righe di\nsinistra a prescindere dal match a destra. Un filtro sulla tabella joinata deve poter\nsignificare \"solo chi corrisponde\", non \"arricchisci se puoi\". Fix in `_build_emesso_join`:\n`join_type = \"INNER JOIN\" if emesso_clauses else \"LEFT JOIN\"` — con filtri Emesso presenti,\nINNER (solo prodotti con un'emissione che soddisfa il criterio); senza filtri, resta LEFT\n(Emesso arricchisce l'output senza restringere le righe Anagrafica, un prodotto senza\nemissioni resta comunque visibile con colonne Emesso a `NULL`).\n\n**Verificato su dati reali** (filtro `tipologia=FILM`): senza filtri Emesso, 471.494 righe\n(52.215 con `emesso_rete` `NULL` — prodotti senza emissioni, LEFT corretto); con filtro\n`rete=I1`, 30.690 righe, zero `NULL`, tutte effettivamente `I1` (INNER corretto).\n\n**Compromesso risolto con un blocco \"ponte\" esplicito (05/08/2026)**: il caso \"mostrami tutti\ni prodotti, e se disponibile mostrami solo l'emissione su rete X\" (LEFT JOIN + filtro solo\nper la visualizzazione, non per restringere) non era esprimibile con la sola regola\nautomatica. Aggiunto `pb_join` — blocco indipendente, facoltativo, con una tendina\n(`TYPE`): **Automatico** (la regola sopra: INNER se ci sono filtri Emesso, LEFT altrimenti),\n**LEFT forzato** (\"Tieni tutti gli Anagrafica\"), **INNER forzato** (\"Solo corrispondenze\") —\nsovrascrive la scelta automatica a prescindere dalla presenza di filtri. Colore neutro grigio\n(`#757575`), coerente con la sua natura \"ponte\" tra domini, non appartiene a nessuna tabella\nspecifica.\n\nLato frontend: `getJoinType(workspace)` cerca `pb_join` con `getBlocksByType`, default\n`\"auto\"` se assente — stesso pattern di `getEmessoConfig`. Lato backend:\n`_parse_query_body` valida `join_type` (`auto`/`left`/`inner`, 400 se altro), \n`_build_emesso_join` lo usa per bypassare la regola automatica quando non è `\"auto\"`.\n\nVerificato su dati reali tutti e tre i casi (`auto`+filtro → INNER 30.690 righe 0 NULL;\n`left` forzato+filtro → LEFT 106.654 righe 75.964 NULL; `inner` forzato senza filtri →\n419.279 righe 0 NULL) — i conteggi tornano esatti tra loro (es. `left`-`auto` = quanti\nprodotti hanno emissioni ma non su quella rete).\n\nOutput Emesso selezionabile con lo stesso modale a doppio click di `pb_query` (generalizzato:\n`openCampiModal(block, allNames)` ora prende l'elenco campi come parametro, non più\nhardcoded su `ALL_FIELD_NAMES` — due estensioni Blockly separate, `pb_query_output_modal` e\n`pb_emesso_output_modal`, stessa UI). Le colonne Emesso in output sono prefissate\n`emesso_` (es. `emesso_rete`) per evitare collisioni con nomi di colonna già presenti\nin Anagrafica (es. `tipologia` esiste in entrambe le tabelle).\n\n**Gotcha backend risolto**: con la JOIN attiva, un nome di campo come `tipologia` esiste in\nentrambe le tabelle — DuckDB solleva un errore di colonna ambigua se non prefissato. Tutti i\nfiltri Anagrafica (`_build_filtro`) ora usano il prefisso `a.\"campo\"` esplicito (prima erano\nsenza prefisso, andava bene perché la tabella era una sola).\n\nVerificato da Nave su dati reali: query con filtro Anagrafica + `prima`/`ultima`/`tutte` —\ntutte sotto il secondo (window function su 8,8M righe non è un problema di performance con\nDuckDB). Validazione errori confermata (aggregazione non valida → 400, campo Emesso non\nvalido → 400). **Non ancora testato visivamente** su un display reale (Ufficio).\n\n## Griglia risultati PyQt6 (05/08/2026)\n\n**Perché un processo separato**: `pywebview` (finestra Blockly) e PyQt6 sono due toolkit GUI\ndiversi, ognuno col proprio loop eventi — non possono coesistere nello stesso processo senza\nconflitti. Soluzione: `results_grid.py` (root della sandbox, sibling di `backend/`/`frontend/`)\nè uno script PyQt6 standalone, lanciato come **sottoprocesso** (`subprocess.Popen`) dal\nbackend Flask.\n\n**Flusso (semplificato 05/08/2026)**: il pulsante è uno solo, **\"Esegui query\"** → POST\n`/api/open_grid` direttamente (niente tabella HTML intermedia, niente pulsante separato\n\"Apri in griglia\" — rimossi su richiesta esplicita: il risultato vive solo nella griglia\nPyQt6, non nella finestra del query builder) → il backend esegue la query, scrive\n`{columns, rows}` in un file JSON temporaneo (`tempfile.NamedTemporaryFile`), lancia\n`subprocess.Popen([sys.executable, results_grid.py, tmp_path])` e risponde subito (non\naspetta la chiusura della finestra). `results_grid.py` legge il JSON, lo cancella\n(`unlink()`), poi apre una `QTableWidget` read-only (`NoEditTriggers`) — editing eventuale\nsolo in futuro, oggi è deliberatamente sola lettura come Linker.\n\n`/api/query` resta nel backend (limite 1000, usato dai test rapidi da terminale/`test_client`)\nma non è più chiamato dal frontend — solo `/api/open_grid` (limite 5000) è nel percorso reale.\n\n**Refactor backend**: `_parse_query_body()`/`_execute_query()` estratte da `/api/query` e\ncondivise con `/api/open_grid` — stessa validazione, stesso motore DuckDB, limite massimo\ndiverso per endpoint.\n\nDipendenza `PyQt6==6.7.0` (pin standard di casa) in `requirements.txt`. Verificato da Nave con\n`QT_QPA_PLATFORM=offscreen` (headless, nessun display) — costruzione finestra/tabella\ncorretta, file temporaneo pulito correttamente prima di entrare nel loop eventi Qt. **Non\nancora verificato visivamente** (serve un display reale, Ufficio).\n\n**`results_grid.py` resta volutamente semplice, nessuno stile custom**: un primo tentativo\naveva applicato la palette MediaTrack (QSS + `app.setStyle(\"Fusion\")`, necessario perché lo\nstile nativo Windows ignora parzialmente i QSS su `QHeaderView`) proprio a questo foglio — poi\ncorretto: la richiesta era vestire il **query builder**, non il foglio risultati, che va\nlasciato semplice. Non applicare styling qui senza indicazione esplicita.\n\n## Grafica query builder — colore per dominio, stile MediaTrack (05/08/2026)\n\n`frontend/index.html`/`app.js`: struttura/gradienti/font presi da\n`PYTHON/MyICR_Suite/app/modules/mediatrack/frontend/style.css` (sfondo `#f5f5f5`, font Segoe\nUI, toolbar con gradiente `#f8f8f8→#e8e8e8`) — questa parte non cambia.\n\n**Anagrafica → rosso pastello (deciso definitivamente, 05/08/2026)**: dopo un giro intermedio\nsul verde acqua (motivato dall'idea \"un colore per dominio, rosso riservato al futuro\"), Mauro\nha richiesto di tornare al rosso per Anagrafica — il colore per dominio resta un principio\nvalido per quando arriveranno Emesso/Diritti/Boxoffice, ma Anagrafica stessa è rossa, non il\nverde acqua del giro intermedio. Famiglia: primario `#C62828`, medio `#E57373`, chiaro\n`#EF9A9A` (stessa già in uso per i pulsanti \"danger\" di `MonitorOsservatorioPy`). Applicato a\npulsante primario \"Esegui query\" e \"Applica\" nel modale (gradiente `#E57373→#C62828`), testo\ndi stato e titoli modale (`#C62828`), blocchi Blockly (`pb_query` `#C62828`, `pb_gruppo`\n`#E57373`, `pb_filtro` `#EF9A9A`), marcatore di inserimento nel workspace (`#C62828`).\n\n**Splash screen**, stesso famiglia rossa del resto (coerenza, non più \"colore a parte\" come\nnel giro intermedio col verde acqua): **sfumato verso il bianco** in stile \"degradazione\nsoft\" di MediaTrack (non colore pieno a colore pieno): gradiente `#E57373→#ffffff`. Testo\nbianco con ombra leggera (`text-shadow`) per restare leggibile lungo tutto il gradiente — un\ntentativo di testo rosso scuro è stato scartato, poco leggibile contro lo sfondo rosso.\nTimer di dissolvenza: 4600ms (allungato da 1600ms su richiesta). Stesso pattern/meccanismo di\n`PYTHON/MonitorOsservatorioPy` (overlay `position: fixed` a schermo intero, dissolvenza CSS +\nrimozione dal DOM). Le lettere di \"Bricks\" restano a colori vivaci alternati (rosso, giallo,\nblu, verde, arancio — stile mattoncini LEGO): ogni lettera in uno `` proprio, colorato\nvia `:nth-child` in CSS — solo decorazione dello splash, non tocca il resto della UI.\n\n**Sfondi toolbox/flyout/workspace Blockly**: impostati via un `Blockly.Theme` dedicato\n(`mediatrackTheme`, base `Blockly.Themes.Classic` con `componentStyles` sovrascritti): flyout\ne toolbox `#f5f5f5` (stesso grigio di MediaTrack, invariato), workspace bianco. Passato a\n`Blockly.inject()` come\nopzione `theme`.\n\n## Dati\n\nLegge `prodotti.parquet` da `../../PYTHON/MyICR_Suite/local_db/parquet/prodotti.parquet`\n(path relativo, stessa struttura su Nave e Ufficio) — **sola lettura**, 226431 righe, 25\ncolonne (schema completo via `DESCRIBE` in backend/server.py). Nessuna scrittura su questo\nfile: è il mirror sincronizzato via Dropbox, non toccarlo.\n\nTutte le 25 colonne sono esposte come campi filtrabili (ampliato da un sottoinsieme di 9,\n05/08/2026 — servivano tutte per la fase di test su limiti/potenzialità).\n\n**Output selezionabile** (doppio click sul blocco `pb_query`, vedi Stack sopra) — default:\ntutte le 25 colonne finché non si apre il modale e si sceglie diversamente.\n\n## Entry point\n\n```\npython run.py\n```\n\nAvvia Flask in thread demone + finestra pywebview puntata a `http://127.0.0.1:5050`\n(porta diversa da MediaTrack/5000 per poter girare in parallelo).\n\n## Stato\n\nPasso 1 validato con convinzione (05/08/2026, \"va MOLTO bene\"), selezione output via modale a\ndoppio click validata anche quella (\"il meccanismo mi piace\"). Aggiunta griglia risultati\nPyQt6 come processo separato (vedi sopra) — **da testare visivamente su PC ufficio**, non\nancora verificato con un display reale (verificato solo backend/contratto da Nave, headless).\nPoi si passa al passo 2 (+Emesso, scelta aggregazione prima/ultima/tutte) — vedi\n`PowerBricks.md` per la strategia completa.\n"},"displayPath":"sandbox/powerbricks/CLAUDE.md"},"type":"attachment","uuid":"e329b813-e689-44fa-8377-252869881ff6","timestamp":"2026-08-06T10:25:46.785Z","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"type":"last-prompt","lastPrompt":"si","leafUuid":"e329b813-e689-44fa-8377-252869881ff6","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01"}
{"type":"ai-title","aiTitle":"Continuare sessione modalità voice webapp","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01"}
{"parentUuid":"e329b813-e689-44fa-8377-252869881ff6","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmLJe2kKT79NKhQaDHFW","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"Ep0CCokBCBAYAipAUDrOj2SLXVAXALn9TYNbS0/P6rh/DxcBCN7WOcKnH62CbwyiqiiWfCOaoGounYEWl9S/uzmNRqNRU9BX98BoQDIPY2xhdWRlLXNvbm5ldC01OABCCHRoaW5raW5nWiQzZDFjY2UyZS0wNjY0LTQwZDYtODQxNC1iN2U1MjhhY2UyYjESDEkGf4UONWwiw/9GbBoM40cz6p9EVecHM9XyIjCkw1NDNZ/8vjpnPRYYL4GdpAN5tf6jIqu8M6iEQCXK2aE8x1qRc9VMA+lyqO/lOZIqQV975eyEyzMboificchDR89bg7rcIougQCvzwRTrM7HM6jAxCpCGtBs3m0xvHyqeVy6Xor5ZZ7d5ymgrQwSKYpg3GAE="}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":14618,"cache_read_input_tokens":85354,"output_tokens":105,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":14618,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":105,"cache_read_input_tokens":85354,"cache_creation_input_tokens":14618,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":14618},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmLJbyiexfajYoXuF5Wd","type":"assistant","uuid":"870c8fa9-e27b-4042-a25c-801c70df4f64","timestamp":"2026-08-06T10:25:49.955Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"870c8fa9-e27b-4042-a25c-801c70df4f64","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmLJe2kKT79NKhQaDHFW","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01MwntrGGSXmHKNz4k4eu8pc","name":"Read","input":{"file_path":"/mnt/ssd/data/Dropbox/adrian/sandbox/powerbricks/frontend/index.html"},"caller":{"type":"direct"}}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":14618,"cache_read_input_tokens":85354,"output_tokens":105,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":14618,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":105,"cache_read_input_tokens":85354,"cache_creation_input_tokens":14618,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":14618},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmLJbyiexfajYoXuF5Wd","type":"assistant","uuid":"dba8b42f-d1db-49bc-9e13-0654140a3ac7","timestamp":"2026-08-06T10:25:50.462Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"dba8b42f-d1db-49bc-9e13-0654140a3ac7","isSidechain":false,"promptId":"8e00cf3e-39fd-47ba-9744-19245c87b11c","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01MwntrGGSXmHKNz4k4eu8pc","type":"tool_result","content":"1\t\n2\t\n3\t\n4\t\n5\tPowerBricks — prototipo\n6\t\n7\t\n8\t\n9\t\n83\t\n84\t\n85\t\n86\t
\n\n\n \n \n \n \n \n \n \n\n\n\n\n\n\n","numLines":150,"startLine":1,"totalLines":150}},"sourceToolAssistantUUID":"dba8b42f-d1db-49bc-9e13-0654140a3ac7","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"type":"file-history-delta","messageId":"28056e63-f1d5-4193-9ea0-db215cb496bc","snapshotMessageId":"2c9d9ed7-d540-45de-8a73-2bc62ff05df8","trackingPath":"sandbox/powerbricks/frontend/index.html","backup":{"backupFileName":"89766efd6348531e@v1","version":1,"backupTime":"2026-08-06T10:26:09.573Z","realParentDir":"/mnt/ssd/data/Dropbox/adrian/sandbox/powerbricks/frontend"},"timestamp":"2026-08-06T10:26:09.573Z"}
{"parentUuid":"2679ebb2-e45c-4553-aea2-50aa431b624a","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmLJw79rhvjidcceM6Wv","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"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"}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":3065,"cache_read_input_tokens":99972,"output_tokens":1443,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":3065,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":1443,"cache_read_input_tokens":99972,"cache_creation_input_tokens":3065,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":3065},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmLJsoyFgaCYL9pFFX33","type":"assistant","uuid":"56733521-4895-4fd0-8b4c-8a8832329584","timestamp":"2026-08-06T10:26:02.854Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"56733521-4895-4fd0-8b4c-8a8832329584","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmLJw79rhvjidcceM6Wv","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01Tw9fvwrouwSoWTEddz9Gqo","name":"Edit","input":{"replace_all":false,"file_path":"/mnt/ssd/data/Dropbox/adrian/sandbox/powerbricks/frontend/index.html","old_string":"\n \n \n \n \n \n \n \n","new_string":"\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n"},"caller":{"type":"direct"}}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":3065,"cache_read_input_tokens":99972,"output_tokens":1443,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":3065,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":1443,"cache_read_input_tokens":99972,"cache_creation_input_tokens":3065,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":3065},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmLJsoyFgaCYL9pFFX33","type":"assistant","uuid":"28056e63-f1d5-4193-9ea0-db215cb496bc","timestamp":"2026-08-06T10:26:09.545Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"28056e63-f1d5-4193-9ea0-db215cb496bc","isSidechain":false,"promptId":"8e00cf3e-39fd-47ba-9744-19245c87b11c","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01Tw9fvwrouwSoWTEddz9Gqo","type":"tool_result","content":"The file /mnt/ssd/data/Dropbox/adrian/sandbox/powerbricks/frontend/index.html has been updated successfully. (file state is current in your context — no need to Read it back)"}]},"uuid":"0f15f3cf-b6c6-4935-a586-0aa7bdb88b53","timestamp":"2026-08-06T10:26:10.610Z","toolUseResult":{"filePath":"/mnt/ssd/data/Dropbox/adrian/sandbox/powerbricks/frontend/index.html","oldString":"\n \n \n \n \n \n \n \n","newString":"\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n","originalFile":"\n\n\n\nPowerBricks — prototipo\n\n\n\n\n\n\n\n
\n
PowerBricks
\n
Query Builder — Anagrafica
\n
\n\n
\n \n
\n
\n \n \n
\n
\n
\n\n
\n
\n
Campi da mostrare in output
\n
\n
\n \n \n
\n
\n \n \n \n \n
\n
\n \n \n
\n
\n
\n \n \n
\n
\n
\n\n\n \n \n \n \n \n \n \n\n\n\n\n\n\n","structuredPatch":[{"oldStart":125,"oldLines":13,"newStart":125,"newLines":21,"lines":[" "," "," ","- ","- ","- ","- ","- ","- ","- ","+ ","+ ","+ ","+ ","+ ","+ ","+ ","+ ","+ ","+ ","+ ","+ ","+ ","+ ","+ "," "," "," "]}],"userModified":false,"replaceAll":false},"sourceToolAssistantUUID":"28056e63-f1d5-4193-9ea0-db215cb496bc","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"type":"last-prompt","lastPrompt":"si","leafUuid":"0f15f3cf-b6c6-4935-a586-0aa7bdb88b53","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01"}
{"type":"ai-title","aiTitle":"Continuare sessione modalità voice webapp","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01"}
{"parentUuid":"0f15f3cf-b6c6-4935-a586-0aa7bdb88b53","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmLLT8DTSX8FUUoW6LkK","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"EpQKCokBCBAYAipAV31c97RIMLGTxLGeCdo4yfc6F+u6ZX6WQr4O8beDb1mSRh2qOYDHonpqzfoWtt9IgmmNPYJInUiInVGwK+KNSDIPY2xhdWRlLXNvbm5ldC01OABCCHRoaW5raW5nWiQzZDFjY2UyZS0wNjY0LTQwZDYtODQxNC1iN2U1MjhhY2UyYjESDBD1sTfNBCMMqf3nzxoMLKq4QAY+//PGiNJDIjDIn6SkeS/mk+VleIRa7UvKETjNiZDrh0VUUb0luTR4qxslHEwRoPp4Dp41YqupnJUqtwj83+/H9BcIr7OwOssQkMaOUbabN1qldSJ/umxa1ZP0U0tmWTT6S8zSDUVYig+IgQOfDsqBRgwFr7BswfPZ6a5127AI0ngid+deL1w+e5/x9aqUrSNddUxYXjD5eB8JaLY33UuTkA++GX5xoafMBmObllsaYvrI+Ba1QqU/avLUzmGDdn3MmahFvG74pgYlrPE7F/h/v5BN4dnDmbFglG5I0RtGeUrTRqYV+0gH2/6DAh8K16S+HPN3BNXc8SbuQKXoh2y5XRWn/+rLT+7bhirzUZKGlRWCSFd2qy+JHptG4m5OGzF3A+mDBENjJnJrr24FD44zyAHF61fpZCLEh4tsbO5phMO8G6Yk8kNqLm0zC9jMFhmOnw7GNZzaMkYKRovoBbdxAziSqAMs5uzfjQrxQ1/5Q6y7/7UrascSWaAJppmcUzgmYxKK7/2o6+0ilfkmQjfy6C0m2RMEv2XYOEYoEe2MRT+fEo3gAbEgvA5p6IAz0uMhAOLL354HxLyeVdmOdx1yjPZf9gZzUusYqzQquNsrm/TjvfimcYZwPel6h6IbkWy7PQ4suM0Sv27VjIDvrSa0NW6mWFzDN6SO7ePj78QKI06zGHmr9gyl7d33wU5ZD/kk/UbvIaPnGIoex9G2W1tNIWEJjfPV0WXmvy1FHWMjCRFapylyHcMRf9MC+m7LH04K1VVn5PV6Ko7MMhzyBHeqWUt81NvuEZzlCNY+STnUYb5JVtDEc7pX4+sPiI+xcj1FXU5AYNbt8MaX1X5VjXrA3yMk0nqp/sDOB7WpnNdH9fs59Ogu7Q2Y76F7nhoTxvf6QhR/1s29L3zlbHFj7P6UN4/rKAa18r7KUw5Sm4apzVi4BT7yvE1a3SCHWRcF/Qh8xrAUDqCXSTk19H2JG69Qv6UaBDIWezi+9V5oiuVmYZMVTCxqWwf//yr8fxsrgTrPGM8VYgTKJbTYIRHV919gk2qkz2RBdZik53pUfgsR6W5FhMDEE3P7JF9W6aYbkY2zL51yfoC5R0RDqlQpfLHY3dgSuQztYdaoWKwypZAXDJXj2JCQuN3tFufO8KR9emOvi4IDNZh2EzZ0arOiJcmu84K8suZeNJ5IYbprnh3r8+0qKIhmtTMuWRnvZuG7OgCDlLvCzuJCdbIhRU6obEVmhxKKpoVTaKyJ3FmdJzg4XFkWfAyvZuWe2h7CNc/rRQiybHbSo2SjjpaF5W1fhmISuT8fc+yFeGX6UlFmJ/ETXdLlJol2EVi3nSmNK0IB+96LYEbeOWzjzBXMLDyzn2SCAc/7U1YQ4JfL/YjqJxFdJl5PS+go5Q6jTJ/cR0pezJzO0EEZvEP6Vlob/Rafk5ADW7M7AFh+VDffMnL83LcKoKoKjqMMKfPV7+HPTdIDcdL8yQkG/CI2KF0oyBkSTi7jJSWshE0Ne2MsfR4TY5Ux4cbJqxgB"}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":1537,"cache_read_input_tokens":103037,"output_tokens":1184,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":1537,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":1184,"cache_read_input_tokens":103037,"cache_creation_input_tokens":1537,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":1537},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmLLMqiq1SQNWiPqNbDM","type":"assistant","uuid":"2267092a-4fd6-4f76-86f3-6454f66ef9a4","timestamp":"2026-08-06T10:26:21.829Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"2267092a-4fd6-4f76-86f3-6454f66ef9a4","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmLLT8DTSX8FUUoW6LkK","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01Vp82cZMRRcZpn4ruqUaUEy","name":"Edit","input":{"replace_all":false,"file_path":"/mnt/ssd/data/Dropbox/adrian/sandbox/powerbricks/frontend/app.js","old_string":" // Blocco di partenza già presente, cosi' il workspace non e' vuoto al primo avvio\n const start = workspace.newBlock(\"pb_query\");\n start.initSvg();\n start.render();\n start.moveBy(40, 40);\n\n setupCampiModal();\n\n document.getElementById(\"run\").addEventListener(\"click\", () => run(workspace));\n}","new_string":" // Blocco di partenza già presente, cosi' il workspace non e' vuoto al primo avvio\n const start = workspace.newBlock(\"pb_query\");\n start.initSvg();\n start.render();\n start.moveBy(40, 40);\n\n setupCampiModal();\n\n // Bottoni \"Seleziona campi output...\" nei flyout Anagrafica/Emesso (vedi\n // index.html, categorie toolbox) — stesso modale del doppio click sul\n // blocco, ma raggiungibile anche senza sapere che il doppio click esiste.\n // Se il blocco tabella non e' ancora sulla lavagna, lo crea al volo (stessa\n // logica del blocco di partenza sopra) prima di aprire il modale.\n workspace.registerButtonCallback(\"selectAnagraficaFields\", () => {\n const block = getOrCreateTableBlock(workspace, \"pb_query\");\n openCampiModal(block, ALL_FIELD_NAMES);\n });\n workspace.registerButtonCallback(\"selectEmessoFields\", () => {\n const block = getOrCreateTableBlock(workspace, \"pb_emesso\");\n openCampiModal(block, ALL_EMESSO_FIELD_NAMES);\n });\n\n document.getElementById(\"run\").addEventListener(\"click\", () => run(workspace));\n}\n\nfunction getOrCreateTableBlock(workspace, type) {\n const existing = workspace.getBlocksByType(type, false);\n if (existing.length > 0) return existing[0];\n const block = workspace.newBlock(type);\n block.initSvg();\n block.render();\n block.moveBy(40, 40 + workspace.getAllBlocks(false).length * 60);\n return block;\n}"},"caller":{"type":"direct"}}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":1537,"cache_read_input_tokens":103037,"output_tokens":1184,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":1537,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":1184,"cache_read_input_tokens":103037,"cache_creation_input_tokens":1537,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":1537},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmLLMqiq1SQNWiPqNbDM","type":"assistant","uuid":"06bc99c6-6f0f-4f37-97a4-782f9e9f4a07","timestamp":"2026-08-06T10:26:28.033Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"type":"file-history-delta","messageId":"06bc99c6-6f0f-4f37-97a4-782f9e9f4a07","snapshotMessageId":"2c9d9ed7-d540-45de-8a73-2bc62ff05df8","trackingPath":"sandbox/powerbricks/frontend/app.js","backup":{"backupFileName":"397d5a700944e6c0@v1","version":1,"backupTime":"2026-08-06T10:26:28.056Z","realParentDir":"/mnt/ssd/data/Dropbox/adrian/sandbox/powerbricks/frontend"},"timestamp":"2026-08-06T10:26:28.056Z"}
{"parentUuid":"06bc99c6-6f0f-4f37-97a4-782f9e9f4a07","isSidechain":false,"promptId":"8e00cf3e-39fd-47ba-9744-19245c87b11c","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01Vp82cZMRRcZpn4ruqUaUEy","type":"tool_result","content":"The file /mnt/ssd/data/Dropbox/adrian/sandbox/powerbricks/frontend/app.js has been updated successfully. (file state is current in your context — no need to Read it back)"}]},"uuid":"673c6380-af2f-4c30-ba71-56e1f15dca60","timestamp":"2026-08-06T10:26:29.111Z","toolUseResult":{"filePath":"/mnt/ssd/data/Dropbox/adrian/sandbox/powerbricks/frontend/app.js","oldString":" // Blocco di partenza già presente, cosi' il workspace non e' vuoto al primo avvio\n const start = workspace.newBlock(\"pb_query\");\n start.initSvg();\n start.render();\n start.moveBy(40, 40);\n\n setupCampiModal();\n\n document.getElementById(\"run\").addEventListener(\"click\", () => run(workspace));\n}","newString":" // Blocco di partenza già presente, cosi' il workspace non e' vuoto al primo avvio\n const start = workspace.newBlock(\"pb_query\");\n start.initSvg();\n start.render();\n start.moveBy(40, 40);\n\n setupCampiModal();\n\n // Bottoni \"Seleziona campi output...\" nei flyout Anagrafica/Emesso (vedi\n // index.html, categorie toolbox) — stesso modale del doppio click sul\n // blocco, ma raggiungibile anche senza sapere che il doppio click esiste.\n // Se il blocco tabella non e' ancora sulla lavagna, lo crea al volo (stessa\n // logica del blocco di partenza sopra) prima di aprire il modale.\n workspace.registerButtonCallback(\"selectAnagraficaFields\", () => {\n const block = getOrCreateTableBlock(workspace, \"pb_query\");\n openCampiModal(block, ALL_FIELD_NAMES);\n });\n workspace.registerButtonCallback(\"selectEmessoFields\", () => {\n const block = getOrCreateTableBlock(workspace, \"pb_emesso\");\n openCampiModal(block, ALL_EMESSO_FIELD_NAMES);\n });\n\n document.getElementById(\"run\").addEventListener(\"click\", () => run(workspace));\n}\n\nfunction getOrCreateTableBlock(workspace, type) {\n const existing = workspace.getBlocksByType(type, false);\n if (existing.length > 0) return existing[0];\n const block = workspace.newBlock(type);\n block.initSvg();\n block.render();\n block.moveBy(40, 40 + workspace.getAllBlocks(false).length * 60);\n return block;\n}","originalFile":null,"structuredPatch":[{"oldStart":264,"oldLines":9,"newStart":264,"newLines":33,"lines":[" "," setupCampiModal();"," ","+ // Bottoni \"Seleziona campi output...\" nei flyout Anagrafica/Emesso (vedi","+ // index.html, categorie toolbox) — stesso modale del doppio click sul","+ // blocco, ma raggiungibile anche senza sapere che il doppio click esiste.","+ // Se il blocco tabella non e' ancora sulla lavagna, lo crea al volo (stessa","+ // logica del blocco di partenza sopra) prima di aprire il modale.","+ workspace.registerButtonCallback(\"selectAnagraficaFields\", () => {","+ const block = getOrCreateTableBlock(workspace, \"pb_query\");","+ openCampiModal(block, ALL_FIELD_NAMES);","+ });","+ workspace.registerButtonCallback(\"selectEmessoFields\", () => {","+ const block = getOrCreateTableBlock(workspace, \"pb_emesso\");","+ openCampiModal(block, ALL_EMESSO_FIELD_NAMES);","+ });","+"," document.getElementById(\"run\").addEventListener(\"click\", () => run(workspace));"," }"," ","+function getOrCreateTableBlock(workspace, type) {","+ const existing = workspace.getBlocksByType(type, false);","+ if (existing.length > 0) return existing[0];","+ const block = workspace.newBlock(type);","+ block.initSvg();","+ block.render();","+ block.moveBy(40, 40 + workspace.getAllBlocks(false).length * 60);","+ return block;","+}","+"," function blockToNode(block) {"," if (block.type === \"pb_filtro\" || block.type === \"pb_filtro_emesso\") {"," return {"]}],"userModified":false,"replaceAll":false},"sourceToolAssistantUUID":"06bc99c6-6f0f-4f37-97a4-782f9e9f4a07","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"673c6380-af2f-4c30-ba71-56e1f15dca60","isSidechain":false,"attachment":{"type":"todo_reminder","content":[],"itemCount":0},"type":"attachment","uuid":"25b01ead-d207-46b2-9aab-d440e43f35fa","timestamp":"2026-08-06T10:26:29.120Z","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"25b01ead-d207-46b2-9aab-d440e43f35fa","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmLMnBTuKRqXfaYNLT6c","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"EpIECokBCBAYAipAYFI04wsG7r9itGdLwC3SWGG4aDMLzRDGeCPut2aeArQd+hrurK9MDco5DGE6SmcDxEM1tj4X6L+JKWVAlSeFjDIPY2xhdWRlLXNvbm5ldC01OABCCHRoaW5raW5nWiQzZDFjY2UyZS0wNjY0LTQwZDYtODQxNC1iN2U1MjhhY2UyYjESDMoSvEzxbEuqUZBkRBoMJCcgv0jg7t6TqpfIIjBB7Ro6ZufsXpOiSwMWMRWEEbM+9P6pVca5V55vhaDRiQ/DF405ztmdrWDUxANgy60qtQKs2S13wjN430yZgBoNIXr8X4O4RN8Q6cU3+mUA+N0i9gsuUXoa9O1G5jetu345SO6lvC0pQZJY1JQ+QWE/48CTfYm7eCH0b2t0K9AzBAcqaTSBlFNVMWNqq4EztOXxy/2qpof8ZNqb+3P+lzurA3+Dd5suc/JsliQ8Kagx8x8x1TuBe/J0Pq4diE5SRXx3uczyOa47Aow9EkijnlP1laIoNDkQ0N6cttIYJjEdFcvd6SVtY58DElWHIUcqnvjNmNzw47xqfXSNfeJNRBuddjjC48Jji8as123nAVci/u3+j6OepnUjiX0a+SavT7oupEqE8IVlA/n/2LY2GO/U5d+VjJJDXIlZysHaeLgiwitaDNqFXJVDZN42wqtjF/W6ibfTB6UevBxJNI2uOpHWIKXLm/wMgNYYAQ=="}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":1417,"cache_read_input_tokens":104574,"output_tokens":229,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":1417,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":229,"cache_read_input_tokens":104574,"cache_creation_input_tokens":1417,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":1417},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmLMiyz5MBnVj3d1gRaA","type":"assistant","uuid":"a4f39254-c436-456e-8b60-276a1469872d","timestamp":"2026-08-06T10:26:32.551Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"a4f39254-c436-456e-8b60-276a1469872d","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmLMnBTuKRqXfaYNLT6c","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01D4AQMedouBczJTWi4EuajU","name":"Bash","input":{"command":"cd /mnt/ssd/data/Dropbox/adrian/sandbox/powerbricks/frontend && node --check app.js && echo \"app.js syntax OK\"","description":"Syntax-check app.js"},"caller":{"type":"direct"}}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":1417,"cache_read_input_tokens":104574,"output_tokens":229,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":1417,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":229,"cache_read_input_tokens":104574,"cache_creation_input_tokens":1417,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":1417},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmLMiyz5MBnVj3d1gRaA","type":"assistant","uuid":"983d4eed-ffdd-49ca-b911-6adf0edd3200","timestamp":"2026-08-06T10:26:33.021Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"983d4eed-ffdd-49ca-b911-6adf0edd3200","isSidechain":false,"promptId":"8e00cf3e-39fd-47ba-9744-19245c87b11c","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01D4AQMedouBczJTWi4EuajU","type":"tool_result","content":"app.js syntax OK","is_error":false}]},"uuid":"73541649-1101-4286-a76e-4fdc235c3709","timestamp":"2026-08-06T10:26:33.129Z","toolUseResult":{"stdout":"app.js syntax OK","stderr":"","interrupted":false,"isImage":false,"noOutputExpected":false},"sourceToolAssistantUUID":"983d4eed-ffdd-49ca-b911-6adf0edd3200","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian/sandbox/powerbricks/frontend","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"73541649-1101-4286-a76e-4fdc235c3709","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmLN3uGqg1yDe7D1Gxvm","type":"message","role":"assistant","content":[{"type":"text","text":"Fatto — sintassi verificata (headless, non posso testare il rendering visivo da qui). Modifiche:\n\n- **`index.html`**: toolbox convertito da lista piatta a 3 categorie native Blockly — \"Anagrafica\" (rosso), \"Emesso\" (ambra), \"Strumenti\" (grigio, solo il join). Ogni categoria mostra solo i suoi blocchi nel flyout, più un bottone \"Seleziona campi output...\" in Anagrafica/Emesso.\n- **`app.js`**: registrati i due `registerButtonCallback` — cliccando il bottone si apre lo stesso modale di prima; se il blocco \"Tabella\" non è ancora sulla lavagna lo crea al volo (stessa logica del blocco di partenza già esistente), così il bottone funziona anche a canvas vuoto.\n\nIl doppio click sul blocco resta come scorciatoia alternativa, non l'ho tolto.\n\nVa provato su Ufficio per vedere se le categorie/bottoni si comportano come atteso — vuoi che committiamo prima o preferisci testare da schermo reale prima di fissare lo stato?"}],"stop_reason":"end_turn","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":242,"cache_read_input_tokens":105991,"output_tokens":392,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":242,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":392,"cache_read_input_tokens":105991,"cache_creation_input_tokens":242,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":242},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmLN22f35j3VNBzDxiak","type":"assistant","uuid":"b492c620-2dc2-4466-94cf-89f9bde2ffaa","timestamp":"2026-08-06T10:26:39.808Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian/sandbox/powerbricks/frontend","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"type":"queue-operation","operation":"enqueue","timestamp":"2026-08-06T10:29:19.667Z","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","content":"Molto bene!!! Si committiamo. Direzione giusta"}
{"type":"queue-operation","operation":"dequeue","timestamp":"2026-08-06T10:29:19.765Z","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01"}
{"parentUuid":"b492c620-2dc2-4466-94cf-89f9bde2ffaa","isSidechain":false,"promptId":"fafaacec-8c73-43e0-80a1-a75aa241a7f7","type":"user","message":{"role":"user","content":"Molto bene!!! Si committiamo. Direzione giusta"},"uuid":"bc19aede-ba16-422f-938f-f0c14417a348","timestamp":"2026-08-06T10:29:19.776Z","permissionMode":"acceptEdits","origin":{"kind":"human"},"promptSource":"sdk","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"type":"file-history-snapshot","messageId":"bc19aede-ba16-422f-938f-f0c14417a348","snapshot":{"messageId":"bc19aede-ba16-422f-938f-f0c14417a348","trackedFileBackups":{"sandbox/powerbricks/frontend/index.html":{"backupFileName":"89766efd6348531e@v2","version":2,"backupTime":"2026-08-06T10:29:19.816Z","realParentDir":"/mnt/ssd/data/Dropbox/adrian/sandbox/powerbricks/frontend"},"sandbox/powerbricks/frontend/app.js":{"backupFileName":"397d5a700944e6c0@v2","version":2,"backupTime":"2026-08-06T10:29:19.817Z","realParentDir":"/mnt/ssd/data/Dropbox/adrian/sandbox/powerbricks/frontend"}},"timestamp":"2026-08-06T10:29:19.817Z"},"isSnapshotUpdate":false}
{"parentUuid":"bc19aede-ba16-422f-938f-f0c14417a348","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmLaPfFB2FobyrNLx2Vw","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_015cGaLQg8vLT6s9vEApSVqq","name":"Bash","input":{"command":"cd /mnt/ssd/data/Dropbox/adrian/sandbox/powerbricks && git add frontend/index.html frontend/app.js && git status","description":"Stage PowerBricks toolbox changes"},"caller":{"type":"direct"}}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":416,"cache_read_input_tokens":106233,"output_tokens":134,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":416,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":134,"cache_read_input_tokens":106233,"cache_creation_input_tokens":416,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":416},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmLaJn4NuTBezRb984uY","type":"assistant","uuid":"072780c1-f2e1-4f93-97d9-9997f33fab1b","timestamp":"2026-08-06T10:29:23.611Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian/sandbox/powerbricks","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"072780c1-f2e1-4f93-97d9-9997f33fab1b","isSidechain":false,"promptId":"fafaacec-8c73-43e0-80a1-a75aa241a7f7","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_015cGaLQg8vLT6s9vEApSVqq","type":"tool_result","content":"Sul branch master\nModifiche di cui verrà eseguito il commit:\n (usa \"git restore --staged ...\" per rimuovere gli elementi dall'area di staging)\n\tmodificato: frontend/app.js\n\tmodificato: frontend/index.html","is_error":false}]},"uuid":"2ac6fcf0-25bf-4d4d-91dd-b60f4ff432e9","timestamp":"2026-08-06T10:29:23.698Z","toolUseResult":{"stdout":"Sul branch master\nModifiche di cui verrà eseguito il commit:\n (usa \"git restore --staged ...\" per rimuovere gli elementi dall'area di staging)\n\tmodificato: frontend/app.js\n\tmodificato: frontend/index.html","stderr":"","interrupted":false,"isImage":false,"noOutputExpected":false},"sourceToolAssistantUUID":"072780c1-f2e1-4f93-97d9-9997f33fab1b","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian/sandbox/powerbricks","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"2ac6fcf0-25bf-4d4d-91dd-b60f4ff432e9","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmLadMGADHucWam6t8R5","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01HFBUUTWGaAHNBPhb5Ztqne","name":"Bash","input":{"command":"git commit -m \"$(cat <<'EOF'\nfeat: toolbox a categorie per dominio invece di lista piatta\n\nSostituisce il toolbox flat con categorie native Blockly (Anagrafica\nrosso, Emesso ambra, Strumenti grigio) per non affollare il pannello\nquando arriveranno Diritti/Boxoffice. Aggiunto anche un bottone\n\"Seleziona campi output...\" nel flyout di ogni dominio (via\nregisterButtonCallback), stessa modale del doppio click sul blocco ma\npiù scopribile.\n\nCo-Authored-By: Mauro \nCo-Authored-By: Claude Sonnet 5 \nEOF\n)\"\ngit log --oneline -3","description":"Commit toolbox categorization changes"},"caller":{"type":"direct"}}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":229,"cache_read_input_tokens":106649,"output_tokens":386,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":229,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":386,"cache_read_input_tokens":106649,"cache_creation_input_tokens":229,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":229},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmLabY7qo78BXttES7ZL","type":"assistant","uuid":"f3c8dd50-4927-48d0-ac10-362abeb60c46","timestamp":"2026-08-06T10:29:28.574Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian/sandbox/powerbricks","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"f3c8dd50-4927-48d0-ac10-362abeb60c46","isSidechain":false,"promptId":"fafaacec-8c73-43e0-80a1-a75aa241a7f7","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01HFBUUTWGaAHNBPhb5Ztqne","type":"tool_result","content":"[master b0f0758] feat: toolbox a categorie per dominio invece di lista piatta\n 2 files changed, 39 insertions(+), 7 deletions(-)\nb0f0758 feat: toolbox a categorie per dominio invece di lista piatta\n7131d86 docs: registra pattern Guacamole/x11vnc bloccato, fix confermato\n47453bc docs: completa aggiornamento documentazione voice-chat (systemd+monitor)","is_error":false}]},"uuid":"87aa4214-948f-4f91-911a-c146c446075c","timestamp":"2026-08-06T10:29:28.664Z","toolUseResult":{"stdout":"[master b0f0758] feat: toolbox a categorie per dominio invece di lista piatta\n 2 files changed, 39 insertions(+), 7 deletions(-)\nb0f0758 feat: toolbox a categorie per dominio invece di lista piatta\n7131d86 docs: registra pattern Guacamole/x11vnc bloccato, fix confermato\n47453bc docs: completa aggiornamento documentazione voice-chat (systemd+monitor)","stderr":"","interrupted":false,"isImage":false,"noOutputExpected":false,"gitOperation":{"commit":{"sha":"b0f0758","kind":"committed"}}},"sourceToolAssistantUUID":"f3c8dd50-4927-48d0-ac10-362abeb60c46","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian/sandbox/powerbricks","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"87aa4214-948f-4f91-911a-c146c446075c","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmLazNZChD3TSwH2u89a","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"EuQCCokBCBAYAipAvtFZrFoGZX02f/wvG8zk+px3qBbIXqoVFRgLrpYUnf85cY5kD9WYtfJzNCI08to2eSt/Dzgj53tAlWyt4o726TIPY2xhdWRlLXNvbm5ldC01OABCCHRoaW5raW5nWiQzZDFjY2UyZS0wNjY0LTQwZDYtODQxNC1iN2U1MjhhY2UyYjESDBwWUlZfHKJtunjE9BoMMSG5O6HxNCVPIrGRIjCaWJ/5LKIJK2Pt3tGaC9gj2MKbjApOEj8kSpWZF9MEbECMn5oJgdPg+jJRB6L3fAYqhwEdCjp/CuI3A5Gm/7M2QuUz8znefiSVEfGHt1/ghlhXdUsYOzhe4rudVpPX5YhiRb6EyN5DhOlDQ8FkAlK/s3H3RKQwkf2rLjwOKlV07ymvducnyVt8NsgKfcn9R74nADqadtrHA6kjsaiysm1Gza4xIzFj89HpDuH54o9Ralx3CcXnZZvAT1sYAQ=="}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":513,"cache_read_input_tokens":106878,"output_tokens":1180,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":513,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":1180,"cache_read_input_tokens":106878,"cache_creation_input_tokens":513,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":513},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmLaxWCCz36pUbdrhetV","type":"assistant","uuid":"057426d8-ed3c-4939-8b87-ae2fdd9f4fa6","timestamp":"2026-08-06T10:29:30.851Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian/sandbox/powerbricks","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"057426d8-ed3c-4939-8b87-ae2fdd9f4fa6","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmLazNZChD3TSwH2u89a","type":"message","role":"assistant","content":[{"type":"text","text":"Committato (`b0f0758`). Aggiorno anche il `CLAUDE.md` di PowerBricks con questa decisione, come da regola di documentazione proattiva."}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":513,"cache_read_input_tokens":106878,"output_tokens":1180,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":513,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":1180,"cache_read_input_tokens":106878,"cache_creation_input_tokens":513,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":513},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CdmLaxWCCz36pUbdrhetV","type":"assistant","uuid":"7560b5f2-c834-4d8f-bae1-9a039e96f28f","timestamp":"2026-08-06T10:29:31.965Z","effort":"medium","userType":"external","entrypoint":"claude-vscode","cwd":"/mnt/ssd/data/Dropbox/adrian/sandbox/powerbricks","sessionId":"c2380614-2d9a-4e52-a5f8-5189ab822c01","version":"2.1.221","gitBranch":"master"}
{"parentUuid":"7560b5f2-c834-4d8f-bae1-9a039e96f28f","isSidechain":false,"message":{"model":"claude-sonnet-5","id":"msg_011CdmLazNZChD3TSwH2u89a","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01NtQfi8N2qPfLZRvpWGmXg8","name":"Edit","input":{"replace_all":false,"file_path":"/mnt/ssd/data/Dropbox/adrian/sandbox/powerbricks/CLAUDE.md","old_string":"## Grafica query builder — colore per dominio, stile MediaTrack (05/08/2026)","new_string":"## Toolbox a categorie per dominio (06/08/2026)\n\n`[CONFERMATO]` — Mauro ha notato guardando lo screenshot col pattern \"due domini attivi\" che\nil toolbox flat (tutti i blocchi di tutti i domini sempre visibili in un unico elenco) non\navrebbe retto con Diritti/Boxoffice aggiunti (4 domini × ~3 blocchi = affollamento). Discusse\ninsieme alcune opzioni (categorie collassabili, due pannelli custom sincronizzati\ntabella↔blocchi) prima di convergere su una soluzione nativa: il **category toolbox** di\nBlockly (lo stesso pattern di \"Logic/Loops/Math\" nei playground ufficiali) è già di fatto un\nsistema a due pannelli — elenco categorie stretto a sinistra, flyout a comparsa coi blocchi\ndella categoria selezionata — senza bisogno di codice custom per sincronizzare stato tra due\npannelli.\n\n**Implementato**: `frontend/index.html`, toolbox XML convertito da `` flat a\n`` per dominio — \"Anagrafica\" (`#C62828`), \"Emesso\" (`#F9A825`), \"Strumenti\"\n(`#757575`, oggi solo `pb_join`) — stessi colori già in uso per i blocchi. Quando arriveranno\nDiritti/Boxoffice, bastano due categorie in più con lo stesso pattern.\n\n**Bottoni nel flyout invece di solo blocchi trascinabili**: Blockly supporta elementi\n`