Skip to content

feat(review): surface in-flight reviewer lens progress during capture (wire the discarded onUpdate) #1492

Description

@danielgap

Before submitting

  • 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

Additional context

  • Related: feat(review): surface per-lens prompt size + active relay bound before capture; survivable route for unachievable lens slots #1238 surfaces per-lens prompt size and relay bounds before capture; this covers the during-run half. fix(rdd): surface and advance manual reviewer collection #1463 covers the idle-at-collect case (controller waiting for manual submission); this covers the opposite state (submission running, nothing visible).
  • Evidence anchors: extensions/gentle-ai.ts (capture tool execute signatures discarding onUpdate; GENTLE_TIMED_TOOLS timing ledger; renderGentleAiLifecycleCall lens rendering), lib/review-host-relay.ts (slot preparation, group runner), lib/inprocess-reviewer.ts (one-shot completion, tool-call refusal).
  • 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.

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions