19. Configuration
Wire limits and syntax constants are fixed by the specification. Operational defaults are local policy and are labelled as such. Implementations MUST respect the wire limits; they SHOULD expose operational policy rather than presenting one runtime’s defaults as interoperability law.
19.1 Protocol Constants
| Constant | Value | Notes |
|---|---|---|
| MAX_FRAME_SIZE | 1,048,576 bytes | Frames exceeding this MUST be rejected |
| MAX_CATEGORY_TEXT | 262,144 bytes | UTF-8 length of one category text after NFC (§8.8.6) |
| MAX_RECORD_TEXT | 524,288 bytes | Sum of the seven category texts (§8.8.6) |
| MAX_RECORD_BYTES | 737,280 bytes | RFC 8785 serialization of the two-section record; fits one sealed frame (§8.8.6) |
| HANDSHAKE_TIMEOUT | 10,000 ms | Inbound identification deadline |
| HEARTBEAT_INTERVAL | local policy | SYM reference default: 10,000 ms |
| HEARTBEAT_TIMEOUT | local policy | SYM reference default: 120,000 ms |
| WAKE_COOLDOWN | 300,000 ms | Default per-peer wake rate limit |
| RELAY_MIN_RATE | 25 messages/s | A relay that limits a client’s message rate MUST allow at least this, sustained (§4.4.4) |
| RELAY_MIN_BURST | 300 messages | A relay that limits a client’s message rate MUST allow at least this burst (§4.4.4) |
| RELAY_MIN_FANOUT | 64 entries | A relay that lists fanout MUST accept at least this many entries in one envelope (§4.4.4) |
| RELAY_ENVELOPE_ALLOWANCE | 4,096 bytes | A client MUST accept a delivered relay message of up to MAX_FRAME_SIZE plus this, for the from and fromName the relay adds (§4.4.4) |
| PEER_RETENTION | 300,000 ms | Stale peer eviction age (peer-registry eviction; see §5.5) |
| archiveAfterSeconds | profile-dependent | Inactivity window after which a validated CMB MAY decay to archived (§6.3–§6.4; implementation status §17.6) |
| MAX_DELEGATION_DEPTH | 4 | Longest grant chain below the anchor (depth 0); a deeper statement is invalid (§6.6.2) |
| ANCHOR_MAX_KEYS | 16 | Most keys in a pinned anchor set; its threshold t is configured with the pin, 1 ≤ t ≤ n (§6.6.1) |
| AUTHORITY_QUOTA | 256 statements | Kept per bucket authorised by a grant, its own and those its endorses rescue: revokes and endorses first, then grants, each by ascending id (§6.6.6) |
| AUTHORITY_ANCHOR_QUOTA | 4,096 statements | Kept in the anchor’s bucket, by the same rule (§6.6.6) |
| AUTHORITY_DELEGATE_QUOTA | 16 grants | Delegating grants (admin, validator, issuer) kept per bucket authorised by a grant, own and rescued (§6.6.6) |
| AUTHORITY_SCOPE_MAX | 256 characters | Longest grant scope (§6.6.2) |
| AUTHORITY_MAX_TARGETS | 64 | Targets one revoke or endorse may name (§6.6.3) |
| AUTHORITY_PAGE | 64 | Ids per authority-fetch, and statements per authority-set (§6.6.8) |
| AUTHORITY_PENDING_MAX | 64 per session | Pending statements held in memory per session while their chain is fetched (§6.6.8) |
| AUTHORITY_PENDING_TIMEOUT | 10,000 ms | A pending statement is released after this, or when its session closes (§6.6.8) |
| SELF_SELECT_THRESHOLD | 0.1 | Minimum own-store relevance for Ask self-selection (§12.10) |
| DNS-SD_SERVICE_TYPE | _sym._tcp | Service type for Bonjour discovery |
| DNS-SD_DOMAIN | local. | Discovery domain |
19.2 Agent Profiles
Each agent type has a pre-built configuration. The profile determines which CMB categories matter most (αf weights), how long signals stay relevant for SVAF evaluation (freshness), and how long remixed CMBs are retained in local storage (retention). New agent types join the mesh by defining their profile — no protocol changes needed.
Freshness and retention are different: freshness controls SVAF temporal drift (how quickly incoming signals become “stale” for evaluation). Retention controls how long the agent’s own remixed CMBs are kept in local storage. Regulated deployments SHOULD set retention according to their compliance obligations — deployment guidance, non-normative; consult counsel for the applicable regime.
| Profile | Best for | Freshness | Retention | Notes |
|---|---|---|---|---|
| music | Music, ambience | 30min | 24h | Old curations irrelevant. Mood changes fast. |
| coding | Coding assistants, dev tools | 2h | 7d | Session context fades. Weekly patterns useful. |
| fitness | Fitness, health, movement | 3h | 30d | Sedentary patterns need weeks of history. |
| messaging | Chat, notifications, social | 1h | 7d | Conversation context is short-lived. |
| knowledge | News feeds, research, digests | 24h | 30d | News is daily. Trends need monthly context. |
| legal | Legal, compliance, contracts | 24h | Per regulation | Set by jurisdiction. May require years or indefinite. |
| health | Health monitoring, clinical | 3h | Per regulation | Retention is jurisdiction-specific; consult compliance. |
| finance | Finance, trading, compliance | 2h | Per regulation | Retention is jurisdiction-specific; set per applicable regime. |
| uniform | General purpose, prototyping | 30min | 7d | Good starting point. Adjust to your domain. |
19.3 CAT7 category weights (αf)
Per-agent category weights control which CMB categories matter most for each agent type. Higher weight = this category has more influence on SVAF evaluation and remix relevance. The schema is fixed (7 categories). The weights are per-agent.
| Agent | foc | iss | int | mot | com | per | mood |
|---|---|---|---|---|---|---|---|
| Coding | 2 | 1.5 | 1.5 | 1 | 1.2 | 1 | 0.8 |
| Music | 1 | 0.8 | 0.8 | 0.8 | 0.8 | 1.2 | 2 |
| Fitness | 1.5 | 1.5 | 1 | 1.5 | 1 | 1 | 2 |
| Knowledge | 2 | 1.5 | 1.5 | 1 | 0.5 | 1.5 | 0.3 |
| Legal | 2 | 2 | 1.5 | 1 | 2 | 1.5 | 0.5 |
| Health | 1.5 | 2 | 1 | 1.5 | 1 | 1.5 | 2 |
| Finance | 2 | 2 | 1.5 | 1 | 2 | 2 | 0.3 |
Regulated domains (legal, finance): issue and commitment always
high — risks and obligations are non-negotiable. Human-facing domains (music, fitness, health):
mood always high — affect drives the experience.
Knowledge domains (coding, research): focus always high — subject matter is core.
Custom weights: derive from your domain using these patterns. Implementations SHOULD expose category weights as configuration, not hardcode them.
19.4 SVAF Drift Thresholds
SVAF computes a totalDrift score (0–1) for each incoming
memory. Three zones determine acceptance:
| Zone | Drift | Action | Default |
|---|---|---|---|
| Redundant | max(δf) < Tredundant | Discarded — no category carries novel content | 0.10 |
| Aligned | δtotal ≤ Taligned | Accepted, full blending | 0.25 |
| Guarded | Taligned < δtotal ≤ Tguarded | Accepted, attenuated blending | 0.50 |
| Rejected | δtotal > Tguarded | Discarded — irrelevant domain | — |
Defaults work for most agents. Override only with domain-specific reason: tighter thresholds for high-precision domains (legal, health), wider for exploratory domains (research, knowledge).
19.5 Mood vs Memory Thresholds
Mood and memory use different acceptance paths:
| Signal | Gate | Default | Why |
|---|---|---|---|
| CMB (cmb) | SVAF per-category drift | 0.50 (selective) | Full CMB acceptance — domain-specific |
| Mood category | Extracted from rejected CMBs | Always delivered | Affect crosses all domain boundaries (Section 9.3) |
19.6 Drift Formula
totalDrift = (1 - λ) × fieldDrift + λ × temporalDrift fieldDrift = Σ(α_f × δ_f) / Σ(α_f) temporalDrift = 1 - exp(-age / τ_freshness) λ = temporalLambda (default 0.3 = 70% content, 30% time)
At default settings (temporalLambda: 0.3, freshnessSeconds: 1800):
| Signal age | Temporal drift contribution |
|---|---|
| 1 minute | ~0.01 — negligible |
| 30 minutes | ~0.19 — noticeable |
| 2 hours | ~0.29 — likely pushes over threshold |