Skip to content

Merge dev to main#155

Merged
zbigniewsobiecki merged 1 commit intomainfrom
dev
Feb 12, 2026
Merged

Merge dev to main#155
zbigniewsobiecki merged 1 commit intomainfrom
dev

Conversation

@zbigniewsobiecki
Copy link
Copy Markdown
Member

Summary

Routine dev → main merge.

🤖 Generated with Claude Code

…orage scoping (#154)

GitHub doesn't allow the same user to review their own PR. CASCADE uses
a single GITHUB_TOKEN for everything — creating PRs (implementation agent)
and reviewing them (review agent). This adds a separate reviewer PAT per
project so the review agent operates as a different GitHub user.

Uses Node.js AsyncLocalStorage to transparently scope a different Octokit
instance to the review agent's async context. The existing getClient()
function is the single chokepoint — modifying it to check AsyncLocalStorage
first means zero changes to any gadget files and zero changes to the
githubClient API surface.

Changes:
- Add optional `reviewerTokenEnv` field to project config schema
- Add AsyncLocalStorage-based `withGitHubToken()` for scoped GitHub clients
- Add `getReviewerUser()` with caching for resolving reviewer identity
- Wrap review agent lifecycle in reviewer scope when configured
- Extend `isSelfAuthored()` and check-suite-success trigger to recognize
  reviewer identity (prevents infinite loops and duplicate reviews)
- Review agent now posts initial "reviewing" comment and includes
  UpdatePRComment gadget for updating it with review summary
- Enable reviewer token for niu and car-dealership projects

Graceful fallback: no reviewerTokenEnv → existing behavior unchanged;
env var not set → logs warning, uses main token; API failure → returns
null, triggers don't filter (safe default).

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
@zbigniewsobiecki zbigniewsobiecki merged commit e7697a0 into main Feb 12, 2026
6 checks passed
zbigniewsobiecki added a commit that referenced this pull request Apr 29, 2026
…ason (#1235)

PR zbigniewsobiecki/ucho#155 had a CI failure that should have triggered
respond-to-ci. The webhook arrived; cascade-router logged
"No trigger matched for event" and bailed. The trigger DID match —
something inside the handler self-skipped, but the persisted webhook log
flattened the reason into the same generic string used when no matcher
matches at all. Debugging that required trawling cascade-router process
logs.

Three coordinated fixes:

A) Diagnostic upgrade. Extend TriggerResult with `skipReason: { handler,
   message }`. Handlers can return a structured skip instead of bare null;
   the registry returns the structured skip up the stack (terminating
   dispatch, not iterating further). webhook-processor.ts surfaces
   `Trigger ${handler} skipped: ${message}` in decisionReason. Bare
   `return null` keeps the legacy "try-next-handler" semantic for
   backward compatibility.

   Converted every return-null site in check-suite-failure.ts and
   pr-conflict-detected.ts to structured skips with specific messages
   (PR # included, attempt counts spelled out, base branches named).

B) Stop swallowing persona-resolution failures in
   `GitHubAdapter.resolvePersonaCached`. The bare `catch {}` made every
   downstream gate that depends on personaIdentities silently skip
   without any signal. Now logs ERROR + Sentry-captures under tag
   `persona_identity_resolution_failed`.

C) Widen the "PR author must be implementer persona" gate in both
   check-suite-failure.ts and pr-conflict-detected.ts to use the
   existing `isCascadeBot()` helper, matching either the implementer OR
   reviewer persona. The narrow check would have silently dropped any
   future PR authored by the reviewer persona; pr-comment-mention.ts and
   review-requested.ts already had the broader semantic.

For PR #155 specifically: aaight IS the implementer for ucho, so the
gate-widening (C) doesn't change the outcome — but with (A) shipped, any
re-run will report the actual reason in the dashboard webhook log.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant