Skip to content

fix(ci): Windows task tests and Telegram setup promotion surface#60630

Open
Tianworld wants to merge 16 commits intoopenclaw:mainfrom
Tianworld:contrib/ci-test-policy-fixes
Open

fix(ci): Windows task tests and Telegram setup promotion surface#60630
Tianworld wants to merge 16 commits intoopenclaw:mainfrom
Tianworld:contrib/ci-test-policy-fixes

Conversation

@Tianworld
Copy link
Copy Markdown
Contributor

@Tianworld Tianworld commented Apr 4, 2026

Summary

Tasks (Windows CI)

  • task-executor.test.ts: Avoid triggering outbound sendMessage in the blocked-flow retry test (dynamic import can bypass the Vitest mock on Windows CI and hang until timeout).
  • task-registry.test.ts: Close the task-flow registry SQLite handle in withTaskRegistryTempDir before removing the temp state dir (persist: false on flow reset), alongside the existing task-registry reset. Prevents Windows CI from stalling on fs.rm when tests use createManagedTaskFlow.

Telegram (setup / multi-account promotion)

  • Export namedAccountPromotionKeys and resolveSingleAccountPromotionTarget from extensions/telegram/contract-api.ts (aligned with the Matrix-style bundled contract surface).
  • Wire the same fields on the runtime ChannelPlugin.setup in extensions/telegram/src/shared.ts so getChannelSetupPromotionSurface matches production (not only the bundled contract module).
  • Keep dmPolicy / allowFrom at the channel root when named accounts already exist; honor defaultAccount when resolving the promotion target.
  • Add patchChannelConfigForAccount regression tests in src/channels/plugins/setup-wizard-helpers.test.ts (test registry mirrors the runtime setup surface).

Branch

  • Merged latest origin/main so protocol-generated artifacts and CI expectations stay aligned with upstream.

Notes

  • Task changes are tests only (no production task runtime changes).
  • Telegram changes include contract exports, runtime plugin setup, plugin-sdk facade re-exports for tests, and setup-wizard-helpers regressions.

Testing

  • pnpm exec vitest run --config vitest.unit.config.ts src/tasks/task-registry.test.ts src/tasks/task-executor.test.ts
  • node scripts/run-vitest.mjs run --config vitest.channels.config.ts src/channels/plugins/setup-wizard-helpers.test.ts -t "telegram:"
    (src/channels/**/*.test.ts is not in the unit Vitest project; CI runs these under the channels config—same as pnpm test:channels.)
  • pnpm protocol:check

@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps Bot commented Apr 4, 2026

Greptile Summary

This PR stabilizes two test files for Windows CI by avoiding Windows-specific file-lock and dynamic-import mock-bypass issues. The task-executor.test.ts change drops requesterOrigin from a blocked-flow test to avoid triggering a sendMessage path that relies on a dynamic import Vitest can't reliably mock on Windows. The task-registry.test.ts change adds persist: false to the resetTaskFlowRegistryForTests call in the finally block so persistFlowRegistry() is skipped, allowing the SQLite file handle to close cleanly before the temp directory is removed.

Confidence Score: 5/5

Safe to merge — tests-only PR with targeted, well-commented fixes for Windows CI flakiness.

Both changes are narrowly scoped and correct: skipping persist before close is exactly right for the finally-block teardown pattern, and dropping the unused requesterOrigin removes a real Windows CI hang vector. No production logic is touched.

No files require special attention.

Reviews (1): Last reviewed commit: "test(tasks): close flow registry sqlite ..." | Re-trigger Greptile

…y tests

- Export namedAccountPromotionKeys + resolveSingleAccountPromotionTarget from contract-api (Matrix-style).
- Keep dmPolicy/allowFrom at channel root when named accounts exist; honor defaultAccount for promotion target.
- Add patchChannelConfigForAccount regression tests in setup-wizard-helpers.test.ts.

Made-with: Cursor
@Tianworld Tianworld force-pushed the contrib/ci-test-policy-fixes branch from ea67883 to 4883c92 Compare April 7, 2026 03:08
@openclaw-barnacle openclaw-barnacle Bot added channel: telegram Channel integration: telegram size: S and removed size: XS labels Apr 7, 2026
Copy link
Copy Markdown

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

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: 4883c92159

ℹ️ About Codex in GitHub

Codex has been enabled to automatically 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 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

accounts: { alerts: { botToken: "tok" } },
},
});
expect(keys).not.toContain("dmPolicy");
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Fix Telegram promotion test fixture wiring

This assertion assumes Telegram exposes named-account promotion metadata, but the test registry in beforeEach still registers Telegram with only singleAccountKeysToMove. Under that fixture, resolveSingleAccountKeysToMove will still include dmPolicy/allowFrom from the common key set, and the adjacent promotion-target test will also resolve to default, so these new cases fail deterministically instead of validating the intended behavior. Please wire namedAccountPromotionKeys and resolveSingleAccountPromotionTarget into the Telegram test setup (or adjust expectations).

Useful? React with 👍 / 👎.

@Tianworld Tianworld changed the title test(tasks): stabilize Windows CI for task registry and executor fix(ci): Windows task tests and Telegram setup promotion surface Apr 7, 2026
Codex P1: getChannelSetupPromotionSurface reads plugin registry setup; Telegram mock only had singleAccountKeysToMove, so namedAccountPromotionKeys/resolveSingleAccountPromotionTarget were missing and the new assertions did not match production wiring.

- Re-export namedAccountPromotionKeys + resolveSingleAccountPromotionTarget from plugin-sdk/telegram facade.
- Register them on the Telegram test plugin alongside Matrix.

Made-with: Cursor
@Tianworld Tianworld force-pushed the contrib/ci-test-policy-fixes branch from ae6ac47 to 9ab5d38 Compare April 7, 2026 03:25
Copy link
Copy Markdown

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

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: 9ab5d38588

ℹ️ About Codex in GitHub

Codex has been enabled to automatically 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 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment on lines +104 to +105
namedAccountPromotionKeys: telegramNamedAccountPromotionKeys,
resolveSingleAccountPromotionTarget: resolveTelegramSingleAccountPromotionTarget,
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Keep Telegram setup tests aligned with runtime plugin setup

This fixture now injects namedAccountPromotionKeys and resolveSingleAccountPromotionTarget into the Telegram test plugin, but the real Telegram plugin setup surface still only provides singleAccountKeysToMove (see extensions/telegram/src/shared.ts:226-229). That mismatch means the new promotion tests can pass while production still uses the old promotion behavior (including moving root dmPolicy/allowFrom when named accounts already exist), so this change gives false confidence that the runtime fix landed.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Addressed in f45ae18: createTelegramPluginBase now mirrors Matrix and exposes the same promotion fields on ChannelPlugin.setup.

getChannelSetupPromotionSurface reads plugin.setup at runtime; contract-api alone is not enough. Mirror Matrix by wiring namedAccountPromotionKeys + resolveSingleAccountPromotionTarget into createTelegramPluginBase (addresses Codex P1 on false-positive tests).

Made-with: Cursor
@Tianworld
Copy link
Copy Markdown
Contributor Author

Tianworld commented Apr 8, 2026

Thanks for the reviews!

  • Codex P1 (fixture wiring): addressed in 9ab5d38 — the Telegram test plugin registry now includes namedAccountPromotionKeys and resolveSingleAccountPromotionTarget (via plugin-sdk/telegram re-exports), so the promotion tests match how getChannelSetupPromotionSurface reads plugin setup.
  • Codex P1 (runtime setup mismatch): addressed in f45ae18createTelegramPluginBase now mirrors Matrix and exposes the same promotion fields on ChannelPlugin.setup (not only via contract-api).

PR body / testing notes were also updated to reflect the Vitest project that actually runs the src/channels/** tests.

- Keep Telegram promotion surface exports (namedAccountPromotionKeys + resolveSingleAccountPromotionTarget) while also retaining mergeTelegramAccountConfig export.
- Keep runtime ChannelPlugin.setup wired to promotion surface.

Made-with: Cursor
Copy link
Copy Markdown

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

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: f95ca00396

ℹ️ About Codex in GitHub

Codex has been enabled to automatically 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 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".


export const singleAccountKeysToMove = ["streaming"];
export const namedAccountPromotionKeys = ["botToken", "tokenFile"] as const;
export const namedAccountPromotionKeys = [...TELEGRAM_NAMED_ACCOUNT_PROMOTION_KEYS];
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Sync Telegram fallback promotion keys with expanded contract

This commit broadens Telegram namedAccountPromotionKeys, but fallback promotion still hard-codes only botToken/tokenFile in src/channels/plugins/setup-helpers.ts for paths where the setup surface is unavailable (as noted by the fallback comment there). In those fallback paths (for example legacy/default-account seeding flows), keys newly added here like webhookUrl, webhookSecret, token, and account are not promoted into the target account, so migrated multi-account configs can end up with incomplete account auth/transport state.

Useful? React with 👍 / 👎.

Use /usr/bin/env to avoid hostedtoolcache node permission checks in gateway hot-reload tests, and mock remote environment detection for deterministic models auth context.

Made-with: Cursor
@openclaw-barnacle openclaw-barnacle Bot added gateway Gateway runtime commands Command implementations labels Apr 9, 2026
Copy link
Copy Markdown

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

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: 8d0cbb9233

ℹ️ About Codex in GitHub

Codex has been enabled to automatically 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 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

@@ -1,2 +1,60 @@
import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "openclaw/plugin-sdk/setup";
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Import account-id helpers from routing facade

Switching this module to openclaw/plugin-sdk/setup pulls in the full setup barrel on Telegram startup, because extensions/telegram/src/shared.ts imports setup-contract.ts in the hot channel path. The setup barrel re-exports setup-wizard/setup-helper modules, so this eager import increases runtime load cost and weakens lazy-loading boundaries for normal channel execution. This file only needs DEFAULT_ACCOUNT_ID and normalizeAccountId, so it should use the narrow routing facade instead (as Matrix does).

Useful? React with 👍 / 👎.

Use a mockable remote-environment detector in models auth tests, and use exec secret provider settings that tolerate CI node path permissions during gateway reload tests.

Made-with: Cursor
Update cliBackends test configs to include a minimal command field so tsgo passes when CliBackendConfig requires it.

Made-with: Cursor
@openclaw-barnacle openclaw-barnacle Bot removed the gateway Gateway runtime label Apr 9, 2026
Replace tmpdir and raw fetch callsites, remove channel literal comparisons, align skill types, and update protocol Swift models.

Made-with: Cursor
Copy link
Copy Markdown

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

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: 69c0964f13

ℹ️ About Codex in GitHub

Codex has been enabled to automatically 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 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment on lines +193 to +198
const { response: res, release } = await fetchWithSsrFGuard({
url,
init: { ...init, signal: ctrl.signal },
timeoutMs,
auditContext: "extensions/browser client-fetch",
});
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Allow loopback browser-control URLs in guarded fetch path

This new fetchWithSsrFGuard call runs with no SSRF policy override, so absolute browser-control URLs on loopback/private hosts (for example http://127.0.0.1:...) are now blocked before the request is sent. That regresses the absolute-URL path in fetchBrowserJson (used when a baseUrl is provided), even though withLoopbackBrowserAuth is explicitly built to support loopback control endpoints. Please pass an explicit private-network policy for this trusted control-plane fetch (or conditionally allow loopback) so these requests keep working.

Useful? React with 👍 / 👎.

@openclaw-barnacle openclaw-barnacle Bot added channel: msteams Channel integration: msteams channel: signal Channel integration: signal app: macos App: macos extensions: memory-core Extension: memory-core agents Agent runtime and tooling channel: qqbot extensions: qa-lab extensions: memory-wiki size: M and removed size: S labels Apr 9, 2026
Resolve conflicts in browser/qa-lab/signal/msteams/diffs, acp-spawn thread binding, followup/agent-runner tests, setup-wizard helpers.

Made-with: Cursor
Deduplicate tmp dir imports, restore fetchWithSsrFGuard in qa-lab health check, import setup promotion helpers in wizard test, drop obsolete skill sourceInfo, narrow codex tool prepareArguments.

Made-with: Cursor
Copy link
Copy Markdown

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

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: 2ec7108c47

ℹ️ About Codex in GitHub

Codex has been enabled to automatically 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 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment on lines +188 to +191
const { response: res, release } = await fetchWithSsrFGuard({
url,
init,
signal: ctrl.signal,
init: { ...init, signal: ctrl.signal },
timeoutMs,
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Forward abort signal to guarded browser fetch

fetchHttpJson now passes ctrl.signal inside init, but fetchWithSsrFGuard only composes cancellation from its top-level signal option and then overwrites init.signal when timeoutMs is set. In practice, any caller-provided abort (for example fetchBrowserJson(..., { signal })) will no longer cancel the in-flight request promptly and will wait until timeout instead, which regresses cancellation behavior for browser-control calls.

Useful? React with 👍 / 👎.

Provide synthetic sourceInfo in local-loader and tests; use as Skill so SkillSnapshot stays assignable from upstream Skill[] while satisfying builds that require sourceInfo.

Made-with: Cursor
@Tianworld
Copy link
Copy Markdown
Contributor Author

Hi maintainers — latest push (\2b890f28) is green across the full CI matrix I can see (including \check, \check-additional, \�uild-artifacts, \checks-fast-contracts-protocol, Windows node tests, and extension shards). Branch is merged with current \main\ and ready for review whenever you have bandwidth. Thanks!

…ntext

- Strip null bytes from inbound JSON blocks before stringify (spawn safety)
- Prefer gemini-3.1-* CLI template IDs with 3.0 fallbacks for older catalogs
- Default anthropic/claude-sonnet-4-6 to 1M context when not overridden in models.providers
- Add regression tests (inbound-meta, provider-models, context, status)

Made-with: Cursor
Copy link
Copy Markdown

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

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: e189a58f71

ℹ️ About Codex in GitHub

Codex has been enabled to automatically 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 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment on lines +25 to +26
export const namedAccountPromotionKeys: FacadeModule["namedAccountPromotionKeys"] =
loadFacadeModule().namedAccountPromotionKeys;
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Keep Telegram facade promotion keys lazy-loaded

namedAccountPromotionKeys is initialized with loadFacadeModule().namedAccountPromotionKeys, which eagerly loads @openclaw/telegram/contract-api.js during module import. Any consumer that imports openclaw/plugin-sdk/telegram now pays synchronous facade loading cost (and can fail early if that bundled surface is unavailable) even when it only needs unrelated exports like parseTelegramTopicConversation. This regresses the lazy-loading boundary used by adjacent facade exports and should use the same lazy array wrapper pattern.

Useful? React with 👍 / 👎.

@clawsweeper
Copy link
Copy Markdown
Contributor

clawsweeper Bot commented May 1, 2026

Codex review: needs changes before merge.

Summary
The PR stabilizes Windows task registry/executor tests, expands Telegram setup promotion metadata/runtime/test coverage, and carries additional branch-alignment fixes across browser fetch, Signal install, MS Teams typing, skills, inbound metadata, model context, and provider tests.

Reproducibility: yes. for the review findings: source inspection shows the guarded fetch API only composes top-level signals, the setup barrel is broad, and the PR diff initializes a Telegram facade value eagerly. For the original Windows CI hangs, this review has a plausible source-level reproduction path but no fresh Windows run because the task was read-only.

Next step before merge
The remaining blockers are narrow and mechanical enough for a repair worker: restore guarded-fetch signal forwarding, keep the Telegram facade lazy, switch the setup-contract import to a narrow facade, add the changelog entry, and rebase or replacement-scope the branch against current main.

Security
Cleared: The diff touches guarded fetch and installer/download paths, but I found no concrete security or supply-chain regression; the blocking issues are functional and import-boundary regressions.

Review findings

  • [P2] Forward caller aborts through the guarded fetch — extensions/browser/src/browser/client-fetch.ts:190-191
  • [P2] Keep Telegram promotion facade lazy-loaded — src/plugin-sdk/telegram.ts:25-26
  • [P2] Use the narrow routing facade for account IDs — extensions/telegram/src/setup-contract.ts:1
Review details

Best possible solution:

Rebase or replace the branch with a narrower PR that keeps the useful Windows task-test fixes and Telegram runtime promotion metadata, while preserving browser abort semantics, SDK lazy-loading boundaries, and the narrow routing import pattern.

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

Yes for the review findings: source inspection shows the guarded fetch API only composes top-level signals, the setup barrel is broad, and the PR diff initializes a Telegram facade value eagerly. For the original Windows CI hangs, this review has a plausible source-level reproduction path but no fresh Windows run because the task was read-only.

Is this the best way to solve the issue?

No, not as currently proposed. The central Telegram and Windows-test direction is reasonable, but the current branch should first fix the cancellation/lazy-loading/import-boundary regressions, add the required changelog entry, and be rebased or narrowed against current main.

Full review comments:

  • [P2] Forward caller aborts through the guarded fetch — extensions/browser/src/browser/client-fetch.ts:190-191
    fetchWithSsrFGuard builds its own signal from the top-level signal option and then overwrites init.signal before calling fetch. This change puts ctrl.signal only inside init while also passing timeoutMs, so fetchBrowserJson(..., { signal }) no longer cancels promptly and waits for the timeout path instead. Pass signal: ctrl.signal to the guard, or let the guard own the composed timeout/caller signal.
    Confidence: 0.91
  • [P2] Keep Telegram promotion facade lazy-loaded — src/plugin-sdk/telegram.ts:25-26
    namedAccountPromotionKeys is initialized by calling loadFacadeModule() at module scope, unlike the adjacent lazy facade array export. Any consumer importing the Telegram SDK facade now loads the bundled Telegram contract immediately and can fail before using unrelated helpers; wrap this in the existing lazy array helper pattern.
    Confidence: 0.84
  • [P2] Use the narrow routing facade for account IDs — extensions/telegram/src/setup-contract.ts:1
    setup-contract.ts is imported from Telegram's hot channel setup path, but this import pulls DEFAULT_ACCOUNT_ID and normalizeAccountId from the broad openclaw/plugin-sdk/setup barrel, which re-exports setup helper and wizard modules. Matrix's matching setup contract uses openclaw/plugin-sdk/routing; use the same narrow facade here to preserve the startup boundary.
    Confidence: 0.87
  • [P3] Add the required changelog entry — extensions/telegram/src/setup-contract.ts:4-13
    The branch changes production Telegram setup promotion behavior and other user-facing runtime behavior, but the provided file list does not include CHANGELOG.md. Repo policy requires user-facing fix/feat/perf changes to include a changelog entry with contributor credit, so please add one for the production fixes.
    Confidence: 0.78

Overall correctness: patch is incorrect
Overall confidence: 0.86

Acceptance criteria:

  • pnpm test src/tasks/task-registry.test.ts src/tasks/task-executor.test.ts
  • node scripts/run-vitest.mjs run --config vitest.channels.config.ts src/channels/plugins/setup-wizard-helpers.test.ts -t "telegram:"
  • pnpm build
  • pnpm exec oxfmt --check --threads=1 extensions/browser/src/browser/client-fetch.ts extensions/telegram/src/setup-contract.ts extensions/telegram/src/shared.ts extensions/telegram/contract-api.ts src/channels/plugins/setup-wizard-helpers.test.ts src/tasks/task-registry.test.ts src/tasks/task-executor.test.ts CHANGELOG.md
  • pnpm check:changed

What I checked:

  • Current main lacks expanded Telegram promotion surface: Current main exports only singleAccountKeysToMove from Telegram contract-api, Telegram setup-contract only lists botToken/tokenFile as named promotion keys, and runtime setup does not expose resolveSingleAccountPromotionTarget. (extensions/telegram/contract-api.ts:17, 829364f85e4c)
  • Current main still has the old Windows task-test shape: withTaskRegistryTempDir still resets the task-flow registry without persist:false, and the blocked-flow executor test still sets requesterOrigin, so the PR's two Windows-test fixes are not already implemented on main. (src/tasks/task-registry.test.ts:254, 829364f85e4c)
  • Guarded fetch requires top-level signal composition: fetchWithSsrFGuard composes cancellation from params.signal and params.timeoutMs, then overwrites init.signal with that composed signal before calling fetch; moving ctrl.signal only into init loses caller abort propagation when timeoutMs is used. (src/infra/net/fetch-guard.ts:318, 829364f85e4c)
  • Setup barrel is broader than routing/account-id helpers: openclaw/plugin-sdk/setup re-exports setup helpers and setup-wizard modules, while Matrix's matching setup contract imports DEFAULT_ACCOUNT_ID and normalizeAccountId from the narrow routing facade. (src/plugin-sdk/setup.ts:30, 829364f85e4c)
  • Prior review comments still match the final diff: The discussion shows the first two Codex Telegram fixture/runtime findings were addressed, but later comments about abort forwarding, lazy facade loading, and narrow setup imports are still consistent with the final diff and current dependency contracts. (e189a58f71c0)
  • Related issue tracks broader promotion behavior: fix(channels): most channels missing namedAccountPromotionKeys — multi-account promotion strips shared defaults #62387 remains open for the broader named-account promotion/defaults behavior; this PR only partially overlaps by adding Telegram-specific promotion metadata. (../clawsweeper/records/openclaw-openclaw/items/62387.md:84)

Likely related people:

  • Peter Steinberger: Local blame/log samples for the current Telegram promotion, setup-promotion helper, browser fetch, and task-test paths resolve to recent main commits by this maintainer. (role: recent maintainer; confidence: medium; commits: 8a2207f8a179, 829364f85e4c; files: extensions/telegram/src/setup-contract.ts, extensions/telegram/src/shared.ts, src/channels/plugins/setup-promotion-helpers.ts)
  • gumadeiras: Prior related report context ties this person to the original shared single-account-to-accounts.default migration path and a later Matrix-specific promotion narrowing fix. (role: introduced behavior and adjacent promotion fixer; confidence: medium; commits: 50b577180853, 4dd887a47465; files: src/channels/plugins/setup-helpers.ts, src/commands/channels/add.ts, src/commands/doctor/shared/legacy-config-core-normalizers.ts)
  • obviyus: Prior related report context identifies this person as the author of the Telegram doctor migration fix that preserved top-level Telegram access-control fallbacks for existing named accounts. (role: recent adjacent Telegram fixer; confidence: medium; commits: 24ee0f6f4b07; files: extensions/telegram/src/setup-contract.ts, src/commands/doctor/shared/legacy-config-core-normalizers.ts)

Remaining risk / open question:

  • The PR head is from 2026-04-12 while current main has moved to 2026-05-02, so a rebase may require re-scoping at least the SDK facade portion of the branch.
  • The branch now bundles unrelated fixes across browser, Signal, MS Teams, skills, inbound metadata, model context, and provider tests, which increases review and conflict risk beyond the original Windows CI and Telegram setup fixes.
  • The Windows CI hang was not live-reproduced in this read-only Linux review; confidence comes from source inspection, the PR discussion, and the reported CI context.

Codex review notes: model gpt-5.5, reasoning high; reviewed against 829364f85e4c.

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: msteams Channel integration: msteams channel: qqbot channel: signal Channel integration: signal channel: telegram Channel integration: telegram commands Command implementations extensions: codex extensions: memory-core Extension: memory-core extensions: memory-wiki size: L

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant