@vascend/talos 0.1.0 → 0.1.2
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/README.md +7 -3
- package/dist/backend/asset-events.js +9 -9
- package/dist/core/agent.js +3 -3
- package/dist/core/cli-args.js +50 -50
- package/dist/core/cli-installation.d.ts +4 -0
- package/dist/core/cli-installation.js +55 -0
- package/dist/core/compaction.js +26 -26
- package/dist/core/config.js +101 -101
- package/dist/core/execution-guidance.js +21 -21
- package/dist/core/package-update.d.ts +3 -1
- package/dist/core/package-update.js +19 -6
- package/dist/core/self-update.d.ts +1 -1
- package/dist/core/signed-release.d.ts +33 -0
- package/dist/core/signed-release.js +123 -0
- package/dist/core/update-check.d.ts +1 -1
- package/dist/core/update-check.js +15 -14
- package/dist/core/vibe-modes.js +13 -13
- package/dist/distribution/install.d.ts +1 -0
- package/dist/distribution/install.js +31 -0
- package/dist/install.mjs +271 -0
- package/dist/node-runtime.json +13 -0
- package/dist/providers/oauth-callback-server.js +32 -32
- package/dist/tools/capabilities.js +30 -30
- package/dist/tools/computer-capture.js +50 -50
- package/dist/tools/program.js +82 -82
- package/dist/tui/i18n-catalog.js +16 -0
- package/dist/tui/quick-help.js +31 -31
- package/dist/tui/repl.js +5 -5
- package/dist/tui/update-prompt.js +1 -0
- package/dist/vascend/code-events.js +9 -9
- package/dist/vascend/completeness.js +31 -31
- package/dist/vascend/context-fabric.js +16 -16
- package/dist/vascend/contract-memory.js +30 -30
- package/dist/vascend/council.js +82 -82
- package/dist/vascend/decision-promotion.js +23 -23
- package/dist/vascend/granular-kingdom.js +17 -17
- package/dist/vascend/granular-launcher.js +2 -2
- package/dist/vascend/kingdom-kpi.js +19 -19
- package/dist/vascend/kingdom-run.js +6 -6
- package/dist/vascend/kingdom.js +56 -56
- package/dist/vascend/mandate.js +21 -21
- package/dist/vascend/objective-revision.js +34 -34
- package/dist/vascend/patch-plan.js +22 -22
- package/dist/vascend/requirements.js +29 -29
- package/dist/vascend/reviewer.js +26 -26
- package/dist/vascend/room-memory.js +25 -25
- package/dist/vascend/runtime.js +44 -44
- package/dist/vascend/self-improve.js +39 -39
- package/dist/vascend/test-failure-memory.js +9 -9
- package/dist/vascend/vision.js +18 -18
- package/dist/vendor/computer-use/README.md +7 -7
- package/dist/vendor/computer-use/computer-desktop.js +211 -211
- package/dist/vendor/computer-use/computer-observe.js +315 -315
- package/dist/vendor/computer-use/computer-scripts.js +1230 -1230
- package/dist/vendor/computer-use/computer-tools.js +2136 -2136
- package/dist/vendor/computer-use/package.json +1 -1
- package/dist/vendor/computer-use/rac/atomic-input.js +91 -91
- package/dist/vendor/computer-use/rac/grammatica.js +101 -101
- package/dist/vendor/computer-use/rac/parser.js +185 -185
- package/dist/vendor/computer-use/rac/protocol.js +136 -136
- package/install.ps1 +374 -30
- package/install.sh +356 -43
- package/package.json +2 -2
- package/dist/core/kingdoms-mode-state.d.ts +0 -24
- package/dist/core/kingdoms-mode-state.js +0 -139
- 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
|
}
|
package/dist/vascend/council.js
CHANGED
|
@@ -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}` : ""}`;
|