Skip to content

config: harden config-load failure handling after Zod→Effect Schema migration #995

Description

@anandgupta42

Found during v0.9.1 release review (Chaos-Gremlin + others). Two inconsistent, risky failure modes when a pre-existing config trips the new strict Effect Schema (topLevelExtraKeys throws on any unrecognized top-level key):

  • Global config (packages/opencode/src/config/config.ts:~389): loadGlobal().pipe(Effect.orElseSucceed(() => ({}))) — a parse failure silently resets the ENTIRE global config (providers, models, permissions, agents, MCP) to {}, with only an Effect.logError most users never see. Silent config loss on upgrade.
  • Project-local config (config.ts:~757): loadInstanceState(...).pipe(Effect.orDie) — hard crash on a stale/removed top-level key, killing session start in that directory.

Fix: (1) surface a user-visible warning when global config falls back to defaults; (2) reconcile the asymmetry so both name the offending key and fail gracefully (ignore only the malformed source, don't nuke all config or crash). Low probability (fork shipped 0.9.0-beta.2 on this code) but high impact when it fires.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions