Rollup of deferred /roast and greptile items across recent merged PRs that haven't been picked up in follow-up commits. The top High item (handleError context heuristic missing status guard) is tracked separately as #17.
Medium
PR #14 — beforeRequest hook in streaming paths
PR #13 — participant names in native tool streaming
Low
PR #10 — provider bug fixes
Origin
Audit run 2026-05-21 against the GitHub-visible review surface. Membrane is the only repo in the ecosystem where greptile is wired up (good); items here are the ones greptile flagged where the PR author didn't reply inline (typical pattern: when the author replies acknowledging, items get fixed; when they're in the "Comments Outside Diff" / "Prompt To Fix All" block with no inline reply, they get silently merged past).
Rollup of deferred
/roastand greptile items across recent merged PRs that haven't been picked up in follow-up commits. The top High item (handleErrorcontext heuristic missing status guard) is tracked separately as #17.Medium
PR #14 — beforeRequest hook in streaming paths
beforeRequesthook receives stalenormalizedRequestacross tool-continuation rounds. Each iteration of thewhile (toolDepth <= maxToolDepth)loop callsstreamOnce(..., { normalizedRequest: request })with the original request, whileproviderRequestis rebuilt as a continuation. Anyone keying off the normalized side will think they're getting one request N times. Either document the semantics onMembraneHooks.beforeRequestinsrc/types/config.ts, or rebuildnormalizedRequestper continuation round. Roast addressed 5 of 6 items in follow-upb21636dbut skipped this cross-file doc task — appears to be an "I'm editing this file anyway" bias.PR #13 — participant names in native tool streaming
buildNativeToolRequest()hardcodes the participant-name prefix as${msg.participant}:atsrc/membrane.ts:986, whileNativeFormatterexposes a configurablenameFormat(default'{name}: '). Any caller constructingMembranewith a customnameFormat(e.g.[{name}]or@{name}:) silently gets a different prefix on the streaming-native path than on the formatter path. Stays consistent today only for the default. Greptile P2.Low
PR #13
textblock in multi-text messages rather than only the first, so a message with two text blocks becomes"Alice: Hello"+"Alice: World". Mirrors a pre-existing wart inNativeFormatter.convertContent(). Guard with a "first text block only" check.PR #10 — provider bug fixes
system: ...at two sites.src/membrane.ts:1274and:1344(buildContinuationRequestandbuildContinuationRequestWithImages). Both branches of the innerArray.isArray(...) && length > 0 ? prefillResult.systemContent : prefillResult.systemContentreturn the same value. The falsy branch should beundefinedto actually filter empty arrays.OpenRouterAdapter.messageToContent()dropsimage_urlblocks.src/providers/openrouter.ts:546-560— handles the new array-content shape but only extractstext, silently droppingimage_urlblocks that theOpenRouterContentBlocktype union allows. The adapter already emits image_url blocks when converting from Anthropic image content (lines 398-407), so they're a real possibility on response. Either handle them or document why responses can't have them.Origin
Audit run 2026-05-21 against the GitHub-visible review surface. Membrane is the only repo in the ecosystem where greptile is wired up (good); items here are the ones greptile flagged where the PR author didn't reply inline (typical pattern: when the author replies acknowledging, items get fixed; when they're in the "Comments Outside Diff" / "Prompt To Fix All" block with no inline reply, they get silently merged past).