fix(signal): report malformed release metadata cleanly#110824
Conversation
|
Codex review: needs maintainer review before merge. Reviewed July 20, 2026, 2:25 AM ET / 06:25 UTC. Summary PR surface: Source +22, Tests +27. Total +49 across 2 files. Reproducibility: yes. from source and the supplied immutable runtime control: current main can parse a successful but shape-invalid release payload into values used as Review metrics: none identified. Stored data model Merge readiness Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch. Rank-up moves:
Risk before merge
Maintainer options:
Next step before merge
Security Review detailsBest possible solution: Land the bounded Signal-plugin boundary validation after confirming the current merge result preserves the guarded response-release and existing HTTP, timeout, download-cleanup, and Homebrew fallback behavior. Do we have a high-confidence way to reproduce the issue? Yes from source and the supplied immutable runtime control: current main can parse a successful but shape-invalid release payload into values used as Is this the best way to solve the issue? Yes. Validating the untrusted GitHub response at the Signal plugin boundary with the existing object-reader helper is narrower and more maintainable than adding a core-specific parser or changing installer fallback policy. AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning high; reviewed against fef846a3f0e2. Label changesLabel justifications:
Evidence reviewedPR surface: Source +22, Tests +27. Total +49 across 2 files. View PR surface stats
What I checked:
Likely related people:
What the crustacean ranks mean
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
Review history (8 earlier review cycles)
|
6413ec0 to
ecb0dd6
Compare
ecb0dd6 to
d4dc7f0
Compare
afa2360 to
8657513
Compare
8657513 to
e949737
Compare
|
@clawsweeper re-review |
|
🦞🧹 I asked ClawSweeper to review this item again. Re-review progress:
|
Co-authored-by: Alix-007 <[email protected]>
Co-authored-by: Alix-007 <[email protected]>
e949737 to
3c15220
Compare
|
Merged via squash.
|
* fix(signal): validate release metadata before install * refactor(signal): normalize release metadata once Co-authored-by: Alix-007 <[email protected]> * test(signal): prove normalized install version Co-authored-by: Alix-007 <[email protected]> --------- Co-authored-by: Peter Steinberger <[email protected]>
What Problem This Solves
Fixes an issue where users installing Signal CLI could receive a generic setup failure when GitHub returned a successful but malformed latest-release payload.
Why This Change Was Made
Validates the GitHub release response at the Signal plugin boundary before using its tag or assets. Missing optional fields keep the existing fallback behavior, invalid field shapes return the existing stable parse error, and malformed asset rows are skipped while valid release assets remain usable. HTTP errors, request deadlines, archive selection, and install fallback policy are unchanged.
User Impact
P1 reliability impact: Signal setup now fails predictably on malformed 2xx release metadata instead of escaping the provider parse boundary with a TypeError. A malformed row can no longer discard a valid download asset from the same response.
Evidence
Immutable production-entry runtime proof
Secretless GitHub-hosted proof run: https://github.com/Alix-007/openclaw/actions/runs/29664913232
Runtime job: https://github.com/Alix-007/openclaw/actions/runs/29664913232/job/88133601660
The fork-only workflow has
permissions: {}, uses no secrets, and is not part of this PR diff. It checked out and verified immutable refs:837db49ebb2446ab62be27741d1ffabcad93189a6413ec041534f436a2ad6a2671f58e1d63a28a27At each ref, the runner loaded that ref's production
extensions/signal/src/install-signal-cli.ts, replaced only its SSRF transport import with an observable response stub, and called the exported productioninstallSignalClientry on Ubuntu x64. The production installer function body and response parser were unchanged.Current-main malformed 2xx control:
PR-head malformed 2xx result:
PR-head mixed-assets control (null/wrong-name/wrong-URL rows followed by one valid Linux asset):
This shows the valid asset reached the production download boundary while the metadata response was released.
Live public endpoint control from the same job:
GitHub documents the latest-release response and release asset schema: https://docs.github.com/en/rest/releases/releases#get-the-latest-release
Regression and CI controls
Failed to parse signal-cli release info.and releases the guarded response.openclaw/ci-gate, lint, production/test types, build artifacts, channel contracts, security checks, and CodeQL.git diff --checkpassed on head6413ec041534f436a2ad6a2671f58e1d63a28a27.AI-assisted.
Exact-head proof refresh (2026-07-20)
Redacted console proof:
The run covers the current PR head, malformed and mixed release metadata, and a live GitHub release response without exposing credentials.