@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.
- package/LICENSE +202 -0
- package/README.md +106 -0
- package/docs/agent-surface/semantic-surface-core-v0.2.md +911 -0
- package/docs/agent-surface/semantic-surface-response-to-review-v0.2.md +1122 -0
- package/docs/agent-surface/semantic-surface.schema.json +257 -0
- package/lib/agent-surface/index.d.ts +8 -0
- package/lib/agent-surface/index.js +18 -0
- package/lib/agent-surface/semantic-surface.schema.json +257 -0
- package/lib/agent-surface/surface-digest.d.ts +47 -0
- package/lib/agent-surface/surface-digest.js +231 -0
- package/lib/agent-surface/surface-semantics.d.ts +30 -0
- package/lib/agent-surface/surface-semantics.js +137 -0
- package/lib/agent-surface/surface-validate.d.ts +29 -0
- package/lib/agent-surface/surface-validate.js +122 -0
- package/lib/agent-surface/surface.types.d.ts +86 -0
- package/lib/agent-surface/surface.types.js +16 -0
- package/package.json +49 -0
|
@@ -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.
|