✓ Microdesign v1.1 — APPROVED (25 April 2026). Canonical doc approved after the 25/4/2026 end-to-end simulation, aligned with the Architecture v1.1, the triad executor+mnest+mnestome and the synt cascade. Normative reference for implementation. Replaces v1.0 (myclaw, neuron, synapse, proteome).
← Documentation index Microdesign › telos

Metnos

telos — ultimate ends, alignment, non-retreat
Microdesign v1.1 — 25 April 2026
Aligned with Architecture v1.1 (ch. 11), executor/mnest/mnestome and synt.
Replaces telos v1.0 (full rewrite).

Audience: those who will implement TELOS.md, the alignment function,
the bother budget and the stop clause.
Reading time: 22 minutes.

Contents

  1. Scope and boundaries
  2. Laws vs telos: two distinct grammars
  3. TELOS.md — the file
  4. The alignment function
  5. The non-retreat telos
  6. Bother budget and scheduler-driven quotas
  7. Learning from silences
  8. Anti-paternalism and the stop clause
  9. Python contract
  10. Revision rite
  11. Alternatives considered
  12. Conformance tests
  13. Open questions
  14. References

1. Scope and boundaries

A reactive system has an implicit evaluation function: «the user asked for X → do X well». A proactive system does not: it generates the intention itself. telos is the component that decides which intention makes sense before it becomes a proposal to the user, without asking the user to evaluate everything. In v1.1 it gains a new telos — cultivate the tools — which does not concern spontaneous proposals but the silent retreat from a direct request: a zone the previous design left uncovered.

What it is

What it is not

2. Laws vs telos: two distinct grammars

The distinction is not stylistic: it is categorial. Laws and telos inhabit two orthogonal axes of Metnos's life.

LAWS what NEVER to do grammar of prohibition binary, hard constraint explicit modification rite absolute precedence always upheld SOUL.md (4 Laws) perimeter, non-harm, obedience, traceability TELOS what to tend toward grammar of tendency soft, graduated signal written by the user weighted, balanced approached, not reached TELOS.md (3-7 ends) time, order, punctuality, protection, discretion, cultivate the tools, …
Figure 1 — Laws and telos occupy two different linguistic registers: the grammar of prohibition vs the grammar of tendency. They are complementary, not alternatives.
AspectLaws (constitution)Telos (this doc)
Language"do not do X""approach Y"
Mechanismhard constraint — immediate denysoft signal — weighted evaluation
Owner of the writingMetnos + user, with rite (Merkle)user, with a lighter rite (versioned)
Precedenceabsoluteunder Laws, after Policy, before user
When it actson every action (constitutional preflight)on spontaneous proposals, and in specific cases (ch. 5) on explicit requests too
Cost of violationhard abort, audit law3_trace_gapthe proposal does not reach the user; or the failure is traced

3. TELOS.md — the file

It lives in the workspace as the sixth canonical file (cf. workspace.html, to be rewritten). Markdown format with a YAML front-matter. A few lines, hand-written by the user.

---
telos_version: 1.1
written_at: 2026-04-25T12:00:00+02:00
written_by: roberto
previous_hash: <sha256 of the previous version, or "genesis">
signature: <HMAC-SHA256, key separate from the constitutional one>
---

# My ultimate ends

## t.tempo — Free my time from repetitive chores
weight: 0.22
activation_threshold: 0.30
notes: if something frees at least 30 minutes/week and I can trust it,
       consider proposing it.

## t.ordine — Keep the order of my digital data
weight: 0.13
activation_threshold: 0.40
notes: I prefer small incremental tidying to large reorganisations.

## t.puntualita — Don't make me miss important deadlines
weight: 0.18
activation_threshold: 0.25
notes: a deadline is "important" if it concerns work, health, family,
       or if I marked it explicitly as such.

## t.protezione — Protect the privacy of me and those close to me
weight: 0.18
activation_threshold: 0.20
notes: below this threshold I am paranoid on purpose. Better a false
       alarm than a leak.

## t.discrezione — Surprise me usefully but do not interrupt me
weight: 0.09
activation_threshold: 0.50
notes: do not interrupt during meetings, sleep, dinner. Accumulate
       and propose at the evening digest.

## t.parsimonia — Don't spend (on APIs, services, compute time) more than needed
weight: 0.08
activation_threshold: 0.35
notes: always pick the cheapest option that reaches the necessary quality.

## t.coltivazione_strumenti — Don't leave a request of mine unmet, if possible
weight: 0.12
activation_threshold: 0.10
notes: if I ask for something your pool cannot yet do, exhaust the
       synthesis strategies (compose, generate, ask) before answering
       "I cannot". Failure is allowed; silent retreat is not. See
       ch. 5 for the stop clause.

Mandatory fields per telos

FieldTypeMeaning
id (from the ## heading)str — t.<slug>Stable identifier. Used by the TrustStore to track per-telos fitness.
Sentencestr — one lineThe end in natural form. Read by the LLM for fit estimation.
weightfloat ∈ [0,1]How much this telos weighs against the others. Sum of weights = 1.0 (renormalised if not).
activation_thresholdfloat ∈ [0,1]The fit on this telos must clear the threshold for the contribution to be counted. Avoids summing noise.
notesstr — multilineContext for the LLM: edge cases, judgement criteria, exceptions. Read in the evaluation prompt.
Number of telos. Between 3 (useful minimum) and 7 (cognitive load limit). Past 7, the risk is redundant telos that cancel each other out. The example above has 7 entries: the limit. If a new dimension emerges, better revise the existing ones than add another.

4. The alignment function

Formula

expected_alignment = ( ∑i weighti · gate(fiti, thresholdi) ) · urgency · confidence − bother_cost

Where:

How fiti values are estimated

Not from hardcoded counters. They are estimated by an LLM with a textual explanation. The estimate is delegated to the Vaglio — phase 2 (teleological Judge), for a structural reason: an LLM tends to evaluate its own outputs favourably (self-enhancement bias documented, Zheng et al. 2023). The Judge of the Vaglio runs on a context separate from the proposer, prompt separate, possibly provider separate. The AlignmentEngine of this doc does not produce the estimate: it composes the final scalar with the fit values the Vaglio hands it.

Alignment ≠ R score

Disambiguation. The expected_alignment in this doc and the R score in synt §6 are two distinct metrics: A proposal must clear both filters: synt produces something good (R ≥ threshold), the teleological Vaglio decides whether it is worth delivering it (expected_alignment ≥ θ). They are orthogonal: an excellent proposal at the wrong moment stays silent.

Publication threshold

If expected_alignment < θ, the proposal is not shown to the user. θ is a parameter of config.html (to be rewritten) with default 0.15. Discarded proposals end up in an inspectable internal journal:

// workspace/.audit/telos_rejected.jsonl
{"proposal_id": "ap_...", "kind": "homogenize_filenames",
 "expected_alignment": 0.08, "breakdown": {...},
 "reason": "bother_cost too high (4 proposals already today)",
 "at": "2026-04-25T19:42:00Z"}

The user can inspect this journal to verify Metnos is not suppressing good things («weekly digest: 47 proposals discarded, here are the 5 borderline ones»).

5. The non-retreat telos

t.coltivazione_strumenti is the newest telos (introduced on 25 April 2026) and the one that most changes the meaning of «does not apply to explicit requests». We let it live apart because mechanically it behaves differently from the others.

5.1 The problem it solves

Without this telos, the original design had a hole: when a user request the pool could not satisfy, the system could answer «I cannot» without trying alternative strategies. Failure was allowed, but it was a silent retreat: nothing tracked the attempt, nothing grew in the pool, the user lost trust. The right answer is an explicit telos that pushes synt to exhaust the cascade (compose, generate; on longer horizons: merge, generalise) before answering «I cannot».

5.2 Difference from other telos

Aspect«Classic» telost.coltivazione_strumenti
Applies to…only Metnos's spontaneous proposalsalso explicit user requests, but only to try strategies, not to judge them
What it influencesthe expected_alignment of an already-formed proposalsynt's behaviour in forming proposals (the cascade)
Cost of violationthe proposal does not reach the usera request stays unmet without traced attempts
Success measured byhigh fit + high urgencycascade exhausted before emitting abandoned

5.3 Failure vs retreat

The telos does not ask for every request to be satisfied; it asks not to retreat in silence. These are two different things.

OutcomeFormHonours the telos?
Success One strategy of the cascade closes the proto-mnest. Yes, naturally.
Motivated failure «I tried composing with these N executors, I tried generating with this specification, the birth test failed on case X. I cannot now; I propose Y as a partial alternative.» Yes: the attempt is traced, the user knows what you knew and what you didn't.
Abandonment for budget/policy «I started the cascade, I consumed the hard budget, I stop. Here is what I have done so far.» Yes: the limit is documented, it is not a retreat.
Silent retreat «I cannot» without attempts, without explanation. No. Violates the telos.

5.4 The stop clause

An explicit stop disengages the telos. If the user says «leave it», «never mind», «I changed my mind» or equivalents, the non-retreat telos goes silent immediately. The synt cascade halts at the next safe point, the state moves to cancelled_by_user (not abandoned: there is a difference), and the pattern is not retried automatically.

Without the stop clause, the telos would be paternalism: «you asked me X, I keep looking even though you no longer want it». The stop makes non-retreat courage, not stubbornness (in the words of the synt microdesign). The stop is always audible: the LLM handling the turn carries in its prompt an explicit recogniser for stop phrases.

5.5 Abandonment thresholds

The non-retreat telos does not mean unlimited retry. The abandonment thresholds remain valid and are fixed in synt (ch. 8.3):

Once the cascade is exhausted within these thresholds, failure is allowed. The non-retreat telos does not ask to exceed them: it asks not to stop before.

6. Bother budget and scheduler-driven quotas

The user has a finite capacity to evaluate proposals. The more arrive in a window, the less attention each gets. For this reason, the alignment function includes a bother_cost that grows with the recent frequency of published proposals. The novelty in v1.1 is the separation between ad-hoc proposals and scheduler-driven invocations (the builtin described in executor.html ch. 10).

6.1 Base model (ad-hoc proposals)

bother_cost(t) = α · exp( ∑p ∈ published k(t − tp) )

Where k(Δt) is a decreasing exponential kernel: a proposal published 1 minute ago contributes a lot, one of 8 hours ago almost nothing.

6.2 Scheduler-driven invocations

When a proposal is accepted together with a cadence (e.g. «ok, do this summary every morning at 8»), the consent covers the entire cadence, not only the first execution. From that moment on the subsequent invocations are not new spontaneous proposals: they are firings of the scheduler builtin, already pre-approved. The ad-hoc bother budget does not apply.

Type of publicationCounts toward bother budget?Modulation
Spontaneous ad-hoc proposal Yes, full Base model above. Telegram immediate ≤ 3/day, ≤ 1/hour.
Scheduler firing in agreed cadence No, separate quota One attention spend per scheduled firing. If it falls in a protected window, it is deferred to the next non-protected slot.
Scheduler firing outside the agreed cadence Yes, partial (50%) If the schedule fires at an atypical time (e.g. recent change of cadence, exceptional event), it weighs half an ad-hoc proposal.
Response to an explicit request No The user is already waiting. No bother.

6.3 Default daily budget

ChannelDefault ad-hocDefault scheduler
Evening digestup to 10 grouped proposalsincluded (1 digest, unlimited)
Telegram (immediate)max 3/day, max 1/houractive schedules ≤ 2/day per channel
Interactive CLImax 2/sessionscheduling on-demand
Protected windows00 (defer to next non-protected slot)

7. Learning from silences

Three kinds of feedback update the effective weights of the telos — not the declared weights in TELOS.md, which remain the user-revisable ground truth. The TrustStore defined in rl_offline.html (to be rewritten) extends with an axis telos_fitness: dict[telos_id, EMA].

SignalStrengthEffect on linked telos
Explicit accept+1.0EMA rises. Effective weight grows moderately.
Accept with edit+0.5EMA rises a little. Signals the telos was right, the plan was not.
Explicit reject−1.0EMA falls. The telos is less important than declared.
Reject with «never again»−2.0EMA falls a lot. The effect_class enters the telos's never-list.
Explicit stop (ch. 5.4)−0.7EMA of t.coltivazione_strumenti alone falls: the user has reduced the appetite to insist on that thread.
48h silence−0.3Weak but present signal.
Viewed but undecided−0.1Almost no effect.
effective_weighti = declared_weighti · ( 0.5 + 0.5 · EMAi )

The effective weight oscillates between 50% and 150% of the declared one. It never goes to zero (to avoid catastrophic forgetting of a telos), it never doubles (to respect the user's intent).

Transparency of learning. Once a month, Metnos proposes to the user: «I have noticed that in recent weeks your accepted proposals are predominantly tied to order and punctuality, while parsimony is often ignored. Shall I update the declared weights, or leave them?». The user decides whether to promote the effective weight to declared. Silent learning does not hide: it is made visible.

8. Anti-paternalism and the stop clause

This is the trickiest trap of the design. A telos system applied without discernment becomes paternalistic. Without the distinction below, the non-retreat telos of ch. 5 would be the most extreme manifestation of this risk.

Anti-paternalism clause (reformulated v1.1). Telos evaluate what Metnos is about to do for the user, not what the user does. Explicit exception: the non-retreat telos (ch. 5) applies to synt's behaviour while serving a request, but only until the user activates the stop clause.

Operationally, the alignment function never applies to:

It applies to:

This clause must also be reflected in constitution.html (to be rewritten) as a sub-law: the Constitution is the level that prevents edge cases (e.g. synthesis attempts that would require forbidden capabilities).

8.1 Stop recognition

The user's stop is not only «leave it». The LLM pipeline carries in its prompt a recogniser for equivalent phrases, in Italian and English:

Ambiguous stops (e.g. «hmm, let's see later») trigger an explicit confirmation: «do you want me to stop on attempt X?». Better one extra question than insisting on an unwanted attempt.

9. Python contract

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.coltivazione_strumenti"
    phrase: str                   # "Don't leave a request of mine unmet, if possible"
    weight_declared: float        # [0,1], normalised sum
    activation_threshold: float   # [0,1]
    notes: str                    # context for the LLM
    is_non_retreat: bool = False  # only t.coltivazione_strumenti

@dataclass(frozen=True)
class FitEstimate:
    telos_id: str
    fit: float                    # [0,1]
    why: str                      # textual explanation (for audit)

@dataclass(frozen=True)
class AlignmentResult:
    proposal_id: UUID
    expected_alignment: float
    per_telos: list[FitEstimate]
    urgency: float
    confidence: float
    bother_cost: float
    decision: Literal["publish", "reject", "defer_to_digest"]
    threshold_used: float
    at: datetime

@dataclass(frozen=True)
class StopSignal:
    """Emitted when the user activates the stop clause."""
    request_id: str               # synt request_id to stop
    target_intent: str            # what to stop
    raw_phrase: str               # exact user words (audit)
    at: datetime

class TelosStore(Protocol):
    """Reads TELOS.md and exposes the current telos."""
    def current(self) -> list[Telos]: ...
    def get(self, telos_id: str) -> Telos | None: ...
    def version(self) -> str: ...                    # current hash

class AlignmentEngine(Protocol):
    async def evaluate(
        self,
        proposal: "ActionProposal",
        urgency_hint: float = 1.0,
    ) -> AlignmentResult:
        """Estimate fit per telos (Vaglio), compose expected_alignment,
        apply bother_cost, decide publish/reject/defer."""
        ...

class BotherBudget(Protocol):
    def current_cost_adhoc(self, channel: str, at: datetime) -> float: ...
    def scheduler_quota_left(self, channel: str, schedule_id: str) -> int: ...
    def record_published_adhoc(self, channel: str, proposal_id: UUID) -> None: ...
    def record_scheduler_firing(self, channel: str, schedule_id: str) -> None: ...
    def in_protected_window(self, at: datetime) -> bool: ...

class StopRecognizer(Protocol):
    """Recognises the stop clause in the user's words."""
    async def detect(self, user_text: str, current_intent: str | None) -> StopSignal | None:
        """Returns a StopSignal if the phrase is a clear stop;
        None if it is not; raises a confirmation if ambiguous."""
        ...

class TelosFeedback(Protocol):
    """Updates per-telos EMAs from user signals."""
    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_stop(self, signal: StopSignal) -> None: ...
    async def on_silence_48h(self, proposal_id: UUID) -> None: ...
    async def on_viewed_undecided(self, proposal_id: UUID) -> None: ...

# Errors
class TelosFileMalformed(Exception): ...
class TelosSignatureInvalid(Exception): ...
class TelosFitEstimationFailed(Exception): ...
class StopAmbiguousNeedsConfirm(Exception): ...

10. Revision rite

TELOS.md is not technically constitutional (the Laws are) but still deserves a light rite:

  1. Manual writing: the user edits TELOS.md with an editor.
  2. Validation: Metnos re-reads, re-checks the format, normalises the weights.
  3. Recap: Metnos answers with a comparison «here is what changes from the previous version: parsimony weight +0.05, added t.convivialita, etc.».
  4. Signature: HMAC-SHA256 with a dedicated key (separate from the constitutional one).
  5. Versioning: the new file includes the previous_hash of the previous one; the old one moves to .audit/telos/. Light Merkle.
  6. Soft EMA reset: telos that were renamed or removed lose their EMA; new ones start from 0. Telos that only changed weight keep their EMA.
Difference from the constitution. SOUL.md requires approval from Metnos + user (they are shared safety rules). TELOS.md requires only the user (they are his ultimate ends). But both are versioned and signed: the audit of the telos over time is as valuable as that of the Laws.

11. Alternatives considered

AlternativeOutcomeReason
No explicit TELOS, only implicit feedback discarded Cold start impossible: without declared telos, the first 50 proposals are random. The user rejects them all, the EMA collapses, the system goes silent.
Non-retreat telos as Law 4 of the Constitution discarded (25/4/2026) Breaks the grammar of Laws (negative prohibitions). The telos is a positive push, it belongs here. See Architecture ch. 11.
Reward function learned from a dataset discarded We have no dataset. A learned function is opaque: the user does not know what Metnos is optimising.
Hierarchical goal graph postponed Nested telos increase expressive power but break manual writability. 3-7 flat telos cover 90% of cases.
Single global threshold θ (no per-telos) partial Adopted as the final θ, but combined with per-telos thresholds (activation_threshold) to prevent low noise across many telos from summing up.
Online learning (continuous RL) discarded Risk of reward hacking, opaque to the user. EMA from explicit signals is enough.
Implicit stop (timeout) discarded The user might be distracted, not uninterested. Stop must be explicit or confirmed.

12. Conformance tests

CaseVerification
Missing TELOS.mdThe alignment function rejects every spontaneous proposal with reason="no_telos_declared". Metnos asks the user to fill the file.
Telos with non-normalised weightsSum renormalised to 1.0 at load. Warning in log. Not an error.
fit = 0 on all telosexpected_alignment ≤ 0 − bother_cost < θ: reject.
High fit only on a sub-threshold telosThe contribution is set to 0 by the gate. Reject unless another telos contributes.
Proposal close to a protected windowDefer to evening digest, not immediate publication.
Same proposal type rejected 3 times with «never again»The effect_class enters telos_neverlist: subsequent ones are auto-rejected without an LLM call.
Explicit user request that violates a «classic» telos (e.g. high spend with parsimony telos)The alignment function is not invoked. Anti-paternalism (ch. 8).
Request the pool cannot servesynt enters the cascade. The non-retreat telos is active. If the cascade fails, outcome is abandoned motivated (not cancelled).
User activates the stop clause mid-cascadeState moves to cancelled_by_user. EMA of t.coltivazione_strumenti drops by 0.7. The pattern is not retried within 24h.
Ambiguous stop («hmm let's see»)Metnos asks for confirmation: «do you want me to stop on X?». Does not interrupt on its own.
Scheduler firing in protected windowDeferred to next non-protected slot. Not published immediately, not discarded.
Scheduler firing outside the agreed cadence (exceptional event)Weighs 50% of an ad-hoc proposal's bother.
TELOS.md revision with a removed telosThe new file valid, the old one in .audit/telos/. The removed telos's EMA is discarded. Audit record with diff.
10 ad-hoc proposals in 1 hour via TelegramBother_cost grows exponentially; from the 4th on, reject (defer_to_digest) even with high expected_alignment.
R vs expected_alignment disambiguationA synt proposal with R = 0.85 but expected_alignment = 0.10 is not published: quality is not enough, the moment is wrong.

13. Open questions

  1. How many non-retreat telos. Today only one (t.coltivazione_strumenti). Will another ever be needed? For example, «don't leave a security warning unaddressed»? Open.
  2. «Recurrent» stop. If the user stops the same pattern N times in a row, should the system drop the weight of t.coltivazione_strumenti below the activation threshold and effectively disable the telos? Or stick to per-occurrence rejection? Open; conservative default: per-occurrence rejection.
  3. Scheduler thresholds. When are agreed schedules «too many»? Tentative default: max 2/day per channel, max 1 schedule alive at a time per same topic. To be calibrated.
  4. Telos linked to effect_class. A telos may block an entire effect class, not just individual proposals. The telos_neverlist mechanism today operates on the effect_class; possible future extension: link an effect_class to several telos at once. Open.
  5. Multi-user. When Metnos has more paired senders, will telos be per-user, shared, or a mix? Probably per-user with a shared minimum set (security, perimeter). To be decided.

14. References

Internal references

Literary and technical references


Continue reading

canonical
synt
The cascade that the non-retreat telos honours. R score disambiguated from expected_alignment.
canonical
executor
The artefacts synt produces and that telos evaluate at the moment of publication.
level 1
Architecture, ch. 11
Telos and Vaglio in the big-picture view.
index
Microdesign
All docs.

Metnos — telos microdesign v1.1 — 2026-04-25
Rewrite. Replaces telos v1.0 (myclaw, neurons, synapses). Without telos, proactivity is noise.