@flui-cloud/semantic-surface 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1122 @@
1
+ # Semantic Surface — risposta alla revisione tecnica della v0.1
2
+
3
+ **Documento di risposta a:** `Semantic Surface — revisione tecnica della v0.1`
4
+ **Documento originario:** `vops-semantic-surface-spec.md`
5
+ **Data:** 2026-08-05
6
+ **Stato:** Decision record per la preparazione della v0.2
7
+ **Obiettivo:** incorporare le osservazioni che migliorano il modello senza trasformare prematuramente il pilot vops in un programma completo di standardizzazione.
8
+
9
+ ---
10
+
11
+ ## 1. Verdetto generale
12
+
13
+ La revisione tecnica coglie diversi problemi reali della v0.1 e migliora il progetto soprattutto in quattro punti:
14
+
15
+ 1. chiarisce che il contratto portabile è il **wire format**, non l’interfaccia TypeScript;
16
+ 2. impedisce alla Semantic Surface di diventare una copia dello store o del backend;
17
+ 3. separa meglio ciò che è stato presentato all’utente dalla fonte autorevole dei dati;
18
+ 4. mette in discussione correttamente la duplicazione delle capability nella UI.
19
+
20
+ Il nucleo architetturale originario resta però valido:
21
+
22
+ ```text
23
+ Semantic Surface
24
+
25
+ │ descrive il contesto della UI
26
+
27
+ Assistant / Planner
28
+
29
+ │ interpreta l’intento e sceglie uno strumento
30
+
31
+ MCP Server
32
+
33
+ │ autorizza, approva, valida ed esegue
34
+
35
+ Application Services / Infrastructure
36
+ ```
37
+
38
+ La revisione non richiede quindi di cambiare direzione. Richiede di **ridurre il core**, precisarne il significato e distinguere meglio:
39
+
40
+ - modello;
41
+ - trasporto;
42
+ - implementazione runtime;
43
+ - binding per framework;
44
+ - integrazione specifica di vops.
45
+
46
+ La v0.2 non sarà ancora presentata come standard universale. Sarà:
47
+
48
+ > un modello portabile, con wire format esplicito, validato attraverso un pilot reale su vops.
49
+
50
+ L’eventuale standardizzazione viene dopo che il modello ha prodotto valore misurabile e almeno una seconda implementazione ne ha dimostrato la portabilità.
51
+
52
+ ---
53
+
54
+ ## 2. Definizione aggiornata
55
+
56
+ La definizione della v0.1 era:
57
+
58
+ > La Semantic Surface descrive ciò che l’utente sta osservando.
59
+
60
+ È corretta ma troppo ampia. Può indurre a includere nella Surface tutto ciò che appare nella pagina, fino a creare un duplicato semantico dell’applicazione.
61
+
62
+ La definizione adottata per la v0.2 è:
63
+
64
+ > **La Semantic Surface è una rappresentazione serializzabile e indipendente dal trasporto dell’attenzione corrente dell’utente e di ciò che l’interfaccia gli ha effettivamente presentato.**
65
+
66
+ La Surface può descrivere:
67
+
68
+ - route o vista corrente;
69
+ - scope attivi;
70
+ - entità primaria;
71
+ - selezioni;
72
+ - focus o attenzione;
73
+ - tab, filtri e modalità attive;
74
+ - overlay aperti;
75
+ - stato di caricamento, errore o assenza di risultati;
76
+ - valori effettivamente presentati;
77
+ - timestamp dei dati presentati;
78
+ - riferimenti con cui recuperare dati autorevoli.
79
+
80
+ La Surface non deve diventare:
81
+
82
+ - una replica dello store;
83
+ - un dump delle risposte REST;
84
+ - un modello completo del dominio;
85
+ - un catalogo autorevole delle capability;
86
+ - un sistema di autorizzazione;
87
+ - una rappresentazione dei click;
88
+ - un motore di browser automation.
89
+
90
+ ---
91
+
92
+ ## 3. Principio di ammissione dei dati
93
+
94
+ La revisione propone una regola molto rigida:
95
+
96
+ > entra nella Surface solo ciò che è vero unicamente nel client.
97
+
98
+ La direzione è corretta, ma la formulazione è troppo restrittiva.
99
+
100
+ Un valore recuperato dal backend può essere legittimamente incluso quando è stato realmente presentato all’utente. La sua presenza nella Surface non afferma che sia ancora autorevole; afferma che l’utente lo ha visto in quella forma e in quel momento.
101
+
102
+ ### Regola adottata
103
+
104
+ Un’informazione può entrare nella Surface quando soddisfa almeno uno di questi criteri:
105
+
106
+ 1. esiste soltanto nella sessione UI, come selezione, focus, filtro o overlay;
107
+ 2. descrive il modo in cui un dato è stato presentato all’utente;
108
+ 3. è necessaria per risolvere una deissi come «questo server» o «quello selezionato»;
109
+ 4. indica lo stato semantico della vista, come loading, errore, empty state o troncamento;
110
+ 5. contiene un riferimento per recuperare dalla fonte autorevole i dati completi o aggiornati.
111
+
112
+ Un’informazione non deve entrare quando:
113
+
114
+ - è recuperabile in modo migliore e non ambiguo tramite un normale tool MCP;
115
+ - non è rilevante per la vista o per l’attenzione corrente;
116
+ - duplica grandi strutture del backend;
117
+ - contiene segreti o dati non necessari;
118
+ - è stata prodotta esclusivamente per “spiegare meglio” la pagina al modello senza essere parte del prodotto.
119
+
120
+ ### Esempio
121
+
122
+ Corretto:
123
+
124
+ ```json
125
+ {
126
+ "key": "system.cpu.utilization",
127
+ "observedAt": "2026-08-05T16:09:40Z",
128
+ "presentedAs": {
129
+ "value": 92,
130
+ "unit": "percent"
131
+ },
132
+ "resourceRef": "vops://server/srv_123/metrics/cpu"
133
+ }
134
+ ```
135
+
136
+ Il significato è:
137
+
138
+ > L’interfaccia ha presentato all’utente un utilizzo CPU del 92%, riferito a quella rilevazione.
139
+
140
+ Non significa:
141
+
142
+ > La CPU è ancora autorevolmente al 92%.
143
+
144
+ L’agente può usare `resourceRef` o una capability MCP per aggiornare il dato prima di formulare una diagnosi o proporre un’azione.
145
+
146
+ ---
147
+
148
+ ## 4. La regola anti-deriva
149
+
150
+ Viene accolta integralmente la raccomandazione secondo cui il provider semantico deve leggere la stessa reactive state usata dalla UI.
151
+
152
+ Non devono esistere due strutture indipendenti:
153
+
154
+ ```text
155
+ UI state
156
+ Semantic state
157
+ ```
158
+
159
+ da sincronizzare manualmente.
160
+
161
+ Il modello corretto è:
162
+
163
+ ```text
164
+ Application state
165
+
166
+ ├── rendering UI
167
+ └── materializzazione Surface
168
+ ```
169
+
170
+ Esempio:
171
+
172
+ ```ts
173
+ const definitions = [
174
+ {
175
+ id: "server-details",
176
+ kind: "page",
177
+
178
+ isActive: state =>
179
+ state.section === "server-details",
180
+
181
+ read: state => ({
182
+ entities: state.selectedServer
183
+ ? [{
184
+ ref: `vops://server/${state.selectedServer.id}`,
185
+ label: state.selectedServer.name,
186
+ role: "primary"
187
+ }]
188
+ : [],
189
+
190
+ state: {
191
+ loading: state.serverLoading,
192
+ error: Boolean(state.serverError),
193
+ empty: !state.serverLoading && !state.selectedServer
194
+ }
195
+ })
196
+ }
197
+ ];
198
+ ```
199
+
200
+ Questa regola riduce il rischio di divergenza tra ciò che vede l’utente e ciò che riceve l’agente.
201
+
202
+ Non elimina gli errori di copertura: una pagina potrebbe non avere alcuna definizione semantica. La copertura può però essere controllata tramite:
203
+
204
+ - inspector;
205
+ - test;
206
+ - lint sulle route principali;
207
+ - criteri di accettazione del pilot.
208
+
209
+ ---
210
+
211
+ ## 5. Decisioni sulle raccomandazioni R1–R24
212
+
213
+ ### Legenda
214
+
215
+ - **Accolta:** entra nella v0.2.
216
+ - **Modificata:** il principio è valido, ma la proposta viene semplificata o limitata.
217
+ - **Rinviata:** interessante, ma non necessaria per il pilot.
218
+ - **Respinta:** introduce rigidità o complessità non giustificata.
219
+
220
+ | Raccomandazione | Decisione | Motivazione |
221
+ |---|---|---|
222
+ | **R1 — quattro documenti separati** | **Modificata** | È corretta la separazione concettuale tra core, runtime, binding e authoring. Per ora produrremo un core, uno JSON Schema e un documento pilot. Lo split completo avverrà dopo una seconda implementazione. |
223
+ | **R2 — conformità possibile senza runtime JS** | **Accolta** | Il modello normativo deve essere il wire format. SSR o MPA devono poter emettere uno snapshot valido senza implementare `register/unregister`. |
224
+ | **R3 — solo dati unicamente client-side** | **Modificata** | Ammessi anche dati backend realmente presentati, purché identificati come presentazione stantia e accompagnati da provenienza temporale o `resourceRef`. |
225
+ | **R4 — leggere la stessa reactive state** | **Accolta** | È una delle regole principali della v0.2. Vietata la copia parallela dello stato solo per l’agente. |
226
+ | **R5 — vietare tutte le summary naturali** | **Modificata** | Vietate sintesi inventate ad hoc dalla UI per il modello. Ammessi testi realmente mostrati all’utente o prodotti dal backend, con limiti e provenienza. |
227
+ | **R6 — un solo ref canonico** | **Accolta** | Elimina incoerenze tra `ref`, `type` e `id`. |
228
+ | **R7 — focus multiplo ordinato** | **Accolta** | Necessario per split view, confronti e multi-selezione. Il nome adottato sarà `attention`. |
229
+ | **R8 — stato dello scope** | **Accolta** | Loading, errore ed empty state sono necessari per interpretare correttamente una vista. |
230
+ | **R9 — completezza delle liste** | **Accolta** | Importante per liste paginate, filtrate o virtualizzate. Resta opzionale quando non pertinente. |
231
+ | **R10 — kind estensibile e namespaced** | **Modificata** | Il core definisce pochi valori raccomandati; sono ammesse estensioni namespaced. Non imponiamo subito una tassonomia completa. |
232
+ | **R11 — eliminare dialog/drawer** | **Rinviata** | Per il core useremo il termine più neutro `overlay`. I binding possono distinguere dialog e drawer localmente. Non serve una migrazione complessa nel pilot. |
233
+ | **R12 — Observation namespaced, source e budget** | **Modificata** | Namespacing e budget sì. `source` è utile ma opzionale. `observedAt` non viene automaticamente equiparato a `generatedAt`: sono momenti semanticamente diversi. |
234
+ | **R13 — sensitivity inefficace** | **Accolta** | `sensitivity` viene rimossa dal wire format iniziale. I dati non esportabili devono essere redatti prima dello snapshot. |
235
+ | **R14 — app, locale e profiles** | **Modificata** | `app.id`, `app.version` e `locale` entrano. `profiles` resta opzionale e sperimentale finché non esistono più vocabolari reali. |
236
+ | **R15 — relation fuori dal core** | **Accolta** | Le relazioni di dominio sono normalmente meglio fornite dal backend. Potranno essere reintrodotte come estensione se il pilot dimostrerà un caso necessario. |
237
+ | **R16 — budget normativo di 32 KB** | **Modificata** | È necessario un budget, ma 32 KB non viene congelato come limite universale. Il pilot userà warning, troncamento dichiarato e metriche reali. |
238
+ | **R17 — grammatica, core vocabulary e profiles** | **Modificata** | Adottiamo namespace leggibili. Non introduciamo ancora URI risolvibili, registry o un sistema simile a JSON-LD. |
239
+ | **R18 — OpenTelemetry obbligatorio** | **Modificata** | Riutilizzare OTel dove naturale, specialmente per metriche infrastrutturali, senza renderlo una dipendenza obbligatoria dell’intero modello. |
240
+ | **R19 — companion di WebMCP** | **Accolta come posizionamento** | La Surface descrive contesto e attenzione; WebMCP e MCP descrivono o implementano azioni. Non leghiamo però il core all’evoluzione di WebMCP. |
241
+ | **R20 — hint riferiscono tool, nessun canale proprietario** | **Accolta in forma più netta** | I `capabilityHints` escono dal core e dal primo pilot. La Surface non suggerisce tool; MCP resta il catalogo autorevole. Il formato resta indipendente dal trasporto. |
242
+ | **R21 — definizione di multimodalità** | **Modificata** | La v0.2 non norma “la multimodalità” in senso ampio. Dichiara solo di essere indipendente dal mezzo e combinabile con pixel, DOM, voce o TUI da parte dell’host. |
243
+ | **R22 — data attribute per ancoraggio DOM** | **Accolta come binding opzionale** | `data-surface-scope` è utile per collegare scope e layout, ma non entra nel wire format né nel core. |
244
+ | **R23 — requestAttention** | **Rinviata** | È una buona estensione, ma introduce un canale agente→UI distinto dalla Surface descrittiva. Verrà valutata dopo il pilot come modulo separato. |
245
+ | **R24 — definizione con reveal/highlight** | **Modificata** | Manteniamo la definizione canonica descrittiva. Non promettiamo ancora che l’agente possa dirigere l’attenzione. |
246
+
247
+ ---
248
+
249
+ ## 6. Capability: decisione aggiornata
250
+
251
+ La v0.1 prevedeva `capabilityHints` nella Surface.
252
+
253
+ Questa scelta viene abbandonata nel core e nel primo pilot.
254
+
255
+ ### Motivi
256
+
257
+ 1. vops possiede già un registry autorevole lato MCP;
258
+ 2. gli hint nel browser duplicano informazioni;
259
+ 3. possono divergere dal registry;
260
+ 4. possono orientare il planner verso operazioni non pertinenti;
261
+ 5. la Surface deve restare descrittiva;
262
+ 6. l’agente può derivare le capability dal tipo di entità e dall’intento.
263
+
264
+ Il flusso diventa:
265
+
266
+ ```text
267
+ Surface
268
+ └── attention: vops://server/srv_123
269
+
270
+
271
+ Assistant interpreta l’intento
272
+
273
+
274
+ MCP tools / capability resolver
275
+
276
+
277
+ permessi + rischio + approvazione + stato
278
+ ```
279
+
280
+ ### Resolver opzionale
281
+
282
+ Se il numero di strumenti diventerà elevato, il server MCP potrà esporre una capability read-only:
283
+
284
+ ```text
285
+ vops_capabilities_resolve
286
+ ```
287
+
288
+ Input:
289
+
290
+ ```json
291
+ {
292
+ "entities": [
293
+ "vops://server/srv_123"
294
+ ],
295
+ "intent": "restart"
296
+ }
297
+ ```
298
+
299
+ Output:
300
+
301
+ ```json
302
+ {
303
+ "capabilities": [
304
+ {
305
+ "id": "server.restart",
306
+ "tool": "server_restart",
307
+ "available": true,
308
+ "risk": "high",
309
+ "approval": "required"
310
+ }
311
+ ]
312
+ }
313
+ ```
314
+
315
+ Questo resolver non è parte della Semantic Surface. È parte del modello operativo MCP di vops.
316
+
317
+ ---
318
+
319
+ ## 7. Wire format proposto per la v0.2
320
+
321
+ Il core viene espresso come JSON serializzabile. Le interfacce TypeScript sono soltanto una rappresentazione di sviluppo.
322
+
323
+ ```ts
324
+ interface SurfaceSnapshot {
325
+ schemaVersion: "0.2";
326
+
327
+ app: {
328
+ id: string;
329
+ version?: string;
330
+ };
331
+
332
+ surface: {
333
+ id: string;
334
+ route?: string;
335
+ revision: number;
336
+ generatedAt: string;
337
+ locale?: string;
338
+ truncated?: boolean;
339
+ };
340
+
341
+ attention: AttentionTarget[];
342
+ scopes: SemanticScopeSnapshot[];
343
+ }
344
+
345
+ interface AttentionTarget {
346
+ scopeId: string;
347
+ entityRef?: string;
348
+ reason?: string;
349
+ }
350
+
351
+ interface SemanticScopeSnapshot {
352
+ id: string;
353
+ parentId?: string;
354
+ kind: string;
355
+ label?: string;
356
+
357
+ entities?: EntityReference[];
358
+ observations?: Observation[];
359
+
360
+ state?: {
361
+ loading?: boolean;
362
+ error?: boolean;
363
+ errorCode?: string;
364
+ empty?: boolean;
365
+ };
366
+
367
+ completeness?: {
368
+ shown: number;
369
+ total?: number;
370
+ filtered?: boolean;
371
+ truncated?: boolean;
372
+ };
373
+ }
374
+
375
+ interface EntityReference {
376
+ ref: string;
377
+ label?: string;
378
+ role?: "primary" | "selected" | "related";
379
+ }
380
+
381
+ interface Observation {
382
+ key: string;
383
+ value?: unknown;
384
+
385
+ presentedAs?: {
386
+ value?: unknown;
387
+ unit?: string;
388
+ text?: string;
389
+ };
390
+
391
+ source?: "ui" | "api" | "derived";
392
+ observedAt?: string;
393
+ resourceRef?: string;
394
+ }
395
+ ```
396
+
397
+ ### Nota su `observedAt`
398
+
399
+ `surface.generatedAt` indica quando è stato prodotto lo snapshot.
400
+
401
+ `observation.observedAt` indica quando il dato rappresentato è stato rilevato o ricevuto.
402
+
403
+ Non sono equivalenti.
404
+
405
+ Quando `observedAt` è assente, il consumer deve considerare non nota l’età del dato. Non deve assumere automaticamente che coincida con `generatedAt`.
406
+
407
+ ---
408
+
409
+ ## 8. Formato dei riferimenti
410
+
411
+ La v0.2 usa un solo campo canonico:
412
+
413
+ ```json
414
+ {
415
+ "ref": "vops://server/srv_123"
416
+ }
417
+ ```
418
+
419
+ Il riferimento deve essere:
420
+
421
+ - stabile;
422
+ - serializzabile;
423
+ - interpretabile dal produttore;
424
+ - trasmesso esplicitamente ai tool;
425
+ - non utilizzato come prova di autorizzazione.
426
+
427
+ ### Formato raccomandato
428
+
429
+ ```text
430
+ <namespace>://<entity-type>/<entity-id>
431
+ ```
432
+
433
+ Esempi:
434
+
435
+ ```text
436
+ vops://server/srv_123
437
+ vops://deployment/dep_44
438
+ vops://database/db_19
439
+ ```
440
+
441
+ Il consumer può estrarre tipo e ID, ma non deve inventare un’entità differente da quella espressa dal riferimento.
442
+
443
+ Il server MCP deve comunque:
444
+
445
+ - risolvere il riferimento;
446
+ - validarlo;
447
+ - applicare il tenant;
448
+ - verificare autorizzazioni;
449
+ - rivalidare lo stato corrente.
450
+
451
+ ---
452
+
453
+ ## 9. Vocabolario e namespacing
454
+
455
+ La revisione ha ragione nel segnalare che stringhe completamente libere creano collisioni e ambiguità.
456
+
457
+ La v0.2 adotta una regola minima, senza introdurre un’ontologia universale.
458
+
459
+ ### Observation key
460
+
461
+ Le chiavi applicative devono essere namespaced oppure appartenere a un vocabolario riconosciuto.
462
+
463
+ Esempi:
464
+
465
+ ```text
466
+ system.cpu.utilization
467
+ system.memory.utilization
468
+ vops.server.status
469
+ vops.deployment.phase
470
+ ```
471
+
472
+ ### Scope kind
473
+
474
+ Il core raccomanda:
475
+
476
+ ```text
477
+ page
478
+ region
479
+ selection
480
+ list
481
+ form
482
+ overlay
483
+ ```
484
+
485
+ Sono consentite estensioni:
486
+
487
+ ```text
488
+ vops.terminal
489
+ flui.canvas
490
+ ```
491
+
492
+ ### Nessun registry centrale
493
+
494
+ La v0.2 non introduce:
495
+
496
+ - un registry globale;
497
+ - risoluzione di URI;
498
+ - RDF;
499
+ - JSON-LD;
500
+ - una governance universale dell’ontologia.
501
+
502
+ Questi problemi diventano reali solo quando più applicazioni indipendenti devono interoperare sugli stessi termini.
503
+
504
+ ### OpenTelemetry
505
+
506
+ Per metriche infrastrutturali vops dovrebbe preferire, quando applicabile, i nomi già usati nelle OpenTelemetry Semantic Conventions.
507
+
508
+ Questa è una scelta di interoperabilità del profilo vops, non una dipendenza obbligatoria del core Semantic Surface.
509
+
510
+ ---
511
+
512
+ ## 10. Runtime: core puro e binding opzionali
513
+
514
+ La revisione dimostra correttamente che `register/unregister` non può essere il cuore del modello.
515
+
516
+ Il runtime iniziale di vops può essere una composizione di definizioni pure:
517
+
518
+ ```ts
519
+ interface SemanticScopeDefinition<S> {
520
+ id: string;
521
+ parentId?: string;
522
+ kind: string;
523
+
524
+ isActive(state: S): boolean;
525
+ read(state: S): ScopeContribution;
526
+ }
527
+
528
+ function createSurface<S>(
529
+ definitions: SemanticScopeDefinition<S>[],
530
+ getState: () => S
531
+ ): {
532
+ snapshot(): SurfaceSnapshot;
533
+ }
534
+ ```
535
+
536
+ Questo modello funziona per:
537
+
538
+ - Alpine con store unico;
539
+ - controller di pagina;
540
+ - SSR;
541
+ - applicazioni multi-page;
542
+ - test senza browser.
543
+
544
+ ### Registrazione dinamica
545
+
546
+ Framework a componenti come Angular o React possono aggiungere un adapter:
547
+
548
+ ```text
549
+ register
550
+ invalidate
551
+ unregister
552
+ subscribe
553
+ ```
554
+
555
+ Queste API appartengono al binding runtime, non al wire format e non sono obbligatorie per la conformità del modello.
556
+
557
+ ### Invariante portabile
558
+
559
+ Il criterio originario:
560
+
561
+ > la distruzione di un componente rimuove lo scope
562
+
563
+ viene sostituito da:
564
+
565
+ > **uno scope inattivo non compare mai nello snapshot.**
566
+
567
+ Questo vale in ogni ambiente, indipendentemente dal lifecycle del framework.
568
+
569
+ ---
570
+
571
+ ## 11. Testi liberi e prompt injection
572
+
573
+ Non vengono vietati in assoluto i testi naturali.
574
+
575
+ Vengono distinti tre casi.
576
+
577
+ ### Ammesso
578
+
579
+ Testo realmente presentato all’utente:
580
+
581
+ ```json
582
+ {
583
+ "key": "vops.deployment.error",
584
+ "presentedAs": {
585
+ "text": "Health check timed out"
586
+ },
587
+ "source": "api"
588
+ }
589
+ ```
590
+
591
+ ### Ammesso con cautela
592
+
593
+ Sintesi prodotta dal backend come parte del prodotto, testata e mostrata anche all’utente.
594
+
595
+ ### Vietato nel core
596
+
597
+ Testo generato appositamente dal provider semantico per orientare il modello:
598
+
599
+ ```text
600
+ Questo server sembra in grave difficoltà e dovrebbe essere riavviato.
601
+ ```
602
+
603
+ ### Regole
604
+
605
+ - limiti di lunghezza;
606
+ - nessun HTML arbitrario;
607
+ - nessun segreto;
608
+ - nessuna istruzione operativa;
609
+ - incapsulamento dello snapshot come dato non attendibile;
610
+ - preferenza per codici, valori strutturati e `resourceRef`;
611
+ - sanitizzazione a cura dell’host dell’assistente.
612
+
613
+ ---
614
+
615
+ ## 12. Redazione e sicurezza
616
+
617
+ Il campo `sensitivity` viene rimosso dal wire format iniziale.
618
+
619
+ La sicurezza non può dipendere da un’etichetta che il consumer potrebbe ignorare.
620
+
621
+ ### Regola
622
+
623
+ Un dato che non deve lasciare il processo della UI:
624
+
625
+ > non deve essere presente nello snapshot.
626
+
627
+ Il produttore deve applicare una redazione prima della serializzazione.
628
+
629
+ ### Perimetro iniziale
630
+
631
+ Il pilot vops viene dichiarato:
632
+
633
+ ```text
634
+ first-party
635
+ same-origin
636
+ single application trust domain
637
+ ```
638
+
639
+ Non dichiara ancora di risolvere:
640
+
641
+ - iframe di terze parti;
642
+ - widget non attendibili;
643
+ - estensioni browser;
644
+ - composizione cross-origin;
645
+ - firme dei provider;
646
+ - attestazione di provenienza.
647
+
648
+ Il runtime deve comunque impedire per default che codice esterno registri scope senza una integrazione esplicita.
649
+
650
+ ### Trust boundary
651
+
652
+ La Surface non è mai attendibile per:
653
+
654
+ - autorizzazione;
655
+ - tenant;
656
+ - permessi;
657
+ - rischio;
658
+ - approvazione;
659
+ - disponibilità di una capability;
660
+ - stato operativo corrente.
661
+
662
+ Tali elementi vengono sempre rivalidati lato MCP/backend.
663
+
664
+ ---
665
+
666
+ ## 13. Budget e troncamento
667
+
668
+ Il core deve impedire che lo snapshot diventi un dump arbitrario.
669
+
670
+ Non viene però fissato immediatamente un limite universale di 32 KB.
671
+
672
+ ### Pilot vops
673
+
674
+ Il builder deve misurare:
675
+
676
+ - byte JSON;
677
+ - token stimati;
678
+ - numero di scope;
679
+ - numero di observation;
680
+ - numero di entity ref;
681
+ - campi troncati.
682
+
683
+ Deve supportare un budget configurabile.
684
+
685
+ Esempio:
686
+
687
+ ```ts
688
+ createSurface(definitions, getState, {
689
+ maxBytes: 32_768,
690
+ maxScopes: 30,
691
+ maxObservationsPerScope: 20,
692
+ maxTextLength: 500
693
+ });
694
+ ```
695
+
696
+ Se il budget viene superato:
697
+
698
+ 1. vengono troncati prima i testi;
699
+ 2. poi le observation meno salienti;
700
+ 3. non vengono mai eliminate le entity ref dell’attenzione primaria;
701
+ 4. `surface.truncated` diventa `true`;
702
+ 5. gli scope interessati espongono `completeness.truncated`.
703
+
704
+ Il valore predefinito definitivo verrà scelto sulla base delle misure del pilot.
705
+
706
+ ---
707
+
708
+ ## 14. Revision e risposte stantie
709
+
710
+ Ogni snapshot ha una `revision`.
711
+
712
+ Quando l’utente invia un messaggio, l’host registra la revisione usata.
713
+
714
+ ```json
715
+ {
716
+ "message": "Perché la CPU è alta?",
717
+ "surfaceRevision": 42,
718
+ "surface": {}
719
+ }
720
+ ```
721
+
722
+ La risposta dell’assistente deve essere associata alla stessa revisione:
723
+
724
+ ```json
725
+ {
726
+ "surfaceRevision": 42,
727
+ "answer": "..."
728
+ }
729
+ ```
730
+
731
+ Se nel frattempo la UI è passata alla revisione 45, il client può:
732
+
733
+ - mostrare un indicatore “basato sulla vista precedente”;
734
+ - evitare di associare visivamente la risposta al nuovo focus;
735
+ - chiedere un refresh del contesto prima di un’azione;
736
+ - non invalidare automaticamente una risposta storica corretta.
737
+
738
+ La revisione della Surface non sostituisce revisioni, versioni o ETag del backend.
739
+
740
+ ---
741
+
742
+ ## 15. Relazione con MCP e WebMCP
743
+
744
+ ### MCP
745
+
746
+ MCP resta per vops il canale operativo principale.
747
+
748
+ La Surface fornisce:
749
+
750
+ ```text
751
+ attenzione + riferimenti + presentazione
752
+ ```
753
+
754
+ MCP fornisce:
755
+
756
+ ```text
757
+ dati autorevoli + capability + guardrail + esecuzione
758
+ ```
759
+
760
+ ### WebMCP
761
+
762
+ WebMCP viene trattato come prior art complementare, non come dipendenza.
763
+
764
+ In termini concettuali:
765
+
766
+ ```text
767
+ Semantic Surface
768
+ Che cosa è stato presentato e a cosa si riferisce “questo”?
769
+
770
+ WebMCP / MCP
771
+ Quali azioni o strumenti sono disponibili?
772
+ ```
773
+
774
+ La v0.2 non introduce API browser proprietarie nel core.
775
+
776
+ Il formato JSON potrà essere trasportato tramite:
777
+
778
+ - body di una richiesta applicativa;
779
+ - content block o resource MCP;
780
+ - script JSON in SSR;
781
+ - bridge in-browser;
782
+ - eventuali API browser future.
783
+
784
+ ---
785
+
786
+ ## 16. `requestAttention` e interazione agente→UI
787
+
788
+ La proposta `reveal/highlight` è interessante e coerente con il modello di attenzione.
789
+
790
+ Non viene però inserita nella v0.2 core.
791
+
792
+ Motivi:
793
+
794
+ - introduce un canale bidirezionale distinto;
795
+ - richiede policy sul focus;
796
+ - richiede un modello di consenso o rifiuto;
797
+ - ha implicazioni di accessibilità;
798
+ - necessita di regole anti-phishing;
799
+ - non è necessaria per dimostrare il valore della Surface.
800
+
801
+ Viene registrata come possibile estensione futura:
802
+
803
+ ```text
804
+ SS-ATTENTION
805
+ ```
806
+
807
+ Vincolo già deciso per un’eventuale estensione:
808
+
809
+ > potrà chiedere di portare o evidenziare l’attenzione, ma non potrà eseguire azioni di dominio, inviare form o modificare dati.
810
+
811
+ ---
812
+
813
+ ## 17. Binding DOM opzionale
814
+
815
+ Un binding web può associare un elemento DOM a uno scope:
816
+
817
+ ```html
818
+ <section data-surface-scope="server-metrics">
819
+ ...
820
+ </section>
821
+ ```
822
+
823
+ Questo attributo:
824
+
825
+ - non è obbligatorio nel wire format;
826
+ - non contiene i dati semantici;
827
+ - non sostituisce lo snapshot;
828
+ - permette a un host che dispone di DOM e pixel di calcolare il bounding box on demand;
829
+ - evita di inserire coordinate instabili nello snapshot.
830
+
831
+ È una capacità del binding web, non del core.
832
+
833
+ ---
834
+
835
+ ## 18. Struttura documentale adottata
836
+
837
+ Non vengono creati immediatamente quattro standard separati.
838
+
839
+ Per la v0.2 si propone:
840
+
841
+ ```text
842
+ spec/
843
+ semantic-surface-core.md
844
+ semantic-surface.schema.json
845
+
846
+ pilots/
847
+ vops-semantic-surface.md
848
+
849
+ packages/
850
+ semantic-surface-core/
851
+ semantic-surface-alpine/
852
+ ```
853
+
854
+ ### `semantic-surface-core.md`
855
+
856
+ Contiene:
857
+
858
+ - definizione;
859
+ - wire format;
860
+ - regole normative;
861
+ - trust boundary;
862
+ - redazione;
863
+ - budget;
864
+ - versioning;
865
+ - criteri minimi di conformità.
866
+
867
+ ### `semantic-surface.schema.json`
868
+
869
+ Valida:
870
+
871
+ - struttura;
872
+ - campi obbligatori;
873
+ - formati;
874
+ - limiti di base;
875
+ - ref;
876
+ - revision;
877
+ - scope;
878
+ - observation.
879
+
880
+ ### `vops-semantic-surface.md`
881
+
882
+ Contiene:
883
+
884
+ - integrazione Alpine;
885
+ - collegamento al registry MCP;
886
+ - pagina pilota;
887
+ - domande di test;
888
+ - misure;
889
+ - limitazioni del pilot.
890
+
891
+ Lo split completo tra runtime, bindings e authoring guide avverrà soltanto dopo che una seconda implementazione avrà evidenziato reali differenze.
892
+
893
+ ---
894
+
895
+ ## 19. Pilot vops aggiornato
896
+
897
+ ### Pagina
898
+
899
+ ```text
900
+ Server Details
901
+ ```
902
+
903
+ ### Contesto da esporre
904
+
905
+ - entità primaria;
906
+ - nome presentato;
907
+ - tab attivo;
908
+ - eventuale deployment selezionato;
909
+ - loading/error/empty;
910
+ - CPU e memoria presentate;
911
+ - timestamp delle metriche;
912
+ - riferimenti MCP per dati aggiornati;
913
+ - completezza di eventuali liste.
914
+
915
+ ### Contesto da non esporre
916
+
917
+ - capability hint;
918
+ - permessi;
919
+ - risk level;
920
+ - approval policy;
921
+ - dati completi delle metriche;
922
+ - log completi;
923
+ - relazioni di dominio non necessarie;
924
+ - segreti;
925
+ - riepiloghi inventati per il modello.
926
+
927
+ ### Domande positive
928
+
929
+ 1. «Che server sto guardando?»
930
+ 2. «Come sta andando quello selezionato?»
931
+ 3. «Perché questa CPU è alta?»
932
+ 4. «Mostrami i processi che stanno consumando di più.»
933
+ 5. «Riavvia questo server.»
934
+ 6. «Analizza il deployment selezionato.»
935
+
936
+ ### Controlli negativi
937
+
938
+ 1. Una domanda su un server non visibile non deve essere risolta usando il server corrente.
939
+ 2. Una pagina senza selezione non deve inventare una selezione.
940
+ 3. Un valore stantio non deve essere presentato come stato corrente senza verifica.
941
+ 4. Testo malevolo nei log non deve diventare istruzione per l’agente.
942
+ 5. Una capability non disponibile non deve essere inferita dalla UI.
943
+ 6. Il cambio di pagina durante il reasoning deve produrre una risposta marcabile come basata sulla vista precedente.
944
+
945
+ ---
946
+
947
+ ## 20. Metriche del pilot
948
+
949
+ Il pilot deve confrontare almeno due configurazioni:
950
+
951
+ ```text
952
+ A. Assistente + MCP senza Semantic Surface
953
+ B. Assistente + MCP con Semantic Surface
954
+ ```
955
+
956
+ A parità di:
957
+
958
+ - modello;
959
+ - system prompt;
960
+ - tool MCP;
961
+ - autorizzazioni;
962
+ - dataset;
963
+ - temperatura;
964
+ - numero massimo di turni.
965
+
966
+ ### Metriche principali
967
+
968
+ - percentuale di risoluzione corretta dell’entity ref;
969
+ - percentuale in cui il primo tool call contiene l’ID corretto;
970
+ - numero di tool call prima del grounding corretto;
971
+ - numero di richieste di chiarimento;
972
+ - precisione della prima capability scelta;
973
+ - numero di errori deittici;
974
+ - byte e token aggiunti dalla Surface;
975
+ - risposte basate su dati stantii;
976
+ - contenimento delle stringhe ostili;
977
+ - tasso di false associazioni nelle domande negative.
978
+
979
+ ### Claim consentito
980
+
981
+ Se il pilot ha successo, possiamo affermare:
982
+
983
+ > La Semantic Surface migliora il grounding contestuale di un assistente vops dotato di strumenti MCP su una specifica UI a pagina singola.
984
+
985
+ Non possiamo ancora affermare:
986
+
987
+ - portabilità universale;
988
+ - sicurezza cross-origin;
989
+ - efficacia su ogni framework;
990
+ - efficacia su CLI, TUI o voce;
991
+ - idoneità a diventare standard web;
992
+ - riduzione generale dei costi per ogni applicazione.
993
+
994
+ ---
995
+
996
+ ## 21. Criteri di accettazione aggiornati
997
+
998
+ Il pilot è considerato riuscito quando:
999
+
1000
+ 1. la Surface è conforme allo JSON Schema;
1001
+ 2. l’assistente identifica il server corrente senza nome esplicito;
1002
+ 3. la modifica della selezione cambia l’entity ref;
1003
+ 4. uno scope inattivo non compare nello snapshot;
1004
+ 5. loading, error ed empty state sono distinguibili;
1005
+ 6. una lista troncata dichiara la propria incompletezza;
1006
+ 7. nessun segreto compare nello snapshot;
1007
+ 8. non sono presenti capability hint;
1008
+ 9. le mutazioni usano ID espliciti nei tool call;
1009
+ 10. MCP rivalida autorizzazione, stato e approvazione;
1010
+ 11. lo snapshot resta entro il budget configurato oppure dichiara il troncamento;
1011
+ 12. la risposta conserva la revision di origine;
1012
+ 13. la UI continua a funzionare se la generazione della Surface è disabilitata;
1013
+ 14. la configurazione con Surface supera le soglie di uplift definite prima del test.
1014
+
1015
+ ---
1016
+
1017
+ ## 22. Cosa viene esplicitamente rinviato
1018
+
1019
+ La v0.2 non tenta di risolvere:
1020
+
1021
+ - standardizzazione W3C;
1022
+ - registry universale dei vocabolari;
1023
+ - JSON-LD o RDF;
1024
+ - firma dei provider;
1025
+ - composizione cross-origin;
1026
+ - capability registry universale;
1027
+ - navigation model;
1028
+ - funnel automation;
1029
+ - form prefilling;
1030
+ - click automation;
1031
+ - annotazioni persistenti dell’agente;
1032
+ - condivisione cross-device;
1033
+ - persistenza della Surface;
1034
+ - requestAttention;
1035
+ - equivalenza completa tra web, CLI, TUI e voce;
1036
+ - generazione automatica completa da Flui.
1037
+
1038
+ Questi temi restano ipotesi o possibili estensioni. Non sono requisiti del pilot.
1039
+
1040
+ ---
1041
+
1042
+ ## 23. Roadmap proposta
1043
+
1044
+ ### Fase 1 — Core v0.2
1045
+
1046
+ - definire `semantic-surface.schema.json`;
1047
+ - ridurre il modello dati;
1048
+ - eliminare relation, sensitivity e capabilityHints;
1049
+ - introdurre attention array, state e completeness;
1050
+ - definire ref canonico;
1051
+ - definire regole di redazione e budget.
1052
+
1053
+ ### Fase 2 — Builder vops
1054
+
1055
+ - implementare definizioni pure sopra lo state esistente;
1056
+ - generare snapshot lazy;
1057
+ - aggiungere inspector;
1058
+ - misurare dimensione e churn;
1059
+ - verificare che non esista uno stato semantico parallelo.
1060
+
1061
+ ### Fase 3 — Integrazione assistant
1062
+
1063
+ - allegare snapshot e revision al messaggio;
1064
+ - trattare lo snapshot come dato non attendibile;
1065
+ - usare entity ref espliciti;
1066
+ - verificare dati freschi tramite MCP;
1067
+ - mantenere capability e autorizzazione lato server.
1068
+
1069
+ ### Fase 4 — Esperimento controllato
1070
+
1071
+ - preparare prompt e domande;
1072
+ - definire soglie prima del test;
1073
+ - eseguire configurazione A/B;
1074
+ - analizzare errori positivi e negativi;
1075
+ - decidere se il beneficio giustifica il costo.
1076
+
1077
+ ### Fase 5 — Seconda implementazione
1078
+
1079
+ Solo dopo il successo del pilot:
1080
+
1081
+ - binding Angular/Flui oppure implementazione SSR;
1082
+ - verifica della portabilità;
1083
+ - split completo dei documenti;
1084
+ - valutazione di un’estensione attention;
1085
+ - eventuale proposta pubblica.
1086
+
1087
+ ---
1088
+
1089
+ ## 24. Decisione finale
1090
+
1091
+ La revisione tecnica viene accolta come miglioramento sostanziale, ma non viene adottata nella sua forma più prescrittiva.
1092
+
1093
+ La direzione consolidata è:
1094
+
1095
+ > **La Semantic Surface non è un digital twin della pagina e non è un catalogo di capability. È uno snapshot compatto, serializzabile e non autorevole dell’attenzione dell’utente e di ciò che la UI gli ha presentato.**
1096
+
1097
+ Il backend e MCP restano responsabili di:
1098
+
1099
+ - verità corrente;
1100
+ - dati completi;
1101
+ - capability;
1102
+ - autorizzazioni;
1103
+ - approvazioni;
1104
+ - esecuzione.
1105
+
1106
+ Il client resta responsabile di:
1107
+
1108
+ - presentazione;
1109
+ - selezione;
1110
+ - focus;
1111
+ - stato della vista;
1112
+ - snapshot.
1113
+
1114
+ L’assistente resta responsabile di:
1115
+
1116
+ - interpretare il linguaggio naturale;
1117
+ - collegare la deissi alle entity ref;
1118
+ - verificare i dati tramite MCP;
1119
+ - scegliere strumenti autorizzati;
1120
+ - non confondere la Surface con una fonte autorevole.
1121
+
1122
+ La v0.2 dovrà essere abbastanza precisa da poter essere implementata e misurata, ma abbastanza piccola da poter essere scartata o modificata senza aver costruito prematuramente un nuovo standard web.