Skip to content

fix(line): add chunk-idle timeout to inbound media download#86873

Closed
masatohoshino wants to merge 1 commit into
openclaw:mainfrom
masatohoshino:pr/d-d2-inbound-media-timeout-investigate
Closed

fix(line): add chunk-idle timeout to inbound media download#86873
masatohoshino wants to merge 1 commit into
openclaw:mainfrom
masatohoshino:pr/d-d2-inbound-media-timeout-investigate

Conversation

@masatohoshino

@masatohoshino masatohoshino commented May 26, 2026

Copy link
Copy Markdown
Contributor

Summary

downloadLineMedia in extensions/line/src/download.ts wraps the LINE
Messaging API getMessageContent response in a for-await loop with no
read deadline. When the LINE CDN returns HTTP headers but then stalls the
body stream, the function blocks indefinitely. Because
extensions/line/src/bot-handlers.ts:467-482 awaits the result before
calling processMessage, the entire inbound dispatch hangs: no agent reply
is produced and the conversation goes silent.

This PR adds a per-chunk idle timeout (LINE_DOWNLOAD_IDLE_TIMEOUT_MS = 30_000) to cap both the headers-level fetch and each stream chunk read.
The ceiling matches the existing Telegram pattern
(extensions/telegram/src/bot/delivery.resolve-media.ts:161).
The timeout is idle (per-chunk), not overall, so legitimate slow-but-
progressing transfers continue.

Affected channel: LINE inbound media only.
Unaffected: Telegram, WhatsApp, MSTeams, Discord, Slack, Matrix,
all other channels. Pure-text LINE messages. LINE outbound path.

Behavior change

Scenario Before After
Fast inbound media (<10 ms first chunk) resolves promptly resolves promptly
Slow-but-progressing transfer (1 chunk / 50 ms) resolves resolves (idle cap is per-chunk, not overall)
Server returns headers, never streams body blocks indefinitely; no agent reply rejects with LineMediaDownloadTimeoutError(30_000) after 30 s; existing catch at bot-handlers.ts:474-481 dispatches without media
Server never returns headers blocks indefinitely same rejection after 30 s

Implementation notes

  • withChunkIdleTimeout<T>() wraps any AsyncIterable<T> so each next()
    call races against a setTimeout. On timeout, iterator.return() is
    called, which triggers Readable.destroy() for Node streams from
    @line/bot-sdk.
  • @line/bot-sdk HTTPFetchClient.get does not accept AbortSignal, so
    the underlying fetch cannot be cancelled. On timeout, the function
    returns promptly but the background fetch may continue until TCP-level
    timeout. This is an acceptable trade-off; the caller proceeds without
    blocking.
  • After the timeout wins the race, the still-pending next() and
    getMessageContent() promises are explicitly silenced
    (.then(noop, noop)) so a later rejection from the destroyed upstream
    cannot escape as an unhandledRejection on Node 22+.
  • The caller error path at bot-handlers.ts:474-481 already handles
    arbitrary errors via String(err). The new error message includes
    "stalled", which routes to the runtime.error?.(danger(...)) branch
    (not the silent "exceeds limit" branch), so stalls are logged and
    dispatch continues without media.
  • chunkTimeoutMs is an optional parameter so tests can use short values
    without touching the exported constant; no LINE config schema entry is
    added (out of scope for this PR; maintainer can request one if desired).
  • Worst-case wall time before rejection is sequential
    ((1 headers race) + (N chunk races) of chunkTimeoutMs each), not a
    single 30 s shared deadline. With the default 30 s ceiling this is well
    inside LINE's 30 s webhook-ACK budget for the realistic single-stall
    case; deeply stalled CDNs with partial-progress flapping could exceed it
    but a follow-up overall-deadline option can be added if maintainers
    prefer.

Files changed

  • extensions/line/src/download.ts (+113 / −6): adds
    LINE_DOWNLOAD_IDLE_TIMEOUT_MS, LineMediaDownloadTimeoutError,
    withChunkIdleTimeout(), wires options?.chunkTimeoutMs through both
    the headers-level race and the stream-consumption phase, and silences
    the orphaned upstream promises on timeout so they cannot become
    unhandledRejection.
  • extensions/line/src/download.test.ts (+109 / −1): adds a
    chunk-idle timeout describe block with 6 focused regression tests.

Non-scope (deliberately separate PRs)

  • WhatsApp downloadInboundMedia (extensions/whatsapp/src/inbound/media.ts) — same root pattern (no abort/timeout), separate PR.
  • MSTeams resolveMSTeamsInboundMedia (extensions/msteams/src/monitor-handler/inbound-media.ts) — same root pattern, separate PR.
  • Channel config knob for chunkTimeoutMs.
  • Metadata-first dispatch (start processMessage while media hydrates in background) — would require restructuring bot-handlers.ts and is broader than the LINE narrow ceiling.

Real behavior proof

Current HEAD SHA: c10307cd7841cd3fe8df0ae92694f8b534153ba1. Proof captured against this exact HEAD; this body update is parser-label normalization only — no code, test, or config diff change.

Behavior addressed:

LINE inbound media download blocks indefinitely when the LINE CDN stalls the response body stream, preventing processMessage from being called and leaving the conversation silent. The contributor ask is to prove that, after this patch, a stalled LINE media boundary no longer blocks inbound dispatch — downloadLineMedia rejects within the configured ceiling, the existing catch path in bot-handlers.ts:467-499 logs the failure, buildLineMessageContext is still called, and processMessage is reached.

Real environment tested:

A local Node 22 process running the actual extension source via pnpm tsx, driving the real handleLineWebhookEvents entry point with a controlled stall installed at the @line/bot-sdk MessagingApiBlobClient.prototype.getMessageContent boundary. The production source — unmodified bot-handlers.ts dispatch path, unmodified downloadLineMedia, unmodified buildLineMessageContext, real openclaw/plugin-sdk/media-store, real ingress policy helpers — is exercised end-to-end. processMessage is the only spy. This is not a live LINE channel test; live LINE-CDN-side TCP behavior under partial-progress flapping is therefore not covered (see What was not tested).

Exact steps or command run after this patch:

node node_modules/.bin/tsx extensions/line/scratch/handler-stall-proof.mts body
node node_modules/.bin/tsx extensions/line/scratch/handler-stall-proof.mts headers
node node_modules/.bin/tsx extensions/line/scratch/handler-stall-proof.mts partial-stall
node node_modules/.bin/tsx extensions/line/scratch/handler-stall-proof.mts fast
node node_modules/.bin/tsx extensions/line/scratch/handler-stall-proof.mts slow-progress

The harness file extensions/line/scratch/handler-stall-proof.mts is not committed; it patches MessagingApiBlobClient.prototype.getMessageContent for the chosen scenario, then awaits the real handleLineWebhookEvents with a minimal LineHandlerContext whose processMessage is a JSON-emitting spy. Production default LINE_DOWNLOAD_IDLE_TIMEOUT_MS = 30_000 is used for all five scenarios.

Evidence after fix:

Redacted terminal capture from each pnpm tsx run, summarized into one row per scenario. Production default chunkTimeoutMs = 30_000 was used everywhere. runtime.error captures the exact log string the production catch path would emit.

Scenario @line/bot-sdk boundary Wall time downloadLineMedia outcome runtime.error fired processMessage reached media_count unhandledRejection
body getMessageContent resolves to async iterable whose next() never settles 30 029 ms rejected with LineMediaDownloadTimeoutError(30000) yes yes 0 no
headers getMessageContent returns a Promise that never resolves 30 022 ms rejected with LineMediaDownloadTimeoutError(30000) yes yes 0 no
partial-stall first chunk delivered, second-chunk next() never settles 30 029 ms rejected with LineMediaDownloadTimeoutError(30000) (per-chunk budget reset works) yes yes 0 no
fast iterable yields a JPEG within 5 ms 36 ms resolved no yes 1 no
slow-progress 6 single-byte chunks at 50 ms each 335 ms resolved no yes 1 no

Sample raw JSON output from the body scenario (redacted timestamps):

{
  "scenario": "body",
  "chunk_timeout_ms_default": 30000,
  "download_outcome": "timed-out",
  "process_message_called": true,
  "handler_settled": true,
  "handler_threw": false,
  "runtime_error_calls": [
    "line: failed to download media: LineMediaDownloadTimeoutError: LINE media download stalled: no data received for 30000ms"
  ],
  "unhandled_rejection_seen": false,
  "process_message_media_count": 0,
  "handler_elapsed_ms": 30029,
  "download_elapsed_ms": 30029,
  "download_error_name": "LineMediaDownloadTimeoutError"
}

Observed result after fix:

With the production default 30 s ceiling, the three stall scenarios (body, headers, partial-stall) each terminated in exactly one LineMediaDownloadTimeoutError at ~30 029 ms wall time, routed through the existing bot-handlers.ts:474-481 catch to runtime.error?.(danger(...)) (the "stalled" branch, not the silent "exceeds limit" branch). buildLineMessageContext was still invoked and processMessage was reached with zero media attachments. The two happy-path scenarios (fast, slow-progress) completed promptly and delivered one media attachment to processMessage. No unhandledRejection surfaced in any scenario after a 1 500 ms post-handler settle window — the orphan-rejection suppression in withChunkIdleTimeout and at the headers race both hold under real Node 22 event-loop scheduling.

What was not tested:

  • A live LINE channel credential pair against the real LINE CDN with a real network-level stall. This would require a controlled-slow inbound media generator served by LINE's actual infrastructure plus a dedicated bot account; not feasible in this PR.
  • WhatsApp and MSTeams unbounded-stall behavior (out of scope; separate PRs already enumerated in Non-scope).
  • Production p99 percentiles for downloadLineMedia latency (no live traffic instrumented).
  • The orphaned background fetch inside @line/bot-sdk HTTPFetchClient.get is acknowledged in Implementation notes but is not verified to settle within any specific TCP-level bound; that is a @line/bot-sdk SDK limitation, not introduced by this PR. The handler-level runtime proof above confirms the orphan does not surface as an unhandledRejection in the 1 500 ms window after handleMessageEvent returns.

Unit coverage

extensions/line/src/download.test.ts adds 6 focused regression tests under the chunk-idle timeout describe block. These are supplemental to the handler-level runtime proof above and validate the withChunkIdleTimeout wrapper in isolation against an @line/bot-sdk stub.

Test chunkTimeoutMs Outcome
rejects with LineMediaDownloadTimeoutError when the stream stalls past chunkTimeoutMs 50 ms rejected with LineMediaDownloadTimeoutError
rejects when getMessageContent headers never arrive 50 ms rejected with LineMediaDownloadTimeoutError
does not reject when chunks arrive within chunkTimeoutMs 500 ms resolved (slow-but-progressing stream completes)
exposes LINE_DOWNLOAD_IDLE_TIMEOUT_MS = 30s aligned with TELEGRAM_DOWNLOAD_IDLE_TIMEOUT_MS n/a constant assertion: LINE_DOWNLOAD_IDLE_TIMEOUT_MS === 30_000
calls iterator.return() exactly once on timeout so the upstream Readable is destroyed 50 ms iterator.return() called exactly once
rejects when a second chunk stalls after a successful first chunk (partial-then-stall) 50 ms rejected with LineMediaDownloadTimeoutError

Suite results on the current HEAD: extensions/line/src/download.test.ts 12 passed; extensions/line 270 passed; pnpm check:changed green; pnpm format:check extensions/line/src/download.ts extensions/line/src/download.test.ts clean.

@masatohoshino

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented May 26, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@clawsweeper

clawsweeper Bot commented May 26, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge. Reviewed June 24, 2026, 2:49 PM ET / 18:49 UTC.

Summary
The PR adds a 30-second LINE inbound media headers/per-chunk idle timeout and regression tests for stalled header, body, and partial-stream downloads.

PR surface: Source +107, Tests +108. Total +215 across 2 files.

Reproducibility: yes. source-reproducible: current main awaits LINE media headers and stream persistence before processMessage, and the SDK provides no abortable fetch option. I did not run a live LINE CDN stall.

Review metrics: 1 noteworthy metric.

  • Timeout policy surface: 1 fixed channel-local timeout added, 0 config surfaces added. Maintainers should explicitly accept the hard-coded LINE attachment cutoff before merge.

Merge readiness
Overall: 🐚 platinum hermit
Proof: 🦞 diamond lobster
Patch quality: 🐚 platinum hermit
Result: ready for maintainer review.

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

Rank-up moves:

  • none.

Risk before merge

  • [P1] Merging intentionally changes LINE inbound media delivery: media that makes no progress for more than 30 seconds is skipped while the message continues without that attachment.
  • [P1] @line/[email protected] does not expose an abortable fetch option for this path, so the handler await is bounded but the underlying SDK fetch may continue until transport cleanup.
  • [P2] Repeated partial-progress stalls can still consume one timeout window per stalled chunk because this is an idle timeout, not a single overall download deadline.

Maintainer options:

  1. Accept the fixed LINE idle cutoff
    Merge with the 30-second per-chunk timeout if maintainers prefer bounded dispatch over waiting indefinitely for stalled LINE media.
  2. Request timeout-policy changes
    Ask for a configurable cutoff, an overall deadline, or both if maintainers want different LINE attachment delivery semantics before merge.
  3. Pause for live LINE proof
    Hold the PR if maintainers require a real LINE CDN stall demonstration beyond the supplied handler-level Node proof.

Next step before merge

  • [P2] The remaining action is maintainer acceptance of the fixed LINE idle cutoff and attachment-skipping behavior; there is no narrow automated repair to queue.

Security
Cleared: The diff changes LINE media timeout logic and tests only; no dependency, workflow, lockfile, secret-handling, package-resolution, or code-execution supply-chain concern was found.

Review details

Best possible solution:

Land the focused LINE-local idle timeout if maintainers accept the fixed 30-second per-chunk attachment policy; otherwise request a config or overall-deadline adjustment before merge.

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

Yes, source-reproducible: current main awaits LINE media headers and stream persistence before processMessage, and the SDK provides no abortable fetch option. I did not run a live LINE CDN stall.

Is this the best way to solve the issue?

Yes, with maintainer policy acceptance. A LINE-local idle timeout is the narrowest owner-boundary mitigation I found; bypassing the LINE SDK for direct abortable fetch would be broader and would duplicate endpoint/auth behavior.

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 4c841ac575d7.

Label changes

Label justifications:

  • P2: The PR fixes a real LINE inbound media hang with limited channel scope and no evidence of a repo-wide outage.
  • merge-risk: 🚨 message-delivery: The diff changes LINE delivery semantics by dropping stalled attachments after the idle ceiling while continuing message dispatch.
  • rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🦞 diamond lobster and patch quality is 🐚 platinum hermit.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (terminal): The PR body includes exact-head terminal proof from a Node 22 handler-level run showing stalled LINE media no longer blocks processMessage and no unhandledRejection appears.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR body includes exact-head terminal proof from a Node 22 handler-level run showing stalled LINE media no longer blocks processMessage and no unhandledRejection appears.
Evidence reviewed

PR surface:

Source +107, Tests +108. Total +215 across 2 files.

View PR surface stats
Area Files Added Removed Net
Source 1 113 6 +107
Tests 1 109 1 +108
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 2 222 7 +215

What I checked:

Likely related people:

  • vincentkoc: Recent history includes LINE runtime seam and plugin-boundary work relevant to where this channel-owned fix belongs. (role: recent area contributor; confidence: medium; commits: 213198123042, ac0fd26e1699; files: extensions/line/runtime-api.ts, extensions/line/src/download.ts, extensions/line/src/bot-handlers.ts)
  • Takhoffman: Merged the prior synthesized LINE media/auth/routing fix that touched file media download behavior and M4A classification. (role: adjacent fix owner; confidence: medium; commits: 9a5bfb1fe56d; files: src/line/download.ts, src/line/bot-handlers.ts, src/line/bot-message-context.ts)
  • plum-dawg: History search ties the original LINE plugin addition to this author, making them relevant to the original media-download path. (role: introduced feature; confidence: medium; commits: c96ffa7186a4; files: extensions/line)
  • steipete: Shortlog over the LINE download and handler/test paths shows frequent adjacent maintenance and refactor history in the sampled checkout. (role: adjacent area contributor; confidence: medium; commits: 88ac6f119427, 46f49eb6eb78; files: extensions/line/src/download.ts, extensions/line/src/bot-handlers.ts, extensions/line/src/download.test.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.

@clawsweeper clawsweeper Bot added rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. P2 Normal backlog priority with limited blast radius. merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. labels May 26, 2026
@clawsweeper

clawsweeper Bot commented May 26, 2026

Copy link
Copy Markdown
Contributor

ClawSweeper PR egg

✨ Hatched: 🥚 common Moonlit Clawlet

Hatch command

Comment @clawsweeper hatch when this PR is hatchable.

Hatchability rules:

  • Merged PRs are hatchable.
  • Open PRs are hatchable when they are status: 👀 ready for maintainer look, status: 🚀 automerge armed, or labeled clawsweeper:automerge.
  • Closed unmerged PRs are hatchable only when one of those hatchable labels is still present in the durable record.

Rarity: 🥚 common.
Trait: sparkles near resolved comments.
Image traits: location flaky test forest; accessory miniature diff map; palette violet, aqua, and starlight; mood mischievous; pose standing beside its cracked shell; shell translucent glimmer shell; lighting golden review-room light; background smooth stones and checkmarks.
Share on X: post this hatch
Copy: My PR egg hatched a 🥚 common Moonlit Clawlet in ClawSweeper.

What is this egg doing here?
  • Eggs appear after the PR passes real-behavior proof. It is here for vibes, not verdicts: it does not change labels, ratings, merge decisions, or automation.
  • The shell reacts to review momentum: open follow-up work warms it up, re-review makes it wobble, and a clean final review lets it hatch.
  • Hatchability usually comes from sufficient real-behavior proof, no blocking P0/P1/P2 findings, no security attention needed, and clean correctness. A merged PR is already final, so merge makes the egg hatchable independently.
  • The hatch is seeded from this repository and PR number, so the same PR keeps the same creature; the reviewed head SHA can only change safe visual details.
  • Rarity is just collectible sparkle: 🥚 common, 🌱 uncommon, 💎 rare, ✨ glimmer, and 🌈 legendary.

@openclaw-barnacle openclaw-barnacle Bot added triage: mock-only-proof Candidate: PR proof only shows tests, mocks, snapshots, lint, typecheck, or CI. channel: line Channel integration: line size: M triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. and removed triage: mock-only-proof Candidate: PR proof only shows tests, mocks, snapshots, lint, typecheck, or CI. labels May 26, 2026
@masatohoshino

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented May 26, 2026

Copy link
Copy Markdown
Contributor

🦞👀
ClawSweeper picked this up.

Command router queued. I will update this comment with the next step.

Re-review progress:

@clawsweeper clawsweeper Bot added rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. labels May 26, 2026
@openclaw-barnacle openclaw-barnacle Bot added proof: supplied External PR includes structured after-fix real behavior proof. and removed triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. labels May 27, 2026
@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. and removed rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. labels May 27, 2026
@clawsweeper clawsweeper Bot removed proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. labels May 29, 2026
@clawsweeper clawsweeper Bot added rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. and removed status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels May 29, 2026
@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. labels May 29, 2026
@clawsweeper clawsweeper Bot added rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. and removed rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. labels Jun 21, 2026
@clawsweeper clawsweeper Bot added rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. and removed rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. labels Jun 24, 2026
@openclaw-barnacle

Copy link
Copy Markdown

This pull request has been automatically marked as stale due to inactivity.
Please add updates or it will be closed.

@openclaw-barnacle openclaw-barnacle Bot added the stale Marked as stale due to inactivity label Jul 14, 2026
@clawsweeper

clawsweeper Bot commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

ClawSweeper status: review started.

I am starting a fresh review of this pull request: fix(line): add chunk-idle timeout to inbound media download This is item 1/1 in the current shard. Shard 26/31.

This placeholder means the worker is alive and reading the current context. I will edit this same comment with the actual review when the claws are done clicking.

Crustacean status: shell secured, claws on keyboard, evidence pebbles being sorted.

@masatohoshino

Copy link
Copy Markdown
Contributor Author

Closing due to inactivity on my side — open since May with unresolved conflicts. Withdrawing to keep the queue clean. The chunk-idle timeout gap it describes may still be worth fixing, so I may return with a rebased version.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

channel: line Channel integration: line merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. P2 Normal backlog priority with limited blast radius. proof: sufficient ClawSweeper judged the real behavior proof convincing. proof: supplied External PR includes structured after-fix real behavior proof. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. size: M stale Marked as stale due to inactivity status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants