← Documentation index Architecture guide › changes

Metnos

Change lifecycle
One shared object for proposing, deciding, applying, and observing a change.

Sources that suggest an improvement do not modify Metnos directly. They translate the suggestion into a change_intent: a typed record with origin, target, rationale, score, and state. The /admin/changes page presents these records and keeps their progress visible.

Contents

  1. The shared object
  2. States and transitions
  3. Active sources
  4. Materialization, application, and observation
  5. What gets applied
  6. Natural-language example
  7. Guarantees and limits

1. The shared object

Records are stored in ~/.local/state/metnos/change_intents.sqlite. Their main fields are:

GroupContents
IdentityAn id and deterministic fingerprint for deduplicating equivalent proposals.
ProvenanceSource family, module, original identifier, and discovery time.
IntentClosed kind, target, summary, rationale, and kind-specific payload.
PriorityScore, confidence, and number of converging sources.
DecisionPerson, action, reason, and decision time.
OutcomeApplied effect, observed metrics, error, or rollback data.

The fingerprint excludes the source family. If two sources describe the same change, the upsert can merge them into one record and increase convergence without duplicating the action. A score is an ordering aid, not an authorization.

2. States and transitions

proposed  --accept--> accepted --apply--> applied
    |                       |                  |
    |                       +--error--> failed +--measure--> observed
    +--stage--> staged                              |
    +--reject--> rejected                           +--ok--> finalized
                                                   +--problem--> rolled_back

A staged proposal may return for review. A failed change may be retried or rejected. Rollback is terminal in the registry and performs a physical reversal when the change kind supports one. The state machine blocks arbitrary jumps: a proposal cannot become applied before it is accepted.

3. Active sources

The materializer reads four side-effect-free adapters:

SourceWhat it can produce
TelosExecutor creation or extension and a controlled pipeline trial, from actionable cluster heads.
IntrovertivaExecutor deduplication; it also preserves already-recorded states that must remain inspectable.
SyntExecutor-creation requests and their terminal or in-progress states.
User feedbackA proposal to reject a pattern after at least two consistent negative reports.

Adapters translate different storage formats into the same schema. They neither apply the change nor turn an automatic inference into human consent.

4. Materialization, application, and observation

TaskDefault frequencyResponsibility
change_intent_materializeDaily at 01:00Reads adapters, deduplicates by fingerprint, and updates the store.
change_applierEvery 10 minutesProcesses up to 20 accepted records and records either their effect or error.
change_observerDaily at 03:15Measures up to 200 applied or observed changes and decides whether to finalize or roll them back.

The default observation period is seven days and can be changed with METNOS_CHANGE_GRACE_DAYS. Criteria vary by kind: executor health, alias integrity, the result of the turn used to try a pipeline, or new feedback about a rejected pattern.

5. What gets applied

KindCurrent effectRollback
create_executorStarts executor synthesis; an existing executor is not duplicated.Archives the synthesized executor.
extend_executorExtends the manifest, stores a copy, and signs the executor again.Restores the stored manifest and re-signs it.
dedupe_executorsCreates an alias and retires the duplicate only when provenance permits it.Removes the alias and reactivates the duplicate.
materialize_pipelineRuns the proposed request once as a real turn, under normal policy and controls.Records rollback; the turn installs no persistent pipeline artifact to remove.
reject_patternAdds the approved pattern to the registry of paths to avoid.Removes the matching registration.
cache_patternRemains supported for compatible records already present in the store.Demotes the associated registration.

6. Natural-language example

Ask Metnos with a request like this example: “Show me the system changes waiting for my decision and explain the first one in plain language.”

Decisions are made in the web chat. If you are talking to Metnos through Telegram, open the web chat, enter the administration area, and choose Changes; the technical route is /admin/changes. The page can filter by state, source, and kind and offers only the transitions allowed for each record.

7. Guarantees and limits

Code references: runtime/change_intents.py, runtime/change_intent_adapters/, runtime/jobs/change_intent_materialize.py, runtime/change_applier.py, runtime/change_observer.py, runtime/change_rollback.py, and runtime/http_routes_admin.py.