@vascend/talos 0.1.0 → 0.1.1

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.
Files changed (66) hide show
  1. package/README.md +7 -3
  2. package/dist/backend/asset-events.js +9 -9
  3. package/dist/core/agent.js +3 -3
  4. package/dist/core/cli-args.js +50 -50
  5. package/dist/core/cli-installation.d.ts +4 -0
  6. package/dist/core/cli-installation.js +55 -0
  7. package/dist/core/compaction.js +26 -26
  8. package/dist/core/config.js +101 -101
  9. package/dist/core/execution-guidance.js +21 -21
  10. package/dist/core/package-update.d.ts +3 -1
  11. package/dist/core/package-update.js +19 -6
  12. package/dist/core/self-update.d.ts +1 -1
  13. package/dist/core/signed-release.d.ts +33 -0
  14. package/dist/core/signed-release.js +121 -0
  15. package/dist/core/update-check.d.ts +1 -1
  16. package/dist/core/update-check.js +15 -14
  17. package/dist/core/vibe-modes.js +13 -13
  18. package/dist/distribution/install.d.ts +1 -0
  19. package/dist/distribution/install.js +31 -0
  20. package/dist/install.mjs +271 -0
  21. package/dist/node-runtime.json +13 -0
  22. package/dist/providers/oauth-callback-server.js +32 -32
  23. package/dist/tools/capabilities.js +30 -30
  24. package/dist/tools/computer-capture.js +50 -50
  25. package/dist/tools/program.js +82 -82
  26. package/dist/tui/i18n-catalog.js +16 -0
  27. package/dist/tui/quick-help.js +31 -31
  28. package/dist/tui/repl.js +5 -5
  29. package/dist/tui/update-prompt.js +1 -0
  30. package/dist/vascend/code-events.js +9 -9
  31. package/dist/vascend/completeness.js +31 -31
  32. package/dist/vascend/context-fabric.js +16 -16
  33. package/dist/vascend/contract-memory.js +30 -30
  34. package/dist/vascend/council.js +82 -82
  35. package/dist/vascend/decision-promotion.js +23 -23
  36. package/dist/vascend/granular-kingdom.js +17 -17
  37. package/dist/vascend/granular-launcher.js +2 -2
  38. package/dist/vascend/kingdom-kpi.js +19 -19
  39. package/dist/vascend/kingdom-run.js +6 -6
  40. package/dist/vascend/kingdom.js +56 -56
  41. package/dist/vascend/mandate.js +21 -21
  42. package/dist/vascend/objective-revision.js +34 -34
  43. package/dist/vascend/patch-plan.js +22 -22
  44. package/dist/vascend/requirements.js +29 -29
  45. package/dist/vascend/reviewer.js +26 -26
  46. package/dist/vascend/room-memory.js +25 -25
  47. package/dist/vascend/runtime.js +44 -44
  48. package/dist/vascend/self-improve.js +39 -39
  49. package/dist/vascend/test-failure-memory.js +9 -9
  50. package/dist/vascend/vision.js +18 -18
  51. package/dist/vendor/computer-use/README.md +7 -7
  52. package/dist/vendor/computer-use/computer-desktop.js +211 -211
  53. package/dist/vendor/computer-use/computer-observe.js +315 -315
  54. package/dist/vendor/computer-use/computer-scripts.js +1230 -1230
  55. package/dist/vendor/computer-use/computer-tools.js +2136 -2136
  56. package/dist/vendor/computer-use/package.json +1 -1
  57. package/dist/vendor/computer-use/rac/atomic-input.js +91 -91
  58. package/dist/vendor/computer-use/rac/grammatica.js +101 -101
  59. package/dist/vendor/computer-use/rac/parser.js +185 -185
  60. package/dist/vendor/computer-use/rac/protocol.js +136 -136
  61. package/install.ps1 +374 -30
  62. package/install.sh +356 -43
  63. package/package.json +2 -2
  64. package/dist/core/kingdoms-mode-state.d.ts +0 -24
  65. package/dist/core/kingdoms-mode-state.js +0 -139
  66. package/dist/text-sanitize.js +0 -28
@@ -7,22 +7,22 @@ export function completenessRounds(env) {
7
7
  const n = Number(env["TALOS_COMPLETENESS_ROUNDS"]);
8
8
  return Number.isInteger(n) && n >= 0 ? n : 2;
9
9
  }
10
- const CRITIC_SYSTEM = `# Critico di completezza
11
- INDICE
12
- 1 = goal
13
- 2 = consegna
14
- 3 = mancante
15
-
16
- DEFINIZIONI
17
- @goal[reale]: l'obiettivo VERO dell'utente, non il piano svolto
18
- @consegna[criterio]: completa = funzionante e utilizzabile come chiesto (es. una SaaS: dati, auth, CRUD, UI, flussi base)
19
- @mancante[regola]: elenca SOLO pezzi ESSENZIALI assenti; niente perfezionismo, niente nice-to-have
20
- @rigore[bilancia]: se la consegna soddisfa il goal nella sostanza, complete=true
21
-
22
- RELAZIONI
23
- @R1: @goal[reale] -> @consegna[criterio] [ misura la consegna sul goal vero ]
24
- @R2: @consegna[criterio] -> @mancante[regola] [ elenca solo l'essenziale assente ]
25
-
10
+ const CRITIC_SYSTEM = `# Critico di completezza
11
+ INDICE
12
+ 1 = goal
13
+ 2 = consegna
14
+ 3 = mancante
15
+
16
+ DEFINIZIONI
17
+ @goal[reale]: l'obiettivo VERO dell'utente, non il piano svolto
18
+ @consegna[criterio]: completa = funzionante e utilizzabile come chiesto (es. una SaaS: dati, auth, CRUD, UI, flussi base)
19
+ @mancante[regola]: elenca SOLO pezzi ESSENZIALI assenti; niente perfezionismo, niente nice-to-have
20
+ @rigore[bilancia]: se la consegna soddisfa il goal nella sostanza, complete=true
21
+
22
+ RELAZIONI
23
+ @R1: @goal[reale] -> @consegna[criterio] [ misura la consegna sul goal vero ]
24
+ @R2: @consegna[criterio] -> @mancante[regola] [ elenca solo l'essenziale assente ]
25
+
26
26
  OUTPUT: SOLO JSON {"complete": bool, "missing": [stringhe brevi]}. Niente prosa, niente markdown.`;
27
27
  export async function judgeCompleteness(opts) {
28
28
  const { harness, goal, evidence, signal } = opts;
@@ -71,20 +71,20 @@ function unknownVerdict(reason) {
71
71
  }
72
72
  // Steer in notazione Danilov per far continuare l'agente sui pezzi mancanti.
73
73
  export function buildCompletenessSteer(goal, missing) {
74
- return `[VASCEND_COMPLETEZZA]
75
- INDICE
76
- 1 = goal
77
- 2 = mancante
78
- 3 = azione
79
-
80
- DEFINIZIONI
81
- @goal[reale]: "${goal.replace(/"/g, "'").slice(0, 200)}"
82
- @mancante[pezzi]: ${missing.map((m, i) => `(${i + 1}) ${m}`).join(" ; ")}
83
- @azione[continua]: NON ti fermi al piano gia' fatto; il goal non e' "ho creato i gruppi" ma "ho consegnato la cosa completa"
84
-
85
- RELAZIONI
86
- @R1: @mancante[pezzi] -> @azione[continua] [ pianifica e COSTRUISCI i pezzi mancanti ]
87
- @R2: @azione[continua] -> @goal[reale] [ finche' la consegna soddisfa il goal vero ]
88
-
74
+ return `[VASCEND_COMPLETEZZA]
75
+ INDICE
76
+ 1 = goal
77
+ 2 = mancante
78
+ 3 = azione
79
+
80
+ DEFINIZIONI
81
+ @goal[reale]: "${goal.replace(/"/g, "'").slice(0, 200)}"
82
+ @mancante[pezzi]: ${missing.map((m, i) => `(${i + 1}) ${m}`).join(" ; ")}
83
+ @azione[continua]: NON ti fermi al piano gia' fatto; il goal non e' "ho creato i gruppi" ma "ho consegnato la cosa completa"
84
+
85
+ RELAZIONI
86
+ @R1: @mancante[pezzi] -> @azione[continua] [ pianifica e COSTRUISCI i pezzi mancanti ]
87
+ @R2: @azione[continua] -> @goal[reale] [ finche' la consegna soddisfa il goal vero ]
88
+
89
89
  OUTPUT: crea altri gruppi/attivita e realizza i pezzi mancanti elencati, poi illuminali. Vai fino a una consegna completa e funzionante, non fermarti al primo piano.`;
90
90
  }
@@ -365,22 +365,22 @@ function buildRetrievalQuery(userText, mission, focusTerms) {
365
365
  function renderFabricBlock(frame, inherited) {
366
366
  const pins = frame.leases.filter((lease) => lease.source === "pinned").map((lease) => lease.term);
367
367
  const working = frame.leases.filter((lease) => lease.source !== "pinned").slice(0, 20).map((lease) => lease.term);
368
- return `[CONTEXT_FABRIC]
369
- INDICE
370
- 1 = epoch
371
- 2 = control_lane
372
- 3 = working_lane
373
- 4 = evidence_lane
374
- 5 = quarantine_lane
375
-
376
- DEFINIZIONI
377
- @epoch[${frame.epoch}]: missione="${escapeValue(frame.mission)}", owner=${safeName(frame.owner)}, inherited=${inherited}
378
- @lane[control]: mode=${frame.activeMode}, pin="${escapeValue(pins.join(", ") || "nessuno")}"
379
- @lane[working]: focus="${escapeValue(working.join(", ") || "nessuno")}"
380
- @lane[evidence]: accetta fatti passati solo se presenti negli evidence slot o recuperati con recall
381
- @lane[quarantine]: epoch precedenti e lease scadute restano fuori dal prompt vivo; sono solo handle richiamabili
382
- @lease[regola]: turn=scade, mission=dura_per_epoch, pinned=non_scade
383
-
368
+ return `[CONTEXT_FABRIC]
369
+ INDICE
370
+ 1 = epoch
371
+ 2 = control_lane
372
+ 3 = working_lane
373
+ 4 = evidence_lane
374
+ 5 = quarantine_lane
375
+
376
+ DEFINIZIONI
377
+ @epoch[${frame.epoch}]: missione="${escapeValue(frame.mission)}", owner=${safeName(frame.owner)}, inherited=${inherited}
378
+ @lane[control]: mode=${frame.activeMode}, pin="${escapeValue(pins.join(", ") || "nessuno")}"
379
+ @lane[working]: focus="${escapeValue(working.join(", ") || "nessuno")}"
380
+ @lane[evidence]: accetta fatti passati solo se presenti negli evidence slot o recuperati con recall
381
+ @lane[quarantine]: epoch precedenti e lease scadute restano fuori dal prompt vivo; sono solo handle richiamabili
382
+ @lease[regola]: turn=scade, mission=dura_per_epoch, pinned=non_scade
383
+
384
384
  OUTPUT: continua la missione dell'epoch; non sostituirla con un follow-up deittico come 'continua'.`;
385
385
  }
386
386
  function extractRawUserText(value) {
@@ -195,30 +195,30 @@ export function contractToRoomRecord(ev) {
195
195
  const callsites = ev.callsites.length ? ev.callsites.map((c) => esc(c)).join(", ") : "(nessuno indicato)";
196
196
  const tests = ev.testsRequired.length ? ev.testsRequired.map((t) => esc(t)).join(", ") : "(nessuno indicato)";
197
197
  const docs = ev.docsToUpdate.length ? ev.docsToUpdate.map((d) => esc(d)).join(", ") : "(nessuna indicata)";
198
- const body = `INDICE
199
- 1 = symbol
200
- 2 = before
201
- 3 = after
202
- 4 = callsite_impattati
203
- 5 = test_richiesti
204
- 6 = docs_da_aggiornare
205
-
206
- DEFINIZIONI
207
- @contract.changed[${ev.id}]: domain=contracts, kind=${ev.kind}
208
- @symbol[${ev.id}]: "${esc(ev.symbol)}"
209
- @before[${ev.id}]: "${esc(ev.before) || "(non espresso)"}"
210
- @after[${ev.id}]: "${esc(ev.after) || "(non espresso)"}"
211
- @callsites[${ev.id}]: ${callsites}
212
- @testsRequired[${ev.id}]: ${tests}
213
- @docsToUpdate[${ev.id}]: ${docs}
214
- @context[${ev.id}]: "${esc(ev.context)}"
215
- @task[${ev.id}]: ${ev.task ? esc(ev.task) : "(nessuno)"}
216
- @source[${ev.id}]: ${ev.source}
217
-
218
- RELAZIONI
219
- @R1: ${ev.id} -> contract.changed [ dominio contracts, ${ev.kind}${ev.task ? `, task ${esc(ev.task)}` : ""} ]
220
- ${ev.callsites.map((c, i) => `@R2.${i + 1}: ${ev.id} -> ${esc(c)} [ callsite da rivedere ]`).join("\n") || `@R2: ${ev.id} -> nessun_callsite [ verificare manualmente i chiamanti ]`}
221
-
198
+ const body = `INDICE
199
+ 1 = symbol
200
+ 2 = before
201
+ 3 = after
202
+ 4 = callsite_impattati
203
+ 5 = test_richiesti
204
+ 6 = docs_da_aggiornare
205
+
206
+ DEFINIZIONI
207
+ @contract.changed[${ev.id}]: domain=contracts, kind=${ev.kind}
208
+ @symbol[${ev.id}]: "${esc(ev.symbol)}"
209
+ @before[${ev.id}]: "${esc(ev.before) || "(non espresso)"}"
210
+ @after[${ev.id}]: "${esc(ev.after) || "(non espresso)"}"
211
+ @callsites[${ev.id}]: ${callsites}
212
+ @testsRequired[${ev.id}]: ${tests}
213
+ @docsToUpdate[${ev.id}]: ${docs}
214
+ @context[${ev.id}]: "${esc(ev.context)}"
215
+ @task[${ev.id}]: ${ev.task ? esc(ev.task) : "(nessuno)"}
216
+ @source[${ev.id}]: ${ev.source}
217
+
218
+ RELAZIONI
219
+ @R1: ${ev.id} -> contract.changed [ dominio contracts, ${ev.kind}${ev.task ? `, task ${esc(ev.task)}` : ""} ]
220
+ ${ev.callsites.map((c, i) => `@R2.${i + 1}: ${ev.id} -> ${esc(c)} [ callsite da rivedere ]`).join("\n") || `@R2: ${ev.id} -> nessun_callsite [ verificare manualmente i chiamanti ]`}
221
+
222
222
  OUTPUT: ${esc(ev.summary)}`;
223
223
  return {
224
224
  room: ev.id,
@@ -340,12 +340,12 @@ export class ContractStore {
340
340
  return `@contract[${e.id}]: "${esc(e.summary)}"${e.task ? ` · task=${esc(e.task)}` : ""}${cs}`;
341
341
  })
342
342
  .join("\n");
343
- return `INDICE_CONTRATTI (dominio contracts, piano di lavoro)
344
- Cambi di API/firma promossi automaticamente. Richiamabili col tool "recall"
345
- (per query o per id CT<n>) per non dimenticare callsite, test e docs.
346
-
347
- ${rows}
348
-
343
+ return `INDICE_CONTRATTI (dominio contracts, piano di lavoro)
344
+ Cambi di API/firma promossi automaticamente. Richiamabili col tool "recall"
345
+ (per query o per id CT<n>) per non dimenticare callsite, test e docs.
346
+
347
+ ${rows}
348
+
349
349
  OUTPUT: indice contratti; dettaglio (callsite/test/docs) via recall.`;
350
350
  }
351
351
  }
@@ -9,22 +9,22 @@ const EVAL_COMPLETENESS = {
9
9
  axis: "completeness",
10
10
  title: "Valutatore completezza",
11
11
  weight: 1,
12
- system: `# Valutatore del concilio — asse COMPLETEZZA
13
- INDICE
14
- 1 = goal
15
- 2 = consegna
16
- 3 = lacuna
17
-
18
- DEFINIZIONI
19
- @goal[reale]: l'obiettivo VERO dell'utente, non il piano svolto
20
- @consegna[criterio]: completa = tutti i pezzi essenziali presenti e funzionanti (dati, flussi, UI, integrazioni richieste)
21
- @lacuna[regola]: elenca SOLO pezzi ESSENZIALI assenti; niente nice-to-have
22
- @score[scala]: 100=tutto consegnato, 0=nulla di sostanziale; misura la copertura del goal
23
-
24
- RELAZIONI
25
- @R1: @goal[reale] -> @consegna[criterio] [ misura la consegna sul goal vero ]
26
- @R2: @consegna[criterio] -> @lacuna[regola] [ approve=false se manca l'essenziale ]
27
-
12
+ system: `# Valutatore del concilio — asse COMPLETEZZA
13
+ INDICE
14
+ 1 = goal
15
+ 2 = consegna
16
+ 3 = lacuna
17
+
18
+ DEFINIZIONI
19
+ @goal[reale]: l'obiettivo VERO dell'utente, non il piano svolto
20
+ @consegna[criterio]: completa = tutti i pezzi essenziali presenti e funzionanti (dati, flussi, UI, integrazioni richieste)
21
+ @lacuna[regola]: elenca SOLO pezzi ESSENZIALI assenti; niente nice-to-have
22
+ @score[scala]: 100=tutto consegnato, 0=nulla di sostanziale; misura la copertura del goal
23
+
24
+ RELAZIONI
25
+ @R1: @goal[reale] -> @consegna[criterio] [ misura la consegna sul goal vero ]
26
+ @R2: @consegna[criterio] -> @lacuna[regola] [ approve=false se manca l'essenziale ]
27
+
28
28
  ${VERDICT_SCHEMA}`,
29
29
  };
30
30
  const EVAL_CORRECTNESS = {
@@ -32,22 +32,22 @@ const EVAL_CORRECTNESS = {
32
32
  axis: "correctness",
33
33
  title: "Valutatore correttezza",
34
34
  weight: 1,
35
- system: `# Valutatore del concilio — asse CORRETTEZZA
36
- INDICE
37
- 1 = comportamento
38
- 2 = errori
39
- 3 = rischio
40
-
41
- DEFINIZIONI
42
- @comportamento[atteso]: l'operato fa cio' che il goal richiede senza rotture evidenti
43
- @errori[segnali]: bug logici, regressioni, casi limite ignorati, contratti violati
44
- @rischio[regola]: approve=false se ci sono difetti che rompono il flusso principale
45
- @score[scala]: 100=corretto e robusto, 0=non funziona; penalizza i bug sul percorso critico
46
-
47
- RELAZIONI
48
- @R1: @comportamento[atteso] -> @errori[segnali] [ cerca difetti sul percorso critico ]
49
- @R2: @errori[segnali] -> @rischio[regola] [ i difetti gravi abbassano score e approve ]
50
-
35
+ system: `# Valutatore del concilio — asse CORRETTEZZA
36
+ INDICE
37
+ 1 = comportamento
38
+ 2 = errori
39
+ 3 = rischio
40
+
41
+ DEFINIZIONI
42
+ @comportamento[atteso]: l'operato fa cio' che il goal richiede senza rotture evidenti
43
+ @errori[segnali]: bug logici, regressioni, casi limite ignorati, contratti violati
44
+ @rischio[regola]: approve=false se ci sono difetti che rompono il flusso principale
45
+ @score[scala]: 100=corretto e robusto, 0=non funziona; penalizza i bug sul percorso critico
46
+
47
+ RELAZIONI
48
+ @R1: @comportamento[atteso] -> @errori[segnali] [ cerca difetti sul percorso critico ]
49
+ @R2: @errori[segnali] -> @rischio[regola] [ i difetti gravi abbassano score e approve ]
50
+
51
51
  ${VERDICT_SCHEMA}`,
52
52
  };
53
53
  const EVAL_QUALITY = {
@@ -55,22 +55,22 @@ const EVAL_QUALITY = {
55
55
  axis: "quality",
56
56
  title: "Valutatore qualita' e test",
57
57
  weight: 1,
58
- system: `# Valutatore del concilio — asse QUALITA'/TEST
59
- INDICE
60
- 1 = qualita
61
- 2 = test
62
- 3 = manutenibilita
63
-
64
- DEFINIZIONI
65
- @qualita[criterio]: codice coeso, convenzioni del progetto rispettate, niente duplicazione inutile
66
- @test[criterio]: i percorsi importanti hanno verifica (test o prova esplicita); assente = lacuna
67
- @manutenibilita[regola]: approve=false solo se la qualita' compromette l'uso o la tenuta del lavoro
68
- @score[scala]: 100=pulito e verificato, 0=fragile e non testato; non essere perfezionista
69
-
70
- RELAZIONI
71
- @R1: @qualita[criterio] -> @test[criterio] [ qualita' include la verifica ]
72
- @R2: @test[criterio] -> @manutenibilita[regola] [ pesa l'impatto reale, non l'estetica ]
73
-
58
+ system: `# Valutatore del concilio — asse QUALITA'/TEST
59
+ INDICE
60
+ 1 = qualita
61
+ 2 = test
62
+ 3 = manutenibilita
63
+
64
+ DEFINIZIONI
65
+ @qualita[criterio]: codice coeso, convenzioni del progetto rispettate, niente duplicazione inutile
66
+ @test[criterio]: i percorsi importanti hanno verifica (test o prova esplicita); assente = lacuna
67
+ @manutenibilita[regola]: approve=false solo se la qualita' compromette l'uso o la tenuta del lavoro
68
+ @score[scala]: 100=pulito e verificato, 0=fragile e non testato; non essere perfezionista
69
+
70
+ RELAZIONI
71
+ @R1: @qualita[criterio] -> @test[criterio] [ qualita' include la verifica ]
72
+ @R2: @test[criterio] -> @manutenibilita[regola] [ pesa l'impatto reale, non l'estetica ]
73
+
74
74
  ${VERDICT_SCHEMA}`,
75
75
  };
76
76
  const EVAL_REQUIREMENTS = {
@@ -78,22 +78,22 @@ const EVAL_REQUIREMENTS = {
78
78
  axis: "requirements",
79
79
  title: "Valutatore allineamento requisiti",
80
80
  weight: 1,
81
- system: `# Valutatore del concilio — asse REQUISITI
82
- INDICE
83
- 1 = requisiti
84
- 2 = copertura
85
- 3 = deriva
86
-
87
- DEFINIZIONI
88
- @requisiti[fonte]: i requisiti espliciti/impliciti del goal (e quelli estratti, se forniti)
89
- @copertura[criterio]: ogni requisito ha una risposta nell'operato; mappa requisito->evidenza
90
- @deriva[regola]: approve=false se requisiti chiave restano scoperti o l'operato devia dal richiesto
91
- @score[scala]: 100=tutti i requisiti coperti, 0=fuori tema; misura l'aderenza al richiesto
92
-
93
- RELAZIONI
94
- @R1: @requisiti[fonte] -> @copertura[criterio] [ confronta operato e requisiti ]
95
- @R2: @copertura[criterio] -> @deriva[regola] [ requisiti chiave scoperti = no approve ]
96
-
81
+ system: `# Valutatore del concilio — asse REQUISITI
82
+ INDICE
83
+ 1 = requisiti
84
+ 2 = copertura
85
+ 3 = deriva
86
+
87
+ DEFINIZIONI
88
+ @requisiti[fonte]: i requisiti espliciti/impliciti del goal (e quelli estratti, se forniti)
89
+ @copertura[criterio]: ogni requisito ha una risposta nell'operato; mappa requisito->evidenza
90
+ @deriva[regola]: approve=false se requisiti chiave restano scoperti o l'operato devia dal richiesto
91
+ @score[scala]: 100=tutti i requisiti coperti, 0=fuori tema; misura l'aderenza al richiesto
92
+
93
+ RELAZIONI
94
+ @R1: @requisiti[fonte] -> @copertura[criterio] [ confronta operato e requisiti ]
95
+ @R2: @copertura[criterio] -> @deriva[regola] [ requisiti chiave scoperti = no approve ]
96
+
97
97
  ${VERDICT_SCHEMA}`,
98
98
  };
99
99
  // Registro dei valutatori disponibili, per asse.
@@ -185,24 +185,24 @@ export function buildCouncilSteer(goal, verdict) {
185
185
  .map((v) => `@asse[${v.axis}]: score=${v.score}/100, motivo="${v.rationale.replace(/"/g, "'").slice(0, 160)}"`)
186
186
  .join("\n");
187
187
  const gapRows = verdict.gaps.map((g, i) => `(${i + 1}) ${g}`).join(" ; ");
188
- return `[VASCEND_CONCILIO]
189
- INDICE
190
- 1 = goal
191
- 2 = verdetto
192
- 3 = dissenso
193
- 4 = azione
194
-
195
- DEFINIZIONI
196
- @goal[reale]: "${goal.replace(/"/g, "'").slice(0, 200)}"
197
- @verdetto[grado]: completamento=${verdict.completion}/100, consenso=${verdict.consensus.approve}/${verdict.consensus.total}
198
- ${dissentRows || "@dissenso[nessuno]: tutti gli assi approvano tranne la soglia"}
199
- @mancante[pezzi]: ${gapRows || "nessuna lacuna esplicita: alza il grado sugli assi in dissenso"}
200
- @azione[continua]: chiudi i dissensi degli assi e copri le lacune, poi il concilio rivota
201
-
202
- RELAZIONI
203
- @R1: @dissenso[assi] -> @azione[continua] [ risolvi prima gli assi che non approvano ]
204
- @R2: @mancante[pezzi] -> @goal[reale] [ copri le lacune finche' il concilio approva ]
205
-
188
+ return `[VASCEND_CONCILIO]
189
+ INDICE
190
+ 1 = goal
191
+ 2 = verdetto
192
+ 3 = dissenso
193
+ 4 = azione
194
+
195
+ DEFINIZIONI
196
+ @goal[reale]: "${goal.replace(/"/g, "'").slice(0, 200)}"
197
+ @verdetto[grado]: completamento=${verdict.completion}/100, consenso=${verdict.consensus.approve}/${verdict.consensus.total}
198
+ ${dissentRows || "@dissenso[nessuno]: tutti gli assi approvano tranne la soglia"}
199
+ @mancante[pezzi]: ${gapRows || "nessuna lacuna esplicita: alza il grado sugli assi in dissenso"}
200
+ @azione[continua]: chiudi i dissensi degli assi e copri le lacune, poi il concilio rivota
201
+
202
+ RELAZIONI
203
+ @R1: @dissenso[assi] -> @azione[continua] [ risolvi prima gli assi che non approvano ]
204
+ @R2: @mancante[pezzi] -> @goal[reale] [ copri le lacune finche' il concilio approva ]
205
+
206
206
  OUTPUT: lavora sui pezzi mancanti e sui dissensi elencati, poi completa le attivita. Il concilio rivaluta: punta ad approvazione (grado alto e zero dissensi).`;
207
207
  }
208
208
  // ---------------------------------------------------------------------------
@@ -145,23 +145,23 @@ function toEvent(match, id, task, now) {
145
145
  // e "decisione" per renderlo facile da cercare.
146
146
  export function decisionToRoomRecord(ev) {
147
147
  const terms = decisionTerms(ev);
148
- const body = `INDICE
149
- 1 = decisione
150
- 2 = motivazione
151
- 3 = contesto
152
- 4 = task
153
-
154
- DEFINIZIONI
155
- @decision.made[${ev.id}]: domain=decisions
156
- @decision[${ev.id}]: "${esc(ev.decision)}"
157
- @reason[${ev.id}]: "${esc(ev.reason) || "(non espressa)"}"
158
- @context[${ev.id}]: "${esc(ev.context)}"
159
- @task[${ev.id}]: ${ev.task ? esc(ev.task) : "(nessuno)"}
160
- @source[${ev.id}]: ${ev.source}
161
-
162
- RELAZIONI
163
- @R: ${ev.id} -> decision.made [ dominio decisions${ev.task ? `, task ${esc(ev.task)}` : ""} ]
164
-
148
+ const body = `INDICE
149
+ 1 = decisione
150
+ 2 = motivazione
151
+ 3 = contesto
152
+ 4 = task
153
+
154
+ DEFINIZIONI
155
+ @decision.made[${ev.id}]: domain=decisions
156
+ @decision[${ev.id}]: "${esc(ev.decision)}"
157
+ @reason[${ev.id}]: "${esc(ev.reason) || "(non espressa)"}"
158
+ @context[${ev.id}]: "${esc(ev.context)}"
159
+ @task[${ev.id}]: ${ev.task ? esc(ev.task) : "(nessuno)"}
160
+ @source[${ev.id}]: ${ev.source}
161
+
162
+ RELAZIONI
163
+ @R: ${ev.id} -> decision.made [ dominio decisions${ev.task ? `, task ${esc(ev.task)}` : ""} ]
164
+
165
165
  OUTPUT: ${esc(ev.summary)}`;
166
166
  return {
167
167
  room: ev.id,
@@ -321,12 +321,12 @@ export class DecisionStore {
321
321
  const rows = this.events
322
322
  .map((e) => `@decision[${e.id}]: "${esc(e.summary)}"${e.task ? ` · task=${esc(e.task)}` : ""}`)
323
323
  .join("\n");
324
- return `INDICE_DECISIONI (dominio decisions, piano di lavoro)
325
- Decisioni promosse automaticamente dalle conversazioni. Richiamabili col tool
326
- "recall" (per query o per id D<n>).
327
-
328
- ${rows}
329
-
324
+ return `INDICE_DECISIONI (dominio decisions, piano di lavoro)
325
+ Decisioni promosse automaticamente dalle conversazioni. Richiamabili col tool
326
+ "recall" (per query o per id D<n>).
327
+
328
+ ${rows}
329
+
330
330
  OUTPUT: indice decisioni; dettaglio via recall.`;
331
331
  }
332
332
  }
@@ -87,23 +87,23 @@ function markRule(unit, castle) {
87
87
  // del castello: una sola unita', niente sotto-scomposizione, resta nel confine.
88
88
  function unitSteer(unit, peers, castle) {
89
89
  const others = peers.filter((p) => p !== unit.id);
90
- return `[UNITA' ${unit.id}]
91
- INDICE
92
- 1 = ruolo
93
- 2 = dipendenze
94
- 3 = confine
95
-
96
- DEFINIZIONI
97
- @ruolo[unita]: id=${unit.id}, granularita=fine, peer=[${others.join(", ") || "nessuno"}]
98
- @dipendenze[done]: ${(unit.deps ?? []).join(", ") || "nessuna (gia' soddisfatte: parti subito)"}
99
- @confine[regola]: esegui SOLO questa unita', NON scomporla ulteriormente, NON toccare il lavoro delle altre unita'${markRule(unit, castle)}
100
-
101
- RELAZIONI
102
- @R1: @ruolo[unita] -> @confine[regola] [ una sola unita', niente sovrapposizioni ]
103
-
104
- OUTPUT: esegui l'unita' e basta; le dipendenze sono gia' completate.
105
-
106
- OBIETTIVO_UNITA'
90
+ return `[UNITA' ${unit.id}]
91
+ INDICE
92
+ 1 = ruolo
93
+ 2 = dipendenze
94
+ 3 = confine
95
+
96
+ DEFINIZIONI
97
+ @ruolo[unita]: id=${unit.id}, granularita=fine, peer=[${others.join(", ") || "nessuno"}]
98
+ @dipendenze[done]: ${(unit.deps ?? []).join(", ") || "nessuna (gia' soddisfatte: parti subito)"}
99
+ @confine[regola]: esegui SOLO questa unita', NON scomporla ulteriormente, NON toccare il lavoro delle altre unita'${markRule(unit, castle)}
100
+
101
+ RELAZIONI
102
+ @R1: @ruolo[unita] -> @confine[regola] [ una sola unita', niente sovrapposizioni ]
103
+
104
+ OUTPUT: esegui l'unita' e basta; le dipendenze sono gia' completate.
105
+
106
+ OBIETTIVO_UNITA'
107
107
  `;
108
108
  }
109
109
  // Costruisce il TaskRunner che esegue una unita' come sessione di agente.
@@ -196,7 +196,7 @@ export function formatGranularReport(report) {
196
196
  const rows = report.results
197
197
  .map((r) => `@unit[${r.id}]: ${mark[r.status]} ${r.status}${r.error ? ` · errore: ${r.error}` : ""}${r.blockedBy?.length ? ` · bloccata da ${r.blockedBy.join(", ")}` : ""}`)
198
198
  .join("\n");
199
- return `[GRANULAR_LAUNCH]
200
- @esito[totale]: ${report.done} done · ${report.failed} failed · ${report.skipped} skipped${report.ok ? " · OK" : ""}
199
+ return `[GRANULAR_LAUNCH]
200
+ @esito[totale]: ${report.done} done · ${report.failed} failed · ${report.skipped} skipped${report.ok ? " · OK" : ""}
201
201
  ${rows}`;
202
202
  }
@@ -135,25 +135,25 @@ export function buildKingdomImproveSteer(goal, verdict) {
135
135
  const execGap = kpi.failed > 0 || kpi.mergeConflicts > 0 || kpi.emptyVassals > 0
136
136
  ? `collaboratori falliti=${kpi.failed}, conflitti merge=${kpi.mergeConflicts}, collaboratori vuoti=${kpi.emptyVassals}`
137
137
  : "esecuzione completa";
138
- return `[VASCEND_ATTIVITA_MIGLIORA]
139
- INDICE
140
- 1 = goal
141
- 2 = kpi
142
- 3 = vision
143
- 4 = azione
144
-
145
- DEFINIZIONI
146
- @goal[reale]: "${g}"
147
- @kpi[esecuzione]: ${kpi.executionScore}/100 (soglia ${verdict.executionThreshold}) · ${execGap}
148
- @vision[allineamento]: ${alignment.alignment}/100 verso l'obiettivo finale (must residui=${must.length})
149
- @proposta[gap]: ${rows || "nessuna proposta esplicita: rifinisci verso l'obiettivo finale"}
150
- @azione[colma]: NON consegni un piano parziale; PRIMA risolvi i gap di esecuzione (rilavora i gruppi falliti, integra i conflitti), POI realizza le proposte must verso la Vision
151
-
152
- RELAZIONI
153
- @R1: @kpi[esecuzione] -> @azione[colma] [ i fallimenti di esecuzione vanno chiusi per primi ]
154
- @R2: @vision[allineamento] -> @proposta[gap] [ il gap verso l'obiettivo diventa proposte ]
155
- @R3: @proposta[gap] -> @azione[colma] [ realizza i must, poi rivaluta ]
156
-
138
+ return `[VASCEND_ATTIVITA_MIGLIORA]
139
+ INDICE
140
+ 1 = goal
141
+ 2 = kpi
142
+ 3 = vision
143
+ 4 = azione
144
+
145
+ DEFINIZIONI
146
+ @goal[reale]: "${g}"
147
+ @kpi[esecuzione]: ${kpi.executionScore}/100 (soglia ${verdict.executionThreshold}) · ${execGap}
148
+ @vision[allineamento]: ${alignment.alignment}/100 verso l'obiettivo finale (must residui=${must.length})
149
+ @proposta[gap]: ${rows || "nessuna proposta esplicita: rifinisci verso l'obiettivo finale"}
150
+ @azione[colma]: NON consegni un piano parziale; PRIMA risolvi i gap di esecuzione (rilavora i gruppi falliti, integra i conflitti), POI realizza le proposte must verso la Vision
151
+
152
+ RELAZIONI
153
+ @R1: @kpi[esecuzione] -> @azione[colma] [ i fallimenti di esecuzione vanno chiusi per primi ]
154
+ @R2: @vision[allineamento] -> @proposta[gap] [ il gap verso l'obiettivo diventa proposte ]
155
+ @R3: @proposta[gap] -> @azione[colma] [ realizza i must, poi rivaluta ]
156
+
157
157
  OUTPUT: colma i gap del piano col lavoro reale (esecuzione prima, poi proposte must verso la Vision) e completa le attivita con vascend_mark. Il gate KPI rivaluta.`;
158
158
  }
159
159
  // ---------------------------------------------------------------------------
@@ -351,7 +351,7 @@ export async function runKingdomForHost(input) {
351
351
  at: Date.now(),
352
352
  });
353
353
  const elenco = castles.map((c) => `${c.slug}${c.role ? ` (${c.role})` : ""}`).join(", ");
354
- return `Squadra al lavoro: ${elenco}.
354
+ return `Squadra al lavoro: ${elenco}.
355
355
  `
356
356
  + `Gli incarichi pronti partono entro il limite di concorrenza; gli altri attendono dipendenze o aree libere. Parlagli con team_say, leggi cosa rispondono con `
357
357
  + `team_inbox, e quando serve raccogli i risultati con team_report. Non aspettarli fermo: `
@@ -459,12 +459,12 @@ export function formatKingdomOutcome(reports, sessionDir, kingdomId) {
459
459
  const isolated = reports.some((r) => r.branch);
460
460
  const conflicts = collectConflicts(reports);
461
461
  const gitNote = isolated
462
- ? `\n\n[NOTA_GIT]
463
- @stato[rami]: ogni collaboratore in worktree isolato; rami merge-ati nel ramo base
464
- @conflitti[merge]: ${conflicts.length ? `${conflicts.map((r) => r.slug).join(", ")} NON merge-ati (rami conservati, risoluzione manuale)` : "nessuno"}
462
+ ? `\n\n[NOTA_GIT]
463
+ @stato[rami]: ogni collaboratore in worktree isolato; rami merge-ati nel ramo base
464
+ @conflitti[merge]: ${conflicts.length ? `${conflicts.map((r) => r.slug).join(", ")} NON merge-ati (rami conservati, risoluzione manuale)` : "nessuno"}
465
465
  @azione[consegna]: verifica diff e controlli nel ramo base; push solo se richiesto dall'utente`
466
- : `\n\n[NOTA_GIT]
467
- @stato[modifiche]: nel working tree, NON committate (i collaboratori non fanno git: working dir condivisa)
466
+ : `\n\n[NOTA_GIT]
467
+ @stato[modifiche]: nel working tree, NON committate (i collaboratori non fanno git: working dir condivisa)
468
468
  @azione[consegna]: verifica diff e controlli; commit e push solo se richiesti dall'utente`;
469
469
  const stash = formatConflictList(conflicts);
470
470
  return `ESECUZIONE ATTIVITA CONCLUSA · ${reports.length} gruppi\n${lines}${index}${gitNote}${stash ? `\n\n${stash}` : ""}`;