# Configuration Reference [简体中文](../../zh-CN/reference/configuration.md) | **English** | [Documentation Center](../README.md) ## Configuration Location and Activation The plugin registers the `mnemon` namespace with the DSH settings service. User configuration is stored in: ```text $DSH_HOME/settings.yaml ``` The default is commonly `~/.dsh/settings.yaml`. All current settings are marked `live`; after Save, the Host initializes a candidate runtime graph and then switches to it atomically. The Web settings page edits `storageScope`, the independent `runtimeUserScope`, `dataDir`, Mnemon Native's Ollama embedding override, one master switch for each of the three memory Sources, the background task Agent model route, and the Turn memory and Save-to-memory switches under `mnemon-ui`. The scope selector applies to the complete memory system. Centralized workspaces exposes its optional root beside that selector; the USER.md profile may explicitly remain global while project memory follows the selected scope. Mnemon Native owns its Custom data location, embedding runtime, and ZIP backup/migration controls. Each external provider has a collapsible service configuration for reusable endpoints, credentials, or executables. Enabling or saving it discovers the provider's existing namespaces and maps them into Memory Spaces → Overview; disabling it removes those local mappings without deleting provider data. Other advanced settings must be changed directly in YAML. ## Complete Example ```yaml mnemon: storageScope: global # global | workspace | custom | workspaces runtimeUserScope: storage # storage | global # dataDir: ~/mnemon-data # required for custom # cliPath: /opt/homebrew/bin/mnemon # store: legacy-store # compatibility discovery hint, not a regular routing target timeoutMs: 10000 defaultRecallLimit: 10 runtimeMemory: memoryLimitBytes: 10240 userLimitBytes: 4096 maintenanceMaxTokens: 8192 embedding: enabled: false endpoint: http://localhost:11434 model: nomic-embed-text memoryTopology: layers: runtime: { enabled: true } documents: { enabled: true } memory-spaces: { enabled: true } recallQuality: policy: strict-v1 lowScoreThreshold: 0.25 highScoreThreshold: 0.6 candidateMultiplier: 3 maxMediumResults: 4 maxUnknownResults: 2 routingGuidance: true lifecycleEnabled: true recallMode: guided writebackMode: guided idleReviewMs: 30000 idleReview: enabled: true provider: spawn fallback: spawn minIntervalMs: 300000 maxPerSession: 20 maxContextChars: 24000 maxTokens: 4096 tabEnabled: true writeEnabled: true taskAgentModel: mode: inherit # inherit | fixed # provider: deepseek # required for fixed # model: deepseek-chat # required for fixed remoteAccess: read-only # remote management: read-only | trusted-host ``` ## Options | Setting | Default | Range | Implementation Semantics | |---|---:|---|---| | `storageScope` | `global` | `global` / `workspace` / `custom` / `workspaces` | Controls the root for Runtime, Documents, Memory Spaces, and reserved state as one unit | | `runtimeUserScope` | `storage` | `storage` / `global` | Keeps USER.md in the selected storage root, or overlays the global USER.md while project MEMORY.md and the other layers stay selected-scope | | `dataDir` | unset | absolute path, `~`, or `~/...` | Required for `custom`; optional central root for `workspaces`; legacy configurations that set only this option automatically resolve to `custom` | | `cliPath` | auto-discovered | executable path | Explicitly selects the Mnemon CLI | | `store` | unset | `[A-Za-z0-9][A-Za-z0-9_-]*` | Compatibility discovery/preference hint for legacy Stores; semantic operations are routed through Memory Spaces | | `timeoutMs` | `10000` | 100–120000 ms | Hard timeout for a single CLI call | | `defaultRecallLimit` | `10` | 1–50 | Default recall count for the service and UI; individual entry points may impose a lower limit | | `runtimeMemory.memoryLimitBytes` | `10240` | 1–1048576 bytes | UTF-8 byte limit for the complete `MEMORY.md` projection | | `runtimeMemory.userLimitBytes` | `4096` | 1–1048576 bytes | UTF-8 byte limit for the complete `USER.md` projection | | `runtimeMemory.maintenanceMaxTokens` | `8192` | 1–1000000 tokens | Completion-token budget for Runtime migration and compaction workers; does not change Document archive or metadata-maintenance budgets | | `embedding` | `{ enabled: false, endpoint: http://localhost:11434, model: nomic-embed-text, apiKey: '', protocol: auto }` | enabled + HTTP(S) endpoint + model + optional apiKey + protocol (auto/ollama/openai) | When enabled, the Host injects the saved endpoint, model, API key, and protocol override into every Mnemon CLI child process; an endpoint ending in `/v1` makes Mnemon use the OpenAI-compatible protocol with the API key as a Bearer token, and `protocol: openai` forces it for non-`/v1` endpoints; when disabled, existing Host environment and Mnemon defaults remain untouched | | `memoryTopology.layers..enabled` | `true` for the three defaults | boolean | Whether the Source participates; disabling never deletes or migrates existing data | | `recallQuality.policy` | `strict-v1` | registered policy id | Deterministic policy applied before recall content is serialized to an Agent or client | | `recallQuality.lowScoreThreshold` | `0.25` | 0–1, below high threshold | Normalized scores below this boundary are removed by `strict-v1` | | `recallQuality.highScoreThreshold` | `0.6` | 0–1, above low threshold | Retained normalized scores at or above this boundary are labeled high relevance | | `recallQuality.candidateMultiplier` | `3` | 1–5 | Expands each Provider request before filtering, capped by the service limit of 50 candidates | | `recallQuality.maxMediumResults` | `4` | 0–50 | Maximum medium-relevance rows admitted by `strict-v1` after all high-relevance rows | | `recallQuality.maxUnknownResults` | `2` | 0–50 | Maximum unscored or unknown-scale rows admitted by `strict-v1` after scored evidence | | `routingGuidance` | `true` | boolean | Whether to register an additional tiered-routing system section | | `lifecycleEnabled` | `true` | boolean | Whether to enable the pre-step cue and score-based background review | | `recallMode` | `guided` | `guided` / `off` | Whether to inject one durable on-demand recall cue per session; does not remove explicit recall | | `writebackMode` | `guided` | `guided` / `off` | Whether to inject one durable hot-memory cue per session and enable scored, dirty-admitted background review; does not remove explicit writes | | `idleReviewMs` | `30000` | 5000–600000 ms | Required continuous idle time after the threshold is reached | | `idleReview.enabled` | `true` | boolean | Independent automatic-review switch | | `idleReview.provider` | `spawn` | `spawn` / `fork` | Bounded checkpoint or inherited parent context | | `idleReview.fallback` | `spawn` | `spawn` / `skip` | Missing/incompatible fork handling before startup only | | `idleReview.minIntervalMs` | `300000` | 5000–86400000 ms | Minimum interval between attempts | | `idleReview.maxPerSession` | `20` | 0–200 | Attempt cap per loaded parent Agent; includes failures/cancellations | | `idleReview.maxContextChars` | `24000` | 1000–1000000 | Spawn checkpoint character limit | | `idleReview.maxTokens` | `4096` | 128–131072 | Per-response model output limit | | `displayMode` | `sidebar` | `sidebar` / `builtin`; legacy `buildin` accepted | Entry placement: standalone Sidebar or a conversation tab using the same workspace UI; legacy spelling is migrated to `builtin` | | `tabEnabled` | `true` | boolean | Whether to mount the selected entry and workbench; Host RPC, commands, and Agent tools remain registered when off | | `writeEnabled` | `true` | boolean | Whether to expose semantic write tools, write RPC, and write commands | | `taskAgentModel` | `{ mode: inherit }` | `inherit` / `fixed` | Model route for independent task Agents used by AI metadata, Agent Query, memory distillation, and Document archiving, plus the idle-review worker; `fixed` requires both `provider` and `model` and also pins their bounded workers for write, answer, provider placement, migration, compaction, archive, and metadata maintenance. Conversation Recall and Related are direct Host reads and do not use this route | | `remoteAccess` | `read-only` | `read-only` / `trusted-host` | Startup-only grant for non-loopback Mnemon management; enforced by the API Gateway projection and retained for legacy DSH 0.1.1-rc.2 channels | | `mnemon-ui.turnBar` | `true` | boolean | Turn-tail memory activity bar; on by default, **applies live after saving** | | `mnemon-ui.saveAction` | `true` | boolean | “Save to memory” icon and confirmation on finalized assistant replies; on by default, **applies live after saving** | Both the `mnemon` Host/storage namespace and the `mnemon-ui` browser-presentation namespace apply live. The storage root switches atomically only after the new runtime graph initializes successfully. Legacy `mnemon.conversationInteraction` values remain a migration default, but new saves write only to `mnemon-ui`. ### Runtime Memory budgets Long conversations can raise the two hot-memory byte limits and the bounded migration/compaction worker budget without patching generated package files: ```yaml mnemon: runtimeMemory: memoryLimitBytes: 20480 userLimitBytes: 10240 maintenanceMaxTokens: 32768 ``` The defaults preserve the released 10240 / 4096 / 8192 behavior. Saving the block builds a new runtime generation, so subsequent Runtime reads, writes, capacity maintenance, and Mnemon Pack validation use the same limits. Existing entries and the `memories.json` format are unchanged. Lowering a byte limit below current usage does not delete data; the Runtime view reports the over-capacity state and further writes require compaction or a higher limit. Rollback only requires removing the block or restoring the defaults. These separate Light captures show the same 20 imported Runtime entries under v0.5.4. The first uses default USER 4 KB / MEMORY 10 KB limits; the second shows the saved USER 10 KB / MEMORY 20 KB configuration. Both filter the list to the two User Profile entries. The disposable environment was restored to its defaults after capture. ![Default USER 4 KB and MEMORY 10 KB limits](../../assets/webui-v0.5.4/en/runtime.jpg) ![Configured USER 10 KB and MEMORY 20 KB limits with unchanged imported data](../../assets/webui-v0.5.4/en/runtime-configured.jpg) ### Mnemon Native embeddings Finder- and Dock-launched macOS applications do not normally inherit interactive shell startup files. Enable **Manage embedding settings in DSH** under Mnemon Native to make the saved values authoritative for every Mnemon child process instead: ```yaml mnemon: embedding: enabled: true endpoint: http://127.0.0.1:11434 model: qwen3-embedding:0.6b ``` For an OpenAI-compatible server, point the endpoint at its `/v1` base URL; Mnemon automatically switches from the Ollama protocol to the OpenAI protocol (`/v1/embeddings`). Fill in `apiKey` for services that require authentication; it is sent as a Bearer token. For compatible endpoints that do not end in `/v1`, set the protocol explicitly with `protocol: openai`: ```yaml mnemon: embedding: enabled: true endpoint: http://127.0.0.1:8080/api model: bge-m3-mlx-8bit apiKey: sk-... protocol: openai ``` The Host copies its normal process environment and then overwrites `MNEMON_EMBED_ENDPOINT`, `MNEMON_EMBED_MODEL`, `MNEMON_EMBED_API_KEY`, and `MNEMON_EMBED_PROTOCOL` for the child only (`protocol: auto` injects no protocol variable and leaves Mnemon's `/v1` auto-detection in charge). It does not modify the desktop session, `launchctl`, shell files, or Mnemon's persisted data. Saving swaps to a new runtime graph, so later calls use the new values without restarting DSH. With `enabled: false` or an omitted `embedding` block, dsh-mnemon supplies no override: inherited variables and Mnemon's built-in defaults keep their previous behavior. `MNEMON_EMBED_DIMENSIONS` remains an advanced inherited environment setting. The endpoint must be an absolute HTTP(S) URL without credentials, query parameters, or a fragment. Mnemon sends memory and query text to this service; the API key is stored in the DSH settings file like other settings, and a remote plain-HTTP endpoint exposes that text in transit, so use a trusted loopback endpoint or HTTPS. **Test status** runs the effective `mnemon embed --status` command for the current default Store and reports embedding-server reachability, model, the resolved protocol when Mnemon reports one, and embedding coverage without backfilling or changing memories. Save pending edits before testing so the check cannot claim an unsaved value is active. ### Memory Source switches Each Source has one master switch. `enabled=true` permits the default strategy to use the Source when needed; it does not force recall or writes on every turn. `enabled=false` stops that Source's context injection, model calls, background processing, and data-plane Web/RPC operations together. [![The v0.5.4 Light settings page gives each default Memory Source one master switch](../../assets/webui-v0.5.4/en/settings-layers.jpg)](../../assets/webui-v0.5.4/en/settings-layers.jpg) Disabling is reversible routing state, not deletion. The corresponding Sidebar tab remains visible with an Off badge and does not read the data plane; Status, Catalog, and management directories remain observable. Re-enabling uses the original directories and data. [![The actual English Sidebar after disabling Documents: its tab remains while data is neither read nor deleted](../../assets/webui-v0.5.4/en/documents-disabled.jpg)](../../assets/webui-v0.5.4/en/documents-disabled.jpg) The WebUI reads Source instances from the live management catalog; no frontend enum is required for a new Source. The existing `memoryTopology.layers` keys remain configuration input, not a second Source runtime. Source type ids select configuration; a Strategy selects exact instance keys. Settings update under a revision fence, and candidate compilation must succeed before replacement. Core and Source boundaries recheck capability, scope and current authority. ### Recall quality policies `strict-v1` is the Agent-safe default: for Providers that explicitly declare a normalized 0–1 relevance score, non-positive and below-threshold rows are removed before their content reaches an Agent. It then returns every high-relevance row up to the requested limit, at most four medium-relevance rows, and at most two unscored or unknown-scale rows by default; it does not fill the result limit with weaker evidence. `balanced-v1` retains low-score rows only after primary evidence, and `exhaustive-v1` preserves finite scored rows for direct inspection. An out-of-range score is treated as unknown-scale instead of being fabricated into a confidence value. Cross-provider ordering continues to use reciprocal-rank fusion. These pure recall-quality policies belong to the Memory Spaces Source. Configuration selects a policy ID shipped by that Source. Its internal registration function is not a public plugin API; custom retrieval belongs behind the public Source/Provider contracts. Invalid limits, decisions, or selections fall back to `strict-v1`; an unknown configured id rejects the candidate runtime graph. Filtering counts are returned as structured `source.quality` statistics and are not appended to Agent hints. ### Browser authentication Legacy channel registration supports the stable DSH 0.1.2-rc.1 baseline, its alpha.5 predecessor, and the previous 0.1.1-rc.2 line. Mnemon supplies the trailing authority object required by rc.2; the 0.1.2 two-argument JavaScript implementation naturally ignores that argument. The remote Gateway projection applies its management grant separately. DSH owns browser authentication or pairing and Host/Origin validation. Since dsh-mnemon v0.5.5, remote pages use the namespaced API Gateway; local loopback clients retain legacy channels. Mnemon's Gateway projection separately enforces `remoteAccess`: `read-only` allows ordinary reads, narrow activation and settings inspection, but rejects writes, ZIP operations, View mutations and settings changes. Settings snapshots report `writable: false` without the `trusted-host` grant. Restart DSH after changing this startup-only policy. DSH `trustedHosts` does not replace HTTPS or deployment access controls. On DSH 0.1.1-rc.2, `remoteAccess` remains a real startup security boundary and cannot be changed through Web settings. The default `read-only` mode keeps settings, ZIP backups, Provider connections, and broad mutations loopback-only; `trusted-host` promotes all three management channels together and must be used only behind reliable deployment authentication. `writeEnabled=false` is a product-level read-only mode on every supported version; it is not a substitute for transport authentication. For the complete proxy, launch-token, trusted-authority, rc.2 rollback-patch, restart, and verification workflow, see [Cloud-hosted WebUI](../guides/operations.md#cloud-hosted-webui). ## Storage Scopes ### `global` ```text MNEMON_DATA_DIR when non-empty otherwise ~/.mnemon ``` Suitable for users who want Runtime, Documents, and Memory Spaces shared across multiple workspaces. Other Mnemon-enabled agents can also share the Mnemon Memory Spaces when they use the same root. ### `workspace` ```text Agent / tool / lifecycle: resolve(currentSession.header.cwd, ".mnemon") Web workbench inspection: resolve(workspaceRegistry.get(selectedWorkspaceId).path, ".mnemon") ``` Each DSH workspace owns an independent three-tier memory root. Conversation Agents, model tools, commands, and lifecycle hooks route by the current session cwd. Independent task Agents launched from the Web workbench instead use the selected Host-registered workspace explicitly; the browser can never submit an arbitrary path. AI metadata, Agent Query, memory distillation, and document archiving therefore target the workspace selected at the top left even when no main session is selected. Headless has no `workspaceRegistry`; its fresh session cwd is the directory from which `dsh --profile headless ...` was launched, so `workspace` resolves directly to `/.mnemon`. ### Global USER.md with workspace project memory To share user-level collaboration requirements across repositories while keeping project facts isolated, select **Workspace** plus **Global user profile**, or configure: ```yaml mnemon: storageScope: workspace runtimeUserScope: global ``` Each turn then projects `USER.md` from the global root (`MNEMON_DATA_DIR` when set, otherwise `~/.mnemon`) together with `MEMORY.md` from `/.mnemon`. `target=user` mutations and local USER.md compaction go only to the global source; `target=memory`, Documents, Memory Spaces, and Provider state remain workspace-scoped. Global MEMORY.md and workspace USER.md entries stay intact on disk but are not projected in this mode. Changing this setting never copies, merges, or deletes entries. Switching back to `runtimeUserScope: storage` reveals the selected root's original USER.md again. A Mnemon Pack still represents one selected storage root, so a workspace Pack does not silently include the separate global USER.md; back up the global root separately when that profile is important. ### `workspaces` This built-in mode is available with the Starter; no additional plugin is required. Select **Centralized · isolated by workspace** in Memory scope; configure its optional **Central root directory** in the same section. ```yaml mnemon: storageScope: workspaces dataDir: ~/central-memory # optional; otherwise MNEMON_DATA_DIR or ~/.mnemon runtimeUserScope: global # optional; share only USER.md ``` All four areas (`runtime`, `data`, `documents`, `state`) live under `/workspaces//`. Existing symlink aliases resolve to the same ID; different workspace paths remain isolated. A move or rename selects a new ID, with no automatic migration. Sidebar inspection follows the selected registered workspace; Builtin and Headless follow the owning session cwd. Global USER.md still uses `MNEMON_DATA_DIR` or `~/.mnemon`, even when the central root is customized. Changing scopes never migrates, merges or deletes an old root. A ZIP Pack still contains only the selected workspace root; back up the whole central directory to preserve all workspaces. Remote Provider namespaces retain their own sharing semantics. ### `custom` ```yaml mnemon: storageScope: custom dataDir: /absolute/path/to/mnemon-data ``` `~` and `~/...` are also allowed. Relative paths are rejected. ### Choose a Cross-Agent Sharing Scope | Goal | Recommended scope | Notes | |---|---|---| | Share durable memory among local agents | `global` | Every participant uses `~/.mnemon` or the same `MNEMON_DATA_DIR` | | Share one explicit data root | `custom` | Every participant configures the same absolute directory for isolation and backup | | Share only inside one project | `workspace` | Every participant aligns its Mnemon root to that project's `/.mnemon` | Mnemon Native interoperates with other Mnemon-enabled agents through `data//mnemon.db`; third-party engines interoperate through their configured provider scope. Runtime, Documents, DSH activation state, and UI metadata remain managed by dsh-mnemon. See [Long-term memory providers](../guides/memory-providers.md). External service settings, Memory Space scope settings, and secrets are stored in `state/memory-providers.json` under the selected scope root, not in `settings.yaml`. Multiple Memory Spaces reuse one provider service configuration; the Host merges both layers only at runtime. The Mnemon Native ZIP contains only Runtime, Documents, and native Memory Spaces; external service data, credentials, and local third-party stores are excluded. ## CLI Discovery Precedence ```text config.cliPath -> executable MNEMON_CLI_PATH -> each PATH directory -> Windows: GOBIN/mnemon.exe first GOPATH/bin/mnemon.exe, or ~/go/bin/mnemon.exe %LOCALAPPDATA%/Programs/mnemon/mnemon.exe %ProgramFiles%/mnemon/mnemon.exe -> Unix: ~/.local/bin/mnemon /opt/homebrew/bin/mnemon /usr/local/bin/mnemon /usr/bin/mnemon ``` An explicit `cliPath` accepts either a path or a command name on PATH (for example, `mnemon`). Status checks and execution share the discovery rules and recognize CLI installation/removal on recheck without restarting DSH. If the explicitly configured command is unavailable, calls report a launch error rather than silently selecting another CLI. Windows discovery accepts regular `.exe` files and the verified official npm `mnemon.cmd` launcher. npm launchers are invoked through Node without a shell; arbitrary `.cmd` and `.bat` wrappers remain excluded. After migrating to npm, update any explicit CLI override to the npm launcher and verify the executable path in **Status → Check versions**. ## Compatibility Store Hint Precedence ```text config.store -> MNEMON_STORE -> /active -> default ``` After the Memory Space directory has been established, long-term semantic operations use explicit Memory Space IDs and do not rely on the global active Store for routing. ## Background Task Agent Model Route AI metadata, Agent Query, workbench/conversation memory distillation, and document archiving create a clean independent top-level task Agent. It uses the selected workspace as its cwd, works even when no main Agent session is selected, and is disposed after the task finishes. The default `inherit` mode first uses the DSH Provider / Model selected for new sessions, then falls back to a complete route from the current available main Agent. Choosing **Choose model provider** in Settings stores a complete Provider + Model and overrides only Mnemon background tasks; it does not change the conversation Agent. When semantic judgment requires a bounded worker inside that task Agent, the worker inherits the task Agent route. ```yaml mnemon: taskAgentModel: mode: fixed provider: deepseek model: deepseek-chat ``` DSH 0.1.1-rc.2 includes each model's declared input modalities in the live catalog. dsh-mnemon preserves that metadata and labels image-capable choices as **Image input**; the 0.1.1 prerelease line's first-party image-capable entry is `deepseek-official/deepseek-v4-flash-vision-exp`. Selecting it does not make current Mnemon background jobs ingest images: AI metadata, Agent Query, distillation, smart selection, and Document archive still submit text and bounded evidence. In the main conversation, DSH-owned image blocks keep their durable attachment references when dsh-mnemon appends lifecycle guidance, while activity thresholds count text blocks only. Raw image bytes are not copied into Runtime, Documents, or Memory Spaces. ## Provider Requirements Regular workers prefer `spawn`. If no provider has that name, another provider with all of the following capabilities can be selected: ```text toolFilter = true persona = true depthLimit = true ``` Background review defaults to a non-inheriting `spawn` provider and an explicit, bounded checkpoint from the parent's current public surface. It includes whole visible text messages and successful tool results; omitted or unavailable context is not reconstructed. `idleReview.provider: fork` retains full-parent-context review and requires `inheritsParentContext=true`. If fork is missing or incompatible, `idleReview.fallback` chooses `spawn` or `skip` before startup. A started run is never retried through another provider. Review requires local child publication, `agents.isOwnedBy`, and `agent.ctx.tools.guard`; the guard also blocks unrelated own-scope plugin tools and Code Mode subcalls. `maxContextChars` bounds the spawn checkpoint, while `maxTokens` limits each model response, not the inherited fork input or total multi-step usage. `idleReviewMs` remains the continuous-idle debounce. A separate `minIntervalMs` spaces attempts, including failures and cancellations. `maxPerSession` caps attempts for the loaded parent Agent, including across context clear/compact notifications; zero suspends review. Restarting the Host or unloading/reopening the Agent starts a new in-memory budget. Completed runs are disposed through DSH's public API. Persisted session history is retained: the published Host provides no plugin-scoped archive/TTL contract, and Mnemon never deletes session files or other plugins' agents. **Known composition limitation:** the published DSH 0.1.5-rc.2 with experimental Agent Teams 0.1.5-alpha.2 tools installs a Team policy before either fork or spawn publishes its descriptor. Both providers can then fail with `TEAM_NOT_MEMBER`. Mnemon checks the public `agentTeams` service and scoped `spawn_teammate` capability and pauses automatic review before creating a child. The workspace explains the pause. TeamService alone does not trigger it; after Team tools are removed, the next eligible completed turn can schedule review. This does not change recall, writeback, or manual-operation settings and does not repair upstream manual delegation. Failed reviews remain failures. The workspace shows the child run id and committed mutation receipt metadata when writes happened before failure, including a committed inner tool followed by a failed Code Mode wrapper. No rollback or automatic replay occurs. Inspect the run and the listed document ids or Runtime revisions before any manual retry. A later review still respects the cooldown and session budget. To disable only this maintenance pass, set `idleReview.enabled: false` in Settings or configuration. ## Read-Only Configuration ```yaml mnemon: writeEnabled: false ``` Effects: - Model write tools are not registered; - write and activation RPCs remain registered, with memory mutations rejected at the Host boundary; - `/mnemon remember` and `/mnemon forget` are rejected; - Source management and model actions cannot bypass the Host write restriction. This is feature-level read-only behavior, not a read-only filesystem mode: the Runtime controller may still initialize or repair projections, Document search updates LRU access times, and Mnemon read commands may trigger upstream database migrations. Do not treat `writeEnabled=false` as a safety guarantee for read-only mounts. ## Switch Interactions ```text writeEnabled=false -> overrides all explicit semantic writes writebackMode=off -> no write cue, no scored review -> explicit writes remain when writeEnabled=true recallMode=off -> no recall cue -> explicit recall remains lifecycleEnabled=false -> no lifecycle cues or review -> UI, commands, and explicit tools remain routingGuidance=false -> removes only mnemon:routing -> runtime-memory context remains ``` ## Entry Placement: `displayMode` and `tabEnabled` Memory System defaults to Sidebar, opening a dedicated center-column workbench with a minimal, logo-free skin aligned with official DSH panels. Set `displayMode: builtin`, or select Builtin in Settings, to put that same workspace in the current conversation's `conversation.view` tab instead. Pages, navigation, dialogs, and styling remain shared; there is no separate builtin UI. The sidebar entry is an explicit navigation action: clicking it again keeps the workspace open; use “Back to conversation” to close it. Switching to the task board or SSH synchronizes both visibility and entry state, so a missed peer activation notification cannot prevent reopening Memory System. Builtin omits the header's storage-mode badge, workspace picker, and alignment controls. Every read, write, and independent task request follows its owning session through the existing Host routing: | `storageScope` | Builtin read/write root | |---|---| | `global` | Shared `MNEMON_DATA_DIR` or `~/.mnemon`, regardless of the session workspace | | `workspace` | The current session's `/.mnemon`; switching conversations follows their respective workspaces | | `custom` | Configured `dataDir`, regardless of the session workspace | | `workspaces` | The current session’s subtree under `/workspaces//` | The existing `runtimeUserScope: global` exception still keeps USER.md global. Changing placement does not change scope, migrate memory data, or revive the old builtin navigation. Settings RPC applies entry changes live. The canonical spelling is **`builtin`**. Historical `displayMode: buildin` preferences ignored by v0.4.0–v0.4.1 are accepted again, but runtime and UI state normalize them to `builtin`. On startup and external settings changes, the Host rewrites that one field through DSH's revision-fenced settings writer. Old-client RPC writes also persist `builtin` directly. Other fields and document comments are preserved; an explicit newer Sidebar choice wins a concurrent migration. Saving from the Settings page updates the current UI immediately. Direct edits to `settings.yaml` are detected and normalized by the Host, but the current Mnemon Client settings snapshot does not subscribe to external-file pushes; reload the browser to observe those changes. This is the same Client behavior as main, not a separate storage or plugin migration. If the old value comes only from a composition profile, migration saves a canonical user-setting override instead of rewriting the profile file. A read-only settings provider still recognizes the alias but is not written; a persistence failure is reported in the Host log without disabling the normalized entry. `tabEnabled=false` removes the selected entry and workbench live; enabling it again restores the configured placement. The two entries are mutually exclusive. Host RPC, commands, and tools remain registered, so an Agent or command already in progress stays valid. Turn memory and Save to memory remain independently controlled by `mnemon-ui` and navigate to the selected placement. ## Profile Patch Overrides The bundled `cordis.patch.yml` provides the default config row. A DSH profile configuration with the same ID may replace that row as a whole. Do not add only `cliPath` to a final profile patch: use `MNEMON_CLI_PATH` or the `mnemon.cliPath` user setting instead. When a profile patch must be customized for another reason, retain every key that must remain enabled instead of assuming a deep merge. A `remoteAccess` override for authenticated Gateway management or a cloud rc.2 rollback is one such whole-row customization. Use the complete, upgrade-aware example in the [remote management procedure](../guides/operations.md#remote-management), preserving the rest of the current configuration; a standalone `config: { remoteAccess: trusted-host }` fragment replaces those other fields. ## Common Configurations Workspace isolation: ```yaml mnemon: storageScope: workspace ``` The same workspace isolation inside each conversation: ```yaml mnemon: storageScope: workspace displayMode: builtin ``` An explicit Windows CLI path: ```yaml mnemon: cliPath: 'C:\Users\alice\AppData\Local\Programs\mnemon\mnemon.exe' ``` A custom data volume and a longer CLI timeout: ```yaml mnemon: storageScope: custom dataDir: /Volumes/AgentData/mnemon timeoutMs: 30000 ``` Keep explicit tools while disabling lifecycle behavior: ```yaml mnemon: lifecycleEnabled: false ``` Disable only background writeback decisions: ```yaml mnemon: writebackMode: off ```