You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
feat(review): surface in-flight reviewer lens progress during capture (wire the discarded onUpdate) #1492
I searched open and closed issues and did not find a request for this feature.
I reviewed this request and removed credentials, tokens, private paths, hostnames, and other sensitive data.
Problem or opportunity
A high-tier native review runs four reviewer lenses through the Pi host relay, and each lens run is a minutes-long one-shot completion (runInProcessReviewer, lib/inprocess-reviewer.ts). While a capture runs, the session shows only the amber in-flight capture card naming the lens:
the capture tools discard the streaming onUpdate channel they receive (execute(_toolCallId, parameters, signal, _onUpdate, ctx) for gentle_review_capture / gentle_review_capture_group, extensions/gentle-ai.ts)
the reviewer's model stream is consumed by .result() and never forwarded (lib/inprocess-reviewer.ts)
per-slot progress is computed only after slots settle and exists solely in the tool's return value (reviewHostRelayGroupProgress, extensions/gentle-ai.ts)
So a single-lens capture can block for several minutes with zero feedback, and a four-lens tier-high review multiplies that. From the user's seat it looks like a hung tool call: no way to tell the materialize/review/prepare phases apart, and no visibility into group concurrency (runReviewHostRelayReviewerGroup starts all reviewers via Promise.allSettled, lib/review-host-relay.ts).
Proposed outcome
Surface per-slot reviewer progress while a capture runs, without changing the review lifecycle or the provider contract:
Wire the currently discarded onUpdate of the capture tools to a compact per-slot projection emitted from the relay choke points (prepareReviewHostRelaySlot / runReviewHostRelayReviewerGroup, lib/review-host-relay.ts): selected -> materialized -> reviewing -> prepared -> submitted, plus elapsed time.
Render it in the existing in-flight lifecycle card (renderGentleAiLifecycleCall already renders lens names for captures), so a running capture shows live lens state instead of a static label.
Keep it read-only presentation with no cancel affordance. Reviewer lifecycle authority stays with the native controller; a UI-side abort is exactly the reviewer-aborted failure class, not a feature.
Alternatives considered
Showing reviewer runs as rows in the gentle:agents overlay: rejected. That overlay is the subagent task surface (its palette label is literally "Subagents"); every row promises task interactions (open transcript, stop) that reviewer runs cannot support, and reviewers are deliberately tool-less single completions, not delegable agents. Mixing them there would misrepresent the reviewer/agent boundary that keeps adjudication off live state.
Observed while delivering a tier-high four-lens review end to end: single-slot reviewer runs of roughly one to five minutes each, a group capture aborted mid-run with no interim signal, and post-hoc recovery through fresh STATUS reoffering the same slot.
Before submitting
Problem or opportunity
A high-tier native review runs four reviewer lenses through the Pi host relay, and each lens run is a minutes-long one-shot completion (
runInProcessReviewer,lib/inprocess-reviewer.ts). While a capture runs, the session shows only the amber in-flight capture card naming the lens:onUpdatechannel they receive (execute(_toolCallId, parameters, signal, _onUpdate, ctx)forgentle_review_capture/gentle_review_capture_group,extensions/gentle-ai.ts).result()and never forwarded (lib/inprocess-reviewer.ts)reviewHostRelayGroupProgress,extensions/gentle-ai.ts)So a single-lens capture can block for several minutes with zero feedback, and a four-lens tier-high review multiplies that. From the user's seat it looks like a hung tool call: no way to tell the materialize/review/prepare phases apart, and no visibility into group concurrency (
runReviewHostRelayReviewerGroupstarts all reviewers viaPromise.allSettled,lib/review-host-relay.ts).Proposed outcome
Surface per-slot reviewer progress while a capture runs, without changing the review lifecycle or the provider contract:
onUpdateof the capture tools to a compact per-slot projection emitted from the relay choke points (prepareReviewHostRelaySlot/runReviewHostRelayReviewerGroup,lib/review-host-relay.ts):selected -> materialized -> reviewing -> prepared -> submitted, plus elapsed time.renderGentleAiLifecycleCallalready renders lens names for captures), so a running capture shows live lens state instead of a static label.Alternatives considered
gentle:agentsoverlay: rejected. That overlay is the subagent task surface (its palette label is literally "Subagents"); every row promises task interactions (open transcript, stop) that reviewer runs cannot support, and reviewers are deliberately tool-less single completions, not delegable agents. Mixing them there would misrepresent the reviewer/agent boundary that keeps adjudication off live state.Additional context
extensions/gentle-ai.ts(capture tool execute signatures discarding onUpdate;GENTLE_TIMED_TOOLStiming ledger;renderGentleAiLifecycleCalllens rendering),lib/review-host-relay.ts(slot preparation, group runner),lib/inprocess-reviewer.ts(one-shot completion, tool-call refusal).