settings contract changes

Mirrored from libs/settings/CHANGELOG.md, where releases update it. The component's page is settings. This page describes the current main branch of MixOS.

Unreleased

Additive, store format unchanged: the mail options email.mail.quote_on_reply (boolean, default true) and email.mail.reply_position ("above" or "below", default "above"), which the email app's Reply now reads instead of fixed values. Omitted at their defaults, so existing profiles are unchanged.

0.8.0

Additive, store format unchanged (3):

  • Desktop.email (email::Email): the email app's JMAP accounts (email.accounts, replaced whole, in tree order: id, name, url, email, ca_path, enabled, signature), email.default_account and the mail options email.mail.page_size (10–500, default 100), mark_read_on_open and confirm_delete (both default true). Omitted at its defaults, so older profiles keep their seals; it does not touch Effective. A profile that sets any of it will not load in a 0.7.0 build: reset email first.
  • Nothing in it is secret: an account has no password field and every record refuses unknown keys, so settings.apply refuses an account that carries password.
  • Summary.email and Followed::Look.email carry it to followers; email::from_snapshot, email::from_summary and Email::from_account read it; email::mint_account_id mints a new unique acct- id.
  • settings.describe lists each email.* path; email alone resets or replaces the whole group.

0.7.0

Additive, store format unchanged (3):

  • Desktop.terminal (terminal::Terminal): the term's preferences under terminal.* (font family/size/weight, padding, scrollback lines, scroll speed, border width, cursor shape/blink, focus ring/strength, copy on select, TERM). Every default reproduces the term before the group existed except padding (8 px instead of 1 px) and the focus ring: its default, accent at strength 0.25, draws the focused pane's border as the card border moved a quarter toward the theme accent, where the term drew it halfway before. That change is intentional (a subtler tinted ring); neutral remains available, and accent with strength 0.5 gives the old look. Omitted at its defaults (and each value within it), so older profiles keep their seals. It does not touch Effective, as keymaps does not. A profile that sets any of it will not load in a 0.6.0 build: reset terminal first.
  • Summary.terminal and Followed::Look.terminal carry it to followers.
  • settings.describe lists each terminal.* field with its range and default; terminal alone resets or replaces the whole group.
  • terminal: null resets the whole terminal group, as advertised.
  • Correct the scroll speed unit: rows per wheel line, scaled by speed/40; touchpad travel counts in cell heights at that scale. Default 40 keeps the existing one-row-per-wheel-line behaviour; it is not a pixel distance.

0.6.0

Additive, store format 3 (decision):

  • Appearance and Effective gain four optional session choices: icon_stroke (1.0 to 3.0 in quarter steps), font_family, font_weight (100 to 900 in steps of 100) and mono_family. Each is omitted when unset, so profiles without them keep their digests.
  • ChangePlan: icon_stroke is a paint change; the font choices are resource and text changes.
  • CompactEffective carries the same fields.
  • The store writes format 3. A format-2 build refuses a profile that sets any of them; reset them first with settings.reset or a null value.

Rust API change: Followed::Look.appearance is now Box<Appearance> to keep follower events compact as font settings grow. Borrowed callers use deref coercion; callers that take ownership unwrap with *appearance.

0.5.0

Authority verbs 0.3.0 (additive): snapshot schema 2 (decision).

  • compact: CompactSnapshot (schema 2) sends each distinct design projection once under designs, keyed by digest; each context's design names one. encode builds it; decode reads schema 1 or 2 into the same in-memory Snapshot, so consumers, reducer, cache and effective digests are unchanged. A dangling or unnamed design is refused.
  • compact_topic(profile) / COMPACT_TOPIC_PREFIX: the retained schema 2 topic, settingsd.desktop.compact.<profile>, published between the schema 1 topic and the summary.
  • Breaking: ReadRequest.schema (1 by default and never serialised; 2 for the compact form) on settings.get and settings.appearance.get. Another schema is refused with unsupported_schema.
  • native follows the compact topic and reads schema 2. Consumers on the schema 1 topic are not affected.
  • describe() lists the snapshot schemas and the compact topic.

0.4.0

Authority verbs 0.2.0 (additive), snapshot schema still 1 (decision):

  • Summary (schema 1): binding, incarnation, revision, design revision, source digest, appearance names and custom_source; never projections or a custom source. summary_topic(profile) / SUMMARY_TOPIC_PREFIX name its retained topic, settingsd.desktop.summary.<profile>, published beside the snapshot topic.
  • ReadRequest.view (View::Full, the default and never serialised, or View::Summary) selects settings.get's answer.
  • follow::Follower subscribes to the summary topic and reads the summary view. Breaking: Followed::Look gains custom_source, and its appearance.source is always None.
  • describe() lists the read views and both topics.

The cache interpretation includes the library version, so caches written by 0.3.x fall back visibly once.

0.3.5

Add the appearance keys appearance.style (null, the default, takes the scheme's own style; else plain, pro, studio or classic), appearance.decorations (csd, the default, or ssd) and appearance.caption_side (right, the default, or left). They resolve into every effective context; a style change is a paint and layout change and a decorations or caption-side change a layout change. Older desktops and snapshots load with the defaults. Authority verbs/schema remain 0.1.0/1.

0.3.4

Expose the public snapshot identity of an activated cache capture so hosts can report fenced persistence receipts without copying its projection or private producer serial. Authority verbs/schema remain 0.1.0/1. The cache interpretation includes the library version; older caches fall back visibly without affecting authority history.

0.3.3

Add immutable cache targets for borrowed workers, capture deduplication and producer-fenced writer opening. Add lazy persistent fallback loading after retained resource validation, preserving load diagnostics when embedded works. Authority verbs/schema remain 0.1.0/1. Older presentation caches are rejected because the cache interpretation includes this library version.

0.3.2

Expose shared consumer evidence with separate accepted and applied identities, connection generation, confirmation, presentation kind and faults. Readback never claims frame presentation or broker participant registration. Authority verbs and snapshot schema remain 0.1.0 and 1.

0.3.1

Split authenticated native delivery decoding from UI consumer handling, retaining binding/generation fences in the decoded value. Add shared session binding and capture identity predicates for coalesced resource scheduling. Authority wire contract/schema remain 0.1.0/1. The cache interpretation includes this crate's version, so older local presentation caches are rejected and embedded defaults remain available; authority persistence is unaffected.

0.3.0

Add shared retained/cache/embedded fallback preparation with host resource validation, immutable stage fencing and explicit presentation labels. Persisted data never seeds authority ordering or mutation fences. Optional cache I/O uses bounded no-follow directory-relative reads and atomic replacement, with schema/target/capability/digest checks plus complete projection recompilation. Applied-generation captures and one locked serial writer reject stale saves; ambiguous post-rename failure remains visible. Exact JSON float round trips preserve compiler projection comparison. The authority wire/schema stay 0.1.0/1. Real resource loading, GUI/first-map timing and artifact integration remain pending. Keep fallback preparation/activation faults separate from authority/current resource faults, and detect unsupported cache headers before strict body parsing.

0.2.0

Add transport-neutral consumer and render-domain change plan, with an optional native executor over an app-owned supervised connection. Bound work/buffering, coalesce queue-loss recovery, fence connection/consumer/renderer completions, and advance unchanged render evidence without a redraw. Retired confirmation candidates are deduplicated within a bounded history. No owned runtime or renderer dependency. Authority wire contract/schema remain 0.1.0/1. Use canonical app/shell constructors, captured read baselines/tickets and one absolute recovery deadline. Malformed-event storms cannot bypass the deadline; same-incarnation rollback is distinct from a read racing a newer publication. DTO additions require explicit render/evidence classification at compile time. Persisted fallback cache, artifact/resource preparation and GUI activation are still pending; this API does not advertise their completion.

0.1.0

Initial binding/revision/receipt/snapshot types, independent design read projection, validated batch vocabulary and ordering/work-ticket reducer. Renderer transport/bootstrap adapters remain pending. Before initial release: report confirmed same-revision contradictions and validate authored app enum values before accessibility precedence.

This page as Markdown · This page describes the current main branch of MixOS.