Service Settings
Service Settings V2 configure the host service and desktop control plane. Profiles configure VM/session behavior. Keep that boundary sharp: service settings choose roots, catalogs, assets, credentials, telemetry, and extension endpoints; profiles choose packages, VM assets, MCP servers, enforcement, and detection.
The schema id is capsem.service-settings.v2. The JSON Schema artifact is
schemas/capsem.service-settings.v2.schema.json.
Commands
Section titled “Commands”capsem-admin settings schemacapsem-admin settings validate service.tomlcapsem-admin settings validate service.toml --jsoncapsem-admin settings doctor service.toml --jsoncapsem-admin parses TOML once, then validates through the same Pydantic model
used for JSON. JSON input uses model_validate_json() or
TypeAdapter.validate_json(). JSON output uses model_dump_json().
Example
Section titled “Example”version = 1
[app]auto_launch = truegoogle_config_path = "/Users/example/.config/gcloud/application_default_credentials.json"
[app.appearance]theme = "dark"accent = "blue"
[profiles]base_dirs = ["~/.capsem/profiles/base"]corp_dirs = ["/Library/Application Support/Capsem/profiles/corp"]user_dirs = ["/Users/example/.capsem/profiles"]default_profile = "everyday-work"allow_user_profiles = trueallow_user_fork = trueallow_user_delete = false
[assets]assets_dir = "/var/lib/capsem/assets"image_roots = ["/var/lib/capsem/images"]download_base_url = "https://assets.example.com/capsem/"
[credentials]backend = "toml"
[credentials.items."openai.api_key"]description = "OpenAI API key reference"value = "env:OPENAI_API_KEY"
[telemetry]enabled = trueendpoint = "https://otel.example.com/v1/traces"batch_max_events = 64flush_interval_ms = 1000redact_secrets = trueretry_attempts = 2failure_mode = "drop"
[telemetry.headers]x-capsem-tenant = "example"
[remote_policy]enabled = falsetimeout_ms = 1500failure_mode = "fail-closed"
[profile_catalog]manifest_url = "https://profiles.example.com/capsem/manifest.json"profile_payload_pubkey = "RWQprofilepayloadpubkey"check_interval_secs = 300
[[corp_directives]]operation = "lock"path = "security.capabilities.network_egress"value = "ask"reason = "Corp network egress must stay interactive."Sections
Section titled “Sections”| Section | Purpose |
|---|---|
app | Host app behavior and appearance defaults. |
profiles | Built-in, corp, and user profile roots plus default profile behavior. |
assets | Service asset/cache locations, image roots, and optional download base URL. |
credentials | Credential backend and named credential references. |
telemetry | Export endpoint, headers, batching, retry, redaction, and failure mode. |
remote_policy | Reserved remote enforcement endpoint shape. S13 owns shipped remote decisions. |
profile_catalog | Signed profile catalog URL, profile payload public key, and background check interval. |
corp_directives | Corp-applied profile overrides after profile inheritance. |
Validation Rules
Section titled “Validation Rules”- Unknown fields are rejected.
profiles.base_dirsmust contain at least one directory.- Profile ids use lowercase letters, numbers, and hyphens.
- Telemetry requires
telemetry.endpointwhen enabled. - Remote policy requires
remote_policy.endpointwhen enabled. - Profile catalogs require both
manifest_urlandprofile_payload_pubkey. http://catalog URLs are allowed only for loopback development hosts.corp_directiveswithadd,replace, orlockrequirevalue.corp_directiveswithremoveorforbidmust not carryvalue.
Fixtures
Section titled “Fixtures”The service-settings contract is tested with shared fixtures:
schemas/fixtures/service-settings-v2-minimal.jsonschemas/fixtures/service-settings-v2-complete.jsonschemas/fixtures/service-settings-v2-defaults.jsonschemas/fixtures/service-settings-v2-invalid-unknown-field.jsonschemas/fixtures/service-settings-v2-invalid-profile-roots.jsonschemas/fixtures/service-settings-v2-invalid-telemetry.jsonschemas/fixtures/service-settings-v2-invalid-remote-policy.jsonschemas/fixtures/service-settings-v2-invalid-profile-catalog.jsonPython and Rust both validate the same valid and invalid shapes. This keeps settings at the same standard as profiles instead of treating them as loose configuration JSON.