Skip to content

refactor(config): config-surface reduction tranche 1 — retire dead keys, dedupe channel schemas, add growth ratchet#111142

Merged
steipete merged 7 commits into
mainfrom
claude/openclaw-config-reduction-d208f1
Jul 19, 2026
Merged

refactor(config): config-surface reduction tranche 1 — retire dead keys, dedupe channel schemas, add growth ratchet#111142
steipete merged 7 commits into
mainfrom
claude/openclaw-config-reduction-d208f1

Conversation

@steipete

Copy link
Copy Markdown
Contributor

What Problem This Solves

The openclaw.json surface has grown past 10,000 documented config paths (plus ~650 OPENCLAW_* env vars) and is growing by roughly 40 paths/day. Dead keys linger after retirement, ~20 identical messaging options are hand-copied into 7 of 9 bundled channel schemas (drifting independently — GoogleChat silently lacked knobs every other channel has), and nothing pushes back on new growth.

This PR is the first tranche of the config-surface reduction program (maintainer-directed): retire dead/aliased keys, deduplicate the channel schema layer, and add a ratchet so the surface can only grow deliberately.

Why This Change Was Made

Per AGENTS.md config policy: runtime reads canonical config only; the config/env surface bar is high; prefer removing/consolidating config options when touching these surfaces.

Phase 1 — retirements (all doctor-migrated). Removed keys whose runtime readers are gone or that alias a canonical key: root tui, canvasHost, defaultModel; cron.webhook; commands.modelsWrite; messages.messagePrefix; tools.media.asyncCompletion; tools.message.allowCrossContextSend; talk/Discord realtime.voice aliases; media Deepgram option aliases; MCP timeout aliases (connectTimeout/connect_timeout/timeout → canonical connectionTimeoutMs/requestTimeoutMs, seconds→ms preserved); session.maintenance.pruneDays; session.resetByType.dm; Telegram dm.threadReplies family; Slack dm.replyToMode; WhatsApp exposeErrorText; GoogleChat actions.reactions; thread-binding spawnAcpSessions/spawnSubagentSessions aliases. Every removal: schema+types+labels+help deleted, openclaw doctor --fix migration (move value to canonical home or strip no-ops; canonical value wins on conflict), dead-config-keys test, dated deprecation-compat record (window to 2026-09-18), docs updated. Candidates that turned out to have live readers were kept (messages.removeAckAfterReply, cron.webhookToken). Env: deprecated OPENCLAW_DEBUG_PROXY_DB_PATH/_BLOB_DIR removed; auto-update gates collapsed to documented OPENCLAW_NO_AUTO_UPDATE.

Phase 2 — channel schema dedup (no user-visible changes except two intentional ones). New internal buildCommonChannelAccountShape() (generalizing the WhatsApp pattern) now emits the ~20 shared messaging leaves for all eight bundled channel schema families; shared builders for exec approvals, group entries, reactions, allowBots, botLoopProtection, read receipts, name-matching; channel TS types extend CommonChannelMessagingConfig. Intentional surface changes: (1) legacy nested dm.{policy,allowFrom} retired on Discord/Slack/GoogleChat (doctor promotes to canonical top-level keys); (2) GoogleChat gains the shared dmPolicy/allowFrom/markdown/heartbeat/contextVisibility knobs it was missing (generic runtime readers verified). All other channel baseline paths byte-equivalent before/after.

Phase 0 — growth ratchet. pnpm config:docs:check now also enforces a tracked per-kind count budget (docs/.generated/config-baseline.counts.json). Surface growth fails the check until the budget is consciously raised in the same PR; shrinkage must be ratcheted down via config:docs:gen. Runs in the existing workflow-sanity generated-doc-baselines lane and the changed-lanes release-metadata plan.

User Impact

  • Existing configs keep working: openclaw doctor --fix migrates every retired key (values move to their canonical home; no-ops are stripped with a named change message). Configs that skip doctor and still set retired keys fail validation with a message naming the replacement — consistent with the documented ~2-month migration window.
  • Plugin SDK: type-only export TelegramDmThreadReplies removed with its retired key (no callable surface change; plugin-sdk:surface:check green). One non-callable schema re-export added for the shared mention-patterns schema.
  • Config-surface delta (ClawSweeper reviewMetrics): core paths -49, channel net -20 (18 legacy nested dm paths removed, 20 GoogleChat gap-closure paths added, -22 from Phase 1 retirements), direction: shrinking. Ratchet budget initialized at core 2980 / channel 3732 / plugin 3483; budget file initialized so further growth is opt-in and reviewable.

Evidence

  • Focused suites (all green): dead-config-keys, schema-regressions, channel-alias-migration, doctor legacy-config migrations + deprecation-compat, per-channel config/doctor-contract suites (Discord/Telegram/Slack/WhatsApp/Signal/iMessage/GoogleChat/IRC/Matrix/LINE), doc-baseline integration (ratchet growth/stale/write modes), MCP transport/CLI, Talk normalization, WhatsApp accounts/inbound.

  • pnpm tsgo:core and pnpm tsgo:extensions:test green; pnpm config:docs:check, pnpm config:channels:check, pnpm plugin-sdk:surface:check green; git diff --check clean.

  • Channel baseline path diff verified byte-equivalent outside the 38 intentional path changes (18 removed legacy dm paths, 20 added GoogleChat paths).

  • Fresh autoreview: clean (Phase 2 fixed two type-fidelity findings it raised; Phase 0 zero findings).

  • Hosted CI on this PR is the land gate (OPENCLAW_TESTBOX=1 scripts/pr flow).

  • Named tradeoff: legacy debug-proxy sidecars stored at custom OPENCLAW_DEBUG_PROXY_DB_PATH/_BLOB_DIR locations (both @deprecated, undocumented) are not auto-imported by the one-time sidecar migration; the default-path migration is unchanged. Diagnostic capture cache, per AGENTS.md cache-migration policy.

  • Autoreview: 5 rounds; fixed dangling help-test fixtures, non-positive MCP timeout migration guard, Hermes importer canonicalization; final round clean (0 findings, patch-correct 0.9).

@steipete
steipete requested a review from a team as a code owner July 19, 2026 02:43
@openclaw-barnacle openclaw-barnacle Bot added docs Improvements or additions to documentation channel: discord Channel integration: discord channel: googlechat Channel integration: googlechat channel: line Channel integration: line channel: matrix Channel integration: matrix channel: slack Channel integration: slack channel: telegram Channel integration: telegram channel: whatsapp-web Channel integration: whatsapp-web gateway Gateway runtime cli CLI command changes scripts Repository scripts commands Command implementations agents Agent runtime and tooling channel: irc extensions: qa-lab plugin: migrate-hermes size: XL maintainer Maintainer-authored PR labels Jul 19, 2026
@github-actions

github-actions Bot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Security-sensitive changes noted

This PR includes security-sensitive file changes. The guard is informational because the PR author is a repository admin or a member of @openclaw/openclaw-secops.

  • Current SHA: b6b7b6054542e8e4644264e1d53aec8822396edd
  • Trusted actor: @steipete
  • Trusted role: pull request author; openclaw-secops

Changed files:

  • .gitignore: Controls ignored secret and local files, including common .env files, before they can be accidentally committed.

Security review is still recommended before merge when the change is intentional.

@clawsweeper clawsweeper Bot added rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. P2 Normal backlog priority with limited blast radius. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. labels Jul 19, 2026
@clawsweeper

clawsweeper Bot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs real behavior proof before merge. Reviewed July 19, 2026, 3:39 AM ET / 07:39 UTC.

Summary
The branch removes deprecated configuration and environment keys via doctor migrations, consolidates bundled-channel schemas behind shared builders, and adds a committed config-surface growth budget.

Reproducibility: yes. from source: compile an external plugin that imports TelegramDmThreadReplies from openclaw/plugin-sdk/config-contracts against this PR head; the removed export makes that build fail.

Review metrics: 1 noteworthy metric.

  • Published SDK exports: 1 type-only export removed. A single removed published type can break every external plugin that imports it, independently of runtime config migration coverage.

Stored data model
Persistent data-model change detected: migration/backfill/repair: docs/cli/cron.md, migration/backfill/repair: docs/refactor/database-first.md, migration/backfill/repair: docs/web/control-ui.md, migration/backfill/repair: extensions/discord/src/doctor.test.ts, serialized state: src/infra/state-migrations.debug-proxy.ts, unknown-truncated-pull-files. Confirm migration or upgrade compatibility proof before merge.

Merge readiness
Overall: 🦪 silver shellfish
Proof: 🦪 silver shellfish
Patch quality: 🦐 gold shrimp
Result: blocked until real behavior proof from a real setup is added.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Rank-up moves:

  • [P1] Restore the deprecated type-only TelegramDmThreadReplies export and add a focused published-SDK contract check.
  • [P1] Add redacted terminal or runtime evidence for a legacy-config openclaw doctor --fix migration followed by canonical validation.
  • After updating the PR body with proof, trigger a fresh review or ask a maintainer to comment @clawsweeper re-review if it does not rerun automatically.

Proof guidance:

  • [P1] Needs real behavior proof before merge: The PR reports tests, checks, and CI but no after-fix real upgrade run; add redacted terminal output or logs showing legacy config migrated by openclaw doctor --fix and then successfully validated in canonical form, with private values redacted. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.

Risk before merge

  • [P1] Merging the current deletion of TelegramDmThreadReplies can break external plugins at TypeScript build time despite the runtime configuration retirement being doctor-migrated.
  • [P1] The branch removes many accepted config paths; tests and CI claims do not replace a real upgrade transcript proving that an existing legacy configuration migrates, validates, and preserves its intended canonical values.

Maintainer options:

  1. Restore the compatibility alias before merge (recommended)
    Preserve the deprecated type-only SDK export and add a focused published-entrypoint compile contract so external plugins do not fail on upgrade.
  2. Accept a versioned SDK break
    Merge the removal only after an explicit maintainer decision that this release intentionally permits external TypeScript plugins to stop compiling.
  3. Defer the public API removal
    Split the runtime config cleanup from the SDK symbol removal if a major-version release decision is not available.

Next step before merge

  • [P1] The protected maintainer label and unresolved public SDK release-contract choice require maintainer handling; the contributor also needs to provide real upgrade proof before merge.

Maintainer decision needed

  • Question: Should this non-major configuration cleanup retain the published TelegramDmThreadReplies type alias until a major-version deprecation removal?
  • Rationale: The implementation can reject the retired runtime field while preserving a type-only SDK compatibility alias, but permanently removing a published Plugin SDK symbol requires an explicit release-contract decision.
  • Likely owner: steipete — The supplied commit history and assignment connect steipete directly to the config and Plugin SDK changes under review.
  • Options:
    • Retain the type-only alias (recommended): Restore a deprecated TelegramDmThreadReplies export and cover the published SDK contract while leaving runtime configuration retirement and doctor migration intact.
    • Approve a breaking SDK removal: Treat this PR as an explicitly approved major-version Plugin SDK break and document the required external-plugin upgrade path.
    • Split the SDK removal: Land the config migration separately and defer the public type removal to a versioned SDK-breaking change.

Security
Cleared: The current diff has no concrete security or supply-chain regression: the security-sensitive .gitignore edit narrowly tracks a generated-doc count baseline and does not broaden secrets, permissions, dependencies, or execution paths.

Review findings

  • [P1] Retain the deprecated Telegram SDK type alias — src/plugin-sdk/config-contracts.ts:45
Review details

Best possible solution:

Keep runtime configuration canonical, restore TelegramDmThreadReplies as a deprecated type-only Plugin SDK alias until an explicitly approved major-version removal, and attach redacted real upgrade proof before merge.

Do we have a high-confidence way to reproduce the issue?

Yes, from source: compile an external plugin that imports TelegramDmThreadReplies from openclaw/plugin-sdk/config-contracts against this PR head; the removed export makes that build fail.

Is this the best way to solve the issue?

No: removing the retired runtime key is compatible with preserving a deprecated type-only SDK alias, which is the narrower way to avoid breaking external plugin compilation.

Full review comments:

  • [P1] Retain the deprecated Telegram SDK type alias — src/plugin-sdk/config-contracts.ts:45
    The published openclaw/plugin-sdk/config-contracts entrypoint no longer exports TelegramDmThreadReplies. External plugins importing the type will fail to compile after upgrading even though runtime config can reject the retired field; retain a deprecated type-only alias until an explicitly approved major-version removal.
    Confidence: 0.98

Overall correctness: patch is incorrect
Overall confidence: 0.96

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 53d600ab8337.

Label changes

Label changes:

  • add rating: 🦪 silver shellfish: Overall readiness is 🦪 silver shellfish; proof is 🦪 silver shellfish and patch quality is 🦐 gold shrimp.
  • remove rating: 🧂 unranked krab: Current PR rating is rating: 🦪 silver shellfish, so this older rating label is no longer current.

Label justifications:

  • P2: This is a broad configuration cleanup with a concrete but bounded external-plugin upgrade regression.
  • merge-risk: 🚨 compatibility: The diff removes a public Plugin SDK type export and many accepted configuration keys, making upgrade behavior merge-critical.
  • rating: 🦪 silver shellfish: Overall readiness is 🦪 silver shellfish; proof is 🦪 silver shellfish and patch quality is 🦐 gold shrimp.
  • status: 📣 needs proof: The PR needs real behavior proof before ClawSweeper can clear the contributor ask. Needs real behavior proof before merge: The PR reports tests, checks, and CI but no after-fix real upgrade run; add redacted terminal output or logs showing legacy config migrated by openclaw doctor --fix and then successfully validated in canonical form, with private values redacted. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.
Evidence reviewed

What I checked:

  • Current SDK compatibility regression: The current head removes TelegramDmThreadReplies from the published openclaw/plugin-sdk/config-contracts type-export barrel while removing its source type; an external plugin importing that type will fail its next TypeScript build although runtime config can reject the retired field independently. (src/plugin-sdk/config-contracts.ts:45, b6b7b6054542)
  • Prior blocker remains applicable: The previous ClawSweeper review raised the same P1 at a5434cf4320826cc9d7b0c47b247ded1db8552d6; the supplied current-head diff still deletes the export, so the compatibility blocker has not been resolved. (src/plugin-sdk/config-contracts.ts:45, a5434cf43208)
  • Contributor evidence is mock-only: The PR body reports focused suites, typechecks, generated-baseline checks, and CI, but it contains no redacted after-fix upgrade run showing legacy configuration processed by openclaw doctor --fix and then accepted in canonical form. (b6b7b6054542)
  • Security-sensitive file review: The .gitignore change deliberately unignores only the committed config-count baseline under an otherwise ignored generated-doc directory; the supplied diff adds no dependency, workflow, secret, permission, or download-and-execute path. (.gitignore:270, b6b7b6054542)

Likely related people:

  • steipete: Authored all seven supplied commits for this refactor and is assigned to this PR; the supplied record establishes direct ownership of the proposed configuration and migration changes, though it does not establish broader main-history ownership. (role: current implementation author and likely configuration follow-up owner; confidence: low; commits: 5cf6e52ded60, c6db09898b7e, 308ce404d8d5; files: src/plugin-sdk/config-contracts.ts, src/config/zod-schema.providers-core.ts, src/config/zod-schema.channel-messaging-common.ts)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

How this review workflow works
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.
Review history (6 earlier review cycles)
  • reviewed 2026-07-19T02:47:28.226Z sha 9af9a1d :: needs real behavior proof before merge. :: [P2] Strip retired debug-proxy storage variables before spawning children
  • reviewed 2026-07-19T04:18:33.539Z sha 719213e :: needs real behavior proof before merge. :: [P2] Strip retired debug-proxy variables before spawning children
  • reviewed 2026-07-19T04:40:54.975Z sha fce67e1 :: needs real behavior proof before merge. :: [P1] Preserve Google Chat named-account pairing defaults | [P1] Retain the deprecated Telegram SDK type alias
  • reviewed 2026-07-19T06:18:50.856Z sha 4f33361 :: needs real behavior proof before merge. :: [P1] Retain the deprecated Telegram SDK type alias | [P1] Migrate SQLite cron jobs before removing the webhook fallback
  • reviewed 2026-07-19T07:24:04.554Z sha 9a68886 :: needs real behavior proof before merge. :: [P1] Retain the deprecated Telegram SDK type alias
  • reviewed 2026-07-19T07:33:43.968Z sha a5434cf :: needs real behavior proof before merge. :: [P1] Retain the deprecated Telegram SDK type alias

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

normalizeDm: spec.dm?.root,
rootDmPromoteAllowFrom: spec.dm?.rootPromoteAllowFrom,
normalizeAccountDm: spec.dm?.accounts,

P1 Badge Remove conflicting nested DM aliases during migration

When a Discord, Slack, or Google Chat entry contains both a canonical DM field and a different legacy nested value—for example dmPolicy: "pairing" with dm.policy: "open"—this path invokes normalizeLegacyDmAliases, but that helper only deletes the alias when both values are equal (src/channels/plugins/dm-access.ts:261-298). The conflicting alias therefore remains even though the new strict schemas reject it, so openclaw doctor --fix cannot produce a valid config and affected upgrades remain blocked; canonical values should win while the nested fields are always removed.

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines 18 to 21
const GoogleChatDmSchema = z
.object({
enabled: z.boolean().optional(),
policy: DmPolicySchema.optional().default("pairing"),
allowFrom: z.array(z.union([z.string(), z.number()])).optional(),
})

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Preserve Google Chat account DM policy defaults

When the root Google Chat DM policy is open and a named account has dm: { enabled: true } without an explicit policy, the previous account schema materialized dm.policy: "pairing", so that account stayed pairing-only despite the open root. Removing this default while retaining the nested dm object makes doctor migrate only the root policy to dmPolicy; the named account then inherits open through resolveGoogleChatAccount, allowing arbitrary DMs on an account that previously required pairing. The migration or account schema needs to preserve the former per-account pairing default.

Useful? React with 👍 / 👎.

@steipete steipete self-assigned this Jul 19, 2026
@steipete
steipete force-pushed the claude/openclaw-config-reduction-d208f1 branch from 9af9a1d to 719213e Compare July 19, 2026 04:14
@clawsweeper clawsweeper Bot removed the rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. label Jul 19, 2026
@steipete
steipete force-pushed the claude/openclaw-config-reduction-d208f1 branch from 377e50c to 54b34e7 Compare July 19, 2026 06:35

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 54b34e725f

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

/** @deprecated Use `direct` instead. Kept for backward compatibility. */
z.literal("dm"),
]),
kind: z.union([z.literal("direct"), z.literal("group"), z.literal("channel")]),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Migrate legacy DM binding kinds before rejecting them

When an existing config contains the previously supported bindings[].match.peer.kind: "dm", this enum now rejects the entire config, and no doctor migration rewrites the value to direct. The compatibility contract is still documented in src/config/schema.help.runtime.ts:349-350, while normalizeChatType and the compatibility tests in src/routing/resolve-route.test.ts:840-850 still treat dm as direct; therefore affected upgrades cannot reach the runtime normalization or converge through doctor --fix. Add a raw-config migration before removing this enum member.

Useful? React with 👍 / 👎.

Comment on lines 6 to 8
const AllowDenyChatTypeSchema = z
.union([
z.literal("direct"),
z.literal("group"),
z.literal("channel"),
/** @deprecated Use `direct` instead. Kept for backward compatibility. */
z.literal("dm"),
])
.union([z.literal("direct"), z.literal("group"), z.literal("channel")])
.optional();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Migrate DM aliases in allow/deny rules before rejection

When a shipped config uses the documented chatType: "dm" alias in session.sendPolicy.rules—or in the memory/media scope surfaces backed by this shared schema—validation now fails before the existing runtime normalization can map it to direct. docs/gateway/config-agents.md:1327 still advertises this alias, and both src/sessions/send-policy.ts:127 and src/media-understanding/scope.ts:50 normalize it, but none of the doctor migrations rewrites these rule arrays, so affected users cannot repair the upgrade with doctor --fix. Migrate these matches to direct before narrowing the schema.

Useful? React with 👍 / 👎.

@steipete
steipete force-pushed the claude/openclaw-config-reduction-d208f1 branch from 54b34e7 to 053d5fb Compare July 19, 2026 07:02

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 053d5fb028

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +186 to +190
const requestTimeoutSeconds = value.timeout;
if (
next.requestTimeoutMs === undefined &&
typeof requestTimeoutSeconds === "number" &&
requestTimeoutSeconds > 0 &&

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve environment-backed Hermes timeout aliases

When a Hermes MCP server specifies timeout: "${MCP_TIMEOUT}", this number-only branch skips the value. Since this change also removes timeout from MCP_CONNECTION_FIELDS, importsMcpSensitiveValues and mcpManualItems no longer resolve the reference or emit the previous manual-review warning, so the migration silently drops the configured request timeout. Resolve the alias before converting it to milliseconds, or retain it in the interpolation/warning inputs.

Useful? React with 👍 / 👎.

@steipete
steipete force-pushed the claude/openclaw-config-reduction-d208f1 branch from 053d5fb to 9a68886 Compare July 19, 2026 07:21
@clawsweeper clawsweeper Bot added rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. and removed rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. labels Jul 19, 2026
@steipete
steipete force-pushed the claude/openclaw-config-reduction-d208f1 branch from 9a68886 to a5434cf Compare July 19, 2026 07:30
@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. labels Jul 19, 2026
@steipete
steipete force-pushed the claude/openclaw-config-reduction-d208f1 branch from a5434cf to b6b7b60 Compare July 19, 2026 07:37
@clawsweeper clawsweeper Bot added rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. and removed rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. labels Jul 19, 2026

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: b6b7b60545

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

account: accountConfig as Record<string, unknown> | undefined,
parent: rootConfig as Record<string, unknown> | undefined,
});
const allowFrom = accountConfig?.allowFrom ?? rootConfig?.allowFrom;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Remove retired DM aliases from configuration docs

When operators follow the current documentation, they are still told that Discord and Slack nested DM aliases are runtime-compatible (docs/channels/discord.md:437, docs/channels/slack.md:1235, and docs/channels/slack.md:1349), while docs/tools/exec-approvals-advanced.md:316 still instructs Google Chat users to set channels.googlechat.dm.allowFrom. These canonical-only lookups and the new strict schemas now reject or ignore those paths, as locked by src/config/dead-config-keys.test.ts:18-59, so copying the documented configuration can prevent startup. Update these pages to use the top-level canonical keys and describe the old paths as doctor-only migration inputs.

Useful? React with 👍 / 👎.

@steipete
steipete merged commit 58452de into main Jul 19, 2026
130 of 132 checks passed
@steipete
steipete deleted the claude/openclaw-config-reduction-d208f1 branch July 19, 2026 07:52
@steipete

Copy link
Copy Markdown
Contributor Author

Merged via squash.

github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Jul 20, 2026
…ys, dedupe channel schemas, add growth ratchet (openclaw#111142)

* refactor(config): retire dead and aliased config keys via doctor migrations

* refactor(config): dedupe bundled channel config schemas into shared builders

* feat(config): add config-surface count ratchet to doc-baseline check

* test(config): drop stale fixtures for retired config keys

* fix(doctor): migrate only positive finite MCP timeout aliases

* fix(migrate-hermes): emit canonical MCP timeouts only

* fix(config): satisfy lint and contract gates
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agents Agent runtime and tooling channel: discord Channel integration: discord channel: googlechat Channel integration: googlechat channel: line Channel integration: line channel: matrix Channel integration: matrix channel: slack Channel integration: slack channel: telegram Channel integration: telegram channel: whatsapp-web Channel integration: whatsapp-web cli CLI command changes commands Command implementations docs Improvements or additions to documentation extensions: qa-lab gateway Gateway runtime maintainer Maintainer-authored PR merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. P2 Normal backlog priority with limited blast radius. plugin: migrate-hermes rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. scripts Repository scripts security-sensitive-changed size: XL status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant