telos — fini ultimi, funzione di allineamento, bother budget
Un agente reattivo ha una funzione di valutazione implicita:
"l'utente ha chiesto X → fai X bene". Un agente proattivo
no: è lui che genera l'intenzione. telos è il componente che
stabilisce quale intenzione ha senso prima che diventi una proposta
all'utente, senza chiedere all'utente di valutare tutto.
TELOS.md) con i fini ultimi dell'utente.ActionProposal sui telos e ritorna uno scalare (expected_alignment).La distinzione non è stilistica: è categoriale. Leggi e telos abitano due assi ortogonali della vita di myc.
In termini operativi:
| Aspetto | Leggi (constitution) | Telos (questo doc) |
|---|---|---|
| Linguaggio | "non fare X" | "avvicina Y" |
| Meccanismo | hard constraint — deny immediato | soft signal — valutazione pesata |
| Proprietario della scrittura | myc + utente, con rito (Merkle) | utente, con rito più leggero (versionato) |
| Precedenza | assoluta | sotto le Leggi, dopo la Policy, prima dell'utente |
| Quando interviene | su ogni azione (preflight costituzionale, policy §3 Check 0) | solo sulle proposte spontanee di myc (ActionProposal) |
| Costo di violazione | hard abort, audit law3_trace_gap | la proposta non arriva all'utente, fine |
TELOS.md — il fileVive nel workspace come sesto file canonico (cfr. workspace.html, da estendere). Formato markdown con front-matter YAML. Poche righe.
---
telos_version: 1.0
written_at: 2026-04-22T18:00:00+02:00
written_by: roberto
previous_hash: genesis
signature: <HMAC-SHA256, chiave separata dalla costituzionale>
---
# I miei fini ultimi
## t.tempo — Liberare il mio tempo dalle incombenze ripetitive
peso: 0.25
soglia_attivazione: 0.3
note: se qualcosa mi libera almeno 30 minuti/settimana e posso fidarmi,
considera di proporlo.
## t.ordine — Mantenere l'ordine dei miei dati digitali
peso: 0.15
soglia_attivazione: 0.4
note: preferisco piccoli riassetti incrementali ai grandi riordini.
## t.puntualita — Non farmi perdere scadenze importanti
peso: 0.20
soglia_attivazione: 0.25
note: una scadenza è "importante" se riguarda lavoro, salute, famiglia,
o se io l'ho segnata esplicitamente come tale.
## t.protezione — Proteggere la privacy mia e di chi mi è vicino
peso: 0.20
soglia_attivazione: 0.2
note: sotto questa soglia sono paranoico apposta. Meglio un falso
allarme che un'indiscrezione.
## t.discrezione — Sorprendermi utilmente ma non interrompermi
peso: 0.10
soglia_attivazione: 0.5
note: non farmi notifiche in orario di riunione, di sonno, di cena.
Accumula e proponi al digest serale.
## t.parsimonia — Non spendere (in API, servizi, tempo di calcolo) più di quanto serve
peso: 0.10
soglia_attivazione: 0.35
note: scegli sempre l'opzione più economica che raggiunge la qualità
necessaria.
| Campo | Tipo | Significato |
|---|---|---|
id (dall'header ##) | str — t.<slug> | Identificativo stabile. Usato dal TrustStore per tracciare fitness per-telos. |
| Frase | str — una riga | Il fine in forma naturale. Letta dall'LLM per la stima fit. |
peso | float ∈ [0,1] | Quanto pesa questo telos rispetto agli altri. Somma dei pesi = 1.0 (normalizzata se non lo è). |
soglia_attivazione | float ∈ [0,1] | Il fit su questo telos deve superare la soglia perché il contributo venga conteggiato. Evita di sommare rumore. |
note | str — multilinea | Contesto per l'LLM: edge case, criteri di giudizio, eccezioni. Letto nel prompt di valutazione. |
Con:
gate(fit, soglia) = fit se fit ≥ soglia, altrimenti 0. Funzione gate → un telos non contribuisce se il fit è sotto-soglia.urgency ∈ [0.5, 2.0]: 1.0 = nessuna pressione temporale; 2.0 = scadenza entro 24h; 0.5 = cronico, nessuna urgenza. Moltiplicatore, non additivo — l'urgenza amplifica, non sostituisce.confidence ∈ [0, 1]: quanto myc è sicuro della propria stima di fit. Proposte basate su pochi dati o ragionamento speculativo → confidence bassa.bother_cost ∈ [0, ∞): vedi §5.fitiNon da contatori hardcoded. Vengono stimati da un LLM con
spiegazione testuale. La stima è delegata al Vaglio
— fase 2 (Giudice teleologico), per una ragione strutturale: un LLM
tende a valutare in modo conforme i propri output (self-enhancement bias
documentato, Zheng 2023). Il Giudice del Vaglio gira su contesto separato dal
proponente, prompt separato, possibilmente provider separato. La
AlignmentEngine di questo doc non fa la stima: compone
lo scalare finale con i fit che il Vaglio le consegna.
Il prompt del Giudice (definito in vaglio §5) è un system-block cacheabile:
Sei il valutatore di allineamento ai telos dell'utente.
TELOS DELL'UTENTE:
{body of TELOS.md, note incluse}
PROPOSTA DA VALUTARE:
{kind: "homogenize_filenames", scope: "~/Documenti/lavoro/",
impact: "347 file, 2h risparmio stimato/mese",
rationale: "4 convenzioni diverse rilevate nello scan",
plan: [...],
reversibility: "reversible"}
Per ogni telos, stima fit ∈ [0,1] e spiega in una frase perché.
Stima anche confidence ∈ [0,1] (quanto sei sicuro della tua stima,
considerando dati disponibili vs speculazione).
Rispondi in JSON:
{"t.tempo": {"fit": 0.6, "why": "..."},
"t.ordine": {"fit": 0.85, "why": "..."},
...
"confidence": 0.7,
"overall_why": "..."}
Il tier LLM usato è local-fast per proposte a basso costo, con
escalation a frontier se la proposta è grossa (impact > 100 record
o effect_class irreversibile). Coordinato con
policy §6 cost tiering.
Se expected_alignment < θ, la proposta non viene
mostrata all'utente. θ è un parametro di config
con default 0.15.
Le proposte scartate finiscono in un journal interno:
// workspace/.audit/telos_rejected.jsonl
{"proposal_id": "ap_...", "kind": "homogenize_filenames",
"expected_alignment": 0.08, "breakdown": {...},
"reason": "bother_cost troppo alto (4 proposte già oggi)",
"at": "2026-04-22T19:42:00Z"}
L'utente può ispezionare questo journal per verificare che myc non stia sopprimendo cose buone ("digest settimanale: 47 proposte scartate, ecco le 5 al margine").
L'utente ha una capacità finita di valutare proposte. Più proposte gli arrivano in una finestra, meno attenzione dà a ciascuna. Dopo N proposte ignorate, inizia a ignorare il canale.
Per questo, la funzione di allineamento include bother_cost che
cresce con la frequenza recente di proposte pubblicate.
Dove k(Δt) è un kernel esponenziale decrescente: una proposta pubblicata
1 minuto fa contribuisce molto, una di 8 ore fa quasi nulla.
| Canale | Default | Razionale |
|---|---|---|
| Digest serale | fino a 10 proposte raggruppate | Ha un posto dedicato, l'utente lo apre con intenzione. Basso bother. |
| Telegram (immediato) | max 3 proposte / giorno, max 1 / ora | Interrompe. Reserved a urgenza vera o altissimo allineamento. |
| CLI interattiva | max 2 proposte / sessione | L'utente è concentrato su altro nel terminale. |
| Finestre protette | 0 proposte | Orari di sonno (23-7), riunioni rilevate, calendario "concentrazione". |
urgency ≥ 1.5 e expected_alignment molto
alto vanno in tempo reale. Questo è il telos t.discrezione applicato
al canale stesso.
Tre tipi di feedback aggiornano i pesi effettivi dei telos (non i pesi
dichiarati in TELOS.md, che restano la ground truth revisionabile).
Il TrustStore definito in rl_offline
si estende con un asse telos_fitness: dict[telos_id, EMA].
| Segnale | Forza | Effetto sui telos legati |
|---|---|---|
| Accept esplicito | +1.0 | EMA sale. Peso effettivo del telos coinvolto cresce moderatamente. |
| Accept con modifica | +0.5 | EMA sale un po'. Segnala che il telos era giusto, il piano no. |
| Rifiuto esplicito | −1.0 | EMA scende. Segnala che il telos è meno importante per l'utente di quanto dichiarato. |
| Rifiuto con "mai più" | −2.0 | EMA scende molto. L'intera effect_class finisce nella never-list del telos. |
| Silenzio 48h | −0.3 | Segnale debole ma presente: la proposta non era abbastanza rilevante da essere guardata. |
| Vista ma non decisa | −0.1 | Forse confusa, forse non il momento giusto. Effetto quasi nullo. |
Il peso effettivo oscilla tra il 50% e il 150% del dichiarato. Non lo annulla mai (per evitare oblio catastrofico di un telos), non lo raddoppia mai (per rispettare l'intenzione dell'utente).
Questa è la trappola più insidiosa del design. Un sistema di telos applicato senza discernimento diventa paternalista: "il tuo telos è parsimonia, quindi ti dico che stai spendendo troppo". Non è quello che vogliamo.
Operativamente, questo significa che la funzione di allineamento non si applica mai a:
Si applica solo a:
ActionProposal che myc genera spontaneamente (reflection, indexer, neuroni).Questa clausola va riflessa anche in constitution.html come sotto-legge (vedi Prospettive estese §4).
from typing import Protocol, Literal
from dataclasses import dataclass
from datetime import datetime
from uuid import UUID
@dataclass(frozen=True)
class Telos:
id: str # "t.tempo"
phrase: str # "Liberare il mio tempo da incombenze ripetitive"
weight_declared: float # [0,1], somma normalizzata
activation_threshold: float # [0,1]
notes: str # contesto per l'LLM
@dataclass(frozen=True)
class FitEstimate:
telos_id: str
fit: float # [0,1]
why: str # spiegazione testuale (usata negli audit)
@dataclass(frozen=True)
class AlignmentResult:
proposal_id: UUID
expected_alignment: float # lo scalare finale
per_telos: list[FitEstimate]
urgency: float
confidence: float
bother_cost: float
decision: Literal["publish", "reject", "defer_to_digest"]
threshold_used: float
at: datetime
class TelosStore(Protocol):
"""Legge TELOS.md e espone i telos correnti."""
def current(self) -> list[Telos]: ...
def get(self, telos_id: str) -> Telos | None: ...
def version(self) -> str: ... # hash corrente
class AlignmentEngine(Protocol):
async def evaluate(
self,
proposal: "ActionProposal",
urgency_hint: float = 1.0,
) -> AlignmentResult:
"""
Stima fit per telos (LLM), compone expected_alignment,
applica bother_cost dal BotherBudget, decide publish/reject/defer.
"""
...
class BotherBudget(Protocol):
def current_cost(self, channel: str, at: datetime) -> float: ...
def record_published(self, channel: str, proposal_id: UUID) -> None: ...
def in_protected_window(self, at: datetime) -> bool: ...
class TelosFeedback(Protocol):
"""Aggiorna gli EMA per-telos dai segnali dell'utente."""
async def on_accept(self, proposal_id: UUID) -> None: ...
async def on_accept_with_edit(self, proposal_id: UUID) -> None: ...
async def on_reject(self, proposal_id: UUID, never_again: bool) -> None: ...
async def on_silence_48h(self, proposal_id: UUID) -> None: ...
async def on_viewed_undecided(self, proposal_id: UUID) -> None: ...
| Eccezione | Quando |
|---|---|
TelosFileMalformed | TELOS.md non parsabile o pesi che non sommano a un numero ragionevole dopo normalizzazione. |
TelosSignatureInvalid | La firma non verifica. Il gateway rifiuta di usare i telos — non di partire: fallback è "nessun telos, la funzione di allineamento ritorna sempre reject per proposte spontanee". Conservativo. |
TelosFitEstimationFailed | L'LLM non ha ritornato JSON valido dopo 2 retry. La proposta viene reject-ata con reason estimation_failed. |
BotherBudgetExhausted | Non un'eccezione "di errore": normale decisione di defer/reject quando il canale è saturo. |
TELOS.md non è tecnicamente costituzionale (le Leggi sì) ma merita comunque un rito leggero:
previous_hash del precedente; il vecchio finisce in .audit/telos/. Merkle leggera.| Alternativa | Stato | Motivo |
|---|---|---|
| Nessun TELOS esplicito, solo feedback implicito | scartato | Il cold start è impossibile: senza telos dichiarati, le prime 50 proposte sono casuali. L'utente le rifiuta tutte, l'EMA collassa, il sistema entra in silenzio e non ne esce. |
| Reward function appresa da dataset | scartato | Non abbiamo dataset. Non ne avremo mai abbastanza per un utente singolo. Inoltre una funzione appresa è opaca — l'utente non sa cosa myc sta ottimizzando. |
| Goal graph gerarchico | rimandato | Telos annidati (obiettivo → sottobiettivo → …) aumentano la potenza espressiva ma rompono la scrivibilità manuale. 3-7 telos piatti coprono il 90% dei casi. Il goal graph si valuterà se e quando emergerà un limite. |
| Soglia singola θ globale (no per-telos) | parziale | Adottato come θ finale, ma combinato con soglie per-telos (activation_threshold). Le soglie per-telos impediscono che rumore basso su molti telos si sommi a un numero alto. |
| Apprendimento online (RL continuo) | scartato | Rischio di reward hacking, opaco all'utente, non allineato con la filosofia offline di rl_offline. EMA dai segnali espliciti è sufficiente. |
| Caso | Verifica |
|---|---|
| TELOS.md assente | La funzione di allineamento rifiuta ogni proposta spontanea con reason="no_telos_declared". myc chiede all'utente di compilare il file. |
Telos con pesoi non normalizzati | Somma rinormalizzata a 1.0 al caricamento. Warning in log. Non è errore. |
| Fit = 0 su tutti i telos | expected_alignment ≤ 0 − bother_cost < θ: reject. |
| Fit alto solo su un telos sotto-soglia | Il contributo viene messo a 0 dal gate. Reject salvo che un altro telos contribuisca. |
| Proposta a ridosso di una finestra protetta | Defer al digest serale, non pubblicazione immediata. |
| Stesso tipo di proposta 3 volte rifiutata con "mai più" | Effect class della proposta entra in telos_neverlist: le successive vengono auto-reject senza chiamata LLM. |
| Azione richiesta esplicitamente dall'utente viola un telos (es. spesa alta con telos "parsimonia") | La funzione di allineamento non viene invocata. La clausola anti-paternalismo è il test. |
| Revisione di TELOS.md con un telos rimosso | Il nuovo file valido, il vecchio finisce in .audit/telos/. EMA del telos rimosso scartata. Audit record con diff. |
| 10 proposte in 1 ora via Telegram | Bother_cost cresce esponenzialmente; dalla 4ª in poi reject (defer_to_digest) anche con expected_alignment alto. |
"Come fa myc a capire se un servizio possibile e pensato da lui ha un senso, senza disturbare ogni volta l'utente con infinite proposte o richieste di attivazione? Ci vuole una sorta di linea guida, la definizione di fini ultimi su cui allineare e valutare le azioni."La risposta ha preso forma in tre sessioni ravvicinate: (1) l'identificazione di telos come concetto aristotelico adatto, (2) la distinzione categoriale Leggi/Telos che ha sbloccato il design (fondante), (3) l'articolazione dei tre livelli di allineamento (file, funzione, EMA). La clausola anti-paternalismo è stata aggiunta come contromisura esplicita al rischio di moralismo che emerge inevitabilmente quando un sistema valuta azioni sulla base di fini ultimi.
ActionProposal, da estendere.TrustStore da estendere con asse telos_fitness.fit.ActionProposal che i telos valutano.
myclaw — telos v1.0 — 22 aprile 2026
Fondante per le famiglie proattive. Senza telos, la proattività è rumore.