Treat configuration as a stable, privacy-safe contract: it must load without breaking the whole file, resolve safely at apply-time, use platform-correct paths, and (for significant changes) be shipped behind feature flags with explicitly defined non-lossy toggle behavior.
Apply these rules when you change or add configuration, settings, or config-driven behavior:
1) Prefer Settings persistence over ephemeral UI
2) Feature-flag major behavior changes
3) Make config parsing fail-soft; validate at apply-time
Option<String> for free-form references at the schema layer, then resolve into canonical internal types during application.4) Resolve paths centrally and pass resolved values
~/.warp*/.5) Treat sensitive config data as local-only; redact diagnostics
6) Keep bundled/agent-exposed skills aligned with the schema
working_directory), update the bundled skill so it explains defaults and supports the override parameter with correct example structure.Example pattern (fail-soft + apply-time resolution + safe warning):
// Schema layer: never fails load on unknown values
#[derive(Deserialize)]
struct Entry { theme_ref: Option<String> }
// Apply-time resolution (per-entry fallback)
fn apply_entry(entry: Entry) {
if let Some(raw) = entry.theme_ref {
match resolve_theme_ref(&raw) {
Some(theme) => set_effective_theme(theme),
None => {
let id = redacted_key_id(&raw); // or for the config key
log::warn!("config[hash={}] unknown theme '{}'; skipping entry", id, raw);
// fall through to next resolution layer
}
}
}
}
Use this standard as a checklist during reviews for anything under the “Configurations” umbrella: settings schema changes, feature-flag rollout wiring, config-driven rendering/application, path handling, and privacy/sync behavior.
Enter the URL of a public GitHub repository