Skip to content

feat(spec): merge flag unions config list entries with stored values - #32

Merged
tankdonut merged 1 commit into
mainfrom
feat/config-entry-merge
Oct 24, 2026
Merged

tankdonut merged 1 commit into
mainfrom
feat/config-entry-merge

Conversation

@tankdonut

Copy link
Copy Markdown
Owner

Why

A spec config entry with an exact list value reverts any external additions on the next boot: openclaw doctor expands plugins.allow (memory-core, github…) and reconcile resets it to the spec's list, flip-flopping every cycle and evicting plugins the doctor just added.

What

  • merge: true config-entry flag — list values only (post split_csv); anything else fails closed at load (SpecError naming config[n].merge)
  • config_merge_list: union-apply — current order first, spec additions in spec order; skips the CLI when every spec item is already stored (subset containment, not exact equality)
  • Missing/non-list stored value converges to the spec list; unreadable config skips the drift check (mirror of config_set); failures warn naming the key only
  • Wired into reconcile_config ahead of the strict-json branch; if_env guards unchanged
  • Docs: standard-agent.md keys table + config-entries section + drift note

Evidence

  • 514/514 tests (15 new: 5 parser, 10 apply/reconcile matrix incl. guard and warm-volume skip)
  • ruff + full pre-commit pass (--all-files)

A spec config entry with an exact list value reverts any external
additions on the next boot: openclaw doctor expands plugins.allow
(memory-core, github) and reconcile resets it to the spec's list,
flip-flopping every cycle and evicting plugins the doctor just added.

merge: true (list values only, post split_csv; anything else fails
closed at load) changes the apply to a union — current order first,
spec additions in spec order — and skips the CLI when every spec item
is already stored. A missing or non-list stored value converges to the
spec list; an unreadable config skips the drift check like config_set.
Failures warn naming the key only.

Applied via config_merge_list ahead of the strict-json branch in
reconcile_config; if_env guards unchanged. Docs updated in
standard-agent.md (keys table, config-entries section, drift note).
@tankdonut tankdonut self-assigned this Oct 24, 2026
@tankdonut
tankdonut merged commit 434ea0b into main Oct 24, 2026
17 checks passed
@tankdonut
tankdonut deleted the feat/config-entry-merge branch October 24, 2026 00:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant