seamless.yaml.example
Rama main · réplica de lectura del repositorio original.
# Seamless configuration example: every key, at its default. Safe to commit --
# it holds no secrets.
#
# `make install` seeds ~/.config/seamless/seamless.yaml from this file when that
# config does not exist yet, and never overwrites it afterwards. So fill in your
# secrets THERE, not here: the installed copy is the live one, and the daemon and
# hooks read it from any directory.
#
# Every key also has a SEAMLESS_* environment override, and env wins over the
# file. Config file search order: $SEAMLESS_CONFIG, ~/.config/seamless/seamless.yaml,
# ./seamless.yaml (gitignored -- the pre-install layout's config).
# HTTP bind address. Change it here and re-run `make install`: this file is the
# single source of truth for the bind, and the Makefile reads the port back out
# of it rather than assuming 8081.
#
# An IPv4 address also listens, on the same port, on its interface's IPv6
# addresses that reach no further, where it has them: ::1 beside 127.0.0.1, a
# unique local address (fc00::/7, such as a tailnet's fd7a:...) beside a
# private or tailnet one, never a global IPv6 address beside a private IPv4
# one. So a dual-stack name is this daemon whichever address a client tries
# first. A wildcard already listens everywhere; doctor's bind row lists the pair.
# env: SEAMLESS_ADDR
addr: "127.0.0.1:8081"
# Data directory: SQLite database + markdown trees (memory/, notes/). A leading
# ~ is expanded to the home directory.
# env: SEAMLESS_DATA_DIR
data_dir: "~/.seamless"
# This install's part in a deployment. `server` (the default) runs the daemon
# here. `client` runs no daemon at all: serve refuses, there is no database and
# no corpus on this machine, and every surface -- the seam CLI, the hooks, the
# MCP registration -- dials server_url instead. A client REQUIRES server_url.
# env: SEAMLESS_ROLE
role: "server"
# The base URL clients dial, as a bare scheme://host[:port] with no path, query
# or fragment. Empty means "derive it from addr", which is what a loopback
# install wants. Set it when the bind address is not the address clients use: a
# wildcard bind, a LAN name, a TLS listener. Naming it also adds its host to the
# Host-header allowlist, which is what arms that guard on a wildcard bind.
# A wildcard host here is refused at load (0.0.0.0, ::, [::0], ...): that
# answers "where do I listen", not "where do I dial", so it belongs in addr
# instead.
# A client of a peer_auth daemon (see peer_auth below) names its socket here
# instead -- unix:///absolute/path.sock -- and needs no mcp.api_key: the daemon
# identifies the calling OS account by the uid the kernel reports.
# env: SEAMLESS_SERVER_URL
server_url: ""
# EXTRA Host-header values the daemon answers to, beyond the loopback names, a
# concrete bind host, and the host of server_url. Requests arriving under any
# other Host get 421 (the DNS-rebinding guard). Naming even one host turns the
# guard on for a wildcard bind, which otherwise has no allowlist to apply.
# env: SEAMLESS_ALLOWED_HOSTS (comma-separated, e.g. "studio.local,192.168.1.10")
allowed_hosts: []
tls:
# PEM certificate chain and private key. Both set -> the daemon serves https
# (TLS 1.2 floor) instead of http, and the console session cookie is marked
# Secure. One without the other is refused at load: it cannot serve TLS. The
# certificate's SANs must cover the host of server_url, which is what
# `seamlessd doctor` checks. A leading ~ is expanded.
# env: SEAMLESS_TLS_CERT_FILE / SEAMLESS_TLS_KEY_FILE
cert_file: ""
key_file: ""
# CLIENT-side extra root CA: the certificate the `seam` CLI adds to the system
# trust store when dialing an https server_url, for a private CA or a
# self-signed server. It is the client half of the pair above -- setting
# cert_file together with role: client is refused.
# env: SEAMLESS_TLS_CA_FILE
ca_file: ""
mcp:
# Static bearer key protecting /api/mcp and the console. On a true first run
# (no config file anywhere) `seamlessd serve` generates one into
# ~/.config/seamless/seamless.yaml; a file you author yourself needs one set
# by hand:
# openssl rand -hex 32
# An empty key is reported as a warning by `seamlessd doctor`.
# env: SEAMLESS_MCP_API_KEY
api_key: ""
budgets:
# Hard token budget for the SessionStart briefing.
# env: SEAMLESS_MAX_BRIEFING_TOKENS
max_briefing_tokens: 1500
# Default token budget for a recall response.
# env: SEAMLESS_RECALL_BUDGET_TOKENS
recall_budget_tokens: 1000
# Per-field cap (in runes) on captured Interactions transport events (tool-call
# args/result, hook prompt, session findings). 0 = unlimited: content is stored
# in full and the tool-event retention prune is the growth control. Set a
# positive value only as an opt-in guard against pathological payloads.
# env: SEAMLESS_TOOL_EVENT_MAX_CHARS
tool_event_max_chars: 0
# Briefing injection tunables: what the SessionStart <seam-briefing> auto-injects.
# Defaults reproduce the built-in behavior; every knob is also editable live in
# the console (Settings -> Briefing injection), which stores a runtime override
# in the database that WINS over this file and env until reset. Constraints and
# active-plan rollups are never dropped by these knobs (constraint_max_full only
# shapes how constraints render); a pinned stage is exempt too while its Status
# header marks a live gate.
briefing:
# Top-ranked constraints rendered as full bullets in the briefing's
# Constraints section; the rest collapse into one compact "+N more, equally
# binding" line that still names every one. 0 = no tiering (all full).
# env: SEAMLESS_BRIEFING_CONSTRAINT_MAX_FULL
constraint_max_full: 4
# Top-ranked conventions rendered as full bullets in the budget-competing
# Conventions section; the rest stay behind the section's count line
# ("recall kind=convention"). Starred conventions always render full.
# 0 = no tiering, like constraint_max_full.
# env: SEAMLESS_BRIEFING_CONVENTION_MAX_FULL
convention_max_full: 4
# Drop memory-index lines not updated within this many days. 0 = no filter.
# env: SEAMLESS_BRIEFING_MEMORY_MAX_AGE_DAYS
memory_max_age_days: 0
# Cap on memory-index lines before budget packing. 0 = budget-only.
# env: SEAMLESS_BRIEFING_MEMORY_MAX_ITEMS
memory_max_items: 0
# Recent findings injected. 0 hides the section.
# env: SEAMLESS_BRIEFING_FINDINGS_COUNT
findings_count: 3
# Drop findings older than this many days. 0 = no filter.
# env: SEAMLESS_BRIEFING_FINDINGS_MAX_AGE_DAYS
findings_max_age_days: 0
# Ready-task titles listed in the "Ready tasks" section. 0 hides the section.
# env: SEAMLESS_BRIEFING_READY_TASKS_SHOWN
ready_tasks_shown: 3
# Days a captured, unapproved Claude Code plan earns an "awaiting approval"
# line. 0 = no age cutoff.
# env: SEAMLESS_BRIEFING_PENDING_PLAN_MAX_DAYS
pending_plan_max_days: 7
# Grace window (days since last update) a stage memory stays pinned when its
# Status header is missing or not a live gate (open|in_progress|blocked).
# 0 = pin forever.
# env: SEAMLESS_BRIEFING_STAGE_UNKNOWN_MAX_AGE_DAYS
stage_unknown_max_age_days: 7
# Times budgets.max_briefing_tokens = the absolute truncation ceiling. 0 = 2.
# env: SEAMLESS_BRIEFING_HARD_CAP_MULTIPLIER
hard_cap_multiplier: 2
# A child project inherits its shared parent's active memories.
# env: SEAMLESS_BRIEFING_INCLUDE_PARENT_MEMORIES
include_parent_memories: true
# Recent findings from family-member projects. 0 hides the section.
# env: SEAMLESS_BRIEFING_SIBLING_FINDINGS_COUNT
sibling_findings_count: 2
# Fold family members' memories in as a low-priority "Sibling memories"
# section (their constraints/stages never cross over). Off by default.
# env: SEAMLESS_BRIEFING_INCLUDE_SIBLING_MEMORIES
include_sibling_memories: false
# Utility's share of the memory-index sort key: (1-w)*recency + w*utility,
# where utility is the time-decayed demand score from retrieval_stats.
# 0 = pure recency (legacy). Constraints/stages/favorites stay pinned.
# env: SEAMLESS_BRIEFING_UTILITY_WEIGHT
utility_weight: 0.4
# Gate for the briefing's utility re-ordering: auto = per project once the
# gardener's readiness latch trips; on = everywhere now; off = never. The
# bounded recall/prompt-recall utility boosts are always on.
# env: SEAMLESS_BRIEFING_UTILITY_MODE
utility_mode: auto
# Optional features. These ship OFF: a fresh installation exposes none of them
# until you turn one on -- here, via env, or live in the console (Settings ->
# Features), which stores a runtime override in the database that WINS over this
# file and env until reset. Turning a feature off hides its console screens, its
# MCP tools, and its agent-facing mentions; it never deletes stored data, and
# re-enabling restores every surface. An installation that already holds research
# data keeps the feature on across the upgrade (a one-time seeded override).
features:
# Research labs and trials: the Labs and Trials console screens, the trials
# search scope, and the lab_open, trial_record, trial_query MCP tools.
# env: SEAMLESS_FEATURES_RESEARCH
research: false
# Momentum surfaces woven into existing screens: the plan finish-line card
# (and its agent-briefing emphasis), the activity calendar with capture
# streaks, knowledge payoff moments, and project maturity stages.
# env: SEAMLESS_FEATURES_MOMENTUM
momentum: false
# The arcade layer of the Now screen: the day tape, personal records, the
# hot-streak pulse, and celebration moments. Every number is judged from
# real recorded activity; off, the Now screen carries no trace of it.
# env: SEAMLESS_FEATURES_GAMIFICATION
gamification: false
# Write screening: every agent write to a memory or note is screened for
# secrets, injection markers, hidden Unicode, long encoded blobs and URLs
# outside screening.url_allowlist. A suspicious write -- and any change to a
# constraint, convention, protocol or stage by a session an agent guard
# marked as having read outside text, and any supersede or delete of a
# constraint -- is held out of briefings, recall and the gardener until you
# release it on the console's Held screen; injected memories say whether you
# confirmed them or an agent wrote them. Off, writes land exactly as before.
# The Home welcome card offers it too. Tunables: the screening block below.
# env: SEAMLESS_FEATURES_SCREENING
screening: false
# The write screens behind features.screening (inert while it is off).
screening:
# Hosts a URL in a screened write may point at without a verdict; each entry
# covers its subdomains too. Unset or empty turns the URL screen off. A URL
# to any other host holds the write for your review.
# env: SEAMLESS_SCREENING_URL_ALLOWLIST (comma-separated)
# url_allowlist: [example.com, docs.example.org]
# The shortest unbroken base64 or hex run that counts as a long encoded blob
# (hashes, ids and PEM certificate lines stay below the default).
# env: SEAMLESS_SCREENING_BLOB_MIN_LENGTH
blob_min_length: 200
# How often the drift watch compares every memory and note file with the
# hash Seamless last wrote for it. A file changed or planted outside Seamless
# stays on disk untouched but is kept out of briefings and prompt recall
# until you accept it on the Held screen. 0 turns the watch off.
# env: SEAMLESS_SCREENING_DRIFT_INTERVAL
drift_interval: 5m
# A file whose existence turns lockdown on (another program can create it
# during an incident; lockdown only ever narrows what agents receive, and
# the console cannot lift a lockdown this file holds). Unset: the Held
# screen's switch is the only way in. A leading ~ expands.
# env: SEAMLESS_SCREENING_LOCKDOWN_FILE
# lockdown_file: /path/to/lockdown.flag
# The Unix socket of a metadata feed's consumer: every event's metadata --
# kind, time, session, agent process, project (isolated ones as a keyed
# hash), item kind, sizes and verdict codes, never arguments, results,
# bodies or prompts -- is spooled and delivered there as NDJSON batches over
# HTTP. Unset: no feed. A leading ~ expands.
# env: SEAMLESS_SCREENING_FEED_SOCKET
# feed_socket: /path/to/consumer/ingest.sock
# Where the feed spools while its consumer is down (bounded: the oldest
# events go first, and are counted). Unset: <data_dir>/feed.
# env: SEAMLESS_SCREENING_FEED_SPOOL
# feed_spool: /path/to/spool
# Commit records, for an integrity monitor that matches a branch's commits to
# the tracked work that made them. Off by default, and off is exactly the
# previous behavior: no argument offered, nothing recorded, no snapshot.
commits:
# Offer the commits argument on session_end and tasks_update: the full ids
# (40 or 64 hex digits) of the commits a session made or a task's work
# produced, recorded on that session or task.
# env: SEAMLESS_COMMITS_RECORD
record: false
# Where the daemon writes the commit-matching snapshot: one JSON document,
# replaced whole on every write (mode 0640; its directory must exist),
# listing the sessions live in the window -- name, repository, start and
# end -- and the tasks a commit in it may name, each with the commits it
# recorded. Identifiers and times only. Unset: no snapshot. A leading ~
# expands.
# env: SEAMLESS_COMMITS_SNAPSHOT_FILE
# snapshot_file: /path/to/outbox/snapshot-seamless_feed.json
# How often the snapshot is rewritten (it is also written at start).
# env: SEAMLESS_COMMITS_SNAPSHOT_INTERVAL
snapshot_interval: 5m
# How far back the snapshot reaches: a commit seen earlier is outside it.
# env: SEAMLESS_COMMITS_SNAPSHOT_WINDOW
snapshot_window: 720h
# The observability console. Presentation only: nothing here changes what your
# agents receive -- briefings, MCP tools, hooks, recall, and the gardener are
# identical at every level.
console:
# How much of the console you see. One of: basic | standard | advanced.
# basic -- the essentials: what your agents remember (Memories, Notes),
# what they did (Sessions), cleanup suggestions (Gardener).
# standard -- adds following the work: Now, Projects, Plans, Tasks.
# advanced -- every screen and knob, including Interactions and Retrieval.
# Hidden screens stay reachable by URL (they show a banner), so no link ever
# breaks. The console's own picker (Settings -> Experience, or the welcome
# card on Home) stores a choice in the database that WINS over this file and
# env until reset. A fresh installation starts at basic; an installation that
# already recorded sessions before levels existed starts at advanced (a
# one-time seeded choice), so an upgrade never hides a screen you were using.
# env: SEAMLESS_CONSOLE_LEVEL
level: basic
# Console search (the full page's fused semantic+lexical retrieval). Agent
# recall is not affected by these knobs.
search:
# Minimum cosine similarity a semantic-only hit needs to appear in results;
# hits the keyword leg also matched are exempt. Without a floor the cosine leg
# is pure nearest-neighbor, so any query -- including nonsense -- fills the
# page to its limit. 0 disables the floor. Useful values depend on the
# embedding model; 0.3 suits OpenAI text-embedding-3-*.
# env: SEAMLESS_SEARCH_SEMANTIC_FLOOR
semantic_floor: 0.3
llm:
# Primary provider for chat (session digests) and embeddings. OpenAI is the
# default and the first-class provider. One of: openai | ollama | anthropic.
# env: SEAMLESS_LLM_PROVIDER
provider: "openai"
openai:
# env: SEAMLESS_OPENAI_API_KEY
api_key: ""
base_url: "https://api.openai.com/v1"
# Any OpenAI chat model; set to your preferred one.
chat_model: "gpt-4o"
embedding_model: "text-embedding-3-large"
# Native dimensionality of the embedding model. 0 = auto-detect from the
# first embedding response (the store records dims per row regardless).
# Maximum: 65536.
embedding_dims: 3072
ollama:
base_url: "http://127.0.0.1:11434"
chat_model: "llama3.3:latest"
embedding_model: "qwen3-embedding:8b"
# 0 = auto-detect; maximum 65536.
embedding_dims: 0
anthropic:
# env: SEAMLESS_ANTHROPIC_API_KEY
api_key: ""
# env: SEAMLESS_ANTHROPIC_BASE_URL
base_url: "https://api.anthropic.com"
chat_model: "claude-sonnet-5"
# Anthropic has no embeddings API; when provider=anthropic, embeddings fall
# back to OpenAI if its api_key is set, else Ollama.
gardener:
# The gardener only ever proposes; it never mutates memory without an explicit
# apply. Safe to leave enabled.
# env: SEAMLESS_GARDENER_ENABLED
enabled: true
# Minutes between full gardener passes (dedup, staleness, stale-stage,
# dead-weight, digest, stale-plan, memory-wanted).
# env: SEAMLESS_GARDENER_INTERVAL_MINUTES
interval_minutes: 60
# Cosine similarity at/above which two active memories are proposed for a merge.
# env: SEAMLESS_GARDENER_DEDUP_THRESHOLD
dedup_threshold: 0.88
# Days of no activity (no update, injection, or read) before a memory is
# proposed for archiving. Constraints and stages are never archived this way
# (dead stages are handled by stale_stage_days below).
# env: SEAMLESS_GARDENER_STALENESS_DAYS
staleness_days: 90
# Trailing window of completed sessions rolled into a monthly digest proposal.
# env: SEAMLESS_GARDENER_DIGEST_DAYS
digest_days: 30
# Age (days) beyond which transport-level Interactions events (tool.call,
# hook.prompt) are pruned. 0 disables the prune. Domain events are never pruned.
# env: SEAMLESS_TOOL_EVENT_RETENTION_DAYS
tool_event_retention_days: 30
# Days after which a captured Claude Code plan still in draft/presented is
# proposed for abandonment (retag plan-status:abandoned). 0 disables the pass.
# env: SEAMLESS_GARDENER_STALE_PLAN_DAYS
stale_plan_days: 14
# Days without an update after which a stage memory that is not a live gate
# (Status done, missing, or unrecognized) is proposed for archiving.
# 0 disables the pass.
# env: SEAMLESS_GARDENER_STALE_STAGE_DAYS
stale_stage_days: 14
# Minutes of no activity before an active session counts as dead: the reaper
# expires it and the console stops showing it as live. One knob drives both,
# so they never drift. Must comfortably exceed a long single agent turn.
# Must be positive; omit the key to retain the built-in 45m default.
# env: SEAMLESS_GARDENER_SESSION_IDLE_MINUTES
session_idle_minutes: 45
capture:
# Destination ports the capture_url tool may dial, enforced in the dialer on
# the initial URL and on every redirect hop (alongside the private-IP and
# scheme guards). This is an SSRF control: widen it only for a host you trust,
# and never to reach anything on your own network. An empty list or a missing
# key means the 80/443 default -- it does NOT mean "any port". Ports outside
# 1-65535 are rejected at startup.
# env: SEAMLESS_CAPTURE_ALLOWED_PORTS (comma-separated, e.g. "80,443,8080")
allowed_ports: [80, 443]
plan_capture:
# Capture Claude Code plan-mode activity via the PostToolUse/SubagentStop/
# PermissionRequest hooks: plan-file saves upsert cc-plan notes, planning
# subagents cache as cc-agent notes, approval flips the plan note's status.
# env: SEAMLESS_PLAN_CAPTURE_ENABLED
enabled: true
# Create an "Implement plan: ..." tracking task when a plan is approved.
# env: SEAMLESS_PLAN_CAPTURE_AUTO_TASK
auto_task: true
# On a session's first captured plan iteration, return related prior plans and
# memories to the planning agent as additionalContext.
# env: SEAMLESS_PLAN_CAPTURE_INJECT_RELATED
inject_related: true
# Update check and automatic updates. The daemon asks GitHub's releases API
# whether a newer Seamless release exists -- one anonymous request that carries
# no identifiers -- and tells you when one does. auto, max_defer and min_age
# decide whether and when it also installs one by itself, which only an install
# the curl or PowerShell installer made ever does -- and a peer_auth system
# daemon whose account owns its binary directory (docs: guides/peer-auth,
# Updates). Homebrew, builds from source, client machines and layouts the
# daemon cannot vouch for are only told.
# Set auto, max_defer and min_age here, not in the daemon's environment: any
# SEAMLESS_* variable besides SEAMLESS_CONFIG there makes the install
# notify-only, so their env variables below can turn automatic updates off but
# never on.
update:
# Unset (the default) means on for release builds and off for builds from
# source. false means zero update traffic: no request to GitHub at all, and so
# no automatic update either. The key is left commented out because seamlessd
# releases before v0.7.0 reject config keys they do not know, so setting it
# pins this file to v0.7.0 or newer.
# env: SEAMLESS_UPDATE_CHECK
# check: false
# Time between checks, as a Go duration (6h, 90m, 1h30m) from 1h to 720h. A
# bare number is refused rather than guessed at: write 6h, not 6.
# env: SEAMLESS_UPDATE_CHECK_INTERVAL
check_interval: 6h
# Whether the daemon installs a newer release by itself. Unset (the default)
# means on. false keeps the check and its notices and leaves installing to you
# (seamlessd update); a false here or in the environment is final, and the
# console cannot turn it back on. Commented out for the same reason as check.
# env: SEAMLESS_UPDATE_AUTO
# auto: false
# How long a pending automatic update waits for a quiet daemon -- no live
# agent session, no request in flight -- before it takes the next lull in
# requests instead. A Go duration from 1m to 720h.
# env: SEAMLESS_UPDATE_MAX_DEFER
max_defer: 24h
# How long a release must have been out before an automatic update takes it,
# so a bad one can be pulled first. A Go duration from 0 (no wait) to 720h.
# Installing by hand (seamlessd update) does not wait.
# env: SEAMLESS_UPDATE_MIN_AGE
min_age: 24h
# Peer-user authentication: a Unix socket whose callers the daemon identifies by
# the uid the kernel reports (never by anything the client sends), and the
# projects locked behind the owner's approval. Off by default, and off is
# exactly the behavior of every earlier release. On:
# - the TCP bearer key is the owner account: it reaches every project that is
# not locked, and so does the owner on the socket;
# - a locked project is closed to every owner request -- its name shows, its
# content does not, writes are refused -- unless the request rides a socket
# connection whose process holds a lease the owner approved; the TCP bearer
# key never holds one;
# - an account under restricted reaches the open projects that are not locked
# and reads -- never writes -- the global scope; any other uid on the socket
# is refused (403);
# - the console is the owner's alone, and shows a locked project by name and
# counts only until it is unlocked in that browser;
# - the daemon reads no agent files (transcripts, plan files): seam hook reads
# them and sends the findings, token totals, model, plan and subagent
# captures, from clients whose server_url is the socket.
# serve refuses to start unless the boundary would hold on disk too: the daemon
# runs as its own account (not the owner, not root), data_dir is that account's
# and 0700, the socket's directory and every directory above the data, the
# config file and the seamlessd binary are writable by nobody but root and the
# daemon's account, every named project exists, and every locked project is
# confidential or sealed. `seamlessd doctor`, run as the daemon's account,
# reports each of those. See the peer_auth guide in the docs for the deployment
# and the cutover from an existing install.
# The block is new after v0.7.4 and releases before it refuse config keys they
# do not know, so it is left commented out here.
# peer_auth:
# # env: SEAMLESS_PEER_AUTH_ENABLED
# enabled: false
# # The OS account (user name or numeric uid) the TCP bearer key stands for.
# # env: SEAMLESS_PEER_AUTH_OWNER
# owner: ""
# socket:
# # Absolute path. Its directory may be searchable by the accounts that
# # connect, and writable by nobody but the daemon's account or root. Not
# # inside data_dir, which is 0700.
# # env: SEAMLESS_PEER_AUTH_SOCKET_PATH
# path: ""
# # Octal permission bits. Connecting needs write permission on the socket;
# # the kernel still names every peer, so 0666 lets every local account
# # knock and refuses the unconfigured ones. Empty means 0666.
# # env: SEAMLESS_PEER_AUTH_SOCKET_MODE
# mode: "0666"
# # Optional group (name or gid) to hand the socket to, with a mode such as
# # 0660 to let only that group's members connect at all.
# # env: SEAMLESS_PEER_AUTH_SOCKET_GROUP
# group: ""
# # Force-locked projects: locks only this file can remove. The console can
# # set and remove locks of its own with a passkey, but never one listed here.
# # Each locked project is closed to every owner request -- its name shows,
# # its content does not, writes are refused -- unless the request rides a
# # socket connection whose process holds a lease the owner approved; the TCP
# # bearer key never holds one. The lock is not the sealed isolation state: a
# # locked project is normally confidential. File only (no env). The earlier
# # name, locked, still loads.
# force_locked: []
# # Caps every lease the owner approves on a locked project, "until this
# # session ends" included. At most 24h; unset means 8h. File only (no env).
# max_lease: 8h
# # The WebAuthn relying party of the owner's approver passkeys (seamlessd
# # approvers). Unset: on a TLS install whose server_url names a host, rp_id
# # is that host and the origin its https address; otherwise rp_id localhost
# # and the console's own address on localhost. rp_id is a host name, never
# # an IP; each origin is https, or http on localhost, on rp_id or a
# # subdomain. Changing rp_id (or the server_url it came from) later strands
# # every passkey enrolled under the old one. File only (no env).
# passkeys:
# rp_id: ""
# origins: []
# # Restricted local accounts (user names or numeric uids): a second OS
# # account whose agents work beside the owner's. It connects over the socket
# # only (the kernel names it; it never holds the bearer key), reads and
# # writes every open project that is not locked, and reads the global scope.
# # It cannot create projects, files no access requests and holds no leases.
# # Its writes are labeled with its name, and a constraint, convention,
# # protocol or stage it writes is a proposal until you promote it. Refused
# # while peer_auth is disabled, and for the owner. File only (no env).
# restricted: []
# # users is retired: a non-empty users map is refused at load, even while the
# # block is disabled. List those projects under locked and remove users (the
# # peer_auth guide has the steps).
# Project isolation beyond each project's own state (open, confidential or
# sealed, set on the console's project Overview or with seam project
# isolation). Off by default, and off is exactly the previous behavior.
# requests: a read refused at a confidential project's fence files an access
# request instead of only refusing: the owner may grant that one session
# (under peer_auth, that one agent process tree) read-only access to that one
# project for a limited time. A session in an open project that holds a grant
# may write only into its own project for the rest of its life. Nothing that
# involves a sealed project is ever offered, and writes are never granted.
# Without peer_auth the approval is advisory: seam approve and the console's
# Approve commit it with the bearer key, so any process holding the key can
# approve. Under peer_auth it takes the same proofs as a locked project's
# lease.
# The block is new after v0.7.4 and releases before it refuse config keys they
# do not know, so it is left commented out here.
# isolation:
# # env: SEAMLESS_ISOLATION_REQUESTS
# requests: false