config.json in two different ways:
- As the only runtime configuration source, with
config_store.enabled: false. - As a declarative bootstrap and reconciliation source for a SQLite or PostgreSQL config store.
source_of_truth and per-section reconciliation metadata, including config_hash for many config rows, to decide when file-backed configuration should preserve DB edits, update stored values, or prune DB-only rows.
config_hash is auto-managed. Do not set it manually in config.json or API payloads.Configuration Setups
source_of_truth only affects DB-backed reconciliation. In file-only mode there is no config store to reconcile against, so config.json is naturally the runtime source.
Default Split Mode
The default mode is:source_of_truth; split is the default.
In split mode, Bifrost treats config.json as a bootstrap and drift-detection source:
- On first startup, file-backed sections from
config.jsonare written to the config store. - Stored rows keep reconciliation metadata for the file-backed definition.
- UI/API edits update the DB state without changing the file-backed definition.
- On later startups, unchanged file-backed definitions preserve DB edits.
- If the matching file-backed definition changes, the new file version is applied for that section or entity.
config.json. Removing a provider, plugin, MCP client, or governance row from the file leaves the stored row in place; use source_of_truth: "config.json" when a present file section should prune DB-only rows.
Use split mode when you want config.json to seed or update a deployment while preserving UI/API edits unless the matching file-backed definition changes.
config.json as Source of Truth
Use this only when the file should actively control the matching DB state:config.json are authoritative at startup. Bifrost applies the file values even if the stored config_hash still matches, because UI/API edits do not update the file hash.
This is useful for stricter GitOps setups where the DB should converge back to the file after every restart or redeploy.
Missing vs Empty Sections
In split mode, missing sections are left alone. Authoritative mode is stricter: a missing section is not the same as an empty section. This leaves stored plugins untouched:plugins section authoritative and empty, so DB-only plugins are removed:
providers, mcp, and governance sub-sections.
Recommended Use
For DB-backed deployments, prefer
split unless you explicitly want restarts to revert UI/API changes back to config.json.
